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 19:25:41 UTC

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

Author: rhuijben
Date: Tue Dec  1 18:25:41 2015
New Revision: 1717491

URL: http://svn.apache.org/viewvc?rev=1717491&view=rev
Log:
On the git-ra branch: Implement created rev lookup. This fixes the
last-changed-* properties for all paths within branches.

* subversion/libsvn_fs_git/fsgit-queries.sql
  (STMT_SELECT_HEADREV): Add column.

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

* subversion/libsvn_fs_git/git-revroot.c
  (cleanup_git_commit): New function.
  (find_commit): New function.
  (fs_git_node_created_rev): Implement function for the normal case.

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

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-revroot.c
    subversion/branches/ra-git/subversion/libsvn_fs_git/gitdb.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=1717491&r1=1717490&r2=1717491&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 18:25:41 2015
@@ -108,6 +108,15 @@ svn_fs_git__db_fetch_oid(svn_boolean_t *
                          apr_pool_t *scratch_pool);
 
 svn_error_t *
+svn_fs_git__db_fetch_rev(svn_revnum_t *revnum,
+                         const char **path,
+                         svn_fs_t *fs,
+                         const git_oid *oid,
+                         apr_pool_t *result_pool,
+                         apr_pool_t *scratch_pool);
+
+
+svn_error_t *
 svn_fs_git__db_fetch_checksum(svn_checksum_t **checksum,
                               svn_fs_t *fs,
                               const git_oid *oid,

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=1717491&r1=1717490&r2=1717491&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 18:25:41 2015
@@ -39,7 +39,7 @@ SELECT MAX(
    IFNULL((SELECT MAX(from_rev) FROM BRANCHMAP), 0))
 
 -- STMT_SELECT_REV_BY_COMMITID
-SELECT revnum FROM REVMAP WHERE commit_id = ?1
+SELECT revnum, relpath FROM REVMAP WHERE commit_id = ?1
 
 -- STMT_SELECT_COMMIT_BY_REV
 SELECT commit_id, relpath, revnum

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=1717491&r1=1717490&r2=1717491&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 18:25:41 2015
@@ -77,6 +77,13 @@ cleanup_git_object(void *baton)
   return APR_SUCCESS;
 }
 
+static apr_status_t
+cleanup_git_commit(void *baton)
+{
+  git_commit_free(baton);
+  return APR_SUCCESS;
+}
+
 /* Gets the raw git object behind an entry. Takes care of the 'will free'
    promise via the pool */
 static svn_error_t *
@@ -214,6 +221,22 @@ find_branch(const git_commit **commit, c
 }
 
 static svn_error_t *
+find_commit(git_commit **commit, svn_fs_root_t *root,
+            const git_oid *oid, apr_pool_t *result_pool)
+{
+  svn_fs_git_fs_t *fgf = root->fs->fsap_data;
+
+  GIT2_ERR(git_commit_lookup(commit, fgf->repos, oid));
+
+  if (commit)
+    {
+      apr_pool_cleanup_register(result_pool, *commit, cleanup_git_commit,
+                                apr_pool_cleanup_null);
+    }
+  return SVN_NO_ERROR;
+}
+
+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)
@@ -458,14 +481,85 @@ fs_git_node_created_rev(svn_revnum_t *re
                         svn_fs_root_t *root, const char *path,
                         apr_pool_t *pool)
 {
-  /*svn_fs_git_root_t *fgr = root->fsap_data;*/
-  if (*path == '/' && path[1] == '\0')
+  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;
+  const git_oid *oid_p;
+
+  if (*path == '/')
+    path++;
+
+  if (*path == '\0')
+    {
+      *revision = root->rev;
+      return SVN_NO_ERROR;
+    }
+
+  SVN_ERR(find_branch(&rev_commit, &relpath, root, path, pool));
+  if (!rev_commit)
     {
+      /* Handle 'branches' and 'tags' dirs */
       *revision = root->rev;
       return SVN_NO_ERROR;
     }
+  else if (!*relpath && fgr->rev_path && !strcmp(fgr->rev_path, path))
+    {
+      /* The root of what has committed, changed... */
+      *revision = root->rev;
+      return SVN_NO_ERROR;
+    }
+  iterpool = svn_pool_create(pool);
+
+  GIT2_ERR(git_commit_tree(&rev_tree, rev_commit));
+  SVN_ERR(find_tree_entry(&rev_entry, rev_tree, relpath, pool, iterpool));
+
+  last_oid = *git_commit_id(rev_commit);
+  oid_p = git_commit_parent_id(rev_commit, 0);
+
+
+  while (oid_p)
+    {
+      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));
+
+      GIT2_ERR(git_commit_tree(&cmt_tree, cmt));
+
+      SVN_ERR(find_tree_entry(&cmt_entry, cmt_tree, relpath,
+                              iterpool, iterpool));
+
+      if (!cmt_entry || git_oid_cmp(git_tree_entry_id(rev_entry),
+                                    git_tree_entry_id(cmt_entry)))
+        {
+          break;
+        }
+
+      git_commit_message(cmt);
+
+      last_oid = *git_commit_id(cmt);
+
+      oid_p = git_commit_parent_id(cmt, 0);
+      if (!oid_p)
+        break;
+
+      /* And prepare for pool cleanup */
+      oid = *oid_p;
+      oid_p = &oid;
+    }
+
+  SVN_ERR(svn_fs_git__db_fetch_rev(revision, NULL,
+                                   root->fs, &last_oid,
+                                   pool, iterpool));
 
-  *revision = root->rev; /* ### Needs path walk */
+  svn_pool_destroy(iterpool);
 
   return SVN_NO_ERROR;
 }

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=1717491&r1=1717490&r2=1717491&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 18:25:41 2015
@@ -139,6 +139,43 @@ svn_fs_git__db_fetch_oid(svn_boolean_t *
 }
 
 
+svn_error_t *
+svn_fs_git__db_fetch_rev(svn_revnum_t *revnum,
+                         const char **path,
+                         svn_fs_t *fs,
+                         const git_oid *oid,
+                         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_ERR(svn_sqlite__get_statement(&stmt, fgf->sdb,
+                                    STMT_SELECT_REV_BY_COMMITID));
+  SVN_ERR(svn_sqlite__bind_blob(stmt, 1, oid, sizeof(*oid)));
+  SVN_ERR(svn_sqlite__step(&got_row, stmt));
+
+  if (got_row)
+    {
+      if (revnum)
+        *revnum = svn_sqlite__column_revnum(stmt, 0);
+      if (path)
+        *path = svn_sqlite__column_text(stmt, 1, result_pool);
+    }
+  else
+    {
+      if (revnum)
+        *revnum = SVN_INVALID_REVNUM;
+      if (path)
+        *path = NULL;
+    }
+  SVN_ERR(svn_sqlite__reset(stmt));
+  return SVN_NO_ERROR;
+}
+
+
+
 static svn_error_t *
 db_fetch_checksum(svn_checksum_t **checksum,
                   svn_fs_t *fs,