add -r/--rev and --base option to bundle
--rev is used to specify a target rev (like pull or clone)
--base REV is used to specify a base instead of a target repo
the target repo is assumed to have all the rev specified in --base
--- a/mercurial/commands.py Fri Oct 06 17:14:50 2006 -0500
+++ b/mercurial/commands.py Thu Jul 20 19:25:11 2006 +0200
@@ -766,9 +766,12 @@
def bundle(ui, repo, fname, dest=None, **opts):
"""create a changegroup file
- Generate a compressed changegroup file collecting all changesets
+ Generate a compressed changegroup file collecting changesets.
not found in the other repository.
+ If no destination repository is specified the destination is
+ assumed to have all the node specified by --base.
+
This file can then be transferred using conventional means and
applied to another repository with the unbundle command. This is
useful when native push and pull are not available or when
@@ -778,11 +781,34 @@
Unlike import/export, this exactly preserves all changeset
contents including permissions, rename data, and revision history.
"""
- dest = ui.expandpath(dest or 'default-push', dest or 'default')
- setremoteconfig(ui, opts)
- other = hg.repository(ui, dest)
- o = repo.findoutgoing(other, force=opts['force'])
- cg = repo.changegroup(o, 'bundle')
+ revs = opts.get('rev') or None
+ if revs:
+ revs = [repo.lookup(rev) for rev in revs]
+ base = opts.get('base')
+ if base:
+ if dest:
+ raise util.Abort(_("--base is incompatible with specifiying "
+ "a destination"))
+ o = []
+ for n in base:
+ o.extend(repo.changelog.children(repo.lookup(n)))
+ # add common ancestor
+ if revs:
+ all = o + revs
+ else:
+ all = o + repo.changelog.heads()
+ ancestor = reduce(lambda a, b: repo.changelog.ancestor(a, b), all)
+ o.append(ancestor)
+ else:
+ setremoteconfig(ui, opts)
+ dest = ui.expandpath(dest or 'default-push', dest or 'default')
+ other = hg.repository(ui, dest)
+ o = repo.findoutgoing(other, force=opts['force'])
+
+ if revs:
+ cg = repo.changegroupsubset(o, revs, 'bundle')
+ else:
+ cg = repo.changegroup(o, 'bundle')
write_bundle(cg, fname)
def cat(ui, repo, file1, *pats, **opts):
@@ -2789,8 +2815,12 @@
(bundle,
[('f', 'force', None,
_('run even when remote repository is unrelated')),
+ ('r', 'rev', [],
+ _('a changeset you would like to bundle')),
+ ('', 'base', [],
+ _('a base changeset to specify instead of a destination')),
] + remoteopts,
- _('hg bundle FILE DEST')),
+ _('hg bundle [--base REV]... [--rev REV]... FILE [DEST]')),
"cat":
(cat,
[('o', 'output', '', _('print output to file with formatted name')),
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-bundle-r Thu Jul 20 19:25:11 2006 +0200
@@ -0,0 +1,93 @@
+#!/bin/sh
+
+hg init test
+cd test
+cat >>afile <<EOF
+0
+EOF
+hg add afile
+hg commit -m "0.0" -d "1000000 0"
+cat >>afile <<EOF
+1
+EOF
+hg commit -m "0.1" -d "1000000 0"
+cat >>afile <<EOF
+2
+EOF
+hg commit -m "0.2" -d "1000000 0"
+cat >>afile <<EOF
+3
+EOF
+hg commit -m "0.3" -d "1000000 0"
+hg update -C 0
+cat >>afile <<EOF
+1
+EOF
+hg commit -m "1.1" -d "1000000 0"
+cat >>afile <<EOF
+2
+EOF
+hg commit -m "1.2" -d "1000000 0"
+cat >fred <<EOF
+a line
+EOF
+cat >>afile <<EOF
+3
+EOF
+hg add fred
+hg commit -m "1.3" -d "1000000 0"
+hg mv afile adifferentfile
+hg commit -m "1.3m" -d "1000000 0"
+hg update -C 3
+hg mv afile anotherfile
+hg commit -m "0.3m" -d "1000000 0"
+hg debugindex .hg/data/afile.i
+hg debugindex .hg/data/adifferentfile.i
+hg debugindex .hg/data/anotherfile.i
+hg debugindex .hg/data/fred.i
+hg debugindex .hg/00manifest.i
+hg verify
+cd ..
+for i in 0 1 2 3 4 5 6 7 8; do
+ mkdir test-"$i"
+ hg --cwd test-"$i" init
+ hg -R test bundle -r "$i" test-"$i".hg test-"$i"
+ cd test-"$i"
+ hg unbundle ../test-"$i".hg
+ hg verify
+ hg tip -q
+ cd ..
+done
+cd test-8
+hg pull ../test-7
+hg verify
+hg rollback
+cd ..
+
+echo % should fail
+hg -R test bundle --base 2 -r tip test-bundle-branch1.hg test-3
+hg -R test bundle -r tip test-bundle-branch1.hg
+
+hg -R test bundle --base 2 -r tip test-bundle-branch1.hg
+hg -R test bundle --base 2 -r 7 test-bundle-branch2.hg
+hg -R test bundle --base 2 test-bundle-all.hg
+hg -R test bundle --base 3 -r tip test-bundle-should-fail.hg
+cd test-2
+echo % 2
+hg tip -q
+hg unbundle ../test-bundle-should-fail.hg
+echo % 2
+hg tip -q
+hg unbundle ../test-bundle-all.hg
+echo % 8
+hg tip -q
+hg rollback
+echo % 2
+hg tip -q
+hg unbundle ../test-bundle-branch1.hg
+echo % 4
+hg tip -q
+hg unbundle ../test-bundle-branch2.hg
+echo % 8
+hg tip -q
+hg verify
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-bundle-r.out Thu Jul 20 19:25:11 2006 +0200
@@ -0,0 +1,187 @@
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ rev offset length base linkrev nodeid p1 p2
+ 0 0 3 0 0 362fef284ce2 000000000000 000000000000
+ 1 3 5 1 1 125144f7e028 362fef284ce2 000000000000
+ 2 8 7 2 2 4c982badb186 125144f7e028 000000000000
+ 3 15 9 3 3 19b1fc555737 4c982badb186 000000000000
+ rev offset length base linkrev nodeid p1 p2
+ 0 0 75 0 7 905359268f77 000000000000 000000000000
+ rev offset length base linkrev nodeid p1 p2
+ 0 0 75 0 8 905359268f77 000000000000 000000000000
+ rev offset length base linkrev nodeid p1 p2
+ 0 0 8 0 6 12ab3bcc5ea4 000000000000 000000000000
+ rev offset length base linkrev nodeid p1 p2
+ 0 0 48 0 0 43eadb1d2d06 000000000000 000000000000
+ 1 48 48 1 1 8b89697eba2c 43eadb1d2d06 000000000000
+ 2 96 48 2 2 626a32663c2f 8b89697eba2c 000000000000
+ 3 144 48 3 3 f54c32f13478 626a32663c2f 000000000000
+ 4 192 58 3 6 de68e904d169 626a32663c2f 000000000000
+ 5 250 68 3 7 3b45cc2ab868 de68e904d169 000000000000
+ 6 318 54 6 8 24d86153a002 f54c32f13478 000000000000
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+4 files, 9 changesets, 7 total revisions
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files
+(run 'hg update' to get a working copy)
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+1 files, 1 changesets, 1 total revisions
+0:5649c9d34dd8
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 2 changesets with 2 changes to 1 files
+(run 'hg update' to get a working copy)
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+1 files, 2 changesets, 2 total revisions
+1:10b2180f755b
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 3 changesets with 3 changes to 1 files
+(run 'hg update' to get a working copy)
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+1 files, 3 changesets, 3 total revisions
+2:d62976ca1e50
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 4 changesets with 4 changes to 1 files
+(run 'hg update' to get a working copy)
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+1 files, 4 changesets, 4 total revisions
+3:ac69c658229d
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 2 changesets with 2 changes to 1 files
+(run 'hg update' to get a working copy)
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+1 files, 2 changesets, 2 total revisions
+1:5f4f3ceb285e
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 3 changesets with 3 changes to 1 files
+(run 'hg update' to get a working copy)
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+1 files, 3 changesets, 3 total revisions
+2:024e4e7df376
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 4 changesets with 5 changes to 2 files
+(run 'hg update' to get a working copy)
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+2 files, 4 changesets, 5 total revisions
+3:1e3f6b843bd6
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 5 changesets with 6 changes to 3 files
+(run 'hg update' to get a working copy)
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+3 files, 5 changesets, 6 total revisions
+4:80fe151401c2
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 5 changesets with 5 changes to 2 files
+(run 'hg update' to get a working copy)
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+2 files, 5 changesets, 5 total revisions
+4:836ac62537ab
+pulling from ../test-7
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 4 changesets with 2 changes to 3 files (+1 heads)
+(run 'hg heads' to see heads, 'hg merge' to merge)
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+4 files, 9 changesets, 7 total revisions
+rolling back last transaction
+% should fail
+abort: --base is incompatible with specifiying a destination
+abort: repository default-push not found!
+% 2
+2:d62976ca1e50
+adding changesets
+abort: unknown parent ac69c658229d!
+transaction abort!
+rollback completed
+% 2
+2:d62976ca1e50
+adding changesets
+adding manifests
+adding file changes
+added 6 changesets with 4 changes to 4 files (+1 heads)
+(run 'hg heads' to see heads, 'hg merge' to merge)
+% 8
+8:836ac62537ab
+rolling back last transaction
+% 2
+2:d62976ca1e50
+adding changesets
+adding manifests
+adding file changes
+added 2 changesets with 2 changes to 2 files
+(run 'hg update' to get a working copy)
+% 4
+4:836ac62537ab
+adding changesets
+adding manifests
+adding file changes
+added 4 changesets with 2 changes to 3 files (+1 heads)
+(run 'hg heads' to see heads, 'hg merge' to merge)
+% 8
+8:80fe151401c2
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+4 files, 9 changesets, 7 total revisions