annotate hggit/__init__.py @ 714:5770a5a8bc00

revset_fromgit: use repo.changelog.node instead of contexts hg perfrevset 'max(fromgit())' on a repo with around 60,000 commits: before: ! wall 1.055093 comb 1.050000 user 1.050000 sys 0.000000 (best of 10) after: ! wall 0.148586 comb 0.140000 user 0.140000 sys 0.000000 (best of 62) In reality, perfrevset doesn't clear the Git-to-Mercurial map, which means that a call like `hg log -r 'max(fromgit())'` speeds up from around 1.5 seconds to 0.6.
author Siddharth Agarwal <sid0@fb.com>
date Mon, 14 Apr 2014 21:05:13 -0700
parents 96f0463a4e54
children f49f367d77c1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
1 # git.py - git server bridge
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
2 #
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
3 # Copyright 2008 Scott Chacon <schacon at gmail dot com>
250
b9c94c21777e Add some better help.
Augie Fackler <durin42@gmail.com>
parents: 220
diff changeset
4 # also some code (and help) borrowed from durin42
0
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
5 #
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
6 # This software may be used and distributed according to the terms
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
7 # of the GNU General Public License, incorporated herein by reference.
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
8
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
9 '''push and pull from a Git server
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
10
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
11 This extension lets you communicate (push and pull) with a Git server.
250
b9c94c21777e Add some better help.
Augie Fackler <durin42@gmail.com>
parents: 220
diff changeset
12 This way you can use Git hosting for your project or collaborate with a
0
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
13 project that is in Git. A bridger of worlds, this plugin be.
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
14
250
b9c94c21777e Add some better help.
Augie Fackler <durin42@gmail.com>
parents: 220
diff changeset
15 Try hg clone git:// or hg clone git+ssh://
481
9df1741f3977 help: add additional help topics
David M. Carr <david@carrclan.us>
parents: 442
diff changeset
16
9df1741f3977 help: add additional help topics
David M. Carr <david@carrclan.us>
parents: 442
diff changeset
17 For more information and instructions, see :hg:`help git`
0
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
18 '''
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
19
481
9df1741f3977 help: add additional help topics
David M. Carr <david@carrclan.us>
parents: 442
diff changeset
20 from bisect import insort
351
dd90394cd13b findoutgoing: update wrapper for hg change 98c874a929f1
Augie Fackler <durin42@gmail.com>
parents: 344
diff changeset
21 import inspect
256
442fe2ca104d Simpler handling of detection of git repos
Mads Kiilerich <mads@kiilerich.com>
parents: 220
diff changeset
22 import os
442fe2ca104d Simpler handling of detection of git repos
Mads Kiilerich <mads@kiilerich.com>
parents: 220
diff changeset
23
408
2dcfd4bbfc1a Support for hg incoming
Brendan Cully <brendan@kublai.com>
parents: 389
diff changeset
24 from mercurial import bundlerepo
334
eb345bacc1da Cope with tags being sorted (hg cset c7dbd6c4877a) by backporting that behavior
Augie Fackler <durin42@gmail.com>
parents: 320
diff changeset
25 from mercurial import commands
362
5b6961384ee2 demandimport: defend against collections breakage in new dulwich
Augie Fackler <durin42@gmail.com>
parents: 352
diff changeset
26 from mercurial import demandimport
615
503d403fc040 Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents: 556
diff changeset
27 from mercurial import dirstate
523
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
28 from mercurial import discovery
334
eb345bacc1da Cope with tags being sorted (hg cset c7dbd6c4877a) by backporting that behavior
Augie Fackler <durin42@gmail.com>
parents: 320
diff changeset
29 from mercurial import extensions
481
9df1741f3977 help: add additional help topics
David M. Carr <david@carrclan.us>
parents: 442
diff changeset
30 from mercurial import help
334
eb345bacc1da Cope with tags being sorted (hg cset c7dbd6c4877a) by backporting that behavior
Augie Fackler <durin42@gmail.com>
parents: 320
diff changeset
31 from mercurial import hg
615
503d403fc040 Fix for #68 | Use .gitignore files (with proper semantics)
Ben Kehoe <benk@berkeley.edu>
parents: 556
diff changeset
32 from mercurial import ignore
334
eb345bacc1da Cope with tags being sorted (hg cset c7dbd6c4877a) by backporting that behavior
Augie Fackler <durin42@gmail.com>
parents: 320
diff changeset
33 from mercurial import localrepo
713
96f0463a4e54 revset_gitnode: use repo.changelog.node instead of contexts
Siddharth Agarwal <sid0@fb.com>
parents: 706
diff changeset
34 from mercurial.node import hex
483
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
35 from mercurial import revset
482
00d591868a2f templatekw: add support for gitnode template keyword
David M. Carr <david@carrclan.us>
parents: 481
diff changeset
36 from mercurial import templatekw
334
eb345bacc1da Cope with tags being sorted (hg cset c7dbd6c4877a) by backporting that behavior
Augie Fackler <durin42@gmail.com>
parents: 320
diff changeset
37 from mercurial import util as hgutil
383
61865ad88740 compatibility with new url handling in Mercurial 1.9
Mads Kiilerich <mads@kiilerich.com>
parents: 373
diff changeset
38 from mercurial import url
0
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
39 from mercurial.i18n import _
220
211fa793d74f support local git repositories (fixes issue 5 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 210
diff changeset
40
362
5b6961384ee2 demandimport: defend against collections breakage in new dulwich
Augie Fackler <durin42@gmail.com>
parents: 352
diff changeset
41 demandimport.ignore.extend([
5b6961384ee2 demandimport: defend against collections breakage in new dulwich
Augie Fackler <durin42@gmail.com>
parents: 352
diff changeset
42 'collections',
5b6961384ee2 demandimport: defend against collections breakage in new dulwich
Augie Fackler <durin42@gmail.com>
parents: 352
diff changeset
43 ])
5b6961384ee2 demandimport: defend against collections breakage in new dulwich
Augie Fackler <durin42@gmail.com>
parents: 352
diff changeset
44
622
6faa5b0f8909 gitignore: gate feature on dirstate having rootcache and ignore having readpats
Augie Fackler <raf@durin42.com>
parents: 615
diff changeset
45 import gitrepo, hgrepo
5
d6c443a91b18 refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents: 4
diff changeset
46 from git_handler import GitHandler
693
9b194d7c9c03 verify: add new command to verify the contents of a Mercurial rev
Siddharth Agarwal <sid0@fb.com>
parents: 677
diff changeset
47 import verify
0
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
48
674
f0e774680e70 version: drop support for Mercurial 1.9.3
Siddharth Agarwal <sid0@fb.com>
parents: 670
diff changeset
49 testedwith = '2.0.2 2.1.2 2.2.3 2.8.1'
545
22b8df4c54c5 docs: include buglink
David M. Carr <david@carrclan.us>
parents: 523
diff changeset
50 buglink = 'https://bitbucket.org/durin42/hg-git/issues'
22b8df4c54c5 docs: include buglink
David M. Carr <david@carrclan.us>
parents: 523
diff changeset
51
60
05a96f7750ad add support for `hg clone git://github.com/defunkt/facebox.git`
Chris Wanstrath <chris@ozmm.org>
parents: 59
diff changeset
52 # support for `hg clone git://github.com/defunkt/facebox.git`
168
8bfa8aa6b68f added empty changelog handling
Scott Chacon <schacon@gmail.com>
parents: 165
diff changeset
53 # also hg clone git+ssh://git@github.com/schacon/simplegit.git
439
3f45c88100e8 add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 430
diff changeset
54 _gitschemes = ('git', 'git+ssh', 'git+http', 'git+https')
3f45c88100e8 add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 430
diff changeset
55 for _scheme in _gitschemes:
3f45c88100e8 add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 430
diff changeset
56 hg.schemes[_scheme] = gitrepo
180
682863000e9a Make it possible to clone/pull from bundle repositories
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 175
diff changeset
57
256
442fe2ca104d Simpler handling of detection of git repos
Mads Kiilerich <mads@kiilerich.com>
parents: 220
diff changeset
58 # support for `hg clone localgitrepo`
220
211fa793d74f support local git repositories (fixes issue 5 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 210
diff changeset
59 _oldlocal = hg.schemes['file']
211fa793d74f support local git repositories (fixes issue 5 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 210
diff changeset
60
388
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
61 try:
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
62 urlcls = hgutil.url
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
63 except AttributeError:
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
64 class urlcls(object):
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
65 def __init__(self, path):
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
66 self.p = hgutil.drop_scheme('file', path)
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
67
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
68 def localpath(self):
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
69 return self.p
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
70
220
211fa793d74f support local git repositories (fixes issue 5 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 210
diff changeset
71 def _local(path):
388
bcc79fa3fe09 url wasn't ever published as url.url, and is now util.url
Augie Fackler <durin42@gmail.com>
parents: 383
diff changeset
72 p = urlcls(path).localpath()
280
d0594f7675e1 init: whitespace cleanup
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
73 if (os.path.exists(os.path.join(p, '.git')) and
256
442fe2ca104d Simpler handling of detection of git repos
Mads Kiilerich <mads@kiilerich.com>
parents: 220
diff changeset
74 not os.path.exists(os.path.join(p, '.hg'))):
220
211fa793d74f support local git repositories (fixes issue 5 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 210
diff changeset
75 return gitrepo
263
9f5a7a5d52aa Enable detection of bare repositories as a local git repo
Lincoln Stoll <lstoll@lstoll.net>
parents: 260
diff changeset
76 # detect a bare repository
280
d0594f7675e1 init: whitespace cleanup
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
77 if (os.path.exists(os.path.join(p, 'HEAD')) and
d0594f7675e1 init: whitespace cleanup
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
78 os.path.exists(os.path.join(p, 'objects')) and
d0594f7675e1 init: whitespace cleanup
Augie Fackler <durin42@gmail.com>
parents: 263
diff changeset
79 os.path.exists(os.path.join(p, 'refs')) and
263
9f5a7a5d52aa Enable detection of bare repositories as a local git repo
Lincoln Stoll <lstoll@lstoll.net>
parents: 260
diff changeset
80 not os.path.exists(os.path.join(p, '.hg'))):
9f5a7a5d52aa Enable detection of bare repositories as a local git repo
Lincoln Stoll <lstoll@lstoll.net>
parents: 260
diff changeset
81 return gitrepo
256
442fe2ca104d Simpler handling of detection of git repos
Mads Kiilerich <mads@kiilerich.com>
parents: 220
diff changeset
82 return _oldlocal(path)
220
211fa793d74f support local git repositories (fixes issue 5 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 210
diff changeset
83
211fa793d74f support local git repositories (fixes issue 5 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 210
diff changeset
84 hg.schemes['file'] = _local
211fa793d74f support local git repositories (fixes issue 5 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 210
diff changeset
85
281
a14529b7b8f2 init: strip .git for default clone destination for git sources
Augie Fackler <durin42@gmail.com>
parents: 280
diff changeset
86 hgdefaultdest = hg.defaultdest
a14529b7b8f2 init: strip .git for default clone destination for git sources
Augie Fackler <durin42@gmail.com>
parents: 280
diff changeset
87 def defaultdest(source):
439
3f45c88100e8 add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 430
diff changeset
88 for scheme in _gitschemes:
281
a14529b7b8f2 init: strip .git for default clone destination for git sources
Augie Fackler <durin42@gmail.com>
parents: 280
diff changeset
89 if source.startswith('%s://' % scheme) and source.endswith('.git'):
a14529b7b8f2 init: strip .git for default clone destination for git sources
Augie Fackler <durin42@gmail.com>
parents: 280
diff changeset
90 source = source[:-4]
a14529b7b8f2 init: strip .git for default clone destination for git sources
Augie Fackler <durin42@gmail.com>
parents: 280
diff changeset
91 break
a14529b7b8f2 init: strip .git for default clone destination for git sources
Augie Fackler <durin42@gmail.com>
parents: 280
diff changeset
92 return hgdefaultdest(source)
a14529b7b8f2 init: strip .git for default clone destination for git sources
Augie Fackler <durin42@gmail.com>
parents: 280
diff changeset
93 hg.defaultdest = defaultdest
a14529b7b8f2 init: strip .git for default clone destination for git sources
Augie Fackler <durin42@gmail.com>
parents: 280
diff changeset
94
297
a90fe3e8a8c3 hggit: defend against exceptions when pulling with -r
Augie Fackler <durin42@gmail.com>
parents: 296
diff changeset
95 # defend against tracebacks if we specify -r in 'hg pull'
a90fe3e8a8c3 hggit: defend against exceptions when pulling with -r
Augie Fackler <durin42@gmail.com>
parents: 296
diff changeset
96 def safebranchrevs(orig, lrepo, repo, branches, revs):
a90fe3e8a8c3 hggit: defend against exceptions when pulling with -r
Augie Fackler <durin42@gmail.com>
parents: 296
diff changeset
97 revs, co = orig(lrepo, repo, branches, revs)
706
5e74edb7a62d safebranchrevs: handle changelog having no commits
Siddharth Agarwal <sid0@fb.com>
parents: 695
diff changeset
98 if hgutil.safehasattr(lrepo, 'changelog') and co not in lrepo.changelog:
297
a90fe3e8a8c3 hggit: defend against exceptions when pulling with -r
Augie Fackler <durin42@gmail.com>
parents: 296
diff changeset
99 co = None
a90fe3e8a8c3 hggit: defend against exceptions when pulling with -r
Augie Fackler <durin42@gmail.com>
parents: 296
diff changeset
100 return revs, co
300
eec31dee258e Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents: 298
diff changeset
101 if getattr(hg, 'addbranchrevs', False):
eec31dee258e Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents: 298
diff changeset
102 extensions.wrapfunction(hg, 'addbranchrevs', safebranchrevs)
297
a90fe3e8a8c3 hggit: defend against exceptions when pulling with -r
Augie Fackler <durin42@gmail.com>
parents: 296
diff changeset
103
695
2c67099875cd extsetup: use new-style extsetup with ui parameter
Siddharth Agarwal <sid0@fb.com>
parents: 693
diff changeset
104 def extsetup(ui):
482
00d591868a2f templatekw: add support for gitnode template keyword
David M. Carr <david@carrclan.us>
parents: 481
diff changeset
105 templatekw.keywords.update({'gitnode': gitnodekw})
483
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
106 revset.symbols.update({
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
107 'fromgit': revset_fromgit, 'gitnode': revset_gitnode
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
108 })
481
9df1741f3977 help: add additional help topics
David M. Carr <david@carrclan.us>
parents: 442
diff changeset
109 helpdir = os.path.join(os.path.dirname(__file__), 'help')
9df1741f3977 help: add additional help topics
David M. Carr <david@carrclan.us>
parents: 442
diff changeset
110 entry = (['git'], _("Working with Git Repositories"),
9df1741f3977 help: add additional help topics
David M. Carr <david@carrclan.us>
parents: 442
diff changeset
111 lambda: open(os.path.join(helpdir, 'git.rst')).read())
675
4cb3515cefb0 extsetup: drop support for Mercurial < 1.7
Siddharth Agarwal <sid0@fb.com>
parents: 674
diff changeset
112 insort(help.helptable, entry)
481
9df1741f3977 help: add additional help topics
David M. Carr <david@carrclan.us>
parents: 442
diff changeset
113
206
5986ac6a591e create the repository subclass in reposetup
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 182
diff changeset
114 def reposetup(ui, repo):
296
32456f9cb7a4 hggit: don't wrap gitrepo with hgrepo
Augie Fackler <durin42@gmail.com>
parents: 281
diff changeset
115 if not isinstance(repo, gitrepo.gitrepo):
32456f9cb7a4 hggit: don't wrap gitrepo with hgrepo
Augie Fackler <durin42@gmail.com>
parents: 281
diff changeset
116 klass = hgrepo.generate_repo_subclass(repo.__class__)
32456f9cb7a4 hggit: don't wrap gitrepo with hgrepo
Augie Fackler <durin42@gmail.com>
parents: 281
diff changeset
117 repo.__class__ = klass
60
05a96f7750ad add support for `hg clone git://github.com/defunkt/facebox.git`
Chris Wanstrath <chris@ozmm.org>
parents: 59
diff changeset
118
137
5aefcbf1e50c add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 136
diff changeset
119 def gimport(ui, repo, remote_name=None):
663
ad0d90fa7a4f gimport: use githandler from repo
Siddharth Agarwal <sid0@fb.com>
parents: 624
diff changeset
120 repo.githandler.import_commits(remote_name)
137
5aefcbf1e50c add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 136
diff changeset
121
97
f0628f5270b6 add gexport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 63
diff changeset
122 def gexport(ui, repo):
664
570c3702b916 gexport: use githandler from repo
Siddharth Agarwal <sid0@fb.com>
parents: 663
diff changeset
123 repo.githandler.export_commits()
97
f0628f5270b6 add gexport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 63
diff changeset
124
40
f5b000ec7100 added gclear command to remove all the git data
Scott Chacon <schacon@gmail.com>
parents: 39
diff changeset
125 def gclear(ui, repo):
f5b000ec7100 added gclear command to remove all the git data
Scott Chacon <schacon@gmail.com>
parents: 39
diff changeset
126 repo.ui.status(_("clearing out the git cache data\n"))
665
2659f63f0beb gclear: use githandler from repo
Siddharth Agarwal <sid0@fb.com>
parents: 664
diff changeset
127 repo.githandler.clear()
622
6faa5b0f8909 gitignore: gate feature on dirstate having rootcache and ignore having readpats
Augie Fackler <raf@durin42.com>
parents: 615
diff changeset
128
6faa5b0f8909 gitignore: gate feature on dirstate having rootcache and ignore having readpats
Augie Fackler <raf@durin42.com>
parents: 615
diff changeset
129 from mercurial import dirstate
6faa5b0f8909 gitignore: gate feature on dirstate having rootcache and ignore having readpats
Augie Fackler <raf@durin42.com>
parents: 615
diff changeset
130 from mercurial import ignore
6faa5b0f8909 gitignore: gate feature on dirstate having rootcache and ignore having readpats
Augie Fackler <raf@durin42.com>
parents: 615
diff changeset
131 if (getattr(dirstate, 'rootcache', False) and
6faa5b0f8909 gitignore: gate feature on dirstate having rootcache and ignore having readpats
Augie Fackler <raf@durin42.com>
parents: 615
diff changeset
132 getattr(ignore, 'readpats', False)):
6faa5b0f8909 gitignore: gate feature on dirstate having rootcache and ignore having readpats
Augie Fackler <raf@durin42.com>
parents: 615
diff changeset
133 # only install our dirstate wrapper if it has a hope of working
6faa5b0f8909 gitignore: gate feature on dirstate having rootcache and ignore having readpats
Augie Fackler <raf@durin42.com>
parents: 615
diff changeset
134 import gitdirstate
6faa5b0f8909 gitignore: gate feature on dirstate having rootcache and ignore having readpats
Augie Fackler <raf@durin42.com>
parents: 615
diff changeset
135 extensions.wrapfunction(ignore, 'ignore', gitdirstate.gignore)
6faa5b0f8909 gitignore: gate feature on dirstate having rootcache and ignore having readpats
Augie Fackler <raf@durin42.com>
parents: 615
diff changeset
136 dirstate.dirstate = gitdirstate.gitdirstate
59
19d714ee9941 gfetch should access repo when printing, not dest_repo
Chris Wanstrath <chris@ozmm.org>
parents: 40
diff changeset
137
298
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
138 def git_cleanup(ui, repo):
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
139 new_map = []
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
140 for line in repo.opener(GitHandler.mapfile):
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
141 gitsha, hgsha = line.strip().split(' ', 1)
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
142 if hgsha in repo:
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
143 new_map.append('%s %s\n' % (gitsha, hgsha))
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
144 f = repo.opener(GitHandler.mapfile, 'wb')
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
145 map(f.write, new_map)
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
146 ui.status(_('git commit map cleaned\n'))
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
147
523
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
148 def findcommonoutgoing(orig, repo, other, *args, **kwargs):
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
149 if isinstance(other, gitrepo.gitrepo):
666
27fefb7e7cec findcommonoutgoing: use githandler from repo
Siddharth Agarwal <sid0@fb.com>
parents: 665
diff changeset
150 heads = repo.githandler.get_refs(other.path)[0]
523
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
151 kw = {}
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
152 kw.update(kwargs)
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
153 for val, k in zip(args,
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
154 ('onlyheads', 'force', 'commoninc', 'portable')):
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
155 kw[k] = val
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
156 force = kw.get('force', False)
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
157 commoninc = kw.get('commoninc', None)
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
158 if commoninc is None:
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
159 commoninc = discovery.findcommonincoming(repo, other,
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
160 heads=heads, force=force)
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
161 kw['commoninc'] = commoninc
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
162 return orig(repo, other, **kw)
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
163 return orig(repo, other, *args, **kwargs)
8c1f2b07c04b outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents: 483
diff changeset
164 extensions.wrapfunction(discovery, 'findcommonoutgoing', findcommonoutgoing)
344
af48a5961432 Add just enough code to handle changes to cset discovery.
Augie Fackler <durin42@gmail.com>
parents: 334
diff changeset
165
412
5932586e6d43 Fix mercurial issue2855
Brendan Cully <brendan@kublai.com>
parents: 408
diff changeset
166 def getremotechanges(orig, ui, repo, other, *args, **opts):
408
2dcfd4bbfc1a Support for hg incoming
Brendan Cully <brendan@kublai.com>
parents: 389
diff changeset
167 if isinstance(other, gitrepo.gitrepo):
424
d2c4333e5f14 getremotechanges: fix incoming support
Augie Fackler <durin42@gmail.com>
parents: 412
diff changeset
168 if args:
d2c4333e5f14 getremotechanges: fix incoming support
Augie Fackler <durin42@gmail.com>
parents: 412
diff changeset
169 revs = args[0]
d2c4333e5f14 getremotechanges: fix incoming support
Augie Fackler <durin42@gmail.com>
parents: 412
diff changeset
170 else:
d2c4333e5f14 getremotechanges: fix incoming support
Augie Fackler <durin42@gmail.com>
parents: 412
diff changeset
171 revs = opts.get('onlyheads', opts.get('revs'))
667
b5ef3f0e0efe getremotechanges: use githandler from repo
Siddharth Agarwal <sid0@fb.com>
parents: 666
diff changeset
172 r, c, cleanup = repo.githandler.getremotechanges(other, revs)
408
2dcfd4bbfc1a Support for hg incoming
Brendan Cully <brendan@kublai.com>
parents: 389
diff changeset
173 # ugh. This is ugly even by mercurial API compatibility standards
2dcfd4bbfc1a Support for hg incoming
Brendan Cully <brendan@kublai.com>
parents: 389
diff changeset
174 if 'onlyheads' not in orig.func_code.co_varnames:
2dcfd4bbfc1a Support for hg incoming
Brendan Cully <brendan@kublai.com>
parents: 389
diff changeset
175 cleanup = None
2dcfd4bbfc1a Support for hg incoming
Brendan Cully <brendan@kublai.com>
parents: 389
diff changeset
176 return r, c, cleanup
412
5932586e6d43 Fix mercurial issue2855
Brendan Cully <brendan@kublai.com>
parents: 408
diff changeset
177 return orig(ui, repo, other, *args, **opts)
677
73cf8d292dcb getremotechanges: drop support for Mercurial < 1.7
Siddharth Agarwal <sid0@fb.com>
parents: 676
diff changeset
178 extensions.wrapfunction(bundlerepo, 'getremotechanges', getremotechanges)
408
2dcfd4bbfc1a Support for hg incoming
Brendan Cully <brendan@kublai.com>
parents: 389
diff changeset
179
556
affd119533ae peer: pass localrepo to new gitrepo instances
David M. Carr <david@carrclan.us>
parents: 546
diff changeset
180 def peer(orig, uiorrepo, *args, **opts):
affd119533ae peer: pass localrepo to new gitrepo instances
David M. Carr <david@carrclan.us>
parents: 546
diff changeset
181 newpeer = orig(uiorrepo, *args, **opts)
affd119533ae peer: pass localrepo to new gitrepo instances
David M. Carr <david@carrclan.us>
parents: 546
diff changeset
182 if isinstance(newpeer, gitrepo.gitrepo):
affd119533ae peer: pass localrepo to new gitrepo instances
David M. Carr <david@carrclan.us>
parents: 546
diff changeset
183 if isinstance(uiorrepo, localrepo.localrepository):
affd119533ae peer: pass localrepo to new gitrepo instances
David M. Carr <david@carrclan.us>
parents: 546
diff changeset
184 newpeer.localrepo = uiorrepo
affd119533ae peer: pass localrepo to new gitrepo instances
David M. Carr <david@carrclan.us>
parents: 546
diff changeset
185 return newpeer
affd119533ae peer: pass localrepo to new gitrepo instances
David M. Carr <david@carrclan.us>
parents: 546
diff changeset
186 extensions.wrapfunction(hg, 'peer', peer)
affd119533ae peer: pass localrepo to new gitrepo instances
David M. Carr <david@carrclan.us>
parents: 546
diff changeset
187
483
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
188 def revset_fromgit(repo, subset, x):
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
189 '''``fromgit()``
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
190 Select changesets that originate from Git.
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
191 '''
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
192 args = revset.getargs(x, 0, 0, "fromgit takes no arguments")
668
98e118410521 revset_fromgit: use githandler from repo
Siddharth Agarwal <sid0@fb.com>
parents: 667
diff changeset
193 git = repo.githandler
714
5770a5a8bc00 revset_fromgit: use repo.changelog.node instead of contexts
Siddharth Agarwal <sid0@fb.com>
parents: 713
diff changeset
194 node = repo.changelog.node
5770a5a8bc00 revset_fromgit: use repo.changelog.node instead of contexts
Siddharth Agarwal <sid0@fb.com>
parents: 713
diff changeset
195 return [r for r in subset if git.map_git_get(hex(node(r))) is not None]
483
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
196
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
197 def revset_gitnode(repo, subset, x):
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
198 '''``gitnode(hash)``
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
199 Select changesets that originate in the given Git revision.
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
200 '''
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
201 args = revset.getargs(x, 1, 1, "gitnode takes one argument")
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
202 rev = revset.getstring(args[0],
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
203 "the argument to gitnode() must be a hash")
669
b8fff2f4e963 revset_gitnode: use githandler from repo
Siddharth Agarwal <sid0@fb.com>
parents: 668
diff changeset
204 git = repo.githandler
713
96f0463a4e54 revset_gitnode: use repo.changelog.node instead of contexts
Siddharth Agarwal <sid0@fb.com>
parents: 706
diff changeset
205 node = repo.changelog.node
483
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
206 def matches(r):
713
96f0463a4e54 revset_gitnode: use repo.changelog.node instead of contexts
Siddharth Agarwal <sid0@fb.com>
parents: 706
diff changeset
207 gitnode = git.map_git_get(hex(node(r)))
483
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
208 if gitnode is None:
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
209 return False
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
210 return rev in [gitnode, gitnode[:12]]
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
211 return [r for r in subset if matches(r)]
d2caea269670 revsets: add fromgit and gitnode selectors
David M. Carr <david@carrclan.us>
parents: 482
diff changeset
212
482
00d591868a2f templatekw: add support for gitnode template keyword
David M. Carr <david@carrclan.us>
parents: 481
diff changeset
213 def gitnodekw(**args):
00d591868a2f templatekw: add support for gitnode template keyword
David M. Carr <david@carrclan.us>
parents: 481
diff changeset
214 """:gitnode: String. The Git changeset identification hash, as a 40 hexadecimal digit string."""
00d591868a2f templatekw: add support for gitnode template keyword
David M. Carr <david@carrclan.us>
parents: 481
diff changeset
215 node = args['ctx']
00d591868a2f templatekw: add support for gitnode template keyword
David M. Carr <david@carrclan.us>
parents: 481
diff changeset
216 repo = args['repo']
670
ab3c64db47d8 gitnodekw: use githandler from repo
Siddharth Agarwal <sid0@fb.com>
parents: 669
diff changeset
217 gitnode = repo.githandler.map_git_get(node.hex())
482
00d591868a2f templatekw: add support for gitnode template keyword
David M. Carr <david@carrclan.us>
parents: 481
diff changeset
218 if gitnode is None:
00d591868a2f templatekw: add support for gitnode template keyword
David M. Carr <david@carrclan.us>
parents: 481
diff changeset
219 gitnode = ''
00d591868a2f templatekw: add support for gitnode template keyword
David M. Carr <david@carrclan.us>
parents: 481
diff changeset
220 return gitnode
00d591868a2f templatekw: add support for gitnode template keyword
David M. Carr <david@carrclan.us>
parents: 481
diff changeset
221
0
06366111af3c initial import of the hg-git bridging extension for mercurial
Scott Chacon <schacon@gmail.com>
parents:
diff changeset
222 cmdtable = {
137
5aefcbf1e50c add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 136
diff changeset
223 "gimport":
5aefcbf1e50c add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 136
diff changeset
224 (gimport, [], _('hg gimport')),
97
f0628f5270b6 add gexport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 63
diff changeset
225 "gexport":
f0628f5270b6 add gexport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 63
diff changeset
226 (gexport, [], _('hg gexport')),
40
f5b000ec7100 added gclear command to remove all the git data
Scott Chacon <schacon@gmail.com>
parents: 39
diff changeset
227 "gclear":
f5b000ec7100 added gclear command to remove all the git data
Scott Chacon <schacon@gmail.com>
parents: 39
diff changeset
228 (gclear, [], _('Clears out the Git cached data')),
298
6ad6945b6629 pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents: 297
diff changeset
229 "git-cleanup": (git_cleanup, [], _(
693
9b194d7c9c03 verify: add new command to verify the contents of a Mercurial rev
Siddharth Agarwal <sid0@fb.com>
parents: 677
diff changeset
230 "Cleans up git repository after history editing")),
9b194d7c9c03 verify: add new command to verify the contents of a Mercurial rev
Siddharth Agarwal <sid0@fb.com>
parents: 677
diff changeset
231 "gverify": (verify.verify,
9b194d7c9c03 verify: add new command to verify the contents of a Mercurial rev
Siddharth Agarwal <sid0@fb.com>
parents: 677
diff changeset
232 [('r', 'rev', '', _('revision to verify'), _('REV'))], _('[-r REV]')),
182
9bdd8e76bbab Remove remotes support (use the paths section in hgrc instead)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents: 180
diff changeset
233 }