/* Implement svn_log_entry_receiver_t. * Combine the data gathered in BATON for this revision and send it * to the user-provided log4-compatible callback. */ static svn_error_t * log4_entry_receiver(void *baton, svn_repos_log_entry_t *log_entry, apr_pool_t *scratch_pool) { log_entry_receiver_baton_t *b = baton; svn_log_entry_t *entry = svn_log_entry_create(scratch_pool); /* Complete the ENTRY. */ entry->changed_paths = b->changes; entry->revision = log_entry->revision; entry->revprops = log_entry->revprops; entry->has_children = log_entry->has_children; entry->changed_paths2 = b->changes; entry->non_inheritable = log_entry->non_inheritable; entry->subtractive_merge = log_entry->subtractive_merge; /* Invoke the log4-compatible callback. */ SVN_ERR(b->inner(b->inner_baton, entry, scratch_pool)); /* Release per-revision data. */ svn_pool_clear(b->changes_pool); b->changes = NULL; return SVN_NO_ERROR; }
/* Conforms to svn_ra_serf__xml_closed_t */ static svn_error_t * log_closed(svn_ra_serf__xml_estate_t *xes, void *baton, int leaving_state, const svn_string_t *cdata, apr_hash_t *attrs, apr_pool_t *scratch_pool) { log_context_t *log_ctx = baton; if (leaving_state == ITEM) { svn_log_entry_t *log_entry; const char *rev_str; if (log_ctx->limit && (log_ctx->nest_level == 0) && (++log_ctx->count > log_ctx->limit)) { return SVN_NO_ERROR; } log_entry = svn_log_entry_create(scratch_pool); /* Pick up the paths from the context. These have the same lifetime as this state. That is long enough for us to pass the paths to the receiver callback. */ if (apr_hash_count(log_ctx->collect_paths) > 0) { log_entry->changed_paths = log_ctx->collect_paths; log_entry->changed_paths2 = log_ctx->collect_paths; } /* ... and same story for the collected revprops. */ log_entry->revprops = log_ctx->collect_revprops; log_entry->has_children = svn_hash__get_bool(attrs, "has-children", FALSE); log_entry->subtractive_merge = svn_hash__get_bool(attrs, "subtractive-merge", FALSE); rev_str = apr_hash_get(attrs, "revision", APR_HASH_KEY_STRING); if (rev_str) log_entry->revision = SVN_STR_TO_REV(rev_str); else log_entry->revision = SVN_INVALID_REVNUM; /* Give the info to the reporter */ SVN_ERR(log_ctx->receiver(log_ctx->receiver_baton, log_entry, scratch_pool)); if (log_entry->has_children) { log_ctx->nest_level++; } if (! SVN_IS_VALID_REVNUM(log_entry->revision)) { SVN_ERR_ASSERT(log_ctx->nest_level); log_ctx->nest_level--; } /* These hash tables are going to be unusable once this state's pool is destroyed. But let's not leave stale pointers in structures that have a longer life. */ log_ctx->collect_revprops = NULL; log_ctx->collect_paths = NULL; } else if (leaving_state == VERSION) { svn_ra_serf__xml_note(xes, ITEM, "revision", cdata->data); } else if (leaving_state == CREATOR) { if (log_ctx->want_author) { SVN_ERR(collect_revprop(log_ctx->collect_revprops, SVN_PROP_REVISION_AUTHOR, cdata, apr_hash_get(attrs, "encoding", APR_HASH_KEY_STRING))); } } else if (leaving_state == DATE) { if (log_ctx->want_date) { SVN_ERR(collect_revprop(log_ctx->collect_revprops, SVN_PROP_REVISION_DATE, cdata, apr_hash_get(attrs, "encoding", APR_HASH_KEY_STRING))); } } else if (leaving_state == COMMENT) { if (log_ctx->want_message) { SVN_ERR(collect_revprop(log_ctx->collect_revprops, SVN_PROP_REVISION_LOG, cdata, apr_hash_get(attrs, "encoding", APR_HASH_KEY_STRING))); } } else if (leaving_state == REVPROP) { apr_pool_t *result_pool = apr_hash_pool_get(log_ctx->collect_revprops); SVN_ERR(collect_revprop( log_ctx->collect_revprops, apr_pstrdup(result_pool, apr_hash_get(attrs, "name", APR_HASH_KEY_STRING)), cdata, apr_hash_get(attrs, "encoding", APR_HASH_KEY_STRING) )); } else if (leaving_state == HAS_CHILDREN) { svn_ra_serf__xml_note(xes, ITEM, "has-children", "yes"); } else if (leaving_state == SUBTRACTIVE_MERGE) { svn_ra_serf__xml_note(xes, ITEM, "subtractive-merge", "yes"); } else { char action; if (leaving_state == ADDED_PATH) action = 'A'; else if (leaving_state == REPLACED_PATH) action = 'R'; else if (leaving_state == DELETED_PATH) action = 'D'; else { SVN_ERR_ASSERT(leaving_state == MODIFIED_PATH); action = 'M'; } SVN_ERR(collect_path(log_ctx->collect_paths, action, cdata, attrs)); } return SVN_NO_ERROR; }