# HG changeset patch # User Dan Villiom Podlaski Christiansen # Date 1289304316 -3600 # Node ID b3128fec5d54d5950f29bc8f3f330a09e008d97c # Parent c8c438b010aae3fd67937c5cc01abc4b765d2a40 editor: handle property changes to links. Previously, property changes to links caused 'link ' to be prepended to the link destination. Removing a line that prepended it in Revision::set() appears to fix it. In these cases, the "file marked as link, but contains data" warning might be triggered. This should be safe, so it's lowered to a note and the language made less conclusive. In order to test this, extra revisions are added to the 'symlinks.svndump' fixture. As one of the new revisions add a link that points to 'link to this', a check that asserted that link destinations must not start with 'link ' was removed. This change is safe, as the test later on asserts exact equality with the contents of the 'links' dictionary. diff --git a/hgsubversion/editor.py b/hgsubversion/editor.py --- a/hgsubversion/editor.py +++ b/hgsubversion/editor.py @@ -38,8 +38,6 @@ class RevisionData(object): self.exception = None def set(self, path, data, isexec=False, islink=False): - if islink: - data = 'link ' + data self.files[path] = data self.execfiles[path] = isexec self.symlinks[path] = islink diff --git a/hgsubversion/replay.py b/hgsubversion/replay.py --- a/hgsubversion/replay.py +++ b/hgsubversion/replay.py @@ -160,8 +160,8 @@ def convert_rev(ui, meta, svn, r, tbdelt if is_link and data.startswith('link '): data = data[len('link '):] elif is_link: - ui.warn('file marked as link, but contains data: ' - '%s (%r)\n' % (current_file, flags)) + ui.debug('file marked as link, but may contain data: ' + '%s (%r)\n' % (current_file, flags)) else: data = parentctx.filectx(path).data() return context.memfilectx(path=path, diff --git a/tests/fixtures/symlinks.svndump b/tests/fixtures/symlinks.svndump --- a/tests/fixtures/symlinks.svndump +++ b/tests/fixtures/symlinks.svndump @@ -72,6 +72,7 @@ Node-action: add Prop-content-length: 10 Text-content-length: 2 Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3 +Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b Content-length: 12 PROPS-END @@ -93,6 +94,7 @@ Node-action: add Prop-content-length: 33 Text-content-length: 6 Text-content-md5: c118dba188202a1efc975bef6064180b +Text-content-sha1: 41f94e4692313bf7f7c92aa600002f1dff93d6bf Content-length: 39 K 11 @@ -108,6 +110,7 @@ Node-action: add Prop-content-length: 33 Text-content-length: 6 Text-content-md5: c118dba188202a1efc975bef6064180b +Text-content-sha1: 41f94e4692313bf7f7c92aa600002f1dff93d6bf Content-length: 39 K 11 @@ -123,6 +126,7 @@ Node-action: add Prop-content-length: 33 Text-content-length: 6 Text-content-md5: c118dba188202a1efc975bef6064180b +Text-content-sha1: 41f94e4692313bf7f7c92aa600002f1dff93d6bf Content-length: 39 K 11 @@ -171,6 +175,7 @@ Node-action: add Node-copyfrom-rev: 2 Node-copyfrom-path: trunk/linka Text-copy-source-md5: c118dba188202a1efc975bef6064180b +Text-copy-source-sha1: 41f94e4692313bf7f7c92aa600002f1dff93d6bf Prop-content-length: 57 Content-length: 57 @@ -216,6 +221,7 @@ Node-kind: file Node-action: change Text-content-length: 6 Text-content-md5: e9292b8c4fca95ac8c70b4ae040d0b79 +Text-content-sha1: 7325442a5f7383205e66db563025d51535883784 Content-length: 6 link b @@ -225,6 +231,7 @@ Node-kind: file Node-action: change Text-content-length: 6 Text-content-md5: e9292b8c4fca95ac8c70b4ae040d0b79 +Text-content-sha1: 7325442a5f7383205e66db563025d51535883784 Content-length: 6 link b @@ -257,6 +264,7 @@ Node-action: replace Prop-content-length: 10 Text-content-length: 6 Text-content-md5: edc3d3797971f12c7f5e1d106dd5cee2 +Text-content-sha1: eff1098d818d1f471af4a2cbdb0223e4e030a158 Content-length: 16 PROPS-END @@ -269,6 +277,7 @@ Node-action: change Prop-content-length: 34 Text-content-length: 5 Text-content-md5: 6137cde4893c59f76f005a8123d8e8e6 +Text-content-sha1: c5d84736ba451747dd5f0eb9d17e104f3697ef47 Content-length: 39 K 13 @@ -279,3 +288,118 @@ PROPS-END data +Revision-number: 6 +Prop-content-length: 116 +Content-length: 116 + +K 7 +svn:log +V 15 +recreate a link +K 10 +svn:author +V 6 +danchr +K 8 +svn:date +V 27 +2010-11-08T14:57:19.667088Z +PROPS-END + +Node-path: trunk/linka3 +Node-kind: file +Node-action: add +Prop-content-length: 59 +Text-content-length: 6 +Text-content-md5: c118dba188202a1efc975bef6064180b +Text-content-sha1: 41f94e4692313bf7f7c92aa600002f1dff93d6bf +Content-length: 65 + +K 11 +svn:special +V 1 +* +K 14 +svn:needs-lock +V 1 +* +PROPS-END +link a + +Revision-number: 7 +Prop-content-length: 128 +Content-length: 128 + +K 7 +svn:log +V 27 +delete property from a link +K 10 +svn:author +V 6 +danchr +K 8 +svn:date +V 27 +2010-11-08T14:57:40.331635Z +PROPS-END + +Node-path: trunk/linka3 +Node-kind: file +Node-action: change +Prop-content-length: 33 +Content-length: 33 + +K 11 +svn:special +V 1 +* +PROPS-END + + +Revision-number: 8 +Prop-content-length: 145 +Content-length: 145 + +K 7 +svn:log +V 44 +add an uglily named file and a symlink to it +K 10 +svn:author +V 6 +danchr +K 8 +svn:date +V 27 +2010-11-08T15:11:12.267958Z +PROPS-END + +Node-path: trunk/link to this +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 0 +Text-content-md5: d41d8cd98f00b204e9800998ecf8427e +Text-content-sha1: da39a3ee5e6b4b0d3255bfef95601890afd80709 +Content-length: 10 + +PROPS-END + + +Node-path: trunk/linka4 +Node-kind: file +Node-action: add +Prop-content-length: 33 +Text-content-length: 17 +Text-content-md5: aecd1324085a1fc5b7aa8950f92dcfb9 +Text-content-sha1: d22de0907c0b1878b057c873092e82fd9c50849b +Content-length: 50 + +K 11 +svn:special +V 1 +* +PROPS-END +link link to this + diff --git a/tests/test_fetch_symlinks.py b/tests/test_fetch_symlinks.py --- a/tests/test_fetch_symlinks.py +++ b/tests/test_fetch_symlinks.py @@ -9,14 +9,7 @@ class TestFetchSymlinks(test_util.TestBa def test_symlinks(self, stupid=False): repo = self._load_fixture_and_fetch('symlinks.svndump', stupid) - # Check no symlink contains the 'link ' prefix - for rev in repo: - r = repo[rev] - for f in r.manifest(): - if 'l' not in r[f].flags(): - continue - self.assertFalse(r[f].data().startswith('link ')) - # Check symlinks in tip + # Check symlinks throughout history links = { 0: { 'linka': 'a', @@ -35,6 +28,16 @@ class TestFetchSymlinks(test_util.TestBa }, 3: { }, + 4: { + 'linka3': 'a', + }, + 5: { + 'linka3': 'a', + }, + 6: { + 'linka3': 'a', + 'linka4': 'link to this', + }, } for rev in repo: