# HG changeset patch # User liscju # Date 1454681920 -3600 # Node ID 79139c7a88bd1567ec31f0856b24c3f559aef8d1 # Parent e60e13a86529f6205956a2d04e6f98022b812a82 revert: makes interactive mode ask to forget added files (issue4936) Before this patch revert interactive mode unconditionally forgets added files. This patch fixes this by asking user if he wants to forget added file. If user doesn't want to forget given file, it is added to matcher_opts exclude list, to not reviewing it later with other modified files. diff -r e60e13a86529 -r 79139c7a88bd mercurial/cmdutil.py --- a/mercurial/cmdutil.py Thu Feb 04 15:38:04 2016 -0800 +++ b/mercurial/cmdutil.py Fri Feb 05 15:18:40 2016 +0100 @@ -3130,13 +3130,26 @@ """ parent, p2 = parents node = ctx.node() + excluded_files = [] + matcher_opts = {"exclude": excluded_files} + def checkout(f): fc = ctx[f] repo.wwrite(f, fc.data(), fc.flags()) audit_path = pathutil.pathauditor(repo.root) for f in actions['forget'][0]: - repo.dirstate.drop(f) + if interactive: + choice = \ + repo.ui.promptchoice( + _("forget added file %s (yn)?$$ &Yes $$ &No") + % f) + if choice == 0: + repo.dirstate.drop(f) + else: + excluded_files.append(repo.wjoin(f)) + else: + repo.dirstate.drop(f) for f in actions['remove'][0]: audit_path(f) try: @@ -3162,7 +3175,7 @@ if interactive: # Prompt the user for changes to revert torevert = [repo.wjoin(f) for f in actions['revert'][0]] - m = scmutil.match(ctx, torevert, {}) + m = scmutil.match(ctx, torevert, matcher_opts) diffopts = patch.difffeatureopts(repo.ui, whitespace=True) diffopts.nodates = True diffopts.git = True diff -r e60e13a86529 -r 79139c7a88bd tests/test-revert-interactive.t --- a/tests/test-revert-interactive.t Thu Feb 04 15:38:04 2016 -0800 +++ b/tests/test-revert-interactive.t Fri Feb 05 15:18:40 2016 +0100 @@ -15,6 +15,7 @@ > interactive = true > [extensions] > record = + > purge = > EOF @@ -377,3 +378,26 @@ 5 d +lastline + + $ hg update -C . + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg purge + $ touch newfile + $ hg add newfile + $ hg status + A newfile + $ hg revert -i < n + > EOF + forgetting newfile + forget added file newfile (yn)? n + $ hg status + A newfile + $ hg revert -i < y + > EOF + forgetting newfile + forget added file newfile (yn)? y + $ hg status + ? newfile +