910 self.ui.write("No patches applied\n") |
910 self.ui.write("No patches applied\n") |
911 return |
911 return |
912 qp = self.qparents(repo, top) |
912 qp = self.qparents(repo, top) |
913 self.printdiff(repo, qp, files=pats, opts=opts) |
913 self.printdiff(repo, qp, files=pats, opts=opts) |
914 |
914 |
915 def refresh(self, repo, msg='', short=False): |
915 def refresh(self, repo, pats=None, **opts): |
916 if len(self.applied) == 0: |
916 if len(self.applied) == 0: |
917 self.ui.write("No patches applied\n") |
917 self.ui.write("No patches applied\n") |
918 return |
918 return |
919 wlock = repo.wlock() |
919 wlock = repo.wlock() |
920 self.check_toppatch(repo) |
920 self.check_toppatch(repo) |
923 cparents = repo.changelog.parents(top) |
923 cparents = repo.changelog.parents(top) |
924 patchparent = self.qparents(repo, top) |
924 patchparent = self.qparents(repo, top) |
925 message, comments, user, date, patchfound = self.readheaders(patch) |
925 message, comments, user, date, patchfound = self.readheaders(patch) |
926 |
926 |
927 patchf = self.opener(patch, "w") |
927 patchf = self.opener(patch, "w") |
928 msg = msg.rstrip() |
928 msg = opts.get('msg', '').rstrip() |
929 if msg: |
929 if msg: |
930 if comments: |
930 if comments: |
931 # Remove existing message. |
931 # Remove existing message. |
932 ci = 0 |
932 ci = 0 |
933 for mi in range(len(message)): |
933 for mi in range(len(message)): |
937 comments.append(msg) |
937 comments.append(msg) |
938 if comments: |
938 if comments: |
939 comments = "\n".join(comments) + '\n\n' |
939 comments = "\n".join(comments) + '\n\n' |
940 patchf.write(comments) |
940 patchf.write(comments) |
941 |
941 |
|
942 fns, matchfn, anypats = cmdutil.matchpats(repo, pats, opts) |
942 tip = repo.changelog.tip() |
943 tip = repo.changelog.tip() |
943 if top == tip: |
944 if top == tip: |
944 # if the top of our patch queue is also the tip, there is an |
945 # if the top of our patch queue is also the tip, there is an |
945 # optimization here. We update the dirstate in place and strip |
946 # optimization here. We update the dirstate in place and strip |
946 # off the tip commit. Then just commit the current directory |
947 # off the tip commit. Then just commit the current directory |
954 # mm, dd, aa, aa2, uu = repo.status(tip, patchparent)[:5] |
955 # mm, dd, aa, aa2, uu = repo.status(tip, patchparent)[:5] |
955 # but we do it backwards to take advantage of manifest/chlog |
956 # but we do it backwards to take advantage of manifest/chlog |
956 # caching against the next repo.status call |
957 # caching against the next repo.status call |
957 # |
958 # |
958 mm, aa, dd, aa2, uu = repo.status(patchparent, tip)[:5] |
959 mm, aa, dd, aa2, uu = repo.status(patchparent, tip)[:5] |
959 if short: |
960 if opts.get('short'): |
960 filelist = mm + aa + dd |
961 filelist = mm + aa + dd |
961 else: |
962 else: |
962 filelist = None |
963 filelist = None |
963 m, a, r, d, u = repo.status(files=filelist)[:5] |
964 m, a, r, d, u = repo.status(files=filelist)[:5] |
964 |
965 |
990 dd.append(x) |
991 dd.append(x) |
991 |
992 |
992 m = list(util.unique(mm)) |
993 m = list(util.unique(mm)) |
993 r = list(util.unique(dd)) |
994 r = list(util.unique(dd)) |
994 a = list(util.unique(aa)) |
995 a = list(util.unique(aa)) |
995 filelist = list(util.unique(m + r + a)) |
996 filelist = filter(matchfn, util.unique(m + r + a)) |
996 self.printdiff(repo, patchparent, files=filelist, |
997 self.printdiff(repo, patchparent, files=filelist, |
997 changes=(m, a, r, [], u), fp=patchf) |
998 changes=(m, a, r, [], u), fp=patchf) |
998 patchf.close() |
999 patchf.close() |
999 |
1000 |
1000 changes = repo.changelog.read(tip) |
1001 changes = repo.changelog.read(tip) |
1002 copies = [(f, repo.dirstate.copied(f)) for f in a] |
1003 copies = [(f, repo.dirstate.copied(f)) for f in a] |
1003 repo.dirstate.update(a, 'a') |
1004 repo.dirstate.update(a, 'a') |
1004 for dst, src in copies: |
1005 for dst, src in copies: |
1005 repo.dirstate.copy(src, dst) |
1006 repo.dirstate.copy(src, dst) |
1006 repo.dirstate.update(r, 'r') |
1007 repo.dirstate.update(r, 'r') |
|
1008 # if the patch excludes a modified file, mark that file with mtime=0 |
|
1009 # so status can see it. |
|
1010 mm = [] |
|
1011 for i in range(len(m)-1, -1, -1): |
|
1012 if not matchfn(m[i]): |
|
1013 mm.append(m[i]) |
|
1014 del m[i] |
1007 repo.dirstate.update(m, 'n') |
1015 repo.dirstate.update(m, 'n') |
|
1016 repo.dirstate.update(mm, 'n', st_mtime=0) |
1008 repo.dirstate.forget(forget) |
1017 repo.dirstate.forget(forget) |
1009 |
1018 |
1010 if not msg: |
1019 if not msg: |
1011 if not message: |
1020 if not message: |
1012 message = "patch queue: %s\n" % patch |
1021 message = "patch queue: %s\n" % patch |
1421 message = commands.logmessage(opts) |
1430 message = commands.logmessage(opts) |
1422 q.new(repo, patch, msg=message, force=opts['force']) |
1431 q.new(repo, patch, msg=message, force=opts['force']) |
1423 q.save_dirty() |
1432 q.save_dirty() |
1424 return 0 |
1433 return 0 |
1425 |
1434 |
1426 def refresh(ui, repo, **opts): |
1435 def refresh(ui, repo, *pats, **opts): |
1427 """update the current patch""" |
1436 """update the current patch""" |
1428 q = repo.mq |
1437 q = repo.mq |
1429 message = commands.logmessage(opts) |
1438 message = commands.logmessage(opts) |
1430 if opts['edit']: |
1439 if opts['edit']: |
1431 if message: |
1440 if message: |
1432 raise util.Abort(_('option "-e" incompatible with "-m" or "-l"')) |
1441 raise util.Abort(_('option "-e" incompatible with "-m" or "-l"')) |
1433 patch = q.applied[-1].name |
1442 patch = q.applied[-1].name |
1434 (message, comment, user, date, hasdiff) = q.readheaders(patch) |
1443 (message, comment, user, date, hasdiff) = q.readheaders(patch) |
1435 message = ui.edit('\n'.join(message), user or ui.username()) |
1444 message = ui.edit('\n'.join(message), user or ui.username()) |
1436 q.refresh(repo, msg=message, short=opts['short']) |
1445 q.refresh(repo, pats, msg=message, **opts) |
1437 q.save_dirty() |
1446 q.save_dirty() |
1438 return 0 |
1447 return 0 |
1439 |
1448 |
1440 def diff(ui, repo, *pats, **opts): |
1449 def diff(ui, repo, *pats, **opts): |
1441 """diff of the current patch""" |
1450 """diff of the current patch""" |
1940 "^qrefresh": |
1949 "^qrefresh": |
1941 (refresh, |
1950 (refresh, |
1942 [('e', 'edit', None, _('edit commit message')), |
1951 [('e', 'edit', None, _('edit commit message')), |
1943 ('m', 'message', '', _('change commit message with <text>')), |
1952 ('m', 'message', '', _('change commit message with <text>')), |
1944 ('l', 'logfile', '', _('change commit message with <file> content')), |
1953 ('l', 'logfile', '', _('change commit message with <file> content')), |
1945 ('s', 'short', None, 'short refresh')], |
1954 ('s', 'short', None, 'short refresh'), |
1946 'hg qrefresh [-e] [-m TEXT] [-l FILE] [-s]'), |
1955 ('I', 'include', [], _('include names matching the given patterns')), |
|
1956 ('X', 'exclude', [], _('exclude names matching the given patterns'))], |
|
1957 'hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] FILES...'), |
1947 'qrename|qmv': |
1958 'qrename|qmv': |
1948 (rename, [], 'hg qrename PATCH1 [PATCH2]'), |
1959 (rename, [], 'hg qrename PATCH1 [PATCH2]'), |
1949 "qrestore": |
1960 "qrestore": |
1950 (restore, |
1961 (restore, |
1951 [('d', 'delete', None, 'delete save entry'), |
1962 [('d', 'delete', None, 'delete save entry'), |