[PATCH 09 of 13] Py3k localrepo fixes; WIP

Alejandro Santos alejolp at alejolp.com
Wed Aug 5 15:55:43 CDT 2009


# HG changeset patch
# User Alejandro Santos <alejolp at alejolp.com>
# Date 1249505636 10800
# Node ID 7e7aba33a25ebfe2afd1c15ec866c97d2ed511bb
# Parent  33bef15b45baf422fb233d40b723905e7f810e18
Py3k localrepo fixes; WIP

diff -r 33bef15b45ba -r 7e7aba33a25e mercurial/context.py
--- a/mercurial/context.py	Wed Aug 05 17:53:56 2009 -0300
+++ b/mercurial/context.py	Wed Aug 05 17:53:56 2009 -0300
@@ -8,7 +8,7 @@
 from node import nullid, nullrev, short, hex
 from i18n import _
 import ancestor, bdiff, error, util, subrepo
-import os, errno
+import os, sys, errno
 
 propertycache = util.propertycache
 
@@ -512,7 +512,8 @@
         if 'branch' not in self._extra:
             branch = self._repo.dirstate.branch()
             try:
-                branch = branch.decode('UTF-8').encode('UTF-8')
+                if sys.version_info[0] == 2:
+                    branch = branch.decode('UTF-8').encode('UTF-8')
             except UnicodeDecodeError:
                 raise util.Abort(_('branch name not in UTF-8!'))
             self._extra['branch'] = branch
diff -r 33bef15b45ba -r 7e7aba33a25e mercurial/dirstate.py
--- a/mercurial/dirstate.py	Wed Aug 05 17:53:56 2009 -0300
+++ b/mercurial/dirstate.py	Wed Aug 05 17:53:56 2009 -0300
@@ -381,11 +381,12 @@
         if gran > 0:
             limit = util.fstat(st).st_mtime - gran
 
-        cs = cStringIO.StringIO()
+        cs = []
         copymap = self._copymap
         pack = struct.pack
-        write = cs.write
-        write("".join(self._pl))
+        write = cs.append
+        for p in self._pl:
+            write(p)
         for f, e in self._map.iteritems():
             if f in copymap:
                 f = "%s\0%s" % (f, copymap[f])
@@ -394,7 +395,12 @@
             e = pack(_format, e[0], e[1], e[2], e[3], len(f))
             write(e)
             write(f)
-        st.write(cs.getvalue())
+        if sys.version_info[0] == 2:
+            for e in cs:
+                st.write(e)
+        else:
+            for e in cs:
+                st.write(type(e) is str and e.encode('utf-8') or e)
         st.rename()
         self._dirty = self._dirtypl = False
 
diff -r 33bef15b45ba -r 7e7aba33a25e mercurial/localrepo.py
--- a/mercurial/localrepo.py	Wed Aug 05 17:53:56 2009 -0300
+++ b/mercurial/localrepo.py	Wed Aug 05 17:53:56 2009 -0300
@@ -15,7 +15,7 @@
 import merge as merge_
 import tags as tags_
 from lock import release
-import weakref, stat, errno, os, time, inspect
+import weakref, stat, errno, os, time, inspect, sys
 propertycache = util.propertycache
 
 class localrepository(repo.repository):
@@ -50,28 +50,15 @@
                     if self.ui.configbool('format', 'usefncache', True):
                         requirements.append("fncache")
                     # create an invalid changelog
-                    self.opener("00changelog.i", "a").write(
-                        '\0\0\0\2' # represents revlogv2
-                        ' dummy changelog to prevent using the old repo layout'
-                    )
-                reqfile = self.opener("requires", "w")
-                for r in requirements:
-                    reqfile.write("%s\n" % r)
-                reqfile.close()
+                    self._writeinvalidchangelog()
+                self._writerequirementsfile(requirements)
             else:
                 raise error.RepoError(_("repository %s not found") % path)
         elif create:
             raise error.RepoError(_("repository %s already exists") % path)
         else:
             # find requirements
-            requirements = set()
-            try:
-                requirements = set(self.opener("requires").read().splitlines())
-            except IOError, inst:
-                if inst.errno != errno.ENOENT:
-                    raise
-            for r in requirements - self.supported:
-                raise error.RepoError(_("requirement '%s' not supported") % r)
+            requirements = self._findrequirements()
 
         self.sharedpath = self.path
         try:
@@ -106,6 +93,34 @@
         self._datafilters = {}
         self._transref = self._lockref = self._wlockref = None
 
+    def _writeinvalidchangelog(self):
+        f = self.opener("00changelog.i", "a")
+        f.write('\0\0\0\2'.encode('ascii')) # represents revlogv2
+        f.write((' dummy changelog to prevent using the '
+            'old repo layout').encode('utf-8'))
+        f.close()
+ 
+    def _writerequirementsfile(self, requirements):
+        reqfile = self.opener("requires", "w")
+        for r in requirements:
+            reqfile.write(("%s\n" % r).encode('utf-8'))
+        reqfile.close()
+
+    def _findrequirements(self):
+        requirements = set()
+        try:
+            requirements = self.opener("requires").read()
+            if sys.version_info[0] == 3:
+                requirements = requirements.decode('utf-8')
+            requirements = set(requirements.splitlines())
+
+        except IOError, inst:
+            if inst.errno != errno.ENOENT:
+                raise
+        for r in requirements - self.supported:
+            raise error.RepoError(_("requirement '%s' not supported") % r)
+        return requirements
+
     @propertycache
     def changelog(self):
         c = changelog.changelog(self.sopener)


More information about the Mercurial-devel mailing list