diff --git a/mercurial/narrowspec.py b/mercurial/narrowspec.py --- a/mercurial/narrowspec.py +++ b/mercurial/narrowspec.py @@ -270,6 +270,9 @@ mctx=repo['.'], overwrite=False) def checkworkingcopynarrowspec(repo): + # Avoid infinite recursion when updating the working copy + if getattr(repo, '_updatingnarrowspec', False): + return storespec = repo.svfs.tryread(FILENAME) wcspec = repo.vfs.tryread(DIRSTATE_FILENAME) if wcspec != storespec: @@ -284,6 +287,7 @@ """ oldspec = repo.vfs.tryread(DIRSTATE_FILENAME) newspec = repo.svfs.tryread(FILENAME) + repo._updatingnarrowspec = True oldincludes, oldexcludes = parseconfig(repo.ui, oldspec) newincludes, newexcludes = parseconfig(repo.ui, newspec) @@ -313,10 +317,9 @@ for f in clean + trackeddirty: ds.drop(f) - repo.narrowpats = newincludes, newexcludes - repo._narrowmatch = newmatch pctx = repo['.'] newfiles = [f for f in pctx.manifest().walk(addedmatch) if f not in ds] for f in newfiles: ds.normallookup(f) _writeaddedfiles(repo, pctx, newfiles) + repo._updatingnarrowspec = False