static svn_error_t * check_and_set_revprop(svn_revnum_t *set_rev, svn_ra_session_t *ra_session, const char *propname, const svn_string_t *original_propval, const svn_string_t *propval, apr_pool_t *pool) { if (original_propval) { /* Ensure old value hasn't changed behind our back. */ svn_string_t *current; SVN_ERR(svn_ra_rev_prop(ra_session, *set_rev, propname, ¤t, pool)); if (original_propval->data && (! current)) { return svn_error_createf( SVN_ERR_RA_OUT_OF_DATE, NULL, _("revprop '%s' in r%ld is unexpectedly absent " "in repository (maybe someone else deleted it?)"), propname, *set_rev); } else if (original_propval->data && (! svn_string_compare(original_propval, current))) { return svn_error_createf( SVN_ERR_RA_OUT_OF_DATE, NULL, _("revprop '%s' in r%ld has unexpected value " "in repository (maybe someone else changed it?)"), propname, *set_rev); } else if ((! original_propval->data) && current) { return svn_error_createf( SVN_ERR_RA_OUT_OF_DATE, NULL, _("revprop '%s' in r%ld is unexpectedly present " "in repository (maybe someone else set it?)"), propname, *set_rev); } } SVN_ERR(svn_ra_change_rev_prop2(ra_session, *set_rev, propname, NULL, propval, pool)); return SVN_NO_ERROR; }
svn_error_t * svn_client_revprop_get(const char *propname, svn_string_t **propval, const char *URL, const svn_opt_revision_t *revision, svn_revnum_t *set_rev, svn_client_ctx_t *ctx, apr_pool_t *pool) { svn_ra_session_t *ra_session; /* Open an RA session for the URL. Note that we don't have a local directory, nor a place to put temp files. */ SVN_ERR(svn_client__open_ra_session_internal(&ra_session, NULL, URL, NULL, NULL, FALSE, TRUE, ctx, pool)); /* Resolve the revision into something real, and return that to the caller as well. */ SVN_ERR(svn_client__get_revision_number(set_rev, NULL, ctx->wc_ctx, NULL, ra_session, revision, pool)); /* The actual RA call. */ return svn_ra_rev_prop(ra_session, *set_rev, propname, propval, pool); }
static svn_error_t * pre_15_receiver(void *baton, svn_log_entry_t *log_entry, apr_pool_t *pool) { pre_15_receiver_baton_t *rb = baton; if (log_entry->revision == SVN_INVALID_REVNUM) return rb->receiver(rb->baton, log_entry, pool); /* If only some revprops are requested, get them one at a time on the second ra connection. If all are requested, get them all with svn_ra_rev_proplist. This avoids getting unrequested revprops (which may be arbitrarily large), but means one round-trip per requested revprop. epg isn't entirely sure which should be optimized for. */ if (rb->revprops) { int i; svn_boolean_t want_author, want_date, want_log; want_author = want_date = want_log = FALSE; for (i = 0; i < rb->revprops->nelts; i++) { const char *name = APR_ARRAY_IDX(rb->revprops, i, const char *); svn_string_t *value; /* If a standard revprop is requested, we know it is already in log_entry->revprops if available. */ if (strcmp(name, SVN_PROP_REVISION_AUTHOR) == 0) { want_author = TRUE; continue; } if (strcmp(name, SVN_PROP_REVISION_DATE) == 0) { want_date = TRUE; continue; } if (strcmp(name, SVN_PROP_REVISION_LOG) == 0) { want_log = TRUE; continue; } if (rb->ra_session == NULL) SVN_ERR(svn_client_open_ra_session(&rb->ra_session, rb->ra_session_url, rb->ctx, rb->ra_session_pool)); SVN_ERR(svn_ra_rev_prop(rb->ra_session, log_entry->revision, name, &value, pool)); if (log_entry->revprops == NULL) log_entry->revprops = apr_hash_make(pool); apr_hash_set(log_entry->revprops, (const void *)name, APR_HASH_KEY_STRING, (const void *)value); } if (log_entry->revprops) { /* Pre-1.5 servers send the standard revprops unconditionally; clear those the caller doesn't want. */ if (!want_author) apr_hash_set(log_entry->revprops, SVN_PROP_REVISION_AUTHOR, APR_HASH_KEY_STRING, NULL); if (!want_date) apr_hash_set(log_entry->revprops, SVN_PROP_REVISION_DATE, APR_HASH_KEY_STRING, NULL); if (!want_log) apr_hash_set(log_entry->revprops, SVN_PROP_REVISION_LOG, APR_HASH_KEY_STRING, NULL); } }