You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2013/04/06 01:05:28 UTC

svn commit: r1465153 - in /subversion/trunk/subversion: include/svn_fs.h include/svn_repos.h libsvn_fs/fs-loader.c libsvn_fs/fs-loader.h libsvn_fs_base/fs.c libsvn_fs_fs/fs.c libsvn_fs_fs/fs_fs.c libsvn_fs_fs/tree.h tests/libsvn_fs/fs-test.c

Author: danielsh
Date: Fri Apr  5 23:05:27 2013
New Revision: 1465153

URL: http://svn.apache.org/r1465153
Log:
Redesign and implement "fetch filesystem info".

Introduce a new function, svn_fs_info_format(), and delete from svn_fs_info_t
members for which retrieval functions already exist.

* subversion/include/svn_fs.h
  (svn_fs_info_format): New declaration.
  (svn_fs_info_t): Trim some members, as described above.

* subversion/include/svn_repos.h
  (svn_repos_info_format): Add cross-reference to svn_fs_info_format().

* subversion/libsvn_fs/fs-loader.c
  (svn_fs_info_format): New definition.

* subversion/libsvn_fs/fs-loader.h
  (fs_vtable_t.info_format): New vtable member.

* subversion/libsvn_fs_base/fs.c
  (base_bdb_info_format): New function.
  (fs_vtable): Wire it in.

* subversion/libsvn_fs_fs/tree.h
  (svn_fs_fs__info_format): New declaration.

* subversion/libsvn_fs_fs/fs.c
  (fs_vtable_t): Wire it in.

* subversion/libsvn_fs_fs/fs_fs.c
  (svn_version.h): Include.
  (svn_fs_fs__info_format): New definition.

* subversion/tests/libsvn_fs/fs-test.c
  (svn_version.h): Include.
  (test_fs_info_format): New test.
  (test_funcs): Run it.

Modified:
    subversion/trunk/subversion/include/svn_fs.h
    subversion/trunk/subversion/include/svn_repos.h
    subversion/trunk/subversion/libsvn_fs/fs-loader.c
    subversion/trunk/subversion/libsvn_fs/fs-loader.h
    subversion/trunk/subversion/libsvn_fs_base/fs.c
    subversion/trunk/subversion/libsvn_fs_fs/fs.c
    subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
    subversion/trunk/subversion/libsvn_fs_fs/tree.h
    subversion/trunk/subversion/tests/libsvn_fs/fs-test.c

Modified: subversion/trunk/subversion/include/svn_fs.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_fs.h?rev=1465153&r1=1465152&r2=1465153&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_fs.h (original)
+++ subversion/trunk/subversion/include/svn_fs.h Fri Apr  5 23:05:27 2013
@@ -2040,6 +2040,28 @@ svn_fs_youngest_rev(svn_revnum_t *younge
                     apr_pool_t *pool);
 
 
+/**
+ * Return filesystem format information for @a fs.
+ *
+ * Set @a *fs_format to the filesystem format number of @a fs, which is
+ * an integer that increases when incompatible changes are made (such as
+ * by #svn_fs_upgrade).
+ *
+ * Set @a *supports_version to the version number of the minimum Subversion GA
+ * release that can read and write @a fs.
+ *
+ * @see svn_repos_info_format()
+ *
+ * @since New in 1.8.
+ */
+svn_error_t *
+svn_fs_info_format(int *fs_format,
+                   svn_version_t **supports_version,
+                   svn_fs_t *fs,
+                   apr_pool_t *result_pool,
+                   apr_pool_t *scratch_pool);
+
+
 /** Provide filesystem @a fs the opportunity to compress storage relating to
  * associated with  @a revision in filesystem @a fs.  Use @a pool for all
  * allocations.
@@ -2517,23 +2539,6 @@ svn_fs_verify_root(svn_fs_root_t *root,
  */
 typedef struct svn_fs_info_t {
 
-  /** @see svn_fs_type() */
-  const char *fs_type;
-
-  /** @see svn_fs_get_uuid() */
-  const char *uuid;
-
-  /** @see svn_fs_youngest_rev() */
-  svn_revnum_t youngest;
-
-  /** Filesystem format number: an integer that increases when incompatible
-   * changes are made (such as by #svn_fs_upgrade). */
-  int fs_format;
-
-  /** The oldest Subversion GA release that can read and write this
-   * filesystem. */
-  svn_version_t *supports_version;
-
 #if 0
   /* Potential future feature. */
   svn_boolean_t is_write_locked;

Modified: subversion/trunk/subversion/include/svn_repos.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_repos.h?rev=1465153&r1=1465152&r2=1465153&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_repos.h (original)
+++ subversion/trunk/subversion/include/svn_repos.h Fri Apr  5 23:05:27 2013
@@ -2496,6 +2496,8 @@ svn_repos_node_from_baton(void *edit_bat
  * Set @a *supports_version to the version number of the minimum Subversion GA
  * release that can read and write @a repos.
  *
+ * @see svn_fs_info_format()
+ *
  * @since New in 1.8.
  */
 svn_error_t *

Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.c?rev=1465153&r1=1465152&r2=1465153&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.c Fri Apr  5 23:05:27 2013
@@ -1307,6 +1307,18 @@ svn_fs_youngest_rev(svn_revnum_t *younge
 }
 
 svn_error_t *
+svn_fs_info_format(int *fs_format,
+                   svn_version_t **supports_version,
+                   svn_fs_t *fs,
+                   apr_pool_t *result_pool,
+                   apr_pool_t *scratch_pool)
+{
+  return svn_error_trace(fs->vtable->info_format(fs_format, supports_version,
+                                                 fs,
+                                                 result_pool, scratch_pool));
+}
+
+svn_error_t *
 svn_fs_deltify_revision(svn_fs_t *fs, svn_revnum_t revision, apr_pool_t *pool)
 {
   return svn_error_trace(fs->vtable->deltify(fs, revision, pool));

Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.h?rev=1465153&r1=1465152&r2=1465153&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.h (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.h Fri Apr  5 23:05:27 2013
@@ -212,6 +212,11 @@ typedef struct fs_vtable_t
                             svn_fs_get_locks_callback_t get_locks_func,
                             void *get_locks_baton,
                             apr_pool_t *pool);
+  svn_error_t *(*info_format)(int *fs_format,
+                              svn_version_t **supports_version,
+                              svn_fs_t *fs,
+                              apr_pool_t *result_pool,
+                              apr_pool_t *scratch_pool);
   svn_error_t *(*verify_root)(svn_fs_root_t *root,
                               apr_pool_t *pool);
   svn_error_t *(*freeze)(svn_fs_t *fs,

Modified: subversion/trunk/subversion/libsvn_fs_base/fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/fs.c?rev=1465153&r1=1465152&r2=1465153&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/fs.c Fri Apr  5 23:05:27 2013
@@ -471,6 +471,46 @@ bdb_write_config(svn_fs_t *fs)
 }
 
 static svn_error_t *
+base_bdb_info_format(int *fs_format,
+                     svn_version_t **supports_version,
+                     svn_fs_t *fs,
+                     apr_pool_t *result_pool,
+                     apr_pool_t *scratch_pool)
+{
+  base_fs_data_t *bfd = fs->fsap_data;
+
+  *fs_format = bfd->format;
+  *supports_version = apr_palloc(result_pool, sizeof(svn_version_t));
+
+  (*supports_version)->major = SVN_VER_MAJOR;
+  (*supports_version)->minor = 0;
+  (*supports_version)->patch = 0;
+  (*supports_version)->tag = "";
+
+  switch (bfd->format)
+    {
+    case 1:
+      break;
+    case 2:
+      (*supports_version)->minor = 4;
+      break;
+    case 3:
+      (*supports_version)->minor = 5;
+      break;
+    case 4:
+      (*supports_version)->minor = 6;
+      break;
+#ifdef SVN_DEBUG
+# if SVN_FS_BASE__FORMAT_NUMBER != 4
+#  error "Need to add a 'case' statement here"
+# endif
+#endif
+    }
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
 base_bdb_verify_root(svn_fs_root_t *root,
                      apr_pool_t *scratch_pool)
 {
@@ -507,6 +547,7 @@ static fs_vtable_t fs_vtable = {
   svn_fs_base__unlock,
   svn_fs_base__get_lock,
   svn_fs_base__get_locks,
+  base_bdb_info_format,
   base_bdb_verify_root,
   base_bdb_freeze,
   base_bdb_set_errcall,

Modified: subversion/trunk/subversion/libsvn_fs_fs/fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs.c?rev=1465153&r1=1465152&r2=1465153&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs.c Fri Apr  5 23:05:27 2013
@@ -184,6 +184,7 @@ static fs_vtable_t fs_vtable = {
   svn_fs_fs__unlock,
   svn_fs_fs__get_lock,
   svn_fs_fs__get_locks,
+  svn_fs_fs__info_format,
   svn_fs_fs__verify_root,
   fs_freeze,
   fs_set_errcall

Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c?rev=1465153&r1=1465152&r2=1465153&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Fri Apr  5 23:05:27 2013
@@ -49,6 +49,7 @@
 #include "svn_mergeinfo.h"
 #include "svn_config.h"
 #include "svn_ctype.h"
+#include "svn_version.h"
 
 #include "fs.h"
 #include "tree.h"
@@ -11466,3 +11467,48 @@ svn_fs_fs__hotcopy(svn_fs_t *src_fs,
 
   return SVN_NO_ERROR;
 }
+
+svn_error_t *
+svn_fs_fs__info_format(int *fs_format,
+                       svn_version_t **supports_version,
+                       svn_fs_t *fs,
+                       apr_pool_t *result_pool,
+                       apr_pool_t *scratch_pool)
+{
+  fs_fs_data_t *ffd = fs->fsap_data;
+  *fs_format = ffd->format;
+  *supports_version = apr_palloc(result_pool, sizeof(svn_version_t));
+
+  (*supports_version)->major = SVN_VER_MAJOR;
+  (*supports_version)->minor = 1;
+  (*supports_version)->patch = 0;
+  (*supports_version)->tag = "";
+
+  switch (ffd->format)
+    {
+    case 1:
+      break;
+    case 2:
+      (*supports_version)->minor = 4;
+      break;
+    case 3:
+      (*supports_version)->minor = 5;
+      break;
+    case 4:
+      (*supports_version)->minor = 6;
+      break;
+    case 5:
+      return svn_error_create(SVN_ERR_FS_UNSUPPORTED_FORMAT, NULL,
+                              _("FSFS format 5 was never released"));
+    case 6:
+      (*supports_version)->minor = 8;
+      break;
+#ifdef SVN_DEBUG
+# if SVN_FS_FS__FORMAT_NUMBER != 6
+#  error "Need to add a 'case' statement here"
+# endif
+#endif
+    }
+
+  return SVN_NO_ERROR;
+}

Modified: subversion/trunk/subversion/libsvn_fs_fs/tree.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/tree.h?rev=1465153&r1=1465152&r2=1465153&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/tree.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/tree.h Fri Apr  5 23:05:27 2013
@@ -91,6 +91,13 @@ svn_error_t *
 svn_fs_fs__verify_root(svn_fs_root_t *root,
                        apr_pool_t *pool);
 
+svn_error_t *
+svn_fs_fs__info_format(int *fs_format,
+                       svn_version_t **supports_version,
+                       svn_fs_t *fs,
+                       apr_pool_t *result_pool,
+                       apr_pool_t *scratch_pool);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/trunk/subversion/tests/libsvn_fs/fs-test.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_fs/fs-test.c?rev=1465153&r1=1465152&r2=1465153&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_fs/fs-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_fs/fs-test.c Fri Apr  5 23:05:27 2013
@@ -34,6 +34,7 @@
 #include "svn_checksum.h"
 #include "svn_mergeinfo.h"
 #include "svn_props.h"
+#include "svn_version.h"
 
 #include "private/svn_fs_private.h"
 
@@ -4983,6 +4984,26 @@ filename_trailing_newline(const svn_test
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+test_fs_info_format(const svn_test_opts_t *opts,
+                    apr_pool_t *pool)
+{
+  svn_fs_t *fs;
+  int fs_format;
+  svn_version_t *supports_version;
+  svn_version_t v1_5_0 = {1, 5, 0, ""};
+  svn_test_opts_t opts2;
+
+  opts2 = *opts;
+  opts2.server_minor_version = 5;
+
+  SVN_ERR(svn_test__create_fs(&fs, "test-fs-format-info", &opts2, pool));
+  SVN_ERR(svn_fs_info_format(&fs_format, &supports_version, fs, pool, pool));
+  SVN_TEST_ASSERT(fs_format == 3); /* happens to be the same for FSFS and BDB */
+  SVN_TEST_ASSERT(svn_ver_equal(supports_version, &v1_5_0));
+
+  return SVN_NO_ERROR;
+}
 
 /* ------------------------------------------------------------------------ */
 
@@ -5066,5 +5087,7 @@ struct svn_test_descriptor_t test_funcs[
                        "test svn_fs_delete_fs"),
     SVN_TEST_OPTS_PASS(filename_trailing_newline,
                        "filenames with trailing \\n might be rejected"),
+    SVN_TEST_OPTS_PASS(test_fs_info_format,
+                       "test svn_fs_info_format"),
     SVN_TEST_NULL
   };