remote-hg: implement custom checkheads()

The version from Mercurial is extremely inefficient and convoluted, this
version achieves basically the same, at least for our purposes.

No functional changes.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Felipe Contreras
2013-05-24 21:29:50 -05:00
committed by Junio C Hamano
parent 4f37bdbdb6
commit 19a8cefc44

View File

@ -12,7 +12,7 @@
# For remote repositories a local clone is stored in # For remote repositories a local clone is stored in
# "$GIT_DIR/hg/origin/clone/.hg/". # "$GIT_DIR/hg/origin/clone/.hg/".
from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions, discovery from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions, discovery, util
import re import re
import sys import sys
@ -86,6 +86,11 @@ def hgref(ref):
def gitref(ref): def gitref(ref):
return ref.replace(' ', '___') return ref.replace(' ', '___')
def check_version(*check):
if not hg_version:
return True
return hg_version >= check
def get_config(config): def get_config(config):
cmd = ['git', 'config', '--get', config] cmd = ['git', 'config', '--get', config]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE) process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
@ -854,6 +859,42 @@ def write_tag(repo, tag, node, msg, author):
return tagnode return tagnode
def checkheads(repo, remote, p_revs):
remotemap = remote.branchmap()
if not remotemap:
# empty repo
return
new = {}
for node in p_revs:
ctx = repo[node]
branch = ctx.branch()
if not branch in remotemap:
# new branch
continue
new.setdefault(branch, []).append(ctx.rev())
for branch, heads in new.iteritems():
old = [repo.changelog.rev(x) for x in remotemap[branch]]
for rev in heads:
if check_version(2, 3):
ancestors = repo.changelog.ancestors([rev], stoprev=min(old))
else:
ancestors = repo.changelog.ancestors(rev)
found = False
for x in old:
if x in ancestors:
found = True
break
if found:
continue
raise Exception("non-fast-forward")
def push_unsafe(repo, remote, parsed_refs, p_revs): def push_unsafe(repo, remote, parsed_refs, p_revs):
force = force_push force = force_push
@ -862,7 +903,8 @@ def push_unsafe(repo, remote, parsed_refs, p_revs):
commoninc = fci(repo, remote, force=force) commoninc = fci(repo, remote, force=force)
common, _, remoteheads = commoninc common, _, remoteheads = commoninc
# TODO checkheads if not force:
checkheads(repo, remote, p_revs)
cg = repo.getbundle('push', heads=list(p_revs), common=common) cg = repo.getbundle('push', heads=list(p_revs), common=common)
@ -991,7 +1033,7 @@ def main(args):
global track_branches, force_push, is_tmp global track_branches, force_push, is_tmp
global parsed_tags global parsed_tags
global filenodes global filenodes
global fake_bmark global fake_bmark, hg_version
alias = args[1] alias = args[1]
url = args[2] url = args[2]
@ -1026,6 +1068,10 @@ def main(args):
parsed_tags = {} parsed_tags = {}
filenodes = {} filenodes = {}
fake_bmark = None fake_bmark = None
try:
hg_version = tuple(int(e) for e in util.version().split('.'))
except:
hg_version = None
repo = get_repo(url, alias) repo = get_repo(url, alias)
prefix = 'refs/hg/%s' % alias prefix = 'refs/hg/%s' % alias