Mercurial > hg > hg-git
changeset 194:a5c53e94d92b
Do not depend on the cache git repository for reference pushing
author | Abderrahim Kitouni <a.kitouni@gmail.com> |
---|---|
date | Sun, 21 Jun 2009 22:44:41 +0100 |
parents | 40838c221495 |
children | e09d71dc4cb4 |
files | git_handler.py |
diffstat | 1 files changed, 35 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/git_handler.py +++ b/git_handler.py @@ -588,30 +588,44 @@ return None # TODO : this is a huge hack - if keys[0] == 'capabilities^{}': # nothing on the server yet - first push - changed['refs/heads/master'] = self.git.ref('master') + if keys[0] == 'capabilities^{}': + # nothing on the server yet - first push + if not 'master' in self.repo.tags(): + tip = self.repo.lookup('tip') + changed['refs/heads/master'] = self.map_git_get(hex(tip)) - tags = self.git.get_tags() - for tag, sha in tags.iteritems(): + for tag, sha in self.tags.iteritems(): tag_name = 'refs/tags/' + tag if tag_name not in refs: - changed[tag_name] = sha + changed[tag_name] = self.map_git_get(sha) for ref_name in keys: parts = ref_name.split('/') - if parts[0] == 'refs': # strip off 'refs/heads' - if parts[1] == 'heads': - head = "/".join([v for v in parts[2:]]) - local_ref = self.git.ref(ref_name) - if local_ref: - if not local_ref == refs[ref_name]: - changed[ref_name] = local_ref + if parts[0] == 'refs' and parts[1] == 'heads': + # strip off 'refs/heads' + head = "/".join([v for v in parts[2:]]) + try: + local_ref = self.repo.lookup(head) + remote_ref = self.map_hg_get(refs[ref_name]) + if remote_ref: + remotectx = self.repo[remote_ref] + localctx = self.repo[local_ref] + if remotectx.ancestor(localctx) == remotectx: + # fast forward push + changed[ref_name] = self.map_git_get(hex(local_ref)) + else: + # XXX: maybe abort completely + ui.warn('not pushing branch %s, please merge'% head) + except RepoError: + # remote_ref is not here + pass # Also push any local branches not on the server yet for head in self.local_heads(): - if not head in refs: - ref = self.git.ref(head) - changed[head] = ref + ref = 'refs/heads/' + head + if not ref in refs: + node = self.repo.lookup(head) + changed[ref] = self.map_git_get(hex(node)) return changed @@ -710,9 +724,11 @@ self.git.set_remote_refs(self.local_heads(), remote_name) def local_heads(self): - def is_local_head(item): return item[0].startswith('refs/heads') - refs = self.git.get_refs() - return dict(filter(is_local_head, refs.items())) + try: + bms = bookmarks.parse(self.repo) + return dict([(bm, self.map_git_get(hex(bms[bm]))) for bm in bms]) + except AttributeError: + return {} def import_tags(self, refs): keys = refs.keys() @@ -721,7 +737,7 @@ for k in keys[:]: ref_name = k parts = k.split('/') - if (parts[0] == 'refs' and parts[1] == 'tags'): + if parts[0] == 'refs' and parts[1] == 'tags': ref_name = "/".join([v for v in parts[2:]]) if ref_name[-3:] == '^{}': ref_name = ref_name[:-3]