Subject: Re: [PATCH] remote-hg: support for notes

From: Junio C Hamano <[email-masked]>
Date: Thu, 29 Aug 2013 15:12:34 -0700

Felipe Contreras <[email-masked]> writes:

> Signed-off-by: Felipe Contreras <[email-masked]>
> ---

I somehow find this way under-explained to be useful for its users.

Is it clear what "support for notes" means in the context of
remote-hg?  Do we send data stored in our notes when we push back to
Hg?  Does Hg have a mechanism to store additional data out of band,
and we add notes when we pull from Hg?  Or does this "support" do
something else, and if so what does it do?

>  contrib/remote-helpers/git-remote-hg | 32 +++++++++++++++++++++++++++++++-
>  1 file changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg
> index 307d82c..e49fcfa 100755
> --- a/contrib/remote-helpers/git-remote-hg
> +++ b/contrib/remote-helpers/git-remote-hg
> @@ -23,6 +23,7 @@ import subprocess
>  import urllib
>  import atexit
>  import urlparse, hashlib
> +import time as ptime
>  
>  #
>  # If you are not in hg-git-compat mode and want to disable the tracking of
> @@ -126,6 +127,7 @@ class Marks:
>          self.rev_marks = {}
>          self.last_mark = 0
>          self.version = 0
> +        self.last_note = 0
>  
>      def load(self):
>          if not os.path.exists(self.path):
> @@ -137,6 +139,7 @@ class Marks:
>          self.marks = tmp['marks']
>          self.last_mark = tmp['last-mark']
>          self.version = tmp.get('version', 1)
> +        self.last_note = tmp.get('last-note', 0)
>  
>          for rev, mark in self.marks.iteritems():
>              self.rev_marks[mark] = rev
> @@ -150,7 +153,7 @@ class Marks:
>          self.version = 2
>  
>      def dict(self):
> -        return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark, 'version' : self.version }
> +        return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark, 'version' : self.version, 'last-note' : self.last_note }
>  
>      def store(self):
>          json.dump(self.dict(), open(self.path, 'w'))
> @@ -525,6 +528,31 @@ def export_ref(repo, name, kind, head):
>      print "from :%u" % rev_to_mark(head)
>      print
>  
> +    pending_revs = set(revs) - notes
> +    if pending_revs:
> +        note_mark = marks.next_mark()
> +        ref = "refs/notes/hg"
> +
> +        print "commit %s" % ref
> +        print "mark :%d" % (note_mark)
> +        print "committer remote-hg <> %s" % (ptime.strftime('%s %z'))
> +        desc = "Notes for %s\n" % (name)
> +        print "data %d" % (len(desc))
> +        print desc
> +        if marks.last_note:
> +            print "from :%u" % marks.last_note
> +
> +        for rev in pending_revs:
> +            notes.add(rev)
> +            c = repo[rev]
> +            print "N inline :%u" % rev_to_mark(c)
> +            msg = c.hex()
> +            print "data %d" % (len(msg))
> +            print msg
> +        print
> +
> +        marks.last_note = note_mark
> +
>      marks.set_tip(ename, head.hex())
>  
>  def export_tag(repo, tag):
> @@ -1126,6 +1154,7 @@ def main(args):
>      global filenodes
>      global fake_bmark, hg_version
>      global dry_run
> +    global notes, alias
>  
>      alias = args[1]
>      url = args[2]
> @@ -1165,6 +1194,7 @@ def main(args):
>      except:
>          hg_version = None
>      dry_run = False
> +    notes = set()
>  
>      repo = get_repo(url, alias)
>      prefix = 'refs/hg/%s' % alias