diff --git a/hgext/record.py b/hgext/record.py --- a/hgext/record.py +++ b/hgext/record.py @@ -238,44 +238,59 @@ def filterpatch(ui, chunks): else: consumed.append(chunks.pop()) return consumed - resp = None + resp_all = [None] + resp_file = [None] applied = {} + def prompt(query): + if resp_all[0] is not None: + return resp_all[0] + if resp_file[0] is not None: + return resp_file[0] + while True: + r = (ui.prompt(query + _(' [Ynsfdaq?] '), '[Ynsfdaq?]?$', + matchflags=re.I) or 'y').lower() + if r == '?': + c = record.__doc__.find('y - record this change') + for l in record.__doc__[c:].splitlines(): + if l: ui.write(_(l.strip()), '\n') + continue + elif r == 's': + r = resp_file[0] = 'n' + elif r == 'f': + r = resp_file[0] = 'y' + elif r == 'd': + r = resp_all[0] = 'n' + elif r == 'a': + r = resp_all[0] = 'y' + elif r == 'q': + raise util.Abort(_('user quit')) + return r while chunks: chunk = chunks.pop() if isinstance(chunk, header): + resp_file = [None] fixoffset = 0 hdr = ''.join(chunk.header) if hdr in seen: consumefile() continue seen[hdr] = True - if not resp: + if resp_all[0] is None: chunk.pretty(ui) - r = resp or ui.prompt(_('record changes to %s? [y]es [n]o') % - _(' and ').join(map(repr, chunk.files())), - '(?:|[yYnNqQaA])$') or 'y' - if r in 'aA': - r = 'y' - resp = 'y' - if r in 'qQ': - raise util.Abort(_('user quit')) - if r in 'yY': + r = prompt(_('record changes to %s?') % + _(' and ').join(map(repr, chunk.files()))) + if r == 'y': applied[chunk.filename()] = [chunk] if chunk.allhunks(): applied[chunk.filename()] += consumefile() else: consumefile() else: - if not resp: + if resp_file[0] is None and resp_all[0] is None: chunk.pretty(ui) - r = resp or ui.prompt(_('record this change to %r? [y]es [n]o') % - chunk.filename(), '(?:|[yYnNqQaA])$') or 'y' - if r in 'aA': - r = 'y' - resp = 'y' - if r in 'qQ': - raise util.Abort(_('user quit')) - if r in 'yY': + r = prompt(_('record this change to %r?') % + chunk.filename()) + if r == 'y': if fixoffset: chunk = copy.copy(chunk) chunk.toline += fixoffset @@ -286,7 +301,27 @@ def filterpatch(ui, chunks): if h[0].special() or len(h) > 1], []) def record(ui, repo, *pats, **opts): - '''interactively select changes to commit''' + '''interactively select changes to commit + + If a list of files is omitted, all changes reported by "hg status" + will be candidates for recording. + + You will be prompted for whether to record changes to each + modified file, and for files with multiple changes, for each + change to use. For each query, the following responses are + possible: + + y - record this change + n - skip this change + + s - skip remaining changes to this file + f - record remaining changes to this file + + d - done, skip remaining changes and files + a - record all changes to all remaining files + q - quit, recording no changes + + ? - display help''' if not ui.interactive: raise util.Abort(_('running non-interactively, use commit instead'))