diff -r cc3d9f776632 -r f528bfb25b45 mercurial/cmdutil.py --- 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])