diff --git a/hggit/git_handler.py b/hggit/git_handler.py index cf9dd81b61dcac87c807364560e05b233b503d7f_aGdnaXQvZ2l0X2hhbmRsZXIucHk=..da804eac2b00d10c76fa12cca95176a54680873f_aGdnaXQvZ2l0X2hhbmRsZXIucHk= 100644 --- a/hggit/git_handler.py +++ b/hggit/git_handler.py @@ -1298,7 +1298,6 @@ if commit.parents: btree = self.git[commit.parents[0]].tree - changes = diff_tree.tree_changes(self.git.object_store, btree, tree) files = {} gitlinks = {} renames = None @@ -1302,5 +1301,6 @@ files = {} gitlinks = {} renames = None + rename_detector = None if detect_renames: renames = {} @@ -1305,5 +1305,9 @@ if detect_renames: renames = {} + rename_detector = self._rename_detector + + changes = diff_tree.tree_changes(self.git.object_store, btree, tree, + rename_detector=rename_detector) for change in changes: oldfile, oldmode, oldsha = change.old @@ -1322,6 +1326,10 @@ if newmode == 0160000: # new = gitlink gitlinks[newfile] = newsha + if change.type == diff_tree.CHANGE_RENAME: + # don't record the rename because only file -> file renames + # make sense in Mercurial + gitlinks[oldfile] = None if oldmode is not None and oldmode != 0160000: # file -> gitlink files[oldfile] = True, None, None @@ -1333,6 +1341,10 @@ if newfile is not None: # new = file files[newfile] = False, newmode, newsha + if renames is not None and newfile != oldfile: + renames[newfile] = oldfile + if change.type == diff_tree.CHANGE_RENAME: + files[oldfile] = True, None, None else: # old = file files[oldfile] = True, None, None @@ -1357,7 +1369,7 @@ find_copies_harder = self.ui.configbool('git', 'findcopiesharder', default=False) - return diff_tree.RenameDetector( + return diff_tree.RenameDetector(self.git.object_store, rename_threshold=similarity, max_files=max_files, find_copies_harder=find_copies_harder) diff --git a/tests/test-renames.t b/tests/test-renames.t new file mode 100644 index 0000000000000000000000000000000000000000..da804eac2b00d10c76fa12cca95176a54680873f_dGVzdHMvdGVzdC1yZW5hbWVzLnQ= --- /dev/null +++ b/tests/test-renames.t @@ -0,0 +1,160 @@ +Test that rename detection works + $ . "$TESTDIR/testutil" + + $ cat >> $HGRCPATH <<EOF + > [diff] + > git = True + > [git] + > similarity = 50 + > EOF + + $ git init -q gitrepo + $ cd gitrepo + $ for i in $(seq 1 10); do echo $i >> alpha; done + $ git add alpha + $ fn_git_commit -malpha + +Rename a file + $ git mv alpha beta + $ echo 11 >> beta + $ git add beta + $ fn_git_commit -mbeta + +Copy a file + $ cp beta gamma + $ echo 12 >> beta + $ echo 13 >> gamma + $ git add beta gamma + $ fn_git_commit -mgamma + +Add a submodule (gitlink) and move it to a different spot: + $ cd .. + $ git init -q gitsubmodule + $ cd gitsubmodule + $ touch subalpha + $ git add subalpha + $ fn_git_commit -msubalpha + $ cd ../gitrepo + + $ rmpwd="import sys; print sys.stdin.read().replace('$(dirname $(pwd))/', '')" + $ clonefilt='s/Cloning into/Initialized empty Git repository in/;s/in .*/in .../' + + $ git submodule add ../gitsubmodule 2>&1 | python -c "$rmpwd" | sed "$clonefilt" | egrep -v '^done\.$' + Initialized empty Git repository in ... + + $ fn_git_commit -m 'add submodule' + $ sed -e 's/path = gitsubmodule/path = gitsubmodule2/' .gitmodules > .gitmodules-new + $ mv .gitmodules-new .gitmodules + $ mv gitsubmodule gitsubmodule2 + $ git add .gitmodules gitsubmodule2 + $ git rm --cached gitsubmodule + rm 'gitsubmodule' + $ fn_git_commit -m 'move submodule' + + $ cd .. + $ hg clone -q gitrepo hgrepo + $ cd hgrepo + $ hg log -p --graph --template "{rev} {node} {desc|firstline}\n{join(extras, ' ')}\n\n" + @ 4 8ef5468692d8a63a2a56d35540ccc2a83970daf1 move submodule + | branch=default + | + | diff --git a/.gitmodules b/.gitmodules + | --- a/.gitmodules + | +++ b/.gitmodules + | @@ -1,3 +1,3 @@ + | [submodule "gitsubmodule"] + | - path = gitsubmodule + | + path = gitsubmodule2 + | url = ../gitsubmodule + | diff --git a/.hgsub b/.hgsub + | --- a/.hgsub + | +++ b/.hgsub + | @@ -1,1 +1,1 @@ + | -gitsubmodule = [git]../gitsubmodule + | +gitsubmodule2 = [git]../gitsubmodule + | diff --git a/.hgsubstate b/.hgsubstate + | --- a/.hgsubstate + | +++ b/.hgsubstate + | @@ -1,1 +1,1 @@ + | -5944b31ff85b415573d1a43eb942e2dea30ab8be gitsubmodule + | +5944b31ff85b415573d1a43eb942e2dea30ab8be gitsubmodule2 + | + o 3 82b69d514926123f7d83b6a8fb5b041bc79c5af9 add submodule + | branch=default + | + | diff --git a/.gitmodules b/.gitmodules + | new file mode 100644 + | --- /dev/null + | +++ b/.gitmodules + | @@ -0,0 +1,3 @@ + | +[submodule "gitsubmodule"] + | + path = gitsubmodule + | + url = ../gitsubmodule + | diff --git a/.hgsub b/.hgsub + | new file mode 100644 + | --- /dev/null + | +++ b/.hgsub + | @@ -0,0 +1,1 @@ + | +gitsubmodule = [git]../gitsubmodule + | diff --git a/.hgsubstate b/.hgsubstate + | new file mode 100644 + | --- /dev/null + | +++ b/.hgsubstate + | @@ -0,0 +1,1 @@ + | +5944b31ff85b415573d1a43eb942e2dea30ab8be gitsubmodule + | + o 2 79563b42ed93cd47601aec11694f4e0df48457e7 gamma + | branch=default + | + | diff --git a/beta b/beta + | --- a/beta + | +++ b/beta + | @@ -9,3 +9,4 @@ + | 9 + | 10 + | 11 + | +12 + | diff --git a/beta b/gamma + | copy from beta + | copy to gamma + | --- a/beta + | +++ b/gamma + | @@ -9,3 +9,4 @@ + | 9 + | 10 + | 11 + | +13 + | + o 1 d1c40364c3c996350da6963e605df8269db8e311 beta + | branch=default + | + | diff --git a/alpha b/beta + | rename from alpha + | rename to beta + | --- a/alpha + | +++ b/beta + | @@ -8,3 +8,4 @@ + | 8 + | 9 + | 10 + | +11 + | + o 0 0c233c2e91d64435bf329075bc0e7e858bc3b07c alpha + branch=default + + diff --git a/alpha b/alpha + new file mode 100644 + --- /dev/null + +++ b/alpha + @@ -0,0 +1,10 @@ + +1 + +2 + +3 + +4 + +5 + +6 + +7 + +8 + +9 + +10 +