/* Prepend to PARENT_SKEL the several fields that represent VERSION_INFO, */ static svn_error_t * prepend_version_info_skel(svn_skel_t *parent_skel, const svn_wc_conflict_version_t *version_info, apr_pool_t *pool) { svn_skel_t *skel = svn_skel__make_empty_list(pool); /* node_kind */ skel_prepend_enum(skel, node_kind_map, version_info->node_kind, pool); /* path_in_repos */ svn_skel__prepend(svn_skel__str_atom(version_info->path_in_repos ? version_info->path_in_repos : "", pool), skel); /* peg_rev */ svn_skel__prepend(svn_skel__str_atom(apr_psprintf(pool, "%ld", version_info->peg_rev), pool), skel); /* repos_url */ svn_skel__prepend(svn_skel__str_atom(version_info->repos_url ? version_info->repos_url : "", pool), skel); svn_skel__prepend(svn_skel__str_atom("version", pool), skel); SVN_ERR_ASSERT(is_valid_version_info_skel(skel)); svn_skel__prepend(skel, parent_skel); return SVN_NO_ERROR; }
static svn_boolean_t is_valid_conflict_skel(const svn_skel_t *skel) { int i; if (svn_skel__list_length(skel) != 8 || !svn_skel__matches_atom(skel->children, "conflict")) return FALSE; /* 5 atoms ... */ skel = skel->children->next; for (i = 5; i--; skel = skel->next) if (!skel->is_atom) return FALSE; /* ... and 2 version info skels. */ return (is_valid_version_info_skel(skel) && is_valid_version_info_skel(skel->next)); }
/* Parse the conflict info fields from SKEL into *VERSION_INFO. */ static svn_error_t * read_node_version_info(const svn_wc_conflict_version_t **version_info, const svn_skel_t *skel, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { int n; const char *repos_root; const char *repos_relpath; svn_revnum_t peg_rev; svn_node_kind_t kind; if (!is_valid_version_info_skel(skel)) return svn_error_create(SVN_ERR_WC_CORRUPT, NULL, _("Invalid version info in tree conflict " "description")); repos_root = apr_pstrmemdup(scratch_pool, skel->children->next->data, skel->children->next->len); if (*repos_root == '\0') { *version_info = NULL; return SVN_NO_ERROR; } /* Apply the Subversion 1.7+ url canonicalization rules to a pre 1.7 url */ repos_root = svn_uri_canonicalize(repos_root, result_pool); peg_rev = SVN_STR_TO_REV(apr_pstrmemdup(scratch_pool, skel->children->next->next->data, skel->children->next->next->len)); repos_relpath = apr_pstrmemdup(result_pool, skel->children->next->next->next->data, skel->children->next->next->next->len); SVN_ERR(read_enum_field(&n, node_kind_map, skel->children->next->next->next->next)); kind = (svn_node_kind_t)n; *version_info = svn_wc_conflict_version_create2(repos_root, NULL, repos_relpath, peg_rev, kind, result_pool); return SVN_NO_ERROR; }