Mercurial > hg > hg-git
annotate hggit/git_handler.py @ 922:5f93caf337a9
git_handler: test for a raw git ssh uri
By testing the uri early, we can reuse logic later in the method to parse the
git uri. We rely on the isgitsshuri heuristic to return True or False, and if
True, prepend 'git+ssh://' to the uri.
Arguably, this is fragile, and am open to better ideas, but can't think of
anything else currently.
author | Sean Farley <sean@farley.io> |
---|---|
date | Fri, 26 Jun 2015 16:32:20 -0700 |
parents | 3246f2fab625 |
children | 1a1d90e38651 |
rev | line source |
---|---|
884
4d67686c0e64
git_handler: remove dead imports and put them on multiple lines
Sean Farley <sean@farley.io>
parents:
883
diff
changeset
|
1 import collections |
4d67686c0e64
git_handler: remove dead imports and put them on multiple lines
Sean Farley <sean@farley.io>
parents:
883
diff
changeset
|
2 import itertools |
4d67686c0e64
git_handler: remove dead imports and put them on multiple lines
Sean Farley <sean@farley.io>
parents:
883
diff
changeset
|
3 import os |
4d67686c0e64
git_handler: remove dead imports and put them on multiple lines
Sean Farley <sean@farley.io>
parents:
883
diff
changeset
|
4 import urllib |
4d67686c0e64
git_handler: remove dead imports and put them on multiple lines
Sean Farley <sean@farley.io>
parents:
883
diff
changeset
|
5 import urllib2 |
4d67686c0e64
git_handler: remove dead imports and put them on multiple lines
Sean Farley <sean@farley.io>
parents:
883
diff
changeset
|
6 import re |
4d67686c0e64
git_handler: remove dead imports and put them on multiple lines
Sean Farley <sean@farley.io>
parents:
883
diff
changeset
|
7 import cStringIO |
4d67686c0e64
git_handler: remove dead imports and put them on multiple lines
Sean Farley <sean@farley.io>
parents:
883
diff
changeset
|
8 import StringIO |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
9 |
884
4d67686c0e64
git_handler: remove dead imports and put them on multiple lines
Sean Farley <sean@farley.io>
parents:
883
diff
changeset
|
10 from dulwich.errors import HangupException, GitProtocolError |
4d67686c0e64
git_handler: remove dead imports and put them on multiple lines
Sean Farley <sean@farley.io>
parents:
883
diff
changeset
|
11 from dulwich.objects import Blob, Commit, Tag, Tree, parse_timezone |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
12 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
|
13 from dulwich.repo import Repo, check_ref_format |
285
5e5aee9b32d4
git_handler: slight style cleanup
Augie Fackler <durin42@gmail.com>
parents:
284
diff
changeset
|
14 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
|
15 from dulwich import config as dul_config |
839
f6f84d51a154
git_handler.get_files_changed: switch to diff_tree's tree_changes
Siddharth Agarwal <sid0@fb.com>
parents:
838
diff
changeset
|
16 from dulwich import diff_tree |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
17 |
375
454fc525ac75
support upcoming Mercurial 1.8
Kevin Bullock <kbullock@ringworld.org>
parents:
374
diff
changeset
|
18 try: |
454fc525ac75
support upcoming Mercurial 1.8
Kevin Bullock <kbullock@ringworld.org>
parents:
374
diff
changeset
|
19 from mercurial import bookmarks |
454fc525ac75
support upcoming Mercurial 1.8
Kevin Bullock <kbullock@ringworld.org>
parents:
374
diff
changeset
|
20 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
|
21 from mercurial import commands |
375
454fc525ac75
support upcoming Mercurial 1.8
Kevin Bullock <kbullock@ringworld.org>
parents:
374
diff
changeset
|
22 except ImportError: |
454fc525ac75
support upcoming Mercurial 1.8
Kevin Bullock <kbullock@ringworld.org>
parents:
374
diff
changeset
|
23 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
|
24 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
25 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
|
26 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
|
27 from mercurial import context, util as hgutil |
741
b61ef156f4b5
git_handler: use mercurial's password manager
Takumi IINO <trot.thunder@gmail.com>
parents:
740
diff
changeset
|
28 from mercurial import url |
222
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
29 |
369
e5c743cd0da1
pass hg's ui.ssh config to dulwich
Tay Ray Chuan <rctay89@gmail.com>
parents:
368
diff
changeset
|
30 import _ssh |
789
e734d71cc558
git_handler: move get_git_incoming to a separate module
Siddharth Agarwal <sid0@fb.com>
parents:
788
diff
changeset
|
31 import git2hg |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
32 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
|
33 import util |
408 | 34 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
|
35 |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
36 |
537
6e05aa1b536d
Optimize get_git_author
Gregory Szorc <gregory.szorc@gmail.com>
parents:
523
diff
changeset
|
37 RE_GIT_AUTHOR = re.compile('^(.*?) ?\<(.*?)(?:\>(.*))?$') |
6e05aa1b536d
Optimize get_git_author
Gregory Szorc <gregory.szorc@gmail.com>
parents:
523
diff
changeset
|
38 |
539
7bf60690386c
Precompile Git username sanitizing regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
538
diff
changeset
|
39 RE_GIT_SANITIZE_AUTHOR = re.compile('[<>\n]') |
7bf60690386c
Precompile Git username sanitizing regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
538
diff
changeset
|
40 |
540
3fb942852b1c
Precompile Git author extra data regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
539
diff
changeset
|
41 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
|
42 |
765
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
43 RE_GIT_EXTRA_KEY = re.compile('GIT([0-9]*)-(.*)') |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
44 |
538
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
45 # Test for git:// and git+ssh:// URI. |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
46 # Support several URL forms, including separating the |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
47 # host and path with either a / or : (sepr) |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
48 RE_GIT_URI = re.compile( |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
49 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
|
50 r'(?P<sepr>[:/])(?P<path>.*)$') |
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
51 |
541
df1598b722e8
Precompile Git progress regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
540
diff
changeset
|
52 RE_NEWLINES = re.compile('[\r\n]') |
df1598b722e8
Precompile Git progress regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
540
diff
changeset
|
53 RE_GIT_PROGRESS = re.compile('\((\d+)/(\d+)\)') |
df1598b722e8
Precompile Git progress regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
540
diff
changeset
|
54 |
542
c9faba7d01f4
Precompile author file regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
541
diff
changeset
|
55 RE_AUTHOR_FILE = re.compile('\s*=\s*') |
c9faba7d01f4
Precompile author file regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
541
diff
changeset
|
56 |
411
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
57 class GitProgress(object): |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
58 """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
|
59 def __init__(self, ui): |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
60 self.ui = ui |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
61 |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
62 self.lasttopic = None |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
63 self.msgbuf = '' |
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 def progress(self, msg): |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
66 # 'Counting objects: 33640, done.\n' |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
67 # 'Compressing objects: 0% (1/9955) \r |
541
df1598b722e8
Precompile Git progress regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
540
diff
changeset
|
68 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
|
69 self.msgbuf = msgs.pop() |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
70 |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
71 for msg in msgs: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
72 td = msg.split(':', 1) |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
73 data = td.pop() |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
74 if not td: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
75 self.flush(data) |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
76 continue |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
77 topic = td[0] |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
78 |
541
df1598b722e8
Precompile Git progress regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
540
diff
changeset
|
79 m = RE_GIT_PROGRESS.search(data) |
411
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
80 if m: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
81 if self.lasttopic and self.lasttopic != topic: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
82 self.flush() |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
83 self.lasttopic = topic |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
84 |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
85 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
|
86 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
|
87 else: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
88 self.flush(msg) |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
89 |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
90 def flush(self, msg=None): |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
91 if self.lasttopic: |
689
1323058cc652
git_handler: fix call to self.ui.progress in flush
Siddharth Agarwal <sid0@fb.com>
parents:
688
diff
changeset
|
92 self.ui.progress(self.lasttopic, None) |
411
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
93 self.lasttopic = None |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
94 if msg: |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
95 self.ui.note(msg + '\n') |
de7317967598
Convert dulwich progress into mercurial ui.progress
Brendan Cully <brendan@kublai.com>
parents:
408
diff
changeset
|
96 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
97 class GitHandler(object): |
769
4a9057b16f40
git_handler: rename mapfile to map_file for PEP8 compat
Siddharth Agarwal <sid0@fb.com>
parents:
768
diff
changeset
|
98 map_file = 'git-mapfile' |
771
7835a7559986
git_handler: move git-remote-refs out to a class field for consistency
Siddharth Agarwal <sid0@fb.com>
parents:
770
diff
changeset
|
99 remote_refs_file = 'git-remote-refs' |
770
4b786698329c
git_handler: rename tagsfile to tags_file for PEP8 compat
Siddharth Agarwal <sid0@fb.com>
parents:
769
diff
changeset
|
100 tags_file = 'git-tags' |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
101 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
102 def __init__(self, dest_repo, ui): |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
103 self.repo = dest_repo |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
104 self.ui = ui |
133
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
105 |
324
f0c1c35d95ba
explicitly expect boolean values for git.intree
Tay Ray Chuan <rctay89@gmail.com>
parents:
320
diff
changeset
|
106 if ui.configbool('git', 'intree'): |
133
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
107 self.gitdir = self.repo.wjoin('.git') |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
108 else: |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
109 self.gitdir = self.repo.join('git') |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
110 |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
111 self.init_author_file() |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
112 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
113 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
|
114 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
115 self.branch_bookmark_suffix = ui.config('git', |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
116 'branch_bookmark_suffix') |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
117 |
767
da9f47555926
git_handler.load_map: use None as the uninitialized condition
Siddharth Agarwal <sid0@fb.com>
parents:
765
diff
changeset
|
118 self._map_git_real = None |
da9f47555926
git_handler.load_map: use None as the uninitialized condition
Siddharth Agarwal <sid0@fb.com>
parents:
765
diff
changeset
|
119 self._map_hg_real = None |
552
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
120 self.load_tags() |
773
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
121 self._remote_refs = None |
552
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
122 |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
123 @property |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
124 def _map_git(self): |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
125 if self._map_git_real is None: |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
126 self.load_map() |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
127 return self._map_git_real |
552
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
128 |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
129 @property |
bff92a208c3f
git_handler: lazy-load mapping
Augie Fackler <raf@durin42.com>
parents:
489
diff
changeset
|
130 def _map_hg(self): |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
131 if self._map_hg_real is None: |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
132 self.load_map() |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
133 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
|
134 |
773
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
135 @property |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
136 def remote_refs(self): |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
137 if self._remote_refs is None: |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
138 self.load_remote_refs() |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
139 return self._remote_refs |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
140 |
692
6ab17ae0c834
git_handler: make self.git a lazily evaluated property
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
141 @hgutil.propertycache |
6ab17ae0c834
git_handler: make self.git a lazily evaluated property
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
142 def git(self): |
6ab17ae0c834
git_handler: make self.git a lazily evaluated property
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
143 # 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
|
144 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
|
145 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
|
146 else: |
106
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
147 os.mkdir(self.gitdir) |
692
6ab17ae0c834
git_handler: make self.git a lazily evaluated property
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
148 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
|
149 |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
150 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
|
151 self.author_map = {} |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
152 if self.ui.config('git', 'authors'): |
743
06f84f38c6dc
git_handler: clean up coding style
Augie Fackler <raf@durin42.com>
parents:
742
diff
changeset
|
153 with open(self.repo.wjoin(self.ui.config('git', 'authors'))) as f: |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
154 for line in f: |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
155 line = line.strip() |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
156 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
|
157 continue |
542
c9faba7d01f4
Precompile author file regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
541
diff
changeset
|
158 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
|
159 self.author_map[from_] = to |
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
160 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
161 # FILE LOAD AND SAVE METHODS |
14
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
162 |
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
|
163 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
|
164 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
|
165 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
|
166 |
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
|
167 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
|
168 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
|
169 |
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
|
170 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
|
171 return self._map_hg.get(hgsha) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
172 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
173 def load_map(self): |
876
8c112b6d5e61
git_handler.load_map: avoid property accesses
Siddharth Agarwal <sid0@fb.com>
parents:
870
diff
changeset
|
174 map_git_real = {} |
8c112b6d5e61
git_handler.load_map: avoid property accesses
Siddharth Agarwal <sid0@fb.com>
parents:
870
diff
changeset
|
175 map_hg_real = {} |
767
da9f47555926
git_handler.load_map: use None as the uninitialized condition
Siddharth Agarwal <sid0@fb.com>
parents:
765
diff
changeset
|
176 if os.path.exists(self.repo.join(self.map_file)): |
da9f47555926
git_handler.load_map: use None as the uninitialized condition
Siddharth Agarwal <sid0@fb.com>
parents:
765
diff
changeset
|
177 for line in self.repo.opener(self.map_file): |
877
b250e7b3ad71
git_handler.load_map: avoid split and strip
Siddharth Agarwal <sid0@fb.com>
parents:
876
diff
changeset
|
178 # format is <40 hex digits> <40 hex digits>\n |
b250e7b3ad71
git_handler.load_map: avoid split and strip
Siddharth Agarwal <sid0@fb.com>
parents:
876
diff
changeset
|
179 if len(line) != 82: |
b250e7b3ad71
git_handler.load_map: avoid split and strip
Siddharth Agarwal <sid0@fb.com>
parents:
876
diff
changeset
|
180 raise ValueError( |
b250e7b3ad71
git_handler.load_map: avoid split and strip
Siddharth Agarwal <sid0@fb.com>
parents:
876
diff
changeset
|
181 _('corrupt mapfile: incorrect line length %d') % |
b250e7b3ad71
git_handler.load_map: avoid split and strip
Siddharth Agarwal <sid0@fb.com>
parents:
876
diff
changeset
|
182 len(line)) |
b250e7b3ad71
git_handler.load_map: avoid split and strip
Siddharth Agarwal <sid0@fb.com>
parents:
876
diff
changeset
|
183 gitsha = line[:40] |
b250e7b3ad71
git_handler.load_map: avoid split and strip
Siddharth Agarwal <sid0@fb.com>
parents:
876
diff
changeset
|
184 hgsha = line[41:81] |
876
8c112b6d5e61
git_handler.load_map: avoid property accesses
Siddharth Agarwal <sid0@fb.com>
parents:
870
diff
changeset
|
185 map_git_real[gitsha] = hgsha |
8c112b6d5e61
git_handler.load_map: avoid property accesses
Siddharth Agarwal <sid0@fb.com>
parents:
870
diff
changeset
|
186 map_hg_real[hgsha] = gitsha |
8c112b6d5e61
git_handler.load_map: avoid property accesses
Siddharth Agarwal <sid0@fb.com>
parents:
870
diff
changeset
|
187 self._map_git_real = map_git_real |
8c112b6d5e61
git_handler.load_map: avoid property accesses
Siddharth Agarwal <sid0@fb.com>
parents:
870
diff
changeset
|
188 self._map_hg_real = map_hg_real |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
189 |
878
be105c4dda7b
git_handler.save_map: pass in the map file explicitly for easier testing
Siddharth Agarwal <sid0@fb.com>
parents:
877
diff
changeset
|
190 def save_map(self, map_file): |
be105c4dda7b
git_handler.save_map: pass in the map file explicitly for easier testing
Siddharth Agarwal <sid0@fb.com>
parents:
877
diff
changeset
|
191 file = self.repo.opener(map_file, 'w+', atomictemp=True) |
880
10e61cd25e67
git_handler.save_map: don't sort list of tuples
Siddharth Agarwal <sid0@fb.com>
parents:
878
diff
changeset
|
192 map_hg = self._map_hg |
881
95c0f46a6150
git_handler.save_map: buffer the output
Siddharth Agarwal <sid0@fb.com>
parents:
880
diff
changeset
|
193 buf = cStringIO.StringIO() |
95c0f46a6150
git_handler.save_map: buffer the output
Siddharth Agarwal <sid0@fb.com>
parents:
880
diff
changeset
|
194 bwrite = buf.write |
883
b56d4f4faf79
git_mapfile.save_map: stop sorting the keys entirely
Siddharth Agarwal <sid0@fb.com>
parents:
882
diff
changeset
|
195 for hgsha, gitsha in map_hg.iteritems(): |
b56d4f4faf79
git_mapfile.save_map: stop sorting the keys entirely
Siddharth Agarwal <sid0@fb.com>
parents:
882
diff
changeset
|
196 bwrite("%s %s\n" % (gitsha, hgsha)) |
881
95c0f46a6150
git_handler.save_map: buffer the output
Siddharth Agarwal <sid0@fb.com>
parents:
880
diff
changeset
|
197 file.write(buf.getvalue()) |
95c0f46a6150
git_handler.save_map: buffer the output
Siddharth Agarwal <sid0@fb.com>
parents:
880
diff
changeset
|
198 buf.close() |
682
acb429c62c28
git_handler.save_map: drop support for Mercurial < 1.9
Siddharth Agarwal <sid0@fb.com>
parents:
655
diff
changeset
|
199 # 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
|
200 file.close() |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
201 |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
202 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
|
203 self.tags = {} |
770
4b786698329c
git_handler: rename tagsfile to tags_file for PEP8 compat
Siddharth Agarwal <sid0@fb.com>
parents:
769
diff
changeset
|
204 if os.path.exists(self.repo.join(self.tags_file)): |
4b786698329c
git_handler: rename tagsfile to tags_file for PEP8 compat
Siddharth Agarwal <sid0@fb.com>
parents:
769
diff
changeset
|
205 for line in self.repo.opener(self.tags_file): |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
206 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
|
207 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
|
208 |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
209 def save_tags(self): |
770
4b786698329c
git_handler: rename tagsfile to tags_file for PEP8 compat
Siddharth Agarwal <sid0@fb.com>
parents:
769
diff
changeset
|
210 file = self.repo.opener(self.tags_file, 'w+', atomictemp=True) |
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 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
|
212 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
|
213 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
|
214 # 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
|
215 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
|
216 |
773
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
217 def load_remote_refs(self): |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
218 self._remote_refs = {} |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
219 tagfile = self.repo.join(self.remote_refs_file) |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
220 if os.path.exists(tagfile): |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
221 tf = open(tagfile, 'rb') |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
222 tagdata = tf.read().split('\n') |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
223 td = [line.split(' ', 1) for line in tagdata if line] |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
224 self._remote_refs.update([(name, bin(sha)) for sha, name in td]) |
03e1e9929dea
hgrepo: move remote ref loading to git_handler
Siddharth Agarwal <sid0@fb.com>
parents:
772
diff
changeset
|
225 |
775
9c6bd4102ef5
git_handler: move remote ref writing to a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
774
diff
changeset
|
226 def save_remote_refs(self): |
776
81e5e8e0185c
git_handler.save_remote_refs: use an atomic temp file to write
Siddharth Agarwal <sid0@fb.com>
parents:
775
diff
changeset
|
227 file = self.repo.opener(self.remote_refs_file, 'w+', atomictemp=True) |
775
9c6bd4102ef5
git_handler: move remote ref writing to a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
774
diff
changeset
|
228 for tag, node in self.remote_refs.iteritems(): |
776
81e5e8e0185c
git_handler.save_remote_refs: use an atomic temp file to write
Siddharth Agarwal <sid0@fb.com>
parents:
775
diff
changeset
|
229 file.write('%s %s\n' % (hex(node), tag)) |
81e5e8e0185c
git_handler.save_remote_refs: use an atomic temp file to write
Siddharth Agarwal <sid0@fb.com>
parents:
775
diff
changeset
|
230 # If this complains, atomictempfile no longer has close |
81e5e8e0185c
git_handler.save_remote_refs: use an atomic temp file to write
Siddharth Agarwal <sid0@fb.com>
parents:
775
diff
changeset
|
231 file.close() |
775
9c6bd4102ef5
git_handler: move remote ref writing to a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
774
diff
changeset
|
232 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
233 # END FILE LOAD AND SAVE METHODS |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
234 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
235 # COMMANDS METHODS |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
236 |
137
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
237 def import_commits(self, remote_name): |
797
b21d6d8ea9ba
git_handler.import_commits: pass in refs explicitly
Siddharth Agarwal <sid0@fb.com>
parents:
796
diff
changeset
|
238 refs = self.git.refs.as_dict() |
824
f16eaf601496
gimport: support git.mindate
Siddharth Agarwal <sid0@fb.com>
parents:
823
diff
changeset
|
239 filteredrefs = self.filter_min_date(refs) |
f16eaf601496
gimport: support git.mindate
Siddharth Agarwal <sid0@fb.com>
parents:
823
diff
changeset
|
240 self.import_git_objects(remote_name, filteredrefs) |
797
b21d6d8ea9ba
git_handler.import_commits: pass in refs explicitly
Siddharth Agarwal <sid0@fb.com>
parents:
796
diff
changeset
|
241 self.update_hg_bookmarks(refs) |
878
be105c4dda7b
git_handler.save_map: pass in the map file explicitly for easier testing
Siddharth Agarwal <sid0@fb.com>
parents:
877
diff
changeset
|
242 self.save_map(self.map_file) |
137
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
243 |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
244 def fetch(self, remote, heads): |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
245 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
|
246 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
|
247 |
704
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
248 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
|
249 imported = 0 |
56 | 250 if refs: |
823 | 251 filteredrefs = self.filter_min_date(self.filter_refs(refs, heads)) |
705
373f854ff58f
git_handler.fetch: only import commits reachable from requested heads
Siddharth Agarwal <sid0@fb.com>
parents:
704
diff
changeset
|
252 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
|
253 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
|
254 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
|
255 if remote_name: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
256 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
|
257 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
|
258 # intial cloning |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
259 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
|
260 |
384
fc37cb795b51
activate a tipmost bookmark (git branch) after clone
Adrian Sampson <adrian@radbox.org>
parents:
382
diff
changeset
|
261 # "Activate" a tipmost bookmark. |
387
ed28dd69df61
git_handler: support versions of hg without bookmarks
Augie Fackler <durin42@gmail.com>
parents:
385
diff
changeset
|
262 bms = getattr(self.repo['tip'], 'bookmarks', |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
263 lambda: None)() |
384
fc37cb795b51
activate a tipmost bookmark (git branch) after clone
Adrian Sampson <adrian@radbox.org>
parents:
382
diff
changeset
|
264 if bms: |
906
286555803dae
git_handler: update for bookmark changes in mercurial 3.5
Sean Farley <sean@farley.io>
parents:
886
diff
changeset
|
265 try: |
286555803dae
git_handler: update for bookmark changes in mercurial 3.5
Sean Farley <sean@farley.io>
parents:
886
diff
changeset
|
266 bookmarks.activate(self.repo, bms[0]) |
286555803dae
git_handler: update for bookmark changes in mercurial 3.5
Sean Farley <sean@farley.io>
parents:
886
diff
changeset
|
267 except AttributeError: |
286555803dae
git_handler: update for bookmark changes in mercurial 3.5
Sean Farley <sean@farley.io>
parents:
886
diff
changeset
|
268 # hg < 3.5 |
286555803dae
git_handler: update for bookmark changes in mercurial 3.5
Sean Farley <sean@farley.io>
parents:
886
diff
changeset
|
269 bookmarks.setcurrent(self.repo, bms[0]) |
397
60d181f9ecc3
Make pull results more like hg pulls.
Brendan Cully <brendan@kublai.com>
parents:
395
diff
changeset
|
270 |
878
be105c4dda7b
git_handler.save_map: pass in the map file explicitly for easier testing
Siddharth Agarwal <sid0@fb.com>
parents:
877
diff
changeset
|
271 self.save_map(self.map_file) |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
272 |
704
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
273 if imported == 0: |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
274 return 0 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
275 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
276 # 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
|
277 dh = 0 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
278 if oldheads: |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
279 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
|
280 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
|
281 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
|
282 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
|
283 dh -= 1 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
284 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
285 if dh < 0: |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
286 return dh - 1 |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
287 else: |
4cddcb768cf4
git_handler.fetch: actually return number of heads added or removed
Siddharth Agarwal <sid0@fb.com>
parents:
703
diff
changeset
|
288 return dh + 1 |
397
60d181f9ecc3
Make pull results more like hg pulls.
Brendan Cully <brendan@kublai.com>
parents:
395
diff
changeset
|
289 |
236
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
290 def export_commits(self): |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
291 try: |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
292 self.export_git_objects() |
236
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
293 self.export_hg_tags() |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
294 self.update_references() |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
295 finally: |
878
be105c4dda7b
git_handler.save_map: pass in the map file explicitly for easier testing
Siddharth Agarwal <sid0@fb.com>
parents:
877
diff
changeset
|
296 self.save_map(self.map_file) |
97 | 297 |
231
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
298 def get_refs(self, remote): |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
299 self.export_commits() |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
300 client, path = self.get_transport_and_path(remote) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
301 old_refs = {} |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
302 new_refs = {} |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
303 |
231
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
304 def changed(refs): |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
305 old_refs.update(refs) |
814
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
306 exportable = self.get_exportable() |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
307 new_refs.update(self.get_changed_refs(refs, exportable, True)) |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
308 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
|
309 |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
310 try: |
442
553dd7078058
Update for newer dulwich and hg versions.
Augie Fackler <durin42@gmail.com>
parents:
441
diff
changeset
|
311 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
|
312 |
53b731d2a3e2
outgoing: don't crash when there are unpulled changesets
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
242
diff
changeset
|
313 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
|
314 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
|
315 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
|
316 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
|
317 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
|
318 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
|
319 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
|
320 old[bin(old_ref)] = 1 |
231
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
321 |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
322 return old, new |
391
9b6597b70839
Improve error reporting in get_refs
Brendan Cully <brendan@kublai.com>
parents:
387
diff
changeset
|
323 except (HangupException, GitProtocolError), e: |
9b6597b70839
Improve error reporting in get_refs
Brendan Cully <brendan@kublai.com>
parents:
387
diff
changeset
|
324 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
|
325 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
326 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
|
327 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
|
328 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
|
329 remote_name = self.remote_name(remote) |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
330 |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
331 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
|
332 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
|
333 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
|
334 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
|
335 if self.ui.verbose: |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
336 self.ui.note("adding reference %s::%s => GIT:%s\n" % |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
337 (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
|
338 else: |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
339 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
|
340 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
|
341 if self.ui.verbose: |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
342 self.ui.note("updating reference %s::%s => GIT:%s\n" % |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
343 (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
|
344 else: |
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
345 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
|
346 else: |
593
a6b7ad535244
push: provide better output about changed references (issue #64)
David M. Carr <david@carrclan.us>
parents:
592
diff
changeset
|
347 self.ui.debug("unchanged reference %s::%s => GIT:%s\n" % |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
348 (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
|
349 |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
350 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
|
351 if old_refs == new_refs: |
489
ccd521a1f585
push: state when no changes are found
David M. Carr <david@carrclan.us>
parents:
488
diff
changeset
|
352 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
|
353 ret = None |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
354 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
|
355 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
|
356 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
|
357 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
|
358 else: |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
359 ret = 1 |
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
360 return ret |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
361 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
362 def clear(self): |
769
4a9057b16f40
git_handler: rename mapfile to map_file for PEP8 compat
Siddharth Agarwal <sid0@fb.com>
parents:
768
diff
changeset
|
363 mapfile = self.repo.join(self.map_file) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
364 if os.path.exists(self.gitdir): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
365 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
|
366 for name in files: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
367 os.remove(os.path.join(root, name)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
368 for name in dirs: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
369 os.rmdir(os.path.join(root, name)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
370 os.rmdir(self.gitdir) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
371 if os.path.exists(mapfile): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
372 os.remove(mapfile) |
124
9dafb9ac24ff
hg bookmarks to local git branches
Ian Dees <undees@gmail.com>
parents:
118
diff
changeset
|
373 |
408 | 374 # incoming support |
375 def getremotechanges(self, remote, revs): | |
376 self.export_commits() | |
377 refs = self.fetch_pack(remote.path, revs) | |
378 | |
379 # refs contains all remote refs. Prune to only those requested. | |
380 if revs: | |
381 reqrefs = {} | |
382 for rev in revs: | |
383 for n in ('refs/heads/' + rev, 'refs/tags/' + rev): | |
384 if n in refs: | |
385 reqrefs[n] = refs[n] | |
386 else: | |
387 reqrefs = refs | |
388 | |
790
77416ddca136
git2hg: return a struct from find_incoming
Siddharth Agarwal <sid0@fb.com>
parents:
789
diff
changeset
|
389 commits = [bin(c) for c in self.get_git_incoming(reqrefs).commits] |
408 | 390 |
391 b = overlayrepo(self, commits, refs) | |
392 | |
393 return (b, commits, lambda: None) | |
394 | |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
395 # CHANGESET CONVERSION METHODS |
125 | 396 |
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
|
397 def export_git_objects(self): |
831
5fa9649c4ef6
git_handler: iterate over contexts, not nodes
Siddharth Agarwal <sid0@fb.com>
parents:
827
diff
changeset
|
398 repo = self.repo |
5fa9649c4ef6
git_handler: iterate over contexts, not nodes
Siddharth Agarwal <sid0@fb.com>
parents:
827
diff
changeset
|
399 clnode = repo.changelog.node |
833
799c41a24e75
git_handler.export_git_objects: avoid unnecessary list creation
Siddharth Agarwal <sid0@fb.com>
parents:
832
diff
changeset
|
400 nodes = (clnode(n) for n in repo) |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
401 export = (repo[node] for node in nodes if not hex(node) in |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
402 self._map_hg) |
832
4b5a18d2fa10
git_handler.export_git_objects: filter out octopus explosions earlier
Siddharth Agarwal <sid0@fb.com>
parents:
831
diff
changeset
|
403 export = [ctx for ctx in export |
4b5a18d2fa10
git_handler.export_git_objects: filter out octopus explosions earlier
Siddharth Agarwal <sid0@fb.com>
parents:
831
diff
changeset
|
404 if ctx.extra().get('hg-git', None) != 'octopus'] |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
405 total = len(export) |
709
4f0a154ae374
git_handler: return early when no commits need to be exported
Siddharth Agarwal <sid0@fb.com>
parents:
705
diff
changeset
|
406 if not total: |
4f0a154ae374
git_handler: return early when no commits need to be exported
Siddharth Agarwal <sid0@fb.com>
parents:
705
diff
changeset
|
407 return |
4f0a154ae374
git_handler: return early when no commits need to be exported
Siddharth Agarwal <sid0@fb.com>
parents:
705
diff
changeset
|
408 |
4f0a154ae374
git_handler: return early when no commits need to be exported
Siddharth Agarwal <sid0@fb.com>
parents:
705
diff
changeset
|
409 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
|
410 |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
411 # 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
|
412 # for all other changesets are already present in the Git repository. |
710
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
413 # This assertion is necessary to prevent redundant work. Here, nodes, |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
414 # and therefore export, is in topological order. By definition, |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
415 # export[0]'s parents must be present in Git, so we start the |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
416 # incremental exporter from there. |
831
5fa9649c4ef6
git_handler: iterate over contexts, not nodes
Siddharth Agarwal <sid0@fb.com>
parents:
827
diff
changeset
|
417 pctx = export[0].p1() |
710
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
418 pnode = pctx.node() |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
419 if pnode == nullid: |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
420 gitcommit = None |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
421 else: |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
422 gitsha = self._map_hg[hex(pnode)] |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
423 try: |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
424 gitcommit = self.git[gitsha] |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
425 except KeyError: |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
426 raise hgutil.Abort(_('Parent SHA-1 not present in Git' |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
427 'repo: %s' % gitsha)) |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
428 |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
429 exporter = hg2git.IncrementalChangesetExporter( |
5c7943ca051f
hg2git: start incremental conversion from a known commit
Siddharth Agarwal <sid0@fb.com>
parents:
709
diff
changeset
|
430 self.repo, pctx, self.git.object_store, gitcommit) |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
431 |
831
5fa9649c4ef6
git_handler: iterate over contexts, not nodes
Siddharth Agarwal <sid0@fb.com>
parents:
827
diff
changeset
|
432 for i, ctx in enumerate(export): |
686
c7129c72baff
git_handler: replace util.progress with ui.progress
Siddharth Agarwal <sid0@fb.com>
parents:
684
diff
changeset
|
433 self.ui.progress('exporting', i, total=total) |
831
5fa9649c4ef6
git_handler: iterate over contexts, not nodes
Siddharth Agarwal <sid0@fb.com>
parents:
827
diff
changeset
|
434 self.export_hg_commit(ctx.node(), exporter) |
686
c7129c72baff
git_handler: replace util.progress with ui.progress
Siddharth Agarwal <sid0@fb.com>
parents:
684
diff
changeset
|
435 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
|
436 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
437 # 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
|
438 # 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
|
439 # 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
|
440 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
|
441 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
|
442 |
203
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
443 oldenc = self.swap_out_encoding() |
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
444 |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
445 ctx = self.repo.changectx(rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
446 extra = ctx.extra() |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
447 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
448 commit = Commit() |
68
d28d3763eda3
Deal with hg authors missing email attributes.
Chris Wanstrath <chris@ozmm.org>
parents:
65
diff
changeset
|
449 |
235
912d6a5837c8
reorganize export_hg_commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
234
diff
changeset
|
450 (time, timezone) = ctx.date() |
594
ce6ad4c0cba7
scrub bad timezone values before dulwich sees them
Hal Wine <hwine@mozilla.com>
parents:
593
diff
changeset
|
451 # 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
|
452 # 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
|
453 # 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
|
454 # 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
|
455 # simplest and round down. |
ce6ad4c0cba7
scrub bad timezone values before dulwich sees them
Hal Wine <hwine@mozilla.com>
parents:
593
diff
changeset
|
456 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
|
457 commit.author = self.get_git_author(ctx) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
458 commit.author_time = int(time) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
459 commit.author_timezone = -timezone |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
460 |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
461 if 'committer' in extra: |
131
dd6c77ec206c
store commitdate in mercurial's internal format.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
129
diff
changeset
|
462 # fixup timezone |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
463 (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
|
464 commit.committer = name |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
465 commit.commit_time = timestamp |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
466 |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
467 # work around a timezone format change |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
468 if int(timezone) % 60 != 0: # pragma: no cover |
237
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
469 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
|
470 # 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
|
471 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
|
472 timezone, neg_utc = timezone |
361 | 473 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
|
474 else: |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
475 timezone = -int(timezone) |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
476 commit.commit_timezone = timezone |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
477 else: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
478 commit.committer = commit.author |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
479 commit.commit_time = commit.author_time |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
480 commit.commit_timezone = commit.author_timezone |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
481 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
482 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
|
483 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
|
484 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
|
485 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
|
486 if git_sha: |
543
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
487 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
|
488 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
|
489 'repo: %s' % git_sha)) |
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
490 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
491 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
|
492 |
765
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
493 commit.message, extra = self.get_git_message_and_extra(ctx) |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
494 commit.extra.extend(extra) |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
495 |
118
b3be536e3f50
handles git commit encoding fields now
Scott Chacon <schacon@gmail.com>
parents:
113
diff
changeset
|
496 if 'encoding' in extra: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
497 commit.encoding = extra['encoding'] |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
498 |
597
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
499 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
|
500 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
|
501 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
|
502 |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
503 tree_sha = exporter.root_tree_sha |
d6b9c30a3e0f
Export Git objects from incremental Mercurial changes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
594
diff
changeset
|
504 |
543
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
505 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
|
506 raise hgutil.Abort(_('Tree SHA-1 not present in Git repo: %s' % |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
507 tree_sha)) |
543
5a688ad69449
Verify tree and parent objects are in Git repo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
542
diff
changeset
|
508 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
509 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
|
510 |
697
a7383625c891
git_handler: don't write out objects if already in object store
Siddharth Agarwal <sid0@fb.com>
parents:
693
diff
changeset
|
511 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
|
512 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
|
513 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
|
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 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
|
516 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
|
517 |
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 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
|
519 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
|
520 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
521 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
|
522 command: |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
523 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
524 [...] 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
|
525 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
526 committer |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
527 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
|
528 and when they made it. |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
529 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
530 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
|
531 "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
|
532 ("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
|
533 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
|
534 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
|
535 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
|
536 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
|
537 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
|
538 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
539 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
|
540 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
|
541 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
|
542 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
|
543 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
|
544 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
|
545 convenience. |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
546 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
547 TESTS: |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
548 |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
549 >>> from mercurial.ui import ui |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
550 >>> 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
|
551 >>> g('John Doe') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
552 'John Doe' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
553 >>> g('john@doe.com') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
554 'john@doe.com' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
555 >>> g(' <john@doe.com> ') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
556 'john@doe.com' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
557 >>> g(' <random<\n<garbage\n> > > ') |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
558 'random???garbage?' |
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
559 >>> 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
|
560 '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
|
561 """ |
539
7bf60690386c
Precompile Git username sanitizing regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
538
diff
changeset
|
562 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
|
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 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
|
565 # 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
|
566 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
|
567 |
450
163ac98569d3
- add "author file" extension, allows an author translation map
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
448
diff
changeset
|
568 # see if a translation exists |
537
6e05aa1b536d
Optimize get_git_author
Gregory Szorc <gregory.szorc@gmail.com>
parents:
523
diff
changeset
|
569 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
|
570 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
571 # check for git author pattern compliance |
537
6e05aa1b536d
Optimize get_git_author
Gregory Szorc <gregory.szorc@gmail.com>
parents:
523
diff
changeset
|
572 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
|
573 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
574 if a: |
448
e58a6d0b80e2
Remove illegal characters from username/email
Keshav Kini <keshav.kini@gmail.com>
parents:
447
diff
changeset
|
575 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
|
576 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
|
577 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
|
578 name += ' ext:(' + urllib.quote(a.group(3)) + ')' |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
579 author = '%s <%s>' \ |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
580 % (self.get_valid_git_username_email(name), |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
581 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
|
582 elif '@' in author: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
583 author = '%s <%s>' \ |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
584 % (self.get_valid_git_username_email(author), |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
585 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
|
586 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
|
587 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
|
588 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
589 if 'author' in ctx.extra(): |
307
7dfe8be21135
handle apply_delta() return value correctly
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
590 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
|
591 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
592 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
|
593 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
594 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
|
595 def is_octopus_part(ctx): |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
596 olist = ('octopus', 'octopus-done') |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
597 return ctx.extra().get('hg-git', None) in olist |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
598 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
599 parents = [] |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
600 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
|
601 # 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
|
602 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
|
603 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
|
604 (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
|
605 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
|
606 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
|
607 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
|
608 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
|
609 else: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
610 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
|
611 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
612 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
|
613 |
765
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
614 def get_git_message_and_extra(self, ctx): |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
615 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
|
616 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
617 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
|
618 if 'message' in extra: |
307
7dfe8be21135
handle apply_delta() return value correctly
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
619 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
|
620 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
621 # HG EXTRA INFORMATION |
765
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
622 |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
623 # test only -- do not document this! |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
624 extra_in_message = self.ui.configbool('git', 'debugextrainmessage', |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
625 False) |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
626 extra_message = '' |
765
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
627 git_extra = [] |
809
4bca27d22a96
git_handler: write inequality more idiomatically
Siddharth Agarwal <sid0@fb.com>
parents:
808
diff
changeset
|
628 if ctx.branch() != 'default': |
765
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
629 # we always store the branch in the extra message |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
630 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
|
631 |
765
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
632 # Git native extra items always come first, followed by hg renames, |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
633 # followed by hg extra keys |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
634 git_extraitems = [] |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
635 for key, value in extra.items(): |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
636 m = RE_GIT_EXTRA_KEY.match(key) |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
637 if m is not None: |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
638 git_extraitems.append((int(m.group(1)), m.group(2), value)) |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
639 del extra[key] |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
640 |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
641 git_extraitems.sort() |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
642 for i, field, value in git_extraitems: |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
643 git_extra.append((urllib.unquote(field), urllib.unquote(value))) |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
644 |
845
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
645 if extra.get('hg-git-rename-source', None) != 'git': |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
646 renames = [] |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
647 for f in ctx.files(): |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
648 if f not in ctx.manifest(): |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
649 continue |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
650 rename = ctx.filectx(f).renamed() |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
651 if rename: |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
652 renames.append((rename[0], f)) |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
653 |
845
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
654 if renames: |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
655 for oldfile, newfile in renames: |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
656 if extra_in_message: |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
657 extra_message += ("rename : " + oldfile + " => " + |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
658 newfile + "\n") |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
659 else: |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
660 spec = '%s:%s' % (urllib.quote(oldfile), |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
661 urllib.quote(newfile)) |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
662 git_extra.append(('HG:rename', spec)) |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
663 |
765
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
664 # hg extra items always go at the end |
760
eb9ebc7ed061
git_handler: store hg extra data in git deterministically by sorting it
Siddharth Agarwal <sid0@fb.com>
parents:
759
diff
changeset
|
665 extraitems = extra.items() |
eb9ebc7ed061
git_handler: store hg extra data in git deterministically by sorting it
Siddharth Agarwal <sid0@fb.com>
parents:
759
diff
changeset
|
666 extraitems.sort() |
eb9ebc7ed061
git_handler: store hg extra data in git deterministically by sorting it
Siddharth Agarwal <sid0@fb.com>
parents:
759
diff
changeset
|
667 for key, value in extraitems: |
845
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
668 if key in ('author', 'committer', 'encoding', 'message', 'branch', |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
669 'hg-git', 'hg-git-rename-source'): |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
670 continue |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
671 else: |
765
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
672 if extra_in_message: |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
673 extra_message += ("extra : " + key + " : " + |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
674 urllib.quote(value) + "\n") |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
675 else: |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
676 spec = '%s:%s' % (urllib.quote(key), |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
677 urllib.quote(value)) |
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
678 git_extra.append(('HG:extra', spec)) |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
679 |
759
1d16139b8e50
git_handler: drop unnecessary add_extras boolean from get_git_message
Siddharth Agarwal <sid0@fb.com>
parents:
757
diff
changeset
|
680 if 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
|
681 message += "\n--HG--\n" + extra_message |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
682 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
683 if (extra.get('hg-git-rename-source', None) != 'git' and not |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
684 extra_in_message and not git_extra and extra_message == ''): |
845
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
685 # We need to store this if no other metadata is stored. This |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
686 # indicates that when reimporting the commit into Mercurial we'll |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
687 # know not to detect renames. |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
688 git_extra.append(('HG:rename-source', 'hg')) |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
689 |
765
70aba6b2fe7b
git_handler: export hg extra metadata as git extra metadata (issue121)
Siddharth Agarwal <sid0@fb.com>
parents:
764
diff
changeset
|
690 return message, git_extra |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
691 |
786
2f6507057987
git_handler: rename getnewgitcommits to get_git_incoming
Siddharth Agarwal <sid0@fb.com>
parents:
785
diff
changeset
|
692 def get_git_incoming(self, refs): |
789
e734d71cc558
git_handler: move get_git_incoming to a separate module
Siddharth Agarwal <sid0@fb.com>
parents:
788
diff
changeset
|
693 return git2hg.find_incoming(self.git.object_store, self._map_git, refs) |
408 | 694 |
798
c7d27c134ed9
git_handler.import_git_objects: require all arguments
Siddharth Agarwal <sid0@fb.com>
parents:
797
diff
changeset
|
695 def import_git_objects(self, remote_name, refs): |
790
77416ddca136
git2hg: return a struct from find_incoming
Siddharth Agarwal <sid0@fb.com>
parents:
789
diff
changeset
|
696 result = self.get_git_incoming(refs) |
77416ddca136
git2hg: return a struct from find_incoming
Siddharth Agarwal <sid0@fb.com>
parents:
789
diff
changeset
|
697 commits = result.commits |
77416ddca136
git2hg: return a struct from find_incoming
Siddharth Agarwal <sid0@fb.com>
parents:
789
diff
changeset
|
698 commit_cache = result.commit_cache |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
699 # import each of the commits, oldest first |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
700 total = len(commits) |
392 | 701 if total: |
702 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
|
703 else: |
178b15457927
git_handler: base 'no changes found' message on commits, not on heads
Siddharth Agarwal <sid0@fb.com>
parents:
701
diff
changeset
|
704 self.ui.status(_("no changes found\n")) |
392 | 705 |
917
6aa31a3b0506
gitimport: add save frequency config
Durham Goode <durham@fb.com>
parents:
916
diff
changeset
|
706 mapsavefreq = self.ui.configint('hggit', 'mapsavefrequency', 0) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
707 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
|
708 self.ui.progress('importing', i, total=total, unit='commits') |
785
4f425a1be4f3
git_handler: rename convert_list to commit_cache
Siddharth Agarwal <sid0@fb.com>
parents:
784
diff
changeset
|
709 commit = commit_cache[csha] |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
710 self.import_git_commit(commit) |
917
6aa31a3b0506
gitimport: add save frequency config
Durham Goode <durham@fb.com>
parents:
916
diff
changeset
|
711 if mapsavefreq and i % mapsavefreq == 0: |
6aa31a3b0506
gitimport: add save frequency config
Durham Goode <durham@fb.com>
parents:
916
diff
changeset
|
712 self.ui.debug(_("saving mapfile\n")) |
6aa31a3b0506
gitimport: add save frequency config
Durham Goode <durham@fb.com>
parents:
916
diff
changeset
|
713 self.save_map(self.map_file) |
686
c7129c72baff
git_handler: replace util.progress with ui.progress
Siddharth Agarwal <sid0@fb.com>
parents:
684
diff
changeset
|
714 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
|
715 |
684
13d64d9dd26c
git_handler: remove old and bogus code for deleting entries from tags cache
Siddharth Agarwal <sid0@fb.com>
parents:
683
diff
changeset
|
716 # 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
|
717 return total |
400
6d4f3b6d2e08
respect references to tags that differ between git and .hgtags
Adrian Sampson <adrian@radbox.org>
parents:
398
diff
changeset
|
718 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
719 def import_git_commit(self, commit): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
720 self.ui.debug(_("importing: %s\n") % commit.id) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
721 |
838
6866ae460ee7
git_handler.import_git_commit: figure out when to detect renames
Siddharth Agarwal <sid0@fb.com>
parents:
837
diff
changeset
|
722 detect_renames = False |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
723 (strip_message, hg_renames, |
796
c19835c3c60d
git_handler: move extract_hg_metadata into git2hg
Siddharth Agarwal <sid0@fb.com>
parents:
790
diff
changeset
|
724 hg_branch, extra) = git2hg.extract_hg_metadata( |
764
13a3513f8e67
git_handler: support extracting metadata from Git extra fields
Siddharth Agarwal <sid0@fb.com>
parents:
760
diff
changeset
|
725 commit.message, commit.extra) |
836
6c9c40d9e9c1
git2hg: while extracting metadata, detect which VCS commits were made in
Siddharth Agarwal <sid0@fb.com>
parents:
833
diff
changeset
|
726 if hg_renames is None: |
838
6866ae460ee7
git_handler.import_git_commit: figure out when to detect renames
Siddharth Agarwal <sid0@fb.com>
parents:
837
diff
changeset
|
727 detect_renames = True |
845
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
728 # We have to store this unconditionally, even if there are no |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
729 # renames detected from Git. This is because we export an extra |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
730 # 'HG:rename-source' Git parameter when this isn't set, which will |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
731 # break bidirectionality. |
fffe8883960b
git_handler: mark source for rename info as Git or Mercurial
Siddharth Agarwal <sid0@fb.com>
parents:
844
diff
changeset
|
732 extra['hg-git-rename-source'] = 'git' |
837
c24d2ea1361b
git_handler.import_git_commit: rename 'hg_renames' to 'renames'
Siddharth Agarwal <sid0@fb.com>
parents:
836
diff
changeset
|
733 else: |
c24d2ea1361b
git_handler.import_git_commit: rename 'hg_renames' to 'renames'
Siddharth Agarwal <sid0@fb.com>
parents:
836
diff
changeset
|
734 renames = hg_renames |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
735 |
641
cacd98c7382e
git_handler: move gparents initialization up to start of import_git_commit
Siddharth Agarwal <sid0@fb.com>
parents:
640
diff
changeset
|
736 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
|
737 |
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
|
738 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
|
739 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
|
740 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
|
741 '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
|
742 |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
743 # get a list of the changed, added, removed files and gitlinks |
841
edcdb7620f4d
git_handler.get_files_changed: return detected renames
Siddharth Agarwal <sid0@fb.com>
parents:
840
diff
changeset
|
744 files, gitlinks, git_renames = self.get_files_changed(commit, |
edcdb7620f4d
git_handler.get_files_changed: return detected renames
Siddharth Agarwal <sid0@fb.com>
parents:
840
diff
changeset
|
745 detect_renames) |
edcdb7620f4d
git_handler.get_files_changed: return detected renames
Siddharth Agarwal <sid0@fb.com>
parents:
840
diff
changeset
|
746 if detect_renames: |
edcdb7620f4d
git_handler.get_files_changed: return detected renames
Siddharth Agarwal <sid0@fb.com>
parents:
840
diff
changeset
|
747 renames = git_renames |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
748 |
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
|
749 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
|
750 |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
751 # 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
|
752 # gitlinks. Order of application: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
753 # - preexisting .hgsubstate in git tree |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
754 # - .hgsubstate from hg parent |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
755 # - changes in gitlinks |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
756 hgsubstate = util.parse_hgsubstate( |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
757 self.git_file_readlines(git_commit_tree, '.hgsubstate')) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
758 parentsubdata = '' |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
759 if gparents: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
760 p1ctx = self.repo.changectx(gparents[0]) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
761 if '.hgsubstate' in p1ctx: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
762 parentsubdata = p1ctx.filectx('.hgsubstate').data() |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
763 parentsubdata = parentsubdata.splitlines() |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
764 parentsubstate = util.parse_hgsubstate(parentsubdata) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
765 for path, sha in parentsubstate.iteritems(): |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
766 hgsubstate[path] = sha |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
767 for path, sha in gitlinks.iteritems(): |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
768 if sha is None: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
769 hgsubstate.pop(path, None) |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
770 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
|
771 hgsubstate[path] = sha |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
772 # in case .hgsubstate wasn't among changed files |
918
3246f2fab625
import_git_commit: skip hgsubstate logic if file was deleted
Sean Farley <sean@farley.io>
parents:
917
diff
changeset
|
773 # force its inclusion if it wasn't already deleted |
3246f2fab625
import_git_commit: skip hgsubstate logic if file was deleted
Sean Farley <sean@farley.io>
parents:
917
diff
changeset
|
774 hgsubdeleted = files.get('.hgsubstate') |
3246f2fab625
import_git_commit: skip hgsubstate logic if file was deleted
Sean Farley <sean@farley.io>
parents:
917
diff
changeset
|
775 if hgsubdeleted: |
3246f2fab625
import_git_commit: skip hgsubstate logic if file was deleted
Sean Farley <sean@farley.io>
parents:
917
diff
changeset
|
776 hgsubdeleted = hgsubdeleted[0] |
3246f2fab625
import_git_commit: skip hgsubstate logic if file was deleted
Sean Farley <sean@farley.io>
parents:
917
diff
changeset
|
777 if hgsubdeleted or (not hgsubstate and parentsubdata): |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
778 files['.hgsubstate'] = True, None, None |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
779 elif util.serialize_hgsubstate(hgsubstate) != parentsubdata: |
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
780 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
|
781 |
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
|
782 # 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
|
783 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
|
784 gitmodules = self.parse_gitmodules(git_commit_tree) |
643
f492e4759e52
git_handler: fix hgsubstate generation
Siddharth Agarwal <sid0@fb.com>
parents:
642
diff
changeset
|
785 if gitmodules: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
786 hgsub = util.parse_hgsub(self.git_file_readlines(git_commit_tree, |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
787 '.hgsub')) |
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
|
788 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
|
789 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
|
790 files['.hgsub'] = (False, 0100644, None) |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
791 elif (commit.parents and '.gitmodules' in |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
792 self.git[self.git[commit.parents[0]].tree]): |
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
|
793 # 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
|
794 # 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
|
795 # 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
|
796 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
|
797 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
798 date = (commit.author_time, -commit.author_timezone) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
799 text = strip_message |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
800 |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
801 origtext = text |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
802 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
803 text.decode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
804 except UnicodeDecodeError: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
805 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
|
806 |
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
807 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
|
808 if text + '\n' != origtext: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
809 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
|
810 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
811 author = commit.author |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
812 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
813 # convert extra data back to the end |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
814 if ' ext:' in commit.author: |
540
3fb942852b1c
Precompile Git author extra data regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
539
diff
changeset
|
815 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
|
816 if m: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
817 name = m.group(1) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
818 ex = urllib.unquote(m.group(2)) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
819 email = m.group(3) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
820 author = name + ' <' + email + '>' + ex |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
821 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
822 if ' <none@none>' in commit.author: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
823 author = commit.author[:-12] |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
824 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
825 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
826 author.decode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
827 except UnicodeDecodeError: |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
828 origauthor = author |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
829 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
|
830 extra['author'] = create_delta(author, origauthor) |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
831 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
832 oldenc = self.swap_out_encoding() |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
833 |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
834 def findconvergedfiles(p1, p2): |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
835 # 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
|
836 # (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
|
837 # 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
|
838 # 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
|
839 # 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
|
840 # 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
|
841 # begin with). |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
842 if p2 == nullid: |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
843 return [] |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
844 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
|
845 manifest2 = self.repo.changectx(p2).manifest() |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
846 return [path for path, node1 in manifest1.iteritems() if path not |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
847 in files and manifest2.get(path, node1) != node1] |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
848 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
849 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
|
850 info = files.get(f) |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
851 if info is not None: |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
852 # 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
|
853 delete, mode, sha = info |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
854 if delete: |
757
0a673c9330ba
git_handler: fix filectxfn compatibility with hg's default branch
Siddharth Agarwal <sid0@fb.com>
parents:
753
diff
changeset
|
855 if getattr(memctx, '_returnnoneformissingfiles', False): |
0a673c9330ba
git_handler: fix filectxfn compatibility with hg's default branch
Siddharth Agarwal <sid0@fb.com>
parents:
753
diff
changeset
|
856 return None |
0a673c9330ba
git_handler: fix filectxfn compatibility with hg's default branch
Siddharth Agarwal <sid0@fb.com>
parents:
753
diff
changeset
|
857 else: # Mercurial < 3.2 |
0a673c9330ba
git_handler: fix filectxfn compatibility with hg's default branch
Siddharth Agarwal <sid0@fb.com>
parents:
753
diff
changeset
|
858 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
|
859 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
860 if not sha: # indicates there's no git counterpart |
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
|
861 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
|
862 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
|
863 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
|
864 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
|
865 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
|
866 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
|
867 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
|
868 data = self.git[sha].data |
837
c24d2ea1361b
git_handler.import_git_commit: rename 'hg_renames' to 'renames'
Siddharth Agarwal <sid0@fb.com>
parents:
836
diff
changeset
|
869 copied_path = renames.get(f) |
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
|
870 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
|
871 else: |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
872 # it's a converged file |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
873 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
|
874 data = fc.data() |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
875 e = fc.flags() |
907
d153586c28f8
git_handler: properly handle paths when files converge
Gregory Szorc <gps@mozilla.com>
parents:
906
diff
changeset
|
876 copied_path = None |
d153586c28f8
git_handler: properly handle paths when files converge
Gregory Szorc <gps@mozilla.com>
parents:
906
diff
changeset
|
877 copied = fc.renamed() |
d153586c28f8
git_handler: properly handle paths when files converge
Gregory Szorc <gps@mozilla.com>
parents:
906
diff
changeset
|
878 if copied: |
d153586c28f8
git_handler: properly handle paths when files converge
Gregory Szorc <gps@mozilla.com>
parents:
906
diff
changeset
|
879 copied_path = copied[0] |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
880 |
739
e034e5196d6c
git_handler: update memfilectx creation per Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
716
diff
changeset
|
881 try: |
e034e5196d6c
git_handler: update memfilectx creation per Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
716
diff
changeset
|
882 return context.memfilectx(self.repo, f, data, |
e034e5196d6c
git_handler: update memfilectx creation per Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
716
diff
changeset
|
883 islink='l' in e, |
e034e5196d6c
git_handler: update memfilectx creation per Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
716
diff
changeset
|
884 isexec='x' in e, |
e034e5196d6c
git_handler: update memfilectx creation per Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
716
diff
changeset
|
885 copied=copied_path) |
e034e5196d6c
git_handler: update memfilectx creation per Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
716
diff
changeset
|
886 except TypeError: |
e034e5196d6c
git_handler: update memfilectx creation per Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
716
diff
changeset
|
887 return context.memfilectx(f, data, |
e034e5196d6c
git_handler: update memfilectx creation per Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
716
diff
changeset
|
888 islink='l' in e, |
e034e5196d6c
git_handler: update memfilectx creation per Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
716
diff
changeset
|
889 isexec='x' in e, |
e034e5196d6c
git_handler: update memfilectx creation per Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
716
diff
changeset
|
890 copied=copied_path) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
891 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
892 p1, p2 = (nullid, nullid) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
893 octopus = False |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
894 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
895 if len(gparents) > 1: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
896 # merge, possibly octopus |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
897 def commit_octopus(p1, p2): |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
898 ctx = context.memctx(self.repo, (p1, p2), text, list(files) + |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
899 findconvergedfiles(p1, p2), getfilectx, |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
900 author, date, {'hg-git': 'octopus'}) |
740
a46cd7139699
git_handler: set substate to None to cope with Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
739
diff
changeset
|
901 # See comment below about setting substate to None. |
a46cd7139699
git_handler: set substate to None to cope with Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
739
diff
changeset
|
902 ctx.substate = None |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
903 return hex(self.repo.commitctx(ctx)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
904 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
905 octopus = len(gparents) > 2 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
906 p2 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
907 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
908 while len(gparents) > 0: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
909 p2 = commit_octopus(p1, p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
910 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
911 else: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
912 if gparents: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
913 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
914 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
915 # if named branch, add to extra |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
916 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
917 extra['branch'] = hg_branch |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
918 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
919 # 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
|
920 if commit.author != commit.committer \ |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
921 or commit.author_time != commit.commit_time \ |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
922 or commit.author_timezone != commit.commit_timezone: |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
923 extra['committer'] = "%s %d %d" % ( |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
924 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
|
925 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
926 if commit.encoding: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
927 extra['encoding'] = commit.encoding |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
928 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
929 if octopus: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
930 extra['hg-git'] = 'octopus-done' |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
931 |
406
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
932 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
|
933 list(files) + findconvergedfiles(p1, p2), |
50698ff64c41
Fix round-trip fidelity for merges of converged files.
Christian Walther <cwalther@gmx.ch>
parents:
401
diff
changeset
|
934 getfilectx, author, date, extra) |
740
a46cd7139699
git_handler: set substate to None to cope with Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
739
diff
changeset
|
935 # Starting Mercurial commit d2743be1bb06, memctx imports from |
a46cd7139699
git_handler: set substate to None to cope with Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
739
diff
changeset
|
936 # committablectx. This means that it has a 'substate' property that |
a46cd7139699
git_handler: set substate to None to cope with Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
739
diff
changeset
|
937 # contains the subrepo state. Ordinarily, Mercurial expects the subrepo |
a46cd7139699
git_handler: set substate to None to cope with Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
739
diff
changeset
|
938 # to be present while making a new commit -- since hg-git is importing |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
939 # purely in-memory commits without backing stores for the subrepos, |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
940 # that won't work. Forcibly set the substate to None so that there's no |
740
a46cd7139699
git_handler: set substate to None to cope with Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
739
diff
changeset
|
941 # attempt to read subrepos. |
a46cd7139699
git_handler: set substate to None to cope with Mercurial changes
Siddharth Agarwal <sid0@fb.com>
parents:
739
diff
changeset
|
942 ctx.substate = None |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
943 node = self.repo.commitctx(ctx) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
944 |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
945 self.swap_out_encoding(oldenc) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
946 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
947 # save changeset to mapping file |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
948 cs = hex(node) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
949 self.map_set(commit.id, cs) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
950 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
951 # 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
|
952 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
953 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
|
954 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
|
955 old_refs = {} |
592
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
956 change_totals = {} |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
957 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
958 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
|
959 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
|
960 old_refs.update(refs) |
814
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
961 all_exportable = self.get_exportable() |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
962 if revs is None: |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
963 exportable = all_exportable |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
964 else: |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
965 exportable = {} |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
966 for rev in (hex(r) for r in revs): |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
967 if rev not in all_exportable: |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
968 raise hgutil.Abort("revision %s cannot be pushed since" |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
969 " it doesn't have a ref" % |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
970 self.repo[rev]) |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
971 exportable[rev] = all_exportable[rev] |
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
972 return self.get_changed_refs(refs, exportable, force) |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
973 |
592
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
974 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
|
975 commits = [] |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
976 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
|
977 (sha, name) = mo |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
978 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
|
979 t = type(o) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
980 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
|
981 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
|
982 commits.append(sha) |
163c452531cf
push: add more output about what was added (issue #64)
David M. Carr <david@carrclan.us>
parents:
591
diff
changeset
|
983 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
|
984 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
|
985 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
|
986 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
|
987 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
|
988 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
|
989 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
|
990 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
|
991 |
26
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
992 try: |
487
68e5dddc7a20
push: return 1 if no changes found, 0 if success
David M. Carr <david@carrclan.us>
parents:
475
diff
changeset
|
993 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
|
994 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
|
995 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
|
996 " 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
|
997 (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
|
998 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
|
999 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
|
1000 return old_refs, new_refs |
394
721165a45385
Catch GitProtocolError wherever HangupException can occur.
Brendan Cully <brendan@kublai.com>
parents:
392
diff
changeset
|
1001 except (HangupException, GitProtocolError), e: |
721165a45385
Catch GitProtocolError wherever HangupException can occur.
Brendan Cully <brendan@kublai.com>
parents:
392
diff
changeset
|
1002 raise hgutil.Abort(_("git remote error: ") + str(e)) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
1003 |
814
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
1004 def get_changed_refs(self, refs, exportable, force): |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1005 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
|
1006 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1007 # The remote repo is empty and the local one doesn't have |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1008 # bookmarks/tags |
864
9e0954d9abb3
git_handler: slight style cleanup for previous patch
Augie Fackler <raf@durin42.com>
parents:
863
diff
changeset
|
1009 # |
9e0954d9abb3
git_handler: slight style cleanup for previous patch
Augie Fackler <raf@durin42.com>
parents:
863
diff
changeset
|
1010 # (older dulwich versions return the proto-level |
9e0954d9abb3
git_handler: slight style cleanup for previous patch
Augie Fackler <raf@durin42.com>
parents:
863
diff
changeset
|
1011 # capabilities^{} key when the dict should have been |
9e0954d9abb3
git_handler: slight style cleanup for previous patch
Augie Fackler <raf@durin42.com>
parents:
863
diff
changeset
|
1012 # empty. That check can probably be removed at some point in |
9e0954d9abb3
git_handler: slight style cleanup for previous patch
Augie Fackler <raf@durin42.com>
parents:
863
diff
changeset
|
1013 # the future.) |
9e0954d9abb3
git_handler: slight style cleanup for previous patch
Augie Fackler <raf@durin42.com>
parents:
863
diff
changeset
|
1014 if not refs or refs.keys()[0] == 'capabilities^{}': |
815
6cdeafb8ca46
git_handler.get_chanaged_refs: use exportable for no-ref check
Siddharth Agarwal <sid0@fb.com>
parents:
814
diff
changeset
|
1015 if not exportable: |
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
|
1016 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
|
1017 if tip != nullid: |
863
9036716a1271
Allow for dulwich to not return the magic "capabilities^{}" ref.
Jelmer Vernooij <jelmer@samba.org>
parents:
862
diff
changeset
|
1018 if 'capabilities^{}' in new_refs: |
9036716a1271
Allow for dulwich to not return the magic "capabilities^{}" ref.
Jelmer Vernooij <jelmer@samba.org>
parents:
862
diff
changeset
|
1019 del new_refs['capabilities^{}'] |
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
|
1020 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
|
1021 try: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1022 commands.bookmark(self.ui, self.repo, 'master', |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1023 rev=tip, force=True) |
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
|
1024 except NameError: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1025 bookmarks.bookmark(self.ui, self.repo, 'master', |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1026 rev=tip, force=True) |
906
286555803dae
git_handler: update for bookmark changes in mercurial 3.5
Sean Farley <sean@farley.io>
parents:
886
diff
changeset
|
1027 try: |
286555803dae
git_handler: update for bookmark changes in mercurial 3.5
Sean Farley <sean@farley.io>
parents:
886
diff
changeset
|
1028 bookmarks.activate(self.repo, 'master') |
286555803dae
git_handler: update for bookmark changes in mercurial 3.5
Sean Farley <sean@farley.io>
parents:
886
diff
changeset
|
1029 except AttributeError: |
286555803dae
git_handler: update for bookmark changes in mercurial 3.5
Sean Farley <sean@farley.io>
parents:
886
diff
changeset
|
1030 # hg < 3.5 |
286555803dae
git_handler: update for bookmark changes in mercurial 3.5
Sean Farley <sean@farley.io>
parents:
886
diff
changeset
|
1031 bookmarks.setcurrent(self.repo, 'master') |
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
|
1032 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
|
1033 |
814
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
1034 for rev, rev_refs in exportable.iteritems(): |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1035 ctx = self.repo[rev] |
814
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
1036 if not rev_refs: |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1037 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
|
1038 " it doesn't have a ref" % ctx) |
149 | 1039 |
310
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1040 # Check if the tags the server is advertising are annotated tags, |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1041 # by attempting to retrieve it from the our git repo, and building |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1042 # a list of these tags. |
310
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1043 # |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1044 # 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
|
1045 # 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
|
1046 # 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
|
1047 uptodate_annotated_tags = [] |
814
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
1048 for ref in rev_refs.tags: |
310
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1049 # Check tag. |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1050 if ref not in refs: |
310
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1051 continue |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1052 try: |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1053 # 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
|
1054 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
|
1055 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
|
1056 continue |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1057 except KeyError: |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1058 continue |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1059 |
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1060 # 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
|
1061 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
|
1062 |
814
345919960ea4
git_handler.get_changed_refs: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
813
diff
changeset
|
1063 for ref in rev_refs: |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1064 if ref not in refs: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1065 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
|
1066 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
|
1067 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
|
1068 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
|
1069 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
|
1070 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1071 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
|
1072 % (ref, ctx)) |
310
53b0d608dcd5
when pushing, check if server is advertising annotated tags
Tay Ray Chuan <rctay89@gmail.com>
parents:
302
diff
changeset
|
1073 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
|
1074 # 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
|
1075 pass |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1076 else: |
630
3ff09f0fac7a
git_handler.py: less cryptic error message when push fails
anatoly techtonik <techtonik@gmail.com>
parents:
622
diff
changeset
|
1077 raise hgutil.Abort( |
3ff09f0fac7a
git_handler.py: less cryptic error message when push fails
anatoly techtonik <techtonik@gmail.com>
parents:
622
diff
changeset
|
1078 "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
|
1079 "please pull and merge before pushing" % ref) |
126 | 1080 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1081 return new_refs |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
1082 |
557
4f4ab2d89375
gitrepo: initial support for listkeys
David M. Carr <david@carrclan.us>
parents:
555
diff
changeset
|
1083 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
|
1084 client, path = self.get_transport_and_path(remote_name) |
916
efcefc3522bd
pull: consider remotes during discovery
Durham Goode <durham@fb.com>
parents:
907
diff
changeset
|
1085 |
efcefc3522bd
pull: consider remotes during discovery
Durham Goode <durham@fb.com>
parents:
907
diff
changeset
|
1086 # The dulwich default walk only checks refs/heads/. We also want to |
efcefc3522bd
pull: consider remotes during discovery
Durham Goode <durham@fb.com>
parents:
907
diff
changeset
|
1087 # consider remotes when doing discovery, so we build our own list. We |
efcefc3522bd
pull: consider remotes during discovery
Durham Goode <durham@fb.com>
parents:
907
diff
changeset
|
1088 # can't just do 'refs/' here because the tag class doesn't have a |
efcefc3522bd
pull: consider remotes during discovery
Durham Goode <durham@fb.com>
parents:
907
diff
changeset
|
1089 # parents function for walking, and older versions of dulwich don't like |
efcefc3522bd
pull: consider remotes during discovery
Durham Goode <durham@fb.com>
parents:
907
diff
changeset
|
1090 # that. |
efcefc3522bd
pull: consider remotes during discovery
Durham Goode <durham@fb.com>
parents:
907
diff
changeset
|
1091 haveheads = self.git.refs.as_dict('refs/remotes/').values() |
efcefc3522bd
pull: consider remotes during discovery
Durham Goode <durham@fb.com>
parents:
907
diff
changeset
|
1092 haveheads.extend(self.git.refs.as_dict('refs/heads/').values()) |
efcefc3522bd
pull: consider remotes during discovery
Durham Goode <durham@fb.com>
parents:
907
diff
changeset
|
1093 graphwalker = self.git.get_graph_walker(heads=haveheads) |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1094 |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1095 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
|
1096 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
|
1097 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
|
1098 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
1099 try: |
609
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1100 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
|
1101 f = StringIO.StringIO() |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1102 ret = client.fetch_pack(path, determine_wants, graphwalker, |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1103 f.write, progress.progress) |
609
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1104 if(f.pos != 0): |
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1105 f.seek(0) |
886
77252ce6e9af
git_handler: remove unused variables
Sean Farley <sean@farley.io>
parents:
885
diff
changeset
|
1106 self.git.object_store.add_thin_pack(f.read, None) |
609
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1107 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
|
1108 |
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
|
1109 # 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
|
1110 # 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
|
1111 # 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
|
1112 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
|
1113 except (HangupException, GitProtocolError), e: |
47df57f2bb2b
fix/work around https://bugs.launchpad.net/dulwich/+bug/1025886
domruf <dominikruf@gmail.com>
parents:
591
diff
changeset
|
1114 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
|
1115 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1116 # REFERENCES HANDLING |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1117 |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1118 def filter_refs(self, refs, heads): |
716
268b9f6ed1c8
filter_refs: only return all refs when heads is None
Siddharth Agarwal <sid0@fb.com>
parents:
710
diff
changeset
|
1119 '''For a dictionary of refs: shas, if heads is None then return refs |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1120 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
|
1121 |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1122 ''' |
819
2c5e41d670b5
git_handler: return filtered refs as an OrderedDict
Siddharth Agarwal <sid0@fb.com>
parents:
818
diff
changeset
|
1123 filteredrefs = [] |
716
268b9f6ed1c8
filter_refs: only return all refs when heads is None
Siddharth Agarwal <sid0@fb.com>
parents:
710
diff
changeset
|
1124 if heads is not None: |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1125 # 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
|
1126 # if ref is just '<foo>', then we get ('foo', 'foo') |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1127 stripped_refs = [(r, r[r.find('/', r.find('/') + 1) + 1:]) for r in |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1128 refs] |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1129 for h in heads: |
821
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1130 if h.endswith('/*'): |
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1131 prefix = h[:-1] # include the / but not the * |
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1132 r = [pair[0] for pair in stripped_refs |
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1133 if pair[1].startswith(prefix)] |
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1134 r.sort() |
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1135 filteredrefs.extend(r) |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1136 else: |
821
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1137 r = [pair[0] for pair in stripped_refs if pair[1] == h] |
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1138 if not r: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1139 raise hgutil.Abort("ref %s not found on remote server" |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1140 % h) |
821
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1141 elif len(r) == 1: |
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1142 filteredrefs.append(r[0]) |
0d6d2fcc62b6
git_handler: support wildcards for Git branch name matching
Siddharth Agarwal <sid0@fb.com>
parents:
820
diff
changeset
|
1143 else: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1144 raise hgutil.Abort("ambiguous reference %s: %r" |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1145 % (h, r)) |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1146 else: |
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1147 for ref, sha in refs.iteritems(): |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1148 if (not ref.endswith('^{}') and |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1149 (ref.startswith('refs/heads/') or |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1150 ref.startswith('refs/tags/'))): |
819
2c5e41d670b5
git_handler: return filtered refs as an OrderedDict
Siddharth Agarwal <sid0@fb.com>
parents:
818
diff
changeset
|
1151 filteredrefs.append(ref) |
820
826296785e8b
git_handler.filter_refs: sort returned refs if none are provided
Siddharth Agarwal <sid0@fb.com>
parents:
819
diff
changeset
|
1152 filteredrefs.sort() |
819
2c5e41d670b5
git_handler: return filtered refs as an OrderedDict
Siddharth Agarwal <sid0@fb.com>
parents:
818
diff
changeset
|
1153 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1154 # the choice of OrderedDict vs plain dict has no impact on stock |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1155 # hg-git, but allows extensions to customize the order in which refs |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1156 # are returned |
819
2c5e41d670b5
git_handler: return filtered refs as an OrderedDict
Siddharth Agarwal <sid0@fb.com>
parents:
818
diff
changeset
|
1157 return util.OrderedDict((r, refs[r]) for r in filteredrefs) |
698
a58ae693ab72
determine_wants: factor ref filtering code out into a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
697
diff
changeset
|
1158 |
822
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1159 def filter_min_date(self, refs): |
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1160 '''filter refs by minimum date |
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1161 |
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1162 This only works for refs that are available locally.''' |
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1163 min_date = self.ui.config('git', 'mindate') |
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1164 if min_date is None: |
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1165 return refs |
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1166 |
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1167 # filter refs older than min_timestamp |
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1168 min_timestamp, min_offset = hgutil.parsedate(min_date) |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1169 |
827
7c1452551db1
git_handler.filter_min_date: support tag times for annotated tags
Siddharth Agarwal <sid0@fb.com>
parents:
824
diff
changeset
|
1170 def check_min_time(obj): |
7c1452551db1
git_handler.filter_min_date: support tag times for annotated tags
Siddharth Agarwal <sid0@fb.com>
parents:
824
diff
changeset
|
1171 if isinstance(obj, Tag): |
7c1452551db1
git_handler.filter_min_date: support tag times for annotated tags
Siddharth Agarwal <sid0@fb.com>
parents:
824
diff
changeset
|
1172 return obj.tag_time >= min_timestamp |
7c1452551db1
git_handler.filter_min_date: support tag times for annotated tags
Siddharth Agarwal <sid0@fb.com>
parents:
824
diff
changeset
|
1173 else: |
7c1452551db1
git_handler.filter_min_date: support tag times for annotated tags
Siddharth Agarwal <sid0@fb.com>
parents:
824
diff
changeset
|
1174 return obj.commit_time >= min_timestamp |
822
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1175 return util.OrderedDict((ref, sha) for ref, sha in refs.iteritems() |
827
7c1452551db1
git_handler.filter_min_date: support tag times for annotated tags
Siddharth Agarwal <sid0@fb.com>
parents:
824
diff
changeset
|
1176 if check_min_time(self.git[sha])) |
822
53e7e8f34dcd
git_handler: introduce a function and config to filter by minimum date
Siddharth Agarwal <sid0@fb.com>
parents:
821
diff
changeset
|
1177 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1178 def update_references(self): |
813
2e77e332f3b3
git_handler.update_references: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
812
diff
changeset
|
1179 exportable = self.get_exportable() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1180 |
195
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
1181 # 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
|
1182 # Mercurial bookmark. |
813
2e77e332f3b3
git_handler.update_references: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
812
diff
changeset
|
1183 for hg_sha, refs in exportable.iteritems(): |
2e77e332f3b3
git_handler.update_references: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
812
diff
changeset
|
1184 for git_ref in refs.heads: |
2e77e332f3b3
git_handler.update_references: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
812
diff
changeset
|
1185 git_sha = self.map_git_get(hg_sha) |
2e77e332f3b3
git_handler.update_references: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
812
diff
changeset
|
1186 if git_sha: |
2e77e332f3b3
git_handler.update_references: switch to using get_exportable
Siddharth Agarwal <sid0@fb.com>
parents:
812
diff
changeset
|
1187 self.git.refs[git_ref] = git_sha |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1188 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1189 def export_hg_tags(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1190 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
|
1191 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
|
1192 tag = tag.replace(' ', '_') |
587
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1193 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
|
1194 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
|
1195 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
|
1196 if(check_ref_format(tag_refname)): |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1197 self.git.refs[tag_refname] = target |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1198 self.tags[tag] = hex(sha) |
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
|
1199 else: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1200 self.repo.ui.warn('Skipping export of tag %s because ' |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1201 'it has invalid name as a git ' |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1202 'refname.\n' % tag) |
587
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1203 else: |
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1204 self.repo.ui.warn( |
1ab57b19cb3a
git_handler: defend against unexported revisions in tag exporting
Augie Fackler <raf@durin42.com>
parents:
552
diff
changeset
|
1205 '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
|
1206 'has no matching git revision.\n' % tag) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1207 |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1208 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
|
1209 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
|
1210 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
|
1211 else: |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1212 def _filter_bm(bm): |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1213 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
|
1214 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
|
1215 else: |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1216 return bm |
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1217 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
|
1218 |
812
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1219 def get_exportable(self): |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1220 class heads_tags(object): |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1221 def __init__(self): |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1222 self.heads = set() |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1223 self.tags = set() |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1224 |
812
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1225 def __iter__(self): |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1226 return itertools.chain(self.heads, self.tags) |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1227 |
812
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1228 def __nonzero__(self): |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1229 return bool(self.heads) or bool(self.tags) |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1230 |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1231 res = collections.defaultdict(heads_tags) |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1232 |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1233 bms = self.repo._bookmarks |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1234 for filtered_bm, bm in self._filter_for_bookmarks(bms): |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1235 res[hex(bms[bm])].heads.add('refs/heads/' + filtered_bm) |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1236 for tag, sha in self.tags.iteritems(): |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1237 res[sha].tags.add('refs/tags/' + tag) |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1238 return res |
256a232e689d
git_handler: add a way to get all heads that can be exported to Git
Siddharth Agarwal <sid0@fb.com>
parents:
811
diff
changeset
|
1239 |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
1240 def import_tags(self, refs): |
149 | 1241 keys = refs.keys() |
1242 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
|
1243 return |
688
7ca655e44d9a
git_handler: don't compute tags for each tag imported
Siddharth Agarwal <sid0@fb.com>
parents:
686
diff
changeset
|
1244 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
|
1245 for k in keys[:]: |
149 | 1246 ref_name = k |
1247 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
|
1248 if parts[0] == 'refs' and parts[1] == 'tags': |
149 | 1249 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
|
1250 # 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
|
1251 # the ones we are pulling |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1252 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
|
1253 continue |
149 | 1254 if ref_name[-3:] == '^{}': |
1255 ref_name = ref_name[:-3] | |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1256 if ref_name not in repotags: |
149 | 1257 obj = self.git.get_object(refs[k]) |
1258 sha = None | |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1259 if isinstance(obj, Commit): # lightweight |
149 | 1260 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
|
1261 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
|
1262 self.tags[ref_name] = sha |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1263 elif isinstance(obj, Tag): # annotated |
337
6cea997ee302
enforce stricter matching for pull -r
Tay Ray Chuan <rctay89@gmail.com>
parents:
258
diff
changeset
|
1264 (obj_type, obj_sha) = obj.object |
149 | 1265 obj = self.git.get_object(obj_sha) |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1266 if isinstance(obj, Commit): |
149 | 1267 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
|
1268 # 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
|
1269 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
|
1270 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
|
1271 self.save_tags() |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1272 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1273 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
|
1274 try: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1275 oldbm = getattr(bookmarks, 'parse', None) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1276 if oldbm: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1277 bms = bookmarks.parse(self.repo) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1278 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1279 bms = self.repo._bookmarks |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1280 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1281 heads = dict([(ref[11:], refs[ref]) for ref in refs |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1282 if ref.startswith('refs/heads/')]) |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
1283 |
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
|
1284 suffix = self.branch_bookmark_suffix or '' |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
1285 for head, sha in heads.iteritems(): |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1286 # 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
|
1287 # 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
|
1288 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
|
1289 if hgsha is None: |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
1290 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
|
1291 hgsha = bin(hgsha) |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1292 if head not in bms: |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1293 # 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
|
1294 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
|
1295 else: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1296 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
|
1297 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
|
1298 # 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
|
1299 bms[head + suffix] = hgsha |
441
35e2813f58a5
- add "branch_bookmark_names" parameter. this allows bookmarks
Mike Bayer <mike_mp@zzzcomputing.com>
parents:
439
diff
changeset
|
1300 |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
1301 if heads: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1302 if oldbm: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1303 bookmarks.write(self.repo, bms) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1304 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
1305 self.repo._bookmarks = bms |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1306 if getattr(bms, 'write', None): # hg >= 2.5 |
590
96e75caaf900
git_handler: add bookmark compatibility with new bmstore (issue #60)
David M. Carr <david@carrclan.us>
parents:
587
diff
changeset
|
1307 bms.write() |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1308 else: # hg < 2.5 |
590
96e75caaf900
git_handler: add bookmark compatibility with new bmstore (issue #60)
David M. Carr <david@carrclan.us>
parents:
587
diff
changeset
|
1309 bookmarks.write(self.repo) |
161
134915637cf7
Merge branch 'octo' with octo merge code
Scott Chacon <schacon@gmail.com>
diff
changeset
|
1310 |
29
2a5c0bf0fef5
Another way of fixing no-bookmark issue, along with updated test.
Augie Fackler <durin42@gmail.com>
parents:
28
diff
changeset
|
1311 except AttributeError: |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
1312 self.ui.warn(_('creating bookmarks failed, do you have' |
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
1313 ' 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
|
1314 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1315 def update_remote_branches(self, remote_name, refs): |
774
55887ce9fb98
git_handler.update_remote_branches: rename 'tags' to 'remote_refs'
Siddharth Agarwal <sid0@fb.com>
parents:
773
diff
changeset
|
1316 remote_refs = self.remote_refs |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1317 # since we re-write all refs for this remote each time, prune |
774
55887ce9fb98
git_handler.update_remote_branches: rename 'tags' to 'remote_refs'
Siddharth Agarwal <sid0@fb.com>
parents:
773
diff
changeset
|
1318 # all entries matching this remote from our refs list now so |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1319 # that we avoid any stale refs hanging around forever |
774
55887ce9fb98
git_handler.update_remote_branches: rename 'tags' to 'remote_refs'
Siddharth Agarwal <sid0@fb.com>
parents:
773
diff
changeset
|
1320 for t in list(remote_refs): |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1321 if t.startswith(remote_name + '/'): |
774
55887ce9fb98
git_handler.update_remote_branches: rename 'tags' to 'remote_refs'
Siddharth Agarwal <sid0@fb.com>
parents:
773
diff
changeset
|
1322 del remote_refs[t] |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1323 for ref_name, sha in refs.iteritems(): |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1324 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
|
1325 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
|
1326 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
|
1327 continue |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1328 head = ref_name[11:] |
774
55887ce9fb98
git_handler.update_remote_branches: rename 'tags' to 'remote_refs'
Siddharth Agarwal <sid0@fb.com>
parents:
773
diff
changeset
|
1329 remote_refs['/'.join((remote_name, head))] = bin(hgsha) |
367
699088d9dd9f
hgrepo: completely rework handing of remote refs marking
Augie Fackler <durin42@gmail.com>
parents:
361
diff
changeset
|
1330 # TODO(durin42): what is this doing? |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1331 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
|
1332 self.git.refs[new_ref] = sha |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1333 elif (ref_name.startswith('refs/tags') and not |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1334 ref_name.endswith('^{}')): |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
1335 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
|
1336 |
775
9c6bd4102ef5
git_handler: move remote ref writing to a separate function
Siddharth Agarwal <sid0@fb.com>
parents:
774
diff
changeset
|
1337 self.save_remote_refs() |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
1338 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1339 # UTILITY FUNCTIONS |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
1340 |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1341 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
|
1342 # TODO: make these into constants |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1343 convert = { |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1344 0100644: '', |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1345 0100755: 'x', |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1346 0120000: 'l' |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1347 } |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1348 if mode in convert: |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1349 return convert[mode] |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
1350 return '' |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
1351 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1352 def get_file(self, commit, f): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1353 otree = self.git.tree(commit.tree) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1354 parts = f.split('/') |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1355 for part in parts: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1356 (mode, sha) = otree[part] |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1357 obj = self.git.get_object(sha) |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1358 if isinstance(obj, Blob): |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1359 return (mode, sha, obj._text) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1360 elif isinstance(obj, Tree): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1361 otree = obj |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1362 |
838
6866ae460ee7
git_handler.import_git_commit: figure out when to detect renames
Siddharth Agarwal <sid0@fb.com>
parents:
837
diff
changeset
|
1363 def get_files_changed(self, commit, detect_renames): |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1364 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
|
1365 btree = None |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1366 |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1367 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
|
1368 btree = self.git[commit.parents[0]].tree |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1369 |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
1370 files = {} |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1371 gitlinks = {} |
841
edcdb7620f4d
git_handler.get_files_changed: return detected renames
Siddharth Agarwal <sid0@fb.com>
parents:
840
diff
changeset
|
1372 renames = None |
844
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1373 rename_detector = None |
841
edcdb7620f4d
git_handler.get_files_changed: return detected renames
Siddharth Agarwal <sid0@fb.com>
parents:
840
diff
changeset
|
1374 if detect_renames: |
edcdb7620f4d
git_handler.get_files_changed: return detected renames
Siddharth Agarwal <sid0@fb.com>
parents:
840
diff
changeset
|
1375 renames = {} |
844
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1376 rename_detector = self._rename_detector |
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1377 |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1378 # this set is unused if rename detection isn't enabled -- that makes |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1379 # the code below simpler |
865
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1380 renamed_out = set() |
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1381 |
844
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1382 changes = diff_tree.tree_changes(self.git.object_store, btree, tree, |
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1383 rename_detector=rename_detector) |
841
edcdb7620f4d
git_handler.get_files_changed: return detected renames
Siddharth Agarwal <sid0@fb.com>
parents:
840
diff
changeset
|
1384 |
839
f6f84d51a154
git_handler.get_files_changed: switch to diff_tree's tree_changes
Siddharth Agarwal <sid0@fb.com>
parents:
838
diff
changeset
|
1385 for change in changes: |
f6f84d51a154
git_handler.get_files_changed: switch to diff_tree's tree_changes
Siddharth Agarwal <sid0@fb.com>
parents:
838
diff
changeset
|
1386 oldfile, oldmode, oldsha = change.old |
f6f84d51a154
git_handler.get_files_changed: switch to diff_tree's tree_changes
Siddharth Agarwal <sid0@fb.com>
parents:
838
diff
changeset
|
1387 newfile, newmode, newsha = change.new |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1388 # actions are described by the following table ('no' means 'does |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1389 # not exist'): |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1390 # old new | action |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1391 # no file | record file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1392 # no gitlink | record gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1393 # file no | delete file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1394 # file file | record file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1395 # 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
|
1396 # gitlink no | delete gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1397 # 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
|
1398 # gitlink gitlink | record gitlink |
854
89bfb9994732
git_handler: handle symlink <-> regular file transitions properly
Siddharth Agarwal <sid0@fb.com>
parents:
845
diff
changeset
|
1399 # |
89bfb9994732
git_handler: handle symlink <-> regular file transitions properly
Siddharth Agarwal <sid0@fb.com>
parents:
845
diff
changeset
|
1400 # There's an edge case here -- symlink <-> regular file transitions |
89bfb9994732
git_handler: handle symlink <-> regular file transitions properly
Siddharth Agarwal <sid0@fb.com>
parents:
845
diff
changeset
|
1401 # are returned by dulwich as separate deletes and adds, not |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1402 # modifications. The order of those results is unspecified and |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1403 # could be either way round. Handle both cases: delete first, then |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1404 # add -- delete stored in 'old = file' case, then overwritten by |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1405 # 'new = file' case. add first, then delete -- record stored in |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1406 # 'new = file' case, then membership check fails in 'old = file' |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1407 # case so is not overwritten there. This is not an issue for |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1408 # gitlink <-> {symlink, regular file} transitions because they |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1409 # write to separate dictionaries. |
865
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1410 # |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1411 # There's a similar edge case when rename detection is enabled: if |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1412 # a file is renamed and then replaced by a symlink (typically to |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1413 # the new location), it is returned by dulwich as an add and a |
865
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1414 # rename. The order of those results is unspecified. Handle both |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1415 # cases: rename first, then add -- delete stored in 'new = file' |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1416 # case with renamed_out, then renamed_out check passes in 'old = |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1417 # file' case so is overwritten. add first, then rename -- add |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1418 # stored in 'old = file' case, then membership check fails in 'new |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1419 # = file' case so is overwritten. |
287
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
1420 if newmode == 0160000: |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1421 # new = gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1422 gitlinks[newfile] = newsha |
844
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1423 if change.type == diff_tree.CHANGE_RENAME: |
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1424 # don't record the rename because only file -> file renames |
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1425 # make sense in Mercurial |
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1426 gitlinks[oldfile] = None |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1427 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
|
1428 # file -> gitlink |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1429 files[oldfile] = True, None, None |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1430 continue |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1431 if oldmode == 0160000 and newmode != 0160000: |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1432 # 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
|
1433 gitlinks[oldfile] = None |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1434 continue |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1435 if newfile is not None: |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1436 # new = file |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1437 files[newfile] = False, newmode, newsha |
844
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1438 if renames is not None and newfile != oldfile: |
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1439 renames[newfile] = oldfile |
865
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1440 renamed_out.add(oldfile) |
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1441 # the membership check is explained in a comment above |
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1442 if (change.type == diff_tree.CHANGE_RENAME and |
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1443 oldfile not in files): |
844
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1444 files[oldfile] = True, None, None |
640
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1445 else: |
42ca3ace9a0f
git_handler: return gitlinks in get_files_changed
Siddharth Agarwal <sid0@fb.com>
parents:
636
diff
changeset
|
1446 # old = file |
865
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1447 # files renamed_out | action |
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1448 # no * | write |
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1449 # yes no | ignore |
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1450 # yes yes | write |
4d246150d850
git_handler: handle case where file is renamed and replaced by a symlink
Siddharth Agarwal <sid0@fb.com>
parents:
864
diff
changeset
|
1451 if oldfile not in files or oldfile in renamed_out: |
854
89bfb9994732
git_handler: handle symlink <-> regular file transitions properly
Siddharth Agarwal <sid0@fb.com>
parents:
845
diff
changeset
|
1452 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
|
1453 |
841
edcdb7620f4d
git_handler.get_files_changed: return detected renames
Siddharth Agarwal <sid0@fb.com>
parents:
840
diff
changeset
|
1454 return files, gitlinks, renames |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
1455 |
840
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1456 @hgutil.propertycache |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1457 def _rename_detector(self): |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1458 # disabled by default to avoid surprises |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1459 similarity = self.ui.configint('git', 'similarity', default=0) |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1460 if similarity < 0 or similarity > 100: |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1461 raise util.Abort(_('git.similarity must be between 0 and 100')) |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1462 if similarity == 0: |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1463 return None |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1464 |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1465 # default is borrowed from Git |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1466 max_files = self.ui.configint('git', 'renamelimit', default=400) |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1467 if similarity < 0: |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1468 raise util.Abort(_('git.renamelimit must be non-negative')) |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1469 if max_files == 0: |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1470 max_files = None |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1471 |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1472 find_copies_harder = self.ui.configbool('git', 'findcopiesharder', |
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1473 default=False) |
844
da804eac2b00
git_handler.get_files_changed: detect renames when asked to do so
Siddharth Agarwal <sid0@fb.com>
parents:
841
diff
changeset
|
1474 return diff_tree.RenameDetector(self.git.object_store, |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1475 rename_threshold=similarity, |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1476 max_files=max_files, |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1477 find_copies_harder=find_copies_harder) |
840
83a0e6c0e82c
git_handler: add a way to get a rename detector
Siddharth Agarwal <sid0@fb.com>
parents:
839
diff
changeset
|
1478 |
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
|
1479 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
|
1480 """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
|
1481 |
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
|
1482 :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
|
1483 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
|
1484 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
|
1485 """ |
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
|
1486 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
|
1487 try: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1488 unused_mode, gitmodules_sha = tree_obj['.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
|
1489 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
|
1490 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
|
1491 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
|
1492 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
|
1493 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
|
1494 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
|
1495 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
|
1496 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
|
1497 sm_path = tt.get(section, 'path') |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1498 sm_url = tt.get(section, 'url') |
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
|
1499 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
|
1500 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
|
1501 |
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
|
1502 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
|
1503 """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
|
1504 |
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
|
1505 :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
|
1506 """ |
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
|
1507 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
|
1508 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
|
1509 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
|
1510 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
|
1511 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
|
1512 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1513 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
|
1514 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
|
1515 if names: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1516 return names[0] |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
1517 |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1518 # Stolen from hgsubversion |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1519 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
|
1520 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1521 from mercurial import encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1522 old = encoding.encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1523 encoding.encoding = new_encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1524 except ImportError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1525 old = hgutil._encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1526 hgutil._encoding = new_encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1527 return old |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1528 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1529 def decode_guess(self, string, encoding): |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1530 # 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
|
1531 if encoding: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1532 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1533 return string.decode(encoding).encode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1534 except UnicodeDecodeError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1535 pass |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1536 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1537 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1538 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
|
1539 except UnicodeDecodeError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
1540 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
|
1541 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
1542 def get_transport_and_path(self, uri): |
922
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1543 """Method that sets up the transport (either ssh or http(s)) |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1544 |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1545 Tests: |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1546 |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1547 >>> from dulwich.client import HttpGitClient, SSHGitClient |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1548 >>> from mercurial.ui import ui |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1549 >>> g = GitHandler('', ui()) |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1550 >>> client, url = g.get_transport_and_path('http://fqdn.com/test.git') |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1551 >>> print isinstance(client, HttpGitClient) |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1552 True |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1553 >>> print url |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1554 http://fqdn.com/test.git |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1555 >>> client, url = g.get_transport_and_path('git@fqdn.com:user/repo.git') |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1556 >>> print isinstance(client, SSHGitClient) |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1557 True |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1558 >>> print url |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1559 user/repo.git |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1560 >>> print client.host |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1561 git@fqdn.com |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1562 """ |
369
e5c743cd0da1
pass hg's ui.ssh config to dulwich
Tay Ray Chuan <rctay89@gmail.com>
parents:
368
diff
changeset
|
1563 # 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
|
1564 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
|
1565 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
|
1566 |
922
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1567 # test for raw git ssh uri here so that we can reuse the logic below |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1568 if util.isgitsshuri(uri): |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1569 uri = "git+ssh://" + uri |
5f93caf337a9
git_handler: test for a raw git ssh uri
Sean Farley <sean@farley.io>
parents:
918
diff
changeset
|
1570 |
538
a38abdbab77c
Precompile Git URI regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
537
diff
changeset
|
1571 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
|
1572 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
|
1573 res = git_match.groupdict() |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1574 transport = client.TCPGitClient |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1575 if 'ssh' in res['scheme']: |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1576 transport = client.SSHGitClient |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1577 host, port, sepr = res['host'], res['port'], res['sepr'] |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1578 path = 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
|
1579 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
|
1580 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
|
1581 # 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
|
1582 # 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
|
1583 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
|
1584 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
|
1585 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
|
1586 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
|
1587 |
742
ab8562b11c4f
git_handler: enable thin pack optimization (issue102)
Takumi IINO <trot.thunder@gmail.com>
parents:
741
diff
changeset
|
1588 return transport(host, 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
|
1589 |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1590 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
|
1591 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
|
1592 |
3f45c88100e8
add support for the HTTP smart protocol when using Dulwich tip
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
432
diff
changeset
|
1593 if uri.startswith('http://') or uri.startswith('https://'): |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1594 auth = urllib2.HTTPBasicAuthHandler(url.passwordmgr(self.ui)) |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1595 opener = urllib2.build_opener(auth) |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1596 ua = 'git/20x6 (hg-git ; uses dulwich and hg ; like git-core)' |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1597 opener.addheaders = [('User-Agent', ua)] |
870
6547d63aee4e
git_handler: reintroduce compatibility with dulwich 0.9.4 (issue124)
Siddharth Agarwal <sid0@fb.com>
parents:
869
diff
changeset
|
1598 try: |
6547d63aee4e
git_handler: reintroduce compatibility with dulwich 0.9.4 (issue124)
Siddharth Agarwal <sid0@fb.com>
parents:
869
diff
changeset
|
1599 return client.HttpGitClient(uri, opener=opener), uri |
6547d63aee4e
git_handler: reintroduce compatibility with dulwich 0.9.4 (issue124)
Siddharth Agarwal <sid0@fb.com>
parents:
869
diff
changeset
|
1600 except TypeError as e: |
6547d63aee4e
git_handler: reintroduce compatibility with dulwich 0.9.4 (issue124)
Siddharth Agarwal <sid0@fb.com>
parents:
869
diff
changeset
|
1601 if e.message.find("unexpected keyword argument 'opener'") >= 0: |
885
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1602 # Dulwich 0.9.4, which is the latest version that ships |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1603 # with Ubuntu 14.04, doesn't support the 'opener' keyword. |
4288d2de3cbf
git_handler: whitespace and formating changes
Sean Farley <sean@farley.io>
parents:
884
diff
changeset
|
1604 # Try without authentication. |
870
6547d63aee4e
git_handler: reintroduce compatibility with dulwich 0.9.4 (issue124)
Siddharth Agarwal <sid0@fb.com>
parents:
869
diff
changeset
|
1605 return client.HttpGitClient(uri), uri |
6547d63aee4e
git_handler: reintroduce compatibility with dulwich 0.9.4 (issue124)
Siddharth Agarwal <sid0@fb.com>
parents:
869
diff
changeset
|
1606 else: |
6547d63aee4e
git_handler: reintroduce compatibility with dulwich 0.9.4 (issue124)
Siddharth Agarwal <sid0@fb.com>
parents:
869
diff
changeset
|
1607 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
|
1608 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
1609 # if its not git or git+ssh, try a local url.. |
742
ab8562b11c4f
git_handler: enable thin pack optimization (issue102)
Takumi IINO <trot.thunder@gmail.com>
parents:
741
diff
changeset
|
1610 return client.SubprocessGitClient(), uri |