[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