summaryrefslogtreecommitdiff
path: root/subversion/libsvn_ra_neon/mergeinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/libsvn_ra_neon/mergeinfo.c')
-rw-r--r--subversion/libsvn_ra_neon/mergeinfo.c255
1 files changed, 0 insertions, 255 deletions
diff --git a/subversion/libsvn_ra_neon/mergeinfo.c b/subversion/libsvn_ra_neon/mergeinfo.c
deleted file mode 100644
index fffd9c5..0000000
--- a/subversion/libsvn_ra_neon/mergeinfo.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * mergeinfo.c : routines for requesting and parsing mergeinfo reports
- *
- * ====================================================================
- * 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 <apr_pools.h>
-#include <apr_tables.h>
-#include <apr_strings.h>
-#include <apr_xml.h>
-
-#include <ne_socket.h>
-
-#include "svn_error.h"
-#include "svn_pools.h"
-#include "svn_path.h"
-#include "svn_xml.h"
-#include "svn_mergeinfo.h"
-#include "private/svn_dav_protocol.h"
-#include "../libsvn_ra/ra_loader.h"
-
-#include "ra_neon.h"
-
-/* Baton for accumulating mergeinfo. CATALOG stores the final
- mergeinfo catalog result we are going to hand back to the caller of
- get_mergeinfo. curr_path and curr_info contain the value of the
- CDATA from the mergeinfo items as we get them from the server. */
-
-struct mergeinfo_baton
-{
- apr_pool_t *pool;
- svn_stringbuf_t *curr_path;
- svn_stringbuf_t *curr_info;
- svn_mergeinfo_catalog_t catalog;
- svn_error_t *err;
-};
-
-static const svn_ra_neon__xml_elm_t mergeinfo_report_elements[] =
- {
- { SVN_XML_NAMESPACE, SVN_DAV__MERGEINFO_REPORT, ELEM_mergeinfo_report, 0 },
- { SVN_XML_NAMESPACE, SVN_DAV__MERGEINFO_ITEM, ELEM_mergeinfo_item, 0 },
- { SVN_XML_NAMESPACE, SVN_DAV__MERGEINFO_PATH, ELEM_mergeinfo_path,
- SVN_RA_NEON__XML_CDATA },
- { SVN_XML_NAMESPACE, SVN_DAV__MERGEINFO_INFO, ELEM_mergeinfo_info,
- SVN_RA_NEON__XML_CDATA },
- { NULL }
- };
-
-static svn_error_t *
-start_element(int *elem, void *baton, int parent_state, const char *nspace,
- const char *elt_name, const char **atts)
-{
- struct mergeinfo_baton *mb = baton;
-
- const svn_ra_neon__xml_elm_t *elm
- = svn_ra_neon__lookup_xml_elem(mergeinfo_report_elements, nspace,
- elt_name);
- if (! elm)
- {
- *elem = NE_XML_DECLINE;
- return SVN_NO_ERROR;
- }
-
- if (parent_state == ELEM_root)
- {
- /* If we're at the root of the tree, the element has to be the editor
- * report itself. */
- if (elm->id != ELEM_mergeinfo_report)
- return UNEXPECTED_ELEMENT(nspace, elt_name);
- }
-
- if (elm->id == ELEM_mergeinfo_item)
- {
- svn_stringbuf_setempty(mb->curr_info);
- svn_stringbuf_setempty(mb->curr_path);
- }
-
- SVN_ERR(mb->err);
-
- *elem = elm->id;
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-end_element(void *baton, int state, const char *nspace, const char *elt_name)
-{
- struct mergeinfo_baton *mb = baton;
-
- const svn_ra_neon__xml_elm_t *elm
- = svn_ra_neon__lookup_xml_elem(mergeinfo_report_elements, nspace,
- elt_name);
- if (! elm)
- return UNEXPECTED_ELEMENT(nspace, elt_name);
-
- if (elm->id == ELEM_mergeinfo_item)
- {
- if (mb->curr_info && mb->curr_path)
- {
- svn_mergeinfo_t path_mergeinfo;
- const char *path;
-
- SVN_ERR_ASSERT(mb->curr_path->data);
- path = apr_pstrdup(mb->pool, mb->curr_path->data);
- SVN_ERR((mb->err = svn_mergeinfo_parse(&path_mergeinfo,
- mb->curr_info->data,
- mb->pool)));
- /* Correct for naughty servers that send "relative" paths
- with leading slashes! */
- apr_hash_set(mb->catalog, path[0] == '/' ? path + 1 : path,
- APR_HASH_KEY_STRING, path_mergeinfo);
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-cdata_handler(void *baton, int state, const char *cdata, size_t len)
-{
- struct mergeinfo_baton *mb = baton;
- apr_size_t nlen = len;
-
- switch (state)
- {
- case ELEM_mergeinfo_path:
- svn_stringbuf_appendbytes(mb->curr_path, cdata, nlen);
- break;
-
- case ELEM_mergeinfo_info:
- svn_stringbuf_appendbytes(mb->curr_info, cdata, nlen);
- break;
-
- default:
- break;
- }
- return mb->err;
-}
-
-/* Request a mergeinfo-report from the URL attached to SESSION,
- and fill in the CATALOG with the results. */
-svn_error_t *
-svn_ra_neon__get_mergeinfo(svn_ra_session_t *session,
- svn_mergeinfo_catalog_t *catalog,
- const apr_array_header_t *paths,
- svn_revnum_t revision,
- svn_mergeinfo_inheritance_t inherit,
- svn_boolean_t include_descendants,
- apr_pool_t *pool)
-{
- svn_ra_neon__session_t *ras = session->priv;
- svn_stringbuf_t *request_body = svn_stringbuf_create("", pool);
- struct mergeinfo_baton mb;
- const char *bc_url;
- const char *bc_relative;
- const char *final_bc_url;
-
- static const char minfo_report_head[] =
- "<S:" SVN_DAV__MERGEINFO_REPORT " xmlns:S=\"" SVN_XML_NAMESPACE "\">"
- DEBUG_CR;
-
- static const char minfo_report_tail[] =
- "</S:" SVN_DAV__MERGEINFO_REPORT ">" DEBUG_CR;
-
- *catalog = NULL;
-
- /* Construct the request body. */
- svn_stringbuf_appendcstr(request_body, minfo_report_head);
- svn_stringbuf_appendcstr(request_body,
- apr_psprintf(pool,
- "<S:revision>%ld"
- "</S:revision>", revision));
- svn_stringbuf_appendcstr(request_body,
- apr_psprintf(pool,
- "<S:inherit>%s"
- "</S:inherit>",
- svn_inheritance_to_word(inherit)));
-
- if (include_descendants)
- {
- /* Send it only if true; server will default to "no". */
- svn_stringbuf_appendcstr(request_body,
- "<S:include-descendants>yes"
- "</S:include-descendants>");
- }
-
- if (paths)
- {
- int i;
-
- for (i = 0; i < paths->nelts; i++)
- {
- const char *this_path =
- apr_xml_quote_string(pool,
- ((const char **)paths->elts)[i],
- 0);
- svn_stringbuf_appendcstr(request_body, "<S:path>");
- svn_stringbuf_appendcstr(request_body, this_path);
- svn_stringbuf_appendcstr(request_body, "</S:path>");
- }
- }
-
- svn_stringbuf_appendcstr(request_body, minfo_report_tail);
-
- mb.pool = pool;
- mb.curr_path = svn_stringbuf_create("", pool);
- mb.curr_info = svn_stringbuf_create("", pool);
- mb.catalog = apr_hash_make(pool);
- mb.err = SVN_NO_ERROR;
-
- /* ras's URL may not exist in HEAD, and thus it's not safe to send
- it as the main argument to the REPORT request; it might cause
- dav_get_resource() to choke on the server. So instead, we pass a
- baseline-collection URL, which we get from END. */
- SVN_ERR(svn_ra_neon__get_baseline_info(&bc_url, &bc_relative, NULL, ras,
- ras->url->data, revision, pool));
- final_bc_url = svn_path_url_add_component2(bc_url, bc_relative, pool);
-
- SVN_ERR(svn_ra_neon__parsed_request(ras,
- "REPORT",
- final_bc_url,
- request_body->data,
- NULL, NULL,
- start_element,
- cdata_handler,
- end_element,
- &mb,
- NULL,
- NULL,
- FALSE,
- pool));
-
- if (mb.err == SVN_NO_ERROR && apr_hash_count(mb.catalog))
- *catalog = mb.catalog;
-
- return mb.err;
-}