含まれているサブペーパからの変更も含まれている、水銀でパッチファイルを作成するにはどうしたらいいですか?

私たちは、同じプロジェクトの一員で、MercurialをDVCSとして使用しています。私たちのプロジェクトはseverall subreposを持っています。 私たちは郵便でお互いにパッチを送る必要があります。なぜなら、現時点では、マスターレポから引き抜くことは不可能であるからです。 エクスポートコマンドは、マスター上で実行された場合にのみ、マスター用のパッチを作成し、サブペ?手作業で作成することもできますが、これを行う簡単な方法があるかどうかを知りたいのですが?

4
追加された
ビュー: 3
よろしくお願いします。なぜDVCSをCVCSとして使うのですか?チームメートがメールを送ることができれば、他のメンバーからレポを引き出すことができます。すべての人にhgサービスを提供
追加された 著者 Lazy Badger,

3 答え

あなたが気付いたように、これに対する組み込みのサポートはありません。

多分私が書いたオンザブ拡張子を使うことができます。これにより、サブレポジトリ用のパッチを生成するのが少し楽になります。

$ hg onsub 'hg export -r tip -o $HG_REPO/sub-$HG_SUBPATH.diff' 

HG_SUBPATH 変数は、サブペクトへのパスに置き換えられます。

hg exportsub-foo/bar/baz.diff というパッチ名を書くことができないので、ネストされたサブレポジトリを持つと失敗します。したがって、パスをマッサージし、/- またはそれに似たものに置き換える必要があります。同様の hg onsub コールでパッチをインポートできるはずです。

あなたがそれを働かせたら、それについてのメモをwikiページに自由に追加してください。 onsub拡張機能を拡張して、これを簡単にすることができますか?トップレベルリポジトリでonsubを実行するオプションと、の代わりに直接使用できる新しい変数> HG_SUBPATH をクリックします。

1
追加された
私たちはサブレポを入れ子にしているので、私はPythonに慣れていないので、私は他のいくつかの解決法を最初に見なければならないと思います。また、私はTortoiseHgのworbenchからこれを行う方法を見つけなければなりません。すべてのチームメンバーがコマンドウィンドウ(Windows上で作業しています)に精通しているわけではないので、
追加された 著者 Johan,
0
追加された
hg archiveは指定されたチェンジセットの影響を受けるファイルのみをエクスポートすることができます - コマンドラインで-Hを指定するとチェックボックスが開きます(ファイルリストはhg log --templateで収集できます)
追加された 著者 Lazy Badger,
はい。アーカイブコマンドはサブレポを知っていますが、ファイルを扱う簡単な方法ではありません。作業ディレクトリのスナップショットです。私のテストでは、パッチファイルに.hgsubstateファイルの違いだけが含まれているので、exportコマンドはサブレポジトリを知らない。このパッチをインポートすると、サブレポの「不明なリビジョン」エラーが発生します。
追加された 著者 Johan,
はい、しかし、私たちはあまりにも他のレポにそれらのファイルをコミットする必要があります。これは、私たちが会ってレポを同期させようとする時に、
追加された 著者 Johan,

マーティンが示唆したように、私は自分自身の拡張を書いた。私はここにコードを掲示します。誰かがそれを改善したり、水銀で利用できるようにすることを願って...

ありがとうマーティン、私はあなたのonsub拡張子に基づいています。はい、私はそれにいくつかの問題があることを知っていますが、今はその目的に役立ちます。 (10サブレポ以上の問題と1レベル以上のネスティングの問題)

"""execute the Bundle command in a repository and each subrepository"""

# bundlesb.py - execute the Bundle command in a repository and each subrepository
#
# Copyright 2012 Johan G.
#
# This software may be used and distributed according to the terms of
# the GNU General Public License version 2 or any later version.

import os
import zipfile
from mercurial.i18n import _
from mercurial import extensions, subrepo, util

def bundlesb(ui, repo, *args, **opts):
    """execute the Bundle command in a repository and each subrepository

    Creates a combined bundle (with hgs extention) for the current 
    repository. 

    Because the revision numbers of the root and the subrepos will differ,
    we cannot reliably choose a revision to start from. A date to start
    from should be nice, but i have not taken the time to implement this.
    Instead i choose to take the N (default=10) last changesets into account.
    This seems to work well in our environment. Instead of providing the
    number of changesets for the operation, you can also specify -a to
    include all changesets. 

    Use --verbose/-v to print information and the subrepo
    name for each subrepo. 
    """
    ui.status("Starting operation\n")
    zipname = os.path.splitext(' '.join(args))[0]
    if (zipname==''):
       zipname = os.path.join(repo.root, os.path.split(repo.root)[1])
       #raise ValueError("FILE cannot be empty")
    zipname= zipname + '.hgs'
    allchangesets=opts.get('all')
    changesets=opts.get('changesets')
    ui.debug(_("input filename=%s ; AllChangesets=%s ; Changesets=%s \n") % (zipname, allchangesets, changesets))
    files=[]

    #work on the root repository
    runcmd(ui, repo.root, files, "0Root", repo['.'].rev(), ".", changesets, allchangesets)

    #do the same for each subrepository
    foreach(ui, repo, files, changesets, allchangesets)

    # open the zip file for writing, and write stuff to it
    ui.status("creating file: " + zipname + "\n\n")

    file = zipfile.ZipFile(zipname, "w" )
    for name in files:
        file.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED)
    file.close()

    # open the file again, to see what's in it

    file = zipfile.ZipFile(zipname, "r")
    for info in file.infolist():
        ui.debug(info.filename + " " + str(info.date_time) + " " + str(info.file_size) + " " + str(info.compress_size) +"\n")
        #delete all the compressed .hg files
    os.remove(os.path.join(repo.root, info.filename)) 

    ui.status("\nOperation complete\n")


def foreach(ui, repo, files, changesets, allchangesets):
    ctx = repo['.']
    work = [(1, ctx.sub(subpath)) for subpath in sorted(ctx.substate)]

    while work:
        (depth, sub) = work.pop(0)

        if hasattr(subrepo, 'relpath'):
            relpath = subrepo.relpath(sub)
        else:
            relpath = subrepo.subrelpath(sub)

        rev=sub._repo[sub._state[1]].rev()

        ui.debug(str(rev) + " " + str(sub._repo[sub._state[1]].user()) + " " + str(sub._repo[sub._state[1]].date()) + "\n")

        if depth>1:
            raise Exception("No support for nested levels deeper than 1 yet.")

    runcmd(ui, repo.root, files, str(depth) + relpath, rev, relpath, changesets, allchangesets)

        if isinstance(sub, subrepo.hgsubrepo):
            rev = sub._state[1]
            ctx = sub._repo[rev]
            w = [(depth + 1, ctx.sub(subpath)) 
                 for subpath in sorted(ctx.substate)]
            work.extend(w)

def runcmd(ui, root, files, name, revision, path, changesets, allchangesets):
    files.append(root + "/" + name + ".hg")
    if (revision<=changesets) or allchangesets:
       cmd="hg bundle -a " + root + "/" + name + ".hg"
    else:
       cmd="hg bundle --base " + str(revision-changesets)+ " "  + root + "/" + name + ".hg"
    ui.note(_("Working on '%s' in %s\n") % (path, root))
    ui.debug( "command line: "+ cmd +"\n")
    util.system(cmd, 
        cwd=os.path.join(root, path),
        onerr=util.Abort,
        errprefix=_('terminated bundlesub in %s') % path)


cmdtable = {
    "bundlesb":
        (bundlesb,
         [('c', 'changesets', 10, _('the number of recent changesets to include in the bundle'), 'N'),
          ('a', 'all', None, _('include all changesets in the bundle')),],
         _('[-c|-a] FILE...'))

}

そして、それ以外のところでは:

 """execute the UnBundle command in a repository and each subrepository
           for a file created with BundleSb"""

# unbundlesub.py - execute the UnBundle command in a repository and each subrepository
#
# Copyright 2012 Johan G.
#
# This software may be used and distributed according to the terms of
# the GNU General Public License version 2 or any later version.

import os
import zipfile
#import glob
from mercurial.i18n import _
from mercurial import extensions, subrepo, util

def unbundlesb(ui, repo, *args, **opts):
    """execute the UnBundle command in a repository and each subrepository
        for a file created with BundleSb

    Updates the current repository from a combined bundle (with hgs extention). 

    Use --verbose/-v to print more detailed information during the operation. 
    """
    ui.status("Starting unbundle operation\n")

    update = opts.get('update')
    file = os.path.splitext(' '.join(args))[0] + '.hgs'
    if (file==''):
       raise ValueError("FILE cannot be empty")

    ui.debug("input filename=" + file + "\n")
    zfile = zipfile.ZipFile(file, "r" )
    for info in zfile.infolist():
        ui.debug(info.filename + " " + str(info.date_time) + " " + str(info.file_size) + " " + str(info.compress_size) +"\n")
    zfile.extract(info,repo.root)
        runcmd(ui, repo.root, info.filename, update)
        #delete all the compressed .hg files
    os.remove(os.path.join(repo.root, info.filename)) 

    zfile.close()

    ui.status("\nOperation complete\n")


def runcmd(ui, root, name, update):
    level=name[0]
    rep=name[1:len(name)-3]
    ui.debug(_("Detected level=%s for repository %s \n") % (level, rep))
    cmd="hg unbundle "
    if (update): cmd= cmd + "-u "
    cmd= cmd + root + "\\" + name 
    ui.note(_("Working on '%s' in %s\n") % (rep, root))
    if (level == '1'):
        wd=os.path.join(root, rep)
    elif (level=='0'):
        wd=root
    else:
       raise Exception("Do not know what to do with a level >1")

    ui.debug(_("command line: %s in working directory %s\n") % (cmd, wd))

    util.system(cmd, 
            cwd=wd,
            onerr=util.Abort,
            errprefix=_('terminated unbundlesub in %s') % rep)


cmdtable = {
    "unbundlesb":
        (unbundlesb,
         [('u', 'update', None,
           _('update to new branch head if changesets were unbundled'))],
         _('[-u] FILE...'))
}
0
追加された