Мерзімдегі патч файлын қалай жасай аламын, ол сондай-ақ құрамындағы subrepo-дың өзгерістерін де қамтиды

Біз сол жобамен бірге жұмыс істейміз және Mercurial компаниясын біздің DVCS ретінде пайдаланады. Біздің жобамызда севераллы субрепо бар. Біз бір-бірімізге почта арқылы патч жіберуге тиіспіз, себебі қазіргі уақытта ол реподан бас тартуға және тартуға болмайды. Экспорттау пәрмені - егер мастерде орындалса, subrepo-ның емес, шебері үшін патч жасайды. Біз адамдарға қолмен жасай аламыз, бірақ мұны жеңілдететін әдіс бар ма?

4
Мені мылқау деп айтуға болады, бірақ: DVCS-ты CVCS ретінде пайдаланасыз? Егер командалық жолдастар пошта жібере алады, онда олар басқа мүшелерден реподан тарта алады. hg барлық адамдар үшін жұмыс істейді
қосылды автор Lazy Badger, көзі

3 жауаптар

Сіз байқағандай, оған ешқандай қолдау жоқ.

Мүмкін сіз жазған кеңейтілген кеңейтімін пайдалана аласыз. Бұл субрепосттар үшін патчтарды жасауды жеңілдетеді:

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

HG_SUBPATH айнымалы мәні subrepo жолымен ауыстырылады.

hg export sub-foo/bar/baz.diff деген жазба атауларын жаза алмайтындықтан, субброды кірістірген жағдайда сәтсіздікке ұшырайды. Сондықтан жолды уқалау және / дегенді - немесе ұқсас түрде ауыстыру қажет. Сіз патчтарды ұқсас hg onsub қоңырауымен импорттай аласыз.

Егер сіз оны жұмыс істесеңіз, онда бұл туралы вики бетіне жазба қосыңыз. Сондай-ақ, сіз онсуб кеңейтімін осы әрекетті жеңілдету үшін кеңейте аласыз ба, мүмкін, жоғары деңгейлі реподан тысқары іске қосу мүмкіндігін қосу арқылы және тікелей өрнектің орнына пайдалануға болатын жаңа айнымалыны HG_SUBPATH .

1
қосылды
Себебі, бізде субрепосттар салынған және мен Python-мен таныс емеспін, мен алдымен басқа шешімдерді іздеуге тура келеді деп ойлаймын. Сондай-ақ, TortoiseHg worbench-тен мұны жасаудың амалын табуға тиіспін, өйткені барлық команда мүшелері пәрмен терезесімен таныс емес (біз терезелерде жұмыс істейміз)
қосылды автор Johan, көзі
  • hg мұрағаты subrepo туралы біледі: өзгертулерді бірыңғай өзгерістерден экспорттай аласыз (және олар subrepos әрекетке әсер еткен жағдайда рекурсивті жүреді)
  • hg diff сондай-ақ subrepos туралы біледі
  • hg commit --subrepos жағдайда Қате барлық жабық файлдарды қамтуы тиіс
0
қосылды
hg мұрағаты мүмкін тек файлдарды экспорттайды, көрсетілген өзгертулерден - THG құсбелгісі, - пәрмен жолында (filelist hg log --template арқылы жиналған болуы мүмкін)
қосылды автор Lazy Badger, көзі
Иә, мұрағат командасы субрепаттар туралы біледі, бірақ бұл файлдармен жұмыс істеудің оңай жолы емес, бұл жұмыс каталогының суреті ғана. Экспорттау пәрмені subrepos туралы білмейді, себебі менің тестілерімде патч файлында тек .hgsubstate файлының айырмасы болады. Бұл түзетуді импорттау subrepos үшін «белгісіз қайта қарау» қателерін береді.
қосылды автор Johan, көзі
Ия, бірақ сол кездегі файлдарды басқа реподағы да жасауға тура келеді. бұл біздің кездесетін уақыттарымыздың кейбір қиындықтарына ие болады, содан кейін репо операцияларын синхрондауға тырысады
қосылды автор Johan, көзі

Мартин ұсынғандай, мен өз кеңейтімді жаздым. Мен бұл кодты осы жерде біреудің жақсартатынына немесе оны сынап көруге болатынына сенімдімін.

Рахмет Мартин, мен сіздің онсобыңыздың кеңейтілуіне негізделген және иә, мен онымен бірнеше қиындық бар екенін білемін, бірақ қазір ол өз мақсатына қызмет етеді. (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
қосылды