Mercurial > hg > hg-git
annotate hggit/git_handler.py @ 710:5c7943ca051f
hg2git: start incremental conversion from a known commit
Previously, we'd spin up the Mercurial incremental exporter from the null
commit and build up state from there. This meant that for the first exported
commit, we'd have to read all the files in that commit and compute Git blobs
and trees based on that.
The current Mercurial to Git conversion scheme makes most sense with
Mercurial's current default storage format, where manifests are diffed against
the numerically previous revision. At some point in the future, the default
will switch to generaldelta, where manifests would be diffed against one of
their parents. In that world it might make more sense to have a stateless
exporter that diffed each commit against its generaldelta parent and calculated
dirty trees based on that instead. However, more experiments need to be done to
see what export scheme is best.
For a repo with around 50,000 files, this brings down an incremental 'hg
gexport' of one commit from 18 seconds with a hot file cache (and tens of
minutes with a cold one) to around 2 seconds with a hot file cache.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Fri, 14 Mar 2014 20:45:09 -0700 |
parents | 4f0a154ae374 |
children | 268b9f6ed1c8 |
rev | line source |
---|---|
635
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1 import os, math, urllib, urllib2, re |
476
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
2 import stat, posixpath, StringIO |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
3 |
523
8c1f2b07c04b
outgoing: re-introduce support for outgoing
David M. Carr <david@carrclan.us>
parents:
490
diff
changeset
|
4 from dulwich.errors import HangupException, GitProtocolError, UpdateRefsError |
476
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
5 from dulwich.objects import Blob, Commit, Tag, Tree, parse_timezone, S_IFGITLINK |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
6 from dulwich.pack import create_delta, apply_delta |
602
65d8a43bc5ee
git_handler: skip exporting hg tags whose names are not valid as git tag name
nsuke <nsukeg@gmail.com>
parents:
597
diff
changeset
|
7 from dulwich.repo import Repo, check_ref_format |
285
5e5aee9b32d4
git_handler: slight style cleanup
Augie Fackler <durin42@gmail.com>
parents:
284
diff
changeset
|
8 from dulwich import client |
476
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
9 from dulwich import config as dul_config |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
10 |
375
454fc525ac75
support upcoming Mercurial 1.8
Kevin Bullock <kbullock@ringworld.org>
parents:
374
diff
changeset
|
11 try: |
454fc525ac75
support upcoming Mercurial 1.8
Kevin Bullock <kbullock@ringworld.org>
parents:
374
diff
changeset
|
12 from mercurial import bookmarks |
454fc525ac75
support upcoming Mercurial 1.8
Kevin Bullock <kbullock@ringworld.org>
parents:
374
diff
changeset
|
13 bookmarks.update |
379
ed8034b1cb0d
Made hggit.git_handler.get_changed_refs try to use commands.bookmark before trying with bookmarks.bookmark, for compatibility with Mercurial 1.8+.
DontCare4Free <webmaster@dontcare4free.tk>
parents:
376
diff
changeset
|
14 from mercurial import commands |
375
454fc525ac75
support upcoming Mercurial 1.8
Kevin Bullock <kbullock@ringworld.org>
parents:
374
diff
changeset
|
15 except ImportError: |
454fc525ac75
support upcoming Mercurial 1.8
Kevin Bullock <kbullock@ringworld.org>
parents:
374
diff
changeset
|
16 from hgext import bookmarks |
439
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
17 try: |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
18 from mercurial.error import RepoError |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
19 except ImportError: |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
20 from mercurial.repo import RepoError |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
21 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
22 from mercurial.i18n import _ |
188
5d48a2310e16
Use mercurial.node.bin instead of dulwich.objects.hex_to_sha
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
187
diff
changeset
|
23 from mercurial.node import hex, bin, nullid |
222
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
24 from mercurial import context, util as hgutil |
300
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
25 from mercurial import error |
222
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
26 |
369
e5c743cd0da1
pass hg's ui.ssh config to dulwich
Tay Ray Chuan <rctay89@gmail.com>
parents:
368
diff
changeset
|
27 import _ssh |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
28 import hg2git |
320
6eded2e4c616
Un-break hg 1.3 by adding a compat layer for progress.
Augie Fackler <durin42@gmail.com>
parents:
317
diff
changeset
|
29 import util |
408 | 30 from overlay import overlayrepo |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
31 |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
32 |
537
6e05aa1b536d
Optimize get_git_author
Gregory Szorc <gregory.szorc@gmail.com>
parents:
523
diff
changeset
|
33 RE_GIT_AUTHOR = re.compile('^(.*?) ?\<(.*?)(?:\>(.*))?$') |
6e05aa1b536d
Optimize get_git_author
Gregory Szorc <gregory.szorc@gmail.com>
parents:
523
diff
changeset
|
34 |
539
7bf60690386c
Precompile Git username sanitizing regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
538
diff
changeset
|
35 RE_GIT_SANITIZE_AUTHOR = re.compile('[<>\n]') |
7bf60690386c
Precompile Git username sanitizing regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
538
diff
changeset
|
36 |
540
3fb942852b1c
Precompile Git author extra data regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
539
diff
changeset
|
37 RE_GIT_AUTHOR_EXTRA = re.compile('^(.*?)\ ext:\((.*)\) <(.*)\>$') |
3fb942852b1c
Precompile Git author extra data regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
539
diff
changeset
|
38 |
538
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
39 # Test for git:// and git+ssh:// URI. |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
40 # Support several URL forms, including separating the |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
41 # host and path with either a / or : (sepr) |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
42 RE_GIT_URI = re.compile( |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
43 r'^(?P<scheme>git([+]ssh)?://)(?P<host>.*?)(:(?P<port>\d+))?' |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
44 r'(?P<sepr>[:/])(?P<path>.*)$') |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
45 |
541
df1598b722e8
Precompile Git progress regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
540
diff
changeset
|
46 RE_NEWLINES = re.compile('[\r\n]') |
df1598b722e8
Precompile Git progress regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
540
diff
changeset
|
47 RE_GIT_PROGRESS = re.compile('\((\d+)/(\d+)\)') |
df1598b722e8
Precompile Git progress regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
540
diff
changeset
|
48 |
542
c9faba7d01f4
Precompile author file regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
541
diff
changeset
|
49 RE_AUTHOR_FILE = re.compile('\s*=\s*') |
c9faba7d01f4
Precompile author file regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
541
diff
changeset
|
50 |
411
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
51 class GitProgress(object): |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
52 """convert git server progress strings into mercurial progress""" |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
53 def __init__(self, ui): |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
54 self.ui = ui |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
55 |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
56 self.lasttopic = None |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
57 self.msgbuf = '' |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
58 |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
59 def progress(self, msg): |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
60 # 'Counting objects: 33640, done.\n' |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
61 # 'Compressing objects: 0% (1/9955) \r |
541
df1598b722e8
Precompile Git progress regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
540
diff
changeset
|
62 msgs = RE_NEWLINES.split(self.msgbuf + msg) |
411
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
63 self.msgbuf = msgs.pop() |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
64 |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
65 for msg in msgs: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
66 td = msg.split(':', 1) |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
67 data = td.pop() |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
68 if not td: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
69 self.flush(data) |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
70 continue |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
71 topic = td[0] |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
72 |
541
df1598b722e8
Precompile Git progress regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
540
diff
changeset
|
73 m = RE_GIT_PROGRESS.search(data) |
411
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
74 if m: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
75 if self.lasttopic and self.lasttopic != topic: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
76 self.flush() |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
77 self.lasttopic = topic |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
78 |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
79 pos, total = map(int, m.group(1, 2)) |
686
c7129c72baff
git_handler: replace util.progress with ui.progress
Siddharth Agarwal <sid0@fb.com>
parents:
684
diff
changeset
|
80 self.ui.progress(topic, pos, total=total) |
411
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
81 else: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
82 self.flush(msg) |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
83 |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
84 def flush(self, msg=None): |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
85 if self.lasttopic: |
689
1323058cc652
git_handler: fix call to self.ui.progress in flush
Siddharth Agarwal <sid0@fb.com>
parents:
688
diff
changeset
|
86 self.ui.progress(self.lasttopic, None) |
411
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
87 self.lasttopic = None |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
88 if msg: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
89 self.ui.note(msg + '\n') |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
90 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
91 class GitHandler(object): |
298
6ad6945b6629
pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents:
293
diff
changeset
|
92 mapfile = 'git-mapfile' |
6ad6945b6629
pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents:
293
diff
changeset
|
93 tagsfile = 'git-tags' |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
94 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
95 def __init__(self, dest_repo, ui): |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
96 self.repo = dest_repo |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
97 self.ui = ui |
133
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
98 |
324
f0c1c35d95ba
explicitly expect boolean values for git.intree
Tay Ray Chuan <rctay89@gmail.com>
parents:
320
diff
changeset
|
99 if ui.configbool('git', 'intree'): |
133
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
100 self.gitdir = self.repo.wjoin('.git') |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
101 else: |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
102 self.gitdir = self.repo.join('git') |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
103 |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
104 self.init_author_file() |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
105 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
106 self.paths = ui.configitems('paths') |
141
a989866eead8
Make it possible to limit what branches are imported
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
140
diff
changeset
|
107 |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
108 self.branch_bookmark_suffix = ui.config('git', 'branch_bookmark_suffix') |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
109 |
552
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
110 self._map_git_real = {} |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
111 self._map_hg_real = {} |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
112 self.load_tags() |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
113 |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
114 @property |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
115 def _map_git(self): |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
116 if not self._map_git_real: |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
117 self.load_map() |
552
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
118 return self._map_git_real |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
119 |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
120 @property |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
121 def _map_hg(self): |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
122 if not self._map_hg_real: |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
123 self.load_map() |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
124 return self._map_hg_real |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
125 |
692
6ab17ae0c834
git_handler: make self.git a lazily evaluated property
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
126 @hgutil.propertycache |
6ab17ae0c834
git_handler: make self.git a lazily evaluated property
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
127 def git(self): |
6ab17ae0c834
git_handler: make self.git a lazily evaluated property
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
128 # make the git data directory |
258
1590c97d7af0
do not init the cache git repo unless needed (fixes issue 16 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
248
diff
changeset
|
129 if os.path.exists(self.gitdir): |
692
6ab17ae0c834
git_handler: make self.git a lazily evaluated property
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
130 return Repo(self.gitdir) |
258
1590c97d7af0
do not init the cache git repo unless needed (fixes issue 16 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
248
diff
changeset
|
131 else: |
106
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
132 os.mkdir(self.gitdir) |
692
6ab17ae0c834
git_handler: make self.git a lazily evaluated property
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
133 return Repo.init_bare(self.gitdir) |
6ab17ae0c834
git_handler: make self.git a lazily evaluated property
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
134 |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
135 def init_author_file(self): |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
136 self.author_map = {} |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
137 if self.ui.config('git', 'authors'): |
554
cac070a4b521
git_handler: replace with-statement with try-finally
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
553
diff
changeset
|
138 f = open(self.repo.wjoin( |
cac070a4b521
git_handler: replace with-statement with try-finally
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
553
diff
changeset
|
139 self.ui.config('git', 'authors'))) |
cac070a4b521
git_handler: replace with-statement with try-finally
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
553
diff
changeset
|
140 try: |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
141 for line in f: |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
142 line = line.strip() |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
143 if not line or line.startswith('#'): |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
144 continue |
542
c9faba7d01f4
Precompile author file regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
541
diff
changeset
|
145 from_, to = RE_AUTHOR_FILE.split(line, 2) |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
146 self.author_map[from_] = to |
554
cac070a4b521
git_handler: replace with-statement with try-finally
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
553
diff
changeset
|
147 finally: |
cac070a4b521
git_handler: replace with-statement with try-finally
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
553
diff
changeset
|
148 f.close() |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
149 |
14
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
150 ## FILE LOAD AND SAVE METHODS |
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
151 |
21
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
152 def map_set(self, gitsha, hgsha): |
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
153 self._map_git[gitsha] = hgsha |
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
154 self._map_hg[hgsha] = gitsha |
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
155 |
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
156 def map_hg_get(self, gitsha): |
213
61471faeb7fd
small cleanups (tabs, s/TODO :/TODO:/ and dead code)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
212
diff
changeset
|
157 return self._map_git.get(gitsha) |
21
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
158 |
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
159 def map_git_get(self, hgsha): |
213
61471faeb7fd
small cleanups (tabs, s/TODO :/TODO:/ and dead code)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
212
diff
changeset
|
160 return self._map_hg.get(hgsha) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
161 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
162 def load_map(self): |
105
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
163 if os.path.exists(self.repo.join(self.mapfile)): |
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
164 for line in self.repo.opener(self.mapfile): |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
165 gitsha, hgsha = line.strip().split(' ', 1) |
552
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
166 self._map_git_real[gitsha] = hgsha |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
167 self._map_hg_real[hgsha] = gitsha |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
168 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
169 def save_map(self): |
105
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
170 file = self.repo.opener(self.mapfile, 'w+', atomictemp=True) |
238
028de6256c2b
switch object mapping to hg->git since the many to one is that direction
Sverre Rabbelier <srabbelier@google.com>
parents:
237
diff
changeset
|
171 for hgsha, gitsha in sorted(self._map_hg.iteritems()): |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
172 file.write("%s %s\n" % (gitsha, hgsha)) |
682
acb429c62c28
git_handler.save_map: drop support for Mercurial < 1.9
Siddharth Agarwal <sid0@fb.com>
parents:
655
diff
changeset
|
173 # If this complains, atomictempfile no longer has close |
acb429c62c28
git_handler.save_map: drop support for Mercurial < 1.9
Siddharth Agarwal <sid0@fb.com>
parents:
655
diff
changeset
|
174 file.close() |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
175 |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
176 def load_tags(self): |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
177 self.tags = {} |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
178 if os.path.exists(self.repo.join(self.tagsfile)): |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
179 for line in self.repo.opener(self.tagsfile): |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
180 sha, name = line.strip().split(' ', 1) |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
181 self.tags[name] = sha |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
182 |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
183 def save_tags(self): |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
184 file = self.repo.opener(self.tagsfile, 'w+', atomictemp=True) |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
185 for name, sha in sorted(self.tags.iteritems()): |
212
174954c187e0
fix pushing tags to git (see issue 3 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
210
diff
changeset
|
186 if not self.repo.tagtype(name) == 'global': |
174954c187e0
fix pushing tags to git (see issue 3 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
210
diff
changeset
|
187 file.write("%s %s\n" % (sha, name)) |
683
2cfda7bc4c46
git_handler.save_tags: drop support for Mercurial < 1.9
Siddharth Agarwal <sid0@fb.com>
parents:
682
diff
changeset
|
188 # If this complains, atomictempfile no longer has close |
2cfda7bc4c46
git_handler.save_tags: drop support for Mercurial < 1.9
Siddharth Agarwal <sid0@fb.com>
parents:
682
diff
changeset
|
189 file.close() |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
190 |
14
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
191 ## END FILE LOAD AND SAVE METHODS |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
192 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
193 ## COMMANDS METHODS |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
194 |
137
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
195 def import_commits(self, remote_name): |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
196 self.import_git_objects(remote_name) |
422 | 197 self.update_hg_bookmarks(self.git.get_refs()) |
137
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
198 self.save_map() |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
199 |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
200 def fetch(self, remote, heads): |
236
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
201 self.export_commits() |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
202 refs = self.fetch_pack(remote, heads) |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
203 remote_name = self.remote_name(remote) |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
204 |
397
60d181f9ecc3
Make pull results more like hg pulls.
Brendan Cully <brendan@kublai.com>
parents:
395
diff
changeset
|
205 oldrefs = self.git.get_refs() |
704
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
206 oldheads = self.repo.changelog.heads() |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
207 imported = 0 |
56 | 208 if refs: |
705
373f854ff58f
git_handler.fetch: only import commits reachable from requested heads
Siddharth Agarwal <sid0@fb.com>
parents:
704
diff
changeset
|
209 filteredrefs = self.filter_refs(refs, heads) |
373f854ff58f
git_handler.fetch: only import commits reachable from requested heads
Siddharth Agarwal <sid0@fb.com>
parents:
704
diff
changeset
|
210 imported = self.import_git_objects(remote_name, filteredrefs) |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
211 self.import_tags(refs) |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
212 self.update_hg_bookmarks(refs) |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
213 if remote_name: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
214 self.update_remote_branches(remote_name, refs) |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
215 elif not self.paths: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
216 # intial cloning |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
217 self.update_remote_branches('default', refs) |
387
ed28dd69df61
git_handler: support versions of hg without bookmarks
Augie Fackler <durin42@gmail.com>
parents:
385
diff
changeset
|
218 |
384
fc37cb795b51
activate a tipmost bookmark (git branch) after clone
Adrian Sampson <adrian@radbox.org>
parents:
382
diff
changeset
|
219 # "Activate" a tipmost bookmark. |
387
ed28dd69df61
git_handler: support versions of hg without bookmarks
Augie Fackler <durin42@gmail.com>
parents:
385
diff
changeset
|
220 bms = getattr(self.repo['tip'], 'bookmarks', |
ed28dd69df61
git_handler: support versions of hg without bookmarks
Augie Fackler <durin42@gmail.com>
parents:
385
diff
changeset
|
221 lambda : None)() |
384
fc37cb795b51
activate a tipmost bookmark (git branch) after clone
Adrian Sampson <adrian@radbox.org>
parents:
382
diff
changeset
|
222 if bms: |
fc37cb795b51
activate a tipmost bookmark (git branch) after clone
Adrian Sampson <adrian@radbox.org>
parents:
382
diff
changeset
|
223 bookmarks.setcurrent(self.repo, bms[0]) |
397
60d181f9ecc3
Make pull results more like hg pulls.
Brendan Cully <brendan@kublai.com>
parents:
395
diff
changeset
|
224 |
60d181f9ecc3
Make pull results more like hg pulls.
Brendan Cully <brendan@kublai.com>
parents:
395
diff
changeset
|
225 def remoteref(ref): |
60d181f9ecc3
Make pull results more like hg pulls.
Brendan Cully <brendan@kublai.com>
parents:
395
diff
changeset
|
226 rn = remote_name or 'default' |
60d181f9ecc3
Make pull results more like hg pulls.
Brendan Cully <brendan@kublai.com>
parents:
395
diff
changeset
|
227 return 'refs/remotes/' + rn + ref[10:] |
60d181f9ecc3
Make pull results more like hg pulls.
Brendan Cully <brendan@kublai.com>
parents:
395
diff
changeset
|
228 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
229 self.save_map() |
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
230 |
704
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
231 if imported == 0: |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
232 return 0 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
233 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
234 # code taken from localrepo.py:addchangegroup |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
235 dh = 0 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
236 if oldheads: |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
237 heads = self.repo.changelog.heads() |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
238 dh = len(heads) - len(oldheads) |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
239 for h in heads: |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
240 if h not in oldheads and self.repo[h].closesbranch(): |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
241 dh -= 1 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
242 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
243 if dh < 0: |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
244 return dh - 1 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
245 else: |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
246 return dh + 1 |
397
60d181f9ecc3
Make pull results more like hg pulls.
Brendan Cully <brendan@kublai.com>
parents:
395
diff
changeset
|
247 |
236
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
248 def export_commits(self): |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
249 try: |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
250 self.export_git_objects() |
236
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
251 self.export_hg_tags() |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
252 self.update_references() |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
253 finally: |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
254 self.save_map() |
97 | 255 |
231
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
256 def get_refs(self, remote): |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
257 self.export_commits() |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
258 client, path = self.get_transport_and_path(remote) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
259 old_refs = {} |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
260 new_refs = {} |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
261 def changed(refs): |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
262 old_refs.update(refs) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
263 to_push = set(self.local_heads().values() + self.tags.values()) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
264 new_refs.update(self.get_changed_refs(refs, to_push, True)) |
544
ebf4ea20ade5
outgoing: don't delete remote refs
David M. Carr <david@carrclan.us>
parents:
543
diff
changeset
|
265 return refs # always return the same refs to make the send a no-op |
231
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
266 |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
267 try: |
442
553dd7078058
Update for newer dulwich and hg versions.
Augie Fackler <durin42@gmail.com>
parents:
441
diff
changeset
|
268 client.send_pack(path, changed, lambda have, want: []) |
243
53b731d2a3e2
outgoing: don't crash when there are unpulled changesets
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
242
diff
changeset
|
269 |
53b731d2a3e2
outgoing: don't crash when there are unpulled changesets
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
242
diff
changeset
|
270 changed_refs = [ref for ref, sha in new_refs.iteritems() |
53b731d2a3e2
outgoing: don't crash when there are unpulled changesets
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
242
diff
changeset
|
271 if sha != old_refs.get(ref)] |
53b731d2a3e2
outgoing: don't crash when there are unpulled changesets
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
242
diff
changeset
|
272 new = [bin(self.map_hg_get(new_refs[ref])) for ref in changed_refs] |
418
10027b50202b
In some situations where a reference is being used but does not exist in _map_git or _map_hg, silently skip the reference rather than throwing an error. This allows hg outgoing to work on repositories which do not contain any revisions at all.
mcc <andrew.mcclure@gmail.com>
parents:
415
diff
changeset
|
273 old = {} |
10027b50202b
In some situations where a reference is being used but does not exist in _map_git or _map_hg, silently skip the reference rather than throwing an error. This allows hg outgoing to work on repositories which do not contain any revisions at all.
mcc <andrew.mcclure@gmail.com>
parents:
415
diff
changeset
|
274 for r in old_refs: |
10027b50202b
In some situations where a reference is being used but does not exist in _map_git or _map_hg, silently skip the reference rather than throwing an error. This allows hg outgoing to work on repositories which do not contain any revisions at all.
mcc <andrew.mcclure@gmail.com>
parents:
415
diff
changeset
|
275 old_ref = self.map_hg_get(old_refs[r]) |
10027b50202b
In some situations where a reference is being used but does not exist in _map_git or _map_hg, silently skip the reference rather than throwing an error. This allows hg outgoing to work on repositories which do not contain any revisions at all.
mcc <andrew.mcclure@gmail.com>
parents:
415
diff
changeset
|
276 if old_ref: |
10027b50202b
In some situations where a reference is being used but does not exist in _map_git or _map_hg, silently skip the reference rather than throwing an error. This allows hg outgoing to work on repositories which do not contain any revisions at all.
mcc <andrew.mcclure@gmail.com>
parents:
415
diff
changeset
|
277 old[bin(old_ref)] = 1 |
231
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
278 |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
279 return old, new |
391
9b6597b70839
Improve error reporting in get_refs
Brendan Cully <brendan@kublai.com>
parents:
387
diff
changeset
|
280 except (HangupException, GitProtocolError), e: |
9b6597b70839
Improve error reporting in get_refs
Brendan Cully <brendan@kublai.com>
parents:
387
diff
changeset
|
281 raise hgutil.Abort(_("git remote error: ") + str(e)) |
231
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
282 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
283 def push(self, remote, revs, force): |
221
4be68870dc44
do not pull from git when asked to push
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
219
diff
changeset
|
284 self.export_commits() |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
285 old_refs, new_refs = self.upload_pack(remote, revs, force) |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
286 remote_name = self.remote_name(remote) |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
287 |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
288 if remote_name and new_refs: |
622
09028a1e9895
git_handler: iterate over new refs in sorted order to stabilize test output
Augie Fackler <raf@durin42.com>
parents:
617
diff
changeset
|
289 for ref, new_sha in sorted(new_refs.iteritems()): |
593
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
290 old_sha = old_refs.get(ref) |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
291 if old_sha is None: |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
292 if self.ui.verbose: |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
293 self.ui.note("adding reference %s::%s => GIT:%s\n" % |
559
d4ccec82b816
push: suppress ref output by default
David M. Carr <david@carrclan.us>
parents:
557
diff
changeset
|
294 (remote_name, ref, new_sha[0:8])) |
593
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
295 else: |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
296 self.ui.status("adding reference %s\n" % ref) |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
297 elif new_sha != old_sha: |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
298 if self.ui.verbose: |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
299 self.ui.note("updating reference %s::%s => GIT:%s\n" % |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
300 (remote_name, ref, new_sha[0:8])) |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
301 else: |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
302 self.ui.status("updating reference %s\n" % ref) |
559
d4ccec82b816
push: suppress ref output by default
David M. Carr <david@carrclan.us>
parents:
557
diff
changeset
|
303 else: |
593
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
304 self.ui.debug("unchanged reference %s::%s => GIT:%s\n" % |
488
4793c3725abe
push: only output updated refs
David M. Carr <david@carrclan.us>
parents:
487
diff
changeset
|
305 (remote_name, ref, new_sha[0:8])) |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
306 |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
307 self.update_remote_branches(remote_name, new_refs) |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
308 if old_refs == new_refs: |
489
ccd521a1f585
push: state when no changes are found
David M. Carr <david@carrclan.us>
parents:
488
diff
changeset
|
309 self.ui.status(_("no changes found\n")) |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
310 ret = None |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
311 elif len(new_refs) > len(old_refs): |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
312 ret = 1 + (len(new_refs) - len(old_refs)) |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
313 elif len(old_refs) > len(new_refs): |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
314 ret = -1 - (len(new_refs) - len(old_refs)) |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
315 else: |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
316 ret = 1 |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
317 return ret |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
318 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
319 def clear(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
320 mapfile = self.repo.join(self.mapfile) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
321 if os.path.exists(self.gitdir): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
322 for root, dirs, files in os.walk(self.gitdir, topdown=False): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
323 for name in files: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
324 os.remove(os.path.join(root, name)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
325 for name in dirs: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
326 os.rmdir(os.path.join(root, name)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
327 os.rmdir(self.gitdir) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
328 if os.path.exists(mapfile): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
329 os.remove(mapfile) |
124
9dafb9ac24ff
hg bookmarks to local git branches
Ian Dees <undees@gmail.com>
parents:
118
diff
changeset
|
330 |
408 | 331 # incoming support |
332 def getremotechanges(self, remote, revs): | |
333 self.export_commits() | |
334 refs = self.fetch_pack(remote.path, revs) | |
335 | |
336 # refs contains all remote refs. Prune to only those requested. | |
337 if revs: | |
338 reqrefs = {} | |
339 for rev in revs: | |
340 for n in ('refs/heads/' + rev, 'refs/tags/' + rev): | |
341 if n in refs: | |
342 reqrefs[n] = refs[n] | |
343 else: | |
344 reqrefs = refs | |
345 | |
346 commits = [bin(c) for c in self.getnewgitcommits(reqrefs)[1]] | |
347 | |
348 b = overlayrepo(self, commits, refs) | |
349 | |
350 return (b, commits, lambda: None) | |
351 | |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
352 ## CHANGESET CONVERSION METHODS |
125 | 353 |
21
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
354 def export_git_objects(self): |
651
59f8ef69afb8
git_handler: use repo.changelog.node instead of repo.lookup
Siddharth Agarwal <sid0@fb.com>
parents:
645
diff
changeset
|
355 clnode = self.repo.changelog.node |
59f8ef69afb8
git_handler: use repo.changelog.node instead of repo.lookup
Siddharth Agarwal <sid0@fb.com>
parents:
645
diff
changeset
|
356 nodes = [clnode(n) for n in self.repo] |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
357 export = [node for node in nodes if not hex(node) in self._map_hg] |
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
358 total = len(export) |
709
4f0a154ae374
git_handler: return early when no commits need to be exported
Siddharth Agarwal <sid0@fb.com>
parents:
705
diff
changeset
|
359 if not total: |
4f0a154ae374
git_handler: return early when no commits need to be exported
Siddharth Agarwal <sid0@fb.com>
parents:
705
diff
changeset
|
360 return |
4f0a154ae374
git_handler: return early when no commits need to be exported
Siddharth Agarwal <sid0@fb.com>
parents:
705
diff
changeset
|
361 |
4f0a154ae374
git_handler: return early when no commits need to be exported
Siddharth Agarwal <sid0@fb.com>
parents:
705
diff
changeset
|
362 self.ui.note(_("exporting hg objects to git\n")) |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
363 |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
364 # By only exporting deltas, the assertion is that all previous objects |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
365 # for all other changesets are already present in the Git repository. |
710
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
366 # This assertion is necessary to prevent redundant work. Here, nodes, |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
367 # and therefore export, is in topological order. By definition, |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
368 # export[0]'s parents must be present in Git, so we start the |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
369 # incremental exporter from there. |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
370 pctx = self.repo[export[0]].p1() |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
371 pnode = pctx.node() |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
372 if pnode == nullid: |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
373 gitcommit = None |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
374 else: |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
375 gitsha = self._map_hg[hex(pnode)] |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
376 try: |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
377 gitcommit = self.git[gitsha] |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
378 except KeyError: |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
379 raise hgutil.Abort(_('Parent SHA-1 not present in Git' |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
380 'repo: %s' % gitsha)) |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
381 |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
382 exporter = hg2git.IncrementalChangesetExporter( |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
383 self.repo, pctx, self.git.object_store, gitcommit) |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
384 |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
385 for i, rev in enumerate(export): |
686
c7129c72baff
git_handler: replace util.progress with ui.progress
Siddharth Agarwal <sid0@fb.com>
parents:
684
diff
changeset
|
386 self.ui.progress('exporting', i, total=total) |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
387 ctx = self.repo.changectx(rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
388 state = ctx.extra().get('hg-git', None) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
389 if state == 'octopus': |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
390 self.ui.debug("revision %d is a part " |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
391 "of octopus explosion\n" % ctx.rev()) |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
392 continue |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
393 self.export_hg_commit(rev, exporter) |
686
c7129c72baff
git_handler: replace util.progress with ui.progress
Siddharth Agarwal <sid0@fb.com>
parents:
684
diff
changeset
|
394 self.ui.progress('exporting', None, total=total) |
286
0661d5721ad7
git_handler: use progress API instead of reinventing the wheel
Augie Fackler <durin42@gmail.com>
parents:
285
diff
changeset
|
395 |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
396 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
397 # convert this commit into git objects |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
398 # go through the manifest, convert all blobs/trees we don't have |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
399 # write the commit object (with metadata info) |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
400 def export_hg_commit(self, rev, exporter): |
301
09116995c421
export_hg_commit: fix debug note
Tay Ray Chuan <rctay89@gmail.com>
parents:
288
diff
changeset
|
401 self.ui.note(_("converting revision %s\n") % hex(rev)) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
402 |
203
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
403 oldenc = self.swap_out_encoding() |
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
404 |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
405 ctx = self.repo.changectx(rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
406 extra = ctx.extra() |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
407 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
408 commit = Commit() |
68
d28d3763eda3
Deal with hg authors missing email attributes.
Chris Wanstrath <chris@ozmm.org>
parents:
65
diff
changeset
|
409 |
235
912d6a5837c8
reorganize export_hg_commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
234
diff
changeset
|
410 (time, timezone) = ctx.date() |
594
ce6ad4c0cba7
scrub bad timezone values before dulwich sees them
Hal Wine <hwine@mozilla.com>
parents:
593
diff
changeset
|
411 # work around to bad timezone offets - dulwich does not handle |
ce6ad4c0cba7
scrub bad timezone values before dulwich sees them
Hal Wine <hwine@mozilla.com>
parents:
593
diff
changeset
|
412 # sub minute based timezones. In the one known case, it was a |
ce6ad4c0cba7
scrub bad timezone values before dulwich sees them
Hal Wine <hwine@mozilla.com>
parents:
593
diff
changeset
|
413 # manual edit that led to the unusual value. Based on that, |
ce6ad4c0cba7
scrub bad timezone values before dulwich sees them
Hal Wine <hwine@mozilla.com>
parents:
593
diff
changeset
|
414 # there is no reason to round one way or the other, so do the |
ce6ad4c0cba7
scrub bad timezone values before dulwich sees them
Hal Wine <hwine@mozilla.com>
parents:
593
diff
changeset
|
415 # simplest and round down. |
ce6ad4c0cba7
scrub bad timezone values before dulwich sees them
Hal Wine <hwine@mozilla.com>
parents:
593
diff
changeset
|
416 timezone -= (timezone % 60) |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
417 commit.author = self.get_git_author(ctx) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
418 commit.author_time = int(time) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
419 commit.author_timezone = -timezone |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
420 |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
421 if 'committer' in extra: |
131
dd6c77ec206c
store commitdate in mercurial's internal format.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
129
diff
changeset
|
422 # fixup timezone |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
423 (name, timestamp, timezone) = extra['committer'].rsplit(' ', 2) |
237
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
424 commit.committer = name |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
425 commit.commit_time = timestamp |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
426 |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
427 # work around a timezone format change |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
428 if int(timezone) % 60 != 0: #pragma: no cover |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
429 timezone = parse_timezone(timezone) |
360
c1fa188046d7
Looks like the latest version of Dulwich returns a tuple here. Let's handle that
Mike Blume <mike@loggly.com>
parents:
338
diff
changeset
|
430 # Newer versions of Dulwich return a tuple here |
c1fa188046d7
Looks like the latest version of Dulwich returns a tuple here. Let's handle that
Mike Blume <mike@loggly.com>
parents:
338
diff
changeset
|
431 if isinstance(timezone, tuple): |
c1fa188046d7
Looks like the latest version of Dulwich returns a tuple here. Let's handle that
Mike Blume <mike@loggly.com>
parents:
338
diff
changeset
|
432 timezone, neg_utc = timezone |
361 | 433 commit._commit_timezone_neg_utc = neg_utc |
237
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
434 else: |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
435 timezone = -int(timezone) |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
436 commit.commit_timezone = timezone |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
437 else: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
438 commit.committer = commit.author |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
439 commit.commit_time = commit.author_time |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
440 commit.commit_timezone = commit.author_timezone |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
441 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
442 commit.parents = [] |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
443 for parent in self.get_git_parents(ctx): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
444 hgsha = hex(parent.node()) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
445 git_sha = self.map_git_get(hgsha) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
446 if git_sha: |
543
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
447 if git_sha not in self.git.object_store: |
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
448 raise hgutil.Abort(_('Parent SHA-1 not present in Git' |
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
449 'repo: %s' % git_sha)) |
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
450 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
451 commit.parents.append(git_sha) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
452 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
453 commit.message = self.get_git_message(ctx) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
454 |
118
b3be536e3f50
handles git commit encoding fields now
Scott Chacon <schacon@gmail.com>
parents:
113
diff
changeset
|
455 if 'encoding' in extra: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
456 commit.encoding = extra['encoding'] |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
457 |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
458 for obj, nodeid in exporter.update_changeset(ctx): |
697
a7383625c891
git_handler: don't write out objects if already in object store
Siddharth Agarwal <sid0@fb.com>
parents:
693
diff
changeset
|
459 if obj.id not in self.git.object_store: |
a7383625c891
git_handler: don't write out objects if already in object store
Siddharth Agarwal <sid0@fb.com>
parents:
693
diff
changeset
|
460 self.git.object_store.add_object(obj) |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
461 |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
462 tree_sha = exporter.root_tree_sha |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
463 |
543
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
464 if tree_sha not in self.git.object_store: |
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
465 raise hgutil.Abort(_('Tree SHA-1 not present in Git repo: %s' % |
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
466 tree_sha)) |
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
467 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
468 commit.tree = tree_sha |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
469 |
697
a7383625c891
git_handler: don't write out objects if already in object store
Siddharth Agarwal <sid0@fb.com>
parents:
693
diff
changeset
|
470 if commit.id not in self.git.object_store: |
a7383625c891
git_handler: don't write out objects if already in object store
Siddharth Agarwal <sid0@fb.com>
parents:
693
diff
changeset
|
471 self.git.object_store.add_object(commit) |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
472 self.map_set(commit.id, ctx.hex()) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
473 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
474 self.swap_out_encoding(oldenc) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
475 return commit.id |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
476 |
432
ccd38138a3b3
Improve the parsing of author lines from Mercurial to generate committer and author lines that git can correctly understand
Ehsan Akhgari <ehsan.akhgari@gmail.com>
parents:
429
diff
changeset
|
477 def get_valid_git_username_email(self, name): |
448
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
478 r"""Sanitize usernames and emails to fit git's restrictions. |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
479 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
480 The following is taken from the man page of git's fast-import |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
481 command: |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
482 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
483 [...] Likewise LF means one (and only one) linefeed [...] |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
484 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
485 committer |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
486 The committer command indicates who made this commit, |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
487 and when they made it. |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
488 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
489 Here <name> is the person's display name (for example |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
490 "Com M Itter") and <email> is the person's email address |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
491 ("cm@example.com[1]"). LT and GT are the literal |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
492 less-than (\x3c) and greater-than (\x3e) symbols. These |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
493 are required to delimit the email address from the other |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
494 fields in the line. Note that <name> and <email> are |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
495 free-form and may contain any sequence of bytes, except |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
496 LT, GT and LF. <name> is typically UTF-8 encoded. |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
497 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
498 Accordingly, this function makes sure that there are none of the |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
499 characters <, >, or \n in any string which will be used for |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
500 a git username or email. Before this, it first removes left |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
501 angle brackets and spaces from the beginning, and right angle |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
502 brackets and spaces from the end, of this string, to convert |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
503 such things as " <john@doe.com> " to "john@doe.com" for |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
504 convenience. |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
505 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
506 TESTS: |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
507 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
508 >>> from mercurial.ui import ui |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
509 >>> g = GitHandler('', ui()).get_valid_git_username_email |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
510 >>> g('John Doe') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
511 'John Doe' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
512 >>> g('john@doe.com') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
513 'john@doe.com' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
514 >>> g(' <john@doe.com> ') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
515 'john@doe.com' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
516 >>> g(' <random<\n<garbage\n> > > ') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
517 'random???garbage?' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
518 >>> g('Typo in hgrc >but.hg-git@handles.it.gracefully>') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
519 'Typo in hgrc ?but.hg-git@handles.it.gracefully' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
520 """ |
539
7bf60690386c
Precompile Git username sanitizing regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
538
diff
changeset
|
521 return RE_GIT_SANITIZE_AUTHOR.sub('?', name.lstrip('< ').rstrip('> ')) |
432
ccd38138a3b3
Improve the parsing of author lines from Mercurial to generate committer and author lines that git can correctly understand
Ehsan Akhgari <ehsan.akhgari@gmail.com>
parents:
429
diff
changeset
|
522 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
523 def get_git_author(self, ctx): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
524 # hg authors might not have emails |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
525 author = ctx.user() |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
526 |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
527 # see if a translation exists |
537
6e05aa1b536d
Optimize get_git_author
Gregory Szorc <gregory.szorc@gmail.com>
parents:
523
diff
changeset
|
528 author = self.author_map.get(author, author) |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
529 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
530 # check for git author pattern compliance |
537
6e05aa1b536d
Optimize get_git_author
Gregory Szorc <gregory.szorc@gmail.com>
parents:
523
diff
changeset
|
531 a = RE_GIT_AUTHOR.match(author) |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
532 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
533 if a: |
448
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
534 name = self.get_valid_git_username_email(a.group(1)) |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
535 email = self.get_valid_git_username_email(a.group(2)) |
432
ccd38138a3b3
Improve the parsing of author lines from Mercurial to generate committer and author lines that git can correctly understand
Ehsan Akhgari <ehsan.akhgari@gmail.com>
parents:
429
diff
changeset
|
536 if a.group(3) != None and len(a.group(3)) != 0: |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
537 name += ' ext:(' + urllib.quote(a.group(3)) + ')' |
432
ccd38138a3b3
Improve the parsing of author lines from Mercurial to generate committer and author lines that git can correctly understand
Ehsan Akhgari <ehsan.akhgari@gmail.com>
parents:
429
diff
changeset
|
538 author = self.get_valid_git_username_email(name) + ' <' + self.get_valid_git_username_email(email) + '>' |
401
f17ca8ed620c
Use author as email when it is an email
César Izurieta <cesar@caih.org>
parents:
400
diff
changeset
|
539 elif '@' in author: |
432
ccd38138a3b3
Improve the parsing of author lines from Mercurial to generate committer and author lines that git can correctly understand
Ehsan Akhgari <ehsan.akhgari@gmail.com>
parents:
429
diff
changeset
|
540 author = self.get_valid_git_username_email(author) + ' <' + self.get_valid_git_username_email(author) + '>' |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
541 else: |
432
ccd38138a3b3
Improve the parsing of author lines from Mercurial to generate committer and author lines that git can correctly understand
Ehsan Akhgari <ehsan.akhgari@gmail.com>
parents:
429
diff
changeset
|
542 author = self.get_valid_git_username_email(author) + ' <none@none>' |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
543 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
544 if 'author' in ctx.extra(): |
307
7dfe8be21135
handle apply_delta() return value correctly
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
545 author = "".join(apply_delta(author, ctx.extra()['author'])) |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
546 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
547 return author |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
548 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
549 def get_git_parents(self, ctx): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
550 def is_octopus_part(ctx): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
551 return ctx.extra().get('hg-git', None) in ('octopus', 'octopus-done') |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
552 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
553 parents = [] |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
554 if ctx.extra().get('hg-git', None) == 'octopus-done': |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
555 # implode octopus parents |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
556 part = ctx |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
557 while is_octopus_part(part): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
558 (p1, p2) = part.parents() |
634
a836fc8f6c76
git_handler: don't bail on multiple octopus merges in succession
Siddharth Agarwal <sid0@fb.com>
parents:
630
diff
changeset
|
559 assert ctx.extra().get('hg-git', None) != 'octopus' |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
560 parents.append(p1) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
561 part = p2 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
562 parents.append(p2) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
563 else: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
564 parents = ctx.parents() |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
565 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
566 return parents |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
567 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
568 def get_git_message(self, ctx): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
569 extra = ctx.extra() |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
570 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
571 message = ctx.description() + "\n" |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
572 if 'message' in extra: |
307
7dfe8be21135
handle apply_delta() return value correctly
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
573 message = "".join(apply_delta(message, extra['message'])) |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
574 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
575 # HG EXTRA INFORMATION |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
576 add_extras = False |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
577 extra_message = '' |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
578 if not ctx.branch() == 'default': |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
579 add_extras = True |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
580 extra_message += "branch : " + ctx.branch() + "\n" |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
581 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
582 renames = [] |
247
3c01e07b0252
look for renamed files only in files modified by the commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
245
diff
changeset
|
583 for f in ctx.files(): |
3c01e07b0252
look for renamed files only in files modified by the commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
245
diff
changeset
|
584 if f not in ctx.manifest(): |
3c01e07b0252
look for renamed files only in files modified by the commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
245
diff
changeset
|
585 continue |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
586 rename = ctx.filectx(f).renamed() |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
587 if rename: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
588 renames.append((rename[0], f)) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
589 |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
590 if renames: |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
591 add_extras = True |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
592 for oldfile, newfile in renames: |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
593 extra_message += "rename : " + oldfile + " => " + newfile + "\n" |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
594 |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
595 for key, value in extra.iteritems(): |
203
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
596 if key in ('author', 'committer', 'encoding', 'message', 'branch', 'hg-git'): |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
597 continue |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
598 else: |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
599 add_extras = True |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
600 extra_message += "extra : " + key + " : " + urllib.quote(value) + "\n" |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
601 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
602 if add_extras: |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
603 message += "\n--HG--\n" + extra_message |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
604 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
605 return message |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
606 |
408 | 607 def getnewgitcommits(self, refs=None): |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
608 # import heads and fetched tags as remote references |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
609 todo = [] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
610 done = set() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
611 convert_list = {} |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
612 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
613 # get a list of all the head shas |
282
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
614 seenheads = set() |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
615 if refs is None: |
288
efe9e6a9235f
fix gimport and add test for using to work on hg repos from git (issue 73)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
287
diff
changeset
|
616 refs = self.git.refs.as_dict() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
617 if refs: |
282
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
618 for sha in refs.itervalues(): |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
619 # refs contains all the refs in the server, not just the ones |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
620 # we are pulling |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
621 if sha in self.git.object_store: |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
622 obj = self.git.get_object(sha) |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
623 while isinstance(obj, Tag): |
337
6cea997ee302
enforce stricter matching for pull -r
Tay Ray Chuan <rctay89@gmail.com>
parents:
258
diff
changeset
|
624 obj_type, sha = obj.object |
282
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
625 obj = self.git.get_object(sha) |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
626 if isinstance (obj, Commit) and sha not in seenheads: |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
627 seenheads.add(sha) |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
628 todo.append(sha) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
629 |
284
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
630 # sort by commit date |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
631 def commitdate(sha): |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
632 obj = self.git.get_object(sha) |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
633 return obj.commit_time-obj.commit_timezone |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
634 |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
635 todo.sort(key=commitdate, reverse=True) |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
636 |
653
4ab616864329
git_handler: note that new commits are returned in topo order
Siddharth Agarwal <sid0@fb.com>
parents:
652
diff
changeset
|
637 # traverse the heads getting a list of all the unique commits in |
4ab616864329
git_handler: note that new commits are returned in topo order
Siddharth Agarwal <sid0@fb.com>
parents:
652
diff
changeset
|
638 # topological order |
283
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
639 commits = [] |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
640 seen = set(todo) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
641 while todo: |
283
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
642 sha = todo[-1] |
655
baba2cf03d41
git_handler: terminate new commit DAG traversal at known commits
Siddharth Agarwal <sid0@fb.com>
parents:
654
diff
changeset
|
643 if sha in done or sha in self._map_git: |
283
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
644 todo.pop() |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
645 continue |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
646 assert isinstance(sha, str) |
654
f221c7b5bdfb
git_handler: use convert_list to cache git objects
Siddharth Agarwal <sid0@fb.com>
parents:
653
diff
changeset
|
647 if sha in convert_list: |
f221c7b5bdfb
git_handler: use convert_list to cache git objects
Siddharth Agarwal <sid0@fb.com>
parents:
653
diff
changeset
|
648 obj = convert_list[sha] |
f221c7b5bdfb
git_handler: use convert_list to cache git objects
Siddharth Agarwal <sid0@fb.com>
parents:
653
diff
changeset
|
649 else: |
f221c7b5bdfb
git_handler: use convert_list to cache git objects
Siddharth Agarwal <sid0@fb.com>
parents:
653
diff
changeset
|
650 obj = self.git.get_object(sha) |
f221c7b5bdfb
git_handler: use convert_list to cache git objects
Siddharth Agarwal <sid0@fb.com>
parents:
653
diff
changeset
|
651 convert_list[sha] = obj |
282
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
652 assert isinstance(obj, Commit) |
283
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
653 for p in obj.parents: |
655
baba2cf03d41
git_handler: terminate new commit DAG traversal at known commits
Siddharth Agarwal <sid0@fb.com>
parents:
654
diff
changeset
|
654 if p not in done and p not in self._map_git: |
283
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
655 todo.append(p) |
653
4ab616864329
git_handler: note that new commits are returned in topo order
Siddharth Agarwal <sid0@fb.com>
parents:
652
diff
changeset
|
656 # process parents of a commit before processing the |
4ab616864329
git_handler: note that new commits are returned in topo order
Siddharth Agarwal <sid0@fb.com>
parents:
652
diff
changeset
|
657 # commit itself, and come back to this commit later |
283
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
658 break |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
659 else: |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
660 commits.append(sha) |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
661 done.add(sha) |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
662 todo.pop() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
663 |
655
baba2cf03d41
git_handler: terminate new commit DAG traversal at known commits
Siddharth Agarwal <sid0@fb.com>
parents:
654
diff
changeset
|
664 return convert_list, commits |
408 | 665 |
666 def import_git_objects(self, remote_name=None, refs=None): | |
667 convert_list, commits = self.getnewgitcommits(refs) | |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
668 # import each of the commits, oldest first |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
669 total = len(commits) |
392 | 670 if total: |
671 self.ui.status(_("importing git objects into hg\n")) | |
702
178b15457927
git_handler: base 'no changes found' message on commits, not on heads
Siddharth Agarwal <sid0@fb.com>
parents:
701
diff
changeset
|
672 else: |
178b15457927
git_handler: base 'no changes found' message on commits, not on heads
Siddharth Agarwal <sid0@fb.com>
parents:
701
diff
changeset
|
673 self.ui.status(_("no changes found\n")) |
392 | 674 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
675 for i, csha in enumerate(commits): |
686
c7129c72baff
git_handler: replace util.progress with ui.progress
Siddharth Agarwal <sid0@fb.com>
parents:
684
diff
changeset
|
676 self.ui.progress('importing', i, total=total, unit='commits') |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
677 commit = convert_list[csha] |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
678 self.import_git_commit(commit) |
686
c7129c72baff
git_handler: replace util.progress with ui.progress
Siddharth Agarwal <sid0@fb.com>
parents:
684
diff
changeset
|
679 self.ui.progress('importing', None, total=total, unit='commits') |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
680 |
684
13d64d9dd26c
git_handler: remove old and bogus code for deleting entries from tags cache
Siddharth Agarwal <sid0@fb.com>
parents:
683
diff
changeset
|
681 # TODO if the tags cache is used, remove any dangling tag references |
703
439e57b724b6
import_git_objects: return number of commits imported
Siddharth Agarwal <sid0@fb.com>
parents:
702
diff
changeset
|
682 return total |
400
6d4f3b6d2e08
respect references to tags that differ between git and .hgtags
Adrian Sampson <adrian@radbox.org>
parents:
398
diff
changeset
|
683 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
684 def import_git_commit(self, commit): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
685 self.ui.debug(_("importing: %s\n") % commit.id) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
686 |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
687 (strip_message, hg_renames, |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
688 hg_branch, extra) = self.extract_hg_metadata(commit.message) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
689 |
641
cacd98c7382e
git_handler: move gparents initialization up to start of import_git_commit
Siddharth Agarwal <sid0@fb.com>
parents:
640
diff
changeset
|
690 gparents = map(self.map_hg_get, commit.parents) |
cacd98c7382e
git_handler: move gparents initialization up to start of import_git_commit
Siddharth Agarwal <sid0@fb.com>
parents:
640
diff
changeset
|
691 |
642
5a17de2247bf
git_handler: move check for gparents in repo to start of import_git_commit
Siddharth Agarwal <sid0@fb.com>
parents:
641
diff
changeset
|
692 for parent in gparents: |
5a17de2247bf
git_handler: move check for gparents in repo to start of import_git_commit
Siddharth Agarwal <sid0@fb.com>
parents:
641
diff
changeset
|
693 if parent not in self.repo: |
5a17de2247bf
git_handler: move check for gparents in repo to start of import_git_commit
Siddharth Agarwal <sid0@fb.com>
parents:
641
diff
changeset
|
694 raise hgutil.Abort(_('you appear to have run strip - ' |
5a17de2247bf
git_handler: move check for gparents in repo to start of import_git_commit
Siddharth Agarwal <sid0@fb.com>
parents:
641
diff
changeset
|
695 'please run hg git-cleanup')) |
5a17de2247bf
git_handler: move check for gparents in repo to start of import_git_commit
Siddharth Agarwal <sid0@fb.com>
parents:
641
diff
changeset
|
696 |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
697 # get a list of the changed, added, removed files and gitlinks |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
698 files, gitlinks = self.get_files_changed(commit) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
699 |
476
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
700 git_commit_tree = self.git[commit.tree] |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
701 |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
702 # Analyze hgsubstate and build an updated version using SHAs from |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
703 # gitlinks. Order of application: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
704 # - preexisting .hgsubstate in git tree |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
705 # - .hgsubstate from hg parent |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
706 # - changes in gitlinks |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
707 hgsubstate = util.parse_hgsubstate( |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
708 self.git_file_readlines(git_commit_tree, '.hgsubstate')) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
709 parentsubdata = '' |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
710 if gparents: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
711 p1ctx = self.repo.changectx(gparents[0]) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
712 if '.hgsubstate' in p1ctx: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
713 parentsubdata = p1ctx.filectx('.hgsubstate').data().splitlines() |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
714 parentsubstate = util.parse_hgsubstate(parentsubdata) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
715 for path, sha in parentsubstate.iteritems(): |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
716 hgsubstate[path] = sha |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
717 for path, sha in gitlinks.iteritems(): |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
718 if sha is None: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
719 hgsubstate.pop(path, None) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
720 else: |
476
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
721 hgsubstate[path] = sha |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
722 # in case .hgsubstate wasn't among changed files |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
723 # force its inclusion |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
724 if not hgsubstate and parentsubdata: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
725 files['.hgsubstate'] = True, None, None |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
726 elif util.serialize_hgsubstate(hgsubstate) != parentsubdata: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
727 files['.hgsubstate'] = False, 0100644, None |
476
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
728 |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
729 # Analyze .hgsub and merge with .gitmodules |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
730 hgsub = None |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
731 gitmodules = self.parse_gitmodules(git_commit_tree) |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
732 if gitmodules: |
476
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
733 hgsub = util.parse_hgsub(self.git_file_readlines(git_commit_tree, '.hgsub')) |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
734 for (sm_path, sm_url, sm_name) in gitmodules: |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
735 hgsub[sm_path] = '[git]' + sm_url |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
736 files['.hgsub'] = (False, 0100644, None) |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
737 elif commit.parents and '.gitmodules' in self.git[self.git[commit.parents[0]].tree]: |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
738 # no .gitmodules in this commit, however present in the parent |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
739 # mark its hg counterpart as deleted (assuming .hgsub is there |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
740 # due to the same import_git_commit process |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
741 files['.hgsub'] = (True, 0100644, None) |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
742 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
743 date = (commit.author_time, -commit.author_timezone) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
744 text = strip_message |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
745 |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
746 origtext = text |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
747 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
748 text.decode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
749 except UnicodeDecodeError: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
750 text = self.decode_guess(text, commit.encoding) |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
751 |
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
752 text = '\n'.join([l.rstrip() for l in text.splitlines()]).strip('\n') |
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
753 if text + '\n' != origtext: |
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
754 extra['message'] = create_delta(text +'\n', origtext) |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
755 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
756 author = commit.author |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
757 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
758 # convert extra data back to the end |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
759 if ' ext:' in commit.author: |
540
3fb942852b1c
Precompile Git author extra data regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
539
diff
changeset
|
760 m = RE_GIT_AUTHOR_EXTRA.match(commit.author) |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
761 if m: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
762 name = m.group(1) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
763 ex = urllib.unquote(m.group(2)) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
764 email = m.group(3) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
765 author = name + ' <' + email + '>' + ex |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
766 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
767 if ' <none@none>' in commit.author: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
768 author = commit.author[:-12] |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
769 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
770 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
771 author.decode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
772 except UnicodeDecodeError: |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
773 origauthor = author |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
774 author = self.decode_guess(author, commit.encoding) |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
775 extra['author'] = create_delta(author, origauthor) |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
776 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
777 oldenc = self.swap_out_encoding() |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
778 |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
779 def findconvergedfiles(p1, p2): |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
780 # If any files have the same contents in both parents of a merge |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
781 # (and are therefore not reported as changed by Git) but are at |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
782 # different file revisions in Mercurial (because they arrived at |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
783 # those contents in different ways), we need to include them in |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
784 # the list of changed files so that Mercurial can join up their |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
785 # filelog histories (same as if the merge was done in Mercurial to |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
786 # begin with). |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
787 if p2 == nullid: |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
788 return [] |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
789 manifest1 = self.repo.changectx(p1).manifest() |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
790 manifest2 = self.repo.changectx(p2).manifest() |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
791 return [path for path, node1 in manifest1.iteritems() |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
792 if path not in files and manifest2.get(path, node1) != node1] |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
793 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
794 def getfilectx(repo, memctx, f): |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
795 info = files.get(f) |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
796 if info != None: |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
797 # it's a file reported as modified from Git |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
798 delete, mode, sha = info |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
799 if delete: |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
800 raise IOError |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
801 |
476
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
802 if not sha: # indicates there's no git counterpart |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
803 e = '' |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
804 copied_path = None |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
805 if '.hgsubstate' == f: |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
806 data = util.serialize_hgsubstate(hgsubstate) |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
807 elif '.hgsub' == f: |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
808 data = util.serialize_hgsub(hgsub) |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
809 else: |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
810 data = self.git[sha].data |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
811 copied_path = hg_renames.get(f) |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
812 e = self.convert_git_int_mode(mode) |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
813 else: |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
814 # it's a converged file |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
815 fc = context.filectx(self.repo, f, changeid=memctx.p1().rev()) |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
816 data = fc.data() |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
817 e = fc.flags() |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
818 copied_path = fc.renamed() |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
819 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
820 return context.memfilectx(f, data, 'l' in e, 'x' in e, copied_path) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
821 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
822 p1, p2 = (nullid, nullid) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
823 octopus = False |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
824 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
825 if len(gparents) > 1: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
826 # merge, possibly octopus |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
827 def commit_octopus(p1, p2): |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
828 ctx = context.memctx(self.repo, (p1, p2), text, |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
829 list(files) + findconvergedfiles(p1, p2), |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
830 getfilectx, author, date, {'hg-git': 'octopus'}) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
831 return hex(self.repo.commitctx(ctx)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
832 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
833 octopus = len(gparents) > 2 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
834 p2 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
835 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
836 while len(gparents) > 0: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
837 p2 = commit_octopus(p1, p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
838 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
839 else: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
840 if gparents: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
841 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
842 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
843 pa = None |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
844 if not (p2 == nullid): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
845 node1 = self.repo.changectx(p1) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
846 node2 = self.repo.changectx(p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
847 pa = node1.ancestor(node2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
848 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
849 # if named branch, add to extra |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
850 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
851 extra['branch'] = hg_branch |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
852 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
853 # if committer is different than author, add it to extra |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
854 if commit.author != commit.committer \ |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
855 or commit.author_time != commit.commit_time \ |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
856 or commit.author_timezone != commit.commit_timezone: |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
857 extra['committer'] = "%s %d %d" % ( |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
858 commit.committer, commit.commit_time, -commit.commit_timezone) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
859 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
860 if commit.encoding: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
861 extra['encoding'] = commit.encoding |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
862 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
863 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
864 extra['branch'] = hg_branch |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
865 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
866 if octopus: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
867 extra['hg-git'] ='octopus-done' |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
868 |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
869 ctx = context.memctx(self.repo, (p1, p2), text, |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
870 list(files) + findconvergedfiles(p1, p2), |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
871 getfilectx, author, date, extra) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
872 |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
873 node = self.repo.commitctx(ctx) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
874 |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
875 self.swap_out_encoding(oldenc) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
876 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
877 # save changeset to mapping file |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
878 cs = hex(node) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
879 self.map_set(commit.id, cs) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
880 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
881 ## PACK UPLOADING AND FETCHING |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
882 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
883 def upload_pack(self, remote, revs, force): |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
884 client, path = self.get_transport_and_path(remote) |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
885 old_refs = {} |
592
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
886 change_totals = {} |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
887 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
888 def changed(refs): |
592
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
889 self.ui.status(_("searching for changes\n")) |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
890 old_refs.update(refs) |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
891 to_push = revs or set(self.local_heads().values() + self.tags.values()) |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
892 return self.get_changed_refs(refs, to_push, force) |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
893 |
592
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
894 def genpack(have, want): |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
895 commits = [] |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
896 for mo in self.git.object_store.find_missing_objects(have, want): |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
897 (sha, name) = mo |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
898 o = self.git.object_store[sha] |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
899 t = type(o) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
900 change_totals[t] = change_totals.get(t, 0) + 1 |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
901 if isinstance(o, Commit): |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
902 commits.append(sha) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
903 commit_count = len(commits) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
904 self.ui.note(_("%d commits found\n") % commit_count) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
905 if commit_count > 0: |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
906 self.ui.debug(_("list of commits:\n")) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
907 for commit in commits: |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
908 self.ui.debug("%s\n" % commit) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
909 self.ui.status(_("adding objects\n")) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
910 return self.git.object_store.generate_pack_contents(have, want) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
911 |
26
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
912 try: |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
913 new_refs = client.send_pack(path, changed, genpack) |
592
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
914 if len(change_totals) > 0: |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
915 self.ui.status(_("added %d commits with %d trees" |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
916 " and %d blobs\n") % |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
917 (change_totals.get(Commit, 0), |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
918 change_totals.get(Tree, 0), |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
919 change_totals.get(Blob, 0))) |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
920 return old_refs, new_refs |
394
721165a45385
Catch GitProtocolError wherever HangupException can occur.
Brendan Cully <brendan@kublai.com>
parents:
392
diff
changeset
|
921 except (HangupException, GitProtocolError), e: |
721165a45385
Catch GitProtocolError wherever HangupException can occur.
Brendan Cully <brendan@kublai.com>
parents:
392
diff
changeset
|
922 raise hgutil.Abort(_("git remote error: ") + str(e)) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
923 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
924 def get_changed_refs(self, refs, revs, force): |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
925 new_refs = refs.copy() |
242
0ac974306e08
push the tip to master if remote repository is empty (closes issue 11 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
239
diff
changeset
|
926 |
0ac974306e08
push the tip to master if remote repository is empty (closes issue 11 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
239
diff
changeset
|
927 #The remote repo is empty and the local one doesn't have bookmarks/tags |
248
bfe6fd2fdb9b
push tip to master in an empty repository even if there are tags
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
247
diff
changeset
|
928 if refs.keys()[0] == 'capabilities^{}': |
bfe6fd2fdb9b
push tip to master in an empty repository even if there are tags
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
247
diff
changeset
|
929 if not self.local_heads(): |
555
06a29fdd52a7
push: fix traceback when pushing empty hg repo to empty git repo (issue #58)
David M. Carr <david@carrclan.us>
parents:
553
diff
changeset
|
930 tip = self.repo.lookup('tip') |
06a29fdd52a7
push: fix traceback when pushing empty hg repo to empty git repo (issue #58)
David M. Carr <david@carrclan.us>
parents:
553
diff
changeset
|
931 if tip != nullid: |
06a29fdd52a7
push: fix traceback when pushing empty hg repo to empty git repo (issue #58)
David M. Carr <david@carrclan.us>
parents:
553
diff
changeset
|
932 del new_refs['capabilities^{}'] |
06a29fdd52a7
push: fix traceback when pushing empty hg repo to empty git repo (issue #58)
David M. Carr <david@carrclan.us>
parents:
553
diff
changeset
|
933 tip = hex(tip) |
06a29fdd52a7
push: fix traceback when pushing empty hg repo to empty git repo (issue #58)
David M. Carr <david@carrclan.us>
parents:
553
diff
changeset
|
934 try: |
06a29fdd52a7
push: fix traceback when pushing empty hg repo to empty git repo (issue #58)
David M. Carr <david@carrclan.us>
parents:
553
diff
changeset
|
935 commands.bookmark(self.ui, self.repo, 'master', tip, force=True) |
06a29fdd52a7
push: fix traceback when pushing empty hg repo to empty git repo (issue #58)
David M. Carr <david@carrclan.us>
parents:
553
diff
changeset
|
936 except NameError: |
06a29fdd52a7
push: fix traceback when pushing empty hg repo to empty git repo (issue #58)
David M. Carr <david@carrclan.us>
parents:
553
diff
changeset
|
937 bookmarks.bookmark(self.ui, self.repo, 'master', tip, force=True) |
06a29fdd52a7
push: fix traceback when pushing empty hg repo to empty git repo (issue #58)
David M. Carr <david@carrclan.us>
parents:
553
diff
changeset
|
938 bookmarks.setcurrent(self.repo, 'master') |
06a29fdd52a7
push: fix traceback when pushing empty hg repo to empty git repo (issue #58)
David M. Carr <david@carrclan.us>
parents:
553
diff
changeset
|
939 new_refs['refs/heads/master'] = self.map_git_get(tip) |
242
0ac974306e08
push the tip to master if remote repository is empty (closes issue 11 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
239
diff
changeset
|
940 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
941 for rev in revs: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
942 ctx = self.repo[rev] |
376
b4f5f2729acb
git_handler: update ctx label handling for bookmarks in core
Augie Fackler <durin42@gmail.com>
parents:
375
diff
changeset
|
943 if getattr(ctx, 'bookmarks', None): |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
944 labels = lambda c: ctx.tags() + [ |
448
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
945 fltr for fltr, bm |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
946 in self._filter_for_bookmarks(ctx.bookmarks()) |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
947 ] |
376
b4f5f2729acb
git_handler: update ctx label handling for bookmarks in core
Augie Fackler <durin42@gmail.com>
parents:
375
diff
changeset
|
948 else: |
b4f5f2729acb
git_handler: update ctx label handling for bookmarks in core
Augie Fackler <durin42@gmail.com>
parents:
375
diff
changeset
|
949 labels = lambda c: ctx.tags() |
381
80544310834a
fix handling of spaces in hg tag names
Dmitry Gladkov <dmitry.gladkov@gmail.com>
parents:
376
diff
changeset
|
950 prep = lambda itr: [i.replace(' ', '_') for i in itr] |
80544310834a
fix handling of spaces in hg tag names
Dmitry Gladkov <dmitry.gladkov@gmail.com>
parents:
376
diff
changeset
|
951 |
80544310834a
fix handling of spaces in hg tag names
Dmitry Gladkov <dmitry.gladkov@gmail.com>
parents:
376
diff
changeset
|
952 heads = [t for t in prep(labels(ctx)) if t in self.local_heads()] |
80544310834a
fix handling of spaces in hg tag names
Dmitry Gladkov <dmitry.gladkov@gmail.com>
parents:
376
diff
changeset
|
953 tags = [t for t in prep(labels(ctx)) if t in self.tags] |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
954 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
955 if not (heads or tags): |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
956 raise hgutil.Abort("revision %s cannot be pushed since" |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
957 " it doesn't have a ref" % ctx) |
149 | 958 |
310
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
959 # Check if the tags the server is advertising are annotated tags, |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
960 # by attempting to retrieve it from the our git repo, and building a |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
961 # list of these tags. |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
962 # |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
963 # This is possible, even though (currently) annotated tags are |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
964 # dereferenced and stored as lightweight ones, as the annotated tag |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
965 # is still stored in the git repo. |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
966 uptodate_annotated_tags = [] |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
967 for r in tags: |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
968 ref = 'refs/tags/'+r |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
969 # Check tag. |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
970 if not ref in refs: |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
971 continue |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
972 try: |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
973 # We're not using Repo.tag(), as it's deprecated. |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
974 tag = self.git.get_object(refs[ref]) |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
975 if not isinstance(tag, Tag): |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
976 continue |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
977 except KeyError: |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
978 continue |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
979 |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
980 # If we've reached here, the tag's good. |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
981 uptodate_annotated_tags.append(ref) |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
982 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
983 for r in heads + tags: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
984 if r in heads: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
985 ref = 'refs/heads/'+r |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
986 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
987 ref = 'refs/tags/'+r |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
988 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
989 if ref not in refs: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
990 new_refs[ref] = self.map_git_get(ctx.hex()) |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
991 elif new_refs[ref] in self._map_git: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
992 rctx = self.repo[self.map_hg_get(new_refs[ref])] |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
993 if rctx.ancestor(ctx) == rctx or force: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
994 new_refs[ref] = self.map_git_get(ctx.hex()) |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
995 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
996 raise hgutil.Abort("pushing %s overwrites %s" |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
997 % (ref, ctx)) |
310
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
998 elif ref in uptodate_annotated_tags: |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
999 # we already have the annotated tag. |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1000 pass |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1001 else: |
630
3ff09f0fac7a
git_handler.py: less cryptic error message when push fails
anatoly techtonik <techtonik@gmail.com>
parents:
622
diff
changeset
|
1002 raise hgutil.Abort( |
3ff09f0fac7a
git_handler.py: less cryptic error message when push fails
anatoly techtonik <techtonik@gmail.com>
parents:
622
diff
changeset
|
1003 "branch '%s' changed on the server, " |
3ff09f0fac7a
git_handler.py: less cryptic error message when push fails
anatoly techtonik <techtonik@gmail.com>
parents:
622
diff
changeset
|
1004 "please pull and merge before pushing" % ref) |
126 | 1005 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1006 return new_refs |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1007 |
557
4f4ab2d89375
gitrepo: initial support for listkeys
David M. Carr <david@carrclan.us>
parents:
555
diff
changeset
|
1008 def fetch_pack(self, remote_name, heads=None): |
182
9bdd8e76bbab
Remove remotes support (use the paths section in hgrc instead)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
181
diff
changeset
|
1009 client, path = self.get_transport_and_path(remote_name) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1010 graphwalker = self.git.get_graph_walker() |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1011 |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1012 def determine_wants(refs): |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1013 filteredrefs = self.filter_refs(refs, heads) |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1014 return [x for x in filteredrefs.itervalues() if x not in self.git] |
610
ec6d4146d5ca
git_handler: clean up trailing whitespace
Augie Fackler <raf@durin42.com>
parents:
609
diff
changeset
|
1015 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
1016 try: |
609
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1017 progress = GitProgress(self.ui) |
611
30d502905da9
git_handler: fix bugs introduced by 47df57f2bb2b which could never have passed tests
Augie Fackler <raf@durin42.com>
parents:
610
diff
changeset
|
1018 f = StringIO.StringIO() |
609
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1019 ret = client.fetch_pack(path, determine_wants, graphwalker, f.write, progress.progress) |
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1020 if(f.pos != 0): |
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1021 f.seek(0) |
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1022 po = self.git.object_store.add_thin_pack(f.read, None) |
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1023 progress.flush() |
617
1d326a57e2dd
git-handler: turn refs from None to {} so that empty git repos can convert
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
612
diff
changeset
|
1024 |
1d326a57e2dd
git-handler: turn refs from None to {} so that empty git repos can convert
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
612
diff
changeset
|
1025 # For empty repos dulwich gives us None, but since later |
1d326a57e2dd
git-handler: turn refs from None to {} so that empty git repos can convert
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
612
diff
changeset
|
1026 # we want to iterate over this, we really want an empty |
1d326a57e2dd
git-handler: turn refs from None to {} so that empty git repos can convert
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
612
diff
changeset
|
1027 # iterable |
1d326a57e2dd
git-handler: turn refs from None to {} so that empty git repos can convert
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
612
diff
changeset
|
1028 return ret if ret else {} |
609
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1029 except (HangupException, GitProtocolError), e: |
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1030 raise hgutil.Abort(_("git remote error: ") + str(e)) |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
1031 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1032 ## REFERENCES HANDLING |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1033 |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1034 def filter_refs(self, refs, heads): |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1035 '''For a dictionary of refs: shas, if heads has any elements then return refs |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1036 that match the heads. Otherwise, return refs that are heads or tags. |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1037 |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1038 ''' |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1039 filteredrefs = {} |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1040 if heads: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1041 # contains pairs of ('refs/(heads|tags|...)/foo', 'foo') |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1042 # if ref is just '<foo>', then we get ('foo', 'foo') |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1043 stripped_refs = [ |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1044 (r, r[r.find('/', r.find('/')+1)+1:]) |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1045 for r in refs] |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1046 for h in heads: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1047 r = [pair[0] for pair in stripped_refs if pair[1] == h] |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1048 if not r: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1049 raise hgutil.Abort("ref %s not found on remote server" % h) |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1050 elif len(r) == 1: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1051 filteredrefs[r[0]] = refs[r[0]] |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1052 else: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1053 raise hgutil.Abort("ambiguous reference %s: %r" % (h, r)) |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1054 else: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1055 for ref, sha in refs.iteritems(): |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1056 if (not ref.endswith('^{}') |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1057 and (ref.startswith('refs/heads/') |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1058 or ref.startswith('refs/tags/'))): |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1059 filteredrefs[ref] = sha |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1060 return filteredrefs |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1061 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1062 def update_references(self): |
195
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
1063 heads = self.local_heads() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1064 |
195
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
1065 # Create a local Git branch name for each |
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
1066 # Mercurial bookmark. |
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
1067 for key in heads: |
418
10027b50202b
In some situations where a reference is being used but does not exist in _map_git or _map_hg, silently skip the reference rather than throwing an error. This allows hg outgoing to work on repositories which do not contain any revisions at all.
mcc <andrew.mcclure@gmail.com>
parents:
415
diff
changeset
|
1068 git_ref = self.map_git_get(heads[key]) |
10027b50202b
In some situations where a reference is being used but does not exist in _map_git or _map_hg, silently skip the reference rather than throwing an error. This allows hg outgoing to work on repositories which do not contain any revisions at all.
mcc <andrew.mcclure@gmail.com>
parents:
415
diff
changeset
|
1069 if git_ref: |
10027b50202b
In some situations where a reference is being used but does not exist in _map_git or _map_hg, silently skip the reference rather than throwing an error. This allows hg outgoing to work on repositories which do not contain any revisions at all.
mcc <andrew.mcclure@gmail.com>
parents:
415
diff
changeset
|
1070 self.git.refs['refs/heads/' + key] = self.map_git_get(heads[key]) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1071 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1072 def export_hg_tags(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1073 for tag, sha in self.repo.tags().iteritems(): |
210
9a27c618d0ed
remove broken tagging code (see issue 3 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
207
diff
changeset
|
1074 if self.repo.tagtype(tag) in ('global', 'git'): |
381
80544310834a
fix handling of spaces in hg tag names
Dmitry Gladkov <dmitry.gladkov@gmail.com>
parents:
376
diff
changeset
|
1075 tag = tag.replace(' ', '_') |
587
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1076 target = self.map_git_get(hex(sha)) |
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1077 if target is not None: |
602
65d8a43bc5ee
git_handler: skip exporting hg tags whose names are not valid as git tag name
nsuke <nsukeg@gmail.com>
parents:
597
diff
changeset
|
1078 tag_refname = 'refs/tags/' + tag |
65d8a43bc5ee
git_handler: skip exporting hg tags whose names are not valid as git tag name
nsuke <nsukeg@gmail.com>
parents:
597
diff
changeset
|
1079 if(check_ref_format(tag_refname)): |
65d8a43bc5ee
git_handler: skip exporting hg tags whose names are not valid as git tag name
nsuke <nsukeg@gmail.com>
parents:
597
diff
changeset
|
1080 self.git.refs[tag_refname] = target |
65d8a43bc5ee
git_handler: skip exporting hg tags whose names are not valid as git tag name
nsuke <nsukeg@gmail.com>
parents:
597
diff
changeset
|
1081 self.tags[tag] = hex(sha) |
65d8a43bc5ee
git_handler: skip exporting hg tags whose names are not valid as git tag name
nsuke <nsukeg@gmail.com>
parents:
597
diff
changeset
|
1082 else: |
65d8a43bc5ee
git_handler: skip exporting hg tags whose names are not valid as git tag name
nsuke <nsukeg@gmail.com>
parents:
597
diff
changeset
|
1083 self.repo.ui.warn( |
65d8a43bc5ee
git_handler: skip exporting hg tags whose names are not valid as git tag name
nsuke <nsukeg@gmail.com>
parents:
597
diff
changeset
|
1084 'Skipping export of tag %s because it ' |
65d8a43bc5ee
git_handler: skip exporting hg tags whose names are not valid as git tag name
nsuke <nsukeg@gmail.com>
parents:
597
diff
changeset
|
1085 'has invalid name as a git refname.\n' % tag) |
587
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1086 else: |
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1087 self.repo.ui.warn( |
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1088 'Skipping export of tag %s because it ' |
602
65d8a43bc5ee
git_handler: skip exporting hg tags whose names are not valid as git tag name
nsuke <nsukeg@gmail.com>
parents:
597
diff
changeset
|
1089 'has no matching git revision.\n' % tag) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1090 |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1091 def _filter_for_bookmarks(self, bms): |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1092 if not self.branch_bookmark_suffix: |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1093 return [(bm, bm) for bm in bms] |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1094 else: |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1095 def _filter_bm(bm): |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1096 if bm.endswith(self.branch_bookmark_suffix): |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1097 return bm[0:-(len(self.branch_bookmark_suffix))] |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1098 else: |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1099 return bm |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1100 return [(_filter_bm(bm), bm) for bm in bms] |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1101 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1102 def local_heads(self): |
194
a5c53e94d92b
Do not depend on the cache git repository for reference pushing
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
190
diff
changeset
|
1103 try: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1104 if getattr(bookmarks, 'parse', None): |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1105 bms = bookmarks.parse(self.repo) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1106 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1107 bms = self.repo._bookmarks |
448
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
1108 return dict([(filtered_bm, hex(bms[bm])) for |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1109 filtered_bm, bm in self._filter_for_bookmarks(bms)]) |
215
b5d4d1552765
add some annotations for test coverage
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
213
diff
changeset
|
1110 except AttributeError: #pragma: no cover |
194
a5c53e94d92b
Do not depend on the cache git repository for reference pushing
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
190
diff
changeset
|
1111 return {} |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1112 |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
1113 def import_tags(self, refs): |
149 | 1114 keys = refs.keys() |
1115 if not keys: | |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
1116 return |
688
7ca655e44d9a
git_handler: don't compute tags for each tag imported
Siddharth Agarwal <sid0@fb.com>
parents:
686
diff
changeset
|
1117 repotags = self.repo.tags() |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
1118 for k in keys[:]: |
149 | 1119 ref_name = k |
1120 parts = k.split('/') | |
194
a5c53e94d92b
Do not depend on the cache git repository for reference pushing
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
190
diff
changeset
|
1121 if parts[0] == 'refs' and parts[1] == 'tags': |
149 | 1122 ref_name = "/".join([v for v in parts[2:]]) |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1123 # refs contains all the refs in the server, not just |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1124 # the ones we are pulling |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1125 if refs[k] not in self.git.object_store: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1126 continue |
149 | 1127 if ref_name[-3:] == '^{}': |
1128 ref_name = ref_name[:-3] | |
688
7ca655e44d9a
git_handler: don't compute tags for each tag imported
Siddharth Agarwal <sid0@fb.com>
parents:
686
diff
changeset
|
1129 if not ref_name in repotags: |
149 | 1130 obj = self.git.get_object(refs[k]) |
1131 sha = None | |
1132 if isinstance (obj, Commit): # lightweight | |
1133 sha = self.map_hg_get(refs[k]) | |
699
6dc550f2fa78
import_tags: don't import tags that don't have an hg commit equivalent
Siddharth Agarwal <sid0@fb.com>
parents:
698
diff
changeset
|
1134 if sha is not None: |
6dc550f2fa78
import_tags: don't import tags that don't have an hg commit equivalent
Siddharth Agarwal <sid0@fb.com>
parents:
698
diff
changeset
|
1135 self.tags[ref_name] = sha |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
1136 elif isinstance (obj, Tag): # annotated |
337
6cea997ee302
enforce stricter matching for pull -r
Tay Ray Chuan <rctay89@gmail.com>
parents:
258
diff
changeset
|
1137 (obj_type, obj_sha) = obj.object |
149 | 1138 obj = self.git.get_object(obj_sha) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1139 if isinstance (obj, Commit): |
149 | 1140 sha = self.map_hg_get(obj_sha) |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
1141 # TODO: better handling for annotated tags |
699
6dc550f2fa78
import_tags: don't import tags that don't have an hg commit equivalent
Siddharth Agarwal <sid0@fb.com>
parents:
698
diff
changeset
|
1142 if sha is not None: |
6dc550f2fa78
import_tags: don't import tags that don't have an hg commit equivalent
Siddharth Agarwal <sid0@fb.com>
parents:
698
diff
changeset
|
1143 self.tags[ref_name] = sha |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
1144 self.save_tags() |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1145 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1146 def update_hg_bookmarks(self, refs): |
29
2a5c0bf0fef5
Another way of fixing no-bookmark issue, along with updated test.
Augie Fackler <durin42@gmail.com>
parents:
28
diff
changeset
|
1147 try: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1148 oldbm = getattr(bookmarks, 'parse', None) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1149 if oldbm: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1150 bms = bookmarks.parse(self.repo) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1151 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1152 bms = self.repo._bookmarks |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1153 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1154 heads = dict([(ref[11:],refs[ref]) for ref in refs |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1155 if ref.startswith('refs/heads/')]) |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
1156 |
600
e0089655caa6
Fixes #54 | option branch_bookmark_suffix doesn't move bookmarks along
André Felipe Dias <andref.dias@pronus.eng.br>
parents:
597
diff
changeset
|
1157 suffix = self.branch_bookmark_suffix or '' |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
1158 for head, sha in heads.iteritems(): |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1159 # refs contains all the refs in the server, not just |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1160 # the ones we are pulling |
701
e29e280776ff
update_hg_bookmarks: don't update bookmarks that don't have an hg commit
Siddharth Agarwal <sid0@fb.com>
parents:
700
diff
changeset
|
1161 hgsha = self.map_hg_get(sha) |
e29e280776ff
update_hg_bookmarks: don't update bookmarks that don't have an hg commit
Siddharth Agarwal <sid0@fb.com>
parents:
700
diff
changeset
|
1162 if hgsha is None: |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1163 continue |
701
e29e280776ff
update_hg_bookmarks: don't update bookmarks that don't have an hg commit
Siddharth Agarwal <sid0@fb.com>
parents:
700
diff
changeset
|
1164 hgsha = bin(hgsha) |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1165 if not head in bms: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1166 # new branch |
600
e0089655caa6
Fixes #54 | option branch_bookmark_suffix doesn't move bookmarks along
André Felipe Dias <andref.dias@pronus.eng.br>
parents:
597
diff
changeset
|
1167 bms[head + suffix] = hgsha |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1168 else: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1169 bm = self.repo[bms[head]] |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1170 if bm.ancestor(self.repo[hgsha]) == bm: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1171 # fast forward |
600
e0089655caa6
Fixes #54 | option branch_bookmark_suffix doesn't move bookmarks along
André Felipe Dias <andref.dias@pronus.eng.br>
parents:
597
diff
changeset
|
1172 bms[head + suffix] = hgsha |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1173 |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
1174 if heads: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1175 if oldbm: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1176 bookmarks.write(self.repo, bms) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1177 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1178 self.repo._bookmarks = bms |
590
96e75caaf900
git_handler: add bookmark compatibility with new bmstore (issue #60)
David M. Carr <david@carrclan.us>
parents:
587
diff
changeset
|
1179 if getattr(bms, 'write', None): # hg >= 2.5 |
96e75caaf900
git_handler: add bookmark compatibility with new bmstore (issue #60)
David M. Carr <david@carrclan.us>
parents:
587
diff
changeset
|
1180 bms.write() |
96e75caaf900
git_handler: add bookmark compatibility with new bmstore (issue #60)
David M. Carr <david@carrclan.us>
parents:
587
diff
changeset
|
1181 else: # hg < 2.5 |
96e75caaf900
git_handler: add bookmark compatibility with new bmstore (issue #60)
David M. Carr <david@carrclan.us>
parents:
587
diff
changeset
|
1182 bookmarks.write(self.repo) |
161
134915637cf7
Merge branch 'octo' with octo merge code
Scott Chacon <schacon@gmail.com>
diff
changeset
|
1183 |
29
2a5c0bf0fef5
Another way of fixing no-bookmark issue, along with updated test.
Augie Fackler <durin42@gmail.com>
parents:
28
diff
changeset
|
1184 except AttributeError: |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
1185 self.ui.warn(_('creating bookmarks failed, do you have' |
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
1186 ' bookmarks enabled?\n')) |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
1187 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1188 def update_remote_branches(self, remote_name, refs): |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1189 tagfile = self.repo.join(os.path.join('git-remote-refs')) |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1190 tags = self.repo.gitrefs() |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1191 # since we re-write all refs for this remote each time, prune |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1192 # all entries matching this remote from our tags list now so |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1193 # that we avoid any stale refs hanging around forever |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1194 for t in list(tags): |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1195 if t.startswith(remote_name + '/'): |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1196 del tags[t] |
368
ae78f94f64fd
Fix bug where remote ref map wrote out binary nodes.
Augie Fackler <durin42@gmail.com>
parents:
367
diff
changeset
|
1197 tags = dict((k, hex(v)) for k, v in tags.iteritems()) |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1198 store = self.git.object_store |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1199 for ref_name, sha in refs.iteritems(): |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1200 if ref_name.startswith('refs/heads'): |
700
a72816ade410
update_remote_branches: don't store refs that don't have an hg equivalent
Siddharth Agarwal <sid0@fb.com>
parents:
699
diff
changeset
|
1201 hgsha = self.map_hg_get(sha) |
a72816ade410
update_remote_branches: don't store refs that don't have an hg equivalent
Siddharth Agarwal <sid0@fb.com>
parents:
699
diff
changeset
|
1202 if hgsha is None or hgsha not in self.repo: |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1203 continue |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1204 head = ref_name[11:] |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1205 tags['/'.join((remote_name, head))] = hgsha |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1206 # TODO(durin42): what is this doing? |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1207 new_ref = 'refs/remotes/%s/%s' % (remote_name, head) |
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1208 self.git.refs[new_ref] = sha |
316
7e5ed21ceec1
git_handler: prefer () continuation to \ continuation.
Augie Fackler <durin42@gmail.com>
parents:
306
diff
changeset
|
1209 elif (ref_name.startswith('refs/tags') |
7e5ed21ceec1
git_handler: prefer () continuation to \ continuation.
Augie Fackler <durin42@gmail.com>
parents:
306
diff
changeset
|
1210 and not ref_name.endswith('^{}')): |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1211 self.git.refs[ref_name] = sha |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
1212 |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1213 tf = open(tagfile, 'wb') |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1214 for tag, node in tags.iteritems(): |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1215 tf.write('%s %s\n' % (node, tag)) |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1216 tf.close() |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1217 |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
1218 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1219 ## UTILITY FUNCTIONS |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1220 |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1221 def convert_git_int_mode(self, mode): |
213
61471faeb7fd
small cleanups (tabs, s/TODO :/TODO:/ and dead code)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
212
diff
changeset
|
1222 # TODO: make these into constants |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1223 convert = { |
121
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
1224 0100644: '', |
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
1225 0100755: 'x', |
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
1226 0120000: 'l'} |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1227 if mode in convert: |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1228 return convert[mode] |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1229 return '' |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
1230 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1231 def extract_hg_metadata(self, message): |
227
c4f6e6f24bf1
fix bug introduced by previous commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
226
diff
changeset
|
1232 split = message.split("\n--HG--\n", 1) |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1233 renames = {} |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
1234 extra = {} |
79
7b4cf18c896b
readded yet another piece of code that disappeared at some point, recovering branches properly
Scott Chacon <schacon@gmail.com>
parents:
78
diff
changeset
|
1235 branch = False |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1236 if len(split) == 2: |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1237 message, meta = split |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1238 lines = meta.split("\n") |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1239 for line in lines: |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1240 if line == '': |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1241 continue |
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1242 |
456
4ed0d8dac6e7
git_handler: add missing not from hg metadata extraction
Augie Fackler <raf@durin42.com>
parents:
452
diff
changeset
|
1243 if ' : ' not in line: |
452
797a3584c78f
git_handler: fix line.split error when bad data from a rebase is in the log
Sean Farley <sean@mcs.anl.gov>
parents:
450
diff
changeset
|
1244 break |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1245 command, data = line.split(" : ", 1) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1246 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1247 if command == 'rename': |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1248 before, after = data.split(" => ", 1) |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1249 renames[after] = before |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1250 if command == 'branch': |
79
7b4cf18c896b
readded yet another piece of code that disappeared at some point, recovering branches properly
Scott Chacon <schacon@gmail.com>
parents:
78
diff
changeset
|
1251 branch = data |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
1252 if command == 'extra': |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
1253 before, after = data.split(" : ", 1) |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
1254 extra[before] = urllib.unquote(after) |
204
4734153365ac
revert the changes made in 405a915bf352 and 8bfa8aa6b68f
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
203
diff
changeset
|
1255 return (message, renames, branch, extra) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1256 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1257 def get_file(self, commit, f): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1258 otree = self.git.tree(commit.tree) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1259 parts = f.split('/') |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1260 for part in parts: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1261 (mode, sha) = otree[part] |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1262 obj = self.git.get_object(sha) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1263 if isinstance (obj, Blob): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1264 return (mode, sha, obj._text) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1265 elif isinstance(obj, Tree): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1266 otree = obj |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1267 |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1268 def get_files_changed(self, commit): |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1269 tree = commit.tree |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1270 btree = None |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1271 |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1272 if commit.parents: |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1273 btree = self.git[commit.parents[0]].tree |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1274 |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1275 changes = self.git.object_store.tree_changes(btree, tree) |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1276 files = {} |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1277 gitlinks = {} |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1278 for (oldfile, newfile), (oldmode, newmode), (oldsha, newsha) in changes: |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1279 # actions are described by the following table ('no' means 'does not |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1280 # exist'): |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1281 # old new | action |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1282 # no file | record file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1283 # no gitlink | record gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1284 # file no | delete file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1285 # file file | record file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1286 # file gitlink | delete file and record gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1287 # gitlink no | delete gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1288 # gitlink file | delete gitlink and record file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1289 # gitlink gitlink | record gitlink |
287
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
1290 if newmode == 0160000: |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1291 # new = gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1292 gitlinks[newfile] = newsha |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1293 if oldmode is not None and oldmode != 0160000: |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1294 # file -> gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1295 files[oldfile] = True, None, None |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1296 continue |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1297 if oldmode == 0160000 and newmode != 0160000: |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1298 # gitlink -> no/file (gitlink -> gitlink is covered above) |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1299 gitlinks[oldfile] = None |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1300 continue |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1301 if newfile is not None: |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1302 # new = file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1303 files[newfile] = False, newmode, newsha |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1304 else: |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1305 # old = file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1306 files[oldfile] = True, None, None |
287
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
1307 |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1308 return files, gitlinks |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1309 |
476
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1310 def parse_gitmodules(self, tree_obj): |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1311 """Parse .gitmodules from a git tree specified by tree_obj |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1312 |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1313 :return: list of tuples (submodule path, url, name), |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1314 where name is quoted part of the section's name, or |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1315 empty list if nothing found |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1316 """ |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1317 rv = [] |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1318 try: |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1319 unused_mode,gitmodules_sha = tree_obj['.gitmodules'] |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1320 except KeyError: |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1321 return rv |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1322 gitmodules_content = self.git[gitmodules_sha].data |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1323 fo = StringIO.StringIO(gitmodules_content) |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1324 tt = dul_config.ConfigFile.from_file(fo) |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1325 for section in tt.keys(): |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1326 section_kind, section_name = section |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1327 if section_kind == 'submodule': |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1328 sm_path = tt.get(section, 'path') |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1329 sm_url = tt.get(section, 'url') |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1330 rv.append((sm_path, sm_url, section_name)) |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1331 return rv |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1332 |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1333 def git_file_readlines(self, tree_obj, fname): |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1334 """Read content of a named entry from the git commit tree |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1335 |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1336 :return: list of lines |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1337 """ |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1338 if fname in tree_obj: |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1339 unused_mode, sha = tree_obj[fname] |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1340 content = self.git[sha].data |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1341 return content.splitlines() |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1342 return [] |
b9ede5f91701
Subrepos: generate .hgsubstate and .hgsub based on gitlinks and .gitmodules, preserve gitlinks on hg commit export. Tests included. Dependency from PyPI's ordereddict to use OrderedDict
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
475
diff
changeset
|
1343 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1344 def remote_name(self, remote): |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1345 names = [name for name, path in self.paths if path == remote] |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1346 if names: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1347 return names[0] |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1348 |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1349 # Stolen from hgsubversion |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1350 def swap_out_encoding(self, new_encoding='UTF-8'): |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1351 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1352 from mercurial import encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1353 old = encoding.encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1354 encoding.encoding = new_encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1355 except ImportError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1356 old = hgutil._encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1357 hgutil._encoding = new_encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1358 return old |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1359 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1360 def decode_guess(self, string, encoding): |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1361 # text is not valid utf-8, try to make sense of it |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1362 if encoding: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1363 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1364 return string.decode(encoding).encode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1365 except UnicodeDecodeError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1366 pass |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1367 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1368 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1369 return string.decode('latin-1').encode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1370 except UnicodeDecodeError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1371 return string.decode('ascii', 'replace').encode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1372 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
1373 def get_transport_and_path(self, uri): |
369
e5c743cd0da1
pass hg's ui.ssh config to dulwich
Tay Ray Chuan <rctay89@gmail.com>
parents:
368
diff
changeset
|
1374 # pass hg's ui.ssh config to dulwich |
e5c743cd0da1
pass hg's ui.ssh config to dulwich
Tay Ray Chuan <rctay89@gmail.com>
parents:
368
diff
changeset
|
1375 if not issubclass(client.get_ssh_vendor, _ssh.SSHVendor): |
e5c743cd0da1
pass hg's ui.ssh config to dulwich
Tay Ray Chuan <rctay89@gmail.com>
parents:
368
diff
changeset
|
1376 client.get_ssh_vendor = _ssh.generate_ssh_vendor(self.ui) |
e5c743cd0da1
pass hg's ui.ssh config to dulwich
Tay Ray Chuan <rctay89@gmail.com>
parents:
368
diff
changeset
|
1377 |
538
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
1378 git_match = RE_GIT_URI.match(uri) |
446
7e6fc0efc500
Removed support for URLs beginning with git@. These URLs are not possible from within mercurial.
Jason R. Coombs <jaraco@jaraco.com>
parents:
445
diff
changeset
|
1379 if git_match: |
7e6fc0efc500
Removed support for URLs beginning with git@. These URLs are not possible from within mercurial.
Jason R. Coombs <jaraco@jaraco.com>
parents:
445
diff
changeset
|
1380 res = git_match.groupdict() |
7e6fc0efc500
Removed support for URLs beginning with git@. These URLs are not possible from within mercurial.
Jason R. Coombs <jaraco@jaraco.com>
parents:
445
diff
changeset
|
1381 transport = client.SSHGitClient if 'ssh' in res['scheme'] else client.TCPGitClient |
7e6fc0efc500
Removed support for URLs beginning with git@. These URLs are not possible from within mercurial.
Jason R. Coombs <jaraco@jaraco.com>
parents:
445
diff
changeset
|
1382 host, port, sepr, path = res['host'], res['port'], res['sepr'], res['path'] |
601
ca86479dd2d9
Make the path part of URL contain a leading slash only if it's not followed by tilde. (issue #71)
Risto Kankkunen <risto.kankkunen@iki.fi>
parents:
600
diff
changeset
|
1383 if sepr == '/' and not path.startswith('~'): |
446
7e6fc0efc500
Removed support for URLs beginning with git@. These URLs are not possible from within mercurial.
Jason R. Coombs <jaraco@jaraco.com>
parents:
445
diff
changeset
|
1384 path = '/' + path |
447
1189e52ba27c
Strip trailing slash for heroku-style URLs. Fixes #31. Includes a regression test for the fix.
Jason R. Coombs <jaraco@jaraco.com>
parents:
446
diff
changeset
|
1385 # strip trailing slash for heroku-style URLs |
1189e52ba27c
Strip trailing slash for heroku-style URLs. Fixes #31. Includes a regression test for the fix.
Jason R. Coombs <jaraco@jaraco.com>
parents:
446
diff
changeset
|
1386 # ssh+git://git@heroku.com:project.git/ |
1189e52ba27c
Strip trailing slash for heroku-style URLs. Fixes #31. Includes a regression test for the fix.
Jason R. Coombs <jaraco@jaraco.com>
parents:
446
diff
changeset
|
1387 if sepr == ':' and path.endswith('.git/'): |
1189e52ba27c
Strip trailing slash for heroku-style URLs. Fixes #31. Includes a regression test for the fix.
Jason R. Coombs <jaraco@jaraco.com>
parents:
446
diff
changeset
|
1388 path = path.rstrip('/') |
446
7e6fc0efc500
Removed support for URLs beginning with git@. These URLs are not possible from within mercurial.
Jason R. Coombs <jaraco@jaraco.com>
parents:
445
diff
changeset
|
1389 if port: |
7e6fc0efc500
Removed support for URLs beginning with git@. These URLs are not possible from within mercurial.
Jason R. Coombs <jaraco@jaraco.com>
parents:
445
diff
changeset
|
1390 client.port = port |
261
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
1391 |
446
7e6fc0efc500
Removed support for URLs beginning with git@. These URLs are not possible from within mercurial.
Jason R. Coombs <jaraco@jaraco.com>
parents:
445
diff
changeset
|
1392 return transport(host, thin_packs=False, port=port), path |
439
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1393 |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1394 httpclient = getattr(client, 'HttpGitClient', None) |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1395 |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1396 if uri.startswith('git+http://') or uri.startswith('git+https://'): |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1397 uri = uri[4:] |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1398 |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1399 if uri.startswith('http://') or uri.startswith('https://'): |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1400 if not httpclient: |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1401 raise RepoError('git via HTTP requires dulwich 0.8.1 or later') |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1402 else: |
635
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1403 auth_handler = urllib2.HTTPBasicAuthHandler(AuthManager(self.ui)) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1404 opener = urllib2.build_opener(auth_handler) |
636
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1405 try: |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1406 return client.HttpGitClient(uri, opener=opener, thin_packs=False), uri |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1407 except TypeError as e: |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1408 if e.message.find("unexpected keyword argument 'opener'") >= 0: |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1409 # using a version of dulwich that doesn't support |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1410 # http(s) authentication -- try without authentication |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1411 return client.HttpGitClient(uri, thin_packs=False), uri |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1412 else: |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1413 raise |
439
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1414 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
1415 # if its not git or git+ssh, try a local url.. |
286
0661d5721ad7
git_handler: use progress API instead of reinventing the wheel
Augie Fackler <durin42@gmail.com>
parents:
285
diff
changeset
|
1416 return client.SubprocessGitClient(thin_packs=False), uri |
635
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1417 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1418 class AuthManager(object): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1419 def __init__(self, ui): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1420 self.ui = ui |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1421 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1422 def add_password(self, realm, uri, user, passwd): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1423 raise NotImplementedError( |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1424 'AuthManager currently gets passwords from hg repo config') |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1425 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1426 def find_user_password(self, realm, authuri): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1427 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1428 # find a stanza in the auth section which matches this uri |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1429 for item in self.ui.configitems('auth'): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1430 if len(item) < 2: |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1431 continue |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1432 if item[0].endswith('.prefix') and authuri.startswith(item[1]): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1433 prefix = item[0][:-len('.prefix')] |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1434 break |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1435 else: |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1436 # no matching stanza found! |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1437 return (None,None) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1438 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1439 self.ui.note(_('using "%s" auth credentials\n') % (prefix,)) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1440 username = self.ui.config('auth', '%s.username' % prefix) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1441 password = self.ui.config('auth', '%s.password' % prefix) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1442 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1443 return (username,password) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1444 |