From 7886016978b4050e376fa985cbc15951cf082270 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 9 Mar 2023 18:08:31 -0600 Subject: [PATCH 01/10] hg2git: set proper default branch So that cfg_master is picked up in get_branch(). Signed-off-by: Felipe Contreras --- hg2git.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hg2git.py b/hg2git.py index e94270b..0c35056 100755 --- a/hg2git.py +++ b/hg2git.py @@ -95,7 +95,7 @@ def get_changeset(ui,repo,revision,authors={},encoding=''): user=user.decode(encoding).encode('utf8') desc=desc.decode(encoding).encode('utf8') tz=b"%+03d%02d" % (-timezone // 3600, ((-timezone % 3600) // 60)) - branch=get_branch(extra.get(b'branch', b'master')) + branch=get_branch(extra.get(b'branch', b'')) return (node,manifest,fixup_user(user,authors),(time,tz),files,desc,branch,extra) def mangle_key(key): From 5e4bc6eb0397fd3a4df9f19fe9ae3e4a74a8a3cd Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 9 Mar 2023 19:04:31 -0600 Subject: [PATCH 02/10] Remove cruft Nothing uses that variable. Signed-off-by: Felipe Contreras --- hg-fast-export.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/hg-fast-export.py b/hg-fast-export.py index bec82ec..97ac6a3 100755 --- a/hg-fast-export.py +++ b/hg-fast-export.py @@ -379,8 +379,6 @@ def export_note(ui,repo,revision,count,authors,encoding,is_first): if repo[revnode].hidden(): return count - parents = [p for p in repo.changelog.parentrevs(revision) if p >= 0] - wr(b'commit refs/notes/hg') wr(b'committer %s %d %s' % (user,time,timezone)) wr(b'data 0') From 432254100b1d31b94a91c851958612eb32101fa8 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 9 Mar 2023 18:13:04 -0600 Subject: [PATCH 03/10] Fetch branch names directly No need to use get_changeset() for just one thing. Signed-off-by: Felipe Contreras --- hg-fast-export.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hg-fast-export.py b/hg-fast-export.py index 97ac6a3..16550a2 100755 --- a/hg-fast-export.py +++ b/hg-fast-export.py @@ -512,7 +512,7 @@ def verify_heads(ui,repo,cache,force,ignore_unnamed_heads,branchesmap): t={} unnamed_heads=False for h in repo.filtered(b'visible').heads(): - (_,_,_,_,_,_,branch,_)=get_changeset(ui,repo,h) + branch=get_branch(repo[h].branch()) if t.get(branch,False): stderr_buffer.write( b'Error: repository has an unnamed head: hg r%d\n' From 4a4d242e9852354ff86b913f07f2efa3d8b642c6 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 9 Mar 2023 18:29:46 -0600 Subject: [PATCH 04/10] Fetch node directly No need to call get_changeset() for that. Signed-off-by: Felipe Contreras --- hg-fast-export.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hg-fast-export.py b/hg-fast-export.py index 16550a2..352ff0d 100755 --- a/hg-fast-export.py +++ b/hg-fast-export.py @@ -561,7 +561,7 @@ def hg2git(repourl,m,marksfile,mappingfile,headsfile,tipfile, max=tip for rev in range(0,max): - (revnode,_,_,_,_,_,_,_)=get_changeset(ui,repo,rev,authors) + revnode=repo[rev].node() if repo[revnode].hidden(): continue mapping_cache[hexlify(revnode)] = b"%d" % rev From 8b1fd408caa72e869d597bc0badebc5d45415df2 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 9 Mar 2023 18:31:02 -0600 Subject: [PATCH 05/10] Use changectx directly There's no need to call repo[revnode] when repo[rev] works perfectly fine. And since we have the context already we can just do ctx.hex() instead of hexlifying ourselves. Signed-off-by: Felipe Contreras --- hg-fast-export.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hg-fast-export.py b/hg-fast-export.py index 352ff0d..505fd05 100755 --- a/hg-fast-export.py +++ b/hg-fast-export.py @@ -561,10 +561,10 @@ def hg2git(repourl,m,marksfile,mappingfile,headsfile,tipfile, max=tip for rev in range(0,max): - revnode=repo[rev].node() - if repo[revnode].hidden(): + ctx=repo[rev] + if ctx.hidden(): continue - mapping_cache[hexlify(revnode)] = b"%d" % rev + mapping_cache[ctx.hex()] = b"%d" % rev if submodule_mappings: # Make sure that all mercurial submodules are registered in the submodule-mappings file From 23f41c0ff15bc3adfe1aa86c677ebd976898fcda Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 9 Mar 2023 18:37:02 -0600 Subject: [PATCH 06/10] Use revision directly instead of revnode We don't need the revnode. Signed-off-by: Felipe Contreras --- hg-fast-export.py | 6 +++--- hg2git.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/hg-fast-export.py b/hg-fast-export.py index 505fd05..696f55a 100755 --- a/hg-fast-export.py +++ b/hg-fast-export.py @@ -297,7 +297,7 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, return n (revnode,_,user,(time,timezone),files,desc,branch,extra)=get_changeset(ui,repo,revision,authors,encoding) - if repo[revnode].hidden(): + if repo[revision].hidden(): return count branch=get_branchname(branch) @@ -344,7 +344,7 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, # later non-merge revision: feed in changed manifest # if we have exactly one parent, just take the changes from the # manifest without expensively comparing checksums - f=repo.status(parents[0],revnode) + f=repo.status(parents[0],revision) added,changed,removed=f.added,f.modified,f.removed type='simple delta' else: # a merge with two parents @@ -376,7 +376,7 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, def export_note(ui,repo,revision,count,authors,encoding,is_first): (revnode,_,user,(time,timezone),_,_,_,_)=get_changeset(ui,repo,revision,authors,encoding) - if repo[revnode].hidden(): + if repo[revision].hidden(): return count wr(b'commit refs/notes/hg') diff --git a/hg2git.py b/hg2git.py index 0c35056..420381c 100755 --- a/hg2git.py +++ b/hg2git.py @@ -90,7 +90,7 @@ def get_changeset(ui,repo,revision,authors={},encoding=''): node=binnode(revsymbol(repo, b"%d" % revision)) # We were given a numeric rev except hgerror.RepoLookupError: node=revision # We got a raw hash - (manifest,user,(time,timezone),files,desc,extra)=repo.changelog.read(node) + (manifest,user,(time,timezone),files,desc,extra)=repo.changelog.read(revision) if encoding: user=user.decode(encoding).encode('utf8') desc=desc.decode(encoding).encode('utf8') From 534d2bdd92a69485355c5fb961b94a8ec2bb5b94 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 9 Mar 2023 18:44:01 -0600 Subject: [PATCH 07/10] Don't deal with the node in get_changeset() It's not necessary. It could be fetched with repo[rev].node(), but why bother? Signed-off-by: Felipe Contreras --- hg-fast-export.py | 4 ++-- hg2git.py | 11 +---------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/hg-fast-export.py b/hg-fast-export.py index 696f55a..7492ab4 100755 --- a/hg-fast-export.py +++ b/hg-fast-export.py @@ -296,7 +296,7 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, brmap[name]=n return n - (revnode,_,user,(time,timezone),files,desc,branch,extra)=get_changeset(ui,repo,revision,authors,encoding) + (_,user,(time,timezone),files,desc,branch,extra)=get_changeset(ui,repo,revision,authors,encoding) if repo[revision].hidden(): return count @@ -375,7 +375,7 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, return checkpoint(count) def export_note(ui,repo,revision,count,authors,encoding,is_first): - (revnode,_,user,(time,timezone),_,_,_,_)=get_changeset(ui,repo,revision,authors,encoding) + (_,user,(time,timezone),_,_,_,_)=get_changeset(ui,repo,revision,authors,encoding) if repo[revision].hidden(): return count diff --git a/hg2git.py b/hg2git.py index 420381c..a7c93dc 100755 --- a/hg2git.py +++ b/hg2git.py @@ -81,22 +81,13 @@ def get_branch(name): return name def get_changeset(ui,repo,revision,authors={},encoding=''): - # Starting with Mercurial 4.6 lookup no longer accepts raw hashes - # for lookups. Work around it by changing our behaviour depending on - # how it fails - try: - node=repo.lookup(revision) - except (TypeError, hgerror.ProgrammingError): - node=binnode(revsymbol(repo, b"%d" % revision)) # We were given a numeric rev - except hgerror.RepoLookupError: - node=revision # We got a raw hash (manifest,user,(time,timezone),files,desc,extra)=repo.changelog.read(revision) if encoding: user=user.decode(encoding).encode('utf8') desc=desc.decode(encoding).encode('utf8') tz=b"%+03d%02d" % (-timezone // 3600, ((-timezone % 3600) // 60)) branch=get_branch(extra.get(b'branch', b'')) - return (node,manifest,fixup_user(user,authors),(time,tz),files,desc,branch,extra) + return (manifest,fixup_user(user,authors),(time,tz),files,desc,branch,extra) def mangle_key(key): return key From e1e15b209190c87daa7f271957a2493ccf89b786 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 9 Mar 2023 19:02:39 -0600 Subject: [PATCH 08/10] Avoid revsymbol() We can just do repo[rev]. Signed-off-by: Felipe Contreras --- hg-fast-export.py | 11 +++++------ hg2git.py | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/hg-fast-export.py b/hg-fast-export.py index 7492ab4..30ce893 100755 --- a/hg-fast-export.py +++ b/hg-fast-export.py @@ -4,7 +4,6 @@ # License: MIT from mercurial import node -from mercurial.scmutil import revsymbol from hg2git import setup_repo,fixup_user,get_branch,get_changeset from hg2git import load_cache,save_cache,get_git_sha1,set_default_branch,set_origin_name from optparse import OptionParser @@ -98,7 +97,7 @@ def get_filechanges(repo,revision,parents,mleft): l,c,r=[],[],[] for p in parents: if p<0: continue - mright=revsymbol(repo,b"%d" %p).manifest() + mright=repo[p].manifest() l,c,r=split_dict(mleft,mright,l,c,r) l.sort() c.sort() @@ -304,7 +303,7 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, parents = [p for p in repo.changelog.parentrevs(revision) if p >= 0] author = get_author(desc,user,authors) - hg_hash=revsymbol(repo,b"%d" % revision).hex() + hg_hash=repo[revision].hex() if plugins and plugins['commit_message_filters']: commit_data = {'branch': branch, 'parents': parents, @@ -329,7 +328,7 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, wr(b'committer %s %d %s' % (user,time,timezone)) wr_data(desc) - ctx=revsymbol(repo, b"%d" % revision) + ctx=repo[revision] man=ctx.manifest() added,changed,removed,type=[],[],[],'' @@ -385,7 +384,7 @@ def export_note(ui,repo,revision,count,authors,encoding,is_first): if is_first: wr(b'from refs/notes/hg^0') wr(b'N inline :%d' % (revision+1)) - hg_hash=revsymbol(repo,b"%d" % revision).hex() + hg_hash=repo[revision].hex() wr_data(hg_hash) wr() return checkpoint(count) @@ -569,7 +568,7 @@ def hg2git(repourl,m,marksfile,mappingfile,headsfile,tipfile, if submodule_mappings: # Make sure that all mercurial submodules are registered in the submodule-mappings file for rev in range(0,max): - ctx=revsymbol(repo,b"%d" % rev) + ctx=repo[rev] if ctx.hidden(): continue if ctx.substate: diff --git a/hg2git.py b/hg2git.py index a7c93dc..74c7205 100755 --- a/hg2git.py +++ b/hg2git.py @@ -5,7 +5,7 @@ from mercurial import hg,util,ui,templatefilters from mercurial import error as hgerror -from mercurial.scmutil import revsymbol,binnode +from mercurial.scmutil import binnode import re import os From fa73d8dec99ddef4c66698b219a7dd49cf0f8b52 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 9 Mar 2023 19:17:57 -0600 Subject: [PATCH 09/10] Share the changectx more It's used everywhere, might as well pass it along. Signed-off-by: Felipe Contreras --- hg-fast-export.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/hg-fast-export.py b/hg-fast-export.py index 30ce893..6005d26 100755 --- a/hg-fast-export.py +++ b/hg-fast-export.py @@ -295,15 +295,17 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, brmap[name]=n return n + ctx=repo[revision] + (_,user,(time,timezone),files,desc,branch,extra)=get_changeset(ui,repo,revision,authors,encoding) - if repo[revision].hidden(): + if ctx.hidden(): return count branch=get_branchname(branch) parents = [p for p in repo.changelog.parentrevs(revision) if p >= 0] author = get_author(desc,user,authors) - hg_hash=repo[revision].hex() + hg_hash=ctx.hex() if plugins and plugins['commit_message_filters']: commit_data = {'branch': branch, 'parents': parents, @@ -328,7 +330,6 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, wr(b'committer %s %d %s' % (user,time,timezone)) wr_data(desc) - ctx=repo[revision] man=ctx.manifest() added,changed,removed,type=[],[],[],'' @@ -374,8 +375,10 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, return checkpoint(count) def export_note(ui,repo,revision,count,authors,encoding,is_first): + ctx = repo[revision] + (_,user,(time,timezone),_,_,_,_)=get_changeset(ui,repo,revision,authors,encoding) - if repo[revision].hidden(): + if ctx.hidden(): return count wr(b'commit refs/notes/hg') @@ -384,7 +387,7 @@ def export_note(ui,repo,revision,count,authors,encoding,is_first): if is_first: wr(b'from refs/notes/hg^0') wr(b'N inline :%d' % (revision+1)) - hg_hash=repo[revision].hex() + hg_hash=ctx.hex() wr_data(hg_hash) wr() return checkpoint(count) From 6fbe4d0ad0ae1a42cef2b200cafadff69cc260ea Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 9 Mar 2023 19:21:04 -0600 Subject: [PATCH 10/10] Skip earlier Now that we have ctx easily available, skip early. Signed-off-by: Felipe Contreras --- hg-fast-export.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hg-fast-export.py b/hg-fast-export.py index 6005d26..0f1726a 100755 --- a/hg-fast-export.py +++ b/hg-fast-export.py @@ -297,10 +297,11 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, ctx=repo[revision] - (_,user,(time,timezone),files,desc,branch,extra)=get_changeset(ui,repo,revision,authors,encoding) if ctx.hidden(): return count + (_,user,(time,timezone),files,desc,branch,extra)=get_changeset(ui,repo,revision,authors,encoding) + branch=get_branchname(branch) parents = [p for p in repo.changelog.parentrevs(revision) if p >= 0] @@ -377,10 +378,11 @@ def export_commit(ui,repo,revision,old_marks,max,count,authors, def export_note(ui,repo,revision,count,authors,encoding,is_first): ctx = repo[revision] - (_,user,(time,timezone),_,_,_,_)=get_changeset(ui,repo,revision,authors,encoding) if ctx.hidden(): return count + (_,user,(time,timezone),_,_,_,_)=get_changeset(ui,repo,revision,authors,encoding) + wr(b'commit refs/notes/hg') wr(b'committer %s %d %s' % (user,time,timezone)) wr(b'data 0')