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/02 15:50:11 UTC
svn commit: r1717645 - in
/subversion/branches/ra-git/subversion/libsvn_fs_git: fs_git.h
fsgit-queries.sql git-revroot.c gitdb.c
Author: rhuijben
Date: Wed Dec 2 14:50:11 2015
New Revision: 1717645
URL: http://svn.apache.org/viewvc?rev=1717645&view=rev
Log:
On the ra-git branch: Implement fetching of the /tags/ directory.
(And provide some plumbing for /branches/)
* subversion/libsvn_fs_git/fsgit-queries.sql
(STMT_SELECT_BRANCH): Fix checksum for the right revision.
* subversion/libsvn_fs_git/fs_git.h
(svn_fs_git__db_get_tags_branches): New function.
* subversion/libsvn_fs_git/git-revroot.c
(find_branch): Improve check to avoid segfault in strange case
that should never happen.
(fs_git_dir_entries): Resolve TODO.
* subversion/libsvn_fs_git/gitdb.c
(includes): Add svn_hash.h.
(db_get_tags_branches,
svn_fs_git__db_get_tags_branches): 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=1717645&r1=1717644&r2=1717645&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 Wed Dec 2 14:50:11 2015
@@ -151,6 +151,15 @@ svn_fs_git__db_tag_create(svn_revnum_t *
apr_pool_t *scratch_pool);
svn_error_t *
+svn_fs_git__db_get_tags_branches(apr_hash_t **tags,
+ apr_hash_t **branches,
+ svn_fs_t *fs,
+ const char *relpath,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+svn_error_t *
svn_fs_git__db_set_uuid(svn_fs_t *fs,
const char *uuid,
apr_pool_t *scratch_pool);
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=1717645&r1=1717644&r2=1717645&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 Wed Dec 2 14:50:11 2015
@@ -73,7 +73,7 @@ WHERE (relpath <= ?1 AND relpath || '0'
LIMIT 1
-- STMT_SELECT_BRANCH
-SELECT relpath, (SELECT commit_id FROM revmap r WHERE r.revnum=t.revnum),
+SELECT relpath, (SELECT commit_id FROM revmap r WHERE r.revnum=t.from_rev),
from_rev
FROM TAGMAP t WHERE relpath = ?1 AND revnum <= ?2
UNION ALL
@@ -89,6 +89,16 @@ SELECT revnum, from_rev, relpath FROM TA
-- STMT_INSERT_TAG
INSERT INTO TAGMAP (revnum, from_rev, relpath) VALUES (?1, ?2, ?3)
+-- STMT_SELECT_BRANCHES
+SELECT DISTINCT relpath FROM BRANCHMAP
+WHERE relpath > ?1 || '/' AND relpath < ?1 || '0'
+AND from_rev <= ?2 AND (to_rev > ?2 OR to_rev IS NULL)
+
+-- STMT_SELECT_TAGS
+SELECT DISTINCT relpath FROM TAGMAP
+WHERE relpath > ?1 || '/' AND relpath < ?1 || '0'
+AND revnum <= ?2
+
/* Grab all the statements related to the schema. */
-- include: fsgit-metadata
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=1717645&r1=1717644&r2=1717645&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 Wed Dec 2 14:50:11 2015
@@ -317,7 +317,7 @@ find_branch(const git_commit **commit, c
root->fs, path, root->rev,
pool, pool));
- if (branch_path)
+ if (branch_path && oid)
{
apr_pool_t *result_pool = apr_hash_pool_get(fgr->branch_map);
@@ -964,7 +964,26 @@ fs_git_dir_entries(apr_hash_t **entries_
SVN_ERR(find_branch(&commit, &relpath, root, path, pool));
if (!commit)
{
- /* TODO: List 'tags' and 'branches' */
+ apr_hash_t *tags, *branches;
+ apr_hash_index_t *hi;
+
+ SVN_ERR(svn_fs_git__db_get_tags_branches(&tags, &branches,
+ root->fs, path, root->rev,
+ pool, pool));
+
+ branches = apr_hash_overlay(pool, branches, tags);
+ for (hi = apr_hash_first(pool, branches); hi; hi = apr_hash_next(hi))
+ {
+ const char *name = apr_hash_this_key(hi);
+ const char *relpath = apr_hash_this_val(hi);
+
+ de = apr_pcalloc(pool, sizeof(*de));
+ de->kind = svn_node_dir;
+ de->id = make_id(root, relpath, pool);
+ de->name = name;
+ svn_hash_sets(*entries_p, name, de);
+ }
+
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=1717645&r1=1717644&r2=1717645&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/libsvn_fs_git/gitdb.c (original)
+++ subversion/branches/ra-git/subversion/libsvn_fs_git/gitdb.c Wed Dec 2 14:50:11 2015
@@ -30,6 +30,7 @@
#include "svn_fs.h"
#include "svn_version.h"
#include "svn_pools.h"
+#include "svn_hash.h"
#include "svn_dirent_uri.h"
#include "svn_private_config.h"
@@ -395,6 +396,88 @@ svn_fs_git__db_tag_create(svn_revnum_t *
return SVN_NO_ERROR;
}
+static svn_error_t *
+db_get_tags_branches(apr_hash_t **tags,
+ apr_hash_t **branches,
+ svn_fs_t *fs,
+ const char *relpath,
+ svn_revnum_t rev,
+ 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;
+
+ if (branches)
+ {
+ *branches = apr_hash_make(result_pool);
+ SVN_ERR(svn_sqlite__get_statement(&stmt, fgf->sdb,
+ STMT_SELECT_BRANCHES));
+ SVN_ERR(svn_sqlite__bind_text(stmt, 1, relpath));
+ SVN_ERR(svn_sqlite__bind_revnum(stmt, 2, rev));
+ SVN_ERR(svn_sqlite__step(&got_row, stmt));
+ while (got_row)
+ {
+ const char *name;
+ const char *path;
+
+ path = svn_sqlite__column_text(stmt, 0, result_pool);
+ name = svn_relpath_skip_ancestor(relpath, path);
+
+ if (!strchr(name, '/'))
+ svn_hash_sets(*tags, name, path);
+
+ SVN_ERR(svn_sqlite__step(&got_row, stmt));
+ }
+ SVN_ERR(svn_sqlite__reset(stmt));
+ }
+ if (tags)
+ {
+ *tags = apr_hash_make(result_pool);
+ SVN_ERR(svn_sqlite__get_statement(&stmt, fgf->sdb,
+ STMT_SELECT_TAGS));
+ SVN_ERR(svn_sqlite__bind_text(stmt, 1, relpath));
+ SVN_ERR(svn_sqlite__bind_revnum(stmt, 2, rev));
+ SVN_ERR(svn_sqlite__step(&got_row, stmt));
+ while (got_row)
+ {
+ const char *name;
+ const char *path;
+
+ path = svn_sqlite__column_text(stmt, 0, result_pool);
+ name = svn_relpath_skip_ancestor(relpath, path);
+
+ if (!strchr(name, '/'))
+ svn_hash_sets(*tags, name, path);
+
+ SVN_ERR(svn_sqlite__step(&got_row, stmt));
+ }
+ SVN_ERR(svn_sqlite__reset(stmt));
+ }
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_git__db_get_tags_branches(apr_hash_t **tags,
+ apr_hash_t **branches,
+ svn_fs_t *fs,
+ const char *relpath,
+ svn_revnum_t rev,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_fs_git_fs_t *fgf = fs->fsap_data;
+
+ SVN_SQLITE__WITH_LOCK(db_get_tags_branches(tags, branches,
+ fs, relpath, rev,
+ result_pool, scratch_pool),
+ fgf->sdb);
+
+ return SVN_NO_ERROR;
+}
+
+
svn_error_t *
svn_fs_git__db_open(svn_fs_t *fs,
apr_pool_t *scratch_pool)