You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2011/08/17 21:27:28 UTC

svn commit: r1158879 - in /subversion/branches/fs-py/subversion: libsvn_fs_py/fs_fs.c python/svn/fs/__init__.py

Author: hwright
Date: Wed Aug 17 19:27:28 2011
New Revision: 1158879

URL: http://svn.apache.org/viewvc?rev=1158879&view=rev
Log:
On the fs-py branch:
Move the remaining "open a FS" logic into Python.

* subversion/python/svn/fs/__init__.py
  (_read_format): Moved here...
  (FS._read_format): ...from here.
  (_check_format): New.
  (FS._open_fs): Finish opening the filesystem.

* subversion/libsvn_fs_py/fs_fs.c
  (svn_fs_py__open): Just delegate to the Python method.

Modified:
    subversion/branches/fs-py/subversion/libsvn_fs_py/fs_fs.c
    subversion/branches/fs-py/subversion/python/svn/fs/__init__.py

Modified: subversion/branches/fs-py/subversion/libsvn_fs_py/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_fs_py/fs_fs.c?rev=1158879&r1=1158878&r2=1158879&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/libsvn_fs_py/fs_fs.c (original)
+++ subversion/branches/fs-py/subversion/libsvn_fs_py/fs_fs.c Wed Aug 17 19:27:28 2011
@@ -1243,8 +1243,6 @@ svn_error_t *
 svn_fs_py__open(svn_fs_t *fs, const char *path, apr_pool_t *pool)
 {
   fs_fs_data_t *ffd = fs->fsap_data;
-  int format;
-  int max_files_per_dir;
 
   fs->path = apr_pstrdup(fs->pool, path);
 
@@ -1253,18 +1251,6 @@ svn_fs_py__open(svn_fs_t *fs, const char
   apr_pool_cleanup_register(fs->pool, ffd->p_fs, svn_fs_py__destroy_py_object,
                             apr_pool_cleanup_null);
 
-  /* Read the FS format number. */
-  SVN_ERR(read_format(&format, &max_files_per_dir,
-                      path_format(fs, pool), pool));
-  SVN_ERR(check_format(format));
-
-  /* Read the min unpacked revision. */
-  if (format >= SVN_FS_FS__MIN_PACKED_FORMAT)
-    SVN_ERR(update_min_unpacked_rev(fs, pool));
-
-  /* Read the configuration file. */
-  SVN_ERR(read_config(fs, pool));
-
   return SVN_NO_ERROR;
 }
 

Modified: subversion/branches/fs-py/subversion/python/svn/fs/__init__.py
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/python/svn/fs/__init__.py?rev=1158879&r1=1158878&r2=1158879&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/python/svn/fs/__init__.py (original)
+++ subversion/branches/fs-py/subversion/python/svn/fs/__init__.py Wed Aug 17 19:27:28 2011
@@ -54,6 +54,7 @@ MIN_PROTOREVS_DIR_FORMAT            = 3
 MIN_NO_GLOBAL_IDS_FORMAT            = 3
 MIN_PACKED_FORMAT                   = 4
 MIN_REP_SHARING_FORMAT              = 4
+PACKED_REVPROP_SQLITE_DEV_FORMAT    = 5
 
 _DEFAULT_MAX_FILES_PER_DIR = 1000
 _TIMESTAMP_FORMAT = '%Y-%m-%dT%H:%M:%S.%fZ'
@@ -113,6 +114,25 @@ _DEFAULT_CONFIG_CONTENTS = \
        CONFIG_OPTION_ENABLE_REP_SHARING)
 
 
+def _read_format(path):
+    try:
+        with open(path, 'rb') as f:
+            format = int(f.readline())
+            max_files_per_dir = 0
+            for l in f:
+                l = l.split()
+                if format > MIN_LAYOUT_FORMAT_OPTION_FORMAT \
+                        and l[0] == 'layout':
+                    if l[1] == 'linear':
+                        max_files_per_dir = 0
+                    elif l[1] == 'sharded':
+                        max_files_per_dir = int(l[2])
+        return (format, max_files_per_dir)
+    except IOError:
+        # Treat an absent format file as format 1.
+        return (1, 0)
+
+
 def _write_format(path, format, max_files_per_dir, overwrite=True):
     assert 1 <= format and format <= FORMAT_NUMBER
 
@@ -138,6 +158,30 @@ def _write_format(path, format, max_file
     os.chmod(path, stat.S_IREAD)
 
 
+def _check_format(format):
+    '''Return the error svn.err.FS_UNSUPPORTED_FORMAT if FS's format
+    number is not the same as a format number supported by this
+    Subversion.'''
+
+    # Blacklist.  These formats may be either younger or older than
+    # SVN_FS_FS__FORMAT_NUMBER, but we don't support them.
+    if format is PACKED_REVPROP_SQLITE_DEV_FORMAT:
+        raise svn.SubversionException(svn.err.FS_UNSUPPORTED_FORMAT,
+                                      "Found format '%d', only created by " +
+                                      "unreleased dev builds; see " +
+                                      "http://subversion.apache.org" +
+                                      "/docs/release-notes/1.7#revprop-packing"
+                                       % format)
+
+    #  We support all formats from 1-current simultaneously
+    if 1 <= format <= FORMAT_NUMBER:
+        return
+
+    raise svn.SubversionException(svn.err.FS_UNSUPPORTED_FORMAT,
+                "Expected FS format between '1' and '%d'; found format '%d'" %
+                (FORMAT_NUMBER, format))
+
+
 class FS(object):
     def __path_rev_shard(self, rev):
         assert self.max_files_per_dir
@@ -249,25 +293,6 @@ class FS(object):
         os.rename(tempf.name, final_path)
 
 
-    def __read_format(self):
-        try:
-            with open(self.__path_format, 'rb') as f:
-                self.format = int(f.readline())
-                self.max_files_per_dir = 0
-                for l in f:
-                    l = l.split()
-                    if self.format > MIN_LAYOUT_FORMAT_OPTION_FORMAT \
-                            and l[0] == 'layout':
-                        if l[1] == 'linear':
-                            self.max_files_per_dir = 0
-                        elif l[1] == 'sharded':
-                            self.max_files_per_dir = int(l[2])
-        except IOError:
-            # Treat an absent format file as format 1.
-            self.format = 1
-            self.max_files_per_dir = 0
-
-
     def __update_min_unpacked_rev(self):
         assert self.format >= MIN_PACKED_FORMAT
         with open(self.__path_min_unpacked_rev, 'rb') as f:
@@ -370,12 +395,19 @@ class FS(object):
         with open(self.__path_uuid, 'rb') as f:
             self.uuid = uuid.UUID(f.readline().rstrip())
 
-        self.__read_format()
+        # Read the FS format number.
+        (self.format, self.max_files_per_dir) = _read_format(self.__path_format)
+        _check_format(self.format)
+
+        # Read the min unpacked revision.
         if self.format >= MIN_PACKED_FORMAT:
             self.__update_min_unpacked_rev()
 
         self._youngest_rev_cache = self._get_youngest()
 
+        # Read the configuration file
+        self._read_config()
+
 
     def __setup_paths(self):
         self.__path_uuid = os.path.join(self.path, PATH_UUID)