Patchwork [2,of,2,RESENT] rewriting: add an option for rewrite commands to use the archived phase

login
register
mail settings
Submitter Boris Feld
Date Feb. 13, 2019, 2:38 p.m.
Message ID <9939d8e412e3e440f3b5.1550068712@Laptop-Boris.lan>
Download mbox | patch
Permalink /patch/38720/
State Accepted
Headers show

Comments

Boris Feld - Feb. 13, 2019, 2:38 p.m.
# HG changeset patch
# User Boris Feld <boris.feld@octobus.net>
# Date 1546394872 -3600
#      Wed Jan 02 03:07:52 2019 +0100
# Node ID 9939d8e412e3e440f3b564fb96c187745d7a008c
# Parent  61ec4a834e2c88056ff47c0d3a7ff3bcb0f0d912
# EXP-Topic archived-phase-UX
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 9939d8e412e3
rewriting: add an option for rewrite commands to use the archived phase

Using the archived phase for cleanup provide the same effect than stripping,
but in a faster, append-only way.

We keep the feature experimental for now until it gets a bit more testing.
Boris FELD - Feb. 21, 2019, 9:17 a.m.
What can we do to make this series go forward?

On 13/02/2019 15:38, Boris Feld wrote:
> # HG changeset patch
> # User Boris Feld <boris.feld@octobus.net>
> # Date 1546394872 -3600
> #      Wed Jan 02 03:07:52 2019 +0100
> # Node ID 9939d8e412e3e440f3b564fb96c187745d7a008c
> # Parent  61ec4a834e2c88056ff47c0d3a7ff3bcb0f0d912
> # EXP-Topic archived-phase-UX
> # Available At https://bitbucket.org/octobus/mercurial-devel/
> #              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 9939d8e412e3
> rewriting: add an option for rewrite commands to use the archived phase
>
> Using the archived phase for cleanup provide the same effect than stripping,
> but in a faster, append-only way.
>
> We keep the feature experimental for now until it gets a bit more testing.
>
> diff --git a/mercurial/configitems.py b/mercurial/configitems.py
> --- a/mercurial/configitems.py
> +++ b/mercurial/configitems.py
> @@ -470,6 +470,9 @@ coreconfigitem('experimental', 'bundleco
>  coreconfigitem('experimental', 'changegroup3',
>      default=False,
>  )
> +coreconfigitem('experimental', 'cleanup-as-archived',
> +    default=False,
> +)
>  coreconfigitem('experimental', 'clientcompressionengines',
>      default=list,
>  )
> diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
> --- a/mercurial/scmutil.py
> +++ b/mercurial/scmutil.py
> @@ -1014,6 +1014,7 @@ def cleanupnodes(repo, replacements, ope
>          for phase, nodes in toadvance.items():
>              phases.advanceboundary(repo, tr, phase, nodes)
>  
> +        mayusearchived = repo.ui.config('experimental', 'cleanup-as-archived')
>          # Obsolete or strip nodes
>          if obsolete.isenabled(repo, obsolete.createmarkersopt):
>              # If a node is already obsoleted, and we want to obsolete it
> @@ -1031,6 +1032,17 @@ def cleanupnodes(repo, replacements, ope
>              if rels:
>                  obsolete.createmarkers(repo, rels, operation=operation,
>                                         metadata=metadata)
> +        elif phases.supportinternal(repo) and mayusearchived:
> +            # this assume we do not have "unstable" nodes above the cleaned ones
> +            allreplaced = set()
> +            for ns in replacements.keys():
> +                allreplaced.update(ns)
> +            if backup:
> +                from . import repair # avoid import cycle
> +                node = min(allreplaced, key=repo.changelog.rev)
> +                repair.backupbundle(repo, allreplaced, allreplaced, node,
> +                                    operation)
> +            phases.retractboundary(repo, tr, phases.archived, allreplaced)
>          else:
>              from . import repair # avoid import cycle
>              tostrip = list(n for ns in replacements for n in ns)
> diff --git a/tests/test-phase-archived.t b/tests/test-phase-archived.t
> --- a/tests/test-phase-archived.t
> +++ b/tests/test-phase-archived.t
> @@ -75,3 +75,69 @@ Test that bundle can unarchive a changes
>       date:        Thu Jan 01 00:00:00 1970 +0000
>       summary:     root
>    
> +
> +Test that history rewriting command can use the archived phase when allowed to
> +------------------------------------------------------------------------------
> +
> +  $ hg up 'desc(unbundletesting)'
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ echo bar >> a
> +  $ hg commit --amend --config experimental.cleanup-as-archived=yes
> +  $ hg log -G
> +  @  changeset:   2:d1e73e428f29
> +  |  tag:         tip
> +  |  parent:      0:c1863a3840c6
> +  |  user:        test
> +  |  date:        Thu Jan 01 00:00:00 1970 +0000
> +  |  summary:     unbundletesting
> +  |
> +  o  changeset:   0:c1863a3840c6
> +     user:        test
> +     date:        Thu Jan 01 00:00:00 1970 +0000
> +     summary:     root
> +  
> +  $ hg log -G --hidden
> +  @  changeset:   2:d1e73e428f29
> +  |  tag:         tip
> +  |  parent:      0:c1863a3840c6
> +  |  user:        test
> +  |  date:        Thu Jan 01 00:00:00 1970 +0000
> +  |  summary:     unbundletesting
> +  |
> +  | o  changeset:   1:883aadbbf309
> +  |/   user:        test
> +  |    date:        Thu Jan 01 00:00:00 1970 +0000
> +  |    summary:     unbundletesting
> +  |
> +  o  changeset:   0:c1863a3840c6
> +     user:        test
> +     date:        Thu Jan 01 00:00:00 1970 +0000
> +     summary:     root
> +  
> +  $ ls -1 .hg/strip-backup/
> +  883aadbbf309-efc55adc-amend.hg
> +  883aadbbf309-efc55adc-backup.hg
> +  $ hg unbundle .hg/strip-backup/883aadbbf309*amend.hg
> +  adding changesets
> +  adding manifests
> +  adding file changes
> +  added 0 changesets with 0 changes to 1 files
> +  (run 'hg update' to get a working copy)
> +  $ hg log -G
> +  @  changeset:   2:d1e73e428f29
> +  |  tag:         tip
> +  |  parent:      0:c1863a3840c6
> +  |  user:        test
> +  |  date:        Thu Jan 01 00:00:00 1970 +0000
> +  |  summary:     unbundletesting
> +  |
> +  | o  changeset:   1:883aadbbf309
> +  |/   user:        test
> +  |    date:        Thu Jan 01 00:00:00 1970 +0000
> +  |    summary:     unbundletesting
> +  |
> +  o  changeset:   0:c1863a3840c6
> +     user:        test
> +     date:        Thu Jan 01 00:00:00 1970 +0000
> +     summary:     root
> +  
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/configitems.py b/mercurial/configitems.py
--- a/mercurial/configitems.py
+++ b/mercurial/configitems.py
@@ -470,6 +470,9 @@  coreconfigitem('experimental', 'bundleco
 coreconfigitem('experimental', 'changegroup3',
     default=False,
 )
+coreconfigitem('experimental', 'cleanup-as-archived',
+    default=False,
+)
 coreconfigitem('experimental', 'clientcompressionengines',
     default=list,
 )
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -1014,6 +1014,7 @@  def cleanupnodes(repo, replacements, ope
         for phase, nodes in toadvance.items():
             phases.advanceboundary(repo, tr, phase, nodes)
 
+        mayusearchived = repo.ui.config('experimental', 'cleanup-as-archived')
         # Obsolete or strip nodes
         if obsolete.isenabled(repo, obsolete.createmarkersopt):
             # If a node is already obsoleted, and we want to obsolete it
@@ -1031,6 +1032,17 @@  def cleanupnodes(repo, replacements, ope
             if rels:
                 obsolete.createmarkers(repo, rels, operation=operation,
                                        metadata=metadata)
+        elif phases.supportinternal(repo) and mayusearchived:
+            # this assume we do not have "unstable" nodes above the cleaned ones
+            allreplaced = set()
+            for ns in replacements.keys():
+                allreplaced.update(ns)
+            if backup:
+                from . import repair # avoid import cycle
+                node = min(allreplaced, key=repo.changelog.rev)
+                repair.backupbundle(repo, allreplaced, allreplaced, node,
+                                    operation)
+            phases.retractboundary(repo, tr, phases.archived, allreplaced)
         else:
             from . import repair # avoid import cycle
             tostrip = list(n for ns in replacements for n in ns)
diff --git a/tests/test-phase-archived.t b/tests/test-phase-archived.t
--- a/tests/test-phase-archived.t
+++ b/tests/test-phase-archived.t
@@ -75,3 +75,69 @@  Test that bundle can unarchive a changes
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     root
   
+
+Test that history rewriting command can use the archived phase when allowed to
+------------------------------------------------------------------------------
+
+  $ hg up 'desc(unbundletesting)'
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ echo bar >> a
+  $ hg commit --amend --config experimental.cleanup-as-archived=yes
+  $ hg log -G
+  @  changeset:   2:d1e73e428f29
+  |  tag:         tip
+  |  parent:      0:c1863a3840c6
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     unbundletesting
+  |
+  o  changeset:   0:c1863a3840c6
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     root
+  
+  $ hg log -G --hidden
+  @  changeset:   2:d1e73e428f29
+  |  tag:         tip
+  |  parent:      0:c1863a3840c6
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     unbundletesting
+  |
+  | o  changeset:   1:883aadbbf309
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     unbundletesting
+  |
+  o  changeset:   0:c1863a3840c6
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     root
+  
+  $ ls -1 .hg/strip-backup/
+  883aadbbf309-efc55adc-amend.hg
+  883aadbbf309-efc55adc-backup.hg
+  $ hg unbundle .hg/strip-backup/883aadbbf309*amend.hg
+  adding changesets
+  adding manifests
+  adding file changes
+  added 0 changesets with 0 changes to 1 files
+  (run 'hg update' to get a working copy)
+  $ hg log -G
+  @  changeset:   2:d1e73e428f29
+  |  tag:         tip
+  |  parent:      0:c1863a3840c6
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     unbundletesting
+  |
+  | o  changeset:   1:883aadbbf309
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     unbundletesting
+  |
+  o  changeset:   0:c1863a3840c6
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     root
+