diff options
author | Junio C Hamano <junkio@cox.net> | 2005-05-22 21:24:49 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-23 11:49:30 -0700 |
commit | 60896c7bfed67f1c7364595213ef9239642f83c5 (patch) | |
tree | 01c56ae444ab86d7df74664e04ac4d55e9658791 /diffcore-rename.c | |
parent | c1bb93502012b710ec5a31dff62d4aca7bf51adc (diff) | |
download | git-60896c7bfed67f1c7364595213ef9239642f83c5.tar.gz |
[PATCH] Be careful with symlinks when detecting renames and copies.
Earlier round was not treating symbolic links carefully enough,
and would have produced diff output that renamed/copied then
edited the contents of a symbolic link, which made no practical
sense. Change it to detect only pure renames.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'diffcore-rename.c')
-rw-r--r-- | diffcore-rename.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/diffcore-rename.c b/diffcore-rename.c index 794e5cc7d5..52f09d2319 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -20,7 +20,7 @@ static void diff_rename_pool_add(struct diff_rename_pool *pool, struct diff_filespec *s) { if (S_ISDIR(s->mode)) - return; /* rename/copy patch for tree does not make sense. */ + return; /* no trees, please */ if (pool->alloc <= pool->nr) { pool->alloc = alloc_nr(pool->alloc); @@ -71,6 +71,13 @@ static int estimate_similarity(struct diff_filespec *src, unsigned long delta_size, base_size; int score; + /* We deal only with regular files. Symlink renames are handled + * only when they are exact matches --- in other words, no edits + * after renaming. + */ + if (!S_ISREG(src->mode) || !S_ISREG(dst->mode)) + return 0; + delta_size = ((src->size < dst->size) ? (dst->size - src->size) : (src->size - dst->size)); base_size = ((src->size < dst->size) ? src->size : dst->size); @@ -268,7 +275,7 @@ void diffcore_rename(int detect_rename, int minimum_score) struct diff_filepair *p = q->queue[i]; if (!DIFF_FILE_VALID(p->one)) if (!DIFF_FILE_VALID(p->two)) - continue; /* ignore nonsense */ + continue; /* unmerged */ else diff_rename_pool_add(&created, p->two); else if (!DIFF_FILE_VALID(p->two)) @@ -360,12 +367,9 @@ void diffcore_rename(int detect_rename, int minimum_score) for (i = 0; i < q->nr; i++) { struct diff_filepair *dp, *p = q->queue[i]; if (!DIFF_FILE_VALID(p->one)) { - if (DIFF_FILE_VALID(p->two)) { - /* creation */ - dp = diff_queue(&outq, p->one, p->two); - dp->xfrm_work = 4; - } - /* otherwise it is a nonsense; just ignore it */ + /* creation or unmerged entries */ + dp = diff_queue(&outq, p->one, p->two); + dp->xfrm_work = 4; } else if (!DIFF_FILE_VALID(p->two)) { /* deletion */ @@ -394,7 +398,7 @@ void diffcore_rename(int detect_rename, int minimum_score) for (i = 0; i < outq.nr; i++) { struct diff_filepair *p = outq.queue[i]; if (!DIFF_FILE_VALID(p->one)) { - /* created */ + /* created or unmerged */ if (p->two->xfrm_flags & RENAME_DST_MATCHED) ; /* rename/copy created it already */ else @@ -443,7 +447,7 @@ void diffcore_rename(int detect_rename, int minimum_score) else /* otherwise it is a modified (or stayed) entry */ diff_queue(q, p->one, p->two); - free(p); + diff_free_filepair(p); } free(outq.queue); |