FIXME: hotpatch for compatibility with latest hg
[git] / git-remote-hg.py
1 #!/usr/bin/env python
2
3 import sys
4 import os
5 sys.path.insert(0, os.getenv("GITPYTHONLIB","."))
6
7 from git_remote_helpers.helper import RemoteHelper
8 from git_remote_helpers.util import debug, die, warn
9 from git_remote_helpers.hg import util
10 from git_remote_helpers.hg.hg import GitHg
11 from git_remote_helpers.hg.exporter import GitExporter
12 from git_remote_helpers.hg.importer import GitImporter
13 from git_remote_helpers.hg.non_local import NonLocalHg
14
15
16 class HgRemoteHelper(RemoteHelper):
17     def get_repo(self, alias, url):
18         """Returns a hg.repository object initialized for usage.
19         """
20
21         try:
22             from mercurial import hg, ui
23         except ImportError:
24             die("Mercurial python libraries not installed")
25
26         remote = False
27
28         if url.startswith("remote://"):
29             remote = True
30             url = "file://%s" % url[9:]
31
32         ui = ui.ui()
33         source, revs, checkout = util.parseurl(ui.expandpath(url), ['default'])
34         repo = hg.repository(ui, source)
35         if repo.capable('branchmap'):
36             revs += repo.branchmap().keys()
37             revs = set(revs)
38
39         prefix = 'refs/hg/%s/' % alias
40         debug("prefix: '%s'", prefix)
41
42         repo.marksfile = 'git.marks'
43         repo.hg = hg
44         repo.prefix = prefix
45         repo.revs = revs
46
47         self.setup_repo(repo, alias)
48
49         repo.git_hg = GitHg(warn)
50         repo.exporter = GitExporter(repo)
51         repo.importer = GitImporter(repo)
52         repo.non_local = NonLocalHg(repo)
53
54         repo.is_local = not remote and repo.local()
55
56         return repo
57
58     def local_repo(self, repo, path):
59         """Returns a hg.repository object initalized for usage.
60         """
61
62         local = repo.hg.repository(repo.ui, path)
63
64         self.setup_local_repo(local, repo)
65
66         local.git_hg = repo.git_hg
67         local.hg = repo.hg
68         local.revs = repo.revs
69         local.exporter = GitExporter(local)
70         local.importer = GitImporter(local)
71         local.is_local = repo.is_local
72
73         return local
74
75     def do_list(self, repo, args):
76         """Lists all known references.
77         """
78
79         for ref in repo.revs:
80             debug("? refs/heads/%s", ref)
81             print "? refs/heads/%s" % ref
82
83         debug("@refs/heads/default HEAD")
84         print "@refs/heads/default HEAD"
85
86         print # end list
87
88     def sanitize(self, value):
89         """Cleans up the url.
90         """
91
92         if value.startswith('hg::'):
93             value = value[4:]
94
95         return value
96
97     def get_refs(self, repo, gitdir):
98         return repo.branchmap()
99
100 if __name__ == '__main__':
101     sys.exit(HgRemoteHelper().main(sys.argv))