[PATCH 3 of 3] import: move tryone closure in cmdutil
Augie Fackler
raf at durin42.com
Wed Apr 17 13:56:33 UTC 2013
On Wed, Apr 17, 2013 at 10:57:48AM +0200, pierre-yves.david at logilab.fr wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at logilab.fr>
> # Date 1366188688 -7200
> # Wed Apr 17 10:51:28 2013 +0200
> # Node ID f06a2231a66b162fecb5a3a9a44db2d991dd79f7
> # Parent 66fdcdc7cb399d62bb7bcc4115df3a79c89196e8
> import: move tryone closure in cmdutil
>
Queued first two of these (with English tweaks), need to meditate on this one more.
>
> We extract the `tryone` function into the `cmdutil` module. A lot fo the command
> context have to be passed to the utility function, but having and explicit
> declaration will allow extension to wrap it. This will allows use to make
> changeset evolution related experiment in dedicated extension.
>
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -534,10 +534,125 @@ def service(opts, parentfn=None, initfn=
> os.close(logfilefd)
>
> if runfn:
> return runfn()
>
> +def tryimportone(ui, repo, hunk, parents, opts, msgs, updatefunc):
> + """Utility function used by commands.import to import a single patch
> +
> + This function is explicitly defined here to help the evolve extension to
> + wrap this part of the import logic.
> + """
> + editor = commiteditor
> + if opts.get('edit'):
> + editor = commitforceeditor
> + update = not opts.get('bypass')
> + strip = opts["strip"]
> + sim = float(opts.get('similarity') or 0)
> +
> + tmpname, message, user, date, branch, nodeid, p1, p2 = \
> + patch.extract(ui, hunk)
> +
> + if not tmpname:
> + return (None, None)
> + msg = _('applied to working directory')
> +
> + try:
> + cmdline_message = logmessage(ui, opts)
> + if cmdline_message:
> + # pickup the cmdline msg
> + message = cmdline_message
> + elif message:
> + # pickup the patch msg
> + message = message.strip()
> + else:
> + # launch the editor
> + message = None
> + ui.debug('message:\n%s\n' % message)
> +
> + if len(parents) == 1:
> + parents.append(repo[nullid])
> + if opts.get('exact'):
> + if not nodeid or not p1:
> + raise util.Abort(_('not a Mercurial patch'))
> + p1 = repo[p1]
> + p2 = repo[p2 or nullid]
> + elif p2:
> + try:
> + p1 = repo[p1]
> + p2 = repo[p2]
> + # Without any options, consider p2 only if the
> + # patch is being applied on top of the recorded
> + # first parent.
> + if p1 != parents[0]:
> + p1 = parents[0]
> + p2 = repo[nullid]
> + except error.RepoError:
> + p1, p2 = parents
> + else:
> + p1, p2 = parents
> +
> + n = None
> + if update:
> + if p1 != parents[0]:
> + updatefunc(repo, p1.node())
> + if p2 != parents[1]:
> + repo.setparents(p1.node(), p2.node())
> +
> + if opts.get('exact') or opts.get('import_branch'):
> + repo.dirstate.setbranch(branch or 'default')
> +
> + files = set()
> + patch.patch(ui, repo, tmpname, strip=strip, files=files,
> + eolmode=None, similarity=sim / 100.0)
> + files = list(files)
> + if opts.get('no_commit'):
> + if message:
> + msgs.append(message)
> + else:
> + if opts.get('exact') or p2:
> + # If you got here, you either use --force and know what
> + # you are doing or used --exact or a merge patch while
> + # being updated to its first parent.
> + m = None
> + else:
> + m = scmutil.matchfiles(repo, files or [])
> + n = repo.commit(message, opts.get('user') or user,
> + opts.get('date') or date, match=m,
> + editor=editor)
> + else:
> + if opts.get('exact') or opts.get('import_branch'):
> + branch = branch or 'default'
> + else:
> + branch = p1.branch()
> + store = patch.filestore()
> + try:
> + files = set()
> + try:
> + patch.patchrepo(ui, repo, p1, store, tmpname, strip,
> + files, eolmode=None)
> + except patch.PatchError, e:
> + raise util.Abort(str(e))
> + memctx = patch.makememctx(repo, (p1.node(), p2.node()),
> + message,
> + opts.get('user') or user,
> + opts.get('date') or date,
> + branch, files, store,
> + editor=commiteditor)
> + repo.savecommitmessage(memctx.description())
> + n = memctx.commit()
> + finally:
> + store.close()
> + if opts.get('exact') and hex(n) != nodeid:
> + raise util.Abort(_('patch is damaged or loses information'))
> + if n:
> + # i18n: refers to a short changeset id
> + msg = _('created %s') % short(n)
> + return (msg, n)
> + finally:
> + os.unlink(tmpname)
> +
> def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False,
> opts=None):
> '''export changesets as hg patches.'''
>
> total = len(revs)
> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -3577,14 +3577,10 @@ def import_(ui, repo, patch1=None, *patc
>
> date = opts.get('date')
> if date:
> opts['date'] = util.parsedate(date)
>
> - editor = cmdutil.commiteditor
> - if opts.get('edit'):
> - editor = cmdutil.commitforceeditor
> -
> update = not opts.get('bypass')
> if not update and opts.get('no_commit'):
> raise util.Abort(_('cannot use --no-commit with --bypass'))
> try:
> sim = float(opts.get('similarity') or 0)
> @@ -3597,117 +3593,13 @@ def import_(ui, repo, patch1=None, *patc
>
> if (opts.get('exact') or not opts.get('force')) and update:
> cmdutil.bailifchanged(repo)
>
> base = opts["base"]
> - strip = opts["strip"]
> wlock = lock = tr = None
> msgs = []
>
> - def tryone(ui, hunk, parents):
> - tmpname, message, user, date, branch, nodeid, p1, p2 = \
> - patch.extract(ui, hunk)
> -
> - if not tmpname:
> - return (None, None)
> - msg = _('applied to working directory')
> -
> - try:
> - cmdline_message = cmdutil.logmessage(ui, opts)
> - if cmdline_message:
> - # pickup the cmdline msg
> - message = cmdline_message
> - elif message:
> - # pickup the patch msg
> - message = message.strip()
> - else:
> - # launch the editor
> - message = None
> - ui.debug('message:\n%s\n' % message)
> -
> - if len(parents) == 1:
> - parents.append(repo[nullid])
> - if opts.get('exact'):
> - if not nodeid or not p1:
> - raise util.Abort(_('not a Mercurial patch'))
> - p1 = repo[p1]
> - p2 = repo[p2 or nullid]
> - elif p2:
> - try:
> - p1 = repo[p1]
> - p2 = repo[p2]
> - # Without any options, consider p2 only if the
> - # patch is being applied on top of the recorded
> - # first parent.
> - if p1 != parents[0]:
> - p1 = parents[0]
> - p2 = repo[nullid]
> - except error.RepoError:
> - p1, p2 = parents
> - else:
> - p1, p2 = parents
> -
> - n = None
> - if update:
> - if p1 != parents[0]:
> - hg.clean(repo, p1.node())
> - if p2 != parents[1]:
> - repo.setparents(p1.node(), p2.node())
> -
> - if opts.get('exact') or opts.get('import_branch'):
> - repo.dirstate.setbranch(branch or 'default')
> -
> - files = set()
> - patch.patch(ui, repo, tmpname, strip=strip, files=files,
> - eolmode=None, similarity=sim / 100.0)
> - files = list(files)
> - if opts.get('no_commit'):
> - if message:
> - msgs.append(message)
> - else:
> - if opts.get('exact') or p2:
> - # If you got here, you either use --force and know what
> - # you are doing or used --exact or a merge patch while
> - # being updated to its first parent.
> - m = None
> - else:
> - m = scmutil.matchfiles(repo, files or [])
> - n = repo.commit(message, opts.get('user') or user,
> - opts.get('date') or date, match=m,
> - editor=editor)
> - else:
> - if opts.get('exact') or opts.get('import_branch'):
> - branch = branch or 'default'
> - else:
> - branch = p1.branch()
> - store = patch.filestore()
> - try:
> - files = set()
> - try:
> - patch.patchrepo(ui, repo, p1, store, tmpname, strip,
> - files, eolmode=None)
> - except patch.PatchError, e:
> - raise util.Abort(str(e))
> - memctx = patch.makememctx(repo, (p1.node(), p2.node()),
> - message,
> - opts.get('user') or user,
> - opts.get('date') or date,
> - branch, files, store,
> - editor=cmdutil.commiteditor)
> - repo.savecommitmessage(memctx.description())
> - n = memctx.commit()
> - finally:
> - store.close()
> - if opts.get('exact') and hex(n) != nodeid:
> - raise util.Abort(_('patch is damaged or loses information'))
> - if n:
> - # i18n: refers to a short changeset id
> - msg = _('created %s') % short(n)
> - return (msg, n)
> - finally:
> - os.unlink(tmpname)
> -
> try:
> try:
> wlock = repo.wlock()
> if not opts.get('no_commit'):
> lock = repo.lock()
> @@ -3723,11 +3615,12 @@ def import_(ui, repo, patch1=None, *patc
> ui.status(_('applying %s\n') % patchurl)
> patchfile = hg.openpath(ui, patchurl)
>
> haspatch = False
> for hunk in patch.split(patchfile):
> - (msg, node) = tryone(ui, hunk, parents)
> + (msg, node) = cmdutil.tryimportone(ui, repo, hunk, parents,
> + opts, msgs, hg.clean)
> if msg:
> haspatch = True
> ui.note(msg + '\n')
> if update or opts.get('exact'):
> parents = repo.parents()
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list