[PATCH 1 of 5] revert: simplify handling of `added` files

Pierre-Yves David pierre-yves.david at ens-lyon.org
Fri Aug 15 16:48:43 UTC 2014


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1407004344 25200
#      Sat Aug 02 11:32:24 2014 -0700
# Node ID 2eb66256ddb71face40ed113a98fd465aa9579da
# Parent  1a4de7e50e27a568b77854e0bbfc894d48a726b0
revert: simplify handling of `added` files

They are multiple possible cases for added files. But its all handled by magic
much lower in the stack. We document them, simplify the codes and move on.

diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -2398,23 +2398,39 @@ def revert(ui, repo, ctx, parents, *pats
         else:
             changes = repo.status(node1=parent, match=m)
             dsmodified = set(changes[0])
             dsadded    = set(changes[1])
             dsremoved  = set(changes[2])
-            dsadded |= _deletedadded
 
             # only take in account for remove that between wc and target.
             clean |= dsremoved - removed
             dsremoved &= removed
             # distinct between dirstate remove and other
             removed -= dsremoved
 
+
             # tell newly modified appart.
             dsmodified &= modified
             dsmodified |= modified & dsadded # dirstate added may needs backup
             modified -= dsmodified
 
+            # there is three categories of added files
+            #
+            # 1. addition, that just happened in the dirstate
+            #    (should be forgetten)
+            # 2. file is added since target revision and have local changes
+            #    (should be backed up and removed)
+            # 3. file is added since target revision and is clean
+            #    (should be removed)
+            #
+            # However we do not need to split them yet. The current revert code
+            # will automatically recognise (1) when performing operation. And
+            # the backup system is currently unabled to handle (2).
+            #
+            # So we just put them all in the same group
+            dsadded = added
+
         # if f is a rename, update `names` to also revert the source
         cwd = repo.getcwd()
         for f in dsadded:
             src = repo.dirstate.copied(f)
             if src and src not in names and repo.dirstate[src] == 'r':
@@ -2428,12 +2444,10 @@ def revert(ui, repo, ctx, parents, *pats
                 return _('forgetting %s\n')
             return _('removing %s\n')
 
         missingmodified = dsmodified - smf
         dsmodified -= missingmodified
-        missingadded = dsadded - smf
-        dsadded -= missingadded
 
         # action to be actually performed by revert
         # (<list of file>, message>) tuple
         actions = {'revert': ([], _('reverting %s\n')),
                    'add': ([], _('adding %s\n')),
@@ -2446,12 +2460,11 @@ def revert(ui, repo, ctx, parents, *pats
             #   action
             #   make backup
             (modified,         (actions['revert'],   False)),
             (dsmodified,       (actions['revert'],   True)),
             (missingmodified,  (actions['remove'],   True)),
-            (dsadded,          (actions['revert'],   True)),
-            (missingadded,     (actions['remove'],   False)),
+            (dsadded,          (actions['remove'],   True)),
             (removed,          (actions['add'],      True)),
             (dsremoved,        (actions['undelete'], True)),
             (clean,            (None,                False)),
             )
 
diff --git a/tests/test-revert.t b/tests/test-revert.t
--- a/tests/test-revert.t
+++ b/tests/test-revert.t
@@ -906,16 +906,10 @@ Test revert --all to "base" content
   $ cp -r revert-ref revert-base-all
   $ cd revert-base-all
 
 check revert output
 
-Misbehavior:
-
-- report "reverting" when file needs no changes
-|
-| - reverting removed_revert
-
   $ hg revert --all --rev 'desc(base)'
   removing added_clean
   removing added_deleted
   removing added_wc
   reverting clean_deleted
@@ -934,11 +928,10 @@ Misbehavior:
   undeleting modified_untracked-wc
   reverting modified_wc
   adding removed_clean
   reverting removed_deleted
   adding removed_removed
-  reverting removed_revert
   adding removed_untracked-clean
   adding removed_untracked-revert
   adding removed_untracked-wc
   reverting removed_wc
 
@@ -1096,16 +1089,10 @@ Test revert to "base" content with expli
   $ cd revert-base-explicit
 
 revert all files individually and check the output
 (output is expected to be different than in the --all case)
 
-Misbehavior:
-
-- fails to report no change to revert for
-|
-| - removed_revert
-
   $ for file in `python ../gen-revert-cases.py filelist`; do
   >   echo '### revert for:' $file;
   >   hg revert $file --rev 'desc(base)';
   >   echo
   > done
@@ -1192,10 +1179,11 @@ Misbehavior:
   ### revert for: removed_deleted
   
   ### revert for: removed_removed
   
   ### revert for: removed_revert
+  no changes needed to removed_revert
   
   ### revert for: removed_untracked-clean
   
   ### revert for: removed_untracked-revert
   


More information about the Mercurial-devel mailing list