Patchwork [01,of,15,V4] bookmarks: add function to centralize the logic to compare bookmarks

login
register
mail settings
Submitter Katsunori FUJIWARA
Date Oct. 15, 2013, 3:25 p.m.
Message ID <95c02d8fbf0264b9d273.1381850723@juju>
Download mbox | patch
Permalink /patch/2772/
State Superseded
Headers show

Comments

Katsunori FUJIWARA - Oct. 15, 2013, 3:25 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1381849966 -32400
#      Wed Oct 16 00:12:46 2013 +0900
# Node ID 95c02d8fbf0264b9d273e13528197769c6c2e898
# Parent  5b327880a660323087ac8ecc1f00db809e38a208
bookmarks: add function to centralize the logic to compare bookmarks

This patch adds "compare()" function to centralize the logic to
compare bookmarks between two repositories.
Augie Fackler - Oct. 16, 2013, 5:03 p.m.
On Wed, Oct 16, 2013 at 12:25:23AM +0900, FUJIWARA Katsunori wrote:
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
> # Date 1381849966 -32400
> #      Wed Oct 16 00:12:46 2013 +0900
> # Node ID 95c02d8fbf0264b9d273e13528197769c6c2e898
> # Parent  5b327880a660323087ac8ecc1f00db809e38a208
> bookmarks: add function to centralize the logic to compare bookmarks
>
> This patch adds "compare()" function to centralize the logic to
> compare bookmarks between two repositories.
>
> diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py
> --- a/mercurial/bookmarks.py
> +++ b/mercurial/bookmarks.py
> @@ -239,6 +239,92 @@
>      finally:
>          w.release()
>
> +def compare(repo, srcmarks, dstmarks,
> +            srchex=None, dsthex=None, targets=None):
> +    '''Compare bookmarks between srcmarks and dstmarks
> +
> +    This returns tuple "(addsrc, adddst, advsrc, advdst, diverge,
> +    differ, invalid)", each are list of bookmarks below:
> +
> +    :addsrc:  added on src side (removed on dst side, perhaps)
> +    :adddst:  added on dst side (removed on src side, perhaps)
> +    :advsrc:  advanced on src side
> +    :advdst:  advanced on dst side
> +    :diverge: diverge
> +    :differ:  changed, but no detail information

I'm unclear how we could ever end up in this state. I think it's
because one of the nodes pointed to by the named bookmark isn't
available locally. Is that correct? If so, I'd like to see it in the
odocstring

> +    :invalid: unknonw on both side

typo

> +
> +    Each elements of lists in result tuple is tuple "(bookmark name,
> +    changeset ID on source side, changeset ID on destination
> +    side)". Each changeset IDs are 40 hexadecimal digit string or
> +    None.
> +
> +    Changeset IDs of tuples in "addsrc", "adddst", "differ" or
> +     "invalid" list may be unknown for repo.
> +
> +    This function expects that "srcmarks" and "dstmarks" return
> +    changeset ID in 40 hexadecimal digit string for specified
> +    bookmark. If not so (e.g. bmstore "repo._bookmarks" returning
> +    binary value), "srchex" or "dsthex" should be specified to convert
> +    into such form.
> +
> +    If "targets" is specified, only bookmarks listed in it are
> +    examined.
> +    '''
> +    if not srchex:
> +        srchex = lambda x: x
> +    if not dsthex:
> +        dsthex = lambda x: x
> +
> +    if targets:
> +        bset = set(targets)
> +    else:
> +        srcmarkset = set(srcmarks)
> +        dstmarkset = set(dstmarks)
> +        bset = srcmarkset ^ dstmarkset
> +        for b in srcmarkset & dstmarkset:
> +            if srchex(srcmarks[b]) != dsthex(dstmarks[b]):
> +                bset.add(b)
> +
> +    results = ([], [], [], [], [], [], [])
> +    addsrc = results[0].append
> +    adddst = results[1].append
> +    advsrc = results[2].append
> +    advdst = results[3].append
> +    diverge = results[4].append
> +    differ = results[5].append
> +    invalid = results[6].append
> +
> +    for b in sorted(bset):
> +        if b not in srcmarks:
> +            if b in dstmarks:
> +                adddst((b, None, dsthex(dstmarks[b])))
> +            else:
> +                invalid((b, None, None))
> +        elif b not in dstmarks:
> +            addsrc((b, srchex(srcmarks[b]), None))
> +        else:
> +            scid = srchex(srcmarks[b])
> +            dcid = dsthex(dstmarks[b])
> +            if scid in repo and dcid in repo:
> +                sctx = repo[scid]
> +                dctx = repo[dcid]
> +                if sctx.rev() < dctx.rev():
> +                    if validdest(repo, sctx, dctx):
> +                        advdst((b, scid, dcid))
> +                    else:
> +                        diverge((b, scid, dcid))
> +                else:
> +                    if validdest(repo, dctx, sctx):
> +                        advsrc((b, scid, dcid))
> +                    else:
> +                        diverge((b, scid, dcid))
> +            else:
> +                # it is too expensive to examine in detail, in this case
> +                differ((b, scid, dcid))
> +
> +    return results
> +
>  def updatefromremote(ui, repo, remotemarks, path):
>      ui.debug("checking for updated bookmarks\n")
>      changed = False
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
Katsunori FUJIWARA - Oct. 17, 2013, 1:09 p.m.
At Wed, 16 Oct 2013 13:03:41 -0400,
Augie Fackler wrote:
> 
> On Wed, Oct 16, 2013 at 12:25:23AM +0900, FUJIWARA Katsunori wrote:
> > # HG changeset patch
> > # User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
> > # Date 1381849966 -32400
> > #      Wed Oct 16 00:12:46 2013 +0900
> > # Node ID 95c02d8fbf0264b9d273e13528197769c6c2e898
> > # Parent  5b327880a660323087ac8ecc1f00db809e38a208
> > bookmarks: add function to centralize the logic to compare bookmarks
> >
> > This patch adds "compare()" function to centralize the logic to
> > compare bookmarks between two repositories.
> >
> > diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py
> > --- a/mercurial/bookmarks.py
> > +++ b/mercurial/bookmarks.py
> > @@ -239,6 +239,92 @@
> >      finally:
> >          w.release()
> >
> > +def compare(repo, srcmarks, dstmarks,
> > +            srchex=None, dsthex=None, targets=None):
> > +    '''Compare bookmarks between srcmarks and dstmarks
> > +
> > +    This returns tuple "(addsrc, adddst, advsrc, advdst, diverge,
> > +    differ, invalid)", each are list of bookmarks below:
> > +
> > +    :addsrc:  added on src side (removed on dst side, perhaps)
> > +    :adddst:  added on dst side (removed on src side, perhaps)
> > +    :advsrc:  advanced on src side
> > +    :advdst:  advanced on dst side
> > +    :diverge: diverge
> > +    :differ:  changed, but no detail information
> 
> I'm unclear how we could ever end up in this state. I think it's
> because one of the nodes pointed to by the named bookmark isn't
> available locally. Is that correct? If so, I'd like to see it in the
> odocstring

Yes, it is correct. I'll re-post revised series also fixing typo
below.

> > +    :invalid: unknonw on both side
> 
> typo
> 
> > +
> > +    Each elements of lists in result tuple is tuple "(bookmark name,
> > +    changeset ID on source side, changeset ID on destination
> > +    side)". Each changeset IDs are 40 hexadecimal digit string or
> > +    None.
> > +
> > +    Changeset IDs of tuples in "addsrc", "adddst", "differ" or
> > +     "invalid" list may be unknown for repo.
> > +
> > +    This function expects that "srcmarks" and "dstmarks" return
> > +    changeset ID in 40 hexadecimal digit string for specified
> > +    bookmark. If not so (e.g. bmstore "repo._bookmarks" returning
> > +    binary value), "srchex" or "dsthex" should be specified to convert
> > +    into such form.
> > +
> > +    If "targets" is specified, only bookmarks listed in it are
> > +    examined.
> > +    '''
> > +    if not srchex:
> > +        srchex = lambda x: x
> > +    if not dsthex:
> > +        dsthex = lambda x: x
> > +
> > +    if targets:
> > +        bset = set(targets)
> > +    else:
> > +        srcmarkset = set(srcmarks)
> > +        dstmarkset = set(dstmarks)
> > +        bset = srcmarkset ^ dstmarkset
> > +        for b in srcmarkset & dstmarkset:
> > +            if srchex(srcmarks[b]) != dsthex(dstmarks[b]):
> > +                bset.add(b)
> > +
> > +    results = ([], [], [], [], [], [], [])
> > +    addsrc = results[0].append
> > +    adddst = results[1].append
> > +    advsrc = results[2].append
> > +    advdst = results[3].append
> > +    diverge = results[4].append
> > +    differ = results[5].append
> > +    invalid = results[6].append
> > +
> > +    for b in sorted(bset):
> > +        if b not in srcmarks:
> > +            if b in dstmarks:
> > +                adddst((b, None, dsthex(dstmarks[b])))
> > +            else:
> > +                invalid((b, None, None))
> > +        elif b not in dstmarks:
> > +            addsrc((b, srchex(srcmarks[b]), None))
> > +        else:
> > +            scid = srchex(srcmarks[b])
> > +            dcid = dsthex(dstmarks[b])
> > +            if scid in repo and dcid in repo:
> > +                sctx = repo[scid]
> > +                dctx = repo[dcid]
> > +                if sctx.rev() < dctx.rev():
> > +                    if validdest(repo, sctx, dctx):
> > +                        advdst((b, scid, dcid))
> > +                    else:
> > +                        diverge((b, scid, dcid))
> > +                else:
> > +                    if validdest(repo, dctx, sctx):
> > +                        advsrc((b, scid, dcid))
> > +                    else:
> > +                        diverge((b, scid, dcid))
> > +            else:
> > +                # it is too expensive to examine in detail, in this case
> > +                differ((b, scid, dcid))
> > +
> > +    return results
> > +
> >  def updatefromremote(ui, repo, remotemarks, path):
> >      ui.debug("checking for updated bookmarks\n")
> >      changed = False
> > _______________________________________________
> > Mercurial-devel mailing list
> > Mercurial-devel@selenic.com
> > http://selenic.com/mailman/listinfo/mercurial-devel
> 

----------------------------------------------------------------------
[FUJIWARA Katsunori]                             foozy@lares.dti.ne.jp

Patch

diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py
--- a/mercurial/bookmarks.py
+++ b/mercurial/bookmarks.py
@@ -239,6 +239,92 @@ 
     finally:
         w.release()
 
+def compare(repo, srcmarks, dstmarks,
+            srchex=None, dsthex=None, targets=None):
+    '''Compare bookmarks between srcmarks and dstmarks
+
+    This returns tuple "(addsrc, adddst, advsrc, advdst, diverge,
+    differ, invalid)", each are list of bookmarks below:
+
+    :addsrc:  added on src side (removed on dst side, perhaps)
+    :adddst:  added on dst side (removed on src side, perhaps)
+    :advsrc:  advanced on src side
+    :advdst:  advanced on dst side
+    :diverge: diverge
+    :differ:  changed, but no detail information
+    :invalid: unknonw on both side
+
+    Each elements of lists in result tuple is tuple "(bookmark name,
+    changeset ID on source side, changeset ID on destination
+    side)". Each changeset IDs are 40 hexadecimal digit string or
+    None.
+
+    Changeset IDs of tuples in "addsrc", "adddst", "differ" or
+     "invalid" list may be unknown for repo.
+
+    This function expects that "srcmarks" and "dstmarks" return
+    changeset ID in 40 hexadecimal digit string for specified
+    bookmark. If not so (e.g. bmstore "repo._bookmarks" returning
+    binary value), "srchex" or "dsthex" should be specified to convert
+    into such form.
+
+    If "targets" is specified, only bookmarks listed in it are
+    examined.
+    '''
+    if not srchex:
+        srchex = lambda x: x
+    if not dsthex:
+        dsthex = lambda x: x
+
+    if targets:
+        bset = set(targets)
+    else:
+        srcmarkset = set(srcmarks)
+        dstmarkset = set(dstmarks)
+        bset = srcmarkset ^ dstmarkset
+        for b in srcmarkset & dstmarkset:
+            if srchex(srcmarks[b]) != dsthex(dstmarks[b]):
+                bset.add(b)
+
+    results = ([], [], [], [], [], [], [])
+    addsrc = results[0].append
+    adddst = results[1].append
+    advsrc = results[2].append
+    advdst = results[3].append
+    diverge = results[4].append
+    differ = results[5].append
+    invalid = results[6].append
+
+    for b in sorted(bset):
+        if b not in srcmarks:
+            if b in dstmarks:
+                adddst((b, None, dsthex(dstmarks[b])))
+            else:
+                invalid((b, None, None))
+        elif b not in dstmarks:
+            addsrc((b, srchex(srcmarks[b]), None))
+        else:
+            scid = srchex(srcmarks[b])
+            dcid = dsthex(dstmarks[b])
+            if scid in repo and dcid in repo:
+                sctx = repo[scid]
+                dctx = repo[dcid]
+                if sctx.rev() < dctx.rev():
+                    if validdest(repo, sctx, dctx):
+                        advdst((b, scid, dcid))
+                    else:
+                        diverge((b, scid, dcid))
+                else:
+                    if validdest(repo, dctx, sctx):
+                        advsrc((b, scid, dcid))
+                    else:
+                        diverge((b, scid, dcid))
+            else:
+                # it is too expensive to examine in detail, in this case
+                differ((b, scid, dcid))
+
+    return results
+
 def updatefromremote(ui, repo, remotemarks, path):
     ui.debug("checking for updated bookmarks\n")
     changed = False