Mercurial > hg
view tests/test-git-export @ 11769:ca6cebd8734e stable
dirstate: ignore symlinks when fs cannot handle them (issue1888)
When the filesystem cannot handle the executable bit, we currently
ignore it completely when looking for modified files. Similarly, it is
impossible to set or clear the bit when the filesystem ignores it.
This patch makes Mercurial treat symbolic links the same way.
Symlinks are a little different since they manifest themselves as
small files containing a filename (the symlink target). On Windows,
these files show up as regular files, and on Linux and Mac they show
up as real symlinks.
Issue1888 presents a case where the symlink files are better ignored
from the Windows side. A Linux client creates symlinks in a working
copy which is shared over a network between Linux and Windows clients.
The Samba server is helpful and defererences the symlink when the
Windows client looks at it. This means that Mercurial on the Windows
side sees file content instead of a file name in the symlink, and
hence flags the link as modified. Ignoring the change would be much
more helpful, similarly to how Mercurial does not report any changes
when executable bits are ignored in a checkout on Windows.
An initial checkout of a symbolic link on a file system that cannot
handle symbolic links will still result in a regular file containing
the target file name as its content. Sharing such a checkout with a
Linux client will not turn the file into a symlink automatically, but
'hg revert' can fix that. After the revert, the Windows client will
see the correct file content (provided by the Samba server when it
follows the link on the Linux side) and otherwise ignore the change.
Running 'hg perfstatus' 10 times gives these results:
Before: After:
min: 0.544703 min: 0.546549
med: 0.547592 med: 0.548881
avg: 0.549146 avg: 0.548549
max: 0.564112 max: 0.551504
The median time is increased about 0.24%.
author | Martin Geisler <mg@aragost.com> |
---|---|
date | Mon, 09 Aug 2010 15:31:56 +0200 |
parents | 6c82beaaa11a |
children |
line wrap: on
line source
#!/bin/sh hg init a cd a echo start > start hg ci -Amstart echo new > new hg ci -Amnew echo '% new file' hg diff --git -r 0 hg cp new copy hg ci -mcopy echo '% copy' hg diff --git -r 1:tip hg mv copy rename hg ci -mrename echo '% rename' hg diff --git -r 2:tip hg rm rename hg ci -mdelete echo '% delete' hg diff --git -r 3:tip cat > src <<EOF 1 2 3 4 5 EOF hg ci -Amsrc chmod +x src hg ci -munexec echo '% chmod 644' hg diff --git -r 5:tip hg mv src dst chmod -x dst echo a >> dst hg ci -mrenamemod 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' echo >> start hg ci -m 'change start' hg revert -r -2 start hg mv dst2 dst3 hg ci -m 'mv dst2 dst3; revert start' 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' 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'