181 svn_url = self.base + module |
181 svn_url = self.base + module |
182 self.ui.debug("reparent to %s\n" % svn_url.encode(self.encoding)) |
182 self.ui.debug("reparent to %s\n" % svn_url.encode(self.encoding)) |
183 svn.ra.reparent(self.ra, svn_url.encode(self.encoding)) |
183 svn.ra.reparent(self.ra, svn_url.encode(self.encoding)) |
184 |
184 |
185 def _fetch_revisions(self, from_revnum = 0, to_revnum = 347, module=None): |
185 def _fetch_revisions(self, from_revnum = 0, to_revnum = 347, module=None): |
186 # batching is broken for branches |
|
187 to_revnum = 0 |
|
188 if not hasattr(self, 'child_rev'): |
|
189 self.child_rev = from_revnum |
|
190 self.child_cset = self.commits.get(self.child_rev) |
|
191 else: |
|
192 self.commits[self.child_rev] = self.child_cset |
|
193 # batching broken |
|
194 return |
|
195 # if the branch was created in the middle of the last batch, |
|
196 # svn log will complain that the path doesn't exist in this batch |
|
197 # so we roll the parser back to the last revision where this branch appeared |
|
198 revnum = self.revnum(self.child_rev) |
|
199 if revnum > from_revnum: |
|
200 from_revnum = revnum |
|
201 |
|
202 self.ui.note('fetching revision log from %d to %d\n' % \ |
|
203 (from_revnum, to_revnum)) |
|
204 |
|
205 def get_entry_from_path(path, module=self.module): |
186 def get_entry_from_path(path, module=self.module): |
206 # Given the repository url of this wc, say |
187 # Given the repository url of this wc, say |
207 # "http://server/plone/CMFPlone/branches/Plone-2_0-branch" |
188 # "http://server/plone/CMFPlone/branches/Plone-2_0-branch" |
208 # extract the "entry" portion (a relative path) from what |
189 # extract the "entry" portion (a relative path) from what |
209 # svn log --xml says, ie |
190 # svn log --xml says, ie |
219 |
200 |
220 # The path is outside our tracked tree... |
201 # The path is outside our tracked tree... |
221 self.ui.debug('Ignoring %r since it is not under %r\n' % (path, module)) |
202 self.ui.debug('Ignoring %r since it is not under %r\n' % (path, module)) |
222 return None |
203 return None |
223 |
204 |
|
205 self.child_cset = None |
224 def parselogentry(*arg, **args): |
206 def parselogentry(*arg, **args): |
225 orig_paths, revnum, author, date, message, pool = arg |
207 orig_paths, revnum, author, date, message, pool = arg |
226 orig_paths = svn_paths(orig_paths) |
208 orig_paths = svn_paths(orig_paths) |
227 |
209 |
228 if self.is_blacklisted(revnum): |
210 if self.is_blacklisted(revnum): |
254 branch = None |
236 branch = None |
255 |
237 |
256 for path in orig_paths: |
238 for path in orig_paths: |
257 # self.ui.write("path %s\n" % path) |
239 # self.ui.write("path %s\n" % path) |
258 if path == self.module: # Follow branching back in history |
240 if path == self.module: # Follow branching back in history |
259 import pdb |
|
260 pdb.set_trace() |
|
261 ent = orig_paths[path] |
241 ent = orig_paths[path] |
262 if ent: |
242 if ent: |
263 if ent.copyfrom_path: |
243 if ent.copyfrom_path: |
264 self.modulemap[ent.copyfrom_rev] = ent.copyfrom_path |
244 # ent.copyfrom_rev may not be the actual last revision |
265 parents = [self.rev(ent.copyfrom_rev, ent.copyfrom_path)] |
245 prev = self.latest(ent.copyfrom_path, revnum) |
|
246 self.modulemap[prev] = ent.copyfrom_path |
|
247 parents = [self.rev(prev, ent.copyfrom_path)] |
266 else: |
248 else: |
267 self.ui.debug("No copyfrom path, don't know what to do.\n") |
249 self.ui.debug("No copyfrom path, don't know what to do.\n") |
268 # Maybe it was added and there is no more history. |
250 # Maybe it was added and there is no more history. |
269 entrypath = get_entry_from_path(path, module=self.module) |
251 entrypath = get_entry_from_path(path, module=self.module) |
270 # self.ui.write("entrypath %s\n" % entrypath) |
252 # self.ui.write("entrypath %s\n" % entrypath) |
438 desc=log, |
420 desc=log, |
439 parents=parents, |
421 parents=parents, |
440 copies=copies, |
422 copies=copies, |
441 branch=branch) |
423 branch=branch) |
442 |
424 |
443 if self.child_cset and self.child_rev != rev: |
425 self.commits[rev] = cset |
|
426 if self.child_cset and not self.child_cset.parents: |
444 self.child_cset.parents = [rev] |
427 self.child_cset.parents = [rev] |
445 self.commits[self.child_rev] = self.child_cset |
|
446 self.child_cset = cset |
428 self.child_cset = cset |
447 self.child_rev = rev |
429 |
|
430 self.ui.note('fetching revision log from %d to %d\n' % \ |
|
431 (from_revnum, to_revnum)) |
448 |
432 |
449 if module is None: |
433 if module is None: |
450 module = self.module |
434 module = self.module |
451 try: |
435 try: |
452 discover_changed_paths = True |
436 discover_changed_paths = True |
512 |
496 |
513 def getcommit(self, rev): |
497 def getcommit(self, rev): |
514 if rev not in self.commits: |
498 if rev not in self.commits: |
515 uuid, module, revnum = self.revsplit(rev) |
499 uuid, module, revnum = self.revsplit(rev) |
516 minrev = revnum - LOG_BATCH_SIZE > 0 and revnum - LOG_BATCH_SIZE or 0 |
500 minrev = revnum - LOG_BATCH_SIZE > 0 and revnum - LOG_BATCH_SIZE or 0 |
517 self._fetch_revisions(from_revnum=revnum, to_revnum=minrev, |
501 self._fetch_revisions(from_revnum=revnum, to_revnum=0, |
518 module=module) |
502 module=module) |
519 return self.commits[rev] |
503 return self.commits[rev] |
520 |
504 |
521 def gettags(self): |
505 def gettags(self): |
522 return [] |
506 tags = {} |
|
507 def parselogentry(*arg, **args): |
|
508 orig_paths, revnum, author, date, message, pool = arg |
|
509 orig_paths = svn_paths(orig_paths) |
|
510 for path in orig_paths: |
|
511 ent = orig_paths[path] |
|
512 source = ent.copyfrom_path |
|
513 rev = ent.copyfrom_rev |
|
514 tag = path.split('/', 2)[2] |
|
515 tags[tag] = self.rev(rev, module=source) |
|
516 |
|
517 start = self.revnum(self.head) |
|
518 try: |
|
519 svn.ra.get_log(self.ra, ['/tags'], start, 0, 1, True, False, |
|
520 parselogentry) |
|
521 return tags |
|
522 except SubversionException: |
|
523 self.ui.note('no tags found at revision %d\n' % start) |
|
524 return {} |
523 |
525 |
524 def _find_children(self, path, revnum): |
526 def _find_children(self, path, revnum): |
525 path = path.strip("/") |
527 path = path.strip("/") |
526 |
528 |
527 def _find_children_fallback(path, revnum): |
529 def _find_children_fallback(path, revnum): |