Mercurial > hg > hg-git
changeset 561:9f919924bf81
Merge
author | Augie Fackler <raf@durin42.com> |
---|---|
date | Thu, 25 Oct 2012 23:22:36 -0500 |
parents | 9c71a6f00863 (diff) cac070a4b521 (current diff) |
children | 64479303803b |
files | hggit/git_handler.py |
diffstat | 24 files changed, 130 insertions(+), 58 deletions(-) [+] |
line wrap: on
line diff
--- a/hggit/__init__.py +++ b/hggit/__init__.py @@ -184,6 +184,14 @@ # 1.7+ pass +def peer(orig, uiorrepo, *args, **opts): + newpeer = orig(uiorrepo, *args, **opts) + if isinstance(newpeer, gitrepo.gitrepo): + if isinstance(uiorrepo, localrepo.localrepository): + newpeer.localrepo = uiorrepo + return newpeer +extensions.wrapfunction(hg, 'peer', peer) + def revset_fromgit(repo, subset, x): '''``fromgit()`` Select changesets that originate from Git.
--- a/hggit/git_handler.py +++ b/hggit/git_handler.py @@ -279,7 +279,10 @@ if remote_name and new_refs: for ref, new_sha in new_refs.iteritems(): if new_sha != old_refs.get(ref): - self.ui.status(" %s::%s => GIT:%s\n" % + self.ui.note(" %s::%s => GIT:%s\n" % + (remote_name, ref, new_sha[0:8])) + else: + self.ui.debug(" %s::%s => GIT:%s\n" % (remote_name, ref, new_sha[0:8])) self.update_remote_branches(remote_name, new_refs) @@ -336,7 +339,7 @@ export = [node for node in nodes if not hex(node) in self._map_hg] total = len(export) if total: - self.ui.status(_("exporting hg objects to git\n")) + self.ui.note(_("exporting hg objects to git\n")) for i, rev in enumerate(export): util.progress(self.ui, 'exporting', i, total=total) ctx = self.repo.changectx(rev) @@ -887,15 +890,17 @@ #The remote repo is empty and the local one doesn't have bookmarks/tags if refs.keys()[0] == 'capabilities^{}': - del new_refs['capabilities^{}'] if not self.local_heads(): - tip = hex(self.repo.lookup('tip')) - try: - commands.bookmark(self.ui, self.repo, 'master', tip, force=True) - except NameError: - bookmarks.bookmark(self.ui, self.repo, 'master', tip, force=True) - bookmarks.setcurrent(self.repo, 'master') - new_refs['refs/heads/master'] = self.map_git_get(tip) + tip = self.repo.lookup('tip') + if tip != nullid: + del new_refs['capabilities^{}'] + tip = hex(tip) + try: + commands.bookmark(self.ui, self.repo, 'master', tip, force=True) + except NameError: + bookmarks.bookmark(self.ui, self.repo, 'master', tip, force=True) + bookmarks.setcurrent(self.repo, 'master') + new_refs['refs/heads/master'] = self.map_git_get(tip) for rev in revs: ctx = self.repo[rev] @@ -964,7 +969,7 @@ return new_refs - def fetch_pack(self, remote_name, heads): + def fetch_pack(self, remote_name, heads=None): client, path = self.get_transport_and_path(remote_name) graphwalker = self.git.get_graph_walker() def determine_wants(refs):
--- a/hggit/gitrepo.py +++ b/hggit/gitrepo.py @@ -1,3 +1,4 @@ +import os from mercurial import util try: from mercurial.error import RepoError @@ -11,6 +12,10 @@ from git_handler import GitHandler +from overlay import overlayrepo + +from mercurial.node import bin + class gitrepo(peerrepository): capabilities = ['lookup'] @@ -22,6 +27,13 @@ raise util.Abort('Cannot create a git repository.') self.ui = ui self.path = path + self.localrepo = None + self.handler = None + + def _initializehandler(self): + if self.handler is None and self.localrepo is not None: + self.handler = GitHandler(self.localrepo, self.localrepo.ui) + return self.handler def url(self): return self.path @@ -38,6 +50,22 @@ return [] def listkeys(self, namespace): + if namespace == 'namespaces': + return {'bookmarks':''} + elif namespace == 'bookmarks': + handler = self._initializehandler() + if handler: + handler.export_commits() + refs = handler.fetch_pack(self.path) + reqrefs = refs + convertlist, commits = handler.getnewgitcommits(reqrefs) + newcommits = [bin(c) for c in commits] + b = overlayrepo(handler, newcommits, refs) + stripped_refs = dict([ + (ref[ref.find('/', ref.find('/')+1)+1:], b.node(refs[ref])) + for ref in refs.keys() + if ref.find('/') != -1]) + return stripped_refs return {} def pushkey(self, namespace, key, old, new):
--- a/hggit/overlay.py +++ b/hggit/overlay.py @@ -227,6 +227,12 @@ return self.handler.repo[n] return overlaychangectx(self, n) + def node(self, n): + """Returns an Hg or Git hash for the specified Git hash""" + if bin(n) in self.revmap: + return n + return self.handler.map_hg_get(n) + def nodebookmarks(self, n): return self.refmap.get(n, [])
--- a/tests/test-bookmark-workflow.t +++ b/tests/test-bookmark-workflow.t @@ -109,6 +109,11 @@ searching for changes no changes found [1] + $ hg outgoing -B + comparing with $TESTTMP/hgremoterepo + searching for changed bookmarks + no changed bookmarks found + [1] $ hg push pushing to $TESTTMP/hgremoterepo searching for changes @@ -121,9 +126,56 @@ searching for changes no changes found [1] + $ hg outgoing -B + comparing with $TESTTMP/gitremoterepo + searching for changed bookmarks + no changed bookmarks found + [1] $ hg push pushing to $TESTTMP/gitremoterepo searching for changes no changes found [1] $ cd .. + +Changed bookmarks, but not revs + $ cd purehglocalrepo + $ hg bookmark -fr 2 b1 + $ hg bookmark -r 0 b2 + $ hgstate + 3 fc2664cac217 "add delta" bookmarks: [master] + 2 d85ced7ae9d6 "add gamma" bookmarks: [b1] + 1 7bcd915dc873 "add beta" bookmarks: [] + 0 3442585be8a6 "add alpha" bookmarks: [b2] + $ hg outgoing + comparing with $TESTTMP/hgremoterepo + searching for changes + no changes found + [1] +As of 2.3, Mercurial's outgoing -B doesn't actually show changed bookmarks +It only shows "new" bookmarks. Thus, b1 doesn't show up. + $ hg outgoing -B + comparing with $TESTTMP/hgremoterepo + searching for changed bookmarks + b2 3442585be8a6 + $ cd .. + $ cd hggitlocalrepo + $ hg bookmark -fr 2 b1 + $ hg bookmark -r 0 b2 + $ hgstate + 3 fc2664cac217 "add delta" bookmarks: [master] + 2 d85ced7ae9d6 "add gamma" bookmarks: [b1] + 1 7bcd915dc873 "add beta" bookmarks: [] + 0 3442585be8a6 "add alpha" bookmarks: [b2] + $ hg outgoing + comparing with $TESTTMP/gitremoterepo + searching for changes + no changes found + [1] +As of 2.3, Mercurial's outgoing -B doesn't actually show changed bookmarks +It only shows "new" bookmarks. Thus, b1 doesn't show up. + $ hg outgoing -B + comparing with $TESTTMP/gitremoterepo + searching for changed bookmarks + b2 3442585be8a6 + $ cd ..
--- a/tests/test-conflict-1.t +++ b/tests/test-conflict-1.t @@ -60,7 +60,6 @@ $ hg bookmark -r tip master $ hg push -r master ../gitrepo pushing to ../gitrepo - exporting hg objects to git searching for changes $ cd ..
--- a/tests/test-conflict-2.t +++ b/tests/test-conflict-2.t @@ -60,7 +60,6 @@ $ hg bookmark -r tip master $ hg push -r master ../gitrepo pushing to ../gitrepo - exporting hg objects to git searching for changes $ cd ..
--- a/tests/test-convergedmerge.t +++ b/tests/test-convergedmerge.t @@ -61,7 +61,6 @@ $ hg bookmark -r4 master $ hg push -r master ../gitrepo pushing to ../gitrepo - exporting hg objects to git searching for changes $ cd ..
--- a/tests/test-empty-working-tree.t +++ b/tests/test-empty-working-tree.t @@ -39,7 +39,6 @@ clearing out the git cache data $ hg push ../gitrepo2 pushing to ../gitrepo2 - exporting hg objects to git searching for changes $ cd ../gitrepo2
--- a/tests/test-encoding.t +++ b/tests/test-encoding.t @@ -121,7 +121,6 @@ clearing out the git cache data $ hg push ../gitrepo2 pushing to ../gitrepo2 - exporting hg objects to git searching for changes $ cd ../gitrepo2
--- a/tests/test-file-removal.t +++ b/tests/test-file-removal.t @@ -108,7 +108,6 @@ clearing out the git cache data $ hg push ../gitrepo2 pushing to ../gitrepo2 - exporting hg objects to git searching for changes $ cd ../gitrepo2
--- a/tests/test-git-tags.t +++ b/tests/test-git-tags.t @@ -71,8 +71,6 @@ $ hg commit -m 'fix for beta' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:3b7fd1b3 $ cd ..
--- a/tests/test-git-workflow.t +++ b/tests/test-git-workflow.t @@ -66,7 +66,6 @@ $ echo "[git]" >> .hg/hgrc $ echo "intree = True" >> .hg/hgrc $ hg gexport - exporting hg objects to git $ echo % do some work % do some work
--- a/tests/test-hg-author.t +++ b/tests/test-hg-author.t @@ -54,71 +54,55 @@ $ hgcommit -u "test" -m 'add beta' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:cffa0e8d $ echo gamma >> beta $ hgcommit -u "test <test@example.com> (comment)" -m 'modify beta' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:2b9ec6a4 $ echo gamma > gamma $ hg add gamma $ hgcommit -u "<test@example.com>" -m 'add gamma' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:fee30180 $ echo delta > delta $ hg add delta $ hgcommit -u "name<test@example.com>" -m 'add delta' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:d1659250 $ echo epsilon > epsilon $ hg add epsilon $ hgcommit -u "name <test@example.com" -m 'add epsilon' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:ee985f12 $ echo zeta > zeta $ hg add zeta $ hgcommit -u " test " -m 'add zeta' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:d21e26b4 $ echo eta > eta $ hg add eta $ hgcommit -u "test < test@example.com >" -m 'add eta' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:8c878c97 $ echo theta > theta $ hg add theta $ hgcommit -u "test >test@example.com>" -m 'add theta' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:1e03e913 $ hg log --graph | egrep -v ': *(not-master|master)' @ changeset: 8:d3c51ce68cfd
--- a/tests/test-hg-branch.t +++ b/tests/test-hg-branch.t @@ -57,18 +57,14 @@ $ hgcommit -m 'rename alpha to beta' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:05c2bcbe $ hg branch gamma | grep -v 'permanent and global' marked working directory as branch gamma $ hgcommit -m 'started branch gamma' $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:296802ef $ hg log --graph | $filterhash | egrep -v ': *(not-master|master)' @ changeset: 2:05aed681ccb3
--- a/tests/test-hg-tags.t +++ b/tests/test-hg-tags.t @@ -52,10 +52,7 @@ $ hgtag alpha $ hg push pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/tags/alpha => GIT:7eeab2ea - default::refs/heads/master => GIT:9a2616b9 $ hg log --graph | egrep -v ': *(not-master|master)' @ changeset: 1:d529e9229f6d
--- a/tests/test-incoming.t +++ b/tests/test-incoming.t @@ -152,7 +152,8 @@ $ echo % nothing incoming after pull % nothing incoming after pull - $ hg pull +"adding remote bookmark" message was added in Mercurial 2.3 + $ hg pull | grep -v "adding remote bookmark" pulling from $TESTTMP/gitrepo importing git objects into hg (run 'hg heads' to see heads, 'hg merge' to merge)
--- a/tests/test-merge.t +++ b/tests/test-merge.t @@ -69,7 +69,6 @@ clearing out the git cache data $ hg push ../gitrepo2 pushing to ../gitrepo2 - exporting hg objects to git searching for changes $ cd ..
--- a/tests/test-octopus.t +++ b/tests/test-octopus.t @@ -96,7 +96,6 @@ clearing out the git cache data $ hg push ../gitrepo2 pushing to ../gitrepo2 - exporting hg objects to git searching for changes $ cd ../gitrepo2
--- a/tests/test-outgoing.t +++ b/tests/test-outgoing.t @@ -60,7 +60,6 @@ $ hg outgoing | sed 's/bookmark: /tag: /' | grep -v 'searching for changes' comparing with */gitrepo (glob) - exporting hg objects to git changeset: 1:0564f526fb0f tag: beta user: test @@ -126,7 +125,7 @@ [255] $ echo % let\'s pull and try again % let's pull and try again - $ hg pull + $ hg pull 2>&1 | grep -v 'divergent bookmark' pulling from */gitrepo (glob) importing git objects into hg (run 'hg update' to get a working copy)
--- a/tests/test-pull-after-strip.t +++ b/tests/test-pull-after-strip.t @@ -114,11 +114,12 @@ git commit map cleaned $ echo % pull works after \'hg git-cleanup\' % pull works after 'hg git-cleanup' - $ hg pull -r beta +"adding remote bookmark" message was added in Mercurial 2.3 + $ hg pull -r beta | grep -v "adding remote bookmark" pulling from $TESTTMP/gitrepo importing git objects into hg (run 'hg update' to get a working copy) - $ hg log --graph | egrep -v ': *(beta|master)' + $ hg log --graph | egrep -v 'bookmark: *(alpha|beta|master)' o changeset: 2:611948b1ec6a | tag: default/beta | tag: tip
--- a/tests/test-push.t +++ b/tests/test-push.t @@ -59,9 +59,7 @@ $ hg book -r 1 beta $ hg push -r beta pushing to $TESTTMP/gitrepo - exporting hg objects to git searching for changes - default::refs/heads/beta => GIT:cffa0e8d $ cd .. @@ -102,7 +100,7 @@ abort: refs/heads/master changed on the server, please pull and merge before pushing [255] - $ hg pull + $ hg pull 2>&1 | grep -v 'divergent bookmark' pulling from $TESTTMP/gitrepo importing git objects into hg (run 'hg update' to get a working copy) @@ -117,7 +115,7 @@ date: Mon Jan 01 00:00:12 2007 +0000 summary: add gamma - $ hg log -r default/master + $ hg log -r default/master | grep -v 'master@default' changeset: 3:1436150b86c2 tag: default/master tag: tip @@ -140,7 +138,6 @@ $ hg push -fr master pushing to $TESTTMP/gitrepo searching for changes - default::refs/heads/master => GIT:cc119202 $ echo % this should fail, no changes to push % this should fail, no changes to push @@ -153,3 +150,15 @@ [1] $ cd .. + +Push empty Hg repo to empty Git repo (issue #58) +Since there aren't any changes, exit code 1 is expected in modern Mercurial. +However, since it varies between supported Mercurial versions, we need to +force it to consistency for now. (see issue3228, fixed in Mercurial 2.1) + $ hg init hgrepo2 + $ git init -q --bare gitrepo2 + $ hg -R hgrepo2 push gitrepo2 && false + pushing to gitrepo2 + searching for changes + no changes found + [1]
--- a/tests/test-subrepos.t +++ b/tests/test-subrepos.t @@ -115,9 +115,7 @@ $ hg commit -m 'Update subrepo2 from hg' | grep -v "committing subrepository" || true $ hg push pushing to $TESTTMP/gitrepo1 - exporting hg objects to git searching for changes - default::refs/heads/master => GIT:4663c492 $ cd .. $ cd gitrepo1 $ echo % there shall be two gitlink entries, with values matching that in .hgsubstate