annotate hggit/git_handler.py @ 1085:1003994dd497

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