diff options
author | Peter Wemm <peter@FreeBSD.org> | 2018-05-08 03:44:38 +0000 |
---|---|---|
committer | Peter Wemm <peter@FreeBSD.org> | 2018-05-08 03:44:38 +0000 |
commit | 3faf8d6bffc5d0fb2525ba37bb504c53366caf9d (patch) | |
tree | 7e47911263e75034b767fe34b2f8d3d17e91f66d /subversion/libsvn_delta/branch_repos.c | |
parent | a55fb3c0d5eca7d887798125d5b95942b1f01d4b (diff) |
Diffstat (limited to 'subversion/libsvn_delta/branch_repos.c')
-rw-r--r-- | subversion/libsvn_delta/branch_repos.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/subversion/libsvn_delta/branch_repos.c b/subversion/libsvn_delta/branch_repos.c new file mode 100644 index 0000000000000..1ba86b193c4da --- /dev/null +++ b/subversion/libsvn_delta/branch_repos.c @@ -0,0 +1,132 @@ +/* + * branch_repos.c : Element-Based Branching and Move Tracking. + * + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * ==================================================================== + */ + +#include <assert.h> + +#include "svn_types.h" +#include "svn_error.h" +#include "svn_dirent_uri.h" +#include "svn_iter.h" + +#include "private/svn_branch_repos.h" +#include "svn_private_config.h" + + +/* Per-repository branching info. + */ +struct svn_branch__repos_t +{ + /* Array of (svn_branch__txn_t *), indexed by revision number. */ + apr_array_header_t *rev_roots; + + /* The pool in which this object lives. */ + apr_pool_t *pool; +}; + + +svn_branch__repos_t * +svn_branch__repos_create(apr_pool_t *result_pool) +{ + svn_branch__repos_t *repos = apr_pcalloc(result_pool, sizeof(*repos)); + + repos->rev_roots = apr_array_make(result_pool, 0, sizeof(void *)); + repos->pool = result_pool; + return repos; +} + +svn_error_t * +svn_branch__repos_add_revision(svn_branch__repos_t *repos, + svn_branch__txn_t *rev_root) +{ + APR_ARRAY_PUSH(repos->rev_roots, void *) = rev_root; + + return SVN_NO_ERROR; +} + +struct svn_branch__txn_t * +svn_branch__repos_get_revision(const svn_branch__repos_t *repos, + svn_revnum_t revnum) +{ + assert(revnum < repos->rev_roots->nelts); + return APR_ARRAY_IDX(repos->rev_roots, revnum, void *); +} + +svn_branch__txn_t * +svn_branch__repos_get_base_revision_root(svn_branch__txn_t *rev_root) +{ + return svn_branch__repos_get_revision(rev_root->repos, rev_root->base_rev); +} + +svn_error_t * +svn_branch__repos_get_branch_by_id(svn_branch__state_t **branch_p, + const svn_branch__repos_t *repos, + svn_revnum_t revnum, + const char *branch_id, + apr_pool_t *scratch_pool) +{ + svn_branch__txn_t *rev_root; + + if (revnum < 0 || revnum >= repos->rev_roots->nelts) + return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL, + _("No such revision %ld"), revnum); + + rev_root = svn_branch__repos_get_revision(repos, revnum); + *branch_p = svn_branch__txn_get_branch_by_id(rev_root, branch_id, + scratch_pool); + if (! *branch_p) + return svn_error_createf(SVN_BRANCH__ERR, NULL, + _("Branch %s not found in r%ld"), + branch_id, revnum); + return SVN_NO_ERROR; +} + +svn_error_t * +svn_branch__repos_find_el_rev_by_id(svn_branch__el_rev_id_t **el_rev_p, + const svn_branch__repos_t *repos, + svn_revnum_t revnum, + const char *branch_id, + int eid, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) +{ + svn_branch__el_rev_id_t *el_rev = apr_palloc(result_pool, sizeof(*el_rev)); + svn_element__content_t *element; + + el_rev->rev = revnum; + SVN_ERR(svn_branch__repos_get_branch_by_id(&el_rev->branch, + repos, revnum, branch_id, + scratch_pool)); + SVN_ERR(svn_branch__state_get_element(el_rev->branch, &element, + eid, scratch_pool)); + if (element) + { + el_rev->eid = eid; + } + else + { + el_rev->eid = -1; + } + *el_rev_p = el_rev; + return SVN_NO_ERROR; +} + |