45 |
45 |
46 self.root = os.path.abspath(path) |
46 self.root = os.path.abspath(path) |
47 self.origroot = path |
47 self.origroot = path |
48 self.ui = ui.ui(parentui=parentui) |
48 self.ui = ui.ui(parentui=parentui) |
49 self.opener = util.opener(self.path) |
49 self.opener = util.opener(self.path) |
|
50 self.sopener = util.opener(self.path) |
50 self.wopener = util.opener(self.root) |
51 self.wopener = util.opener(self.root) |
51 |
52 |
52 try: |
53 try: |
53 self.ui.readconfig(self.join("hgrc"), self.root) |
54 self.ui.readconfig(self.join("hgrc"), self.root) |
54 except IOError: |
55 except IOError: |
64 flags |= revlog.flagstr(x) |
65 flags |= revlog.flagstr(x) |
65 elif self.revlogv1: |
66 elif self.revlogv1: |
66 flags = revlog.REVLOG_DEFAULT_FLAGS |
67 flags = revlog.REVLOG_DEFAULT_FLAGS |
67 |
68 |
68 v = self.revlogversion | flags |
69 v = self.revlogversion | flags |
69 self.manifest = manifest.manifest(self.opener, v) |
70 self.manifest = manifest.manifest(self.sopener, v) |
70 self.changelog = changelog.changelog(self.opener, v) |
71 self.changelog = changelog.changelog(self.sopener, v) |
71 |
72 |
72 # the changelog might not have the inline index flag |
73 # the changelog might not have the inline index flag |
73 # on. If the format of the changelog is the same as found in |
74 # on. If the format of the changelog is the same as found in |
74 # .hgrc, apply any flags found in the .hgrc as well. |
75 # .hgrc, apply any flags found in the .hgrc as well. |
75 # Otherwise, just version from the changelog |
76 # Otherwise, just version from the changelog |
243 # read the tags file from each head, ending with the tip, |
244 # read the tags file from each head, ending with the tip, |
244 # and add each tag found to the map, with "newer" ones |
245 # and add each tag found to the map, with "newer" ones |
245 # taking precedence |
246 # taking precedence |
246 heads = self.heads() |
247 heads = self.heads() |
247 heads.reverse() |
248 heads.reverse() |
248 fl = self.file(".hgtags") |
249 seen = {} |
249 for node in heads: |
250 for node in heads: |
250 change = self.changelog.read(node) |
251 f = self.filectx('.hgtags', node) |
251 rev = self.changelog.rev(node) |
252 if not f or f.filerev() in seen: continue |
252 fn, ff = self.manifest.find(change[0], '.hgtags') |
253 seen[f.filerev()] = 1 |
253 if fn is None: continue |
|
254 count = 0 |
254 count = 0 |
255 for l in fl.read(fn).splitlines(): |
255 for l in f.data().splitlines(): |
256 count += 1 |
256 count += 1 |
257 parsetag(l, _(".hgtags (rev %d:%s), line %d") % |
257 parsetag(l, _("%s, line %d") % (str(f), count)) |
258 (rev, short(node), count)) |
258 |
259 try: |
259 try: |
260 f = self.opener("localtags") |
260 f = self.opener("localtags") |
261 count = 0 |
261 count = 0 |
262 for l in f: |
262 for l in f: |
263 count += 1 |
263 count += 1 |
342 def lookup(self, key): |
342 def lookup(self, key): |
343 if key == '.': |
343 if key == '.': |
344 key = self.dirstate.parents()[0] |
344 key = self.dirstate.parents()[0] |
345 if key == nullid: |
345 if key == nullid: |
346 raise repo.RepoError(_("no revision checked out")) |
346 raise repo.RepoError(_("no revision checked out")) |
|
347 n = self.changelog._match(key) |
|
348 if n: |
|
349 return n |
347 if key in self.tags(): |
350 if key in self.tags(): |
348 return self.tags()[key] |
351 return self.tags()[key] |
349 if key in self.branchtags(): |
352 if key in self.branchtags(): |
350 return self.branchtags()[key] |
353 return self.branchtags()[key] |
351 try: |
354 n = self.changelog._partialmatch(key) |
352 return self.changelog.lookup(key) |
355 if n: |
353 except: |
356 return n |
354 raise repo.RepoError(_("unknown revision '%s'") % key) |
357 raise repo.RepoError(_("unknown revision '%s'") % key) |
355 |
358 |
356 def dev(self): |
359 def dev(self): |
357 return os.lstat(self.path).st_dev |
360 return os.lstat(self.path).st_dev |
358 |
361 |
359 def local(self): |
362 def local(self): |
360 return True |
363 return True |
361 |
364 |
362 def join(self, f): |
365 def join(self, f): |
|
366 return os.path.join(self.path, f) |
|
367 |
|
368 def sjoin(self, f): |
363 return os.path.join(self.path, f) |
369 return os.path.join(self.path, f) |
364 |
370 |
365 def wjoin(self, f): |
371 def wjoin(self, f): |
366 return os.path.join(self.root, f) |
372 return os.path.join(self.root, f) |
367 |
373 |
368 def file(self, f): |
374 def file(self, f): |
369 if f[0] == '/': |
375 if f[0] == '/': |
370 f = f[1:] |
376 f = f[1:] |
371 return filelog.filelog(self.opener, f, self.revlogversion) |
377 return filelog.filelog(self.sopener, f, self.revlogversion) |
372 |
378 |
373 def changectx(self, changeid=None): |
379 def changectx(self, changeid=None): |
374 return context.changectx(self, changeid) |
380 return context.changectx(self, changeid) |
375 |
381 |
376 def workingctx(self): |
382 def workingctx(self): |
446 ds = self.opener("dirstate").read() |
452 ds = self.opener("dirstate").read() |
447 except IOError: |
453 except IOError: |
448 ds = "" |
454 ds = "" |
449 self.opener("journal.dirstate", "w").write(ds) |
455 self.opener("journal.dirstate", "w").write(ds) |
450 |
456 |
451 tr = transaction.transaction(self.ui.warn, self.opener, |
457 tr = transaction.transaction(self.ui.warn, self.sopener, |
452 self.join("journal"), |
458 self.sjoin("journal"), |
453 aftertrans(self.path)) |
459 aftertrans(self.path)) |
454 self.transhandle = tr |
460 self.transhandle = tr |
455 return tr |
461 return tr |
456 |
462 |
457 def recover(self): |
463 def recover(self): |
458 l = self.lock() |
464 l = self.lock() |
459 if os.path.exists(self.join("journal")): |
465 if os.path.exists(self.sjoin("journal")): |
460 self.ui.status(_("rolling back interrupted transaction\n")) |
466 self.ui.status(_("rolling back interrupted transaction\n")) |
461 transaction.rollback(self.opener, self.join("journal")) |
467 transaction.rollback(self.sopener, self.sjoin("journal")) |
462 self.reload() |
468 self.reload() |
463 return True |
469 return True |
464 else: |
470 else: |
465 self.ui.warn(_("no interrupted transaction available\n")) |
471 self.ui.warn(_("no interrupted transaction available\n")) |
466 return False |
472 return False |
467 |
473 |
468 def rollback(self, wlock=None): |
474 def rollback(self, wlock=None): |
469 if not wlock: |
475 if not wlock: |
470 wlock = self.wlock() |
476 wlock = self.wlock() |
471 l = self.lock() |
477 l = self.lock() |
472 if os.path.exists(self.join("undo")): |
478 if os.path.exists(self.sjoin("undo")): |
473 self.ui.status(_("rolling back last transaction\n")) |
479 self.ui.status(_("rolling back last transaction\n")) |
474 transaction.rollback(self.opener, self.join("undo")) |
480 transaction.rollback(self.sopener, self.sjoin("undo")) |
475 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
481 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
476 self.reload() |
482 self.reload() |
477 self.wreload() |
483 self.wreload() |
478 else: |
484 else: |
479 self.ui.warn(_("no rollback information available\n")) |
485 self.ui.warn(_("no rollback information available\n")) |
488 self.nodetagscache = None |
494 self.nodetagscache = None |
489 |
495 |
490 def do_lock(self, lockname, wait, releasefn=None, acquirefn=None, |
496 def do_lock(self, lockname, wait, releasefn=None, acquirefn=None, |
491 desc=None): |
497 desc=None): |
492 try: |
498 try: |
493 l = lock.lock(self.join(lockname), 0, releasefn, desc=desc) |
499 l = lock.lock(lockname, 0, releasefn, desc=desc) |
494 except lock.LockHeld, inst: |
500 except lock.LockHeld, inst: |
495 if not wait: |
501 if not wait: |
496 raise |
502 raise |
497 self.ui.warn(_("waiting for lock on %s held by %s\n") % |
503 self.ui.warn(_("waiting for lock on %s held by %s\n") % |
498 (desc, inst.args[0])) |
504 (desc, inst.args[0])) |
499 # default to 600 seconds timeout |
505 # default to 600 seconds timeout |
500 l = lock.lock(self.join(lockname), |
506 l = lock.lock(lockname, int(self.ui.config("ui", "timeout", "600")), |
501 int(self.ui.config("ui", "timeout") or 600), |
|
502 releasefn, desc=desc) |
507 releasefn, desc=desc) |
503 if acquirefn: |
508 if acquirefn: |
504 acquirefn() |
509 acquirefn() |
505 return l |
510 return l |
506 |
511 |
507 def lock(self, wait=1): |
512 def lock(self, wait=1): |
508 return self.do_lock("lock", wait, acquirefn=self.reload, |
513 return self.do_lock(self.sjoin("lock"), wait, acquirefn=self.reload, |
509 desc=_('repository %s') % self.origroot) |
514 desc=_('repository %s') % self.origroot) |
510 |
515 |
511 def wlock(self, wait=1): |
516 def wlock(self, wait=1): |
512 return self.do_lock("wlock", wait, self.dirstate.write, |
517 return self.do_lock(self.join("wlock"), wait, self.dirstate.write, |
513 self.wreload, |
518 self.wreload, |
514 desc=_('working directory of %s') % self.origroot) |
519 desc=_('working directory of %s') % self.origroot) |
515 |
520 |
516 def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist): |
521 def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist): |
517 """ |
522 """ |
1690 |
1695 |
1691 # write changelog data to temp files so concurrent readers will not see |
1696 # write changelog data to temp files so concurrent readers will not see |
1692 # inconsistent view |
1697 # inconsistent view |
1693 cl = None |
1698 cl = None |
1694 try: |
1699 try: |
1695 cl = appendfile.appendchangelog(self.opener, self.changelog.version) |
1700 cl = appendfile.appendchangelog(self.sopener, |
|
1701 self.changelog.version) |
1696 |
1702 |
1697 oldheads = len(cl.heads()) |
1703 oldheads = len(cl.heads()) |
1698 |
1704 |
1699 # pull off the changeset group |
1705 # pull off the changeset group |
1700 self.ui.status(_("adding changesets\n")) |
1706 self.ui.status(_("adding changesets\n")) |
1777 start = time.time() |
1784 start = time.time() |
1778 for i in xrange(total_files): |
1785 for i in xrange(total_files): |
1779 name, size = fp.readline().split('\0', 1) |
1786 name, size = fp.readline().split('\0', 1) |
1780 size = int(size) |
1787 size = int(size) |
1781 self.ui.debug('adding %s (%s)\n' % (name, util.bytecount(size))) |
1788 self.ui.debug('adding %s (%s)\n' % (name, util.bytecount(size))) |
1782 ofp = self.opener(name, 'w') |
1789 ofp = self.sopener(name, 'w') |
1783 for chunk in util.filechunkiter(fp, limit=size): |
1790 for chunk in util.filechunkiter(fp, limit=size): |
1784 ofp.write(chunk) |
1791 ofp.write(chunk) |
1785 ofp.close() |
1792 ofp.close() |
1786 elapsed = time.time() - start |
1793 elapsed = time.time() - start |
1787 self.ui.status(_('transferred %s in %.1f seconds (%s/sec)\n') % |
1794 self.ui.status(_('transferred %s in %.1f seconds (%s/sec)\n') % |