Hi Julian, Here the things that I noticed while playing with svnmover. I was going for a FSFS / FSX library duplication scenario.
The only major problem IMO, is that "branchify" is currently too destructive: Applied within an existing branch, it seems to make merges from & to the respective sub-tree impossible (but the conflict it might also have been caused by the deletion, so I'm not 100% positive). I think I have a solution to that and will sketch that in a separate post. -- Stefan^2. * nice to have: svnmover should have a history in interactive mode * Local paths don't get resolved as expect: svnmover> put ~/develop/svnmover/mail.txt trunk/sub/mail.txt svnmover: warning: apr_err=ENOENT svnmover: warning: W000002: Can't open file '~/develop/svnmover/mail.txt': No such file or directory svnmover> put /home/stefan/develop/svnmover/mail.txt trunk/sub/mail.txt svnmover: warning: apr_err=SVN_ERR_INCORRECT_PARAMS svnmover: warning: W200004: Argument '/home/stefan/develop/svnmover/mail.txt' is not a relative path or a URL * Trying to branch from a non-branch-root segfaults: svnmover> branch trunk branches/maint Segmentation fault (core dumped) * Are element IDs arbitrary? From the output it seems that they use distinct ranges for each branch. I assume a "proper" implementation would have a two-dimensional ID space such as "e1.1" instead of "e101". * Bogus error message when trying to create a sub-branch from a non-branch-root: svnmover> branch trunk/sub trunk/B svnmover: warning: W123456: source and destination must be within same outer branch; source is b10 inside b0, destination is in b10 svnmover> ls . e0 . e1 branches e3 tags e6 trunk (branch ^.6) e7 branches/maint (branch ^.7) svnmover> ls trunk e100 . e101 sub e102 sub/mail.txt * Currently, branchify cannot "heal" or "undo" a dissolve operation. Can that limitation be lifted for any copy source / target pair? Can that limitation be lifted for undoing a 'dissolve' when no other commits were done to that (former) branch in the meantime? * Trying to rename a sub-branch root: svnmover> mv trunk/sub trunk/A mv: moving by copy-and-delete svnmover: warning: apr_err=SVN_ERR_ASSERTION_FAIL svnmover: warning: W235000: In file 'subversion/libsvn_delta/editor3e.c' line 293: assertion failed (eid != branch->sibling_defn->root_eid) Tree structure before & after (unchanged): svnmover> ls-br-r family 0 (BSIDs 0:1, EIDs 0:8) branch ^ bsid=0 root=e0 / e0 . e1 branches e3 tags e6 trunk (branch ^.6) e7 branches/maint (branch ^.7) family 1 (BSIDs 10:12, EIDs 100:104) branch ^.6 bsid=10 root=e100 /trunk e100 . e103 sub (branch ^.6.103) branch ^.7 bsid=11 root=e100 /branches/maint e100 . e101 sub e102 sub/mail.txt family 2 (BSIDs 20:21, EIDs 200:202) branch ^.6.103 bsid=20 root=e200 /trunk/sub e200 . e201 mail.txt * The following sequence works, though (ommitting outputs): svnmover> branch trunk/sub trunk/B svnmover> branch trunk/sub trunk/A svnmover> rm trunk/sub Interesting state of branches/maint/sub vs. trunk/A & trunk/B: svnmover> ls-br-r [[[ family 0 (BSIDs 0:1, EIDs 0:8) branch ^ bsid=0 root=e0 / e0 . e1 branches e3 tags e6 trunk (branch ^.6) e7 branches/maint (branch ^.7) family 1 (BSIDs 10:12, EIDs 100:106) branch ^.6 bsid=10 root=e100 /trunk e100 . e104 B (branch ^.6.104) e105 A (branch ^.6.105) branch ^.7 bsid=11 root=e100 /branches/maint e100 . e101 sub e102 sub/mail.txt family 2 (BSIDs 20:23, EIDs 200:202) branch ^.6.104 bsid=21 root=e200 /trunk/B e200 . e201 mail.txt branch ^.6.105 bsid=22 root=e200 /trunk/A e200 . e201 mail.txt ]]] * Trying to merge a recent change: svnmover> merge branches/maint trunk trunk@6 ! e102 <conflict> svnmover: warning: W123456: Merge failed: conflict(s) occurred I guess that merge has been doomed since the point trunk/sub became a branch root. * Merging into the opposite direction fails as well: svnmover> merge trunk branches/maint trunk@6 D e101 sub ! e102 <conflict> A e104 B (branch ^.6.104) A e105 A (branch ^.6.105) svnmover: warning: W123456: Merge failed: conflict(s) occurred How would that kind of conflict be permanently resolved? Full log: svnmover> log .@0 .@12 [[[ ------------------------------------------------------------------------ r12 | ... Changed elements: --- diff branch ^.6 at /trunk : ^.6 at /trunk, family 1 D sub (branch ^.6.103) --- deleted branch ^.6.103, family 2, at /trunk/sub ------------------------------------------------------------------------ r11 | ... Changed elements: --- diff branch ^.6 at /trunk : ^.6 at /trunk, family 1 A A (branch ^.6.105) --- added branch ^.6.105, family 2, at /trunk/A ------------------------------------------------------------------------ r10 | ... Changed elements: --- diff branch ^.6 at /trunk : ^.6 at /trunk, family 1 A B (branch ^.6.104) --- added branch ^.6.104, family 2, at /trunk/B ------------------------------------------------------------------------ r9 | ... Changed elements: --- diff branch ^.6 at /trunk : ^.6 at /trunk, family 1 D sub D sub/mail.txt A sub (branch ^.6.103) --- added branch ^.6.103, family 2, at /trunk/sub ------------------------------------------------------------------------ r8 | ... Changed elements: --- diff branch ^.7 at /branches/maint : ^.7 at /branches/maint, family 1 M sub/mail.txt ------------------------------------------------------------------------ r7 | ... Changed elements: --- diff branch ^ at / : ^ at /, family 0 A branches/maint (branch ^.7) --- added branch ^.7, family 1, at /branches/maint ------------------------------------------------------------------------ r6 | ... Changed elements: --- diff branch ^ at / : ^ at /, family 0 D trunk D trunk/sub D trunk/sub/mail.txt A trunk (branch ^.6) --- added branch ^.6, family 1, at /trunk ------------------------------------------------------------------------ r5 | ... Changed elements: --- diff branch ^ at / : ^ at /, family 0 A trunk/sub/mail.txt ------------------------------------------------------------------------ r4 | ... Changed elements: --- diff branch ^ at / : ^ at /, family 0 A trunk/sub ------------------------------------------------------------------------ r3 | ... Changed elements: --- diff branch ^ at / : ^ at /, family 0 A tags ------------------------------------------------------------------------ r2 | ... Changed elements: --- diff branch ^ at / : ^ at /, family 0 A trunk ------------------------------------------------------------------------ r1 | ... Changed elements: --- diff branch ^ at / : ^ at /, family 0 A branches ]]]