From ee3d299e93450586d12f099913261ec22849365a Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 15 Jan 2006 21:08:42 -0800 Subject: [PATCH 1/2] diffcore-break/diffcore-rename: integer overflow. While reviewing the end user tutorial rewrite by J. Bruce Fields, I noticed that "git-diff-tree -B -C" did not correctly break the total rewrite of Documentation/tutorial.txt. It turns out that we had integer overflow during the break score computations. Cop out by using floating point. This is not a kernel. Signed-off-by: Junio C Hamano --- diffcore.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diffcore.h b/diffcore.h index a38acb13e1..12cd816591 100644 --- a/diffcore.h +++ b/diffcore.h @@ -15,7 +15,7 @@ * passed around in one int (high 16-bit for merge and low 16-bit * for break). */ -#define MAX_SCORE 60000 +#define MAX_SCORE 60000.0 #define DEFAULT_RENAME_SCORE 30000 /* rename/copy similarity minimum (50%) */ #define DEFAULT_BREAK_SCORE 30000 /* minimum for break to happen (50%)*/ #define DEFAULT_MERGE_SCORE 48000 /* maximum for break-merge to happen (80%)*/ From 181dc776956b4d265891ac70514ed214e4b7564a Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 15 Jan 2006 22:15:37 -0800 Subject: [PATCH 2/2] describe: omit clearing marks on the last one. When describing more than one, we need to clear the commit marks before handling the next one, but most of the time we are running it for only one commit, and in such a case this clearing phase is totally unnecessary. Signed-off-by: Junio C Hamano --- commit.c | 6 ++++-- describe.c | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/commit.c b/commit.c index 56efc69f1f..b8bf35e860 100644 --- a/commit.c +++ b/commit.c @@ -359,8 +359,10 @@ void clear_commit_marks(struct commit *commit, unsigned int mark) parents = commit->parents; commit->object.flags &= ~mark; while (parents) { - if (parents->item && parents->item->object.parsed) - clear_commit_marks(parents->item, mark); + struct commit *parent = parents->item; + if (parent && parent->object.parsed && + (parent->object.flags & mark)) + clear_commit_marks(parent, mark); parents = parents->next; } } diff --git a/describe.c b/describe.c index 5548a16e4d..cc95eb0f21 100644 --- a/describe.c +++ b/describe.c @@ -98,7 +98,7 @@ static int compare_names(const void *_a, const void *_b) return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1; } -static void describe(struct commit *cmit) +static void describe(struct commit *cmit, int last_one) { struct commit_list *list; static int initialized = 0; @@ -124,7 +124,8 @@ static void describe(struct commit *cmit) if (n) { printf("%s-g%s\n", n->path, find_unique_abbrev(cmit->object.sha1, abbrev)); - clear_commit_marks(cmit, SEEN); + if (!last_one) + clear_commit_marks(cmit, SEEN); return; } } @@ -159,7 +160,7 @@ int main(int argc, char **argv) cmit = lookup_commit_reference(sha1); if (!cmit) usage(describe_usage); - describe(cmit); + describe(cmit, i == argc - 1); } return 0; }