# HG changeset patch # User Matt Mackall # Date 1329953793 21600 # Node ID a01d2fb5ba65a88598367c78b0d284478bf98888 # Parent 0424f3c7d7ace8597b2fffc70f1795b2d9243718# Parent 616c2e278f18984dc48b80bc56b55da626130709 merge with stable diff -r 0424f3c7d7ac -r a01d2fb5ba65 hgext/largefiles/reposetup.py --- a/hgext/largefiles/reposetup.py Wed Feb 22 12:30:15 2012 +0100 +++ b/hgext/largefiles/reposetup.py Wed Feb 22 17:36:33 2012 -0600 @@ -63,13 +63,21 @@ return man1 def filectx(self, path, fileid=None, filelog=None): try: - result = super(lfiles_ctx, self).filectx(path, - fileid, filelog) + if filelog is not None: + result = super(lfiles_ctx, self).filectx( + path, fileid, filelog) + else: + result = super(lfiles_ctx, self).filectx( + path, fileid) except error.LookupError: # Adding a null character will cause Mercurial to # identify this as a binary file. - result = super(lfiles_ctx, self).filectx( - lfutil.standin(path), fileid, filelog) + if filelog is not None: + result = super(lfiles_ctx, self).filectx( + lfutil.standin(path), fileid, filelog) + else: + result = super(lfiles_ctx, self).filectx( + lfutil.standin(path), fileid) olddata = result.data result.data = lambda: olddata() + '\0' return result diff -r 0424f3c7d7ac -r a01d2fb5ba65 mercurial/context.py --- a/mercurial/context.py Wed Feb 22 12:30:15 2012 +0100 +++ b/mercurial/context.py Wed Feb 22 17:36:33 2012 -0600 @@ -206,14 +206,15 @@ # follow that here, too fset.discard('.') for fn in self: - for ffn in fset: - # match if the file is the exact name or a directory - if ffn == fn or fn.startswith("%s/" % ffn): - fset.remove(ffn) - break + if fn in fset: + # specified pattern is the exact name + fset.remove(fn) if match(fn): yield fn for fn in sorted(fset): + if fn in self._dirs: + # specified pattern is a directory + continue if match.bad(fn, _('no such file in rev %s') % self) and match(fn): yield fn @@ -236,6 +237,22 @@ return patch.diff(self._repo, ctx2.node(), self.node(), match=match, opts=diffopts) + @propertycache + def _dirs(self): + dirs = set() + for f in self._manifest: + pos = f.rfind('/') + while pos != -1: + f = f[:pos] + if f in dirs: + break # dirs already contains this and above + dirs.add(f) + pos = f.rfind('/') + return dirs + + def dirs(self): + return self._dirs + class filectx(object): """A filecontext object makes access to data related to a particular filerevision convenient.""" @@ -949,6 +966,9 @@ finally: wlock.release() + def dirs(self): + return self._repo.dirstate.dirs() + class workingfilectx(filectx): """A workingfilectx object makes access to data related to a particular file in the working directory convenient.""" diff -r 0424f3c7d7ac -r a01d2fb5ba65 mercurial/dirstate.py --- a/mercurial/dirstate.py Wed Feb 22 12:30:15 2012 +0100 +++ b/mercurial/dirstate.py Wed Feb 22 17:36:33 2012 -0600 @@ -110,6 +110,9 @@ _incdirs(dirs, f) return dirs + def dirs(self): + return self._dirs + @propertycache def _ignore(self): files = [self._join('.hgignore')] diff -r 0424f3c7d7ac -r a01d2fb5ba65 mercurial/localrepo.py --- a/mercurial/localrepo.py Wed Feb 22 12:30:15 2012 +0100 +++ b/mercurial/localrepo.py Wed Feb 22 17:36:33 2012 -0600 @@ -1371,7 +1371,9 @@ if not parentworking: def bad(f, msg): - if f not in ctx1: + # 'f' may be a directory pattern from 'match.files()', + # so 'f not in ctx1' is not enough + if f not in ctx1 and f not in ctx1.dirs(): self.ui.warn('%s: %s\n' % (self.dirstate.pathto(f), msg)) match.bad = bad diff -r 0424f3c7d7ac -r a01d2fb5ba65 tests/test-largefiles.t --- a/tests/test-largefiles.t Wed Feb 22 12:30:15 2012 +0100 +++ b/tests/test-largefiles.t Wed Feb 22 17:36:33 2012 -0600 @@ -994,4 +994,14 @@ C a/b/c/d/e.normal.txt C a/b/c/x/y.normal.txt +verify that largefiles doesn't break filesets + + $ hg log --rev . --exclude "set:binary()" + changeset: 0:41bd42f10efa + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add files + + $ cd .. diff -r 0424f3c7d7ac -r a01d2fb5ba65 tests/test-status.t --- a/tests/test-status.t Wed Feb 22 12:30:15 2012 +0100 +++ b/tests/test-status.t Wed Feb 22 17:36:33 2012 -0600 @@ -295,3 +295,39 @@ $ hg ci -q -A -m 'add another file' $ hg status -A --rev 1:2 010a C 010a + + $ cd .. + +test "hg status" with "directory pattern" which matches against files +only known on target revision. + + $ hg init repo6 + $ cd repo6 + + $ echo a > a.txt + $ hg add a.txt + $ hg commit -m '#0' + $ mkdir -p 1/2/3/4/5 + $ echo b > 1/2/3/4/5/b.txt + $ hg add 1/2/3/4/5/b.txt + $ hg commit -m '#1' + + $ hg update -C 0 > /dev/null + $ hg status -A + C a.txt + +the directory matching against specified pattern should be removed, +because directory existence prevents 'dirstate.walk()' from showing +warning message about such pattern. + + $ test ! -d 1 + $ hg status -A --rev 1 1/2/3/4/5/b.txt + R 1/2/3/4/5/b.txt + $ hg status -A --rev 1 1/2/3/4/5 + R 1/2/3/4/5/b.txt + $ hg status -A --rev 1 1/2/3 + R 1/2/3/4/5/b.txt + $ hg status -A --rev 1 1 + R 1/2/3/4/5/b.txt + + $ cd ..