You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2015/12/03 19:51:30 UTC

svn commit: r1717829 - in /subversion/branches/ra-git/subversion/libsvn_fs_git: fs_git.h git-revroot.c svn_git.c svn_git.h

Author: rhuijben
Date: Thu Dec  3 18:51:30 2015
New Revision: 1717829

URL: http://svn.apache.org/viewvc?rev=1717829&view=rev
Log:
On the ra-git branch: Extract a few more git structure helper functions to
svn_git.c

* subversion/libsvn_fs_git/fs_git.h
  (svn_fs_git__wrap_git_error,
   svn_fs_git__wrap_git_error,
   svn_fs_git__read_only_error,
   GIT2_ERR): Move to svn_git.h

* subversion/libsvn_fs_git/git-revroot.c
  (relpath_reverse_split,
   find_tree_entry): Move to svn_git.c
  (*): Update caller.

* subversion/libsvn_fs_git/svn_git.c
  (includes): Add svn_dirent_uri.h. Remove fs_git.h
  (svn_git__copy_commit,
   svn_git__commit_parent): New function
  (relpath_reverse_split,
  (svn_git__find_tree_entry): Move here from git-revroot.c
  (svn_git__commit_tree_entry): New function.

* subversion/libsvn_fs_git/svn_git.h

Modified:
    subversion/branches/ra-git/subversion/libsvn_fs_git/fs_git.h
    subversion/branches/ra-git/subversion/libsvn_fs_git/git-revroot.c
    subversion/branches/ra-git/subversion/libsvn_fs_git/svn_git.c
    subversion/branches/ra-git/subversion/libsvn_fs_git/svn_git.h

Modified: subversion/branches/ra-git/subversion/libsvn_fs_git/fs_git.h
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_fs_git/fs_git.h?rev=1717829&r1=1717828&r2=1717829&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/libsvn_fs_git/fs_git.h (original)
+++ subversion/branches/ra-git/subversion/libsvn_fs_git/fs_git.h Thu Dec  3 18:51:30 2015
@@ -28,24 +28,6 @@
 #ifndef SVN_LIBSVN_FS__FS_GIT_H
 #define SVN_LIBSVN_FS__FS_GIT_H
 
-svn_error_t *
-svn_fs_git__wrap_git_error(void);
-
-#define svn_fs_git__wrap_git_error() \
-          svn_error_trace(svn_fs_git__wrap_git_error())
-
-#define svn_fs_git__read_only_error()                                         \
-          svn_error_create(SVN_ERR_FS_REP_NOT_MUTABLE, NULL,                  \
-                           _("The Subversion git filesystem doesn't support " \
-                             "write operations"))
-
-#define GIT2_ERR(expr)                        \
-  do {                                        \
-    int svn_err__git_temp = (expr);           \
-    if (svn_err__git_temp)                    \
-      return svn_fs_git__wrap_git_error();    \
-  } while (0)
-
 typedef struct svn_fs_git_fs_t
 {
   git_repository *repos;

Modified: subversion/branches/ra-git/subversion/libsvn_fs_git/git-revroot.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_fs_git/git-revroot.c?rev=1717829&r1=1717828&r2=1717829&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/libsvn_fs_git/git-revroot.c (original)
+++ subversion/branches/ra-git/subversion/libsvn_fs_git/git-revroot.c Thu Dec  3 18:51:30 2015
@@ -127,32 +127,6 @@ make_fspath(const char *relpath, apr_poo
   return apr_pstrcat(result_pool, "/", relpath, SVN_VA_NULL);
 }
 
-/* svn_relpath_split, but then for the first component instead of the last */
-static svn_error_t *
-relpath_reverse_split(const char **root, const char **remaining,
-                      const char *relpath,
-                      apr_pool_t *result_pool)
-{
-  const char *ch = strchr(relpath, '/');
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(relpath));
-
-  if (!ch)
-    {
-      if (root)
-        *root = apr_pstrdup(result_pool, relpath);
-      if (remaining)
-        *remaining = "";
-    }
-  else
-    {
-      if (root)
-        *root = apr_pstrmemdup(result_pool, relpath, ch - relpath);
-      if (remaining)
-        *remaining = apr_pstrdup(result_pool, ch + 1);
-    }
-  return SVN_NO_ERROR;
-}
-
 static svn_error_t *
 find_commit(const git_commit **commit, svn_fs_root_t *root,
             const git_oid *oid, apr_pool_t *result_pool)
@@ -163,52 +137,6 @@ find_commit(const git_commit **commit, s
     svn_git__commit_lookup(commit, fgf->repos, oid, result_pool));
 }
 
-static svn_error_t *
-find_tree_entry(const git_tree_entry **entry, git_tree *tree,
-                const char *relpath,
-                apr_pool_t *result_pool, apr_pool_t *scratch_pool)
-{
-  const char *basename, *tail;
-  const git_tree_entry *e;
-
-  SVN_ERR(relpath_reverse_split(&basename, &tail, relpath, scratch_pool));
-
-  e = git_tree_entry_byname(tree, basename);
-  if (e && !*tail)
-    {
-      *entry = e;
-      return SVN_NO_ERROR;
-    }
-  else if (!e)
-    {
-      *entry = NULL;
-      return SVN_NO_ERROR;
-    }
-
-  switch (git_tree_entry_type(e))
-    {
-      case GIT_OBJ_TREE:
-        {
-          git_object *obj;
-          git_tree *sub_tree;
-
-          SVN_ERR(svn_git__tree_entry_to_object(&obj, tree, e, result_pool));
-
-          sub_tree = (git_tree*)obj;
-
-          SVN_ERR(find_tree_entry(entry, sub_tree, tail,
-                                  result_pool, scratch_pool));
-          break;
-        }
-      case GIT_OBJ_BLOB:
-        *entry = NULL;
-        break;
-      default:
-        SVN_ERR_MALFUNCTION();
-    }
-
-  return SVN_NO_ERROR;
-}
 
 static svn_error_t *
 find_branch(const git_commit **commit, const char **relpath,
@@ -523,7 +451,7 @@ fs_git_check_path(svn_node_kind_t *kind_
     }
 
   SVN_ERR(svn_git__commit_tree(&tree, commit, pool));
-  SVN_ERR(find_tree_entry(&entry, tree, relpath, pool, pool));
+  SVN_ERR(svn_git__find_tree_entry(&entry, tree, relpath, pool, pool));
 
   if (!entry)
     *kind_p = svn_node_none;
@@ -592,7 +520,8 @@ fs_git_node_history(svn_fs_history_t **h
     }
 
   SVN_ERR(svn_git__commit_tree(&tree, commit, scratch_pool));
-  SVN_ERR(find_tree_entry(&entry, tree, relpath, scratch_pool, scratch_pool));
+  SVN_ERR(svn_git__find_tree_entry(&entry, tree, relpath,
+                                   scratch_pool, scratch_pool));
 
   if (!entry)
     return SVN_FS__NOT_FOUND(root, path);
@@ -681,10 +610,10 @@ fs_git_node_relation(svn_fs_node_relatio
   SVN_ERR(svn_git__commit_tree(&tree_a, commit_a, scratch_pool));
   SVN_ERR(svn_git__commit_tree(&tree_b, commit_b, scratch_pool));
 
-  SVN_ERR(find_tree_entry(&entry_a, tree_a, relpath_a,
-                          scratch_pool, scratch_pool));
-  SVN_ERR(find_tree_entry(&entry_b, tree_b, relpath_b,
-                          scratch_pool, scratch_pool));
+  SVN_ERR(svn_git__find_tree_entry(&entry_a, tree_a, relpath_a,
+                                   scratch_pool, scratch_pool));
+  SVN_ERR(svn_git__find_tree_entry(&entry_b, tree_b, relpath_b,
+                                   scratch_pool, scratch_pool));
 
   if (!entry_a || !entry_b)
     {
@@ -713,7 +642,6 @@ fs_git_node_created_rev(svn_revnum_t *re
   svn_fs_git_root_t *fgr = root->fsap_data;
   const git_commit *rev_commit;
   const char *relpath;
-  git_tree *rev_tree;
   git_tree_entry *rev_entry;
   apr_pool_t *iterpool;
   git_oid oid, last_oid;
@@ -743,8 +671,8 @@ fs_git_node_created_rev(svn_revnum_t *re
     }
   iterpool = svn_pool_create(pool);
 
-  SVN_ERR(svn_git__commit_tree(&rev_tree, rev_commit, iterpool));
-  SVN_ERR(find_tree_entry(&rev_entry, rev_tree, relpath, pool, iterpool));
+  SVN_ERR(svn_git__commit_tree_entry(&rev_entry, rev_commit, relpath,
+                                   pool, iterpool));
 
   last_oid = *git_commit_id(rev_commit);
   oid_p = git_commit_parent_id(rev_commit, 0);
@@ -753,17 +681,14 @@ fs_git_node_created_rev(svn_revnum_t *re
   while (oid_p)
     {
       const git_commit *cmt;
-      git_tree *cmt_tree;
       git_tree_entry *cmt_entry;
 
       svn_pool_clear(iterpool);
 
       SVN_ERR(find_commit(&cmt, root, oid_p, iterpool));
 
-      SVN_ERR(svn_git__commit_tree(&cmt_tree, cmt, iterpool));
-
-      SVN_ERR(find_tree_entry(&cmt_entry, cmt_tree, relpath,
-                              iterpool, iterpool));
+      SVN_ERR(svn_git__commit_tree_entry(&cmt_entry, cmt, relpath,
+                                         iterpool, iterpool));
 
       if (!cmt_entry || git_oid_cmp(git_tree_entry_id(rev_entry),
                                     git_tree_entry_id(cmt_entry)))
@@ -994,7 +919,8 @@ fs_git_dir_entries(apr_hash_t **entries_
       const git_tree_entry *entry;
       git_object *obj;
 
-      SVN_ERR(find_tree_entry(&entry, tree, relpath, pool, pool));
+      SVN_ERR(svn_git__find_tree_entry(&entry, tree, relpath,
+                                       pool, pool));
 
       if (!entry || git_tree_entry_type(entry) != GIT_OBJ_TREE)
         return SVN_FS__ERR_NOT_DIRECTORY(root->fs, path);
@@ -1071,7 +997,7 @@ fs_git_file_length(svn_filesize_t *lengt
 
   SVN_ERR(svn_git__commit_tree(&tree, commit, pool));
 
-  SVN_ERR(find_tree_entry(&entry, tree, relpath, pool, pool));
+  SVN_ERR(svn_git__find_tree_entry(&entry, tree, relpath, pool, pool));
 
   if (!entry || git_tree_entry_type(entry) != GIT_OBJ_BLOB)
     return SVN_FS__ERR_NOT_FILE(root->fs, path);
@@ -1096,7 +1022,6 @@ fs_git_file_checksum(svn_checksum_t **ch
                      const char *path, apr_pool_t *pool)
 {
   const git_commit *commit;
-  git_tree *tree;
   git_tree_entry *entry;
   const char *relpath;
 
@@ -1105,9 +1030,8 @@ fs_git_file_checksum(svn_checksum_t **ch
   if (!commit)
     return SVN_FS__ERR_NOT_FILE(root->fs, path);
 
-  SVN_ERR(svn_git__commit_tree(&tree, commit, pool));
-
-  SVN_ERR(find_tree_entry(&entry, tree, relpath, pool, pool));
+  SVN_ERR(svn_git__commit_tree_entry(&entry, commit, relpath,
+                                      pool, pool));
 
   if (!entry || git_tree_entry_type(entry) != GIT_OBJ_BLOB)
     return SVN_FS__ERR_NOT_FILE(root->fs, path);
@@ -1130,7 +1054,6 @@ fs_git_file_contents(svn_stream_t **cont
                      apr_pool_t *pool)
 {
   const git_commit *commit;
-  git_tree *tree;
   git_tree_entry *entry;
   const char *relpath;
 
@@ -1139,9 +1062,8 @@ fs_git_file_contents(svn_stream_t **cont
   if (!commit)
     return SVN_FS__ERR_NOT_FILE(root->fs, path);
 
-  SVN_ERR(svn_git__commit_tree(&tree, commit, pool));
-
-  SVN_ERR(find_tree_entry(&entry, tree, relpath, pool, pool));
+  SVN_ERR(svn_git__commit_tree_entry(&entry, commit, relpath,
+                                      pool, pool));
 
   if (!entry || git_tree_entry_type(entry) != GIT_OBJ_BLOB)
     return SVN_FS__ERR_NOT_FILE(root->fs, path);
@@ -1207,7 +1129,6 @@ fs_git_contents_changed(int *changed_p,
 {
   const git_commit *commit_a, *commit_b;
   const char *relpath_a, *relpath_b;
-  git_tree *tree_a, *tree_b;
   const git_tree_entry *entry_a, *entry_b;
 
   SVN_ERR(find_branch(&commit_a, &relpath_a, root_a, path_a, scratch_pool));
@@ -1218,13 +1139,10 @@ fs_git_contents_changed(int *changed_p,
   else if (!commit_b)
     return SVN_FS__ERR_NOT_FILE(root_b->fs, path_b);
 
-  SVN_ERR(svn_git__commit_tree(&tree_a, commit_a, scratch_pool));
-  SVN_ERR(svn_git__commit_tree(&tree_b, commit_b, scratch_pool));
-
-  SVN_ERR(find_tree_entry(&entry_a, tree_a, relpath_a,
-                          scratch_pool, scratch_pool));
-  SVN_ERR(find_tree_entry(&entry_b, tree_b, relpath_b,
-                          scratch_pool, scratch_pool));
+  SVN_ERR(svn_git__commit_tree_entry(&entry_a, commit_a, relpath_a,
+                                     scratch_pool, scratch_pool));
+  SVN_ERR(svn_git__commit_tree_entry(&entry_b, commit_b, relpath_b,
+                                     scratch_pool, scratch_pool));
 
   if (!entry_a)
     return SVN_FS__ERR_NOT_FILE(root_a->fs, path_a);

Modified: subversion/branches/ra-git/subversion/libsvn_fs_git/svn_git.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_fs_git/svn_git.c?rev=1717829&r1=1717828&r2=1717829&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/libsvn_fs_git/svn_git.c (original)
+++ subversion/branches/ra-git/subversion/libsvn_fs_git/svn_git.c Thu Dec  3 18:51:30 2015
@@ -20,7 +20,8 @@
  * ====================================================================
  */
 
-#include "fs_git.h"
+#include "svn_dirent_uri.h"
+
 #include "svn_git.h"
 
 #define DECLARE_GIT_CLEANUP(type,func)              \
@@ -94,6 +95,45 @@ svn_git__commit_lookup(const git_commit
 }
 
 svn_error_t *
+svn_git__copy_commit(const git_commit **commit_p,
+                     const git_commit *commit,
+                     apr_pool_t *result_pool)
+{
+  git_object *object;
+  git_commit *cmt;
+
+  /* libgit2 objects are reference counted... so this
+     is just syntactic sugar over an increment value */
+
+  GIT2_ERR(git_object_dup(&object, (git_object*)commit));
+
+  cmt = (git_commit*)object;
+
+  if (object)
+    GIT_RELEASE_AT_CLEANUP(git_commit, cmt, result_pool);
+
+  *commit_p = cmt;
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_git__commit_parent(const git_commit **commit_p,
+                       const git_commit *commit,
+                       int idx,
+                       apr_pool_t *result_pool)
+{
+  git_commit *parent_cmt;
+
+  GIT2_ERR(git_commit_parent(&parent_cmt, commit, idx));
+
+  if (parent_cmt)
+    GIT_RELEASE_AT_CLEANUP(git_commit, parent_cmt, result_pool);
+
+  *commit_p = parent_cmt;
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
 svn_git__commit_tree(const git_tree **tree_p,
                      const git_commit *commit,
                      apr_pool_t *result_pool)
@@ -128,3 +168,99 @@ svn_git__tree_entry_to_object(const git_
 
   return SVN_NO_ERROR;
 }
+
+/* svn_relpath_split, but then for the first component instead of the last */
+static svn_error_t *
+relpath_reverse_split(const char **root, const char **remaining,
+                      const char *relpath,
+                      apr_pool_t *result_pool)
+{
+  const char *ch = strchr(relpath, '/');
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(relpath));
+
+  if (!ch)
+    {
+      if (root)
+        *root = apr_pstrdup(result_pool, relpath);
+      if (remaining)
+        *remaining = "";
+    }
+  else
+    {
+      if (root)
+        *root = apr_pstrmemdup(result_pool, relpath, ch - relpath);
+      if (remaining)
+        *remaining = apr_pstrdup(result_pool, ch + 1);
+    }
+  return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_git__find_tree_entry(const git_tree_entry **entry, git_tree *tree,
+                         const char *relpath,
+                         apr_pool_t *result_pool, apr_pool_t *scratch_pool)
+{
+  const char *basename, *tail;
+  const git_tree_entry *e;
+
+  SVN_ERR(relpath_reverse_split(&basename, &tail, relpath, scratch_pool));
+
+  e = git_tree_entry_byname(tree, basename);
+  if (e && !*tail)
+    {
+      *entry = e;
+      return SVN_NO_ERROR;
+    }
+  else if (!e)
+    {
+      *entry = NULL;
+      return SVN_NO_ERROR;
+    }
+
+  switch (git_tree_entry_type(e))
+    {
+      case GIT_OBJ_TREE:
+        {
+          git_object *obj;
+          git_tree *sub_tree;
+
+          SVN_ERR(svn_git__tree_entry_to_object(&obj, tree, e, result_pool));
+
+          sub_tree = (git_tree*)obj;
+
+          SVN_ERR(svn_git__find_tree_entry(entry, sub_tree, tail,
+                                           result_pool, scratch_pool));
+          break;
+        }
+      case GIT_OBJ_BLOB:
+        *entry = NULL;
+        break;
+      default:
+        SVN_ERR_MALFUNCTION();
+    }
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_git__commit_tree_entry(const git_tree_entry **entry_p,
+                           const git_commit *commit,
+                           const char *relpath,
+                           apr_pool_t *result_pool,
+                           apr_pool_t *scratch_pool)
+{
+  git_tree *tree;
+
+  SVN_ERR(svn_git__commit_tree(&tree, commit, result_pool));
+  if (!tree)
+    {
+      /* Corrupt commit */
+      *entry_p = NULL;
+      return SVN_NO_ERROR;
+    }
+  SVN_ERR(svn_git__find_tree_entry(entry_p, tree, relpath,
+                                   result_pool, scratch_pool));
+
+  return SVN_NO_ERROR;
+}

Modified: subversion/branches/ra-git/subversion/libsvn_fs_git/svn_git.h
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_fs_git/svn_git.h?rev=1717829&r1=1717828&r2=1717829&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/libsvn_fs_git/svn_git.h (original)
+++ subversion/branches/ra-git/subversion/libsvn_fs_git/svn_git.h Thu Dec  3 18:51:30 2015
@@ -30,6 +30,25 @@
 #ifndef SVN_LIBSVN_FS__SVN_GIT_H
 #define SVN_LIBSVN_FS__SVN_GIT_H
 
+svn_error_t *
+svn_fs_git__wrap_git_error(void);
+
+#define svn_fs_git__wrap_git_error() \
+          svn_error_trace(svn_fs_git__wrap_git_error())
+
+#define svn_fs_git__read_only_error()                                         \
+          svn_error_create(SVN_ERR_FS_REP_NOT_MUTABLE, NULL,                  \
+                           _("The Subversion git filesystem doesn't support " \
+                             "write operations"))
+
+#define GIT2_ERR(expr)                        \
+  do {                                        \
+    int svn_err__git_temp = (expr);           \
+    if (svn_err__git_temp)                    \
+      return svn_fs_git__wrap_git_error();    \
+  } while (0)
+
+
 
 /* Like git_repository_open() but lifetime limited by pool */
 svn_error_t *
@@ -46,11 +65,24 @@ svn_git__repository_init(const git_repos
 
 /* Like git_commit_lookup() but lifetime limited by pool */
 svn_error_t *
-svn_git__commit_lookup(const git_commit **commit,
+svn_git__commit_lookup(const git_commit **commit_,
                        git_repository *repo,
                        const git_oid *id,
                        apr_pool_t *result_pool);
 
+/* Like git_commit_parent() but lifetime limited by pool */
+svn_error_t *
+svn_git__commit_parent(const git_commit **commit_p,
+                       const git_commit *commit,
+                       int idx,
+                       apr_pool_t *result_pool);
+
+/* Makes (copy of) commit live as long as result_pool */
+svn_error_t *
+svn_git__copy_commit(const git_commit **commit_p,
+                     const git_commit *commit,
+                     apr_pool_t *result_pool);
+
 /* Like git_commit_tree() but lifetime limited by pool */
 svn_error_t *
 svn_git__commit_tree(const git_tree **tree_p,
@@ -64,5 +96,18 @@ svn_git__tree_entry_to_object(const git_
                               const git_tree_entry *entry,
                               apr_pool_t *result_pool);
 
+svn_error_t *
+svn_git__find_tree_entry(const git_tree_entry **entry, git_tree *tree,
+                         const char *relpath,
+                         apr_pool_t *result_pool, apr_pool_t *scratch_pool);
+
+/* Combination of svn_git__commit_tree() + svn_git__find_tree_entry() */
+svn_error_t *
+svn_git__commit_tree_entry(const git_tree_entry **entry_p,
+                           const git_commit *commit,
+                           const char *relpath,
+                           apr_pool_t *result_pool,
+                           apr_pool_t *scratch_pool);
+
 
 #endif /* SVN_LIBSVN_FS__SVN_GIT_H*/