view tests/test-git-export @ 5378:8a2915f57dfc

convert: add a mode where mercurial_sink skips empty revisions. The getchanges function of some converter_source classes can return some false positives. I.e. they sometimes claim that a file "foo" was changed in some revision, even though its contents are still the same. convert_svn is particularly bad, but I think this can also happen with convert_cvs and, at least in theory, with mercurial_source. For regular conversions this is not really a problem - as long as getfile returns the right contents, we'll get a converted revision with the right contents. But when we use --filemap, this could lead to superfluous revisions being converted. Instead of fixing every converter_source, I decided to change mercurial_sink to work around this problem. When --filemap is used, we're interested only in revisions that touch some specific files. If a revision doesn't change any of these files, then we're not interested in it (at least for revisions with a single parent; merges are special). For mercurial_sink, we abuse this property and rollback a commit if the manifest text hasn't changed. This avoids duplicating the logic from localrepo.filecommit to detect unchanged files.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Thu, 04 Oct 2007 23:21:37 -0300
parents 0fc16031bb45
children
line wrap: on
line source

#!/bin/sh

hg init a
cd a

echo start > start
hg ci -Amstart -d '0 0'
echo new > new
hg ci -Amnew -d '0 0'
echo '% new file'
hg diff --git -r 0

hg cp new copy
hg ci -mcopy -d '0 0'
echo '% copy'
hg diff --git -r 1:tip

hg mv copy rename
hg ci -mrename -d '0 0'
echo '% rename'
hg diff --git -r 2:tip

hg rm rename
hg ci -mdelete -d '0 0'
echo '% delete'
hg diff --git -r 3:tip

cat > src <<EOF
1
2
3
4
5
EOF
hg ci -Amsrc -d '0 0'
chmod +x src
hg ci -munexec -d '0 0'
echo '% chmod 644'
hg diff --git -r 5:tip

hg mv src dst
chmod -x dst
echo a >> dst
hg ci -mrenamemod -d '0 0'
echo '% rename+mod+chmod'
hg diff --git -r 6:tip

echo '% nonexistent in tip+chmod'
hg diff --git -r 5:6

echo '% binary diff'
cp $TESTDIR/binfile.bin .
hg add binfile.bin
hg diff --git > b.diff
cat b.diff

echo '% import binary diff'
hg revert binfile.bin
rm binfile.bin
hg import -mfoo b.diff
cmp binfile.bin $TESTDIR/binfile.bin

echo
echo '% rename binary file'
hg mv binfile.bin renamed.bin
hg diff --git

echo
echo '% diff across many revisions'
hg mv dst dst2
hg ci -m 'mv dst dst2' -d '0 0'

echo >> start
hg ci -m 'change start' -d '0 0'

hg revert -r -2 start
hg mv dst2 dst3
hg ci -m 'mv dst2 dst3; revert start' -d '0 0'

hg diff --git -r 9:11
echo '%  reversed'
hg diff --git -r 11:9

echo a >> foo
hg add foo
hg ci -m 'add foo'
echo b >> foo
hg ci -m 'change foo'
hg mv foo bar
hg ci -m 'mv foo bar'
echo c >> bar
hg ci -m 'change bar'

echo
echo '% file created before r1 and renamed before r2'
hg diff --git -r -3:-1
echo '%  reversed'
hg diff --git -r -1:-3
echo
echo '% file created in r1 and renamed before r2'
hg diff --git -r -4:-1
echo '%  reversed'
hg diff --git -r -1:-4
echo
echo '% file created after r1 and renamed before r2'
hg diff --git -r -5:-1
echo '%  reversed'
hg diff --git -r -1:-5

echo
echo '% comparing with the working dir'
echo >> start
hg ci -m 'change start again' -d '0 0'

echo > created
hg add created
hg ci -m 'add created'

hg mv created created2
hg ci -m 'mv created created2'

hg mv created2 created3
echo "% there's a copy in the working dir..."
hg diff --git
echo
echo "% ...but there's another copy between the original rev and the wd"
hg diff --git -r -2
echo
echo "% ...but the source of the copy was created after the original rev"
hg diff --git -r -3
hg ci -m 'mv created2 created3'

echo > brand-new
hg add brand-new
hg ci -m 'add brand-new'
hg mv brand-new brand-new2
echo '% created in parent of wd; renamed in the wd'
hg diff --git

echo
echo '% created between r1 and parent of wd; renamed in the wd'
hg diff --git -r -2
hg ci -m 'mv brand-new brand-new2'

echo '% one file is copied to many destinations and removed'
hg cp brand-new2 brand-new3
hg mv brand-new2 brand-new3-2
hg ci -m 'multiple renames/copies'
hg diff --git -r -2 -r -1
echo '%  reversed'
hg diff --git -r -1 -r -2

echo '% there should be a trailing TAB if there are spaces in the file name'
echo foo > 'with spaces'
hg add 'with spaces'
hg diff --git
hg ci -m 'add filename with spaces'