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/01 06:34:07 UTC

svn commit: r1717378 - in /subversion/branches/ra-git/subversion/libsvn_fs_git: fs_git.h fsgit-queries.sql git-fs.c git-revroot.c gitdb.c revmap.c

Author: rhuijben
Date: Tue Dec  1 05:34:07 2015
New Revision: 1717378

URL: http://svn.apache.org/viewvc?rev=1717378&view=rev
Log:
On the git-ra branch: Start mapping the revisions to several operations.

* subversion/libsvn_fs_git/fsgit-queries.sql
  (STMT_SELECT_COMMIT_BY_REV): New statement.

* subversion/libsvn_fs_git/fs_git.h
  (svn_fs_git__db_fetch_oid): New function.

* subversion/libsvn_fs_git/git-fs.c
  (includes): Add svn_hash.h, svn_time.h.
  (fs_git_revision_proplist): Implement function.
  (fs_git_get_lock,
   fs_git_get_locks): Return no locks instead of an error.

* subversion/libsvn_fs_git/git-revroot.c
  (includes): Add svn_hash.h.
  (svn_fs_git_root_t): New struct.
  (git_root_cleanup,
   make_id): New function.
  (fs_git_check_path): Handle '/'.
  (fs_git_node_created_rev): Handle '/'. Fake others.
  (fs_git_node_has_props): No props yet.
  (fs_git_dir_entries): Fake '/'.
  (svn_fs_git__revision_root): Fetch the commit describing the
    revision.

* subversion/libsvn_fs_git/gitdb.c
  (svn_fs_git__db_fetch_oid): New function.

* subversion/libsvn_fs_git/revmap.c
  (revmap_update_branch): Add cancel support.
  (revmap_update): Use r1 for setting up layout.

Modified:
    subversion/branches/ra-git/subversion/libsvn_fs_git/fs_git.h
    subversion/branches/ra-git/subversion/libsvn_fs_git/fsgit-queries.sql
    subversion/branches/ra-git/subversion/libsvn_fs_git/git-fs.c
    subversion/branches/ra-git/subversion/libsvn_fs_git/git-revroot.c
    subversion/branches/ra-git/subversion/libsvn_fs_git/gitdb.c
    subversion/branches/ra-git/subversion/libsvn_fs_git/revmap.c

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=1717378&r1=1717377&r2=1717378&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 Tue Dec  1 05:34:07 2015
@@ -89,6 +89,15 @@ svn_fs_git__db_ensure_commit(svn_fs_t *f
                              svn_revnum_t *latest_rev,
                              git_reference *ref);
 
+svn_error_t *
+svn_fs_git__db_fetch_oid(svn_boolean_t *found,
+                         git_oid **oid,
+                         const char **path,
+                         svn_fs_t *fs,
+                         svn_revnum_t revnum,
+                         apr_pool_t *result_pool,
+                         apr_pool_t *scratch_pool);
+
 /* */
 svn_error_t *
 svn_fs_git__revision_root(svn_fs_root_t **root_p,

Modified: subversion/branches/ra-git/subversion/libsvn_fs_git/fsgit-queries.sql
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_fs_git/fsgit-queries.sql?rev=1717378&r1=1717377&r2=1717378&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/libsvn_fs_git/fsgit-queries.sql (original)
+++ subversion/branches/ra-git/subversion/libsvn_fs_git/fsgit-queries.sql Tue Dec  1 05:34:07 2015
@@ -41,6 +41,13 @@ SELECT MAX(
 -- STMT_SELECT_REV_BY_COMMITID
 SELECT revnum FROM REVMAP WHERE commit_id = ?1
 
+-- STMT_SELECT_COMMIT_BY_REV
+SELECT commit_id, relpath, revnum
+FROM REVMAP
+WHERE revnum <= ?1
+ORDER BY revnum DESC
+LIMIT 1
+
 -- STMT_INSERT_COMMIT
 INSERT INTO REVMAP (revnum, commit_id, relpath) VALUES (?1, ?2, ?3)
 

Modified: subversion/branches/ra-git/subversion/libsvn_fs_git/git-fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_fs_git/git-fs.c?rev=1717378&r1=1717377&r2=1717378&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/libsvn_fs_git/git-fs.c (original)
+++ subversion/branches/ra-git/subversion/libsvn_fs_git/git-fs.c Tue Dec  1 05:34:07 2015
@@ -30,6 +30,8 @@
 #include "svn_fs.h"
 #include "svn_version.h"
 #include "svn_pools.h"
+#include "svn_hash.h"
+#include "svn_time.h"
 
 #include "svn_private_config.h"
 
@@ -62,7 +64,43 @@ fs_git_revision_prop(svn_string_t **valu
 static svn_error_t *
 fs_git_revision_proplist(apr_hash_t **table_p, svn_fs_t *fs, svn_revnum_t rev, svn_boolean_t refresh, apr_pool_t *result_pool, apr_pool_t *scratch_pool)
 {
+  svn_fs_git_fs_t *fgf = fs->fsap_data;
+  svn_boolean_t found;
+  git_oid *oid;
   *table_p = apr_hash_make(result_pool);
+
+  SVN_ERR(svn_fs_git__db_fetch_oid(&found, &oid, NULL, fs, rev,
+                                   scratch_pool, scratch_pool));
+
+  if (found)
+    {
+      git_commit *commit;
+      const git_signature *author;
+      git_time_t c_time;
+      const char *msg;
+      GIT2_ERR(git_commit_lookup(&commit, fgf->repos, oid));
+
+      c_time = git_commit_time(commit);
+      author = git_commit_author(commit);
+      msg = git_commit_message(commit);
+
+      if (ctime)
+        svn_hash_sets(*table_p, SVN_PROP_REVISION_DATE,
+                      svn_string_create(
+                        svn_time_to_cstring(
+                          apr_time_from_sec(git_commit_time(commit)),
+                          scratch_pool),
+                        result_pool));
+      if (author)
+        svn_hash_sets(*table_p, SVN_PROP_REVISION_AUTHOR,
+                      svn_string_create(author->email, result_pool));
+      if (msg)
+        svn_hash_sets(*table_p, SVN_PROP_REVISION_LOG,
+                      svn_string_create(msg, result_pool));
+
+      git_commit_free(commit);
+    }
+
   return SVN_NO_ERROR;
 }
 
@@ -128,13 +166,14 @@ fs_git_unlock(svn_fs_t *fs, apr_hash_t *
 static svn_error_t *
 fs_git_get_lock(svn_lock_t **lock, svn_fs_t *fs, const char *path, apr_pool_t *pool)
 {
-  return svn_error_create(APR_ENOTIMPL, NULL, NULL);
+  *lock = NULL;
+  return SVN_NO_ERROR;
 }
 
 static svn_error_t *
 fs_git_get_locks(svn_fs_t *fs, const char *path, svn_depth_t depth, svn_fs_get_locks_callback_t get_locks_func, void *get_locks_baton, apr_pool_t *pool)
 {
-  return svn_error_create(APR_ENOTIMPL, NULL, NULL);
+  return SVN_NO_ERROR;
 }
 
 static svn_error_t *

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=1717378&r1=1717377&r2=1717378&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 Tue Dec  1 05:34:07 2015
@@ -27,6 +27,7 @@
 #include <apr_pools.h>
 
 #include "svn_fs.h"
+#include "svn_hash.h"
 #include "svn_version.h"
 #include "svn_pools.h"
 
@@ -37,6 +38,35 @@
 #include "../libsvn_fs/fs-loader.h"
 #include "fs_git.h"
 
+typedef struct svn_fs_git_root_t
+{
+  git_commit *commit;
+  const char *rev_path;
+  svn_boolean_t exact;
+} svn_fs_git_root_t;
+
+static apr_status_t
+git_root_cleanup(void *baton)
+{
+  svn_fs_git_root_t *fgr = baton;
+
+  if (fgr->commit)
+    {
+      git_commit_free(fgr->commit);
+      fgr->commit = NULL;
+    }
+
+  return APR_SUCCESS;
+}
+
+static svn_fs_id_t *
+make_id(svn_fs_root_t *root,
+        const char *path,
+        apr_pool_t *result_pool)
+{
+  return NULL;
+}
+
  /* Determining what has changed in a root */
 static svn_error_t *
 fs_git_paths_changed(apr_hash_t **changed_paths_p,
@@ -51,6 +81,14 @@ static svn_error_t *
 fs_git_check_path(svn_node_kind_t *kind_p, svn_fs_root_t *root,
                   const char *path, apr_pool_t *pool)
 {
+  if (*path == '/')
+    path++;
+  if (!*path)
+    {
+      *kind_p = svn_node_dir;
+      return SVN_NO_ERROR;
+    }
+
   return svn_error_create(APR_ENOTIMPL, NULL, NULL);
 }
 
@@ -84,7 +122,16 @@ fs_git_node_created_rev(svn_revnum_t *re
                         svn_fs_root_t *root, const char *path,
                         apr_pool_t *pool)
 {
-  return svn_error_create(APR_ENOTIMPL, NULL, NULL);
+  /*svn_fs_git_root_t *fgr = root->fsap_data;*/
+  if (*path == '/' && path[1] == '\0')
+    {
+      *revision = root->rev;
+      return SVN_NO_ERROR;
+    }
+
+  *revision = root->rev; /* ### Needs path walk */
+
+  return SVN_NO_ERROR;
 }
 
 static svn_error_t *
@@ -157,11 +204,13 @@ fs_git_node_proplist(apr_hash_t **table_
 {
   return svn_error_create(APR_ENOTIMPL, NULL, NULL);
 }
+
 static svn_error_t *
 fs_git_node_has_props(svn_boolean_t *has_props, svn_fs_root_t *root,
                       const char *path, apr_pool_t *scratch_pool)
 {
-  return svn_error_create(APR_ENOTIMPL, NULL, NULL);
+  *has_props = FALSE;
+  return SVN_NO_ERROR;
 }
 
 static svn_error_t *
@@ -187,6 +236,33 @@ static svn_error_t *
 fs_git_dir_entries(apr_hash_t **entries_p, svn_fs_root_t *root,
                    const char *path, apr_pool_t *pool)
 {
+  svn_fs_dirent_t *de;
+
+  *entries_p = apr_hash_make(pool);
+  if (!root->rev)
+    return SVN_NO_ERROR;
+  else if (*path == '/' && path[1] == '\0')
+    {
+      de = apr_pcalloc(pool, sizeof(*de));
+      de->kind = svn_node_dir;
+      de->id = make_id(root, path, pool);
+      de->name = "trunk";
+      svn_hash_sets(*entries_p, "trunk", de);
+
+      de = apr_pcalloc(pool, sizeof(*de));
+      de->kind = svn_node_dir;
+      de->id = make_id(root, path, pool);
+      de->name = "branches";
+      svn_hash_sets(*entries_p, "branches", de);
+
+      de = apr_pcalloc(pool, sizeof(*de));
+      de->kind = svn_node_dir;
+      de->id = make_id(root, path, pool);
+      de->name = "tags";
+      svn_hash_sets(*entries_p, "tags", de);
+
+      return SVN_NO_ERROR;
+    }
   return svn_error_create(APR_ENOTIMPL, NULL, NULL);
 }
 
@@ -354,10 +430,14 @@ static root_vtable_t root_vtable =
 svn_error_t *
 svn_fs_git__revision_root(svn_fs_root_t **root_p, svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool)
 {
+  svn_fs_git_fs_t *fgf = fs->fsap_data;
   svn_fs_root_t *root;
+  svn_fs_git_root_t *fgr;
 
   SVN_ERR(svn_fs__check_fs(fs, TRUE));
 
+
+  fgr = apr_pcalloc(pool, sizeof(*fgr));
   root = apr_pcalloc(pool, sizeof(*root));
 
   root->pool = pool;
@@ -365,10 +445,23 @@ svn_fs_git__revision_root(svn_fs_root_t
   root->is_txn_root = FALSE;
   root->txn = NULL;
   root->txn_flags = 0;
-  root->rev = 0;
+  root->rev = rev;
 
   root->vtable = &root_vtable;
-  root->fsap_data = NULL;
+  root->fsap_data = fgr;
+
+  if (rev > 0)
+    {
+      git_oid *oid;
+      SVN_ERR(svn_fs_git__db_fetch_oid(&fgr->exact, &oid, &fgr->rev_path,
+                                       fs, rev, pool, pool));
+
+      if (oid)
+        GIT2_ERR(git_commit_lookup(&fgr->commit, fgf->repos, oid));
+
+      apr_pool_cleanup_register(pool, fgr, git_root_cleanup,
+                                apr_pool_cleanup_null);
+    }
 
   *root_p = root;
 

Modified: subversion/branches/ra-git/subversion/libsvn_fs_git/gitdb.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_fs_git/gitdb.c?rev=1717378&r1=1717377&r2=1717378&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/libsvn_fs_git/gitdb.c (original)
+++ subversion/branches/ra-git/subversion/libsvn_fs_git/gitdb.c Tue Dec  1 05:34:07 2015
@@ -94,6 +94,53 @@ svn_fs_git__db_ensure_commit(svn_fs_t *f
 }
 
 svn_error_t *
+svn_fs_git__db_fetch_oid(svn_boolean_t *found,
+                         git_oid **oid,
+                         const char **path,
+                         svn_fs_t *fs,
+                         svn_revnum_t revnum,
+                         apr_pool_t *result_pool,
+                         apr_pool_t *scratch_pool)
+{
+  svn_fs_git_fs_t *fgf = fs->fsap_data;
+  svn_sqlite__stmt_t *stmt;
+  svn_boolean_t got_row;
+  svn_revnum_t new_rev;
+
+  SVN_ERR(svn_sqlite__get_statement(&stmt, fgf->sdb,
+                                    STMT_SELECT_COMMIT_BY_REV));
+  SVN_ERR(svn_sqlite__bind_revnum(stmt, 1, revnum));
+  SVN_ERR(svn_sqlite__step(&got_row, stmt));
+
+  if (got_row)
+    {
+      if (found)
+        *found = (revnum == svn_sqlite__column_revnum(stmt, 2));
+      if (oid)
+        {
+          apr_size_t len;
+          *oid = svn_sqlite__column_blob(stmt, 0, &len, result_pool);
+          if (len != sizeof(**oid))
+            *oid = NULL;
+        }
+      if (path)
+        *path = svn_sqlite__column_text(stmt, 1, result_pool);
+    }
+  else
+    {
+      if (found)
+        *found = FALSE;
+      if (oid)
+        *oid = NULL;
+      if (path)
+        *path = NULL;
+    }
+  SVN_ERR(svn_sqlite__reset(stmt));
+  return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
 svn_fs_git__db_open(svn_fs_t *fs,
                     apr_pool_t *scratch_pool)
 {

Modified: subversion/branches/ra-git/subversion/libsvn_fs_git/revmap.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_fs_git/revmap.c?rev=1717378&r1=1717377&r2=1717378&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/libsvn_fs_git/revmap.c (original)
+++ subversion/branches/ra-git/subversion/libsvn_fs_git/revmap.c Tue Dec  1 05:34:07 2015
@@ -53,6 +53,9 @@ revmap_update_branch(svn_fs_t *fs,
 
   while (!(git_err = git_revwalk_next(&oid, revwalk)))
     {
+      if (cancel_func)
+        SVN_ERR(cancel_func(cancel_baton));
+
       SVN_ERR(svn_fs_git__db_ensure_commit(fs, &oid, latest_rev, ref));
     }
 
@@ -77,6 +80,11 @@ revmap_update(svn_fs_t *fs,
   svn_revnum_t latest_rev, youngest;
 
   SVN_ERR(svn_fs_git__db_youngest_rev(&youngest, fs, scratch_pool));
+
+  if (youngest == 0)
+    youngest = 1; /* We use r1 to create /trunk, /branches and /tags.
+                     Let's not add other changes in the same rev */
+
   latest_rev = youngest;
 
   GIT2_ERR(git_branch_iterator_new(&iter, fgf->repos, GIT_BRANCH_ALL));