From patchwork Fri Dec 15 01:02:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D1697: copies: extract method for getting non-wdir forward copies From: phabricator X-Patchwork-Id: 26293 Message-Id: To: mercurial-devel@mercurial-scm.org Date: Fri, 15 Dec 2017 01:02:04 +0000 martinvonz created this revision. Herald added a subscriber: mercurial-devel. Herald added a reviewer: hg-reviewers. REVISION SUMMARY I may add an alternative way of getting copy metadata (from changelog, not filelog) but the chaining with the dirstate copy metadata will be the same, so it will probably help to have this extracted. Even if that doesn't happen, the next patch will show that we can simplify this a bit after this refactoring, so it seems worth it regardless. REPOSITORY rHG Mercurial REVISION DETAIL https://phab.mercurial-scm.org/D1697 AFFECTED FILES mercurial/copies.py CHANGE DETAILS To: martinvonz, #hg-reviewers Cc: mercurial-devel diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -156,18 +156,8 @@ mb = b.manifest() return mb.filesnotin(ma, match=match) -def _forwardcopies(a, b, match=None): - """find {dst@b: src@a} copy mapping where a is an ancestor of b""" - - # check for working copy - w = None - if b.rev() is None: - w = b - b = w.p1() - if a == b: - # short-circuit to avoid issues with merge states - return _dirstatecopies(w, match) - +def _committedforwardcopies(a, b, match): + """Like _forwardcopies(), but b.rev() cannot be None (working copy)""" # files might have to be traced back to the fctx parent of the last # one-side-only changeset, but not further back than that limit = _findlimit(a._repo, a.rev(), b.rev()) @@ -199,6 +189,21 @@ ofctx = _tracefile(fctx, am, limit) if ofctx: cm[f] = ofctx.path() + return cm + +def _forwardcopies(a, b, match=None): + """find {dst@b: src@a} copy mapping where a is an ancestor of b""" + + # check for working copy + w = None + if b.rev() is None: + w = b + b = w.p1() + if a == b: + # short-circuit to avoid issues with merge states + return _dirstatecopies(w, match) + + cm = _committedforwardcopies(a, b, match) # combine copies from dirstate if necessary if w is not None: