X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=diff.c;h=046d9a39293fa5d33529b59a251f626785ced233;hb=e0f0e891c1742c6ae22dbc648a1000ad8655ff34;hp=7ccc1ed7c4dab62593c0c95b1fa070017b6d59a4;hpb=0e3994fa97e9876b571531444b97ae6e63fd744d;p=git.git diff --git a/diff.c b/diff.c index 7ccc1ed7..046d9a39 100644 --- a/diff.c +++ b/diff.c @@ -236,6 +236,7 @@ static struct sha1_size_cache { static int sha1_size_cache_nr, sha1_size_cache_alloc; static struct sha1_size_cache *locate_size_cache(unsigned char *sha1, + int find_only, unsigned long size) { int first, last; @@ -244,9 +245,9 @@ static struct sha1_size_cache *locate_size_cache(unsigned char *sha1, first = 0; last = sha1_size_cache_nr; while (last > first) { - int next = (last + first) >> 1; + int cmp, next = (last + first) >> 1; e = sha1_size_cache[next]; - int cmp = memcmp(e->sha1, sha1, 20); + cmp = memcmp(e->sha1, sha1, 20); if (!cmp) return e; if (cmp < 0) { @@ -256,7 +257,7 @@ static struct sha1_size_cache *locate_size_cache(unsigned char *sha1, first = next+1; } /* not found */ - if (size == UINT_MAX) + if (find_only) return NULL; /* insert to make it at "first" */ if (sha1_size_cache_alloc <= sha1_size_cache_nr) { @@ -337,13 +338,13 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only) struct sha1_size_cache *e; if (size_only) { - e = locate_size_cache(s->sha1, UINT_MAX); + e = locate_size_cache(s->sha1, 1, 0); if (e) { s->size = e->size; return 0; } if (!sha1_file_size(s->sha1, &s->size)) - locate_size_cache(s->sha1, s->size); + locate_size_cache(s->sha1, 0, s->size); } else { s->data = read_sha1_file(s->sha1, type, &s->size); @@ -614,7 +615,7 @@ static int parse_num(const char **cp_p) int diff_scoreopt_parse(const char *opt) { - int opt1, cmd; + int opt1, opt2, cmd; if (*opt++ != '-') return -1; @@ -623,9 +624,21 @@ int diff_scoreopt_parse(const char *opt) return -1; /* that is not a -M, -C nor -B option */ opt1 = parse_num(&opt); + if (cmd != 'B') + opt2 = 0; + else { + if (*opt == 0) + opt2 = 0; + else if (*opt != '/') + return -1; /* we expect -B80/99 or -B80 */ + else { + opt++; + opt2 = parse_num(&opt); + } + } if (*opt != 0) return -1; - return opt1; + return opt1 | (opt2 << 16); } struct diff_queue_struct diff_queued_diff; @@ -773,8 +786,8 @@ static void diff_flush_patch(struct diff_filepair *p) case 'R': sprintf(msg_, "similarity index %d%%\n" - "rename old %s\n" - "rename new %s", + "rename from %s\n" + "rename to %s", (int)(0.5 + p->score * 100.0/MAX_SCORE), p->one->path, p->two->path); msg = msg_; @@ -951,10 +964,12 @@ void diffcore_std(const char **paths, { if (paths && paths[0]) diffcore_pathspec(paths); - if (0 <= break_opt) + if (break_opt != -1) diffcore_break(break_opt); if (detect_rename) diffcore_rename(detect_rename, rename_score); + if (break_opt != -1) + diffcore_merge_broken(); if (pickaxe) diffcore_pickaxe(pickaxe, pickaxe_opts); if (orderfile)