sapling/hggit/hgrepo.py
Augie Fackler 6e81a1af77 hgrepo: completely rework handing of remote refs marking
Previously, we appended to .hg/localtags on every pull. This meant
that we never deleted refs that disappeared on the remote server, and
the file length grew without bound. Now we use our own file
(.hg/git-remote-refs) and we do prune refs that disappear from the
remote server.
2010-12-20 22:37:07 -06:00

83 lines
2.9 KiB
Python

import os
from mercurial.node import bin
from git_handler import GitHandler
from gitrepo import gitrepo
def generate_repo_subclass(baseclass):
class hgrepo(baseclass):
def pull(self, remote, heads=None, force=False):
if isinstance(remote, gitrepo):
git = GitHandler(self, self.ui)
git.fetch(remote.path, heads)
else: #pragma: no cover
return super(hgrepo, self).pull(remote, heads, force)
# TODO figure out something useful to do with the newbranch param
def push(self, remote, force=False, revs=None, newbranch=None):
if isinstance(remote, gitrepo):
git = GitHandler(self, self.ui)
git.push(remote.path, revs, force)
else: #pragma: no cover
# newbranch was added in 1.6
if newbranch is None:
return super(hgrepo, self).push(remote, force, revs)
else:
return super(hgrepo, self).push(remote, force, revs,
newbranch)
def findoutgoing(self, remote, base=None, heads=None, force=False):
if isinstance(remote, gitrepo):
git = GitHandler(self, self.ui)
base, heads = git.get_refs(remote.path)
out, h = super(hgrepo, self).findoutgoing(remote, base, heads, force)
return out
else: #pragma: no cover
return super(hgrepo, self).findoutgoing(remote, base, heads, force)
def _findtags(self):
(tags, tagtypes) = super(hgrepo, self)._findtags()
git = GitHandler(self, self.ui)
for tag, rev in git.tags.iteritems():
if tag in tags:
continue
tags[tag] = bin(rev)
tagtypes[tag] = 'git'
return (tags, tagtypes)
def gitrefs(self):
tagfile = self.join(os.path.join('git-remote-refs'))
if os.path.exists(tagfile):
tf = open(tagfile, 'rb')
tagdata = tf.read().split('\n')
td = [line.split(' ', 1) for line in tagdata if line]
return dict([(name, bin(sha)) for sha, name in td])
return {}
def tags(self):
if not hasattr(self, 'tagscache'):
# mercurial 1.4
tmp = super(hgrepo, self).tags()
tmp.update(self.gitrefs())
return tmp
if self.tagscache:
return self.tagscache
git = GitHandler(self, self.ui)
tagscache = super(hgrepo, self).tags()
for tag, rev in git.tags.iteritems():
if tag in tagscache:
continue
tagscache[tag] = bin(rev)
self._tagstypecache[tag] = 'git'
return tagscache
return hgrepo