##// END OF EJS Templates
Add preliminary support for the bundle and unbundle commands
mpm@selenic.com -
r1218:cde6818e default
parent child Browse files
Show More
@@ -106,6 +106,21 b' annotate [-r <rev> -u -n -c] [files ...]'
106 106 -c, --changeset list the changeset
107 107 -n, --number list the revision number (default)
108 108
109 bundle <file> <other>::
110 (EXPERIMENTAL)
111
112 Generate a compressed changegroup file collecting all changesets
113 not found in the other repository.
114
115 This file can then be transferred using conventional means and
116 applied to another repository with the unbundle command. This is
117 useful when native push and pull are not available or when
118 exporting an entire repository is undesirable. The standard file
119 extension is ".hg".
120
121 Unlike import/export, this exactly preserves all changeset
122 contents including permissions, rename data, and revision history.
123
109 124 cat <file> [revision]::
110 125 Output to stdout the given revision for the specified file.
111 126
@@ -512,6 +527,12 b' tags::'
512 527 tip::
513 528 Show the tip revision.
514 529
530 unbundle <file>::
531 (EXPERIMENTAL)
532
533 Apply a compressed changegroup file generated by the bundle
534 command.
535
515 536 undo::
516 537 Undo the last commit or pull transaction.
517 538
@@ -7,10 +7,10 b''
7 7
8 8 from demandload import demandload
9 9 from node import *
10 demandload(globals(), "os re sys signal shutil imp")
10 demandload(globals(), "os re sys signal shutil imp urllib")
11 11 demandload(globals(), "fancyopts ui hg util lock revlog")
12 12 demandload(globals(), "fnmatch hgweb mdiff random signal time traceback")
13 demandload(globals(), "errno socket version struct atexit sets")
13 demandload(globals(), "errno socket version struct atexit sets bz2")
14 14
15 15 class UnknownCommand(Exception):
16 16 """Exception raised if command is not in the command table."""
@@ -549,6 +549,26 b' def annotate(ui, repo, *pats, **opts):'
549 549 for p, l in zip(zip(*pieces), lines):
550 550 ui.write("%s: %s" % (" ".join(p), l[1]))
551 551
552 def bundle(ui, repo, fname, dest="default-push", **opts):
553 """create a changegroup file"""
554 f = open(fname, "wb")
555 dest = ui.expandpath(dest)
556 other = hg.repository(ui, dest)
557 o = repo.findoutgoing(other)
558 cg = repo.changegroup(o)
559
560 try:
561 f.write("HG10")
562 z = bz2.BZ2Compressor(9)
563 while 1:
564 chunk = cg.read(4096)
565 if not chunk:
566 break
567 f.write(z.compress(chunk))
568 f.write(z.flush())
569 except:
570 os.unlink(fname)
571
552 572 def cat(ui, repo, file1, rev=None, **opts):
553 573 """output the latest or given revision of a file"""
554 574 r = repo.file(relpath(repo, [file1])[0])
@@ -1534,6 +1554,30 b' def tip(ui, repo):'
1534 1554 n = repo.changelog.tip()
1535 1555 show_changeset(ui, repo, changenode=n)
1536 1556
1557 def unbundle(ui, repo, fname):
1558 f = urllib.urlopen(fname)
1559
1560 if f.read(4) != "HG10":
1561 ui.warn("abort: not a Mercurial bundle file!\n")
1562 return -1
1563
1564 class bzread:
1565 def __init__(self, f):
1566 self.zd = bz2.BZ2Decompressor()
1567 self.f = f
1568 self.buf = ""
1569 def read(self, l):
1570 while l > len(self.buf):
1571 r = self.f.read(4096)
1572 if r:
1573 self.buf += self.zd.decompress(r)
1574 else:
1575 break
1576 d, self.buf = self.buf[:l], self.buf[l:]
1577 return d
1578
1579 repo.addchangegroup(bzread(f))
1580
1537 1581 def undo(ui, repo):
1538 1582 """undo the last commit or pull
1539 1583
@@ -1610,6 +1654,10 b' table = {'
1610 1654 ('I', 'include', [], 'include path in search'),
1611 1655 ('X', 'exclude', [], 'exclude path from search')],
1612 1656 'hg annotate [OPTION]... FILE...'),
1657 "bundle":
1658 (bundle,
1659 [],
1660 'hg bundle FILE DEST'),
1613 1661 "cat":
1614 1662 (cat,
1615 1663 [('o', 'output', "", 'output to file')],
@@ -1776,6 +1824,10 b' table = {'
1776 1824 'hg tag [OPTION]... NAME [REV]'),
1777 1825 "tags": (tags, [], 'hg tags'),
1778 1826 "tip": (tip, [], 'hg tip'),
1827 "unbundle":
1828 (unbundle,
1829 [],
1830 'hg unbundle FILE'),
1779 1831 "undo": (undo, [], 'hg undo'),
1780 1832 "^update|up|checkout|co":
1781 1833 (update,
@@ -604,8 +604,8 b' class revlog:'
604 604 link = linkmapper(cs)
605 605 if node in self.nodemap:
606 606 # this can happen if two branches make the same change
607 if unique:
608 raise RevlogError("already have %s" % hex(node[:4]))
607 # if unique:
608 # raise RevlogError("already have %s" % hex(node[:4]))
609 609 chain = node
610 610 continue
611 611 delta = chunk[80:]
General Comments 0
You need to be logged in to leave comments. Login now