changeset 741:b3128fec5d54

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.
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Tue, 09 Nov 2010 13:05:16 +0100
parents c8c438b010aa
children 0d3139ba2d66
files hgsubversion/editor.py hgsubversion/replay.py tests/fixtures/symlinks.svndump tests/test_fetch_symlinks.py
diffstat 4 files changed, 137 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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,
--- 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
+
--- 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: