Mercurial > hg > hg-git
annotate git_handler.py @ 183:469e80d3142a
Reorder methods by their functionality.
author | Abderrahim Kitouni <a.kitouni@gmail.com> |
---|---|
date | Tue, 16 Jun 2009 13:39:11 +0100 |
parents | 9bdd8e76bbab |
children | 7bf98d3085f4 |
rev | line source |
---|---|
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
1 import os, sys, math, urllib, re |
76
aa2dadf04144
fixed the topo sorting and added a unit test
Scott Chacon <schacon@gmail.com>
parents:
75
diff
changeset
|
2 import toposort |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
3 from dulwich.repo import Repo |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
4 from dulwich.client import SimpleFetchGraphWalker |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
5 from hgext import bookmarks |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
6 from mercurial.i18n import _ |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
7 from mercurial.node import hex, nullid |
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
8 from mercurial import context |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
9 from dulwich.misc import make_sha |
38
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
10 from dulwich.objects import ( |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
11 Blob, |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
12 Commit, |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
13 Tag, |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
14 Tree, |
129
ed4e8c2cd016
cleanup dates handling.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
118
diff
changeset
|
15 hex_to_sha, |
ed4e8c2cd016
cleanup dates handling.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
118
diff
changeset
|
16 format_timezone, |
38
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
17 ) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
18 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
19 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
20 class GitHandler(object): |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
21 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
22 def __init__(self, dest_repo, ui): |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
23 self.repo = dest_repo |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
24 self.ui = ui |
105
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
25 self.mapfile = 'git-mapfile' |
133
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
26 |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
27 if ui.config('git', 'intree'): |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
28 self.gitdir = self.repo.wjoin('.git') |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
29 else: |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
30 self.gitdir = self.repo.join('git') |
f2dfb2bed724
Allow storing the git directory intree
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
118
diff
changeset
|
31 |
141
a989866eead8
Make it possible to limit what branches are imported
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
140
diff
changeset
|
32 self.importbranch = ui.config('git', 'importbranch') |
155
6db38267e2e8
make the export branch customizable
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
143
diff
changeset
|
33 self.exportbranch = ui.config('git', 'exportbranch', 'refs/heads/master') |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
34 self.bookbranch = ui.config('git', 'bookbranch', '') |
141
a989866eead8
Make it possible to limit what branches are imported
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
140
diff
changeset
|
35 |
16
58cd05129119
moved init into git_handler
Scott Chacon <schacon@gmail.com>
parents:
14
diff
changeset
|
36 self.init_if_missing() |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
37 self.load_git() |
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
38 self.load_map() |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
39 |
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
40 # make the git data directory |
16
58cd05129119
moved init into git_handler
Scott Chacon <schacon@gmail.com>
parents:
14
diff
changeset
|
41 def init_if_missing(self): |
106
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
42 if not os.path.exists(self.gitdir): |
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
43 os.mkdir(self.gitdir) |
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
44 Repo.init_bare(self.gitdir) |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
45 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
46 def load_git(self): |
106
3aa2f6caed16
make the gitdir a constant
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
105
diff
changeset
|
47 self.git = Repo(self.gitdir) |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
48 |
14
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
49 ## FILE LOAD AND SAVE METHODS |
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
50 |
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 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
|
52 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
|
53 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
|
54 |
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
55 def map_hg_get(self, gitsha): |
94
b88d6b214914
strip redundant module path and dict accessing
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
92
diff
changeset
|
56 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
|
57 |
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
58 def map_git_get(self, hgsha): |
94
b88d6b214914
strip redundant module path and dict accessing
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
92
diff
changeset
|
59 return self._map_hg.get(hgsha) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
60 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
61 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
|
62 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
|
63 self._map_hg = {} |
105
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
64 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
|
65 for line in self.repo.opener(self.mapfile): |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
66 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
|
67 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
|
68 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
|
69 |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
70 def save_map(self): |
105
41e76444105c
make git-mapfile and git-configfile constants
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
104
diff
changeset
|
71 file = self.repo.opener(self.mapfile, 'w+', atomictemp=True) |
100
e17d9eea44ab
sort the mapfile before writing
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
99
diff
changeset
|
72 for gitsha, hgsha in sorted(self._map_git.iteritems()): |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
73 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
|
74 file.rename() |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
75 |
14
36e94e805fa7
added basic config file for remembering remote urls
Scott Chacon <schacon@gmail.com>
parents:
13
diff
changeset
|
76 ## END FILE LOAD AND SAVE METHODS |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
77 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
78 ## COMMANDS METHODS |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
79 |
137
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
80 def import_commits(self, remote_name): |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
81 self.import_git_objects(remote_name) |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
82 self.save_map() |
5aefcbf1e50c
add a gimport command
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
136
diff
changeset
|
83 |
12
227b11d75844
updates bookmarks and beginnings of seperate remotes support
Scott Chacon <schacon@gmail.com>
parents:
11
diff
changeset
|
84 def fetch(self, remote_name): |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
85 self.ui.status(_("fetching from : %s\n") % remote_name) |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
86 self.export_git_objects() |
56 | 87 refs = self.fetch_pack(remote_name) |
88 if refs: | |
149 | 89 self.import_git_objects(remote_name, refs) |
90 self.import_local_tags(refs) | |
7
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
91 self.save_map() |
89992b6d2eef
mapping parents properly now
Scott Chacon <schacon@gmail.com>
parents:
6
diff
changeset
|
92 |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
93 def export_commits(self, export_objects=True): |
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
94 if export_objects: |
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
95 self.export_git_objects() |
147 | 96 self.export_hg_tags() |
97 | 97 self.update_references() |
98 self.save_map() | |
99 | |
17
ace0f6ed65a1
setting up for upload-pack functionality
Scott Chacon <schacon@gmail.com>
parents:
16
diff
changeset
|
100 def push(self, remote_name): |
166
405a915bf352
remove rename detection, add explicit changelog recording on merges
Scott Chacon <schacon@gmail.com>
parents:
165
diff
changeset
|
101 self.fetch(remote_name) # get and convert objects if they already exist |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
102 self.ui.status(_("pushing to : %s\n") % remote_name) |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
103 self.export_commits(False) |
125 | 104 self.update_remote_references(remote_name) |
17
ace0f6ed65a1
setting up for upload-pack functionality
Scott Chacon <schacon@gmail.com>
parents:
16
diff
changeset
|
105 self.upload_pack(remote_name) |
19
2be9c0bd88af
Warn, but don't fail when bookmarks is not enabled.
Augie Fackler <durin42@gmail.com>
parents:
17
diff
changeset
|
106 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
107 def clear(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
108 mapfile = self.repo.join(self.mapfile) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
109 if os.path.exists(self.gitdir): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
110 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
|
111 for name in files: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
112 os.remove(os.path.join(root, name)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
113 for name in dirs: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
114 os.rmdir(os.path.join(root, name)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
115 os.rmdir(self.gitdir) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
116 if os.path.exists(mapfile): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
117 os.remove(mapfile) |
124
9dafb9ac24ff
hg bookmarks to local git branches
Ian Dees <undees@gmail.com>
parents:
118
diff
changeset
|
118 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
119 ## CHANGESET CONVERSION METHODS |
125 | 120 |
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
|
121 def export_git_objects(self): |
177
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
122 self.previous_entries = {} |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
123 self.written_trees = {} |
142
ed884cfe3fa3
export: be more clean in what we're doing
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
141
diff
changeset
|
124 self.ui.status(_("importing Hg objects into Git\n")) |
99
541571f2e429
add progress indication during export
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
97
diff
changeset
|
125 total = len(self.repo.changelog) |
148
201d30003120
Splitting the if statement up since python didn't like that.
Nick Quaranto <nick@quaran.to>
parents:
147
diff
changeset
|
126 if total: |
201d30003120
Splitting the if statement up since python didn't like that.
Nick Quaranto <nick@quaran.to>
parents:
147
diff
changeset
|
127 magnitude = int(math.log(total, 10)) + 1 |
201d30003120
Splitting the if statement up since python didn't like that.
Nick Quaranto <nick@quaran.to>
parents:
147
diff
changeset
|
128 else: |
201d30003120
Splitting the if statement up since python didn't like that.
Nick Quaranto <nick@quaran.to>
parents:
147
diff
changeset
|
129 magnitude = 1 |
99
541571f2e429
add progress indication during export
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
97
diff
changeset
|
130 for i, rev in enumerate(self.repo.changelog): |
541571f2e429
add progress indication during export
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
97
diff
changeset
|
131 if i%100 == 0: |
541571f2e429
add progress indication during export
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
97
diff
changeset
|
132 self.ui.status(_("at: %*d/%d\n") % (magnitude, i, total)) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
133 |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
134 ctx = self.repo.changectx(rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
135 state = ctx.extra().get('hg-git', None) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
136 if state == 'octopus': |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
137 self.ui.debug("revision %d is a part of octopus explosion\n" % rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
138 continue |
102
302df8a2a8d0
major speedup in the already-converted case
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
101
diff
changeset
|
139 pgit_sha, already_written = self.export_hg_commit(rev) |
302df8a2a8d0
major speedup in the already-converted case
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
101
diff
changeset
|
140 if not already_written: |
302df8a2a8d0
major speedup in the already-converted case
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
101
diff
changeset
|
141 self.save_map() |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
142 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
143 # 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
|
144 # 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
|
145 # 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
|
146 def export_hg_commit(self, rev): |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
147 def is_octopus_part(ctx): |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
148 return ctx.extra().get('hg-git', None) in set(['octopus', 'octopus-done']) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
149 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
150 # return if we've already processed this |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
151 node = self.repo.changelog.lookup(rev) |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
152 phgsha = hex(node) |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
153 pgit_sha = self.map_git_get(phgsha) |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
154 if pgit_sha: |
102
302df8a2a8d0
major speedup in the already-converted case
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
101
diff
changeset
|
155 return pgit_sha, True |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
156 |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
157 self.ui.note(_("converting revision %s\n") % rev) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
158 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
159 # make sure parents are converted first |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
160 ctx = self.repo.changectx(rev) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
161 extra = ctx.extra() |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
162 |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
163 parents = [] |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
164 if extra.get('hg-git', None) == 'octopus-done': |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
165 # implode octopus parents |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
166 part = ctx |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
167 while is_octopus_part(part): |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
168 (p1, p2) = part.parents() |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
169 assert not is_octopus_part(p1) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
170 parents.append(p1) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
171 part = p2 |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
172 parents.append(p2) |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
173 else: |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
174 parents = ctx.parents() |
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
175 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
176 for parent in parents: |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
177 p_rev = parent.rev() |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
178 hgsha = hex(parent.node()) |
21
13b9a020e382
gpush coming along. will now write blobs it doesn't have yet to git repo.
Scott Chacon <schacon@gmail.com>
parents:
19
diff
changeset
|
179 git_sha = self.map_git_get(hgsha) |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
180 if not p_rev == -1: |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
181 if not git_sha: |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
182 self.export_hg_commit(p_rev) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
183 |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
184 tree_sha, renames = self.write_git_tree(ctx) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
185 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
186 commit = {} |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
187 commit['tree'] = tree_sha |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
188 (time, timezone) = ctx.date() |
68
d28d3763eda3
Deal with hg authors missing email attributes.
Chris Wanstrath <chris@ozmm.org>
parents:
65
diff
changeset
|
189 |
d28d3763eda3
Deal with hg authors missing email attributes.
Chris Wanstrath <chris@ozmm.org>
parents:
65
diff
changeset
|
190 # hg authors might not have emails |
d28d3763eda3
Deal with hg authors missing email attributes.
Chris Wanstrath <chris@ozmm.org>
parents:
65
diff
changeset
|
191 author = ctx.user() |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
192 |
169
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
193 # check for git author pattern compliance |
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
194 regex = re.compile('^(.*?) \<(.*?)\>(.*)$') |
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
195 a = regex.match(author) |
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
196 |
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
197 if a: |
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
198 name = a.group(1) |
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
199 email = a.group(2) |
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
200 if len(a.group(3)) > 0: |
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
201 name += ' ext:(' + urllib.quote(a.group(3)) + ')' |
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
202 author = name + ' <' + email + '>' |
d67d00738298
fix message stripping and malformed user info
Scott Chacon <schacon@gmail.com>
parents:
168
diff
changeset
|
203 else: |
68
d28d3763eda3
Deal with hg authors missing email attributes.
Chris Wanstrath <chris@ozmm.org>
parents:
65
diff
changeset
|
204 author = author + ' <none@none>' |
129
ed4e8c2cd016
cleanup dates handling.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
118
diff
changeset
|
205 commit['author'] = author + ' ' + str(int(time)) + ' ' + format_timezone(-timezone) |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
206 message = ctx.description() |
80
0e0a2d20deed
added a missing newline back to git conversion
Scott Chacon <schacon@gmail.com>
parents:
79
diff
changeset
|
207 commit['message'] = ctx.description() + "\n" |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
208 |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
209 if 'committer' in extra: |
131
dd6c77ec206c
store commitdate in mercurial's internal format.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
129
diff
changeset
|
210 # fixup timezone |
dd6c77ec206c
store commitdate in mercurial's internal format.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
129
diff
changeset
|
211 (name_timestamp, timezone) = extra['committer'].rsplit(' ', 1) |
140
6701ab807bf5
Deal with invalid timezones in extra commiter
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
138
diff
changeset
|
212 try: |
6701ab807bf5
Deal with invalid timezones in extra commiter
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
138
diff
changeset
|
213 timezone = format_timezone(-int(timezone)) |
6701ab807bf5
Deal with invalid timezones in extra commiter
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
138
diff
changeset
|
214 commit['committer'] = '%s %s' % (name_timestamp, timezone) |
6701ab807bf5
Deal with invalid timezones in extra commiter
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
138
diff
changeset
|
215 except ValueError: |
6701ab807bf5
Deal with invalid timezones in extra commiter
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
138
diff
changeset
|
216 self.ui.warn(_("Ignoring committer in extra, invalid timezone in r%s: '%s'.\n") % (rev, timezone)) |
118
b3be536e3f50
handles git commit encoding fields now
Scott Chacon <schacon@gmail.com>
parents:
113
diff
changeset
|
217 if 'encoding' in extra: |
b3be536e3f50
handles git commit encoding fields now
Scott Chacon <schacon@gmail.com>
parents:
113
diff
changeset
|
218 commit['encoding'] = extra['encoding'] |
89
e35ed99fa691
committer info now being kept properly
Scott Chacon <schacon@gmail.com>
parents:
88
diff
changeset
|
219 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
220 # 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
|
221 add_extras = False |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
222 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
|
223 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
|
224 add_extras = True |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
225 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
|
226 |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
227 if renames: |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
228 add_extras = True |
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
229 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
|
230 extra_message += "rename : " + oldfile + " => " + newfile + "\n" |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
231 |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
232 for key, value in extra.iteritems(): |
165
cb922a0ca22d
almost got everything working
Scott Chacon <schacon@gmail.com>
parents:
164
diff
changeset
|
233 if key in ['committer', 'encoding', 'branch', 'hg-git']: |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
234 continue |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
235 else: |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
236 add_extras = True |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
237 extra_message += "extra : " + key + " : " + urllib.quote(value) + "\n" |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
238 |
166
405a915bf352
remove rename detection, add explicit changelog recording on merges
Scott Chacon <schacon@gmail.com>
parents:
165
diff
changeset
|
239 # save file context listing on merge commit |
405a915bf352
remove rename detection, add explicit changelog recording on merges
Scott Chacon <schacon@gmail.com>
parents:
165
diff
changeset
|
240 if (len(parents) > 1): |
405a915bf352
remove rename detection, add explicit changelog recording on merges
Scott Chacon <schacon@gmail.com>
parents:
165
diff
changeset
|
241 add_extras = True |
168
8bfa8aa6b68f
added empty changelog handling
Scott Chacon <schacon@gmail.com>
parents:
166
diff
changeset
|
242 if len(ctx.files()) > 0: |
8bfa8aa6b68f
added empty changelog handling
Scott Chacon <schacon@gmail.com>
parents:
166
diff
changeset
|
243 for filenm in ctx.files(): |
8bfa8aa6b68f
added empty changelog handling
Scott Chacon <schacon@gmail.com>
parents:
166
diff
changeset
|
244 extra_message += "files : " + filenm + "\n" |
8bfa8aa6b68f
added empty changelog handling
Scott Chacon <schacon@gmail.com>
parents:
166
diff
changeset
|
245 else: # hack for 'fetch' extension idiocy |
8bfa8aa6b68f
added empty changelog handling
Scott Chacon <schacon@gmail.com>
parents:
166
diff
changeset
|
246 extra_message += "emptychangelog : true\n" |
165
cb922a0ca22d
almost got everything working
Scott Chacon <schacon@gmail.com>
parents:
164
diff
changeset
|
247 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
248 if add_extras: |
80
0e0a2d20deed
added a missing newline back to git conversion
Scott Chacon <schacon@gmail.com>
parents:
79
diff
changeset
|
249 commit['message'] += "\n--HG--\n" + extra_message |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
250 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
251 commit['parents'] = [] |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
252 for parent in parents: |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
253 hgsha = hex(parent.node()) |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
254 git_sha = self.map_git_get(hgsha) |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
255 if git_sha: |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
256 commit['parents'].append(git_sha) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
257 |
24
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
258 commit_sha = self.git.write_commit_hash(commit) # writing new blobs to git |
41f4e0a85d15
fully converts hg changeset/manifest/files to git commits/trees/blobs
Scott Chacon <schacon@gmail.com>
parents:
23
diff
changeset
|
259 self.map_set(commit_sha, phgsha) |
102
302df8a2a8d0
major speedup in the already-converted case
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
101
diff
changeset
|
260 return commit_sha, False |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
261 |
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
|
262 def write_git_tree(self, ctx): |
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
|
263 trees = {} |
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
|
264 man = ctx.manifest() |
177
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
265 ctx_id = hex(ctx.node()) |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
266 |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
267 renames = [] |
171
88e413d853ee
fixed serious speed issue with rename detection
Scott Chacon <schacon@gmail.com>
parents:
169
diff
changeset
|
268 for filenm, nodesha in man.iteritems(): |
88e413d853ee
fixed serious speed issue with rename detection
Scott Chacon <schacon@gmail.com>
parents:
169
diff
changeset
|
269 file_id = hex(nodesha) |
177
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
270 if ctx_id not in self.previous_entries: |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
271 self.previous_entries[ctx_id] = {} |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
272 self.previous_entries[ctx_id][filenm] = file_id |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
273 |
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
|
274 # write blob if not in our git database |
177
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
275 fctx = ctx.filectx(filenm) |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
276 |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
277 same_as_last = False |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
278 for par in ctx.parents(): |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
279 par_id = hex(par.node()) |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
280 if par_id in self.previous_entries: |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
281 if filenm in self.previous_entries[par_id]: |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
282 if self.previous_entries[par_id][filenm] == file_id: |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
283 same_as_last = True |
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
284 if not same_as_last: |
171
88e413d853ee
fixed serious speed issue with rename detection
Scott Chacon <schacon@gmail.com>
parents:
169
diff
changeset
|
285 rename = fctx.renamed() |
88e413d853ee
fixed serious speed issue with rename detection
Scott Chacon <schacon@gmail.com>
parents:
169
diff
changeset
|
286 if rename: |
88e413d853ee
fixed serious speed issue with rename detection
Scott Chacon <schacon@gmail.com>
parents:
169
diff
changeset
|
287 filerename, sha = rename |
177
88fdcb23294e
only look for renames if the file has changed
Scott Chacon <schacon@gmail.com>
parents:
176
diff
changeset
|
288 renames.append((filerename, filenm)) |
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
|
289 is_exec = 'x' in fctx.flags() |
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
|
290 is_link = 'l' in fctx.flags() |
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
|
291 blob_sha = self.map_git_get(file_id) |
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
|
292 if not blob_sha: |
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
|
293 blob_sha = self.git.write_blob(fctx.data()) # writing new blobs to git |
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
|
294 self.map_set(blob_sha, file_id) |
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
|
295 |
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
|
296 parts = filenm.split('/') |
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
|
297 if len(parts) > 1: |
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
|
298 # get filename and path for leading subdir |
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
|
299 filepath = parts[-1:][0] |
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
|
300 dirpath = "/".join([v for v in parts[0:-1]]) + '/' |
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
|
301 |
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
|
302 # get subdir name and path for parent dir |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
303 parpath = '/' |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
304 nparpath = '/' |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
305 for part in parts[0:-1]: |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
306 if nparpath == '/': |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
307 nparpath = part + '/' |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
308 else: |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
309 nparpath += part + '/' |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
310 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
311 treeentry = ['tree', part + '/', nparpath] |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
312 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
313 if parpath not in trees: |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
314 trees[parpath] = [] |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
315 if treeentry not in trees[parpath]: |
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
316 trees[parpath].append( treeentry ) |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
317 |
54
f6e11b9d7562
not adding HG extra info if commits were on the default branch
Scott Chacon <schacon@gmail.com>
parents:
53
diff
changeset
|
318 parpath = nparpath |
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
|
319 |
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
|
320 # set file entry |
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
|
321 fileentry = ['blob', filepath, blob_sha, is_exec, is_link] |
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
|
322 if dirpath not in trees: |
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
|
323 trees[dirpath] = [] |
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
|
324 trees[dirpath].append(fileentry) |
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
|
325 |
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
|
326 else: |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
327 fileentry = ['blob', parts[0], blob_sha, is_exec, is_link] |
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
|
328 if '/' not in trees: |
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
|
329 trees['/'] = [] |
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
|
330 trees['/'].append(fileentry) |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
331 |
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
|
332 dirs = trees.keys() |
122
76a0e1ee7cf7
don't fail while exporting commit with empty working tree. +test.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
121
diff
changeset
|
333 if dirs: |
76a0e1ee7cf7
don't fail while exporting commit with empty working tree. +test.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
121
diff
changeset
|
334 # sort by tree depth, so we write the deepest trees first |
76a0e1ee7cf7
don't fail while exporting commit with empty working tree. +test.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
121
diff
changeset
|
335 dirs.sort(lambda a, b: len(b.split('/'))-len(a.split('/'))) |
76a0e1ee7cf7
don't fail while exporting commit with empty working tree. +test.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
121
diff
changeset
|
336 dirs.remove('/') |
76a0e1ee7cf7
don't fail while exporting commit with empty working tree. +test.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
121
diff
changeset
|
337 dirs.append('/') |
76a0e1ee7cf7
don't fail while exporting commit with empty working tree. +test.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
121
diff
changeset
|
338 else: |
76a0e1ee7cf7
don't fail while exporting commit with empty working tree. +test.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
121
diff
changeset
|
339 # manifest is empty => make empty root tree |
76a0e1ee7cf7
don't fail while exporting commit with empty working tree. +test.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
121
diff
changeset
|
340 trees['/'] = [] |
76a0e1ee7cf7
don't fail while exporting commit with empty working tree. +test.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
121
diff
changeset
|
341 dirs = ['/'] |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
342 |
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
|
343 # write all the trees |
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
|
344 tree_sha = None |
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
|
345 tree_shas = {} |
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
|
346 for dirnm in dirs: |
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
|
347 tree_data = [] |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
348 sha_group = [] |
176
814499406d4c
fix to previously written tree hash calculation
Scott Chacon <schacon@gmail.com>
parents:
174
diff
changeset
|
349 |
814499406d4c
fix to previously written tree hash calculation
Scott Chacon <schacon@gmail.com>
parents:
174
diff
changeset
|
350 # calculating a sha for the tree, so we don't write it twice |
814499406d4c
fix to previously written tree hash calculation
Scott Chacon <schacon@gmail.com>
parents:
174
diff
changeset
|
351 listsha = make_sha() |
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
|
352 for entry in trees[dirnm]: |
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
|
353 # replace tree path with tree SHA |
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
|
354 if entry[0] == 'tree': |
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
|
355 sha = tree_shas[entry[2]] |
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
|
356 entry[2] = sha |
176
814499406d4c
fix to previously written tree hash calculation
Scott Chacon <schacon@gmail.com>
parents:
174
diff
changeset
|
357 listsha.update(entry[1]) |
814499406d4c
fix to previously written tree hash calculation
Scott Chacon <schacon@gmail.com>
parents:
174
diff
changeset
|
358 listsha.update(entry[2]) |
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
|
359 tree_data.append(entry) |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
360 listsha = listsha.hexdigest() |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
361 |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
362 if listsha in self.written_trees: |
176
814499406d4c
fix to previously written tree hash calculation
Scott Chacon <schacon@gmail.com>
parents:
174
diff
changeset
|
363 tree_sha = self.written_trees[listsha] |
814499406d4c
fix to previously written tree hash calculation
Scott Chacon <schacon@gmail.com>
parents:
174
diff
changeset
|
364 tree_shas[dirnm] = tree_sha |
172
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
365 else: |
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
366 tree_sha = self.git.write_tree_array(tree_data) # writing new trees to git |
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
367 tree_shas[dirnm] = tree_sha |
ac92cdc45ceb
not trying to write the same tree twice
Scott Chacon <schacon@gmail.com>
parents:
171
diff
changeset
|
368 self.written_trees[listsha] = tree_sha |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
369 |
67
759ac56497e7
adding hg explicit file renames to the git commit message
Scott Chacon <schacon@gmail.com>
parents:
65
diff
changeset
|
370 return (tree_sha, renames) # should be the last root tree sha |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
371 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
372 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
|
373 self.ui.status(_("importing Git objects into Hg\n")) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
374 # import heads and fetched tags as remote references |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
375 todo = [] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
376 done = set() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
377 convert_list = {} |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
378 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
379 # get a list of all the head shas |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
380 if refs: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
381 for head, sha in refs.iteritems(): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
382 todo.append(sha) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
383 else: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
384 if remote_name: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
385 todo = self.git.remote_refs(remote_name).values()[:] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
386 elif self.importbranch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
387 branches = self.importbranch.split(',') |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
388 todo = [self.git.ref(i.strip()) for i in branches] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
389 else: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
390 todo = self.git.heads().values()[:] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
391 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
392 # traverse the heads getting a list of all the unique commits |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
393 while todo: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
394 sha = todo.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
395 assert isinstance(sha, str) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
396 if sha in done: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
397 continue |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
398 done.add(sha) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
399 obj = self.git.get_object(sha) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
400 if isinstance (obj, Commit): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
401 convert_list[sha] = obj |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
402 todo.extend([p for p in obj.parents if p not in done]) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
403 if isinstance(obj, Tag): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
404 (obj_type, obj_sha) = obj.get_object() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
405 obj = self.git.get_object(obj_sha) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
406 if isinstance (obj, Commit): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
407 convert_list[sha] = obj |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
408 todo.extend([p for p in obj.parents if p not in done]) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
409 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
410 # sort the commits |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
411 commits = toposort.TopoSort(convert_list).items() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
412 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
413 # import each of the commits, oldest first |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
414 total = len(commits) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
415 magnitude = int(math.log(total, 10)) + 1 if total else 1 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
416 for i, csha in enumerate(commits): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
417 if i%100 == 0: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
418 self.ui.status(_("at: %*d/%d\n") % (magnitude, i, total)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
419 commit = convert_list[csha] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
420 if not self.map_hg_get(csha): # it's already here |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
421 self.import_git_commit(commit) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
422 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
423 self.update_hg_bookmarks(remote_name) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
424 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
425 def import_git_commit(self, commit): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
426 self.ui.debug(_("importing: %s\n") % commit.id) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
427 # TODO : Do something less coarse-grained than try/except on the |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
428 # get_file call for removed files |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
429 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
430 (strip_message, hg_renames, hg_branch, force_files, extra) = self.extract_hg_metadata(commit.message) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
431 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
432 # get a list of the changed, added, removed files |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
433 files = self.git.get_files_changed(commit) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
434 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
435 date = (commit.author_time, -commit.author_timezone) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
436 text = strip_message |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
437 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
438 def getfilectx(repo, memctx, f): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
439 try: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
440 (mode, sha, data) = self.git.get_file(commit, f) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
441 e = self.convert_git_int_mode(mode) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
442 except TypeError: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
443 raise IOError() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
444 if f in hg_renames: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
445 copied_path = hg_renames[f] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
446 else: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
447 copied_path = None |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
448 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
|
449 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
450 gparents = map(self.map_hg_get, commit.parents) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
451 p1, p2 = (nullid, nullid) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
452 octopus = False |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
453 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
454 if len(gparents) > 1: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
455 # merge, possibly octopus |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
456 def commit_octopus(p1, p2): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
457 ctx = context.memctx(self.repo, (p1, p2), text, files, getfilectx, |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
458 commit.author, date, {'hg-git': 'octopus'}) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
459 return hex(self.repo.commitctx(ctx)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
460 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
461 octopus = len(gparents) > 2 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
462 p2 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
463 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
464 while len(gparents) > 0: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
465 p2 = commit_octopus(p1, p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
466 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
467 else: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
468 if gparents: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
469 p1 = gparents.pop() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
470 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
471 files = list(set(files)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
472 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
473 pa = None |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
474 if not (p2 == nullid): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
475 node1 = self.repo.changectx(p1) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
476 node2 = self.repo.changectx(p2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
477 pa = node1.ancestor(node2) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
478 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
479 author = commit.author |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
480 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
481 # convert extra data back to the end |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
482 if ' ext:' in commit.author: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
483 regex = re.compile('^(.*?)\ ext:\((.*)\) <(.*)\>$') |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
484 m = regex.match(commit.author) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
485 if m: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
486 name = m.group(1) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
487 ex = urllib.unquote(m.group(2)) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
488 email = m.group(3) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
489 author = name + ' <' + email + '>' + ex |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
490 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
491 if ' <none@none>' in commit.author: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
492 author = commit.author[:-12] |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
493 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
494 # if named branch, add to extra |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
495 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
496 extra['branch'] = hg_branch |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
497 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
498 # if committer is different than author, add it to extra |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
499 if not commit._author_raw == commit._committer_raw: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
500 extra['committer'] = "%s %d %d" % (commit.committer, commit.commit_time, -commit.commit_timezone) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
501 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
502 if commit._encoding: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
503 extra['encoding'] = commit._encoding |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
504 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
505 if hg_branch: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
506 extra['branch'] = hg_branch |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
507 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
508 if octopus: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
509 extra['hg-git'] ='octopus-done' |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
510 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
511 ctx = context.memctx(self.repo, (p1, p2), text, files, getfilectx, |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
512 author, date, extra) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
513 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
514 node = self.repo.commit_import_ctx(ctx, pa, force_files) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
515 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
516 # save changeset to mapping file |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
517 cs = hex(node) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
518 self.map_set(commit.id, cs) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
519 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
520 ## 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
|
521 |
17
ace0f6ed65a1
setting up for upload-pack functionality
Scott Chacon <schacon@gmail.com>
parents:
16
diff
changeset
|
522 def upload_pack(self, remote_name): |
182
9bdd8e76bbab
Remove remotes support (use the paths section in hgrc instead)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
181
diff
changeset
|
523 client, path = self.get_transport_and_path(remote_name) |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
524 changed = self.get_changed_refs |
26
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
525 genpack = self.generate_pack_contents |
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
526 try: |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
527 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
|
528 changed_refs = client.send_pack(path, changed, genpack) |
52
87d462a6b796
pushing nothing works better
Scott Chacon <schacon@gmail.com>
parents:
51
diff
changeset
|
529 if changed_refs: |
87d462a6b796
pushing nothing works better
Scott Chacon <schacon@gmail.com>
parents:
51
diff
changeset
|
530 new_refs = {} |
88
52b4be85151d
fixed some small compatability issues with the dulwich update
Scott Chacon <schacon@gmail.com>
parents:
80
diff
changeset
|
531 for ref, sha in changed_refs.iteritems(): |
52b4be85151d
fixed some small compatability issues with the dulwich update
Scott Chacon <schacon@gmail.com>
parents:
80
diff
changeset
|
532 self.ui.status(" "+ remote_name + "::" + ref + " => GIT:" + sha[0:8] + "\n") |
52b4be85151d
fixed some small compatability issues with the dulwich update
Scott Chacon <schacon@gmail.com>
parents:
80
diff
changeset
|
533 new_refs[ref] = sha |
52
87d462a6b796
pushing nothing works better
Scott Chacon <schacon@gmail.com>
parents:
51
diff
changeset
|
534 self.git.set_remote_refs(new_refs, remote_name) |
87d462a6b796
pushing nothing works better
Scott Chacon <schacon@gmail.com>
parents:
51
diff
changeset
|
535 self.update_hg_bookmarks(remote_name) |
26
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
536 except: |
96
0cec7b1e07ff
add a few more TODO's
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
95
diff
changeset
|
537 # TODO : remove try/except or do something useful here |
26
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
538 raise |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
539 |
42
fcfb4db848e1
added hack for pushing first branch
Scott Chacon <schacon@gmail.com>
parents:
40
diff
changeset
|
540 # TODO : for now, we'll just push all heads that match remote heads |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
541 # * we should have specified push, tracking branches and --all |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
542 # takes a dict of refs:shas from the server and returns what should be |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
543 # pushed up |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
544 def get_changed_refs(self, refs): |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
545 keys = refs.keys() |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
546 |
88
52b4be85151d
fixed some small compatability issues with the dulwich update
Scott Chacon <schacon@gmail.com>
parents:
80
diff
changeset
|
547 changed = {} |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
548 if not keys: |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
549 return None |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
550 |
42
fcfb4db848e1
added hack for pushing first branch
Scott Chacon <schacon@gmail.com>
parents:
40
diff
changeset
|
551 # TODO : this is a huge hack |
fcfb4db848e1
added hack for pushing first branch
Scott Chacon <schacon@gmail.com>
parents:
40
diff
changeset
|
552 if keys[0] == 'capabilities^{}': # nothing on the server yet - first push |
88
52b4be85151d
fixed some small compatability issues with the dulwich update
Scott Chacon <schacon@gmail.com>
parents:
80
diff
changeset
|
553 changed['refs/heads/master'] = self.git.ref('master') |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
554 |
149 | 555 tags = self.git.get_tags() |
556 for tag, sha in tags.iteritems(): | |
153
4e7c50f8b60a
dont export funky tags we import for convenience, dont push tags already on the server
Scott Chacon <schacon@gmail.com>
parents:
150
diff
changeset
|
557 tag_name = 'refs/tags/' + tag |
4e7c50f8b60a
dont export funky tags we import for convenience, dont push tags already on the server
Scott Chacon <schacon@gmail.com>
parents:
150
diff
changeset
|
558 if tag_name not in refs: |
4e7c50f8b60a
dont export funky tags we import for convenience, dont push tags already on the server
Scott Chacon <schacon@gmail.com>
parents:
150
diff
changeset
|
559 changed[tag_name] = sha |
149 | 560 |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
561 for ref_name in keys: |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
562 parts = ref_name.split('/') |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
563 if parts[0] == 'refs': # strip off 'refs/heads' |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
564 if parts[1] == 'heads': |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
565 head = "/".join([v for v in parts[2:]]) |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
566 local_ref = self.git.ref(ref_name) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
567 if local_ref: |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
568 if not local_ref == refs[ref_name]: |
88
52b4be85151d
fixed some small compatability issues with the dulwich update
Scott Chacon <schacon@gmail.com>
parents:
80
diff
changeset
|
569 changed[ref_name] = local_ref |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
570 |
126 | 571 # Also push any local branches not on the server yet |
572 for head in self.local_heads(): | |
573 if not head in refs: | |
574 ref = self.git.ref(head) | |
575 changed[head] = ref | |
576 | |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
577 return changed |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
578 |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
579 # takes a list of shas the server wants and shas the server has |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
580 # and generates a list of commit shas we need to push up |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
581 def generate_pack_contents(self, want, have): |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
582 graph_walker = SimpleFetchGraphWalker(want, self.git.get_parents) |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
583 next = graph_walker.next() |
77
d7b8768d005a
reapplying defunkts changes
Scott Chacon <schacon@gmail.com>
parents:
76
diff
changeset
|
584 shas = set() |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
585 while next: |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
586 if next in have: |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
587 graph_walker.ack(next) |
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
588 else: |
77
d7b8768d005a
reapplying defunkts changes
Scott Chacon <schacon@gmail.com>
parents:
76
diff
changeset
|
589 shas.add(next) |
37
7046d792dfcd
fix bug where it was not writing the git object names properly
Scott Chacon <schacon@gmail.com>
parents:
35
diff
changeset
|
590 next = graph_walker.next() |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
591 |
77
d7b8768d005a
reapplying defunkts changes
Scott Chacon <schacon@gmail.com>
parents:
76
diff
changeset
|
592 seen = [] |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
593 |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
594 # so now i have the shas, need to turn them into a list of |
38
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
595 # tuples (sha, path) for ALL the objects i'm sending |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
596 # TODO : don't send blobs or trees they already have |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
597 def get_objects(tree, path): |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
598 changes = list() |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
599 changes.append((tree, path)) |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
600 for (mode, name, sha) in tree.entries(): |
121
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
601 if mode == 0160000: # TODO : properly handle submodules and document what 57344 means |
38
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
602 continue |
77
d7b8768d005a
reapplying defunkts changes
Scott Chacon <schacon@gmail.com>
parents:
76
diff
changeset
|
603 if sha in seen: |
d7b8768d005a
reapplying defunkts changes
Scott Chacon <schacon@gmail.com>
parents:
76
diff
changeset
|
604 continue |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
605 |
38
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
606 obj = self.git.get_object(sha) |
77
d7b8768d005a
reapplying defunkts changes
Scott Chacon <schacon@gmail.com>
parents:
76
diff
changeset
|
607 seen.append(sha) |
76
aa2dadf04144
fixed the topo sorting and added a unit test
Scott Chacon <schacon@gmail.com>
parents:
75
diff
changeset
|
608 if isinstance (obj, Blob): |
38
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
609 changes.append((obj, path + name)) |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
610 elif isinstance(obj, Tree): |
77
d7b8768d005a
reapplying defunkts changes
Scott Chacon <schacon@gmail.com>
parents:
76
diff
changeset
|
611 changes.extend(get_objects(obj, path + name + '/')) |
38
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
612 return changes |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
613 |
38
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
614 objects = [] |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
615 for commit_sha in shas: |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
616 commit = self.git.commit(commit_sha) |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
617 objects.append((commit, 'commit')) |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
618 tree = self.git.get_object(commit.tree) |
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
619 objects.extend( get_objects(tree, '/') ) |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
620 |
38
f0daee676e10
successful push to an upstream git server - BOOYAH!
Scott Chacon <schacon@gmail.com>
parents:
37
diff
changeset
|
621 return objects |
50
d274092e3b24
Hacky implementation of file removals.
Augie Fackler <durin42@gmail.com>
parents:
42
diff
changeset
|
622 |
12
227b11d75844
updates bookmarks and beginnings of seperate remotes support
Scott Chacon <schacon@gmail.com>
parents:
11
diff
changeset
|
623 def fetch_pack(self, remote_name): |
182
9bdd8e76bbab
Remove remotes support (use the paths section in hgrc instead)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
181
diff
changeset
|
624 client, path = self.get_transport_and_path(remote_name) |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
625 graphwalker = SimpleFetchGraphWalker(self.git.heads().values(), self.git.get_parents) |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
626 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
|
627 try: |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
628 determine_wants = self.git.object_store.determine_wants_all |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
629 refs = client.fetch_pack(path, determine_wants, graphwalker, f.write, sys.stdout.write) |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
630 f.close() |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
631 commit() |
56 | 632 if refs: |
633 self.git.set_remote_refs(refs, remote_name) | |
634 else: | |
635 self.ui.status(_("nothing new on the server\n")) | |
636 return refs | |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
637 finally: |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
638 f.close() |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
639 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
640 ## REFERENCES HANDLING |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
641 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
642 def update_references(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
643 try: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
644 # We only care about bookmarks of the form 'name', |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
645 # not 'remote/name'. |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
646 def is_local_ref(item): return item[0].count('/') == 0 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
647 bms = bookmarks.parse(self.repo) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
648 bms = dict(filter(is_local_ref, bms.items())) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
649 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
650 # Create a local Git branch name for each |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
651 # Mercurial bookmark. |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
652 for key in bms: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
653 hg_sha = hex(bms[key]) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
654 git_sha = self.map_git_get(hg_sha) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
655 self.git.set_ref('refs/heads/' + key, git_sha) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
656 except AttributeError: |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
657 # No bookmarks extension |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
658 pass |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
659 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
660 c = self.map_git_get(hex(self.repo.changelog.tip())) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
661 self.git.set_ref(self.exportbranch, c) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
662 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
663 def export_hg_tags(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
664 for tag, sha in self.repo.tags().iteritems(): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
665 if tag[-3:] == '^{}': |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
666 continue |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
667 if tag == 'tip': |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
668 continue |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
669 self.git.set_ref('refs/tags/' + tag, self.map_git_get(hex(sha))) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
670 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
671 # Make sure there's a refs/remotes/remote_name/name |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
672 # for every refs/heads/name |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
673 def update_remote_references(self, remote_name): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
674 self.git.set_remote_refs(self.local_heads(), remote_name) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
675 |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
676 def local_heads(self): |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
677 def is_local_head(item): return item[0].startswith('refs/heads') |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
678 refs = self.git.get_refs() |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
679 return dict(filter(is_local_head, refs.items())) |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
680 |
149 | 681 # take refs just fetched, add local tags for all tags not in .hgtags |
682 def import_local_tags(self, refs): | |
683 keys = refs.keys() | |
684 if not keys: | |
685 return None | |
686 for k in keys[0:]: | |
687 ref_name = k | |
688 parts = k.split('/') | |
689 if (parts[0] == 'refs' and parts[1] == 'tags'): | |
690 ref_name = "/".join([v for v in parts[2:]]) | |
691 if ref_name[-3:] == '^{}': | |
692 ref_name = ref_name[:-3] | |
693 if not ref_name in self.repo.tags(): | |
694 obj = self.git.get_object(refs[k]) | |
695 sha = None | |
696 if isinstance (obj, Commit): # lightweight | |
697 sha = self.map_hg_get(refs[k]) | |
698 if isinstance (obj, Tag): # annotated | |
699 (obj_type, obj_sha) = obj.get_object() | |
700 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
|
701 if isinstance (obj, Commit): |
149 | 702 sha = self.map_hg_get(obj_sha) |
703 if sha: | |
704 self.repo.tag(ref_name, hex_to_sha(sha), '', True, None, None) | |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
705 |
47
3b62270c1fad
writing some status output after a push, updating local bookmarks
Scott Chacon <schacon@gmail.com>
parents:
42
diff
changeset
|
706 def update_hg_bookmarks(self, remote_name): |
29
2a5c0bf0fef5
Another way of fixing no-bookmark issue, along with updated test.
Augie Fackler <durin42@gmail.com>
parents:
28
diff
changeset
|
707 try: |
47
3b62270c1fad
writing some status output after a push, updating local bookmarks
Scott Chacon <schacon@gmail.com>
parents:
42
diff
changeset
|
708 bms = bookmarks.parse(self.repo) |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
709 if remote_name: |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
710 heads = self.git.remote_refs(remote_name) |
159
85eae64ca9e2
applied octopatch from dimichxp
Scott Chacon <schacon@gmail.com>
parents:
138
diff
changeset
|
711 else: |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
712 branches = self.bookbranch.split(',') |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
713 heads = dict((i, self.git.ref(i.strip())) for i in branches) |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
714 |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
715 base_name = (remote_name + '/') if remote_name else '' |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
716 |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
717 for head, sha in heads.iteritems(): |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
718 if not sha: |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
719 self.ui.warn(_("Could not resolve head %s.\n") % head) |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
720 continue |
47
3b62270c1fad
writing some status output after a push, updating local bookmarks
Scott Chacon <schacon@gmail.com>
parents:
42
diff
changeset
|
721 hgsha = hex_to_sha(self.map_hg_get(sha)) |
3b62270c1fad
writing some status output after a push, updating local bookmarks
Scott Chacon <schacon@gmail.com>
parents:
42
diff
changeset
|
722 if not head == 'HEAD': |
156
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
723 bms[base_name + head] = hgsha |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
724 if heads: |
a507384308b2
Allow bookmarking a specific branch
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
155
diff
changeset
|
725 bookmarks.write(self.repo, bms) |
161
134915637cf7
Merge branch 'octo' with octo merge code
Scott Chacon <schacon@gmail.com>
diff
changeset
|
726 |
29
2a5c0bf0fef5
Another way of fixing no-bookmark issue, along with updated test.
Augie Fackler <durin42@gmail.com>
parents:
28
diff
changeset
|
727 except AttributeError: |
95
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
728 self.ui.warn(_('creating bookmarks failed, do you have' |
7de67fcb18b0
be better about internationalizing strings
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
94
diff
changeset
|
729 ' 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
|
730 |
183
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
731 ## UTILITY FUNCTIONS |
469e80d3142a
Reorder methods by their functionality.
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
182
diff
changeset
|
732 |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
733 def convert_git_int_mode(self, mode): |
96
0cec7b1e07ff
add a few more TODO's
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
95
diff
changeset
|
734 # TODO : make these into constants |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
735 convert = { |
121
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
736 0100644: '', |
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
737 0100755: 'x', |
0c94e860a0ed
use octal numbers for modes.
Dmitriy Taychenachev <dimichxp@gmail.com>
parents:
120
diff
changeset
|
738 0120000: 'l'} |
53
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
739 if mode in convert: |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
740 return convert[mode] |
5deb5cbd86aa
respecting file modes on git import
Scott Chacon <schacon@gmail.com>
parents:
52
diff
changeset
|
741 return '' |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
742 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
743 def extract_hg_metadata(self, message): |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
744 split = message.split("\n\n--HG--\n", 1) |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
745 renames = {} |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
746 extra = {} |
166
405a915bf352
remove rename detection, add explicit changelog recording on merges
Scott Chacon <schacon@gmail.com>
parents:
165
diff
changeset
|
747 files = [] |
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
|
748 branch = False |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
749 if len(split) == 2: |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
750 message, meta = split |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
751 lines = meta.split("\n") |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
752 for line in lines: |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
753 if line == '': |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
754 continue |
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
755 |
71
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
756 command, data = line.split(" : ", 1) |
181
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 if command == 'rename': |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
759 before, after = data.split(" => ", 1) |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
760 renames[after] = before |
19053d11d520
explicit renames converting both ways now
Scott Chacon <schacon@gmail.com>
parents:
70
diff
changeset
|
761 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
|
762 branch = data |
166
405a915bf352
remove rename detection, add explicit changelog recording on merges
Scott Chacon <schacon@gmail.com>
parents:
165
diff
changeset
|
763 if command == 'files': |
405a915bf352
remove rename detection, add explicit changelog recording on merges
Scott Chacon <schacon@gmail.com>
parents:
165
diff
changeset
|
764 files.append(data) |
168
8bfa8aa6b68f
added empty changelog handling
Scott Chacon <schacon@gmail.com>
parents:
166
diff
changeset
|
765 if command == 'emptychangelog': |
8bfa8aa6b68f
added empty changelog handling
Scott Chacon <schacon@gmail.com>
parents:
166
diff
changeset
|
766 files = False |
164
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
767 if command == 'extra': |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
768 before, after = data.split(" : ", 1) |
7e98757deadc
author and extra data fixes
Scott Chacon <schacon@gmail.com>
parents:
162
diff
changeset
|
769 extra[before] = urllib.unquote(after) |
166
405a915bf352
remove rename detection, add explicit changelog recording on merges
Scott Chacon <schacon@gmail.com>
parents:
165
diff
changeset
|
770 return (message, renames, branch, files, extra) |
181
8690377c3ce9
Various cleanups (mostly whitespace and imports)
Abderrahim Kitouni <a.kitouni@gmail.com>
parents:
179
diff
changeset
|
771 |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
772 def check_bookmarks(self): |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
773 if self.ui.config('extensions', 'hgext.bookmarks') is not None: |
65
5ed8316d3cfa
Start using reasonable ui.{status,debug,warn} calls instead of print.
Augie Fackler <durin42@gmail.com>
parents:
56
diff
changeset
|
774 self.ui.warn("YOU NEED TO SETUP BOOKMARKS\n") |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
775 |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
776 def get_transport_and_path(self, uri): |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
777 from dulwich.client import TCPGitClient, SSHGitClient, SubprocessGitClient |
35
562fc51b991e
we did the same thing, not sure why it conflicted
Scott Chacon <schacon@gmail.com>
parents:
29
diff
changeset
|
778 for handler, transport in (("git://", TCPGitClient), ("git@", SSHGitClient), ("git+ssh://", SSHGitClient)): |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
779 if uri.startswith(handler): |
26
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
780 if handler == 'git@': |
28 | 781 host, path = uri[len(handler):].split(":", 1) |
26
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
782 host = 'git@' + host |
28 | 783 else: |
35
562fc51b991e
we did the same thing, not sure why it conflicted
Scott Chacon <schacon@gmail.com>
parents:
29
diff
changeset
|
784 host, path = uri[len(handler):].split("/", 1) |
26
a1a5391bc3c3
edit ssh command to quote the path, also convert tags properly on fetch
Scott Chacon <schacon@gmail.com>
parents:
25
diff
changeset
|
785 return transport(host), '/' + path |
5
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
786 # if its not git or git+ssh, try a local url.. |
d6c443a91b18
refactored the git handling stuff out into another class
Scott Chacon <schacon@gmail.com>
parents:
diff
changeset
|
787 return SubprocessGitClient(), uri |