You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2015/04/15 13:32:25 UTC
svn commit: r1673732 -
/subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c
Author: julianfoad
Date: Wed Apr 15 11:32:24 2015
New Revision: 1673732
URL: http://svn.apache.org/r1673732
Log:
On the 'move-tracking-2' branch: Improve metadata parsing to support
pathnames containing spaces and remove pathname length limits.
* subversion/libsvn_delta/branch.c
(parse_branch_line,
parse_element_line): New.
(svn_branch_instance_parse): Use them.
(svn_branch_family_parse): Remove a redundant trailing whitespace spec
from the scan format, as there isn't a trailing newline on the data.
(svn_branch_instance_serialize): Remove an unused variable.
Modified:
subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c
Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c?rev=1673732&r1=1673731&r2=1673732&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c Wed Apr 15 11:32:24 2015
@@ -883,6 +883,68 @@ svn_branch_delete_branch_instance_r(svn_
* ========================================================================
*/
+/* */
+static svn_error_t *
+parse_branch_line(int *bsid_p,
+ int *root_eid_p,
+ const char **path_p,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *line;
+ svn_boolean_t eof;
+ int n;
+ int offset;
+
+ /* Read a line */
+ SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
+ SVN_ERR_ASSERT(!eof);
+
+ n = sscanf(line->data, "b%d: root-eid %d at%n",
+ bsid_p, root_eid_p, &offset);
+ SVN_ERR_ASSERT(n >= 2); /* C std is unclear on whether '%n' counts */
+ SVN_ERR_ASSERT(line->data[offset] == ' ');
+ *path_p = line->data + offset + 1;
+
+ if (strcmp(*path_p, ".") == 0)
+ *path_p = "";
+
+ return SVN_NO_ERROR;
+}
+
+/* */
+static svn_error_t *
+parse_element_line(int *bsid_p,
+ int *eid_p,
+ int *parent_eid_p,
+ const char **name_p,
+ svn_stream_t *stream,
+ apr_pool_t *scratch_pool)
+{
+ svn_stringbuf_t *line;
+ svn_boolean_t eof;
+ int n;
+ int offset;
+
+ /* Read a line */
+ SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
+ SVN_ERR_ASSERT(!eof);
+
+ n = sscanf(line->data, "b%de%d: %d%n",
+ bsid_p, eid_p,
+ parent_eid_p, &offset);
+ SVN_ERR_ASSERT(n >= 3); /* C std is unclear on whether '%n' counts */
+ SVN_ERR_ASSERT(line->data[offset] == ' ');
+ *name_p = line->data + offset + 1;
+
+ if (strcmp(*name_p, "(null)") == 0)
+ *name_p = NULL;
+ else if (strcmp(*name_p, ".") == 0)
+ *name_p = "";
+
+ return SVN_NO_ERROR;
+}
+
/* Create a new branch *NEW_BRANCH that belongs to FAMILY, initialized
* with info parsed from STREAM, allocated in RESULT_POOL.
*/
@@ -894,26 +956,17 @@ svn_branch_instance_parse(svn_branch_ins
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_stringbuf_t *line;
- svn_boolean_t eof;
- int n;
int bsid, root_eid;
svn_branch_sibling_t *branch_sibling;
svn_branch_instance_t *branch_instance;
- char branch_root_path[100];
const char *branch_root_rrpath;
svn_branch_instance_t *outer_branch;
int outer_eid;
int eid;
- SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
- SVN_ERR_ASSERT(! eof);
- n = sscanf(line->data, "b%d: root-eid %d at %s\n",
- &bsid, &root_eid, branch_root_path);
- SVN_ERR_ASSERT(n == 3);
+ SVN_ERR(parse_branch_line(&bsid, &root_eid, &branch_root_rrpath,
+ stream, scratch_pool));
- branch_root_rrpath
- = strcmp(branch_root_path, ".") == 0 ? "" : branch_root_path;
branch_sibling = family_find_or_create_branch_sibling(family, bsid, root_eid);
if (branch_root_rrpath[0])
{
@@ -935,19 +988,16 @@ svn_branch_instance_parse(svn_branch_ins
for (eid = family->first_eid; eid < family->next_eid; eid++)
{
int this_bsid, this_eid, this_parent_eid;
- char this_name[20];
+ const char *this_name;
+
+ SVN_ERR(parse_element_line(&this_bsid, &this_eid,
+ &this_parent_eid, &this_name,
+ stream, scratch_pool));
- SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
- SVN_ERR_ASSERT(! eof);
- n = sscanf(line->data, "b%de%d: %d %20s\n",
- &this_bsid, &this_eid,
- &this_parent_eid, this_name);
- SVN_ERR_ASSERT(n == 4);
- if (strcmp(this_name, "(null)") != 0)
+ if (this_name)
{
- const char *name = strcmp(this_name, ".") == 0 ? "" : this_name;
svn_branch_el_rev_content_t *node
- = svn_branch_el_rev_content_create(this_parent_eid, name,
+ = svn_branch_el_rev_content_create(this_parent_eid, this_name,
NULL /*content*/, result_pool);
branch_map_set(branch_instance, this_eid, node);
@@ -1005,7 +1055,7 @@ svn_branch_family_parse(svn_branch_famil
SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
SVN_ERR_ASSERT(!eof);
n = sscanf(line->data, "family: bsids %d %d eids %d %d "
- "b-instances %d\n",
+ "b-instances %d",
&first_bsid, &next_bsid, &first_eid, &next_eid,
num_branch_instances);
SVN_ERR_ASSERT(n == 5);
@@ -1113,15 +1163,11 @@ svn_branch_instance_serialize(svn_stream
svn_branch_el_rev_content_t *node = svn_branch_map_get(branch, eid);
int parent_eid;
const char *name;
- const char *path;
if (node)
{
- path = svn_branch_get_path_by_eid(branch, eid, scratch_pool);
- SVN_ERR_ASSERT(path);
parent_eid = node->parent_eid;
name = node->name[0] ? node->name : ".";
- path = path[0] ? path : ".";
}
else
{
@@ -1129,7 +1175,6 @@ svn_branch_instance_serialize(svn_stream
parser currently can't handle that. */
parent_eid = -1;
name = "(null)";
- path = "(null)";
}
SVN_ERR(svn_stream_printf(stream, scratch_pool,
"b%de%d: %d %s\n",