view tests/test-convert-filemap.out @ 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 f2618cacb485
children 7fefef3ce791
line wrap: on
line source

created new head
created new head
@  8 "8: change foo" files: foo
|
o    7 "7: second merge; change bar" files: bar baz
|\
| o  6 "6: change foo baz" files: baz foo
| |
o |  5 "5: change bar baz quux" files: bar baz quux
|/
o    4 "4: first merge; change bar baz" files: bar baz
|\
| o  3 "3: change bar quux" files: bar quux
| |
o |  2 "2: change foo" files: foo
|/
o  1 "1: add bar quux; copy foo to copied" files: bar copied quux
|
o  0 "0: add foo baz dir/" files: baz dir/file dir/file2 dir/subdir/file3 dir/subdir/file4 foo

% final file versions in this repo:
9463f52fe115e377cf2878d4fc548117211063f2 644   bar
94c1be4dfde2ee8d78db8bbfcf81210813307c3d 644   baz
7711d36246cc83e61fb29cd6d4ef394c63f1ceaf 644   copied
3e20847584beff41d7cd16136b7331ab3d754be0 644   dir/file
75e6d3f8328f5f6ace6bf10b98df793416a09dca 644   dir/file2
5fe139720576e18e34bcc9f79174db8897c8afe9 644   dir/subdir/file3
57a1c1511590f3de52874adfa04effe8a77d64af 644   dir/subdir/file4
9a7b52012991e4873687192c3e17e61ba3e837a3 644   foo
bc3eca3f47023a3e70ca0d8cc95a22a6827db19d 644   quux
copied renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd

% foo: skip unwanted merges; use 1st parent in 1st merge, 2nd in 2nd
@  3 "8: change foo" files: foo
|
o  2 "6: change foo baz" files: foo
|
o  1 "2: change foo" files: foo
|
o  0 "0: add foo baz dir/" files: foo

9a7b52012991e4873687192c3e17e61ba3e837a3 644   foo
% bar: merges are not merges anymore
@  4 "7: second merge; change bar" files: bar
|
o  3 "5: change bar baz quux" files: bar
|
o  2 "4: first merge; change bar baz" files: bar
|
o  1 "3: change bar quux" files: bar
|
o  0 "1: add bar quux; copy foo to copied" files: bar

9463f52fe115e377cf2878d4fc548117211063f2 644   bar
% baz: 1st merge is not a merge anymore; 2nd still is
@    4 "7: second merge; change bar" files: baz
|\
| o  3 "6: change foo baz" files: baz
| |
o |  2 "5: change bar baz quux" files: baz
|/
o  1 "4: first merge; change bar baz" files: baz
|
o  0 "0: add foo baz dir/" files: baz

94c1be4dfde2ee8d78db8bbfcf81210813307c3d 644   baz
% foo quux: we add additional merges when they are interesting
@  8 "8: change foo" files: foo
|
o    7 "7: second merge; change bar" files:
|\
| o  6 "6: change foo baz" files: foo
| |
o |  5 "5: change bar baz quux" files: quux
|/
o    4 "4: first merge; change bar baz" files:
|\
| o  3 "3: change bar quux" files: quux
| |
o |  2 "2: change foo" files: foo
|/
o  1 "1: add bar quux; copy foo to copied" files: quux
|
o  0 "0: add foo baz dir/" files: foo

9a7b52012991e4873687192c3e17e61ba3e837a3 644   foo
bc3eca3f47023a3e70ca0d8cc95a22a6827db19d 644   quux
% bar quux: partial conversion
@  1 "3: change bar quux" files: bar quux
|
o  0 "1: add bar quux; copy foo to copied" files: bar quux

b79105bedc55102f394e90a789c9c380117c1b4a 644   bar
db0421cc6b685a458c8d86c7d5c004f94429ea23 644   quux
% bar quux: complete the partial conversion
@  4 "7: second merge; change bar" files: bar
|
o  3 "5: change bar baz quux" files: bar quux
|
o  2 "4: first merge; change bar baz" files: bar
|
o  1 "3: change bar quux" files: bar quux
|
o  0 "1: add bar quux; copy foo to copied" files: bar quux

9463f52fe115e377cf2878d4fc548117211063f2 644   bar
bc3eca3f47023a3e70ca0d8cc95a22a6827db19d 644   quux
% foo: partial conversion
@  0 "0: add foo baz dir/" files: foo

2ed2a3912a0b24502043eae84ee4b279c18b90dd 644   foo
% foo: complete the partial conversion
@  3 "8: change foo" files: foo
|
o  2 "6: change foo baz" files: foo
|
o  1 "2: change foo" files: foo
|
o  0 "0: add foo baz dir/" files: foo

9a7b52012991e4873687192c3e17e61ba3e837a3 644   foo
% copied: copied file; source not included in new repo
@  0 "1: add bar quux; copy foo to copied" files: copied

2ed2a3912a0b24502043eae84ee4b279c18b90dd 644   copied
copied not renamed
% foo copied: copied file; source included in new repo
@  4 "8: change foo" files: foo
|
o  3 "6: change foo baz" files: foo
|
o  2 "2: change foo" files: foo
|
o  1 "1: add bar quux; copy foo to copied" files: copied
|
o  0 "0: add foo baz dir/" files: foo

7711d36246cc83e61fb29cd6d4ef394c63f1ceaf 644   copied
9a7b52012991e4873687192c3e17e61ba3e837a3 644   foo
copied renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd
@  4 "8: change foo" files: foo2
|
o  3 "6: change foo baz" files: foo2
|
o  2 "2: change foo" files: foo2
|
o  1 "1: add bar quux; copy foo to copied" files: copied2
|
o  0 "0: add foo baz dir/" files: dir2/file dir2/subdir/file3 foo2

d43feacba7a4f1f2080dde4a4b985bd8a0236d46 644   copied2
3e20847584beff41d7cd16136b7331ab3d754be0 644   dir2/file
5fe139720576e18e34bcc9f79174db8897c8afe9 644   dir2/subdir/file3
9a7b52012991e4873687192c3e17e61ba3e837a3 644   foo2
copied2 renamed from foo2:2ed2a3912a0b24502043eae84ee4b279c18b90dd
copied:
foo
copied2:
foo