mercurial/cmdutil.py
changeset 22573 f528bfb25b45
parent 22551 8d707da26f9b
child 22588 cd1b43226b34
--- a/mercurial/cmdutil.py	Sun Sep 28 17:21:38 2014 +0900
+++ b/mercurial/cmdutil.py	Fri Sep 19 18:43:53 2014 -0700
@@ -2480,34 +2480,43 @@
         # walk dirstate to fill `names`
 
         m = scmutil.match(repo[None], pats, opts)
-        m.bad = lambda x, y: False
-        for abs in repo.walk(m):
-            names[abs] = m.rel(abs), m.exact(abs)
-
-        # walk target manifest to fill `names`
-
-        def badfn(path, msg):
-            if path in names:
-                return
-            if path in ctx.substate:
-                return
-            path_ = path + '/'
-            for f in names:
-                if f.startswith(path_):
+        if not m.always() or node != parent:
+            m.bad = lambda x, y: False
+            for abs in repo.walk(m):
+                names[abs] = m.rel(abs), m.exact(abs)
+
+            # walk target manifest to fill `names`
+
+            def badfn(path, msg):
+                if path in names:
+                    return
+                if path in ctx.substate:
                     return
-            ui.warn("%s: %s\n" % (m.rel(path), msg))
-
-        m = scmutil.match(ctx, pats, opts)
-        m.bad = badfn
-        for abs in ctx.walk(m):
-            if abs not in names:
-                names[abs] = m.rel(abs), m.exact(abs)
-
-        # Find status of all file in `names`.
-        m = scmutil.matchfiles(repo, names)
-
-        changes = repo.status(node1=node, match=m,
-                              unknown=True, ignored=True, clean=True)
+                path_ = path + '/'
+                for f in names:
+                    if f.startswith(path_):
+                        return
+                ui.warn("%s: %s\n" % (m.rel(path), msg))
+
+            m = scmutil.match(ctx, pats, opts)
+            m.bad = badfn
+            for abs in ctx.walk(m):
+                if abs not in names:
+                    names[abs] = m.rel(abs), m.exact(abs)
+
+            # Find status of all file in `names`.
+            m = scmutil.matchfiles(repo, names)
+
+            changes = repo.status(node1=node, match=m,
+                                  unknown=True, ignored=True, clean=True)
+        else:
+            changes = repo.status(match=m)
+            for kind in changes:
+                for abs in kind:
+                    names[abs] = m.rel(abs), m.exact(abs)
+
+            m = scmutil.matchfiles(repo, names)
+
         modified = set(changes[0])
         added    = set(changes[1])
         removed  = set(changes[2])