ource revision of copy (if any). */ svn_revnum_t copyfrom_rev; } svn_log_changed_path_t; /** * Return a deep copy of @a changed_path, allocated in @a pool. * * @since New in 1.3. * @deprecated Provided for backward compatibility with the 1.5 API. */ SVN_DEPRECATED svn_log_changed_path_t * svn_log_changed_path_dup(const svn_log_changed_path_t *changed_path, apr_pool_t *pool); /** * A structure to represent all the information about a particular log entry. * * @note To allow for extending the #svn_log_entry_t structure in future * releases, always use svn_log_entry_create() to allocate the structure. * * @since New in 1.5. */ typedef struct svn_log_entry_t { /** A hash containing as keys every path committed in @a revision; the * values are (#svn_log_changed_path_t *) structures. * * The subversion core libraries will always set this field to the same * value as changed_paths2 for compatibility reasons. * * @deprecated Provided for backward compatibility with the 1.5 API. */ apr_hash_t *changed_paths; /** The revision of the commit. */ svn_revnum_t revision; /** The hash of requested revision properties, which may be NULL if it * would contain no revprops. Maps (const char *) property name to * (svn_string_t *) property value. */ apr_hash_t *revprops; /** * Whether or not this message has children. * * When a log operation requests additional merge information, extra log * entries may be returned as a result of this entry. The new entries, are * considered children of the original entry, and will follow it. When * the HAS_CHILDREN flag is set, the receiver should increment its stack * depth, and wait until an entry is provided with SVN_INVALID_REVNUM which * indicates the end of the children. * * For log operations which do not request additional merge information, the * HAS_CHILDREN flag is always FALSE. * * For more information see: * https://svn.apache.org/repos/asf/subversion/trunk/notes/merge-tracking/design.html#commutative-reporting */ svn_boolean_t has_children; /** A hash containing as keys every path committed in @a revision; the * values are (#svn_log_changed_path2_t *) structures. * * If this value is not @c NULL, it MUST have the same value as * changed_paths or svn_log_entry_dup() will not create an identical copy. * * The subversion core libraries will always set this field to the same * value as changed_paths for compatibility with users assuming an older * version. * * @note See http://svn.haxx.se/dev/archive-2010-08/0362.shtml for * further explanation. * * @since New in 1.6. */ apr_hash_t *changed_paths2; /** * Whether @a revision should be interpreted as non-inheritable in the * same sense of #svn_merge_range_t. * * Only set when this #svn_log_entry_t instance is returned by the * libsvn_client mergeinfo apis. Currently always FALSE when the * #svn_log_entry_t instance is reported by the ra layer. * * @since New in 1.7. */ svn_boolean_t non_inheritable; /** * Whether @a revision is a merged revision resulting from a reverse merge. * * @since New in 1.7. */ svn_boolean_t subtractive_merge; /* NOTE: Add new fields at the end to preserve binary compatibility. Also, if you add fields here, you have to update svn_log_entry_dup(). */ } svn_log_entry_t; /** * Returns an #svn_log_entry_t, allocated in @a pool with all fields * initialized to NULL values. * * @note To allow for extending the #svn_log_entry_t structure in future * releases, this function should always be used to allocate the structure. * * @since New in 1.5. */ svn_log_entry_t * svn_log_entry_create(apr_pool_t *pool); /** Return a deep copy of @a log_entry, allocated in @a pool. * * The resulting svn_log_entry_t has @c changed_paths set to the same * value as @c changed_path2. @c changed_paths will be @c NULL if * @c changed_paths2 was @c NULL. * * @since New in 1.6. */ svn_log_entry_t * svn_log_entry_dup(const svn_log_entry_t *log_entry, apr_pool_t *pool); /** The callback invoked by log message loopers, such as * #svn_ra_plugin_t.get_log() and svn_repos_get_logs(). * * This function is invoked once on each log message, in the order * determined by the caller (see above-mentioned functions). * * @a baton is what you think it is, and @a log_entry contains relevant * information for the log message. Any of @a log_entry->author, * @a log_entry->date, or @a log_entry->message may be @c NULL. * * If @a log_entry->date is neither NULL nor the empty string, it was * generated by svn_time_to_cstring() and can be converted to * @c apr_time_t with svn_time_from_cstring(). * * If @a log_entry->changed_paths is non-@c NULL, then it contains as keys * every path committed in @a log_entry->revision; the values are * (#svn_log_changed_path_t *) structures. * * If @a log_entry->has_children is @c TRUE, the message will be followed * immediately by any number of merged revisions (child messages), which are * terminated by an invocation with SVN_INVALID_REVNUM. This usage may * be recursive. * * Use @a pool for temporary allocation. If the caller is iterating * over log messages, invoking this receiver on each, we recommend the * standard pool loop recipe: create a subpool, pass it as @a pool to * each call, clear it after each iteration, destroy it after the loop * is done. (For allocation that must last beyond the lifetime of a * given receiver call, use a pool in @a baton.) * * @since New in 1.5. */ typedef svn_error_t *(*svn_log_entry_receiver_t)( void *baton, svn_log_entry_t *log_entry, apr_pool_t *pool); /** * Similar to #svn_log_entry_receiver_t, except this uses separate * parameters for each part of the log entry. * * @deprecated Provided for backward compatibility with the 1.4 API. */ typedef svn_error_t *(*svn_log_message_receiver_t)( void *baton, apr_hash_t *changed_paths, svn_revnum_t revision, const char *author, const char *date, /* use svn_time_from_cstring() if need apr_time_t */ const char *message, apr_pool_t *pool);