From ed5a70706aa80151d1e5fce6bad614e942e91bb2 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Sat, 1 Jun 2019 16:09:38 -0500 Subject: [PATCH 01/11] Fix getchangegroup() for 4.0 The arguments heads and common have been removed. Signed-off-by: Felipe Contreras --- git-remote-hg | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/git-remote-hg b/git-remote-hg index 55fe01b..7af4b45 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -1075,7 +1075,11 @@ def push_unsafe(repo, remote, parsed_refs, p_revs): if not checkheads(repo, remote, p_revs): return None - if check_version(3, 2): + if check_version(4, 0): + from mercurial import exchange + outgoing = exchange._computeoutgoing(repo, list(p_revs), common) + cg = changegroup.getchangegroup(repo, 'push', outgoing) + elif check_version(3, 2): cg = changegroup.getchangegroup(repo, 'push', heads=list(p_revs), common=common) elif check_version(3, 0): cg = changegroup.getbundle(repo, 'push', heads=list(p_revs), common=common) From e25d3d78cd9f5710ebf639dba63a2c3b003473f7 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Sat, 1 Jun 2019 16:09:55 -0500 Subject: [PATCH 02/11] Use repo.vfs() instead of repo.opener() The method() opener has been a link to vfs() since a long time, and it's now removed in 4.3. Signed-off-by: Felipe Contreras --- git-remote-hg | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/git-remote-hg b/git-remote-hg index 7af4b45..3da9df1 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -1207,7 +1207,11 @@ def do_export(parser): tagnode, branch = write_tag(parser.repo, tag, node, msg, author) p_revs[tagnode] = 'refs/heads/branches/' + gitref(branch) else: - fp = parser.repo.opener('localtags', 'a') + if check_version(2, 4): + vfs = parser.repo.vfs + else: + vfs = parser.repo.opener + fp = vfs('localtags', 'a') fp.write('%s %s\n' % (node, tag)) fp.close() p_revs[bnode] = ref From b3095625743c9d3b4b911725e19de7b38f547a42 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Sat, 1 Jun 2019 23:55:40 -0500 Subject: [PATCH 03/11] Use makechangegroup() Since 4.4 we have yet another way to push revisions. Signed-off-by: Felipe Contreras --- git-remote-hg | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/git-remote-hg b/git-remote-hg index 3da9df1..26d1f6c 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -1078,7 +1078,10 @@ def push_unsafe(repo, remote, parsed_refs, p_revs): if check_version(4, 0): from mercurial import exchange outgoing = exchange._computeoutgoing(repo, list(p_revs), common) - cg = changegroup.getchangegroup(repo, 'push', outgoing) + if check_version(4, 4): + cg = changegroup.makechangegroup(repo, outgoing, '01', 'push') + else: + cg = changegroup.getchangegroup(repo, 'push', outgoing) elif check_version(3, 2): cg = changegroup.getchangegroup(repo, 'push', heads=list(p_revs), common=common) elif check_version(3, 0): From 9b8e0ec2c011a7eb69dddcbf1f19993033aaaea7 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Mon, 3 Jun 2019 16:22:27 -0500 Subject: [PATCH 04/11] Refactor memfilectx() method It's getting hairy. Signed-off-by: Felipe Contreras --- git-remote-hg | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/git-remote-hg b/git-remote-hg index 26d1f6c..3055435 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -771,6 +771,12 @@ def c_style_unescape(string): return string.decode('string-escape')[1:-1] return string +def make_memfilectx(repo, changectx, path, data, islink=False, isexec=False, copied=None): + if check_version(3, 1): + return context.memfilectx(repo, path, data, islink, isexec, copied) + else: + return context.memfilectx(path, data, islink, isexec, copied) + def parse_commit(parser): from_mark = merge_mark = None @@ -831,23 +837,13 @@ def parse_commit(parser): ctx = of['ctx'] is_exec = ctx.isexec() is_link = ctx.islink() - if check_version(3, 1): - return context.memfilectx(repo, f, ctx.data(), - is_link, is_exec) - else: - return context.memfilectx(f, ctx.data(), - is_link, is_exec) + return make_memfilectx(repo, memctx, f, ctx.data(), is_link, is_exec) else: return of['ctx'] is_exec = of['mode'] == 'x' is_link = of['mode'] == 'l' rename = of.get('rename', None) - if check_version(3, 1): - return context.memfilectx(repo, f, of['data'], - is_link, is_exec, rename) - else: - return context.memfilectx(f, of['data'], - is_link, is_exec, rename) + return make_memfilectx(repo, memctx, f, of['data'], is_link, is_exec, rename) repo = parser.repo @@ -956,10 +952,7 @@ def write_tag(repo, tag, node, msg, author): except error.LookupError: data = "" content = data + "%s %s\n" % (node, tag) - if check_version(3, 1): - return context.memfilectx(repo, f, content, False, False, None) - else: - return context.memfilectx(f, content, False, False, None) + return make_memfilectx(repo, memctx, f, content) p1 = tip.hex() p2 = '0' * 40 From 5bf7aad6e327dc2e647bd144065d6b770f022482 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Mon, 3 Jun 2019 16:23:09 -0500 Subject: [PATCH 05/11] Fix memfilectx() params These changed again in 4.5. Signed-off-by: Felipe Contreras --- git-remote-hg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/git-remote-hg b/git-remote-hg index 3055435..56ac41b 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -772,7 +772,9 @@ def c_style_unescape(string): return string def make_memfilectx(repo, changectx, path, data, islink=False, isexec=False, copied=None): - if check_version(3, 1): + if check_version(4, 5): + return context.memfilectx(repo, changectx, path, data, islink, isexec, copied) + elif check_version(3, 1): return context.memfilectx(repo, path, data, islink, isexec, copied) else: return context.memfilectx(path, data, islink, isexec, copied) From 00e95fd8df745db297eab035b31af8a518627bb1 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Sun, 2 Jun 2019 00:01:22 -0500 Subject: [PATCH 06/11] Call node.rev() instead of int(node) The int(node) method has been removed in 4.6. Signed-off-by: Felipe Contreras --- git-remote-hg | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/git-remote-hg b/git-remote-hg index 56ac41b..2a16c37 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -463,9 +463,9 @@ def mark_to_rev(mark): # Get a range of revisions in the form of a..b (git committish) def gitrange(repo, a, b): positive = [] - pending = set([int(b)]) - negative = set([int(a)]) - for cur in xrange(b, -1, -1): + pending = set([b.rev()]) + negative = set([a.rev()]) + for cur in xrange(b.rev(), -1, -1): if not pending: break From a16c69a99ce574933a8fe5408b2520c56850120a Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Mon, 3 Jun 2019 18:14:40 -0500 Subject: [PATCH 07/11] Refactor updatebookmarks() Also, use the proper lock, even for older versions. Signed-off-by: Felipe Contreras --- git-remote-hg | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/git-remote-hg b/git-remote-hg index 2a16c37..ffd9f29 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -370,26 +370,23 @@ def updatebookmarks(repo, peer): if not remotemarks: return - for k, v in remotemarks.iteritems(): - localmarks[k] = hgbin(v) + changes = { k: hgbin(v) for k, v in remotemarks.iteritems() } - if check_version(3, 6): - lock = tr = None - try: - lock = repo.lock() - tr = repo.transaction('bookmark') + wlock = tr = None + try: + wlock = repo.wlock() + tr = repo.transaction('bookmark') + localmarks.update(changes) + if check_version(3, 2): localmarks.recordchange(tr) - tr.close() - finally: - if tr is not None: - tr.release() - if lock is not None: - lock.release() - else: - if hasattr(localmarks, 'write'): + elif check_version(2, 5): localmarks.write() else: bookmarks.write(repo) + tr.close() + finally: + tr.release() + wlock.release() def get_repo(url, alias): global peer From aaef56a2a3238d45c5556d22a00d9d676d27711a Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Mon, 3 Jun 2019 18:16:05 -0500 Subject: [PATCH 08/11] Use marks.applychange() Since 4.3 bookmarks are updated with applychanges() and since 4.6 anything else is deprecated. Signed-off-by: Felipe Contreras --- git-remote-hg | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/git-remote-hg b/git-remote-hg index ffd9f29..7c09a9c 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -376,13 +376,16 @@ def updatebookmarks(repo, peer): try: wlock = repo.wlock() tr = repo.transaction('bookmark') - localmarks.update(changes) - if check_version(3, 2): - localmarks.recordchange(tr) - elif check_version(2, 5): - localmarks.write() + if check_version(4, 3): + localmarks.applychanges(repo, tr, changes.items()) else: - bookmarks.write(repo) + localmarks.update(changes) + if check_version(3, 2): + localmarks.recordchange(tr) + elif check_version(2, 5): + localmarks.write() + else: + bookmarks.write(repo) tr.close() finally: tr.release() From c95fba3c184128599f73c45ca6a3c32e0bd7f87e Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Sun, 2 Jun 2019 00:05:20 -0500 Subject: [PATCH 09/11] Don't call repo[tag] directly Deprecated in 4.6, gone in 4.7. Signed-off-by: Felipe Contreras --- git-remote-hg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/git-remote-hg b/git-remote-hg index 7c09a9c..cd5b321 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -619,7 +619,8 @@ def export_ref(repo, name, kind, head): marks.set_tip(ename, head.hex()) def export_tag(repo, tag): - export_ref(repo, tag, 'tags', repo[hgref(tag)]) + node = repo.tags().get(hgref(tag)) + export_ref(repo, tag, 'tags', repo[node]) def export_bookmark(repo, bmark): head = bmarks[hgref(bmark)] From c8fff2cd061df7f1bc5668523531c9a36b8b3c8c Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Sun, 2 Jun 2019 00:01:56 -0500 Subject: [PATCH 10/11] Use changelog.isancestorrev() The old changelog.descendant() is deprecated in 4.7, gone in 4.8. Signed-off-by: Felipe Contreras --- git-remote-hg | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/git-remote-hg b/git-remote-hg index cd5b321..df81b7c 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -999,7 +999,12 @@ def checkheads_bmark(repo, ref, ctx): print "error %s unknown" % ref return False - if not repo.changelog.descendant(ctx_old.rev(), ctx_new.rev()): + if check_version(4, 7): + isancestorrev = repo.changelog.isancestorrev + else: + isancestorrev = repo.changelog.descendant + + if not isancestorrev(ctx_old.rev(), ctx_new.rev()): if force_push: print "ok %s forced update" % ref else: From 4d337cff0685cfb1940b0c73d8c8ab2f6366fa66 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Mon, 3 Jun 2019 20:20:57 -0500 Subject: [PATCH 11/11] Don't catch all exceptions in export_ref() Just in case. Signed-off-by: Felipe Contreras --- git-remote-hg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-remote-hg b/git-remote-hg index df81b7c..2711771 100755 --- a/git-remote-hg +++ b/git-remote-hg @@ -493,7 +493,7 @@ def export_ref(repo, name, kind, head): try: tip = marks.get_tip(ename) tip = repo[tip] - except: + except (KeyError,error.RepoLookupError): tip = repo[-1] revs = gitrange(repo, tip, head)