diff --git a/hgext/phabricator.py b/hgext/phabricator.py --- a/hgext/phabricator.py +++ b/hgext/phabricator.py @@ -57,6 +57,7 @@ exthelper, httpconnection as httpconnectionmod, mdiff, + obsolete, obsutil, parser, patch, @@ -87,7 +88,11 @@ command = eh.command configtable = eh.configtable templatekeyword = eh.templatekeyword +uisetup = eh.finaluisetup +eh.configitem(b'experimental', b'phabricator.fabricate-obsmarkers', + default=False, +) # developer config: phabricator.batchsize eh.configitem(b'phabricator', b'batchsize', default=12, @@ -176,6 +181,52 @@ optionalrepo=optionalrepo)(inner) return decorate +def getmatchingdiff(ctx): + m = _differentialrevisiondescre.search(ctx.description()) + if m: + return b"D%s" % m.group(r'id') + + return None + +@eh.wrapcommand(b"pull") +def _pull(orig, ui, repo, *args, **opts): + if not (obsolete.isenabled(repo, obsolete.createmarkersopt) + and ui.configbool(b'experimental', + b'phabricator.fabricate-obsmarkers')): + return orig(ui, repo, *args, **opts) + maxrevbeforepull = len(repo.changelog) + r = orig(ui, repo, *args, **opts) + maxrevafterpull = len(repo.changelog) + + # Collect the diff number of the landed diffs + landeddiffs = {} + for rev in range(maxrevbeforepull, maxrevafterpull): + n = repo[rev] + if n.phase() == phases.public: + diff = getmatchingdiff(n) + if diff is not None: + landeddiffs[diff] = n + + if not landeddiffs: + return r + + # Try to find match with the drafts + tocreate = [] + unfiltered = repo.unfiltered() + for rev in unfiltered.revs("draft() - obsolete()"): + n = unfiltered[rev] + diff = getmatchingdiff(n) + if diff in landeddiffs and landeddiffs[diff].rev() != n.rev(): + tocreate.append((n, (landeddiffs[diff],))) + + if not tocreate: + return r + + with unfiltered.lock(), unfiltered.transaction('phabpullcreatemarkers'): + obsolete.createmarkers(unfiltered, tocreate) + + return r + def urlencodenested(params): """like urlencode, but works with nested parameters. diff --git a/tests/test-phabricator.t b/tests/test-phabricator.t --- a/tests/test-phabricator.t +++ b/tests/test-phabricator.t @@ -136,7 +136,8 @@ D1253 - skipped - 1acd4b60af38: create comment for phabricator test Phabreading a DREV with a local:commits time as a string: - $ hg phabread --test-vcr "$VCR/phabread-str-time.json" D1285 + $ hg phabread --test-vcr "$VCR/phabread-str-time.json" D1285 > ../d1285.diff + $ cat ../d1285.diff # HG changeset patch # User test # Date 1562019844 0 @@ -153,5 +154,20 @@ @@ * @@ (glob) +test + $ hg init ../simple + $ hg -R ../simple import -q ../d1285.diff + $ hg import --bypass -q ../d1285.diff + $ hg pull -f ../simple --config experimental.evolution.createmarkers=True \ + > --config experimental.phabricator.fabricate-obsmarkers=True + pulling from ../simple + searching for changes + warning: repository is unrelated + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 0 changes to 1 files (+1 heads) + new changesets b68c34204469 + (run 'hg heads' to see heads, 'hg merge' to merge) $ cd ..