# HG changeset patch # User Vadim Gelfer # Date 1154108801 25200 # Node ID c91ca61c8953cca3a63ca532888bf2b9e98218a5 # Parent 532809ba1db5ce9f4d4b532eefde3c7d20b20565 mq: add qclone command diff -r 532809ba1db5 -r c91ca61c8953 hgext/mq.py --- a/hgext/mq.py Fri Jul 28 10:46:25 2006 -0700 +++ b/hgext/mq.py Fri Jul 28 10:46:41 2006 -0700 @@ -38,7 +38,8 @@ repomap = {} -commands.norepo += " qversion" +commands.norepo += " qclone qversion" + class queue: def __init__(self, ui, path, patchdir=None): self.basepath = path @@ -1177,6 +1178,52 @@ r.add(['.hgignore', 'series']) return 0 +def clone(ui, source, dest=None, **opts): + '''clone main and patch repository at same time + + If source is local, destination will have no patches applied. If + source is remote, this command can not check if patches are + applied in source, so cannot guarantee that patches are not + applied in destination. If you clone remote repository, be sure + before that it has no patches applied. + + Source patch repository is looked for in /.hg/patches by + default. Use -p to change. + ''' + ui.setconfig_remoteopts(**opts) + if dest is None: + dest = hg.defaultdest(source) + sr = hg.repository(ui, ui.expandpath(source)) + qbase, destrev = None, None + if sr.local(): + reposetup(ui, sr) + sq = repomap[sr] + if sq.applied: + qbase = revlog.bin(sq.applied[0].split(':')[0]) + if not hg.islocal(dest): + destrev = sr.parents(qbase)[0] + ui.note(_('cloning main repo\n')) + sr, dr = hg.clone(ui, sr, dest, + pull=opts['pull'], + rev=destrev, + update=False, + stream=opts['uncompressed']) + ui.note(_('cloning patch repo\n')) + spr, dpr = hg.clone(ui, opts['patches'] or (sr.url() + '/.hg/patches'), + dr.url() + '/.hg/patches', + pull=opts['pull'], + update=not opts['noupdate'], + stream=opts['uncompressed']) + if dr.local(): + if qbase: + ui.note(_('stripping applied patches from destination repo\n')) + reposetup(ui, dr) + dq = repomap[dr] + dq.strip(dr, qbase, update=False, backup=None) + if not opts['noupdate']: + ui.note(_('updating destination repo\n')) + dr.update(dr.changelog.tip()) + def commit(ui, repo, *pats, **opts): """commit changes in the queue repository""" q = repomap[repo] @@ -1369,6 +1416,16 @@ cmdtable = { "qapplied": (applied, [], 'hg qapplied [PATCH]'), + "qclone": (clone, + [('', 'pull', None, _('use pull protocol to copy metadata')), + ('U', 'noupdate', None, _('do not update the new working directories')), + ('', 'uncompressed', None, + _('use uncompressed transfer (fast over LAN)')), + ('e', 'ssh', '', _('specify ssh command to use')), + ('p', 'patches', '', _('location of source patch repo')), + ('', 'remotecmd', '', + _('specify hg command to run on the remote side'))], + 'hg qclone [OPTION]... SOURCE [DEST]'), "qcommit|qci": (commit, commands.table["^commit|ci"][1],