changeset 3284:d89e98840b08

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
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Thu, 20 Jul 2006 19:25:11 +0200
parents f49c90b46897
children 484e6b7e7062
files mercurial/commands.py tests/test-bundle-r tests/test-bundle-r.out
diffstat 3 files changed, 317 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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