mercurial/localrepo.py
changeset 3500 bd8339976504
parent 3485 23cffef5d424
parent 3499 ceaa3fefc10c
child 3510 9383af6f236d
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -47,6 +47,7 @@ class localrepository(repo.repository):
         self.origroot = path
         self.ui = ui.ui(parentui=parentui)
         self.opener = util.opener(self.path)
+        self.sopener = util.opener(self.path)
         self.wopener = util.opener(self.root)
 
         try:
@@ -66,8 +67,8 @@ class localrepository(repo.repository):
             flags = revlog.REVLOG_DEFAULT_FLAGS
 
         v = self.revlogversion | flags
-        self.manifest = manifest.manifest(self.opener, v)
-        self.changelog = changelog.changelog(self.opener, v)
+        self.manifest = manifest.manifest(self.sopener, v)
+        self.changelog = changelog.changelog(self.sopener, v)
 
         # the changelog might not have the inline index flag
         # on.  If the format of the changelog is the same as found in
@@ -245,17 +246,16 @@ class localrepository(repo.repository):
             # taking precedence
             heads = self.heads()
             heads.reverse()
-            fl = self.file(".hgtags")
+            seen = {}
             for node in heads:
-                change = self.changelog.read(node)
-                rev = self.changelog.rev(node)
-                fn, ff = self.manifest.find(change[0], '.hgtags')
-                if fn is None: continue
+                f = self.filectx('.hgtags', node)
+                if not f or f.filerev() in seen: continue
+                seen[f.filerev()] = 1
                 count = 0
-                for l in fl.read(fn).splitlines():
+                for l in f.data().splitlines():
                     count += 1
-                    parsetag(l, _(".hgtags (rev %d:%s), line %d") %
-                             (rev, short(node), count))
+                    parsetag(l, _("%s, line %d") % (str(f), count))
+
             try:
                 f = self.opener("localtags")
                 count = 0
@@ -344,14 +344,17 @@ class localrepository(repo.repository):
             key = self.dirstate.parents()[0]
             if key == nullid:
                 raise repo.RepoError(_("no revision checked out"))
+        n = self.changelog._match(key)
+        if n:
+            return n
         if key in self.tags():
             return self.tags()[key]
         if key in self.branchtags():
             return self.branchtags()[key]
-        try:
-            return self.changelog.lookup(key)
-        except:
-            raise repo.RepoError(_("unknown revision '%s'") % key)
+        n = self.changelog._partialmatch(key)
+        if n:
+            return n
+        raise repo.RepoError(_("unknown revision '%s'") % key)
 
     def dev(self):
         return os.lstat(self.path).st_dev
@@ -362,13 +365,16 @@ class localrepository(repo.repository):
     def join(self, f):
         return os.path.join(self.path, f)
 
+    def sjoin(self, f):
+        return os.path.join(self.path, f)
+
     def wjoin(self, f):
         return os.path.join(self.root, f)
 
     def file(self, f):
         if f[0] == '/':
             f = f[1:]
-        return filelog.filelog(self.opener, f, self.revlogversion)
+        return filelog.filelog(self.sopener, f, self.revlogversion)
 
     def changectx(self, changeid=None):
         return context.changectx(self, changeid)
@@ -448,17 +454,17 @@ class localrepository(repo.repository):
             ds = ""
         self.opener("journal.dirstate", "w").write(ds)
 
-        tr = transaction.transaction(self.ui.warn, self.opener,
-                                       self.join("journal"),
+        tr = transaction.transaction(self.ui.warn, self.sopener,
+                                       self.sjoin("journal"),
                                        aftertrans(self.path))
         self.transhandle = tr
         return tr
 
     def recover(self):
         l = self.lock()
-        if os.path.exists(self.join("journal")):
+        if os.path.exists(self.sjoin("journal")):
             self.ui.status(_("rolling back interrupted transaction\n"))
-            transaction.rollback(self.opener, self.join("journal"))
+            transaction.rollback(self.sopener, self.sjoin("journal"))
             self.reload()
             return True
         else:
@@ -469,9 +475,9 @@ class localrepository(repo.repository):
         if not wlock:
             wlock = self.wlock()
         l = self.lock()
-        if os.path.exists(self.join("undo")):
+        if os.path.exists(self.sjoin("undo")):
             self.ui.status(_("rolling back last transaction\n"))
-            transaction.rollback(self.opener, self.join("undo"))
+            transaction.rollback(self.sopener, self.sjoin("undo"))
             util.rename(self.join("undo.dirstate"), self.join("dirstate"))
             self.reload()
             self.wreload()
@@ -490,26 +496,25 @@ class localrepository(repo.repository):
     def do_lock(self, lockname, wait, releasefn=None, acquirefn=None,
                 desc=None):
         try:
-            l = lock.lock(self.join(lockname), 0, releasefn, desc=desc)
+            l = lock.lock(lockname, 0, releasefn, desc=desc)
         except lock.LockHeld, inst:
             if not wait:
                 raise
             self.ui.warn(_("waiting for lock on %s held by %s\n") %
                          (desc, inst.args[0]))
             # default to 600 seconds timeout
-            l = lock.lock(self.join(lockname),
-                          int(self.ui.config("ui", "timeout") or 600),
+            l = lock.lock(lockname, int(self.ui.config("ui", "timeout", "600")),
                           releasefn, desc=desc)
         if acquirefn:
             acquirefn()
         return l
 
     def lock(self, wait=1):
-        return self.do_lock("lock", wait, acquirefn=self.reload,
+        return self.do_lock(self.sjoin("lock"), wait, acquirefn=self.reload,
                             desc=_('repository %s') % self.origroot)
 
     def wlock(self, wait=1):
-        return self.do_lock("wlock", wait, self.dirstate.write,
+        return self.do_lock(self.join("wlock"), wait, self.dirstate.write,
                             self.wreload,
                             desc=_('working directory of %s') % self.origroot)
 
@@ -1692,7 +1697,8 @@ class localrepository(repo.repository):
         # inconsistent view
         cl = None
         try:
-            cl = appendfile.appendchangelog(self.opener, self.changelog.version)
+            cl = appendfile.appendchangelog(self.sopener,
+                                            self.changelog.version)
 
             oldheads = len(cl.heads())
 
@@ -1735,7 +1741,8 @@ class localrepository(repo.repository):
                 cl.cleanup()
 
         # make changelog see real files again
-        self.changelog = changelog.changelog(self.opener, self.changelog.version)
+        self.changelog = changelog.changelog(self.sopener,
+                                             self.changelog.version)
         self.changelog.checkinlinesize(tr)
 
         newheads = len(self.changelog.heads())
@@ -1779,7 +1786,7 @@ class localrepository(repo.repository):
             name, size = fp.readline().split('\0', 1)
             size = int(size)
             self.ui.debug('adding %s (%s)\n' % (name, util.bytecount(size)))
-            ofp = self.opener(name, 'w')
+            ofp = self.sopener(name, 'w')
             for chunk in util.filechunkiter(fp, limit=size):
                 ofp.write(chunk)
             ofp.close()