Mercurial > hg > hg-git
annotate hggit/git_handler.py @ 705:373f854ff58f
git_handler.fetch: only import commits reachable from requested heads
Previously we'd attempt to import every single reachable commit in the Git
object store.
The test adds another branch to the Git repo and doesn't import it until much
later. Previously we'd import it when we ran `hg -R hgrepo pull -r beta`. Now
we won't.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Tue, 04 Mar 2014 16:23:11 -0800 |
parents | 4cddcb768cf4 |
children | 4f0a154ae374 |
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) |
392 | 359 if total: |
560
9c71a6f00863
push: suppress "exporting hg objects to git" message
David M. Carr <david@carrclan.us>
parents:
559
diff
changeset
|
360 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
|
361 |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
362 # 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
|
363 # for all other changesets are already present in the Git repository. |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
364 # This assertion is necessary to prevent redundant work. |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
365 exporter = hg2git.IncrementalChangesetExporter(self.repo) |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
366 |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
367 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
|
368 self.ui.progress('exporting', i, total=total) |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
369 ctx = self.repo.changectx(rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
370 state = ctx.extra().get('hg-git', None) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
371 if state == 'octopus': |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
372 self.ui.debug("revision %d is a part " |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
373 "of octopus explosion\n" % ctx.rev()) |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
374 continue |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
375 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
|
376 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
|
377 |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
378 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
379 # 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
|
380 # 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
|
381 # 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
|
382 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
|
383 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
|
384 |
203
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
385 oldenc = self.swap_out_encoding() |
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
386 |
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 extra = ctx.extra() |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
389 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
390 commit = Commit() |
68
d28d3763eda3
Deal with hg authors missing email attributes.
Chris Wanstrath <chris@ozmm.org>
parents:
65
diff
changeset
|
391 |
235
912d6a5837c8
reorganize export_hg_commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
234
diff
changeset
|
392 (time, timezone) = ctx.date() |
594
ce6ad4c0cba7
scrub bad timezone values before dulwich sees them
Hal Wine <hwine@mozilla.com>
parents:
593
diff
changeset
|
393 # 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
|
394 # 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
|
395 # 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
|
396 # 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
|
397 # simplest and round down. |
ce6ad4c0cba7
scrub bad timezone values before dulwich sees them
Hal Wine <hwine@mozilla.com>
parents:
593
diff
changeset
|
398 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
|
399 commit.author = self.get_git_author(ctx) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
400 commit.author_time = int(time) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
401 commit.author_timezone = -timezone |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
402 |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
403 if 'committer' in extra: |
131
dd6c77ec206c
store commitdate in mercurial's internal format.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
129
diff
changeset
|
404 # fixup timezone |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
405 (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
|
406 commit.committer = name |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
407 commit.commit_time = timestamp |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
408 |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
409 # 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
|
410 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
|
411 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
|
412 # 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
|
413 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
|
414 timezone, neg_utc = timezone |
361 | 415 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
|
416 else: |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
417 timezone = -int(timezone) |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
418 commit.commit_timezone = timezone |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
419 else: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
420 commit.committer = commit.author |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
421 commit.commit_time = commit.author_time |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
422 commit.commit_timezone = commit.author_timezone |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
423 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
424 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
|
425 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
|
426 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
|
427 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
|
428 if git_sha: |
543
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
429 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
|
430 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
|
431 'repo: %s' % git_sha)) |
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
432 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
433 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
|
434 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
435 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
|
436 |
118
b3be536e3f50
handles git commit encoding fields now
Scott Chacon <schacon@gmail.com>
parents:
113
diff
changeset
|
437 if 'encoding' in extra: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
438 commit.encoding = extra['encoding'] |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
439 |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
440 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
|
441 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
|
442 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
|
443 |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
444 tree_sha = exporter.root_tree_sha |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
445 |
543
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
446 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
|
447 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
|
448 tree_sha)) |
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
449 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
450 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
|
451 |
697
a7383625c891
git_handler: don't write out objects if already in object store
Siddharth Agarwal <sid0@fb.com>
parents:
693
diff
changeset
|
452 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
|
453 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
|
454 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
|
455 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
456 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
|
457 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
|
458 |
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
|
459 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
|
460 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
|
461 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
462 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
|
463 command: |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
464 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
465 [...] 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
|
466 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
467 committer |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
468 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
|
469 and when they made it. |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
470 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
471 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
|
472 "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
|
473 ("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
|
474 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
|
475 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
|
476 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
|
477 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
|
478 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
|
479 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
480 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
|
481 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
|
482 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
|
483 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
|
484 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
|
485 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
|
486 convenience. |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
487 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
488 TESTS: |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
489 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
490 >>> from mercurial.ui import ui |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
491 >>> 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
|
492 >>> g('John Doe') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
493 'John Doe' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
494 >>> g('john@doe.com') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
495 'john@doe.com' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
496 >>> g(' <john@doe.com> ') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
497 'john@doe.com' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
498 >>> g(' <random<\n<garbage\n> > > ') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
499 'random???garbage?' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
500 >>> 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
|
501 '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
|
502 """ |
539
7bf60690386c
Precompile Git username sanitizing regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
538
diff
changeset
|
503 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
|
504 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
505 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
|
506 # 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
|
507 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
|
508 |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
509 # see if a translation exists |
537
6e05aa1b536d
Optimize get_git_author
Gregory Szorc <gregory.szorc@gmail.com>
parents:
523
diff
changeset
|
510 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
|
511 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
512 # check for git author pattern compliance |
537
6e05aa1b536d
Optimize get_git_author
Gregory Szorc <gregory.szorc@gmail.com>
parents:
523
diff
changeset
|
513 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
|
514 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
515 if a: |
448
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
516 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
|
517 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
|
518 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
|
519 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
|
520 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
|
521 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
|
522 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
|
523 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
|
524 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
|
525 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
526 if 'author' in ctx.extra(): |
307
7dfe8be21135
handle apply_delta() return value correctly
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
527 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
|
528 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
529 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
|
530 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
531 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
|
532 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
|
533 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
|
534 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
535 parents = [] |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
536 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
|
537 # 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
|
538 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
|
539 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
|
540 (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
|
541 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
|
542 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
|
543 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
|
544 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
|
545 else: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
546 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
|
547 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
548 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
|
549 |
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 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
|
551 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
|
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 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
|
554 if 'message' in extra: |
307
7dfe8be21135
handle apply_delta() return value correctly
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
555 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
|
556 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
557 # 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
|
558 add_extras = False |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
559 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
|
560 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
|
561 add_extras = True |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
562 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
|
563 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
564 renames = [] |
247
3c01e07b0252
look for renamed files only in files modified by the commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
245
diff
changeset
|
565 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
|
566 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
|
567 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
|
568 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
|
569 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
|
570 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
|
571 |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
572 if renames: |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
573 add_extras = True |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
574 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
|
575 extra_message += "rename : " + oldfile + " => " + newfile + "\n" |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
576 |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
577 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
|
578 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
|
579 continue |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
580 else: |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
581 add_extras = True |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
582 extra_message += "extra : " + key + " : " + urllib.quote(value) + "\n" |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
583 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
584 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
|
585 message += "\n--HG--\n" + extra_message |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
586 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
587 return message |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
588 |
408 | 589 def getnewgitcommits(self, refs=None): |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
590 # import heads and fetched tags as remote references |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
591 todo = [] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
592 done = set() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
593 convert_list = {} |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
594 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
595 # 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
|
596 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
|
597 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
|
598 refs = self.git.refs.as_dict() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
599 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
|
600 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
|
601 # 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
|
602 # 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
|
603 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
|
604 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
|
605 while isinstance(obj, Tag): |
337
6cea997ee302
enforce stricter matching for pull -r
Tay Ray Chuan <rctay89@gmail.com>
parents:
258
diff
changeset
|
606 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
|
607 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
|
608 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
|
609 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
|
610 todo.append(sha) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
611 |
284
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
612 # sort by commit date |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
613 def commitdate(sha): |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
614 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
|
615 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
|
616 |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
617 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
|
618 |
653
4ab616864329
git_handler: note that new commits are returned in topo order
Siddharth Agarwal <sid0@fb.com>
parents:
652
diff
changeset
|
619 # 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
|
620 # 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
|
621 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
|
622 seen = set(todo) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
623 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
|
624 sha = todo[-1] |
655
baba2cf03d41
git_handler: terminate new commit DAG traversal at known commits
Siddharth Agarwal <sid0@fb.com>
parents:
654
diff
changeset
|
625 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
|
626 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
|
627 continue |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
628 assert isinstance(sha, str) |
654
f221c7b5bdfb
git_handler: use convert_list to cache git objects
Siddharth Agarwal <sid0@fb.com>
parents:
653
diff
changeset
|
629 if sha in convert_list: |
f221c7b5bdfb
git_handler: use convert_list to cache git objects
Siddharth Agarwal <sid0@fb.com>
parents:
653
diff
changeset
|
630 obj = convert_list[sha] |
f221c7b5bdfb
git_handler: use convert_list to cache git objects
Siddharth Agarwal <sid0@fb.com>
parents:
653
diff
changeset
|
631 else: |
f221c7b5bdfb
git_handler: use convert_list to cache git objects
Siddharth Agarwal <sid0@fb.com>
parents:
653
diff
changeset
|
632 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
|
633 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
|
634 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
|
635 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
|
636 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
|
637 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
|
638 # 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
|
639 # 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
|
640 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
|
641 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
|
642 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
|
643 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
|
644 todo.pop() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
645 |
655
baba2cf03d41
git_handler: terminate new commit DAG traversal at known commits
Siddharth Agarwal <sid0@fb.com>
parents:
654
diff
changeset
|
646 return convert_list, commits |
408 | 647 |
648 def import_git_objects(self, remote_name=None, refs=None): | |
649 convert_list, commits = self.getnewgitcommits(refs) | |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
650 # import each of the commits, oldest first |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
651 total = len(commits) |
392 | 652 if total: |
653 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
|
654 else: |
178b15457927
git_handler: base 'no changes found' message on commits, not on heads
Siddharth Agarwal <sid0@fb.com>
parents:
701
diff
changeset
|
655 self.ui.status(_("no changes found\n")) |
392 | 656 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
657 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
|
658 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
|
659 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
|
660 self.import_git_commit(commit) |
686
c7129c72baff
git_handler: replace util.progress with ui.progress
Siddharth Agarwal <sid0@fb.com>
parents:
684
diff
changeset
|
661 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
|
662 |
684
13d64d9dd26c
git_handler: remove old and bogus code for deleting entries from tags cache
Siddharth Agarwal <sid0@fb.com>
parents:
683
diff
changeset
|
663 # 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
|
664 return total |
400
6d4f3b6d2e08
respect references to tags that differ between git and .hgtags
Adrian Sampson <adrian@radbox.org>
parents:
398
diff
changeset
|
665 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
666 def import_git_commit(self, commit): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
667 self.ui.debug(_("importing: %s\n") % commit.id) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
668 |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
669 (strip_message, hg_renames, |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
670 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
|
671 |
641
cacd98c7382e
git_handler: move gparents initialization up to start of import_git_commit
Siddharth Agarwal <sid0@fb.com>
parents:
640
diff
changeset
|
672 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
|
673 |
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
|
674 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
|
675 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
|
676 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
|
677 '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
|
678 |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
679 # 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
|
680 files, gitlinks = self.get_files_changed(commit) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
681 |
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
|
682 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
|
683 |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
684 # 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
|
685 # gitlinks. Order of application: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
686 # - preexisting .hgsubstate in git tree |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
687 # - .hgsubstate from hg parent |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
688 # - changes in gitlinks |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
689 hgsubstate = util.parse_hgsubstate( |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
690 self.git_file_readlines(git_commit_tree, '.hgsubstate')) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
691 parentsubdata = '' |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
692 if gparents: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
693 p1ctx = self.repo.changectx(gparents[0]) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
694 if '.hgsubstate' in p1ctx: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
695 parentsubdata = p1ctx.filectx('.hgsubstate').data().splitlines() |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
696 parentsubstate = util.parse_hgsubstate(parentsubdata) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
697 for path, sha in parentsubstate.iteritems(): |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
698 hgsubstate[path] = sha |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
699 for path, sha in gitlinks.iteritems(): |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
700 if sha is None: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
701 hgsubstate.pop(path, None) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
702 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
|
703 hgsubstate[path] = sha |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
704 # in case .hgsubstate wasn't among changed files |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
705 # force its inclusion |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
706 if not hgsubstate and parentsubdata: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
707 files['.hgsubstate'] = True, None, None |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
708 elif util.serialize_hgsubstate(hgsubstate) != parentsubdata: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
709 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
|
710 |
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
|
711 # 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
|
712 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
|
713 gitmodules = self.parse_gitmodules(git_commit_tree) |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
714 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
|
715 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
|
716 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
|
717 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
|
718 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
|
719 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
|
720 # 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
|
721 # 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
|
722 # 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
|
723 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
|
724 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
725 date = (commit.author_time, -commit.author_timezone) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
726 text = strip_message |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
727 |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
728 origtext = text |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
729 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
730 text.decode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
731 except UnicodeDecodeError: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
732 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
|
733 |
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
734 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
|
735 if text + '\n' != origtext: |
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
736 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
|
737 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
738 author = commit.author |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
739 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
740 # convert extra data back to the end |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
741 if ' ext:' in commit.author: |
540
3fb942852b1c
Precompile Git author extra data regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
539
diff
changeset
|
742 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
|
743 if m: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
744 name = m.group(1) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
745 ex = urllib.unquote(m.group(2)) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
746 email = m.group(3) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
747 author = name + ' <' + email + '>' + ex |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
748 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
749 if ' <none@none>' in commit.author: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
750 author = commit.author[:-12] |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
751 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
752 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
753 author.decode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
754 except UnicodeDecodeError: |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
755 origauthor = author |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
756 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
|
757 extra['author'] = create_delta(author, origauthor) |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
758 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
759 oldenc = self.swap_out_encoding() |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
760 |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
761 def findconvergedfiles(p1, p2): |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
762 # 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
|
763 # (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
|
764 # 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
|
765 # 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
|
766 # 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
|
767 # 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
|
768 # begin with). |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
769 if p2 == nullid: |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
770 return [] |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
771 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
|
772 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
|
773 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
|
774 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
|
775 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
776 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
|
777 info = files.get(f) |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
778 if info != None: |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
779 # 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
|
780 delete, mode, sha = info |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
781 if delete: |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
782 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
|
783 |
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
|
784 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
|
785 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
|
786 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
|
787 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
|
788 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
|
789 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
|
790 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
|
791 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
|
792 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
|
793 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
|
794 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
|
795 else: |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
796 # it's a converged file |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
797 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
|
798 data = fc.data() |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
799 e = fc.flags() |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
800 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
|
801 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
802 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
|
803 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
804 p1, p2 = (nullid, nullid) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
805 octopus = False |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
806 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
807 if len(gparents) > 1: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
808 # merge, possibly octopus |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
809 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
|
810 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
|
811 list(files) + findconvergedfiles(p1, p2), |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
812 getfilectx, author, date, {'hg-git': 'octopus'}) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
813 return hex(self.repo.commitctx(ctx)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
814 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
815 octopus = len(gparents) > 2 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
816 p2 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
817 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
818 while len(gparents) > 0: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
819 p2 = commit_octopus(p1, p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
820 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
821 else: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
822 if gparents: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
823 p1 = gparents.pop() |
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 pa = None |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
826 if not (p2 == nullid): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
827 node1 = self.repo.changectx(p1) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
828 node2 = self.repo.changectx(p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
829 pa = node1.ancestor(node2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
830 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
831 # if named branch, add to extra |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
832 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
833 extra['branch'] = hg_branch |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
834 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
835 # 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
|
836 if commit.author != commit.committer \ |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
837 or commit.author_time != commit.commit_time \ |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
838 or commit.author_timezone != commit.commit_timezone: |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
839 extra['committer'] = "%s %d %d" % ( |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
840 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
|
841 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
842 if commit.encoding: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
843 extra['encoding'] = commit.encoding |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
844 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
845 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
846 extra['branch'] = hg_branch |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
847 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
848 if octopus: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
849 extra['hg-git'] ='octopus-done' |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
850 |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
851 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
|
852 list(files) + findconvergedfiles(p1, p2), |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
853 getfilectx, author, date, extra) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
854 |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
855 node = self.repo.commitctx(ctx) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
856 |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
857 self.swap_out_encoding(oldenc) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
858 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
859 # save changeset to mapping file |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
860 cs = hex(node) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
861 self.map_set(commit.id, cs) |
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 ## 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
|
864 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
865 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
|
866 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
|
867 old_refs = {} |
592
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
868 change_totals = {} |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
869 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
870 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
|
871 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
|
872 old_refs.update(refs) |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
873 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
|
874 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
|
875 |
592
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
876 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
|
877 commits = [] |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
878 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
|
879 (sha, name) = mo |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
880 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
|
881 t = type(o) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
882 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
|
883 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
|
884 commits.append(sha) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
885 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
|
886 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
|
887 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
|
888 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
|
889 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
|
890 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
|
891 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
|
892 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
|
893 |
26
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
894 try: |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
895 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
|
896 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
|
897 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
|
898 " 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
|
899 (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
|
900 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
|
901 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
|
902 return old_refs, new_refs |
394
721165a45385
Catch GitProtocolError wherever HangupException can occur.
Brendan Cully <brendan@kublai.com>
parents:
392
diff
changeset
|
903 except (HangupException, GitProtocolError), e: |
721165a45385
Catch GitProtocolError wherever HangupException can occur.
Brendan Cully <brendan@kublai.com>
parents:
392
diff
changeset
|
904 raise hgutil.Abort(_("git remote error: ") + str(e)) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
905 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
906 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
|
907 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
|
908 |
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
|
909 #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
|
910 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
|
911 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
|
912 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
|
913 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
|
914 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
|
915 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
|
916 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
|
917 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
|
918 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
|
919 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
|
920 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
|
921 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
|
922 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
923 for rev in revs: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
924 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
|
925 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
|
926 labels = lambda c: ctx.tags() + [ |
448
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
927 fltr for fltr, bm |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
928 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
|
929 ] |
376
b4f5f2729acb
git_handler: update ctx label handling for bookmarks in core
Augie Fackler <durin42@gmail.com>
parents:
375
diff
changeset
|
930 else: |
b4f5f2729acb
git_handler: update ctx label handling for bookmarks in core
Augie Fackler <durin42@gmail.com>
parents:
375
diff
changeset
|
931 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
|
932 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
|
933 |
80544310834a
fix handling of spaces in hg tag names
Dmitry Gladkov <dmitry.gladkov@gmail.com>
parents:
376
diff
changeset
|
934 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
|
935 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
|
936 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
937 if not (heads or tags): |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
938 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
|
939 " it doesn't have a ref" % ctx) |
149 | 940 |
310
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
941 # 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
|
942 # 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
|
943 # list of these tags. |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
944 # |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
945 # 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
|
946 # 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
|
947 # 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
|
948 uptodate_annotated_tags = [] |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
949 for r in tags: |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
950 ref = 'refs/tags/'+r |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
951 # Check tag. |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
952 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
|
953 continue |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
954 try: |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
955 # 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
|
956 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
|
957 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
|
958 continue |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
959 except KeyError: |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
960 continue |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
961 |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
962 # 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
|
963 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
|
964 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
965 for r in heads + tags: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
966 if r in heads: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
967 ref = 'refs/heads/'+r |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
968 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
969 ref = 'refs/tags/'+r |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
970 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
971 if ref not in refs: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
972 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
|
973 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
|
974 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
|
975 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
|
976 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
|
977 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
978 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
|
979 % (ref, ctx)) |
310
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
980 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
|
981 # 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
|
982 pass |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
983 else: |
630
3ff09f0fac7a
git_handler.py: less cryptic error message when push fails
anatoly techtonik <techtonik@gmail.com>
parents:
622
diff
changeset
|
984 raise hgutil.Abort( |
3ff09f0fac7a
git_handler.py: less cryptic error message when push fails
anatoly techtonik <techtonik@gmail.com>
parents:
622
diff
changeset
|
985 "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
|
986 "please pull and merge before pushing" % ref) |
126 | 987 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
988 return new_refs |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
989 |
557
4f4ab2d89375
gitrepo: initial support for listkeys
David M. Carr <david@carrclan.us>
parents:
555
diff
changeset
|
990 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
|
991 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
|
992 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
|
993 |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
994 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
|
995 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
|
996 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
|
997 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
998 try: |
609
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
999 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
|
1000 f = StringIO.StringIO() |
609
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1001 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
|
1002 if(f.pos != 0): |
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1003 f.seek(0) |
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1004 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
|
1005 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
|
1006 |
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
|
1007 # 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
|
1008 # 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
|
1009 # 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
|
1010 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
|
1011 except (HangupException, GitProtocolError), e: |
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1012 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
|
1013 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1014 ## REFERENCES HANDLING |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1015 |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1016 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
|
1017 '''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
|
1018 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
|
1019 |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1020 ''' |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1021 filteredrefs = {} |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1022 if heads: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1023 # 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
|
1024 # 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
|
1025 stripped_refs = [ |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1026 (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
|
1027 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
|
1028 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
|
1029 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
|
1030 if not r: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1031 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
|
1032 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
|
1033 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
|
1034 else: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1035 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
|
1036 else: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1037 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
|
1038 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
|
1039 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
|
1040 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
|
1041 filteredrefs[ref] = sha |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1042 return filteredrefs |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1043 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1044 def update_references(self): |
195
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
1045 heads = self.local_heads() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1046 |
195
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
1047 # 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
|
1048 # Mercurial bookmark. |
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
1049 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
|
1050 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
|
1051 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
|
1052 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
|
1053 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1054 def export_hg_tags(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1055 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
|
1056 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
|
1057 tag = tag.replace(' ', '_') |
587
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1058 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
|
1059 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
|
1060 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
|
1061 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
|
1062 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
|
1063 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
|
1064 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
|
1065 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
|
1066 '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
|
1067 '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
|
1068 else: |
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1069 self.repo.ui.warn( |
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1070 '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
|
1071 'has no matching git revision.\n' % tag) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1072 |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1073 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
|
1074 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
|
1075 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
|
1076 else: |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1077 def _filter_bm(bm): |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1078 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
|
1079 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
|
1080 else: |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1081 return bm |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1082 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
|
1083 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1084 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
|
1085 try: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1086 if getattr(bookmarks, 'parse', None): |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1087 bms = bookmarks.parse(self.repo) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1088 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1089 bms = self.repo._bookmarks |
448
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
1090 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
|
1091 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
|
1092 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
|
1093 return {} |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1094 |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
1095 def import_tags(self, refs): |
149 | 1096 keys = refs.keys() |
1097 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
|
1098 return |
688
7ca655e44d9a
git_handler: don't compute tags for each tag imported
Siddharth Agarwal <sid0@fb.com>
parents:
686
diff
changeset
|
1099 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
|
1100 for k in keys[:]: |
149 | 1101 ref_name = k |
1102 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
|
1103 if parts[0] == 'refs' and parts[1] == 'tags': |
149 | 1104 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
|
1105 # 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
|
1106 # the ones we are pulling |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1107 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
|
1108 continue |
149 | 1109 if ref_name[-3:] == '^{}': |
1110 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
|
1111 if not ref_name in repotags: |
149 | 1112 obj = self.git.get_object(refs[k]) |
1113 sha = None | |
1114 if isinstance (obj, Commit): # lightweight | |
1115 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
|
1116 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
|
1117 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
|
1118 elif isinstance (obj, Tag): # annotated |
337
6cea997ee302
enforce stricter matching for pull -r
Tay Ray Chuan <rctay89@gmail.com>
parents:
258
diff
changeset
|
1119 (obj_type, obj_sha) = obj.object |
149 | 1120 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
|
1121 if isinstance (obj, Commit): |
149 | 1122 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
|
1123 # 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
|
1124 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
|
1125 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
|
1126 self.save_tags() |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1127 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1128 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
|
1129 try: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1130 oldbm = getattr(bookmarks, 'parse', None) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1131 if oldbm: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1132 bms = bookmarks.parse(self.repo) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1133 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1134 bms = self.repo._bookmarks |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1135 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1136 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
|
1137 if ref.startswith('refs/heads/')]) |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
1138 |
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
|
1139 suffix = self.branch_bookmark_suffix or '' |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
1140 for head, sha in heads.iteritems(): |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1141 # 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
|
1142 # 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
|
1143 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
|
1144 if hgsha is None: |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1145 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
|
1146 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
|
1147 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
|
1148 # 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
|
1149 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
|
1150 else: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1151 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
|
1152 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
|
1153 # 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
|
1154 bms[head + suffix] = hgsha |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1155 |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
1156 if heads: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1157 if oldbm: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1158 bookmarks.write(self.repo, bms) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1159 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1160 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
|
1161 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
|
1162 bms.write() |
96e75caaf900
git_handler: add bookmark compatibility with new bmstore (issue #60)
David M. Carr <david@carrclan.us>
parents:
587
diff
changeset
|
1163 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
|
1164 bookmarks.write(self.repo) |
161
134915637cf7
Merge branch 'octo' with octo merge code
Scott Chacon <schacon@gmail.com>
diff
changeset
|
1165 |
29
2a5c0bf0fef5
Another way of fixing no-bookmark issue, along with updated test.
Augie Fackler <durin42@gmail.com>
parents:
28
diff
changeset
|
1166 except AttributeError: |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
1167 self.ui.warn(_('creating bookmarks failed, do you have' |
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
1168 ' 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
|
1169 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1170 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
|
1171 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
|
1172 tags = self.repo.gitrefs() |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1173 # 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
|
1174 # 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
|
1175 # 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
|
1176 for t in list(tags): |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1177 if t.startswith(remote_name + '/'): |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1178 del tags[t] |
368
ae78f94f64fd
Fix bug where remote ref map wrote out binary nodes.
Augie Fackler <durin42@gmail.com>
parents:
367
diff
changeset
|
1179 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
|
1180 store = self.git.object_store |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1181 for ref_name, sha in refs.iteritems(): |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1182 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
|
1183 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
|
1184 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
|
1185 continue |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1186 head = ref_name[11:] |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1187 tags['/'.join((remote_name, head))] = hgsha |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1188 # TODO(durin42): what is this doing? |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1189 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
|
1190 self.git.refs[new_ref] = sha |
316
7e5ed21ceec1
git_handler: prefer () continuation to \ continuation.
Augie Fackler <durin42@gmail.com>
parents:
306
diff
changeset
|
1191 elif (ref_name.startswith('refs/tags') |
7e5ed21ceec1
git_handler: prefer () continuation to \ continuation.
Augie Fackler <durin42@gmail.com>
parents:
306
diff
changeset
|
1192 and not ref_name.endswith('^{}')): |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1193 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
|
1194 |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1195 tf = open(tagfile, 'wb') |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1196 for tag, node in tags.iteritems(): |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1197 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
|
1198 tf.close() |
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1199 |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
1200 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1201 ## UTILITY FUNCTIONS |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1202 |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1203 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
|
1204 # TODO: make these into constants |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1205 convert = { |
121
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
1206 0100644: '', |
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
1207 0100755: 'x', |
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
1208 0120000: 'l'} |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1209 if mode in convert: |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1210 return convert[mode] |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1211 return '' |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
1212 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1213 def extract_hg_metadata(self, message): |
227
c4f6e6f24bf1
fix bug introduced by previous commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
226
diff
changeset
|
1214 split = message.split("\n--HG--\n", 1) |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1215 renames = {} |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
1216 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
|
1217 branch = False |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1218 if len(split) == 2: |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1219 message, meta = split |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1220 lines = meta.split("\n") |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1221 for line in lines: |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1222 if line == '': |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1223 continue |
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1224 |
456
4ed0d8dac6e7
git_handler: add missing not from hg metadata extraction
Augie Fackler <raf@durin42.com>
parents:
452
diff
changeset
|
1225 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
|
1226 break |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1227 command, data = line.split(" : ", 1) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1228 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1229 if command == 'rename': |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1230 before, after = data.split(" => ", 1) |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1231 renames[after] = before |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
1232 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
|
1233 branch = data |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
1234 if command == 'extra': |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
1235 before, after = data.split(" : ", 1) |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
1236 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
|
1237 return (message, renames, branch, extra) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1238 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1239 def get_file(self, commit, f): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1240 otree = self.git.tree(commit.tree) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1241 parts = f.split('/') |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1242 for part in parts: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1243 (mode, sha) = otree[part] |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1244 obj = self.git.get_object(sha) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1245 if isinstance (obj, Blob): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1246 return (mode, sha, obj._text) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1247 elif isinstance(obj, Tree): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1248 otree = obj |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1249 |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1250 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
|
1251 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
|
1252 btree = None |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1253 |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1254 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
|
1255 btree = self.git[commit.parents[0]].tree |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1256 |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1257 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
|
1258 files = {} |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1259 gitlinks = {} |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1260 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
|
1261 # 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
|
1262 # exist'): |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1263 # old new | action |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1264 # no file | record file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1265 # no gitlink | record gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1266 # file no | delete file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1267 # file file | record file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1268 # 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
|
1269 # gitlink no | delete gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1270 # 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
|
1271 # 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
|
1272 if newmode == 0160000: |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1273 # new = gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1274 gitlinks[newfile] = newsha |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1275 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
|
1276 # file -> gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1277 files[oldfile] = True, None, None |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1278 continue |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1279 if oldmode == 0160000 and newmode != 0160000: |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1280 # 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
|
1281 gitlinks[oldfile] = None |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1282 continue |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1283 if newfile is not None: |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1284 # new = file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1285 files[newfile] = False, newmode, newsha |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1286 else: |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1287 # old = file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1288 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
|
1289 |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1290 return files, gitlinks |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1291 |
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
|
1292 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
|
1293 """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
|
1294 |
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
|
1295 :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
|
1296 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
|
1297 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
|
1298 """ |
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
|
1299 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
|
1300 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
|
1301 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
|
1302 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
|
1303 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
|
1304 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
|
1305 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
|
1306 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
|
1307 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
|
1308 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
|
1309 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
|
1310 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
|
1311 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
|
1312 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
|
1313 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
|
1314 |
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 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
|
1316 """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
|
1317 |
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 :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
|
1319 """ |
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 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
|
1321 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
|
1322 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
|
1323 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
|
1324 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
|
1325 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1326 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
|
1327 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
|
1328 if names: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1329 return names[0] |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1330 |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1331 # Stolen from hgsubversion |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1332 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
|
1333 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1334 from mercurial import encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1335 old = encoding.encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1336 encoding.encoding = new_encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1337 except ImportError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1338 old = hgutil._encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1339 hgutil._encoding = new_encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1340 return old |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1341 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1342 def decode_guess(self, string, encoding): |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1343 # 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
|
1344 if encoding: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1345 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1346 return string.decode(encoding).encode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1347 except UnicodeDecodeError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1348 pass |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1349 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1350 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1351 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
|
1352 except UnicodeDecodeError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1353 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
|
1354 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
1355 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
|
1356 # 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
|
1357 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
|
1358 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
|
1359 |
538
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
1360 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
|
1361 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
|
1362 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
|
1363 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
|
1364 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
|
1365 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
|
1366 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
|
1367 # 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
|
1368 # 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
|
1369 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
|
1370 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
|
1371 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
|
1372 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
|
1373 |
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
|
1374 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
|
1375 |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1376 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
|
1377 |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1378 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
|
1379 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
|
1380 |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1381 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
|
1382 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
|
1383 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
|
1384 else: |
635
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1385 auth_handler = urllib2.HTTPBasicAuthHandler(AuthManager(self.ui)) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1386 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
|
1387 try: |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1388 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
|
1389 except TypeError as e: |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1390 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
|
1391 # 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
|
1392 # 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
|
1393 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
|
1394 else: |
f933e3930f78
fallback to unauthenticated http(s) access when using older dulwich
Dov Feldstern <dfeldstern@gmail.com>
parents:
635
diff
changeset
|
1395 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
|
1396 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
1397 # 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
|
1398 return client.SubprocessGitClient(thin_packs=False), uri |
635
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1399 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1400 class AuthManager(object): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1401 def __init__(self, ui): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1402 self.ui = ui |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1403 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1404 def add_password(self, realm, uri, user, passwd): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1405 raise NotImplementedError( |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1406 'AuthManager currently gets passwords from hg repo config') |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1407 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1408 def find_user_password(self, realm, authuri): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1409 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1410 # 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
|
1411 for item in self.ui.configitems('auth'): |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1412 if len(item) < 2: |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1413 continue |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1414 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
|
1415 prefix = item[0][:-len('.prefix')] |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1416 break |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1417 else: |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1418 # no matching stanza found! |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1419 return (None,None) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1420 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1421 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
|
1422 username = self.ui.config('auth', '%s.username' % prefix) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1423 password = self.ui.config('auth', '%s.password' % prefix) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1424 |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1425 return (username,password) |
ca7fc2d23a21
support for http(s) basic authentication
Dov Feldstern <dovdevel@gmail.com>
parents:
634
diff
changeset
|
1426 |