Skip to content
Snippets Groups Projects
Commit 2d82a24d authored by Martin von Zweigbergk's avatar Martin von Zweigbergk
Browse files

narrow: consider both local and remote matchers in narrowchangegroup

The existing code that picked one or the other seemed very
suspicious. This patch makes us intersect the local matcher with the
matcher from the remote, which seems better. It fixes one test case
and makes another one that used to crash no longer crash, but instead
silently succeed with a push that's lossy, so that remains to be
fixed.

The real reason for doing this now is that I'm going to move
narrowrepo.narrowmatch() onto localrepo and then it will always be
defined, which would otherwise break this code.

Differential Revision: https://phab.mercurial-scm.org/D2490
parent a8b4d767
Branches
Tags
No related merge requests found
......@@ -13,6 +13,7 @@
error,
extensions,
manifest,
match as matchmod,
mdiff,
node,
revlog,
......@@ -21,5 +22,13 @@
def setup():
def _cgmatcher(cgpacker):
localmatcher = getattr(cgpacker._repo, 'narrowmatch', lambda: None)()
remotematcher = getattr(cgpacker, '_narrow_matcher', lambda: None)()
if localmatcher and remotematcher:
return matchmod.intersectmatchers(localmatcher, remotematcher)
else:
return localmatcher or remotematcher
def prune(orig, self, revlog, missing, commonrevs):
if isinstance(revlog, manifest.manifestrevlog):
......@@ -24,9 +33,8 @@
def prune(orig, self, revlog, missing, commonrevs):
if isinstance(revlog, manifest.manifestrevlog):
matcher = getattr(self._repo, 'narrowmatch',
getattr(self, '_narrow_matcher', None))
if (matcher is not None and
not matcher().visitdir(revlog._dir[:-1] or '.')):
matcher = _cgmatcher(self)
if (matcher and
not matcher.visitdir(revlog._dir[:-1] or '.')):
return []
return orig(self, revlog, missing, commonrevs)
......@@ -34,11 +42,9 @@
def generatefiles(orig, self, changedfiles, linknodes, commonrevs,
source):
matcher = getattr(self._repo, 'narrowmatch',
getattr(self, '_narrow_matcher', None))
if matcher is not None:
narrowmatch = matcher()
changedfiles = [f for f in changedfiles if narrowmatch(f)]
matcher = _cgmatcher(self)
if matcher:
changedfiles = filter(matcher, changedfiles)
if getattr(self, 'is_shallow', False):
# See comment in generate() for why this sadness is a thing.
mfdicts = self._mfdicts
......
......@@ -137,5 +137,4 @@
$ hg pull ssh://user@dummy/narrow2
pulling from ssh://user@dummy/narrow2
searching for changes
remote: abort: unable to resolve parent while packing 'data/inside2/f.i' 3 for changeset 5 (?)
adding changesets
......@@ -141,9 +140,9 @@
adding changesets
remote: abort: unexpected error: unable to resolve parent while packing 'data/inside2/f.i' 3 for changeset 5
transaction abort!
rollback completed
abort: pull failed on remote
[255]
adding manifests
adding file changes
added 1 changesets with 0 changes to 0 files
new changesets d78a96df731d
(run 'hg update' to get a working copy)
Check that the resulting history is valid in the full repo
......@@ -204,7 +203,7 @@
$ hg push ssh://user@dummy/narrow2
pushing to ssh://user@dummy/narrow2
searching for changes
remote has heads on branch 'default' that are not known locally: d78a96df731d
abort: push creates new remote head 5970befb64ba!
(pull and merge or see 'hg help push' for details about pushing new heads)
[255]
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 0 changes to 0 files
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment