[PATCH] convert: svn-sink: apply property changes after adding dirs/files

Maxim Dounin mdounin at mdounin.ru
Fri Dec 14 17:54:09 CST 2007


Hello!

When subversion used as a conversion sink, current code tries to set 
svn:executable property in putfile() hook. This may happen before 
apropriate file or dir was added to subversion, and so conversion will 
crash.

Attached patch fixes it by moving actual work into putcommit().

Maxim Dounin
-------------- next part --------------
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1197673399 -10800
# Node ID b7c727cadfd2106f798c257f3f2a32d107eddca2
# Parent  be0ee65e33611d89795acad46710135aee8eb07b
convert: svn-sink: apply property changes after adding dirs/file

We can't store properties for files we haven't added to repo. Remember
needed property changes and apply them in putcommit().

diff -r be0ee65e3361 -r b7c727cadfd2 hgext/convert/subversion.py
--- a/hgext/convert/subversion.py	Sat Dec 15 02:03:07 2007 +0300
+++ b/hgext/convert/subversion.py	Sat Dec 15 02:03:19 2007 +0300
@@ -725,6 +725,8 @@ class svn_sink(converter_sink, commandli
         converter_sink.__init__(self, ui, path)
         commandline.__init__(self, ui, 'svn')
         self.delete = []
+        self.setexec = []
+        self.delexec = []
         self.wc = None
         self.cwd = os.getcwd()
 
@@ -792,11 +794,11 @@ class svn_sink(converter_sink, commandli
             util.set_exec(self.wjoin(filename), 'x' in flags)
             if was_exec:
                 if 'x' not in flags:
-                    self.run0('propdel', 'svn:executable', filename)
+                    self.delexec.append(filename)
             else:
                 if 'x' in flags:
-                    self.run0('propset', 'svn:executable', '*', filename)
-            
+                    self.setexec.append(filename)
+
     def delfile(self, name):
         self.delete.append(name)
 
@@ -857,6 +859,14 @@ class svn_sink(converter_sink, commandli
 
     def revid(self, rev):
         return u"svn:%s@%s" % (self.uuid, rev)
+
+    def setprops(self):
+        for f in self.delexec:
+            self.run0('propdel', 'svn:executable', f)
+        self.delexec = []
+        for f in self.setexec:
+            self.run0('propset', 'svn:executable', '*', f)
+        self.setexec = []
         
     def putcommit(self, files, parents, commit):
         for parent in parents:
@@ -871,6 +881,7 @@ class svn_sink(converter_sink, commandli
         files = util.frozenset(files)
         entries.update(self.add_files(files.difference(entries)))
         entries.update(self.tidy_dirs(entries))
+        self.setprops()
         fd, messagefile = tempfile.mkstemp(prefix='hg-convert-')
         fp = os.fdopen(fd, 'w')
         fp.write(commit.desc)
diff -r be0ee65e3361 -r b7c727cadfd2 tests/test-convert-svn-sink
--- a/tests/test-convert-svn-sink	Sat Dec 15 02:03:07 2007 +0300
+++ b/tests/test-convert-svn-sink	Sat Dec 15 02:03:19 2007 +0300
@@ -59,6 +59,20 @@ hg convert -d svn a
 (cd a-hg-wc; svn up; rm c; svn revert c)
 test -x a-hg-wc/c && echo executable || echo not executable
 
+echo % executable in new directory
+
+rm -rf a a-hg a-hg-wc
+hg init a
+
+mkdir a/d1
+echo a > a/d1/a
+chmod +x a/d1/a
+hg --cwd a ci -d '0 0' -A -m 'add executable file in new directory'
+
+hg convert -d svn a
+(cd a-hg-wc; svn up; svn st -v; svn log --xml -v --limit=1 | sed 's,<date>.*,<date/>,')
+test -x a-hg-wc/d1/a && echo executable || echo not executable
+
 echo % branchy history
 
 hg init b
diff -r be0ee65e3361 -r b7c727cadfd2 tests/test-convert-svn-sink.out
--- a/tests/test-convert-svn-sink.out	Sat Dec 15 02:03:07 2007 +0300
+++ b/tests/test-convert-svn-sink.out	Sat Dec 15 02:03:19 2007 +0300
@@ -168,6 +168,35 @@ d1
 % executable
 ### known unfixed bug
 executable
+% executable in new directory
+adding d1/a
+assuming destination a-hg
+initializing svn repo 'a-hg'
+initializing svn wc 'a-hg-wc'
+scanning source...
+sorting...
+converting...
+0 add executable file in new directory
+At revision 1.
+                1        1 test         .
+                1        1 test         d1
+                1        1 test         d1/a
+<?xml version="1.0"?>
+<log>
+<logentry
+   revision="1">
+<author>test</author>
+<date/>
+<paths>
+<path
+   action="A">/d1</path>
+<path
+   action="A">/d1/a</path>
+</paths>
+<msg>add executable file in new directory</msg>
+</logentry>
+</log>
+executable
 % branchy history
 adding b
 adding left-1


More information about the Mercurial-devel mailing list