comparison git_handler.py @ 21:13b9a020e382

gpush coming along. will now write blobs it doesn't have yet to git repo.
author Scott Chacon <schacon@gmail.com>
date Mon, 27 Apr 2009 12:26:44 -0700
parents 2be9c0bd88af
children f390f3d183e0
comparison
equal deleted inserted replaced
20:9a93e8b0ec64 21:13b9a020e382
29 git_dir = os.path.join(self.repo.path, 'git') 29 git_dir = os.path.join(self.repo.path, 'git')
30 self.git = Repo(git_dir) 30 self.git = Repo(git_dir)
31 31
32 ## FILE LOAD AND SAVE METHODS 32 ## FILE LOAD AND SAVE METHODS
33 33
34 def map_set(self, gitsha, hgsha):
35 self._map_git[gitsha] = hgsha
36 self._map_hg[hgsha] = gitsha
37
38 def map_hg_get(self, gitsha):
39 if gitsha in self._map_git:
40 return self._map_git[gitsha]
41 else:
42 return None
43
44 def map_git_get(self, hgsha):
45 if hgsha in self._map_hg:
46 return self._map_hg[hgsha]
47 else:
48 return None
49
34 def load_map(self): 50 def load_map(self):
35 self._map = {} 51 self._map_git = {}
52 self._map_hg = {}
36 if os.path.exists(self.repo.join('git-mapfile')): 53 if os.path.exists(self.repo.join('git-mapfile')):
37 for line in self.repo.opener('git-mapfile'): 54 for line in self.repo.opener('git-mapfile'):
38 gitsha, hgsha = line.strip().split(' ', 1) 55 gitsha, hgsha = line.strip().split(' ', 1)
39 self._map[gitsha] = hgsha 56 self._map_git[gitsha] = hgsha
57 self._map_hg[hgsha] = gitsha
40 58
41 def save_map(self): 59 def save_map(self):
42 file = self.repo.opener('git-mapfile', 'w+') 60 file = self.repo.opener('git-mapfile', 'w+')
43 for gitsha, hgsha in self._map.iteritems(): 61 for gitsha, hgsha in self._map_git.iteritems():
44 file.write("%s %s\n" % (gitsha, hgsha)) 62 file.write("%s %s\n" % (gitsha, hgsha))
45 file.close() 63 file.close()
46 64
47 def load_config(self): 65 def load_config(self):
48 self._config = {} 66 self._config = {}
79 self.save_config() 97 self.save_config()
80 98
81 def remote_name_to_url(self, remote_name): 99 def remote_name_to_url(self, remote_name):
82 return self._config['remote.' + remote_name + '.url'] 100 return self._config['remote.' + remote_name + '.url']
83 101
102 def export_git_objects(self):
103 print "exporting git objects"
104 for rev in self.repo.changelog:
105 node = self.repo.changelog.lookup(rev)
106 hgsha = hex(node)
107 git_sha = self.map_git_get(hgsha)
108 if not git_sha:
109 self.export_hg_commit(rev)
110
111 def export_hg_commit(self, rev):
112 # convert this commit into git objects
113 # go through the manifest, convert all blobs/trees we don't have
114 # write the commit object (with metadata info)
115 print "EXPORT"
116 node = self.repo.changelog.lookup(rev)
117 parents = self.repo.parents(rev)
118
119 print parents # TODO: make sure parents are converted first
120
121 ctx = self.repo.changectx(rev)
122 man = ctx.manifest()
123 for filename in man.keys():
124 print "WRITE BLOB/TREE OBJECT"
125 print filename
126 fctx = ctx.filectx(filename)
127 file_id = hex(fctx.filenode())
128 git_sha = self.map_git_get(file_id)
129 print git_sha
130
131 print fctx.data()
132 self.git.write_blob(fctx.data())
133
134 print "WRITE COMMIT OBJECT"
135 print ctx.user()
136 print ctx.date()
137 print ctx.description()
138 print ctx.branch()
139 print ctx.tags()
140
141
84 def remote_head(self, remote_name): 142 def remote_head(self, remote_name):
85 for head, sha in self.git.remote_refs(remote_name).iteritems(): 143 for head, sha in self.git.remote_refs(remote_name).iteritems():
86 if head == 'HEAD': 144 if head == 'HEAD':
87 return self._map[sha] 145 return self.map_hg_get(sha)
88 return None 146 return None
89 147
90 def upload_pack(self, remote_name): 148 def upload_pack(self, remote_name):
91 self.ui.status(_("upload pack\n")) 149 self.ui.status(_("upload pack\n"))
92 150
137 self.import_git_commit(commit) 195 self.import_git_commit(commit)
138 196
139 # update Hg bookmarks 197 # update Hg bookmarks
140 bms = {} 198 bms = {}
141 for head, sha in self.git.remote_refs(remote_name).iteritems(): 199 for head, sha in self.git.remote_refs(remote_name).iteritems():
142 hgsha = hex_to_sha(self._map[sha]) 200 hgsha = hex_to_sha(self.map_hg_get(sha))
143 if not head == 'HEAD': 201 if not head == 'HEAD':
144 bms[remote_name + '/' + head] = hgsha 202 bms[remote_name + '/' + head] = hgsha
145 if hasattr(self.repo, '_bookmarkcurrent'): 203 bookmarks.write(self.repo, bms)
146 bookmarks.write(self.repo, bms)
147 else:
148 self.repo.ui.warn('bookmarks are not enabled, not writing'
149 ' them out!')
150
151 204
152 def import_git_commit(self, commit): 205 def import_git_commit(self, commit):
153 print "importing: " + commit.id 206 print "importing: " + commit.id
154 207
155 # TODO : (?) have to handle merge contexts at some point (two parent files, etc) 208 # TODO : (?) have to handle merge contexts at some point (two parent files, etc)
160 213
161 p1 = "0" * 40 214 p1 = "0" * 40
162 p2 = "0" * 40 215 p2 = "0" * 40
163 if len(commit.parents) > 0: 216 if len(commit.parents) > 0:
164 sha = commit.parents[0] 217 sha = commit.parents[0]
165 p1 = self._map[sha] 218 p1 = self.map_hg_get(sha)
166 if len(commit.parents) > 1: 219 if len(commit.parents) > 1:
167 sha = commit.parents[1] 220 sha = commit.parents[1]
168 p2 = self._map[sha] 221 p2 = self.map_hg_get(sha)
169 if len(commit.parents) > 2: 222 if len(commit.parents) > 2:
170 # TODO : map extra parents to the extras file 223 # TODO : map extra parents to the extras file
171 pass 224 pass
172 225
173 files = self.git.get_files_changed(commit) 226 files = self.git.get_files_changed(commit)
183 236
184 # get changeset id 237 # get changeset id
185 p2 = hex(self.repo.changelog.tip()) 238 p2 = hex(self.repo.changelog.tip())
186 # save changeset to mapping file 239 # save changeset to mapping file
187 gitsha = commit.id 240 gitsha = commit.id
188 self._map[gitsha] = p2 241 self.map_set(gitsha, p2)
189 242
190 def getfilectx(self, source, repo, memctx, f): 243 def getfilectx(self, source, repo, memctx, f):
191 v = files[f] 244 v = files[f]
192 data = source.getfile(f, v) 245 data = source.getfile(f, v)
193 e = source.getmode(f, v) 246 e = source.getmode(f, v)
194 return context.memfilectx(f, data, 'l' in e, 'x' in e, copies.get(f)) 247 return context.memfilectx(f, data, 'l' in e, 'x' in e, copies.get(f))
195
196 def export_git_objects(self):
197 pass
198 248
199 def check_bookmarks(self): 249 def check_bookmarks(self):
200 if self.ui.config('extensions', 'hgext.bookmarks') is not None: 250 if self.ui.config('extensions', 'hgext.bookmarks') is not None:
201 print "YOU NEED TO SETUP BOOKMARKS" 251 print "YOU NEED TO SETUP BOOKMARKS"
202 252