* [PATCH 0/2 v3] Make git log --follow find copies among unmodified files.
@ 2010-04-22 14:05 Bo Yang
2010-04-22 14:05 ` [PATCH 1/2 v3] Make diffcore_std only can run once before a diff_flush Bo Yang
2010-04-22 14:05 ` [PATCH 2/2 v3] Make git log --follow find copies among unmodified files Bo Yang
0 siblings, 2 replies; 6+ messages in thread
From: Bo Yang @ 2010-04-22 14:05 UTC (permalink / raw)
To: git; +Cc: gitster, trast
I have tried to make --follow to support finding copies among unmodified files. And the first patch is to fix a bug introduced by '--follow' and 'git log' combination.
We use the code:
else if (--p->one->rename_used > 0)
p->status = DIFF_STATUS_COPIED;
to detect copies and renames. So, if diffcore_std run more than one time, p->one->rename_used will be reduced to a 'R' from 'C'. And this patch will fix this by allowing diffcore_std can only run once before a diff_flush, which seems rationale for our code.
Bo Yang (2):
Make diffcore_std only can run once before a diff_flush.
Make git log --follow find copies among unmodified files.
Documentation/git-log.txt | 2 +-
diff.c | 21 ++++++++-----
diffcore-break.c | 6 +--
diffcore-pickaxe.c | 3 +-
diffcore-rename.c | 3 +-
diffcore.h | 6 ++++
t/t4205-log-follow-harder-copies.sh | 56 +++++++++++++++++++++++++++++++++++
tree-diff.c | 2 +-
8 files changed, 81 insertions(+), 18 deletions(-)
create mode 100755 t/t4205-log-follow-harder-copies.sh
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2 v3] Make diffcore_std only can run once before a diff_flush.
2010-04-22 14:05 [PATCH 0/2 v3] Make git log --follow find copies among unmodified files Bo Yang
@ 2010-04-22 14:05 ` Bo Yang
2010-04-22 20:41 ` Junio C Hamano
2010-04-22 14:05 ` [PATCH 2/2 v3] Make git log --follow find copies among unmodified files Bo Yang
1 sibling, 1 reply; 6+ messages in thread
From: Bo Yang @ 2010-04-22 14:05 UTC (permalink / raw)
To: git; +Cc: gitster, trast
When file renames/copies detection is turned on, the
second diffcore_std will degrade a 'C' pair to a 'R' pair.
And this may happen when we run 'git log --follow' with
hard copies finding. That is, the try_to_follow_renames()
will run diffcore_std to find the copies, and then
'git log' will issue another diffcore_std, which will reduce
'src->rename_used' and recognize this copy as a rename.
This is not what we want.
So, I think we really don't need to run diffcore_std more
than one time.
Signed-off-by: Bo Yang <struggleyb.nku@gmail.com>
---
diff.c | 21 +++++++++++++--------
diffcore-break.c | 6 ++----
diffcore-pickaxe.c | 3 +--
diffcore-rename.c | 3 +--
diffcore.h | 6 ++++++
5 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/diff.c b/diff.c
index d0ecbc3..d32fc68 100644
--- a/diff.c
+++ b/diff.c
@@ -2544,6 +2544,7 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o)
void diff_setup(struct diff_options *options)
{
memset(options, 0, sizeof(*options));
+ memset(&diff_queued_diff, 0, sizeof(diff_queued_diff));
options->file = stdout;
@@ -3462,8 +3463,7 @@ int diff_flush_patch_id(struct diff_options *options, unsigned char *sha1)
diff_free_filepair(q->queue[i]);
free(q->queue);
- q->queue = NULL;
- q->nr = q->alloc = 0;
+ DIFF_QUEUE_CLEAR(q);
return result;
}
@@ -3591,8 +3591,7 @@ void diff_flush(struct diff_options *options)
diff_free_filepair(q->queue[i]);
free_queue:
free(q->queue);
- q->queue = NULL;
- q->nr = q->alloc = 0;
+ DIFF_QUEUE_CLEAR(q);
if (options->close_file)
fclose(options->file);
@@ -3614,8 +3613,7 @@ static void diffcore_apply_filter(const char *filter)
int i;
struct diff_queue_struct *q = &diff_queued_diff;
struct diff_queue_struct outq;
- outq.queue = NULL;
- outq.nr = outq.alloc = 0;
+ DIFF_QUEUE_CLEAR(&outq);
if (!filter)
return;
@@ -3683,8 +3681,7 @@ static void diffcore_skip_stat_unmatch(struct diff_options *diffopt)
int i;
struct diff_queue_struct *q = &diff_queued_diff;
struct diff_queue_struct outq;
- outq.queue = NULL;
- outq.nr = outq.alloc = 0;
+ DIFF_QUEUE_CLEAR(&outq);
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
@@ -3745,6 +3742,12 @@ void diffcore_fix_diff_index(struct diff_options *options)
void diffcore_std(struct diff_options *options)
{
+ /* We never run this function more than one time, because the
+ * rename/copy detection logic can only run once.
+ */
+ if (diff_queued_diff.run)
+ return;
+
if (options->skip_stat_unmatch)
diffcore_skip_stat_unmatch(options);
if (options->break_opt != -1)
@@ -3764,6 +3767,8 @@ void diffcore_std(struct diff_options *options)
DIFF_OPT_SET(options, HAS_CHANGES);
else
DIFF_OPT_CLR(options, HAS_CHANGES);
+
+ diff_queued_diff.run = 1;
}
int diff_result_code(struct diff_options *opt, int status)
diff --git a/diffcore-break.c b/diffcore-break.c
index 3a7b60a..44f8678 100644
--- a/diffcore-break.c
+++ b/diffcore-break.c
@@ -162,8 +162,7 @@ void diffcore_break(int break_score)
if (!merge_score)
merge_score = DEFAULT_MERGE_SCORE;
- outq.nr = outq.alloc = 0;
- outq.queue = NULL;
+ DIFF_QUEUE_CLEAR(&outq);
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
@@ -256,8 +255,7 @@ void diffcore_merge_broken(void)
struct diff_queue_struct outq;
int i, j;
- outq.nr = outq.alloc = 0;
- outq.queue = NULL;
+ DIFF_QUEUE_CLEAR(&outq);
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index d0ef839..929de15 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -55,8 +55,7 @@ void diffcore_pickaxe(const char *needle, int opts)
int i, has_changes;
regex_t regex, *regexp = NULL;
struct diff_queue_struct outq;
- outq.queue = NULL;
- outq.nr = outq.alloc = 0;
+ DIFF_QUEUE_CLEAR(&outq);
if (opts & DIFF_PICKAXE_REGEX) {
int err;
diff --git a/diffcore-rename.c b/diffcore-rename.c
index d6fd3ca..df41be5 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -569,8 +569,7 @@ void diffcore_rename(struct diff_options *options)
/* At this point, we have found some renames and copies and they
* are recorded in rename_dst. The original list is still in *q.
*/
- outq.queue = NULL;
- outq.nr = outq.alloc = 0;
+ DIFF_QUEUE_CLEAR(&outq);
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
struct diff_filepair *pair_to_free = NULL;
diff --git a/diffcore.h b/diffcore.h
index fcd00bf..e77db31 100644
--- a/diffcore.h
+++ b/diffcore.h
@@ -91,7 +91,13 @@ struct diff_queue_struct {
struct diff_filepair **queue;
int alloc;
int nr;
+ int run;
};
+#define DIFF_QUEUE_CLEAR(q) \
+ do { \
+ (q)->queue = NULL; \
+ (q)->nr = (q)->alloc = (q)->run = 0; \
+ } while(0);
extern struct diff_queue_struct diff_queued_diff;
extern struct diff_filepair *diff_queue(struct diff_queue_struct *,
--
1.7.0.2.273.gc2413.dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2 v3] Make git log --follow find copies among unmodified files.
2010-04-22 14:05 [PATCH 0/2 v3] Make git log --follow find copies among unmodified files Bo Yang
2010-04-22 14:05 ` [PATCH 1/2 v3] Make diffcore_std only can run once before a diff_flush Bo Yang
@ 2010-04-22 14:05 ` Bo Yang
1 sibling, 0 replies; 6+ messages in thread
From: Bo Yang @ 2010-04-22 14:05 UTC (permalink / raw)
To: git; +Cc: gitster, trast
'git log --follow <path>' don't track copies from unmodified
files, and this patch fix it.
Signed-off-by: Bo Yang <struggleyb.nku@gmail.com>
---
Documentation/git-log.txt | 2 +-
t/t4205-log-follow-harder-copies.sh | 56 +++++++++++++++++++++++++++++++++++
tree-diff.c | 2 +-
3 files changed, 58 insertions(+), 2 deletions(-)
create mode 100755 t/t4205-log-follow-harder-copies.sh
diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt
index fb184ba..0727818 100644
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -56,7 +56,7 @@ include::diff-options.txt[]
commits, and doesn't limit diff for those commits.
--follow::
- Continue listing the history of a file beyond renames.
+ Continue listing the history of a file beyond renames/copies.
--log-size::
Before the log message print out its size in bytes. Intended
diff --git a/t/t4205-log-follow-harder-copies.sh b/t/t4205-log-follow-harder-copies.sh
new file mode 100755
index 0000000..ad29e65
--- /dev/null
+++ b/t/t4205-log-follow-harder-copies.sh
@@ -0,0 +1,56 @@
+#!/bin/sh
+#
+# Copyright (c) 2010 Bo Yang
+#
+
+test_description='Test --follow should always find copies hard in git log.
+
+'
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/diff-lib.sh
+
+echo >path0 'Line 1
+Line 2
+Line 3
+'
+
+test_expect_success \
+ 'add a file path0 and commit.' \
+ 'git add path0 &&
+ git commit -m "Add path0"'
+
+echo >path0 'New line 1
+New line 2
+New line 3
+'
+test_expect_success \
+ 'Change path0.' \
+ 'git add path0 &&
+ git commit -m "Change path0"'
+
+cat <path0 >path1
+test_expect_success \
+ 'copy path0 to path1.' \
+ 'git add path1 &&
+ git commit -m "Copy path1 from path0"'
+
+test_expect_success \
+ 'find the copy path0 -> path1 harder' \
+ 'git log --follow --name-status --pretty="format:%s" path1 > current'
+
+cat >expected <<\EOF
+Copy path1 from path0
+C100 path0 path1
+
+Change path0
+M path0
+
+Add path0
+A path0
+EOF
+
+test_expect_success \
+ 'validate the output.' \
+ 'compare_diff_patch current expected'
+
+test_done
diff --git a/tree-diff.c b/tree-diff.c
index fe9f52c..1fb3e94 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -346,7 +346,7 @@ static void try_to_follow_renames(struct tree_desc *t1, struct tree_desc *t2, co
diff_setup(&diff_opts);
DIFF_OPT_SET(&diff_opts, RECURSIVE);
- diff_opts.detect_rename = DIFF_DETECT_RENAME;
+ DIFF_OPT_SET(&diff_opts, FIND_COPIES_HARDER);
diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT;
diff_opts.single_follow = opt->paths[0];
diff_opts.break_opt = opt->break_opt;
--
1.7.0.2.273.gc2413.dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2 v3] Make diffcore_std only can run once before a diff_flush.
2010-04-22 14:05 ` [PATCH 1/2 v3] Make diffcore_std only can run once before a diff_flush Bo Yang
@ 2010-04-22 20:41 ` Junio C Hamano
2010-04-23 3:55 ` Bo Yang
0 siblings, 1 reply; 6+ messages in thread
From: Junio C Hamano @ 2010-04-22 20:41 UTC (permalink / raw)
To: Bo Yang; +Cc: git, trast
Bo Yang <struggleyb.nku@gmail.com> writes:
> So, I think we really don't need to run diffcore_std more
> than one time.
It actually is stronger than that; we should never run it more than once,
and it would be a bug if we did so. Which codepath tries to call *_std()
twice?
The standard calling sequence is:
- start from an empty queue.
- use diff_change() and diff_addremove() to populate the queue.
- call diffcore_std(). if you need to use a non-standard chain of
diffcore transformations, you _could_ call the diffcore_* routines that
diffcore_std() calls, if you choose to, but as you found out, some of
them are not idempotent operations, and shouldn't be called twice.
- and finally call diffcore_flush().
> @@ -3745,6 +3742,12 @@ void diffcore_fix_diff_index(struct diff_options *options)
>
> void diffcore_std(struct diff_options *options)
> {
> + /* We never run this function more than one time, because the
> + * rename/copy detection logic can only run once.
> + */
> + if (diff_queued_diff.run)
> + return;
Shouldn't this be a BUG() instead?
The trivial rewrite to use this macro is a good idea, but it probably
should be a separate patch.
> +#define DIFF_QUEUE_CLEAR(q) \
> + do { \
> + (q)->queue = NULL; \
> + (q)->nr = (q)->alloc = (q)->run = 0; \
> + } while(0);
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2 v3] Make diffcore_std only can run once before a diff_flush.
2010-04-22 20:41 ` Junio C Hamano
@ 2010-04-23 3:55 ` Bo Yang
2010-04-28 3:37 ` Bo Yang
0 siblings, 1 reply; 6+ messages in thread
From: Bo Yang @ 2010-04-23 3:55 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, trast
On Fri, Apr 23, 2010 at 4:41 AM, Junio C Hamano <gitster@pobox.com> wrote:
> It actually is stronger than that; we should never run it more than once,
> and it would be a bug if we did so. Which codepath tries to call *_std()
> twice?
In command 'git log --follow ...'
log_tree_diff call diff_tree_sha1 and then diff_tree_diff_flush, when
'--follow' is given, the former function will call
try_to_follow_renames, which will call diffcore_std to detect rename.
And then, diff_tree_diff_flush call 'diffcore_std' again
unconditional. (and I have try to find a condition to make the call,
but I fail, so I figure out this patch.)
Breakpoint 1, diffcore_std (options=0xbf9cc044) at diff.c:3748
3748 if (diff_queued_diff.run)
(gdb) bt
#0 diffcore_std (options=0xbf9cc044) at diff.c:3748
#1 0x08124206 in try_to_follow_renames (t1=0xbf9cc130, t2=0xbf9cc11c,
base=0x81571c9 "", opt=0xbf9cc468) at tree-diff.c:358
#2 0x08124480 in diff_tree_sha1 (old=0x9c51d8c
"$\033\222T���\a\035\200T����\210;8\235i", new=0x9c51d2c
"\201�\017<�\v��n]\226{�+�\001\003\232\232\230",
base=0x81571c9 "", opt=0xbf9cc468) at tree-diff.c:418
#3 0x080e660e in log_tree_diff (opt=0xbf9cc220, commit=0x9c51d28,
log=0xbf9cc1ac) at log-tree.c:536
#4 0x080e668f in log_tree_commit (opt=0xbf9cc220, commit=0x9c51d28)
at log-tree.c:560
#5 0x0807faa1 in cmd_log_walk (rev=0xbf9cc220) at builtin/log.c:237
#6 0x080806e2 in cmd_log (argc=5, argv=0xbf9cc788, prefix=0x0) at
builtin/log.c:481
#7 0x0804b8eb in run_builtin (p=0x8161524, argc=5, argv=0xbf9cc788)
at git.c:260
#8 0x0804ba51 in handle_internal_command (argc=5, argv=0xbf9cc788) at git.c:416
#9 0x0804bb2c in run_argv (argcp=0xbf9cc700, argv=0xbf9cc704) at git.c:458
#10 0x0804bcbe in main (argc=5, argv=0xbf9cc788) at git.c:529
(gdb) c
Continuing.
Breakpoint 1, diffcore_std (options=0xbf9cc468) at diff.c:3748
3748 if (diff_queued_diff.run)
(gdb) bt
#0 diffcore_std (options=0xbf9cc468) at diff.c:3748
#1 0x080e6356 in log_tree_diff_flush (opt=0xbf9cc220) at log-tree.c:449
#2 0x080e6619 in log_tree_diff (opt=0xbf9cc220, commit=0x9c51d28,
log=0xbf9cc1ac) at log-tree.c:537
#3 0x080e668f in log_tree_commit (opt=0xbf9cc220, commit=0x9c51d28)
at log-tree.c:560
#4 0x0807faa1 in cmd_log_walk (rev=0xbf9cc220) at builtin/log.c:237
#5 0x080806e2 in cmd_log (argc=5, argv=0xbf9cc788, prefix=0x0) at
builtin/log.c:481
#6 0x0804b8eb in run_builtin (p=0x8161524, argc=5, argv=0xbf9cc788)
at git.c:260
#7 0x0804ba51 in handle_internal_command (argc=5, argv=0xbf9cc788) at git.c:416
#8 0x0804bb2c in run_argv (argcp=0xbf9cc700, argv=0xbf9cc704) at git.c:458
#9 0x0804bcbe in main (argc=5, argv=0xbf9cc788) at git.c:529
(gdb)
> The standard calling sequence is:
>
> - start from an empty queue.
>
> - use diff_change() and diff_addremove() to populate the queue.
>
> - call diffcore_std(). if you need to use a non-standard chain of
> diffcore transformations, you _could_ call the diffcore_* routines that
> diffcore_std() calls, if you choose to, but as you found out, some of
> them are not idempotent operations, and shouldn't be called twice.
>
> - and finally call diffcore_flush().
>
>> @@ -3745,6 +3742,12 @@ void diffcore_fix_diff_index(struct diff_options *options)
>>
>> void diffcore_std(struct diff_options *options)
>> {
>> + /* We never run this function more than one time, because the
>> + * rename/copy detection logic can only run once.
>> + */
>> + if (diff_queued_diff.run)
>> + return;
>
> Shouldn't this be a BUG() instead?
Anyone may call diff_tree_sha1 and then diffcore_std, and
diff_tree_sha1 may call another diffcore_std if '--follow' given. If
this is a BUG, the calling pattern, diff_tree_sha1 -> diffcore_std
should all disappear from our code. And this involved much code
refactor. And I suggest my way that we avoid the duplicate call
actively in diffcore_std.
> The trivial rewrite to use this macro is a good idea, but it probably
> should be a separate patch.
>
>> +#define DIFF_QUEUE_CLEAR(q) \
>> + do { \
>> + (q)->queue = NULL; \
>> + (q)->nr = (q)->alloc = (q)->run = 0; \
>> + } while(0);
>
You mean split this commit into two?
Regards!
Bo
--
My blog: http://blog.morebits.org
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2 v3] Make diffcore_std only can run once before a diff_flush.
2010-04-23 3:55 ` Bo Yang
@ 2010-04-28 3:37 ` Bo Yang
0 siblings, 0 replies; 6+ messages in thread
From: Bo Yang @ 2010-04-28 3:37 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
Hi Junio,
I have not receive any comments on this thread from you, but I
think it worth some words. I want to make these series patches landed
and could you please give some more advice on this?
Regards!
Bo
On Fri, Apr 23, 2010 at 11:55 AM, Bo Yang <struggleyb.nku@gmail.com> wrote:
> On Fri, Apr 23, 2010 at 4:41 AM, Junio C Hamano <gitster@pobox.com> wrote:
>> It actually is stronger than that; we should never run it more than once,
>> and it would be a bug if we did so. Which codepath tries to call *_std()
>> twice?
>
> In command 'git log --follow ...'
> log_tree_diff call diff_tree_sha1 and then diff_tree_diff_flush, when
> '--follow' is given, the former function will call
> try_to_follow_renames, which will call diffcore_std to detect rename.
> And then, diff_tree_diff_flush call 'diffcore_std' again
> unconditional. (and I have try to find a condition to make the call,
> but I fail, so I figure out this patch.)
>
> Breakpoint 1, diffcore_std (options=0xbf9cc044) at diff.c:3748
> 3748 if (diff_queued_diff.run)
> (gdb) bt
> #0 diffcore_std (options=0xbf9cc044) at diff.c:3748
> #1 0x08124206 in try_to_follow_renames (t1=0xbf9cc130, t2=0xbf9cc11c,
> base=0x81571c9 "", opt=0xbf9cc468) at tree-diff.c:358
> #2 0x08124480 in diff_tree_sha1 (old=0x9c51d8c
> "$\033\222T���\a\035\200T����\210;8\235i", new=0x9c51d2c
> "\201�\017<�\v��n]\226{�+�\001\003\232\232\230",
> base=0x81571c9 "", opt=0xbf9cc468) at tree-diff.c:418
> #3 0x080e660e in log_tree_diff (opt=0xbf9cc220, commit=0x9c51d28,
> log=0xbf9cc1ac) at log-tree.c:536
> #4 0x080e668f in log_tree_commit (opt=0xbf9cc220, commit=0x9c51d28)
> at log-tree.c:560
> #5 0x0807faa1 in cmd_log_walk (rev=0xbf9cc220) at builtin/log.c:237
> #6 0x080806e2 in cmd_log (argc=5, argv=0xbf9cc788, prefix=0x0) at
> builtin/log.c:481
> #7 0x0804b8eb in run_builtin (p=0x8161524, argc=5, argv=0xbf9cc788)
> at git.c:260
> #8 0x0804ba51 in handle_internal_command (argc=5, argv=0xbf9cc788) at git.c:416
> #9 0x0804bb2c in run_argv (argcp=0xbf9cc700, argv=0xbf9cc704) at git.c:458
> #10 0x0804bcbe in main (argc=5, argv=0xbf9cc788) at git.c:529
> (gdb) c
> Continuing.
>
> Breakpoint 1, diffcore_std (options=0xbf9cc468) at diff.c:3748
> 3748 if (diff_queued_diff.run)
> (gdb) bt
> #0 diffcore_std (options=0xbf9cc468) at diff.c:3748
> #1 0x080e6356 in log_tree_diff_flush (opt=0xbf9cc220) at log-tree.c:449
> #2 0x080e6619 in log_tree_diff (opt=0xbf9cc220, commit=0x9c51d28,
> log=0xbf9cc1ac) at log-tree.c:537
> #3 0x080e668f in log_tree_commit (opt=0xbf9cc220, commit=0x9c51d28)
> at log-tree.c:560
> #4 0x0807faa1 in cmd_log_walk (rev=0xbf9cc220) at builtin/log.c:237
> #5 0x080806e2 in cmd_log (argc=5, argv=0xbf9cc788, prefix=0x0) at
> builtin/log.c:481
> #6 0x0804b8eb in run_builtin (p=0x8161524, argc=5, argv=0xbf9cc788)
> at git.c:260
> #7 0x0804ba51 in handle_internal_command (argc=5, argv=0xbf9cc788) at git.c:416
> #8 0x0804bb2c in run_argv (argcp=0xbf9cc700, argv=0xbf9cc704) at git.c:458
> #9 0x0804bcbe in main (argc=5, argv=0xbf9cc788) at git.c:529
> (gdb)
>
>> The standard calling sequence is:
>>
>> - start from an empty queue.
>>
>> - use diff_change() and diff_addremove() to populate the queue.
>>
>> - call diffcore_std(). if you need to use a non-standard chain of
>> diffcore transformations, you _could_ call the diffcore_* routines that
>> diffcore_std() calls, if you choose to, but as you found out, some of
>> them are not idempotent operations, and shouldn't be called twice.
>>
>> - and finally call diffcore_flush().
>>
>>> @@ -3745,6 +3742,12 @@ void diffcore_fix_diff_index(struct diff_options *options)
>>>
>>> void diffcore_std(struct diff_options *options)
>>> {
>>> + /* We never run this function more than one time, because the
>>> + * rename/copy detection logic can only run once.
>>> + */
>>> + if (diff_queued_diff.run)
>>> + return;
>>
>> Shouldn't this be a BUG() instead?
>
> Anyone may call diff_tree_sha1 and then diffcore_std, and
> diff_tree_sha1 may call another diffcore_std if '--follow' given. If
> this is a BUG, the calling pattern, diff_tree_sha1 -> diffcore_std
> should all disappear from our code. And this involved much code
> refactor. And I suggest my way that we avoid the duplicate call
> actively in diffcore_std.
>
>> The trivial rewrite to use this macro is a good idea, but it probably
>> should be a separate patch.
>>
>>> +#define DIFF_QUEUE_CLEAR(q) \
>>> + do { \
>>> + (q)->queue = NULL; \
>>> + (q)->nr = (q)->alloc = (q)->run = 0; \
>>> + } while(0);
>>
>
> You mean split this commit into two?
>
> Regards!
> Bo
> --
> My blog: http://blog.morebits.org
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-04-28 3:37 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-22 14:05 [PATCH 0/2 v3] Make git log --follow find copies among unmodified files Bo Yang
2010-04-22 14:05 ` [PATCH 1/2 v3] Make diffcore_std only can run once before a diff_flush Bo Yang
2010-04-22 20:41 ` Junio C Hamano
2010-04-23 3:55 ` Bo Yang
2010-04-28 3:37 ` Bo Yang
2010-04-22 14:05 ` [PATCH 2/2 v3] Make git log --follow find copies among unmodified files Bo Yang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).