mq: fix qrefresh case sensitivity (
issue3271)
When calling qrefresh with filenames, the filenames were being
treated as case-sensistive on case-insensitive file systems.
So 'qrefresh foo' would not match file 'Foo', and it failed silently.
This fix makes it work correctly on case-insensitive file systems.
Previously the matching function was applied directly to the filenames.
Now we apply the matching function through repo.status, which handles
the case logic for us. A side effect of using repo.status is that
if the qrefresh file doesn't exist, there is output stating it
doesn't exist.
Adds a test to an existing mq refresh case test.
--- a/hgext/mq.py Wed Oct 17 21:30:08 2012 -0700
+++ b/hgext/mq.py Tue Oct 30 13:19:06 2012 -0700
@@ -1575,8 +1575,18 @@
m = list(mm)
r = list(dd)
a = list(aa)
- c = [filter(matchfn, l) for l in (m, a, r)]
- match = scmutil.matchfiles(repo, set(c[0] + c[1] + c[2] + inclsubs))
+
+ # create 'match' that includes the files to be recommited.
+ # apply matchfn via repo.status to ensure correct case handling.
+ cm, ca, cr, cd = repo.status(patchparent, match=matchfn)[:4]
+ allmatches = set(cm + ca + cr + cd)
+ refreshchanges = [x.intersection(allmatches) for x in (mm, aa, dd)]
+
+ files = set(inclsubs)
+ for x in refreshchanges:
+ files.update(x)
+ match = scmutil.matchfiles(repo, files)
+
bmlist = repo[top].bookmarks()
try:
@@ -1656,6 +1666,7 @@
n = newcommit(repo, oldphase, message, user, ph.date,
match=match, force=True)
# only write patch after a successful commit
+ c = [list(x) for x in refreshchanges]
if inclsubs:
self.putsubstate2changes(substatestate, c)
chunks = patchmod.diff(repo, patchparent,
--- a/tests/test-casefolding.t Wed Oct 17 21:30:08 2012 -0700
+++ b/tests/test-casefolding.t Tue Oct 30 13:19:06 2012 -0700
@@ -160,4 +160,15 @@
$ hg status -A
C MiXeDcAsE
+ $ hg qpop -a
+ popping refresh-casechange
+ patch queue now empty
+ $ hg qnew refresh-pattern
+ $ hg status
+ $ echo A > A
+ $ hg add
+ adding A
+ $ hg qrefresh a # issue 3271, qrefresh with file handled case wrong
+ $ hg status # empty status means the qrefresh worked
+
$ cd ..
--- a/tests/test-mq-qrefresh.t Wed Oct 17 21:30:08 2012 -0700
+++ b/tests/test-mq-qrefresh.t Tue Oct 30 13:19:06 2012 -0700
@@ -208,6 +208,7 @@
$ echo 'orphan' > orphanchild
$ hg add orphanchild
$ hg qrefresh nonexistentfilename # clear patch
+ nonexistentfilename: No such file or directory
$ hg qrefresh --short 1/base
$ hg qrefresh --short 2/base