Philip yesterday suggested a useful thing would be if I could
demonstrate how a working copy would be able to hold a "working state"
and how merging into the WC and subsequent commit would all work.

The present 'svnmover merge' command calculates a merge result on the
fly and passes it straight through to a commit editor. If there are no
conflicts, it commits the result immediately. (If there are any
conflicts it errors out and forgets everything.)

  svnmover merge SRC[@REV] TGT[@REV] YCA@REV

Actually it doesn't quite operate on three repo states. The third
state, used as the target state onto which it applies the result, is a
transaction (for a commit), and need not be a pristine state from the
repository, it can be modified before (and after) the merge.

[[[
# set up a repo with two branches
$ rm -rf repo && svnadmin create repo && ln -s /bin/true
repo/hooks/pre-revprop-change
$ svnmover -U $REPO  mkbranch B1  mkdir B1/foo  branch B1 B2
A    B1 (branch ^.2)
A    B1/foo
A+   B2 (branch ^.3)
Committed r1:
   --- diff branch ^ at / : ^ at /, family 0
   A   e2  e0/B1 (branch ^.2)
   A   e3  e0/B2 (branch ^.3)
   --- added branch ^.2, family 1, at /B1
   --- added branch ^.3, family 1, at /B2

# make some changes
$ svnmover -U $REPO  mkdir B1/foo/D1  mkdir B2/foo/D2
A    B1/foo/D1
A    B2/foo/D2
Committed r2:
   --- diff branch ^.2 at /B1 : ^.2 at /B1, family 1
   A   e102  e101/D1
   --- diff branch ^.3 at /B2 : ^.3 at /B2, family 1
   A   e103  e101/D2

# merge into a modified transaction
$ svnmover -U $REPO  mv B2/foo B2/bar  merge B1 B2 B1@1
V    B2/bar (from B2/foo)
A    e102 D1
Committed r3:
   --- diff branch ^.3 at /B2 : ^.3 at /B2, family 1
   M r e101  e100/bar from e100/foo
   A   e102  e101/D1

$ svnmover -U $REPO  ls B2/
    e100 .
    e101 bar
    e102 bar/D1
    e103 bar/D2
]]]

I'll have a go at prototyping a WC.

- Julian

Reply via email to