Mercurial > hg > hg-git
annotate hggit/git_handler.py @ 316:7e5ed21ceec1
git_handler: prefer () continuation to \ continuation.
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Mon, 05 Apr 2010 19:06:20 -0500 |
parents | aba4284f41ec |
children | 8875c8946ca0 |
rev | line source |
---|---|
267
7814c26758a2
remove unused imports
Antonin Amand <antonin.amand@gmail.com>
parents:
266
diff
changeset
|
1 import os, math, urllib, re |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
2 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
3 from dulwich.errors import HangupException |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
4 from dulwich.index import commit_tree |
237
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
5 from dulwich.objects import Blob, Commit, Tag, Tree, parse_timezone |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
6 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
|
7 from dulwich.repo import Repo |
285
5e5aee9b32d4
git_handler: slight style cleanup
Augie Fackler <durin42@gmail.com>
parents:
284
diff
changeset
|
8 from dulwich import client |
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 |
300
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
14 from mercurial import error |
222
e414c72d3ec9
fix compatibility with mercurial 1.1
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
221
diff
changeset
|
15 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
16 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
17 class GitHandler(object): |
298
6ad6945b6629
pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents:
293
diff
changeset
|
18 mapfile = 'git-mapfile' |
6ad6945b6629
pull: make it possible to un-wedge the repo after stripping git revs
Augie Fackler <durin42@gmail.com>
parents:
293
diff
changeset
|
19 tagsfile = 'git-tags' |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
20 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
21 def __init__(self, dest_repo, ui): |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
22 self.repo = dest_repo |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
23 self.ui = ui |
133
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
24 |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
25 if ui.config('git', 'intree'): |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
26 self.gitdir = self.repo.wjoin('.git') |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
27 else: |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
28 self.gitdir = self.repo.join('git') |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
29 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
30 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
|
31 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
32 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
|
33 self.load_tags() |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
34 |
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
35 # make the git data directory |
16
58cd05129119
moved init into git_handler
Scott Chacon <schacon@gmail.com>
parents:
14
diff
changeset
|
36 def init_if_missing(self): |
258
1590c97d7af0
do not init the cache git repo unless needed (fixes issue 16 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
248
diff
changeset
|
37 if os.path.exists(self.gitdir): |
1590c97d7af0
do not init the cache git repo unless needed (fixes issue 16 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
248
diff
changeset
|
38 self.git = Repo(self.gitdir) |
1590c97d7af0
do not init the cache git repo unless needed (fixes issue 16 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
248
diff
changeset
|
39 else: |
106
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
40 os.mkdir(self.gitdir) |
258
1590c97d7af0
do not init the cache git repo unless needed (fixes issue 16 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
248
diff
changeset
|
41 self.git = Repo.init_bare(self.gitdir) |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
42 |
14
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
43 ## FILE LOAD AND SAVE METHODS |
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
44 |
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
|
45 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
|
46 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
|
47 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
|
48 |
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
|
49 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
|
50 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
|
51 |
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_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
|
53 return self._map_hg.get(hgsha) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
54 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
55 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
|
56 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
|
57 self._map_hg = {} |
105
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
58 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
|
59 for line in self.repo.opener(self.mapfile): |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
60 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
|
61 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
|
62 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
|
63 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
64 def save_map(self): |
105
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
65 file = self.repo.opener(self.mapfile, 'w+', atomictemp=True) |
238
028de6256c2b
switch object mapping to hg->git since the many to one is that direction
Sverre Rabbelier <srabbelier@google.com>
parents:
237
diff
changeset
|
66 for hgsha, gitsha in sorted(self._map_hg.iteritems()): |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
67 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
|
68 file.rename() |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
69 |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
70 |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
71 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
|
72 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
|
73 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
|
74 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
|
75 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
|
76 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
|
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 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
|
79 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
|
80 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
|
81 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
|
82 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
|
83 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
|
84 |
14
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
85 ## END FILE LOAD AND SAVE METHODS |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
86 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
87 ## COMMANDS METHODS |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
88 |
137
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
89 def import_commits(self, remote_name): |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
90 self.import_git_objects(remote_name) |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
91 self.save_map() |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
92 |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
93 def fetch(self, remote, heads): |
236
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
94 self.export_commits() |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
95 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
|
96 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
|
97 |
56 | 98 if refs: |
149 | 99 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
|
100 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
|
101 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
|
102 if remote_name: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
103 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
|
104 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
|
105 # intial cloning |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
106 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
|
107 else: |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
108 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
|
109 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
110 self.save_map() |
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
111 |
236
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
112 def export_commits(self): |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
113 try: |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
114 self.export_git_objects() |
236
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
115 self.export_hg_tags() |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
116 self.update_references() |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
117 finally: |
42ae65e6c1d1
save the map only once in export
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
235
diff
changeset
|
118 self.save_map() |
97 | 119 |
231
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
120 def get_refs(self, remote): |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
121 self.export_commits() |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
122 client, path = self.get_transport_and_path(remote) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
123 old_refs = {} |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
124 new_refs = {} |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
125 def changed(refs): |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
126 old_refs.update(refs) |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
127 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
|
128 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
|
129 # don't push anything |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
130 return {} |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
131 |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
132 try: |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
133 client.send_pack(path, changed, None) |
243
53b731d2a3e2
outgoing: don't crash when there are unpulled changesets
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
242
diff
changeset
|
134 |
53b731d2a3e2
outgoing: don't crash when there are unpulled changesets
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
242
diff
changeset
|
135 changed_refs = [ref for ref, sha in new_refs.iteritems() |
53b731d2a3e2
outgoing: don't crash when there are unpulled changesets
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
242
diff
changeset
|
136 if sha != old_refs.get(ref)] |
53b731d2a3e2
outgoing: don't crash when there are unpulled changesets
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
242
diff
changeset
|
137 new = [bin(self.map_hg_get(new_refs[ref])) for ref in changed_refs] |
53b731d2a3e2
outgoing: don't crash when there are unpulled changesets
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
242
diff
changeset
|
138 old = dict( (bin(self.map_hg_get(old_refs[r])), 1) |
245
c6d268886405
fix crash in outgoing if there are new (git) branches
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
243
diff
changeset
|
139 for r in changed_refs if r in old_refs) |
231
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
140 |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
141 return old, new |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
142 except HangupException: |
bdaec2a079ce
initial support for 'hg outgoing'
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
230
diff
changeset
|
143 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
|
144 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
145 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
|
146 self.export_commits() |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
147 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
|
148 remote_name = self.remote_name(remote) |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
149 |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
150 if remote_name and changed_refs: |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
151 for ref, sha in changed_refs.iteritems(): |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
152 self.ui.status(" %s::%s => GIT:%s\n" % |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
153 (remote_name, ref, sha[0:8])) |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
154 |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
155 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
|
156 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
157 def clear(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
158 mapfile = self.repo.join(self.mapfile) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
159 if os.path.exists(self.gitdir): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
160 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
|
161 for name in files: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
162 os.remove(os.path.join(root, name)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
163 for name in dirs: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
164 os.rmdir(os.path.join(root, name)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
165 os.rmdir(self.gitdir) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
166 if os.path.exists(mapfile): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
167 os.remove(mapfile) |
124
9dafb9ac24ff
hg bookmarks to local git branches
Ian Dees <undees@gmail.com>
parents:
118
diff
changeset
|
168 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
169 ## CHANGESET CONVERSION METHODS |
125 | 170 |
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
|
171 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
|
172 self.ui.status(_("importing Hg objects into Git\n")) |
258
1590c97d7af0
do not init the cache git repo unless needed (fixes issue 16 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
248
diff
changeset
|
173 self.init_if_missing() |
1590c97d7af0
do not init the cache git repo unless needed (fixes issue 16 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
248
diff
changeset
|
174 |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
175 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
|
176 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
|
177 total = len(export) |
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
178 for i, rev in enumerate(export): |
286
0661d5721ad7
git_handler: use progress API instead of reinventing the wheel
Augie Fackler <durin42@gmail.com>
parents:
285
diff
changeset
|
179 self.ui.progress('import', i, total=total) |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
180 ctx = self.repo.changectx(rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
181 state = ctx.extra().get('hg-git', None) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
182 if state == 'octopus': |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
183 self.ui.debug("revision %d is a part " |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
184 "of octopus explosion\n" % ctx.rev()) |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
185 continue |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
186 self.export_hg_commit(rev) |
286
0661d5721ad7
git_handler: use progress API instead of reinventing the wheel
Augie Fackler <durin42@gmail.com>
parents:
285
diff
changeset
|
187 self.ui.progress('import', None, total=total) |
0661d5721ad7
git_handler: use progress API instead of reinventing the wheel
Augie Fackler <durin42@gmail.com>
parents:
285
diff
changeset
|
188 |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
189 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
190 # 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
|
191 # 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
|
192 # 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
|
193 def export_hg_commit(self, rev): |
301
09116995c421
export_hg_commit: fix debug note
Tay Ray Chuan <rctay89@gmail.com>
parents:
288
diff
changeset
|
194 self.ui.note(_("converting revision %s\n") % hex(rev)) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
195 |
203
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
196 oldenc = self.swap_out_encoding() |
104a4fd6a0af
trying to fix some of the broken tests
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
199
diff
changeset
|
197 |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
198 ctx = self.repo.changectx(rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
199 extra = ctx.extra() |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
200 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
201 commit = Commit() |
68
d28d3763eda3
Deal with hg authors missing email attributes.
Chris Wanstrath <chris@ozmm.org>
parents:
65
diff
changeset
|
202 |
235
912d6a5837c8
reorganize export_hg_commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
234
diff
changeset
|
203 (time, timezone) = ctx.date() |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
204 commit.author = self.get_git_author(ctx) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
205 commit.author_time = int(time) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
206 commit.author_timezone = -timezone |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
207 |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
208 if 'committer' in extra: |
131
dd6c77ec206c
store commitdate in mercurial's internal format.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
129
diff
changeset
|
209 # fixup timezone |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
210 (name, timestamp, timezone) = extra['committer'].rsplit(' ', 2) |
237
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
211 commit.committer = name |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
212 commit.commit_time = timestamp |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
213 |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
214 # work around a timezone format change |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
215 if int(timezone) % 60 != 0: #pragma: no cover |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
216 timezone = parse_timezone(timezone) |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
217 else: |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
218 timezone = -int(timezone) |
16f671995881
deal correctly with old timezone format in extra committer
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
236
diff
changeset
|
219 commit.commit_timezone = timezone |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
220 else: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
221 commit.committer = commit.author |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
222 commit.commit_time = commit.author_time |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
223 commit.commit_timezone = commit.author_timezone |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
224 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
225 commit.parents = [] |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
226 for parent in self.get_git_parents(ctx): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
227 hgsha = hex(parent.node()) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
228 git_sha = self.map_git_get(hgsha) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
229 if git_sha: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
230 commit.parents.append(git_sha) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
231 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
232 commit.message = self.get_git_message(ctx) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
233 |
118
b3be536e3f50
handles git commit encoding fields now
Scott Chacon <schacon@gmail.com>
parents:
113
diff
changeset
|
234 if 'encoding' in extra: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
235 commit.encoding = extra['encoding'] |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
236 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
237 tree_sha = commit_tree(self.git.object_store, self.iterblobs(ctx)) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
238 commit.tree = tree_sha |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
239 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
240 self.git.object_store.add_object(commit) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
241 self.map_set(commit.id, ctx.hex()) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
242 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
243 self.swap_out_encoding(oldenc) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
244 return commit.id |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
245 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
246 def get_git_author(self, ctx): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
247 # hg authors might not have emails |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
248 author = ctx.user() |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
249 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
250 # check for git author pattern compliance |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
251 regex = re.compile('^(.*?) \<(.*?)\>(.*)$') |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
252 a = regex.match(author) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
253 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
254 if a: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
255 name = a.group(1) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
256 email = a.group(2) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
257 if len(a.group(3)) > 0: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
258 name += ' ext:(' + urllib.quote(a.group(3)) + ')' |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
259 author = name + ' <' + email + '>' |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
260 else: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
261 author = author + ' <none@none>' |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
262 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
263 if 'author' in ctx.extra(): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
264 author = apply_delta(author, ctx.extra()['author']) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
265 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
266 return author |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
267 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
268 def get_git_parents(self, ctx): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
269 def is_octopus_part(ctx): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
270 return ctx.extra().get('hg-git', None) in ('octopus', 'octopus-done') |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
271 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
272 parents = [] |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
273 if ctx.extra().get('hg-git', None) == 'octopus-done': |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
274 # implode octopus parents |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
275 part = ctx |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
276 while is_octopus_part(part): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
277 (p1, p2) = part.parents() |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
278 assert not is_octopus_part(p1) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
279 parents.append(p1) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
280 part = p2 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
281 parents.append(p2) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
282 else: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
283 parents = ctx.parents() |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
284 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
285 return parents |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
286 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
287 def get_git_message(self, ctx): |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
288 extra = ctx.extra() |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
289 |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
290 message = ctx.description() + "\n" |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
291 if 'message' in extra: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
292 message = apply_delta(message, extra['message']) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
293 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
294 # 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
|
295 add_extras = False |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
296 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
|
297 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
|
298 add_extras = True |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
299 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
|
300 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
301 renames = [] |
247
3c01e07b0252
look for renamed files only in files modified by the commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
245
diff
changeset
|
302 for f in ctx.files(): |
3c01e07b0252
look for renamed files only in files modified by the commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
245
diff
changeset
|
303 if f not in ctx.manifest(): |
3c01e07b0252
look for renamed files only in files modified by the commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
245
diff
changeset
|
304 continue |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
305 rename = ctx.filectx(f).renamed() |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
306 if rename: |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
307 renames.append((rename[0], f)) |
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
308 |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
309 if renames: |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
310 add_extras = True |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
311 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
|
312 extra_message += "rename : " + oldfile + " => " + newfile + "\n" |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
313 |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
314 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
|
315 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
|
316 continue |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
317 else: |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
318 add_extras = True |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
319 extra_message += "extra : " + key + " : " + urllib.quote(value) + "\n" |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
320 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
321 if add_extras: |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
322 message += "\n--HG--\n" + extra_message |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
323 |
239
c5e5e7849803
split out get_git_author, get_git_parents and get_git_message
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
238
diff
changeset
|
324 return message |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
325 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
326 def iterblobs(self, ctx): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
327 for f in ctx: |
234
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
328 fctx = ctx[f] |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
329 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
|
330 |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
331 if not blobid: |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
332 blob = Blob.from_string(fctx.data()) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
333 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
|
334 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
|
335 blobid = blob.id |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
336 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
337 if 'l' in ctx.flags(f): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
338 mode = 0120000 |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
339 elif 'x' in ctx.flags(f): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
340 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
|
341 else: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
342 mode = 0100644 |
234
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
343 |
6f34aee64a3f
readd blob caching (~25% improvement in gexport)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
233
diff
changeset
|
344 yield f, blobid, mode |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
345 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
346 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
|
347 self.ui.status(_("importing Git objects into Hg\n")) |
258
1590c97d7af0
do not init the cache git repo unless needed (fixes issue 16 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
248
diff
changeset
|
348 self.init_if_missing() |
1590c97d7af0
do not init the cache git repo unless needed (fixes issue 16 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
248
diff
changeset
|
349 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
350 # import heads and fetched tags as remote references |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
351 todo = [] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
352 done = set() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
353 convert_list = {} |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
354 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
355 # get a list of all the head shas |
282
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
356 seenheads = set() |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
357 if refs is None: |
288
efe9e6a9235f
fix gimport and add test for using to work on hg repos from git (issue 73)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
287
diff
changeset
|
358 refs = self.git.refs.as_dict() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
359 if refs: |
282
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
360 for sha in refs.itervalues(): |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
361 # refs contains all the refs in the server, not just the ones |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
362 # we are pulling |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
363 if sha in self.git.object_store: |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
364 obj = self.git.get_object(sha) |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
365 while isinstance(obj, Tag): |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
366 obj_type, sha = obj.get_object() |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
367 obj = self.git.get_object(sha) |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
368 if isinstance (obj, Commit) and sha not in seenheads: |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
369 seenheads.add(sha) |
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
370 todo.append(sha) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
371 |
284
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
372 # sort by commit date |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
373 def commitdate(sha): |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
374 obj = self.git.get_object(sha) |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
375 return obj.commit_time-obj.commit_timezone |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
376 |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
377 todo.sort(key=commitdate, reverse=True) |
12cfa77a2ab0
sort heads by commit date in topological sort
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
283
diff
changeset
|
378 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
379 # traverse the heads getting a list of all the unique commits |
283
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
380 commits = [] |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
381 seen = set(todo) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
382 while todo: |
283
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
383 sha = todo[-1] |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
384 if sha in done: |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
385 todo.pop() |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
386 continue |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
387 assert isinstance(sha, str) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
388 obj = self.git.get_object(sha) |
282
8655c071a15d
make sure no tag object are included in the DAG we build
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
276
diff
changeset
|
389 assert isinstance(obj, Commit) |
283
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
390 for p in obj.parents: |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
391 if p not in done: |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
392 todo.append(p) |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
393 break |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
394 else: |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
395 commits.append(sha) |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
396 convert_list[sha] = obj |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
397 done.add(sha) |
90458271e374
use a simple toposort algorithm for DAG (post order from a DFS from the heads)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
282
diff
changeset
|
398 todo.pop() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
399 |
190
6fbdf1afe032
Better reporting of the number of commits to convert
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
188
diff
changeset
|
400 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
|
401 # import each of the commits, oldest first |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
402 total = len(commits) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
403 for i, csha in enumerate(commits): |
286
0661d5721ad7
git_handler: use progress API instead of reinventing the wheel
Augie Fackler <durin42@gmail.com>
parents:
285
diff
changeset
|
404 self.ui.progress('import', i, total=total, unit='commits') |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
405 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
|
406 self.import_git_commit(commit) |
286
0661d5721ad7
git_handler: use progress API instead of reinventing the wheel
Augie Fackler <durin42@gmail.com>
parents:
285
diff
changeset
|
407 self.ui.progress('import', None, total=total, unit='commits') |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
408 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
409 def import_git_commit(self, commit): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
410 self.ui.debug(_("importing: %s\n") % commit.id) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
411 |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
412 (strip_message, hg_renames, |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
413 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
|
414 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
415 # 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
|
416 files = self.get_files_changed(commit) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
417 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
418 date = (commit.author_time, -commit.author_timezone) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
419 text = strip_message |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
420 |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
421 origtext = text |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
422 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
423 text.decode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
424 except UnicodeDecodeError: |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
425 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
|
426 |
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
427 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
|
428 if text + '\n' != origtext: |
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
429 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
|
430 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
431 author = commit.author |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
432 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
433 # convert extra data back to the end |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
434 if ' ext:' in commit.author: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
435 regex = re.compile('^(.*?)\ ext:\((.*)\) <(.*)\>$') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
436 m = regex.match(commit.author) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
437 if m: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
438 name = m.group(1) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
439 ex = urllib.unquote(m.group(2)) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
440 email = m.group(3) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
441 author = name + ' <' + email + '>' + ex |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
442 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
443 if ' <none@none>' in commit.author: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
444 author = commit.author[:-12] |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
445 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
446 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
447 author.decode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
448 except UnicodeDecodeError: |
225
cde57730faa7
store non utf-8 encoded author/commit message as deltas
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
224
diff
changeset
|
449 origauthor = author |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
450 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
|
451 extra['author'] = create_delta(author, origauthor) |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
452 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
453 oldenc = self.swap_out_encoding() |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
454 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
455 def getfilectx(repo, memctx, f): |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
456 delete, mode, sha = files[f] |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
457 if delete: |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
458 raise IOError |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
459 |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
460 data = self.git[sha].data |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
461 copied_path = hg_renames.get(f) |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
462 e = self.convert_git_int_mode(mode) |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
463 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
464 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
|
465 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
466 gparents = map(self.map_hg_get, commit.parents) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
467 p1, p2 = (nullid, nullid) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
468 octopus = False |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
469 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
470 if len(gparents) > 1: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
471 # merge, possibly octopus |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
472 def commit_octopus(p1, p2): |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
473 ctx = context.memctx(self.repo, (p1, p2), text, list(files), getfilectx, |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
474 author, date, {'hg-git': 'octopus'}) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
475 return hex(self.repo.commitctx(ctx)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
476 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
477 octopus = len(gparents) > 2 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
478 p2 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
479 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
480 while len(gparents) > 0: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
481 p2 = commit_octopus(p1, p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
482 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
483 else: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
484 if gparents: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
485 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
486 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
487 pa = None |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
488 if not (p2 == nullid): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
489 node1 = self.repo.changectx(p1) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
490 node2 = self.repo.changectx(p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
491 pa = node1.ancestor(node2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
492 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
493 # if named branch, add to extra |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
494 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
495 extra['branch'] = hg_branch |
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 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
|
498 if commit.author != commit.committer \ |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
499 or commit.author_time != commit.commit_time \ |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
500 or commit.author_timezone != commit.commit_timezone: |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
501 extra['committer'] = "%s %d %d" % ( |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
502 commit.committer, commit.commit_time, -commit.commit_timezone) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
503 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
504 if commit.encoding: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
505 extra['encoding'] = commit.encoding |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
506 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
507 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
508 extra['branch'] = hg_branch |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
509 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
510 if octopus: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
511 extra['hg-git'] ='octopus-done' |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
512 |
300
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
513 # TODO use 'n in self.repo' when we require hg 1.5 |
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
514 def repo_contains(n): |
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
515 try: |
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
516 return bool(self.repo.lookup(n)) |
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
517 except error.RepoLookupError: |
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
518 return False |
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
519 |
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
520 if not (repo_contains(p1) and repo_contains(p2)): |
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
521 raise hgutil.Abort(_('you appear to have run strip - ' |
eec31dee258e
Various hg 1.4 compat fixes.
Augie Fackler <durin42@gmail.com>
parents:
298
diff
changeset
|
522 'please run hg git-cleanup')) |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
523 ctx = context.memctx(self.repo, (p1, p2), text, list(files), getfilectx, |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
524 author, date, extra) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
525 |
226
3b8804c59b63
drop untested commit_import_ctx (use commitctx instead).
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
225
diff
changeset
|
526 node = self.repo.commitctx(ctx) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
527 |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
528 self.swap_out_encoding(oldenc) |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
529 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
530 # save changeset to mapping file |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
531 cs = hex(node) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
532 self.map_set(commit.id, cs) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
533 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
534 ## 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
|
535 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
536 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
|
537 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
|
538 def changed(refs): |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
539 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
|
540 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
|
541 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
542 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
|
543 try: |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
544 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
|
545 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
|
546 return changed_refs |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
547 except HangupException: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
548 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
|
549 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
550 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
|
551 new_refs = refs.copy() |
242
0ac974306e08
push the tip to master if remote repository is empty (closes issue 11 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
239
diff
changeset
|
552 |
0ac974306e08
push the tip to master if remote repository is empty (closes issue 11 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
239
diff
changeset
|
553 #The remote repo is empty and the local one doesn't have bookmarks/tags |
248
bfe6fd2fdb9b
push tip to master in an empty repository even if there are tags
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
247
diff
changeset
|
554 if refs.keys()[0] == 'capabilities^{}': |
242
0ac974306e08
push the tip to master if remote repository is empty (closes issue 11 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
239
diff
changeset
|
555 del new_refs['capabilities^{}'] |
248
bfe6fd2fdb9b
push tip to master in an empty repository even if there are tags
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
247
diff
changeset
|
556 if not self.local_heads(): |
bfe6fd2fdb9b
push tip to master in an empty repository even if there are tags
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
247
diff
changeset
|
557 tip = hex(self.repo.lookup('tip')) |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
558 bookmarks.bookmark(self.ui, self.repo, 'master', tip, force=True) |
248
bfe6fd2fdb9b
push tip to master in an empty repository even if there are tags
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
247
diff
changeset
|
559 bookmarks.setcurrent(self.repo, 'master') |
bfe6fd2fdb9b
push tip to master in an empty repository even if there are tags
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
247
diff
changeset
|
560 new_refs['refs/heads/master'] = self.map_git_get(tip) |
242
0ac974306e08
push the tip to master if remote repository is empty (closes issue 11 bb)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
239
diff
changeset
|
561 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
562 for rev in revs: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
563 ctx = self.repo[rev] |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
564 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
|
565 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
|
566 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
567 if not (heads or tags): |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
568 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
|
569 " it doesn't have a ref" % ctx) |
149 | 570 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
571 for r in heads + tags: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
572 if r in heads: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
573 ref = 'refs/heads/'+r |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
574 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
575 ref = 'refs/tags/'+r |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
576 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
577 if ref not in refs: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
578 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
|
579 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
|
580 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
|
581 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
|
582 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
|
583 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
584 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
|
585 % (ref, ctx)) |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
586 else: |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
587 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
|
588 "and merge before pushing" % ref) |
126 | 589 |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
590 return new_refs |
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
591 |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
592 |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
593 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
|
594 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
|
595 graphwalker = self.git.get_graph_walker() |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
596 def determine_wants(refs): |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
597 if heads: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
598 want = [] |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
599 for h in heads: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
600 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
|
601 if not r: |
292
19f201d64a16
git_handler: fix % formatting in ref errors.
Augie Fackler <durin42@gmail.com>
parents:
288
diff
changeset
|
602 raise hgutil.Abort("ref %s not found on remote server" % h) |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
603 elif len(r) == 1: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
604 want.append(refs[r[0]]) |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
605 else: |
292
19f201d64a16
git_handler: fix % formatting in ref errors.
Augie Fackler <durin42@gmail.com>
parents:
288
diff
changeset
|
606 raise hgutil.Abort("ambiguous reference %s: %r" % (h, r)) |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
607 else: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
608 want = [sha for ref, sha in refs.iteritems() |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
609 if not ref.endswith('^{}')] |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
610 return want |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
611 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
|
612 try: |
266
5347d8c94021
python 2.4 syntax fix
Antonin Amand <antonin.amand@gmail.com>
parents:
261
diff
changeset
|
613 try: |
293
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
614 return client.fetch_pack(path, determine_wants, graphwalker, |
8aaae306d46f
git_handler: 80 columns cleanup
Augie Fackler <durin42@gmail.com>
parents:
292
diff
changeset
|
615 f.write, self.ui.status) |
266
5347d8c94021
python 2.4 syntax fix
Antonin Amand <antonin.amand@gmail.com>
parents:
261
diff
changeset
|
616 except HangupException: |
5347d8c94021
python 2.4 syntax fix
Antonin Amand <antonin.amand@gmail.com>
parents:
261
diff
changeset
|
617 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
|
618 finally: |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
619 commit() |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
620 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
621 ## REFERENCES HANDLING |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
622 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
623 def update_references(self): |
195
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
624 heads = self.local_heads() |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
625 |
195
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
626 # 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
|
627 # Mercurial bookmark. |
e09d71dc4cb4
Drop importbranch/exportbranch options (exportbranch was really broken)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
194
diff
changeset
|
628 for key in heads: |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
629 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
|
630 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
631 def export_hg_tags(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
632 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
|
633 if self.repo.tagtype(tag) in ('global', 'git'): |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
634 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
|
635 self.tags[tag] = hex(sha) |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
636 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
637 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
|
638 try: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
639 if getattr(bookmarks, 'parse', None): |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
640 bms = bookmarks.parse(self.repo) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
641 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
642 bms = self.repo._bookmarks |
230
51e4d6ebbc40
rework pushing to support --rev and --force options
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
229
diff
changeset
|
643 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
|
644 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
|
645 return {} |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
646 |
187
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
647 def import_tags(self, refs): |
149 | 648 keys = refs.keys() |
649 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
|
650 return |
5f196f80ffb3
Store git tags in .hg/git-tags and let localtags be *local*
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
186
diff
changeset
|
651 for k in keys[:]: |
149 | 652 ref_name = k |
653 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
|
654 if parts[0] == 'refs' and parts[1] == 'tags': |
149 | 655 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
|
656 # 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
|
657 # the ones we are pulling |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
658 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
|
659 continue |
149 | 660 if ref_name[-3:] == '^{}': |
661 ref_name = ref_name[:-3] | |
662 if not ref_name in self.repo.tags(): | |
663 obj = self.git.get_object(refs[k]) | |
664 sha = None | |
665 if isinstance (obj, Commit): # lightweight | |
666 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
|
667 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
|
668 elif isinstance (obj, Tag): # annotated |
149 | 669 (obj_type, obj_sha) = obj.get_object() |
670 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
|
671 if isinstance (obj, Commit): |
149 | 672 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
|
673 # 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
|
674 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
|
675 self.save_tags() |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
676 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
677 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
|
678 try: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
679 oldbm = getattr(bookmarks, 'parse', None) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
680 if oldbm: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
681 bms = bookmarks.parse(self.repo) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
682 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
683 bms = self.repo._bookmarks |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
684 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
|
685 if ref.startswith('refs/heads/')]) |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
686 |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
687 for head, sha in heads.iteritems(): |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
688 # 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
|
689 # the ones we are pulling |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
690 if sha not in self.git.object_store: |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
691 continue |
188
5d48a2310e16
Use mercurial.node.bin instead of dulwich.objects.hex_to_sha
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
187
diff
changeset
|
692 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
|
693 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
|
694 # new branch |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
695 bms[head] = hgsha |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
696 else: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
697 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
|
698 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
|
699 # fast forward |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
700 bms[head] = hgsha |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
701 if heads: |
268
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
702 if oldbm: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
703 bookmarks.write(self.repo, bms) |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
704 else: |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
705 self.repo._bookmarks = bms |
6fded8e42858
git_handler: update for slight API change in bookmarks
Augie Fackler <durin42@gmail.com>
parents:
267
diff
changeset
|
706 bookmarks.write(self.repo) |
161
134915637cf7
Merge branch 'octo' with octo merge code
Scott Chacon <schacon@gmail.com>
diff
changeset
|
707 |
29
2a5c0bf0fef5
Another way of fixing no-bookmark issue, along with updated test.
Augie Fackler <durin42@gmail.com>
parents:
28
diff
changeset
|
708 except AttributeError: |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
709 self.ui.warn(_('creating bookmarks failed, do you have' |
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
710 ' 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
|
711 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
712 def update_remote_branches(self, remote_name, refs): |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
713 def _set_hg_tag(head, sha): |
232
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
714 # 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
|
715 # we are pulling |
0ba1aee0467c
initial support for pull -r
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
231
diff
changeset
|
716 if sha not in self.git.object_store: |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
717 return |
188
5d48a2310e16
Use mercurial.node.bin instead of dulwich.objects.hex_to_sha
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
187
diff
changeset
|
718 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
|
719 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
|
720 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
|
721 |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
722 for ref_name, sha in refs.iteritems(): |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
723 if ref_name.startswith('refs/heads'): |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
724 head = ref_name[11:] |
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
725 _set_hg_tag(head, sha) |
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
726 |
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
727 new_ref = 'refs/remotes/%s/%s' % (remote_name, head) |
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
728 self.git.refs[new_ref] = sha |
316
7e5ed21ceec1
git_handler: prefer () continuation to \ continuation.
Augie Fackler <durin42@gmail.com>
parents:
306
diff
changeset
|
729 elif (ref_name.startswith('refs/tags') |
7e5ed21ceec1
git_handler: prefer () continuation to \ continuation.
Augie Fackler <durin42@gmail.com>
parents:
306
diff
changeset
|
730 and not ref_name.endswith('^{}')): |
305
ad2ea8d6ef94
update_remote_branches: refactor head usage
Tay Ray Chuan <rctay89@gmail.com>
parents:
304
diff
changeset
|
731 self.git.refs[ref_name] = sha |
196
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
732 |
40edc4b814e4
Reorganize push for more symmetry with fetch
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
195
diff
changeset
|
733 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
734 ## UTILITY FUNCTIONS |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
735 |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
736 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
|
737 # TODO: make these into constants |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
738 convert = { |
121
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
739 0100644: '', |
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
740 0100755: 'x', |
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
741 0120000: 'l'} |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
742 if mode in convert: |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
743 return convert[mode] |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
744 return '' |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
745 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
746 def extract_hg_metadata(self, message): |
227
c4f6e6f24bf1
fix bug introduced by previous commit
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
226
diff
changeset
|
747 split = message.split("\n--HG--\n", 1) |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
748 renames = {} |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
749 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
|
750 branch = False |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
751 if len(split) == 2: |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
752 message, meta = split |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
753 lines = meta.split("\n") |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
754 for line in lines: |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
755 if line == '': |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
756 continue |
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
757 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
758 command, data = line.split(" : ", 1) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
759 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
760 if command == 'rename': |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
761 before, after = data.split(" => ", 1) |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
762 renames[after] = before |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
763 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
|
764 branch = data |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
765 if command == 'extra': |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
766 before, after = data.split(" : ", 1) |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
767 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
|
768 return (message, renames, branch, extra) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
769 |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
770 def get_file(self, commit, f): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
771 otree = self.git.tree(commit.tree) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
772 parts = f.split('/') |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
773 for part in parts: |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
774 (mode, sha) = otree[part] |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
775 obj = self.git.get_object(sha) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
776 if isinstance (obj, Blob): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
777 return (mode, sha, obj._text) |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
778 elif isinstance(obj, Tree): |
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
779 otree = obj |
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 def get_files_changed(self, commit): |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
782 tree = commit.tree |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
783 btree = None |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
784 |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
785 if commit.parents: |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
786 btree = self.git[commit.parents[0]].tree |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
787 |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
788 changes = self.git.object_store.tree_changes(btree, tree) |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
789 files = {} |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
790 for (oldfile, newfile), (oldmode, newmode), (oldsha, newsha) in changes: |
287
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
791 # don't create new submodules |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
792 if newmode == 0160000: |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
793 if oldfile: |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
794 # become a regular delete |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
795 newfile, newmode = None, None |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
796 else: |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
797 continue |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
798 # so old submodules shoudn't exist |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
799 if oldmode == 0160000: |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
800 if newfile: |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
801 # become a regular add |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
802 oldfile, oldmode = None, None |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
803 else: |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
804 continue |
e08a22250fa9
Don't import git submodule files (we don't support them .. yet).
jeremy avnet <brainsik@saucelabs.com>
parents:
286
diff
changeset
|
805 |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
806 if newfile is None: |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
807 file = oldfile |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
808 delete = True |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
809 else: |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
810 file = newfile |
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
811 delete = False |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
812 |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
813 files[file] = (delete, newmode, newsha) |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
814 |
275
c2d6b1093e7e
fix a bug when a directory is replaced with a file
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
261
diff
changeset
|
815 return files |
224
80d67ae190df
port to upstream dulwich
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
222
diff
changeset
|
816 |
184
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
817 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
|
818 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
|
819 if names: |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
820 return names[0] |
7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
183
diff
changeset
|
821 |
186
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
822 # Stolen from hgsubversion |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
823 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
|
824 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
825 from mercurial import encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
826 old = encoding.encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
827 encoding.encoding = new_encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
828 except ImportError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
829 old = hgutil._encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
830 hgutil._encoding = new_encoding |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
831 return old |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
832 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
833 def decode_guess(self, string, encoding): |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
834 # 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
|
835 if encoding: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
836 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
837 return string.decode(encoding).encode('utf-8') |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
838 except UnicodeDecodeError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
839 pass |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
840 |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
841 try: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
842 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
|
843 except UnicodeDecodeError: |
f4caf22b87cd
Handle git repositories with legacy encodings.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
184
diff
changeset
|
844 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
|
845 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
846 def get_transport_and_path(self, uri): |
285
5e5aee9b32d4
git_handler: slight style cleanup
Augie Fackler <durin42@gmail.com>
parents:
284
diff
changeset
|
847 for handler, transport in (("git://", client.TCPGitClient), |
5e5aee9b32d4
git_handler: slight style cleanup
Augie Fackler <durin42@gmail.com>
parents:
284
diff
changeset
|
848 ("git@", client.SSHGitClient), |
5e5aee9b32d4
git_handler: slight style cleanup
Augie Fackler <durin42@gmail.com>
parents:
284
diff
changeset
|
849 ("git+ssh://", client.SSHGitClient)): |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
850 if uri.startswith(handler): |
261
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
851 # We need to split around : or /, whatever comes first |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
852 hostpath = uri[len(handler):] |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
853 if (hostpath.find(':') > 0 and hostpath.find('/') > 0): |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
854 # we have both, whatever is first wins. |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
855 if hostpath.find(':') < hostpath.find('/'): |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
856 hostpath_seper = ':' |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
857 else: |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
858 hostpath_seper = '/' |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
859 elif hostpath.find(':') > 0: |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
860 hostpath_seper = ':' |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
861 else: |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
862 hostpath_seper = '/' |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
863 |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
864 host, path = hostpath.split(hostpath_seper, 1) |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
865 if hostpath_seper == '/': |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
866 transportpath = '/' + path |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
867 else: |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
868 transportpath = path |
29e5072ddaab
Handle normal relative SSH paths (i.e for heroku and gitosis) as well as github style paths.
Lincoln Stoll <lstoll@lstoll.net>
parents:
260
diff
changeset
|
869 return transport(host, thin_packs=False), transportpath |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
870 # if its not git or git+ssh, try a local url.. |
286
0661d5721ad7
git_handler: use progress API instead of reinventing the wheel
Augie Fackler <durin42@gmail.com>
parents:
285
diff
changeset
|
871 return client.SubprocessGitClient(thin_packs=False), uri |