Mercurial > hg-git
annotate git_handler.py @ 235:912d6a5837c8
reorganize export_hg_commit
author | Abderrahim Kitouni <a.kitouni@gmail.com> |
---|---|
date | Sun, 02 Aug 2009 19:53:08 +0100 |
parents | 6f34aee64a3f |
children | 42ae65e6c1d1 |
rev | line source |
---|---|
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1 import os, sys, math, urllib, re |
76
aa2dadf04144
fixed the topo sorting and added a unit test
Scott Chacon <schacon@gmail.com>
parents:
75
diff
changeset
|
2 import toposort |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
3 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
4 from dulwich.errors import HangupException |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
5 from dulwich.index import commit_tree |
228
e720950443d8
fix invalid timezone handling
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
227
diff
changeset
|
6 from dulwich.objects import Blob, Commit, Tag, Tree, format_timezone |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
7 from dulwich.pack import create_delta, apply_delta |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
8 from dulwich.repo import Repo |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
9 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
10 from hgext import bookmarks |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
11 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
|
12 from mercurial.node import hex, bin, nullid |
222
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
13 from mercurial import context, util as hgutil |
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
14 |
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
15 try: |
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
16 from mercurial.error import RepoError |
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
17 except ImportError: |
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
18 from mercurial.repo import RepoError |
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
19 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
20 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
21 class GitHandler(object): |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
22 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
23 def __init__(self, dest_repo, ui): |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
24 self.repo = dest_repo |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
25 self.ui = ui |
105
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
26 self.mapfile = 'git-mapfile' |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
27 self.tagsfile = 'git-tags' |
133
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
28 |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
29 if ui.config('git', 'intree'): |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
30 self.gitdir = self.repo.wjoin('.git') |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
31 else: |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
32 self.gitdir = self.repo.join('git') |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
33 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
34 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
|
35 |
16
58cd05129119
moved init into git_handler
Scott Chacon <schacon@gmail.com>
parents:
14
diff
changeset
|
36 self.init_if_missing() |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
37 self.load_git() |
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
38 self.load_map() |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
39 self.load_tags() |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
40 |
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
41 # make the git data directory |
16
58cd05129119
moved init into git_handler
Scott Chacon <schacon@gmail.com>
parents:
14
diff
changeset
|
42 def init_if_missing(self): |
106
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
43 if not os.path.exists(self.gitdir): |
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
44 os.mkdir(self.gitdir) |
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
45 Repo.init_bare(self.gitdir) |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
46 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
47 def load_git(self): |
106
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
48 self.git = Repo(self.gitdir) |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
49 |
14
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
50 ## FILE LOAD AND SAVE METHODS |
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
51 |
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
|
52 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
|
53 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
|
54 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
|
55 |
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
|
56 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
|
57 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
|
58 |
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
|
59 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
|
60 return self._map_hg.get(hgsha) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
61 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
62 def load_map(self): |
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
|
63 self._map_git = {} |
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
|
64 self._map_hg = {} |
105
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
65 if os.path.exists(self.repo.join(self.mapfile)): |
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
66 for line in self.repo.opener(self.mapfile): |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
67 gitsha, hgsha = line.strip().split(' ', 1) |
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
|
68 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
|
69 self._map_hg[hgsha] = gitsha |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
70 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
71 def save_map(self): |
105
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
72 file = self.repo.opener(self.mapfile, 'w+', atomictemp=True) |
100
e17d9eea44ab
sort the mapfile before writing
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
99
diff
changeset
|
73 for gitsha, hgsha in sorted(self._map_git.iteritems()): |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
74 file.write("%s %s\n" % (gitsha, hgsha)) |
101
7c57f15d397c
use atomictemp to prevent corruption on ctrl-c
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
100
diff
changeset
|
75 file.rename() |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
76 |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
77 |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
78 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
|
79 self.tags = {} |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
80 if os.path.exists(self.repo.join(self.tagsfile)): |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
81 for line in self.repo.opener(self.tagsfile): |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
82 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
|
83 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
|
84 |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
85 def save_tags(self): |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
86 file = self.repo.opener(self.tagsfile, 'w+', atomictemp=True) |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
87 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
|
88 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
|
89 file.write("%s %s\n" % (sha, name)) |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
90 file.rename() |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
91 |
14
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
92 ## END FILE LOAD AND SAVE METHODS |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
93 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
94 ## COMMANDS METHODS |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
95 |
137
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
96 def import_commits(self, remote_name): |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
97 self.import_git_objects(remote_name) |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
98 self.save_map() |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
99 |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
100 def fetch(self, remote, heads): |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
101 self.export_git_objects() |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
102 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
|
103 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
|
104 |
56 | 105 if refs: |
149 | 106 self.import_git_objects(remote_name, refs) |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
107 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
|
108 self.update_hg_bookmarks(refs) |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
109 if remote_name: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
110 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
|
111 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
|
112 # intial cloning |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
113 self.update_remote_branches('default', refs) |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
114 else: |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
115 self.ui.status(_("nothing new on the server\n")) |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
116 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
117 self.save_map() |
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
118 |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
119 def export_commits(self, export_objects=True): |
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
120 if export_objects: |
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
121 self.export_git_objects() |
147 | 122 self.export_hg_tags() |
97 | 123 self.update_references() |
124 self.save_map() | |
125 | |
231
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
126 def get_refs(self, remote): |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
127 self.export_commits() |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
128 client, path = self.get_transport_and_path(remote) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
129 old_refs = {} |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
130 new_refs = {} |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
131 def changed(refs): |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
132 old_refs.update(refs) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
133 to_push = set(self.local_heads().values() + self.tags.values()) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
134 if not to_push and refs.keys()[0] == 'capabilities^{}': |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
135 to_push = [self.repo.lookup('tip')] |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
136 new_refs.update(self.get_changed_refs(refs, to_push, True)) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
137 # don't push anything |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
138 return {} |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
139 |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
140 try: |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
141 client.send_pack(path, changed, None) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
142 new = [bin(self.map_hg_get(r)) for r in new_refs.values()] |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
143 old = dict((bin(self.map_hg_get(r)), 1) for r in old_refs.values()) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
144 |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
145 return old, new |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
146 except HangupException: |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
147 raise hgutil.Abort("the remote end hung up unexpectedly") |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
148 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
149 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
|
150 self.export_commits() |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
151 changed_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
|
152 remote_name = self.remote_name(remote) |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
153 |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
154 if remote_name and changed_refs: |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
155 for ref, sha in changed_refs.iteritems(): |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
156 self.ui.status(" "+ remote_name + "::" + ref + " => GIT:" + sha[0:8] + "\n") |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
157 |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
158 self.update_remote_branches(remote_name, changed_refs) |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
159 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
160 def clear(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
161 mapfile = self.repo.join(self.mapfile) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
162 if os.path.exists(self.gitdir): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
163 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
|
164 for name in files: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
165 os.remove(os.path.join(root, name)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
166 for name in dirs: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
167 os.rmdir(os.path.join(root, name)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
168 os.rmdir(self.gitdir) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
169 if os.path.exists(mapfile): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
170 os.remove(mapfile) |
124
9dafb9ac24ff
hg bookmarks to local git branches
Ian Dees <undees@gmail.com>
parents:
118
diff
changeset
|
171 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
172 ## CHANGESET CONVERSION METHODS |
125 | 173 |
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
|
174 def export_git_objects(self): |
142
ed884cfe3fa3
export: be more clean in what we're doing
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
141
diff
changeset
|
175 self.ui.status(_("importing Hg objects into Git\n")) |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
176 nodes = [self.repo.lookup(n) for n in self.repo] |
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
177 export = [node for node in nodes if not hex(node) in self._map_hg] |
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
178 total = len(export) |
148
201d30003120
Splitting the if statement up since python didn't like that.
Nick Quaranto <nick@quaran.to>
parents:
147
diff
changeset
|
179 if total: |
201d30003120
Splitting the if statement up since python didn't like that.
Nick Quaranto <nick@quaran.to>
parents:
147
diff
changeset
|
180 magnitude = int(math.log(total, 10)) + 1 |
201d30003120
Splitting the if statement up since python didn't like that.
Nick Quaranto <nick@quaran.to>
parents:
147
diff
changeset
|
181 else: |
201d30003120
Splitting the if statement up since python didn't like that.
Nick Quaranto <nick@quaran.to>
parents:
147
diff
changeset
|
182 magnitude = 1 |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
183 for i, rev in enumerate(export): |
99
541571f2e429
add progress indication during export
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
97
diff
changeset
|
184 if i%100 == 0: |
541571f2e429
add progress indication during export
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
97
diff
changeset
|
185 self.ui.status(_("at: %*d/%d\n") % (magnitude, i, total)) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
186 |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
187 ctx = self.repo.changectx(rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
188 state = ctx.extra().get('hg-git', None) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
189 if state == 'octopus': |
203
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
190 self.ui.debug("revision %d is a part of octopus explosion\n" % ctx.rev()) |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
191 continue |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
192 self.export_hg_commit(rev) |
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
193 self.save_map() |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
194 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
195 # 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
|
196 # 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
|
197 # write the commit object (with metadata info) |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
198 def export_hg_commit(self, rev): |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
199 def is_octopus_part(ctx): |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
200 return ctx.extra().get('hg-git', None) in set(['octopus', 'octopus-done']) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
201 |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
202 self.ui.note(_("converting revision %s\n") % rev) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
203 |
203
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
204 oldenc = self.swap_out_encoding() |
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
205 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
206 # make sure parents are converted first |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
207 ctx = self.repo.changectx(rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
208 extra = ctx.extra() |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
209 |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
210 parents = [] |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
211 if extra.get('hg-git', None) == 'octopus-done': |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
212 # implode octopus parents |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
213 part = ctx |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
214 while is_octopus_part(part): |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
215 (p1, p2) = part.parents() |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
216 assert not is_octopus_part(p1) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
217 parents.append(p1) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
218 part = p2 |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
219 parents.append(p2) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
220 else: |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
221 parents = ctx.parents() |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
222 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
223 for parent in parents: |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
224 p_node = parent.node() |
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
225 if p_node != nullid and not hex(p_node) in self._map_hg: |
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
226 self.export_hg_commit(p_rev) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
227 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
228 renames = [] |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
229 for f in ctx: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
230 rename = ctx.filectx(f).renamed() |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
231 if rename: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
232 renames.append((rename[0], f)) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
233 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
234 commit = Commit() |
68
d28d3763eda3
Deal with hg authors missing email attributes.
Chris Wanstrath <chris@ozmm.org>
parents:
65
diff
changeset
|
235 |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
236 # hg authors might not have emails |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
237 author = ctx.user() |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
238 |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
239 # check for git author pattern compliance |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
240 regex = re.compile('^(.*?) \<(.*?)\>(.*)$') |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
241 a = regex.match(author) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
242 |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
243 if a: |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
244 name = a.group(1) |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
245 email = a.group(2) |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
246 if len(a.group(3)) > 0: |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
247 name += ' ext:(' + urllib.quote(a.group(3)) + ')' |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
248 author = name + ' <' + email + '>' |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
249 else: |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
250 author = author + ' <none@none>' |
169
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
251 |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
252 if 'author' in extra: |
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
253 author = apply_delta(author, extra['author']) |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
254 |
235
912d6a5837c8
reorganize export_hg_commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
234
diff
changeset
|
255 (time, timezone) = ctx.date() |
912d6a5837c8
reorganize export_hg_commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
234
diff
changeset
|
256 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
257 commit.author = author |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
258 commit.author_time = int(time) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
259 commit.author_timezone = -timezone |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
260 |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
261 commit.message = ctx.description() + "\n" |
203
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
262 if 'message' in extra: |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
263 commit.message = apply_delta(commit.message, extra['message']) |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
264 |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
265 if 'committer' in extra: |
131
dd6c77ec206c
store commitdate in mercurial's internal format.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
129
diff
changeset
|
266 # fixup timezone |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
267 (name, timestamp, timezone) = extra['committer'].rsplit(' ', 2) |
140
6701ab807bf5
Deal with invalid timezones in extra commiter
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
138
diff
changeset
|
268 try: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
269 commit.committer = name |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
270 commit.commit_time = timestamp |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
271 commit.commit_timezone = -int(timezone) |
228
e720950443d8
fix invalid timezone handling
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
227
diff
changeset
|
272 # work around a timezone format change |
e720950443d8
fix invalid timezone handling
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
227
diff
changeset
|
273 format_timezone(-int(timezone)) |
215
b5d4d1552765
add some annotations for test coverage
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
213
diff
changeset
|
274 except ValueError: #pragma: no cover |
199
4a480133b29a
add test for octopus merge conversion
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
196
diff
changeset
|
275 self.ui.warn(_("Ignoring committer in extra, invalid timezone in r%d: '%s'.\n") % (ctx, timezone)) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
276 commit.committer = commit.author |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
277 commit.commit_time = commit.author_time |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
278 commit.commit_timezone = commit.author_timezone |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
279 else: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
280 commit.committer = commit.author |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
281 commit.commit_time = commit.author_time |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
282 commit.commit_timezone = commit.author_timezone |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
283 |
118
b3be536e3f50
handles git commit encoding fields now
Scott Chacon <schacon@gmail.com>
parents:
113
diff
changeset
|
284 if 'encoding' in extra: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
285 commit.encoding = extra['encoding'] |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
286 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
287 # HG EXTRA INFORMATION |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
288 add_extras = False |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
289 extra_message = '' |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
290 if not ctx.branch() == 'default': |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
291 add_extras = True |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
292 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
|
293 |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
294 if renames: |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
295 add_extras = True |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
296 for oldfile, newfile in renames: |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
297 extra_message += "rename : " + oldfile + " => " + newfile + "\n" |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
298 |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
299 for key, value in extra.iteritems(): |
203
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
300 if key in ('author', 'committer', 'encoding', 'message', 'branch', 'hg-git'): |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
301 continue |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
302 else: |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
303 add_extras = True |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
304 extra_message += "extra : " + key + " : " + urllib.quote(value) + "\n" |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
305 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
306 if add_extras: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
307 commit.message += "\n--HG--\n" + extra_message |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
308 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
309 commit.parents = [] |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
310 for parent in parents: |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
311 hgsha = hex(parent.node()) |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
312 git_sha = self.map_git_get(hgsha) |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
313 if git_sha: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
314 commit.parents.append(git_sha) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
315 |
235
912d6a5837c8
reorganize export_hg_commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
234
diff
changeset
|
316 tree_sha = commit_tree(self.git.object_store, self.iterblobs(ctx)) |
912d6a5837c8
reorganize export_hg_commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
234
diff
changeset
|
317 commit.tree = tree_sha |
912d6a5837c8
reorganize export_hg_commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
234
diff
changeset
|
318 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
319 self.git.object_store.add_object(commit) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
320 self.map_set(commit.id, ctx.hex()) |
203
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
321 |
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
322 self.swap_out_encoding(oldenc) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
323 return commit.id |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
324 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
325 def iterblobs(self, ctx): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
326 for f in ctx: |
234
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
327 fctx = ctx[f] |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
328 blobid = self.map_git_get(hex(fctx.filenode())) |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
329 |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
330 if not blobid: |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
331 blob = Blob.from_string(fctx.data()) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
332 self.git.object_store.add_object(blob) |
234
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
333 self.map_set(blob.id, hex(fctx.filenode())) |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
334 blobid = blob.id |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
335 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
336 if 'l' in ctx.flags(f): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
337 mode = 0120000 |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
338 elif 'x' in ctx.flags(f): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
339 mode = 0100755 |
23
ee217d3c6363
will now write all trees and blobs needed. all thats left is commits for basic data conversion
Scott Chacon <schacon@gmail.com>
parents:
22
diff
changeset
|
340 else: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
341 mode = 0100644 |
234
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
342 |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
343 yield f, blobid, mode |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
344 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
345 def import_git_objects(self, remote_name=None, refs=None): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
346 self.ui.status(_("importing Git objects into Hg\n")) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
347 # import heads and fetched tags as remote references |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
348 todo = [] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
349 done = set() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
350 convert_list = {} |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
351 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
352 # get a list of all the head shas |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
353 if refs: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
354 for head, sha in refs.iteritems(): |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
355 # refs contains all the refs in the server, not just the ones |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
356 # we are pulling |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
357 if sha in self.git.object_store: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
358 todo.append(sha) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
359 else: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
360 todo = self.git.refs.values()[:] |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
361 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
362 # traverse the heads getting a list of all the unique commits |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
363 while todo: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
364 sha = todo.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
365 assert isinstance(sha, str) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
366 if sha in done: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
367 continue |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
368 done.add(sha) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
369 obj = self.git.get_object(sha) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
370 if isinstance (obj, Commit): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
371 convert_list[sha] = obj |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
372 todo.extend([p for p in obj.parents if p not in done]) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
373 if isinstance(obj, Tag): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
374 (obj_type, obj_sha) = obj.get_object() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
375 obj = self.git.get_object(obj_sha) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
376 if isinstance (obj, Commit): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
377 convert_list[sha] = obj |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
378 todo.extend([p for p in obj.parents if p not in done]) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
379 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
380 # sort the commits |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
381 commits = toposort.TopoSort(convert_list).items() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
382 |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
383 commits = [commit for commit in commits if not commit in self._map_git] |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
384 # import each of the commits, oldest first |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
385 total = len(commits) |
216
8d961ea5fc5a
Making compatible with Python 2.4
Michael J. Pedersen <mpedersen@datapipe.com>
parents:
215
diff
changeset
|
386 if total: |
8d961ea5fc5a
Making compatible with Python 2.4
Michael J. Pedersen <mpedersen@datapipe.com>
parents:
215
diff
changeset
|
387 magnitude = int(math.log(total, 10)) + 1 |
8d961ea5fc5a
Making compatible with Python 2.4
Michael J. Pedersen <mpedersen@datapipe.com>
parents:
215
diff
changeset
|
388 else: |
8d961ea5fc5a
Making compatible with Python 2.4
Michael J. Pedersen <mpedersen@datapipe.com>
parents:
215
diff
changeset
|
389 magnitude = 1 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
390 for i, csha in enumerate(commits): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
391 if i%100 == 0: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
392 self.ui.status(_("at: %*d/%d\n") % (magnitude, i, total)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
393 commit = convert_list[csha] |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
394 self.import_git_commit(commit) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
395 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
396 def import_git_commit(self, commit): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
397 self.ui.debug(_("importing: %s\n") % commit.id) |
213
61471faeb7fd
small cleanups (tabs, s/TODO :/TODO:/ and dead code)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
212
diff
changeset
|
398 # TODO: Do something less coarse-grained than try/except on the |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
399 # get_file call for removed files |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
400 |
204
4734153365ac
revert the changes made in 405a915bf352 and 8bfa8aa6b68f
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
203
diff
changeset
|
401 (strip_message, hg_renames, hg_branch, extra) = self.extract_hg_metadata(commit.message) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
402 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
403 # get a list of the changed, added, removed files |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
404 files = self.get_files_changed(commit) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
405 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
406 date = (commit.author_time, -commit.author_timezone) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
407 text = strip_message |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
408 |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
409 origtext = text |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
410 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
411 text.decode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
412 except UnicodeDecodeError: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
413 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
|
414 |
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
415 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
|
416 if text + '\n' != origtext: |
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
417 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
|
418 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
419 author = commit.author |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
420 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
421 # convert extra data back to the end |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
422 if ' ext:' in commit.author: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
423 regex = re.compile('^(.*?)\ ext:\((.*)\) <(.*)\>$') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
424 m = regex.match(commit.author) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
425 if m: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
426 name = m.group(1) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
427 ex = urllib.unquote(m.group(2)) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
428 email = m.group(3) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
429 author = name + ' <' + email + '>' + ex |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
430 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
431 if ' <none@none>' in commit.author: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
432 author = commit.author[:-12] |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
433 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
434 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
435 author.decode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
436 except UnicodeDecodeError: |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
437 origauthor = author |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
438 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
|
439 extra['author'] = create_delta(author, origauthor) |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
440 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
441 oldenc = self.swap_out_encoding() |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
442 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
443 def getfilectx(repo, memctx, f): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
444 try: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
445 (mode, sha, data) = self.get_file(commit, f) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
446 e = self.convert_git_int_mode(mode) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
447 except (TypeError, KeyError): |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
448 raise IOError() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
449 if f in hg_renames: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
450 copied_path = hg_renames[f] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
451 else: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
452 copied_path = None |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
453 return context.memfilectx(f, data, 'l' in e, 'x' in e, copied_path) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
454 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
455 gparents = map(self.map_hg_get, commit.parents) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
456 p1, p2 = (nullid, nullid) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
457 octopus = False |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
458 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
459 if len(gparents) > 1: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
460 # merge, possibly octopus |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
461 def commit_octopus(p1, p2): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
462 ctx = context.memctx(self.repo, (p1, p2), text, files, getfilectx, |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
463 author, date, {'hg-git': 'octopus'}) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
464 return hex(self.repo.commitctx(ctx)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
465 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
466 octopus = len(gparents) > 2 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
467 p2 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
468 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
469 while len(gparents) > 0: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
470 p2 = commit_octopus(p1, p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
471 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
472 else: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
473 if gparents: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
474 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
475 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
476 files = list(set(files)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
477 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
478 pa = None |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
479 if not (p2 == nullid): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
480 node1 = self.repo.changectx(p1) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
481 node2 = self.repo.changectx(p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
482 pa = node1.ancestor(node2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
483 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
484 # if named branch, add to extra |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
485 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
486 extra['branch'] = hg_branch |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
487 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
488 # 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
|
489 if commit.author != commit.committer \ |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
490 or commit.author_time != commit.commit_time \ |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
491 or commit.author_timezone != commit.commit_timezone: |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
492 extra['committer'] = "%s %d %d" % (commit.committer, commit.commit_time, -commit.commit_timezone) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
493 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
494 if commit.encoding: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
495 extra['encoding'] = commit.encoding |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
496 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
497 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
498 extra['branch'] = hg_branch |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
499 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
500 if octopus: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
501 extra['hg-git'] ='octopus-done' |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
502 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
503 ctx = context.memctx(self.repo, (p1, p2), text, files, getfilectx, |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
504 author, date, extra) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
505 |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
506 node = self.repo.commitctx(ctx) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
507 |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
508 self.swap_out_encoding(oldenc) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
509 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
510 # save changeset to mapping file |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
511 cs = hex(node) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
512 self.map_set(commit.id, cs) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
513 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
514 ## 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
|
515 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
516 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
|
517 client, path = self.get_transport_and_path(remote) |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
518 def changed(refs): |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
519 to_push = revs or set(self.local_heads().values() + self.tags.values()) |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
520 if not to_push and refs.keys()[0] == 'capabilities^{}': |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
521 to_push = [self.repo.lookup('tip')] |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
522 return self.get_changed_refs(refs, to_push, force) |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
523 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
524 genpack = self.git.object_store.generate_pack_contents |
26
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
525 try: |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
526 self.ui.status(_("creating and sending data\n")) |
47
3b62270c1fad
writing some status output after a push, updating local bookmarks
Scott Chacon <schacon@gmail.com>
parents:
42
diff
changeset
|
527 changed_refs = client.send_pack(path, changed, genpack) |
207
c06ac5b982a9
add a test for pushing to git
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
204
diff
changeset
|
528 return changed_refs |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
529 except HangupException: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
530 raise hgutil.Abort("the remote end hung up unexpectedly") |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
531 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
532 def get_changed_refs(self, refs, revs, force): |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
533 new_refs = refs.copy() |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
534 for rev in revs: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
535 ctx = self.repo[rev] |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
536 heads = [t for t in ctx.tags() if t in self.local_heads()] |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
537 tags = [t for t in ctx.tags() if t in self.tags] |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
538 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
539 if not (heads or tags): |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
540 raise hgutil.Abort("revision %s cannot be pushed since" |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
541 " it doesn't have a ref" % ctx) |
149 | 542 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
543 for r in heads + tags: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
544 if r in heads: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
545 ref = 'refs/heads/'+r |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
546 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
547 ref = 'refs/tags/'+r |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
548 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
549 if ref not in refs: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
550 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
|
551 elif new_refs[ref] in self._map_git: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
552 rctx = self.repo[self.map_hg_get(new_refs[ref])] |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
553 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
|
554 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
|
555 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
556 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
|
557 % (ref, ctx)) |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
558 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
559 raise hgutil.Abort("%s changed on the server, please pull " |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
560 "and merge before pushing" % ref) |
126 | 561 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
562 return new_refs |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
563 |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
564 |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
565 def fetch_pack(self, remote_name, heads): |
182
9bdd8e76bbab
Remove remotes support (use the paths section in hgrc instead)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
181
diff
changeset
|
566 client, path = self.get_transport_and_path(remote_name) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
567 graphwalker = self.git.get_graph_walker() |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
568 def determine_wants(refs): |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
569 if heads: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
570 want = [] |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
571 for h in heads: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
572 r = [ref for ref in refs if ref.endswith('/'+h)] |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
573 if not r: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
574 raise hgutil.Abort("ref %s not found on remote server") |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
575 elif len(r) == 1: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
576 want.append(refs[r[0]]) |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
577 else: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
578 raise hgutil.Abort("ambiguous reference %s: %r"%(h, r)) |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
579 else: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
580 want = [sha for ref, sha in refs.iteritems() |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
581 if not ref.endswith('^{}')] |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
582 return want |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
583 f, commit = self.git.object_store.add_pack() |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
584 try: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
585 return client.fetch_pack(path, determine_wants, graphwalker, f.write, self.ui.status) |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
586 except HangupException: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
587 raise hgutil.Abort("the remote end hung up unexpectedly") |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
588 finally: |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
589 commit() |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
590 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
591 ## REFERENCES HANDLING |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
592 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
593 def update_references(self): |
195
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
594 heads = self.local_heads() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
595 |
195
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
596 # 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
|
597 # Mercurial bookmark. |
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
598 for key in heads: |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
599 self.git.refs['refs/heads/' + key] = self.map_git_get(heads[key]) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
600 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
601 def export_hg_tags(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
602 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
|
603 if self.repo.tagtype(tag) in ('global', 'git'): |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
604 self.git.refs['refs/tags/' + tag] = self.map_git_get(hex(sha)) |
212
174954c187e0
fix pushing tags to git (see issue 3 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
210
diff
changeset
|
605 self.tags[tag] = hex(sha) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
606 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
607 def local_heads(self): |
194
a5c53e94d92b
Do not depend on the cache git repository for reference pushing
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
190
diff
changeset
|
608 try: |
a5c53e94d92b
Do not depend on the cache git repository for reference pushing
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
190
diff
changeset
|
609 bms = bookmarks.parse(self.repo) |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
610 return dict([(bm, hex(bms[bm])) for bm in bms]) |
215
b5d4d1552765
add some annotations for test coverage
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
213
diff
changeset
|
611 except AttributeError: #pragma: no cover |
194
a5c53e94d92b
Do not depend on the cache git repository for reference pushing
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
190
diff
changeset
|
612 return {} |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
613 |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
614 def import_tags(self, refs): |
149 | 615 keys = refs.keys() |
616 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
|
617 return |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
618 for k in keys[:]: |
149 | 619 ref_name = k |
620 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
|
621 if parts[0] == 'refs' and parts[1] == 'tags': |
149 | 622 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
|
623 # 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
|
624 # the ones we are pulling |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
625 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
|
626 continue |
149 | 627 if ref_name[-3:] == '^{}': |
628 ref_name = ref_name[:-3] | |
629 if not ref_name in self.repo.tags(): | |
630 obj = self.git.get_object(refs[k]) | |
631 sha = None | |
632 if isinstance (obj, Commit): # lightweight | |
633 sha = self.map_hg_get(refs[k]) | |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
634 self.tags[ref_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
|
635 elif isinstance (obj, Tag): # annotated |
149 | 636 (obj_type, obj_sha) = obj.get_object() |
637 obj = self.git.get_object(obj_sha) | |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
638 if isinstance (obj, Commit): |
149 | 639 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
|
640 # TODO: better handling for annotated tags |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
641 self.tags[ref_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
|
642 self.save_tags() |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
643 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
644 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
|
645 try: |
47
3b62270c1fad
writing some status output after a push, updating local bookmarks
Scott Chacon <schacon@gmail.com>
parents:
42
diff
changeset
|
646 bms = bookmarks.parse(self.repo) |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
647 heads = dict([(ref[11:],refs[ref]) for ref in refs |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
648 if ref.startswith('refs/heads/')]) |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
649 |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
650 for head, sha in heads.iteritems(): |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
651 # 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
|
652 # the ones we are pulling |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
653 if sha not in self.git.object_store: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
654 continue |
188
5d48a2310e16
Use mercurial.node.bin instead of dulwich.objects.hex_to_sha
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
187
diff
changeset
|
655 hgsha = bin(self.map_hg_get(sha)) |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
656 if not head in bms: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
657 # new branch |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
658 bms[head] = hgsha |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
659 else: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
660 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
|
661 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
|
662 # fast forward |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
663 bms[head] = hgsha |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
664 if heads: |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
665 bookmarks.write(self.repo, bms) |
161
134915637cf7
Merge branch 'octo' with octo merge code
Scott Chacon <schacon@gmail.com>
diff
changeset
|
666 |
29
2a5c0bf0fef5
Another way of fixing no-bookmark issue, along with updated test.
Augie Fackler <durin42@gmail.com>
parents:
28
diff
changeset
|
667 except AttributeError: |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
668 self.ui.warn(_('creating bookmarks failed, do you have' |
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
669 ' 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
|
670 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
671 def update_remote_branches(self, remote_name, refs): |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
672 heads = dict([(ref[11:],refs[ref]) for ref in refs |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
673 if ref.startswith('refs/heads/')]) |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
674 |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
675 for head, sha in heads.iteritems(): |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
676 # refs contains all the refs in the server, not just the ones |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
677 # we are pulling |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
678 if sha not in self.git.object_store: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
679 continue |
188
5d48a2310e16
Use mercurial.node.bin instead of dulwich.objects.hex_to_sha
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
187
diff
changeset
|
680 hgsha = bin(self.map_hg_get(sha)) |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
681 tag = '%s/%s' % (remote_name, head) |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
682 self.repo.tag(tag, hgsha, '', True, None, None) |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
683 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
684 for ref_name in refs: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
685 if ref_name.startswith('refs/heads'): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
686 new_ref = 'refs/remotes/%s/%s' % (remote_name, ref_name[10:]) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
687 self.git.refs[new_ref] = refs[ref_name] |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
688 elif ref_name.startswith('refs/tags'): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
689 self.git.refs[ref_name] = refs[ref_name] |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
690 |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
691 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
692 ## UTILITY FUNCTIONS |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
693 |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
694 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
|
695 # TODO: make these into constants |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
696 convert = { |
121
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
697 0100644: '', |
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
698 0100755: 'x', |
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
699 0120000: 'l'} |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
700 if mode in convert: |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
701 return convert[mode] |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
702 return '' |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
703 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
704 def extract_hg_metadata(self, message): |
227
c4f6e6f24bf1
fix bug introduced by previous commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
226
diff
changeset
|
705 split = message.split("\n--HG--\n", 1) |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
706 renames = {} |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
707 extra = {} |
79
7b4cf18c896b
readded yet another piece of code that disappeared at some point, recovering branches properly
Scott Chacon <schacon@gmail.com>
parents:
78
diff
changeset
|
708 branch = False |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
709 if len(split) == 2: |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
710 message, meta = split |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
711 lines = meta.split("\n") |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
712 for line in lines: |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
713 if line == '': |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
714 continue |
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
715 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
716 command, data = line.split(" : ", 1) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
717 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
718 if command == 'rename': |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
719 before, after = data.split(" => ", 1) |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
720 renames[after] = before |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
721 if command == 'branch': |
79
7b4cf18c896b
readded yet another piece of code that disappeared at some point, recovering branches properly
Scott Chacon <schacon@gmail.com>
parents:
78
diff
changeset
|
722 branch = data |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
723 if command == 'extra': |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
724 before, after = data.split(" : ", 1) |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
725 extra[before] = urllib.unquote(after) |
204
4734153365ac
revert the changes made in 405a915bf352 and 8bfa8aa6b68f
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
203
diff
changeset
|
726 return (message, renames, branch, extra) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
727 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
728 def get_file(self, commit, f): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
729 otree = self.git.tree(commit.tree) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
730 parts = f.split('/') |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
731 for part in parts: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
732 (mode, sha) = otree[part] |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
733 obj = self.git.get_object(sha) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
734 if isinstance (obj, Blob): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
735 return (mode, sha, obj._text) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
736 elif isinstance(obj, Tree): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
737 otree = obj |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
738 |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
739 def get_files_changed(self, commit): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
740 def filenames(basetree, comptree, prefix): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
741 basefiles = set() |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
742 changes = list() |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
743 csha = None |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
744 cmode = None |
229
f2c2061aacd1
work around a bug in dulwich 0.3.3
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
228
diff
changeset
|
745 if basetree is not None: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
746 for (bmode, bname, bsha) in basetree.entries(): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
747 if bmode == 0160000: # TODO: properly handle submodules |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
748 continue |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
749 basefiles.add(bname) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
750 bobj = self.git.get_object(bsha) |
229
f2c2061aacd1
work around a bug in dulwich 0.3.3
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
228
diff
changeset
|
751 if comptree is not None: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
752 if bname in comptree: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
753 (cmode, csha) = comptree[bname] |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
754 else: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
755 (cmode, csha) = (None, None) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
756 if not ((csha == bsha) and (cmode == bmode)): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
757 if isinstance (bobj, Blob): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
758 changes.append (prefix + bname) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
759 elif isinstance(bobj, Tree): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
760 ctree = None |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
761 if csha: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
762 ctree = self.git.get_object(csha) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
763 changes.extend(filenames(bobj, |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
764 ctree, |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
765 prefix + bname + '/')) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
766 |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
767 # handle removals |
229
f2c2061aacd1
work around a bug in dulwich 0.3.3
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
228
diff
changeset
|
768 if comptree is not None: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
769 for (bmode, bname, bsha) in comptree.entries(): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
770 if bmode == 0160000: # TODO: handle submodles |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
771 continue |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
772 if bname not in basefiles: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
773 bobj = self.git.get_object(bsha) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
774 if isinstance(bobj, Blob): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
775 changes.append(prefix + bname) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
776 elif isinstance(bobj, Tree): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
777 changes.extend(filenames(None, bobj, |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
778 prefix + bname + '/')) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
779 return changes |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
780 |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
781 all_changes = list() |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
782 otree = self.git.tree(commit.tree) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
783 if len(commit.parents) == 0: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
784 all_changes = filenames(otree, None, '') |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
785 for parent in commit.parents: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
786 pcommit = self.git.commit(parent) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
787 ptree = self.git.tree(pcommit.tree) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
788 all_changes.extend(filenames(otree, ptree, '')) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
789 |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
790 return all_changes |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
791 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
792 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
|
793 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
|
794 if names: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
795 return names[0] |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
796 |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
797 # Stolen from hgsubversion |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
798 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
|
799 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
800 from mercurial import encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
801 old = encoding.encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
802 encoding.encoding = new_encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
803 except ImportError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
804 old = hgutil._encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
805 hgutil._encoding = new_encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
806 return old |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
807 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
808 def decode_guess(self, string, encoding): |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
809 # 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
|
810 if encoding: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
811 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
812 return string.decode(encoding).encode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
813 except UnicodeDecodeError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
814 pass |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
815 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
816 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
817 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
|
818 except UnicodeDecodeError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
819 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
|
820 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
821 def get_transport_and_path(self, uri): |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
822 from dulwich.client import TCPGitClient, SSHGitClient, SubprocessGitClient |
35
562fc51b991e
we did the same thing, not sure why it conflicted
Scott Chacon <schacon@gmail.com>
parents:
29
diff
changeset
|
823 for handler, transport in (("git://", TCPGitClient), ("git@", SSHGitClient), ("git+ssh://", SSHGitClient)): |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
824 if uri.startswith(handler): |
215
b5d4d1552765
add some annotations for test coverage
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
213
diff
changeset
|
825 host, path = uri[len(handler):].split("/", 1) |
233
57f860801ab0
disable thin packs as they aren't handled correctly
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
232
diff
changeset
|
826 return transport(host, thin_packs=False), '/' + path |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
827 # if its not git or git+ssh, try a local url.. |
233
57f860801ab0
disable thin packs as they aren't handled correctly
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
232
diff
changeset
|
828 return SubprocessGitClient(thin_packs=False), uri |