# HG changeset patch # User Pierre-Yves David # Date 1444150284 25200 # Node ID 1f14920a892c99183b36458a329ebb30d1e99a2d # Parent 75d448d56a9de06187c75b6b65ce3384f5abda94 import: allow processing of extra part header during import As we have a way for extension to add more header, we need a way for them to actually process them. We add a basic hook points to alter the changeset (especially extra) before we commit. There would be more to do for a full featured hooking, but this currently fit my needs. diff -r 75d448d56a9d -r 1f14920a892c mercurial/cmdutil.py --- a/mercurial/cmdutil.py Tue Oct 06 02:23:21 2015 -0700 +++ b/mercurial/cmdutil.py Tue Oct 06 09:51:24 2015 -0700 @@ -831,6 +831,22 @@ if runfn: return runfn() +## facility to let extension process additional data into an import patch +# list of identifier to be executed in order +extrapreimport = [] # run before commit +# mapping from identifier to actual import function +# +# 'preimport' are run before the commit is made and are provided the following +# arguments: +# - repo: the localrepository instance, +# - patchdata: data extracted from patch header (cf m.patch.patchheadermap), +# - extra: the future extra dictionnary of the changeset, please mutate it, +# - opts: the import options. +# XXX ideally, we would just pass an ctx ready to be computed, that would allow +# mutation of in memory commit and more. Feel free to rework the code to get +# there. +extrapreimportmap = {} + def tryimportone(ui, repo, hunk, parents, opts, msgs, updatefunc): """Utility function used by commands.import to import a single patch @@ -949,12 +965,15 @@ else: editor = getcommiteditor(editform=editform, **opts) allowemptyback = repo.ui.backupconfig('ui', 'allowemptycommit') + extra = {} + for idfunc in extrapreimport: + extrapreimportmap[idfunc](repo, extractdata, extra, opts) try: if partial: repo.ui.setconfig('ui', 'allowemptycommit', True) n = repo.commit(message, opts.get('user') or user, opts.get('date') or date, match=m, - editor=editor) + editor=editor, extra=extra) finally: repo.ui.restoreconfig(allowemptyback) dsguard.close() diff -r 75d448d56a9d -r 1f14920a892c tests/test-import.t --- a/tests/test-import.t Tue Oct 06 02:23:21 2015 -0700 +++ b/tests/test-import.t Tue Oct 06 09:51:24 2015 -0700 @@ -1505,3 +1505,43 @@ $ hg status -c . C a C b + +Importing some extra header +=========================== + + $ cat > $TESTTMP/parseextra.py < import mercurial.patch + > import mercurial.cmdutil + > + > def processfoo(repo, data, extra, opts): + > if 'foo' in data: + > extra['foo'] = data['foo'] + > + > mercurial.patch.patchheadermap.append(('Foo', 'foo')) + > mercurial.cmdutil.extrapreimport.append('foo') + > mercurial.cmdutil.extrapreimportmap['foo'] = processfoo + > EOF + $ printf "[extensions]\nparseextra=$TESTTMP/parseextra.py" >> $HGRCPATH + $ hg up -C tip + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cat > $TESTTMP/foo.patch < # HG changeset patch + > # User Rataxes + > # Date 0 0 + > # Thu Jan 01 00:00:00 1970 +0000 + > # Foo bar + > height + > + > --- a/a Thu Jan 01 00:00:00 1970 +0000 + > +++ b/a Wed Oct 07 09:17:44 2015 +0000 + > @@ -5,3 +5,4 @@ + > five + > six + > seven + > +heigt + > EOF + $ hg import $TESTTMP/foo.patch + applying $TESTTMP/foo.patch + $ hg log --debug -r . | grep extra + extra: branch=default + extra: foo=bar