mercurial/localrepo.py
changeset 3500 bd8339976504
parent 3485 23cffef5d424
parent 3499 ceaa3fefc10c
child 3510 9383af6f236d
equal deleted inserted replaced
3493:e0db0b7934f2 3500:bd8339976504
    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"))
  1733         finally:
  1739         finally:
  1734             if cl:
  1740             if cl:
  1735                 cl.cleanup()
  1741                 cl.cleanup()
  1736 
  1742 
  1737         # make changelog see real files again
  1743         # make changelog see real files again
  1738         self.changelog = changelog.changelog(self.opener, self.changelog.version)
  1744         self.changelog = changelog.changelog(self.sopener,
       
  1745                                              self.changelog.version)
  1739         self.changelog.checkinlinesize(tr)
  1746         self.changelog.checkinlinesize(tr)
  1740 
  1747 
  1741         newheads = len(self.changelog.heads())
  1748         newheads = len(self.changelog.heads())
  1742         heads = ""
  1749         heads = ""
  1743         if oldheads and newheads != oldheads:
  1750         if oldheads and newheads != oldheads:
  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') %