Patchwork [3,of,4] stack: add indexedrevs property to contain a list of stack revs and its base

login
register
mail settings
Submitter Anton Shestakov
Date Sept. 23, 2019, 3:39 a.m.
Message ID <07af98a1e730c1ffa691.1569209991@df1>
Download mbox | patch
Permalink /patch/41730/
State Accepted
Headers show

Comments

Anton Shestakov - Sept. 23, 2019, 3:39 a.m.
# HG changeset patch
# User Anton Shestakov <av6@dwimlabs.net>
# Date 1569139071 -25200
#      Sun Sep 22 14:57:51 2019 +0700
# Node ID 07af98a1e730c1ffa6911c9ab2cdcc06d4ffe52d
# Parent  6430e0ae6d86343980578e36fa26c5e4893170fd
# EXP-Topic stack-object
stack: add indexedrevs property to contain a list of stack revs and its base

Sometimes we need to access a specific stack revision by its index, but
stack.revs doesn't support indexing. Obviously we can just do list(st.revs),
but it's more convenient to have a cached property specifically for this task.

indexedrevs also contains stack base at index 0, so actual stack revisions
start from index 1.
Yuya Nishihara - Sept. 23, 2019, 12:55 p.m.
On Mon, 23 Sep 2019 10:39:51 +0700, Anton Shestakov wrote:
> # HG changeset patch
> # User Anton Shestakov <av6@dwimlabs.net>
> # Date 1569139071 -25200
> #      Sun Sep 22 14:57:51 2019 +0700
> # Node ID 07af98a1e730c1ffa6911c9ab2cdcc06d4ffe52d
> # Parent  6430e0ae6d86343980578e36fa26c5e4893170fd
> # EXP-Topic stack-object
> stack: add indexedrevs property to contain a list of stack revs and its base
> 
> Sometimes we need to access a specific stack revision by its index, but
> stack.revs doesn't support indexing. Obviously we can just do list(st.revs),
> but it's more convenient to have a cached property specifically for this task.
> 
> indexedrevs also contains stack base at index 0, so actual stack revisions
> start from index 1.
> 
> diff --git a/mercurial/stack.py b/mercurial/stack.py
> --- a/mercurial/stack.py
> +++ b/mercurial/stack.py
> @@ -8,6 +8,7 @@
>  from __future__ import absolute_import
>  
>  from . import (
> +    util,
>  )
>  
>  class stack(object):
> @@ -34,3 +35,11 @@ class stack(object):
>          return bool(self.revs)
>  
>      __bool__ = __nonzero__
> +
> +    @util.propertycache
> +    def indexedrevs(self):
> +        if self.revs:
> +            base = self._repo[self.revs.first()].p1()
> +        else:
> +            base = self._repo['.']
> +        return [base.rev()] + list(self.revs)

Better to not cache it? self.revs may be reordered since it is a public
interface, and the indexedrevs could get wrong.

Patch

diff --git a/mercurial/stack.py b/mercurial/stack.py
--- a/mercurial/stack.py
+++ b/mercurial/stack.py
@@ -8,6 +8,7 @@ 
 from __future__ import absolute_import
 
 from . import (
+    util,
 )
 
 class stack(object):
@@ -34,3 +35,11 @@  class stack(object):
         return bool(self.revs)
 
     __bool__ = __nonzero__
+
+    @util.propertycache
+    def indexedrevs(self):
+        if self.revs:
+            base = self._repo[self.revs.first()].p1()
+        else:
+            base = self._repo['.']
+        return [base.rev()] + list(self.revs)