[PATCH 01 of 15 V4] bookmarks: add function to centralize the logic to compare bookmarks
Augie Fackler
raf at durin42.com
Wed Oct 16 12:03:41 CDT 2013
On Wed, Oct 16, 2013 at 12:25:23AM +0900, FUJIWARA Katsunori wrote:
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy at 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 at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list