Subversion
|
00001 /** 00002 * @copyright 00003 * ==================================================================== 00004 * Licensed to the Apache Software Foundation (ASF) under one 00005 * or more contributor license agreements. See the NOTICE file 00006 * distributed with this work for additional information 00007 * regarding copyright ownership. The ASF licenses this file 00008 * to you under the Apache License, Version 2.0 (the 00009 * "License"); you may not use this file except in compliance 00010 * with the License. You may obtain a copy of the License at 00011 * 00012 * http://www.apache.org/licenses/LICENSE-2.0 00013 * 00014 * Unless required by applicable law or agreed to in writing, 00015 * software distributed under the License is distributed on an 00016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 00017 * KIND, either express or implied. See the License for the 00018 * specific language governing permissions and limitations 00019 * under the License. 00020 * ==================================================================== 00021 * @endcopyright 00022 * 00023 * @file svn_repos.h 00024 * @brief Tools built on top of the filesystem. 00025 */ 00026 00027 #ifndef SVN_REPOS_H 00028 #define SVN_REPOS_H 00029 00030 #include <apr_pools.h> 00031 #include <apr_hash.h> 00032 #include <apr_tables.h> 00033 #include <apr_time.h> 00034 00035 #include "svn_types.h" 00036 #include "svn_string.h" 00037 #include "svn_delta.h" 00038 #include "svn_fs.h" 00039 #include "svn_io.h" 00040 #include "svn_mergeinfo.h" 00041 00042 00043 #ifdef __cplusplus 00044 extern "C" { 00045 #endif /* __cplusplus */ 00046 00047 /* ---------------------------------------------------------------*/ 00048 00049 /** 00050 * Get libsvn_repos version information. 00051 * 00052 * @since New in 1.1. 00053 */ 00054 const svn_version_t * 00055 svn_repos_version(void); 00056 00057 00058 /* Some useful enums. They need to be declared here for the notification 00059 system to pick them up. */ 00060 /** The different "actions" attached to nodes in the dumpfile. */ 00061 enum svn_node_action 00062 { 00063 svn_node_action_change, 00064 svn_node_action_add, 00065 svn_node_action_delete, 00066 svn_node_action_replace 00067 }; 00068 00069 /** The different policies for processing the UUID in the dumpfile. */ 00070 enum svn_repos_load_uuid 00071 { 00072 svn_repos_load_uuid_default, 00073 svn_repos_load_uuid_ignore, 00074 svn_repos_load_uuid_force 00075 }; 00076 00077 00078 /** Callback type for checking authorization on paths produced by (at 00079 * least) svn_repos_dir_delta2(). 00080 * 00081 * Set @a *allowed to TRUE to indicate that some operation is 00082 * authorized for @a path in @a root, or set it to FALSE to indicate 00083 * unauthorized (presumably according to state stored in @a baton). 00084 * 00085 * Do not assume @a pool has any lifetime beyond this call. 00086 * 00087 * The exact operation being authorized depends on the callback 00088 * implementation. For read authorization, for example, the caller 00089 * would implement an instance that does read checking, and pass it as 00090 * a parameter named [perhaps] 'authz_read_func'. The receiver of 00091 * that parameter might also take another parameter named 00092 * 'authz_write_func', which although sharing this type, would be a 00093 * different implementation. 00094 * 00095 * @note If someday we want more sophisticated authorization states 00096 * than just yes/no, @a allowed can become an enum type. 00097 */ 00098 typedef svn_error_t *(*svn_repos_authz_func_t)(svn_boolean_t *allowed, 00099 svn_fs_root_t *root, 00100 const char *path, 00101 void *baton, 00102 apr_pool_t *pool); 00103 00104 00105 /** An enum defining the kinds of access authz looks up. 00106 * 00107 * @since New in 1.3. 00108 */ 00109 typedef enum svn_repos_authz_access_t 00110 { 00111 /** No access. */ 00112 svn_authz_none = 0, 00113 00114 /** Path can be read. */ 00115 svn_authz_read = 1, 00116 00117 /** Path can be altered. */ 00118 svn_authz_write = 2, 00119 00120 /** The other access credentials are recursive. */ 00121 svn_authz_recursive = 4 00122 } svn_repos_authz_access_t; 00123 00124 00125 /** Callback type for checking authorization on paths produced by 00126 * the repository commit editor. 00127 * 00128 * Set @a *allowed to TRUE to indicate that the @a required access on 00129 * @a path in @a root is authorized, or set it to FALSE to indicate 00130 * unauthorized (presumable according to state stored in @a baton). 00131 * 00132 * If @a path is NULL, the callback should perform a global authz 00133 * lookup for the @a required access. That is, the lookup should 00134 * check if the @a required access is granted for at least one path of 00135 * the repository, and set @a *allowed to TRUE if so. @a root may 00136 * also be NULL if @a path is NULL. 00137 * 00138 * This callback is very similar to svn_repos_authz_func_t, with the 00139 * exception of the addition of the @a required parameter. 00140 * This is due to historical reasons: when authz was first implemented 00141 * for svn_repos_dir_delta2(), it seemed there would need only checks 00142 * for read and write operations, hence the svn_repos_authz_func_t 00143 * callback prototype and usage scenario. But it was then realized 00144 * that lookups due to copying needed to be recursive, and that 00145 * brute-force recursive lookups didn't square with the O(1) 00146 * performances a copy operation should have. 00147 * 00148 * So a special way to ask for a recursive lookup was introduced. The 00149 * commit editor needs this capability to retain acceptable 00150 * performance. Instead of revving the existing callback, causing 00151 * unnecessary revving of functions that don't actually need the 00152 * extended functionality, this second, more complete callback was 00153 * introduced, for use by the commit editor. 00154 * 00155 * Some day, it would be nice to reunite these two callbacks and do 00156 * the necessary revving anyway, but for the time being, this dual 00157 * callback mechanism will do. 00158 */ 00159 typedef svn_error_t *(*svn_repos_authz_callback_t) 00160 (svn_repos_authz_access_t required, 00161 svn_boolean_t *allowed, 00162 svn_fs_root_t *root, 00163 const char *path, 00164 void *baton, 00165 apr_pool_t *pool); 00166 00167 /** 00168 * Similar to #svn_file_rev_handler_t, but without the @a 00169 * result_of_merge parameter. 00170 * 00171 * @deprecated Provided for backward compatibility with 1.4 API. 00172 * @since New in 1.1. 00173 */ 00174 typedef svn_error_t *(*svn_repos_file_rev_handler_t) 00175 (void *baton, 00176 const char *path, 00177 svn_revnum_t rev, 00178 apr_hash_t *rev_props, 00179 svn_txdelta_window_handler_t *delta_handler, 00180 void **delta_baton, 00181 apr_array_header_t *prop_diffs, 00182 apr_pool_t *pool); 00183 00184 00185 /* Notification system. */ 00186 00187 /** The type of action occurring. 00188 * 00189 * @since New in 1.7. 00190 */ 00191 typedef enum svn_repos_notify_action_t 00192 { 00193 /** A warning message is waiting. */ 00194 svn_repos_notify_warning = 0, 00195 00196 /** A revision has finished being dumped. */ 00197 svn_repos_notify_dump_rev_end, 00198 00199 /** A revision has finished being verified. */ 00200 svn_repos_notify_verify_rev_end, 00201 00202 /** All revisions have finished being dumped. */ 00203 svn_repos_notify_dump_end, 00204 00205 /** All revisions have finished being verified. */ 00206 svn_repos_notify_verify_end, 00207 00208 /** packing of an FSFS shard has commenced */ 00209 svn_repos_notify_pack_shard_start, 00210 00211 /** packing of an FSFS shard is completed */ 00212 svn_repos_notify_pack_shard_end, 00213 00214 /** packing of the shard revprops has commenced */ 00215 svn_repos_notify_pack_shard_start_revprop, 00216 00217 /** packing of the shard revprops has completed */ 00218 svn_repos_notify_pack_shard_end_revprop, 00219 00220 /** A revision has begun loading */ 00221 svn_repos_notify_load_txn_start, 00222 00223 /** A revision has finished loading */ 00224 svn_repos_notify_load_txn_committed, 00225 00226 /** A node has begun loading */ 00227 svn_repos_notify_load_node_start, 00228 00229 /** A node has finished loading */ 00230 svn_repos_notify_load_node_done, 00231 00232 /** A copied node has been encountered */ 00233 svn_repos_notify_load_copied_node, 00234 00235 /** Mergeinfo has been normalized */ 00236 svn_repos_notify_load_normalized_mergeinfo, 00237 00238 /** The operation has acquired a mutex for the repo. */ 00239 svn_repos_notify_mutex_acquired, 00240 00241 /** Recover has started. */ 00242 svn_repos_notify_recover_start, 00243 00244 /** Upgrade has started. */ 00245 svn_repos_notify_upgrade_start 00246 00247 } svn_repos_notify_action_t; 00248 00249 /** The type of error occurring. 00250 * 00251 * @since New in 1.7. 00252 */ 00253 typedef enum svn_repos_notify_warning_t 00254 { 00255 /** Referencing copy source data from a revision earlier than the 00256 * first revision dumped. */ 00257 svn_repos_notify_warning_found_old_reference, 00258 00259 /** An #SVN_PROP_MERGEINFO property's encoded mergeinfo references a 00260 * revision earlier than the first revision dumped. */ 00261 svn_repos_notify_warning_found_old_mergeinfo, 00262 00263 /** Found an invalid path in the filesystem. 00264 * @see svn_fs.h:"Directory entry names and directory paths" */ 00265 /* ### TODO(doxygen): make that a proper doxygen link */ 00266 /* See svn_fs__path_valid(). */ 00267 svn_repos_notify_warning_invalid_fspath 00268 00269 } svn_repos_notify_warning_t; 00270 00271 /** 00272 * Structure used by #svn_repos_notify_func_t. 00273 * 00274 * The only field guaranteed to be populated is @c action. Other fields are 00275 * dependent upon the @c action. (See individual fields for more information.) 00276 * 00277 * @note Callers of notification functions should use 00278 * svn_repos_notify_create() to create structures of this type to allow for 00279 * future extensibility. 00280 * 00281 * @since New in 1.7. 00282 */ 00283 typedef struct svn_repos_notify_t 00284 { 00285 /** Action that describes what happened in the repository. */ 00286 svn_repos_notify_action_t action; 00287 00288 /** For #svn_repos_notify_dump_rev_end and #svn_repos_notify_verify_rev_end, 00289 * the revision which just completed. */ 00290 svn_revnum_t revision; 00291 00292 /** For #svn_repos_notify_warning, the warning object. Must be cleared 00293 by the consumer of the notification. */ 00294 const char *warning_str; 00295 svn_repos_notify_warning_t warning; 00296 00297 /** For #svn_repos_notify_pack_shard_start, 00298 #svn_repos_notify_pack_shard_end, 00299 #svn_repos_notify_pack_shard_start_revprop, and 00300 #svn_repos_notify_pack_shard_end_revprop, the shard processed. */ 00301 apr_int64_t shard; 00302 00303 /** For #svn_repos_notify_load_committed_rev, the revision committed. */ 00304 svn_revnum_t new_revision; 00305 00306 /** For #svn_repos_notify_load_committed_rev, the source revision, if 00307 different from @a new_revision, otherwise #SVN_INVALID_REVNUM. 00308 For #svn_repos_notify_load_txn_start, the source revision. */ 00309 svn_revnum_t old_revision; 00310 00311 /** For #svn_repos_notify_load_node_start, the action being taken on the 00312 node. */ 00313 enum svn_node_action node_action; 00314 00315 /** For #svn_repos_notify_load_node_start, the path of the node. */ 00316 const char *path; 00317 00318 /* NOTE: Add new fields at the end to preserve binary compatibility. 00319 Also, if you add fields here, you have to update 00320 svn_repos_notify_create(). */ 00321 } svn_repos_notify_t; 00322 00323 /** Callback for providing notification from the repository. 00324 * Returns @c void. Justification: success of an operation is not dependent 00325 * upon successful notification of that operation. 00326 * 00327 * @since New in 1.7. */ 00328 typedef void (*svn_repos_notify_func_t)(void *baton, 00329 const svn_repos_notify_t *notify, 00330 apr_pool_t *scratch_pool); 00331 00332 /** 00333 * Allocate an #svn_repos_notify_t structure in @a result_pool, initialize 00334 * and return it. 00335 * 00336 * @since New in 1.7. 00337 */ 00338 svn_repos_notify_t * 00339 svn_repos_notify_create(svn_repos_notify_action_t action, 00340 apr_pool_t *result_pool); 00341 00342 00343 /** The repository object. */ 00344 typedef struct svn_repos_t svn_repos_t; 00345 00346 /* Opening and creating repositories. */ 00347 00348 00349 /** Find the root path of the repository that contains @a path. 00350 * 00351 * If a repository was found, the path to the root of the repository 00352 * is returned, else @c NULL. The pointer to the returned path may be 00353 * equal to @a path. 00354 */ 00355 const char * 00356 svn_repos_find_root_path(const char *path, 00357 apr_pool_t *pool); 00358 00359 /** Set @a *repos_p to a repository object for the repository at @a path. 00360 * 00361 * Allocate @a *repos_p in @a pool. 00362 * 00363 * Acquires a shared lock on the repository, and attaches a cleanup 00364 * function to @a pool to remove the lock. If no lock can be acquired, 00365 * returns error, with undefined effect on @a *repos_p. If an exclusive 00366 * lock is present, this blocks until it's gone. @a fs_config will be 00367 * passed to the filesystem initialization function and may be @c NULL. 00368 * 00369 * @since New in 1.7. 00370 */ 00371 svn_error_t * 00372 svn_repos_open2(svn_repos_t **repos_p, 00373 const char *path, 00374 apr_hash_t *fs_config, 00375 apr_pool_t *pool); 00376 00377 /** Similar to svn_repos_open2() with @a fs_config set to NULL. 00378 * 00379 * @deprecated Provided for backward compatibility with 1.6 API. 00380 */ 00381 SVN_DEPRECATED 00382 svn_error_t * 00383 svn_repos_open(svn_repos_t **repos_p, 00384 const char *path, 00385 apr_pool_t *pool); 00386 00387 /** Create a new Subversion repository at @a path, building the necessary 00388 * directory structure, creating the filesystem, and so on. 00389 * Return the repository object in @a *repos_p, allocated in @a pool. 00390 * 00391 * @a config is a client configuration hash of #svn_config_t * items 00392 * keyed on config category names, and may be NULL. 00393 * 00394 * @a fs_config is passed to the filesystem, and may be NULL. 00395 * 00396 * @a unused_1 and @a unused_2 are not used and should be NULL. 00397 */ 00398 svn_error_t * 00399 svn_repos_create(svn_repos_t **repos_p, 00400 const char *path, 00401 const char *unused_1, 00402 const char *unused_2, 00403 apr_hash_t *config, 00404 apr_hash_t *fs_config, 00405 apr_pool_t *pool); 00406 00407 /** 00408 * Upgrade the Subversion repository (and its underlying versioned 00409 * filesystem) located in the directory @a path to the latest version 00410 * supported by this library. If the requested upgrade is not 00411 * supported due to the current state of the repository or it 00412 * underlying filesystem, return #SVN_ERR_REPOS_UNSUPPORTED_UPGRADE 00413 * or #SVN_ERR_FS_UNSUPPORTED_UPGRADE (respectively) and make no 00414 * changes to the repository or filesystem. 00415 * 00416 * Acquires an exclusive lock on the repository, upgrades the 00417 * repository, and releases the lock. If an exclusive lock can't be 00418 * acquired, returns error. 00419 * 00420 * If @a nonblocking is TRUE, an error of type EWOULDBLOCK is 00421 * returned if the lock is not immediately available. 00422 * 00423 * If @a start_callback is not NULL, it will be called with @a 00424 * start_callback_baton as argument before the upgrade starts, but 00425 * after the exclusive lock has been acquired. 00426 * 00427 * Use @a pool for necessary allocations. 00428 * 00429 * @note This functionality is provided as a convenience for 00430 * administrators wishing to make use of new Subversion functionality 00431 * without a potentially costly full repository dump/load. As such, 00432 * the operation performs only the minimum amount of work needed to 00433 * accomplish this while maintaining the integrity of the repository. 00434 * It does *not* guarantee the most optimized repository state as a 00435 * dump and subsequent load would. 00436 * 00437 * @since New in 1.7. 00438 */ 00439 svn_error_t * 00440 svn_repos_upgrade2(const char *path, 00441 svn_boolean_t nonblocking, 00442 svn_repos_notify_func_t notify_func, 00443 void *notify_baton, 00444 apr_pool_t *pool); 00445 00446 /** 00447 * Similar to svn_repos_upgrade2(), but with @a start_callback and baton, 00448 * rather than a notify_callback / baton 00449 * 00450 * @since New in 1.5. 00451 * @deprecated Provided for backward compatibility with the 1.6 API. 00452 */ 00453 SVN_DEPRECATED 00454 svn_error_t * 00455 svn_repos_upgrade(const char *path, 00456 svn_boolean_t nonblocking, 00457 svn_error_t *(*start_callback)(void *baton), 00458 void *start_callback_baton, 00459 apr_pool_t *pool); 00460 00461 /** Destroy the Subversion repository found at @a path, using @a pool for any 00462 * necessary allocations. 00463 */ 00464 svn_error_t * 00465 svn_repos_delete(const char *path, 00466 apr_pool_t *pool); 00467 00468 /** 00469 * Set @a *has to TRUE if @a repos has @a capability (one of the 00470 * capabilities beginning with @c "SVN_REPOS_CAPABILITY_"), else set 00471 * @a *has to FALSE. 00472 * 00473 * If @a capability isn't recognized, throw #SVN_ERR_UNKNOWN_CAPABILITY, 00474 * with the effect on @a *has undefined. 00475 * 00476 * Use @a pool for all allocation. 00477 * 00478 * @since New in 1.5. 00479 */ 00480 svn_error_t * 00481 svn_repos_has_capability(svn_repos_t *repos, 00482 svn_boolean_t *has, 00483 const char *capability, 00484 apr_pool_t *pool); 00485 00486 /** 00487 * The capability of doing the right thing with merge-tracking 00488 * information, both storing it and responding to queries about it. 00489 * 00490 * @since New in 1.5. 00491 */ 00492 #define SVN_REPOS_CAPABILITY_MERGEINFO "mergeinfo" 00493 /* *** PLEASE READ THIS IF YOU ADD A NEW CAPABILITY *** 00494 * 00495 * @c SVN_REPOS_CAPABILITY_foo strings should not include colons, to 00496 * be consistent with @c SVN_RA_CAPABILITY_foo strings, which forbid 00497 * colons for their own reasons. While this RA limitation has no 00498 * direct impact on repository capabilities, there's no reason to be 00499 * gratuitously different either. 00500 */ 00501 00502 00503 /** Return the filesystem associated with repository object @a repos. */ 00504 svn_fs_t * 00505 svn_repos_fs(svn_repos_t *repos); 00506 00507 00508 /** Make a hot copy of the Subversion repository found at @a src_path 00509 * to @a dst_path. 00510 * 00511 * Copy a possibly live Subversion repository from @a src_path to 00512 * @a dst_path. If @a clean_logs is @c TRUE, perform cleanup on the 00513 * source filesystem as part of the copy operation; currently, this 00514 * means deleting copied, unused logfiles for a Berkeley DB source 00515 * repository. 00516 */ 00517 svn_error_t * 00518 svn_repos_hotcopy(const char *src_path, 00519 const char *dst_path, 00520 svn_boolean_t clean_logs, 00521 apr_pool_t *pool); 00522 00523 00524 /** 00525 * Possibly update the repository, @a repos, to use a more efficient 00526 * filesystem representation. Use @a pool for allocations. 00527 * 00528 * @since New in 1.7. 00529 */ 00530 svn_error_t * 00531 svn_repos_fs_pack2(svn_repos_t *repos, 00532 svn_repos_notify_func_t notify_func, 00533 void *notify_baton, 00534 svn_cancel_func_t cancel_func, 00535 void *cancel_baton, 00536 apr_pool_t *pool); 00537 00538 /** 00539 * Similar to svn_repos_fs_pack2(), but with a #svn_fs_pack_notify_t instead 00540 * of a #svn_repos_notify_t. 00541 * 00542 * @since New in 1.6. 00543 * @deprecated Provided for backward compatibility with the 1.6 API. 00544 */ 00545 SVN_DEPRECATED 00546 svn_error_t * 00547 svn_repos_fs_pack(svn_repos_t *repos, 00548 svn_fs_pack_notify_t notify_func, 00549 void *notify_baton, 00550 svn_cancel_func_t cancel_func, 00551 void *cancel_baton, 00552 apr_pool_t *pool); 00553 00554 /** 00555 * Run database recovery procedures on the repository at @a path, 00556 * returning the database to a consistent state. Use @a pool for all 00557 * allocation. 00558 * 00559 * Acquires an exclusive lock on the repository, recovers the 00560 * database, and releases the lock. If an exclusive lock can't be 00561 * acquired, returns error. 00562 * 00563 * If @a nonblocking is TRUE, an error of type EWOULDBLOCK is 00564 * returned if the lock is not immediately available. 00565 * 00566 * If @a notify_func is not NULL, it will be called with @a 00567 * notify_baton as argument before the recovery starts, but 00568 * after the exclusive lock has been acquired. 00569 * 00570 * If @a cancel_func is not @c NULL, it is called periodically with 00571 * @a cancel_baton as argument to see if the client wishes to cancel 00572 * the recovery. 00573 * 00574 * @note On some platforms the exclusive lock does not exclude other 00575 * threads in the same process so this function should only be called 00576 * by a single threaded process, or by a multi-threaded process when 00577 * no other threads are accessing the repository. 00578 * 00579 * @since New in 1.7. 00580 */ 00581 svn_error_t * 00582 svn_repos_recover4(const char *path, 00583 svn_boolean_t nonblocking, 00584 svn_repos_notify_func_t notify_func, 00585 void *notify_baton, 00586 svn_cancel_func_t cancel_func, 00587 void * cancel_baton, 00588 apr_pool_t *pool); 00589 00590 /** 00591 * Similar to svn_repos_recover4(), but with @a start callback in place of 00592 * the notify_func / baton. 00593 * 00594 * @since New in 1.5. 00595 * @deprecated Provided for backward compatibility with the 1.6 API. 00596 */ 00597 SVN_DEPRECATED 00598 svn_error_t * 00599 svn_repos_recover3(const char *path, 00600 svn_boolean_t nonblocking, 00601 svn_error_t *(*start_callback)(void *baton), 00602 void *start_callback_baton, 00603 svn_cancel_func_t cancel_func, 00604 void * cancel_baton, 00605 apr_pool_t *pool); 00606 00607 /** 00608 * Similar to svn_repos_recover3(), but without cancellation support. 00609 * 00610 * @deprecated Provided for backward compatibility with the 1.4 API. 00611 */ 00612 SVN_DEPRECATED 00613 svn_error_t * 00614 svn_repos_recover2(const char *path, 00615 svn_boolean_t nonblocking, 00616 svn_error_t *(*start_callback)(void *baton), 00617 void *start_callback_baton, 00618 apr_pool_t *pool); 00619 00620 /** 00621 * Similar to svn_repos_recover2(), but with nonblocking set to FALSE, and 00622 * with no callbacks provided. 00623 * 00624 * @deprecated Provided for backward compatibility with the 1.0 API. 00625 */ 00626 SVN_DEPRECATED 00627 svn_error_t * 00628 svn_repos_recover(const char *path, 00629 apr_pool_t *pool); 00630 00631 /** This function is a wrapper around svn_fs_berkeley_logfiles(), 00632 * returning log file paths relative to the root of the repository. 00633 * 00634 * @copydoc svn_fs_berkeley_logfiles() 00635 */ 00636 svn_error_t * 00637 svn_repos_db_logfiles(apr_array_header_t **logfiles, 00638 const char *path, 00639 svn_boolean_t only_unused, 00640 apr_pool_t *pool); 00641 00642 00643 00644 /* Repository Paths */ 00645 00646 /** Return the top-level repository path allocated in @a pool. */ 00647 const char * 00648 svn_repos_path(svn_repos_t *repos, 00649 apr_pool_t *pool); 00650 00651 /** Return the path to @a repos's filesystem directory, allocated in 00652 * @a pool. 00653 */ 00654 const char * 00655 svn_repos_db_env(svn_repos_t *repos, 00656 apr_pool_t *pool); 00657 00658 /** Return path to @a repos's config directory, allocated in @a pool. */ 00659 const char * 00660 svn_repos_conf_dir(svn_repos_t *repos, 00661 apr_pool_t *pool); 00662 00663 /** Return path to @a repos's svnserve.conf, allocated in @a pool. */ 00664 const char * 00665 svn_repos_svnserve_conf(svn_repos_t *repos, 00666 apr_pool_t *pool); 00667 00668 /** Return path to @a repos's lock directory, allocated in @a pool. */ 00669 const char * 00670 svn_repos_lock_dir(svn_repos_t *repos, 00671 apr_pool_t *pool); 00672 00673 /** Return path to @a repos's db lockfile, allocated in @a pool. */ 00674 const char * 00675 svn_repos_db_lockfile(svn_repos_t *repos, 00676 apr_pool_t *pool); 00677 00678 /** Return path to @a repos's db logs lockfile, allocated in @a pool. */ 00679 const char * 00680 svn_repos_db_logs_lockfile(svn_repos_t *repos, 00681 apr_pool_t *pool); 00682 00683 /** Return the path to @a repos's hook directory, allocated in @a pool. */ 00684 const char * 00685 svn_repos_hook_dir(svn_repos_t *repos, 00686 apr_pool_t *pool); 00687 00688 /** Return the path to @a repos's start-commit hook, allocated in @a pool. */ 00689 const char * 00690 svn_repos_start_commit_hook(svn_repos_t *repos, 00691 apr_pool_t *pool); 00692 00693 /** Return the path to @a repos's pre-commit hook, allocated in @a pool. */ 00694 const char * 00695 svn_repos_pre_commit_hook(svn_repos_t *repos, 00696 apr_pool_t *pool); 00697 00698 /** Return the path to @a repos's post-commit hook, allocated in @a pool. */ 00699 const char * 00700 svn_repos_post_commit_hook(svn_repos_t *repos, 00701 apr_pool_t *pool); 00702 00703 /** Return the path to @a repos's pre-revprop-change hook, allocated in 00704 * @a pool. 00705 */ 00706 const char * 00707 svn_repos_pre_revprop_change_hook(svn_repos_t *repos, 00708 apr_pool_t *pool); 00709 00710 /** Return the path to @a repos's post-revprop-change hook, allocated in 00711 * @a pool. 00712 */ 00713 const char * 00714 svn_repos_post_revprop_change_hook(svn_repos_t *repos, 00715 apr_pool_t *pool); 00716 00717 00718 /** @defgroup svn_repos_lock_hooks Paths to lock hooks 00719 * @{ 00720 * @since New in 1.2. */ 00721 00722 /** Return the path to @a repos's pre-lock hook, allocated in @a pool. */ 00723 const char * 00724 svn_repos_pre_lock_hook(svn_repos_t *repos, 00725 apr_pool_t *pool); 00726 00727 /** Return the path to @a repos's post-lock hook, allocated in @a pool. */ 00728 const char * 00729 svn_repos_post_lock_hook(svn_repos_t *repos, 00730 apr_pool_t *pool); 00731 00732 /** Return the path to @a repos's pre-unlock hook, allocated in @a pool. */ 00733 const char * 00734 svn_repos_pre_unlock_hook(svn_repos_t *repos, 00735 apr_pool_t *pool); 00736 00737 /** Return the path to @a repos's post-unlock hook, allocated in @a pool. */ 00738 const char * 00739 svn_repos_post_unlock_hook(svn_repos_t *repos, 00740 apr_pool_t *pool); 00741 00742 /** @} */ 00743 00744 /* ---------------------------------------------------------------*/ 00745 00746 /* Reporting the state of a working copy, for updates. */ 00747 00748 00749 /** 00750 * Construct and return a @a report_baton that will be passed to the 00751 * other functions in this section to describe the state of a pre-existing 00752 * tree (typically, a working copy). When the report is finished, 00753 * @a editor/@a edit_baton will be driven in such a way as to transform the 00754 * existing tree to @a revnum and, if @a tgt_path is non-NULL, switch the 00755 * reported hierarchy to @a tgt_path. 00756 * 00757 * @a fs_base is the absolute path of the node in the filesystem at which 00758 * the comparison should be rooted. @a target is a single path component, 00759 * used to limit the scope of the report to a single entry of @a fs_base, 00760 * or "" if all of @a fs_base itself is the main subject of the report. 00761 * 00762 * @a tgt_path and @a revnum is the fs path/revision pair that is the 00763 * "target" of the delta. @a tgt_path should be provided only when 00764 * the source and target paths of the report differ. That is, @a tgt_path 00765 * should *only* be specified when specifying that the resultant editor 00766 * drive be one that transforms the reported hierarchy into a pristine tree 00767 * of @a tgt_path at revision @a revnum. A @c NULL value for @a tgt_path 00768 * will indicate that the editor should be driven in such a way as to 00769 * transform the reported hierarchy to revision @a revnum, preserving the 00770 * reported hierarchy. 00771 * 00772 * @a text_deltas instructs the driver of the @a editor to enable 00773 * the generation of text deltas. 00774 * 00775 * @a ignore_ancestry instructs the driver to ignore node ancestry 00776 * when determining how to transmit differences. 00777 * 00778 * @a send_copyfrom_args instructs the driver to send 'copyfrom' 00779 * arguments to the editor's add_file() and add_directory() methods, 00780 * whenever it deems feasible. 00781 * 00782 * Use @a authz_read_func and @a authz_read_baton (if not @c NULL) to 00783 * avoid sending data through @a editor/@a edit_baton which is not 00784 * authorized for transmission. 00785 * 00786 * All allocation for the context and collected state will occur in 00787 * @a pool. 00788 * 00789 * @a depth is the requested depth of the editor drive. 00790 * 00791 * If @a depth is #svn_depth_unknown, the editor will affect only the 00792 * paths reported by the individual calls to svn_repos_set_path3() and 00793 * svn_repos_link_path3(). 00794 * 00795 * For example, if the reported tree is the @c A subdir of the Greek Tree 00796 * (see Subversion's test suite), at depth #svn_depth_empty, but the 00797 * @c A/B subdir is reported at depth #svn_depth_infinity, then 00798 * repository-side changes to @c A/mu, or underneath @c A/C and @c 00799 * A/D, would not be reflected in the editor drive, but changes 00800 * underneath @c A/B would be. 00801 * 00802 * Additionally, the editor driver will call @c add_directory and 00803 * and @c add_file for directories with an appropriate depth. For 00804 * example, a directory reported at #svn_depth_files will receive 00805 * file (but not directory) additions. A directory at #svn_depth_empty 00806 * will receive neither. 00807 * 00808 * If @a depth is #svn_depth_files, #svn_depth_immediates or 00809 * #svn_depth_infinity and @a depth is greater than the reported depth 00810 * of the working copy, then the editor driver will emit editor 00811 * operations so as to upgrade the working copy to this depth. 00812 * 00813 * If @a depth is #svn_depth_empty, #svn_depth_files, 00814 * #svn_depth_immediates and @a depth is lower 00815 * than or equal to the depth of the working copy, then the editor 00816 * operations will affect only paths at or above @a depth. 00817 * 00818 * @since New in 1.5. 00819 */ 00820 svn_error_t * 00821 svn_repos_begin_report2(void **report_baton, 00822 svn_revnum_t revnum, 00823 svn_repos_t *repos, 00824 const char *fs_base, 00825 const char *target, 00826 const char *tgt_path, 00827 svn_boolean_t text_deltas, 00828 svn_depth_t depth, 00829 svn_boolean_t ignore_ancestry, 00830 svn_boolean_t send_copyfrom_args, 00831 const svn_delta_editor_t *editor, 00832 void *edit_baton, 00833 svn_repos_authz_func_t authz_read_func, 00834 void *authz_read_baton, 00835 apr_pool_t *pool); 00836 00837 /** 00838 * The same as svn_repos_begin_report2(), but taking a boolean 00839 * @a recurse flag, and sending FALSE for @a send_copyfrom_args. 00840 * 00841 * If @a recurse is TRUE, the editor driver will drive the editor with 00842 * a depth of #svn_depth_infinity; if FALSE, then with a depth of 00843 * #svn_depth_files. 00844 * 00845 * @note @a username is ignored, and has been removed in a revised 00846 * version of this API. 00847 * 00848 * @deprecated Provided for backward compatibility with the 1.4 API. 00849 */ 00850 SVN_DEPRECATED 00851 svn_error_t * 00852 svn_repos_begin_report(void **report_baton, 00853 svn_revnum_t revnum, 00854 const char *username, 00855 svn_repos_t *repos, 00856 const char *fs_base, 00857 const char *target, 00858 const char *tgt_path, 00859 svn_boolean_t text_deltas, 00860 svn_boolean_t recurse, 00861 svn_boolean_t ignore_ancestry, 00862 const svn_delta_editor_t *editor, 00863 void *edit_baton, 00864 svn_repos_authz_func_t authz_read_func, 00865 void *authz_read_baton, 00866 apr_pool_t *pool); 00867 00868 00869 /** 00870 * Given a @a report_baton constructed by svn_repos_begin_report2(), 00871 * record the presence of @a path, at @a revision with depth @a depth, 00872 * in the current tree. 00873 * 00874 * @a path is relative to the anchor/target used in the creation of the 00875 * @a report_baton. 00876 * 00877 * @a revision may be SVN_INVALID_REVNUM if (for example) @a path 00878 * represents a locally-added path with no revision number, or @a 00879 * depth is #svn_depth_exclude. 00880 * 00881 * @a path may not be underneath a path on which svn_repos_set_path3() 00882 * was previously called with #svn_depth_exclude in this report. 00883 * 00884 * The first call of this in a given report usually passes an empty 00885 * @a path; this is used to set up the correct root revision for the editor 00886 * drive. 00887 * 00888 * A depth of #svn_depth_unknown is not allowed, and results in an 00889 * error. 00890 * 00891 * If @a start_empty is TRUE and @a path is a directory, then require the 00892 * caller to explicitly provide all the children of @a path - do not assume 00893 * that the tree also contains all the children of @a path at @a revision. 00894 * This is for 'low confidence' client reporting. 00895 * 00896 * If the caller has a lock token for @a path, then @a lock_token should 00897 * be set to that token. Else, @a lock_token should be NULL. 00898 * 00899 * All temporary allocations are done in @a pool. 00900 * 00901 * @since New in 1.5. 00902 */ 00903 svn_error_t * 00904 svn_repos_set_path3(void *report_baton, 00905 const char *path, 00906 svn_revnum_t revision, 00907 svn_depth_t depth, 00908 svn_boolean_t start_empty, 00909 const char *lock_token, 00910 apr_pool_t *pool); 00911 00912 /** 00913 * Similar to svn_repos_set_path3(), but with @a depth set to 00914 * #svn_depth_infinity. 00915 * 00916 * @deprecated Provided for backward compatibility with the 1.4 API. 00917 */ 00918 SVN_DEPRECATED 00919 svn_error_t * 00920 svn_repos_set_path2(void *report_baton, 00921 const char *path, 00922 svn_revnum_t revision, 00923 svn_boolean_t start_empty, 00924 const char *lock_token, 00925 apr_pool_t *pool); 00926 00927 /** 00928 * Similar to svn_repos_set_path2(), but with @a lock_token set to @c NULL. 00929 * 00930 * @deprecated Provided for backward compatibility with the 1.1 API. 00931 */ 00932 SVN_DEPRECATED 00933 svn_error_t * 00934 svn_repos_set_path(void *report_baton, 00935 const char *path, 00936 svn_revnum_t revision, 00937 svn_boolean_t start_empty, 00938 apr_pool_t *pool); 00939 00940 /** 00941 * Given a @a report_baton constructed by svn_repos_begin_report2(), 00942 * record the presence of @a path in the current tree, containing the contents 00943 * of @a link_path at @a revision with depth @a depth. 00944 * 00945 * A depth of #svn_depth_unknown is not allowed, and results in an 00946 * error. 00947 * 00948 * @a path may not be underneath a path on which svn_repos_set_path3() 00949 * was previously called with #svn_depth_exclude in this report. 00950 * 00951 * Note that while @a path is relative to the anchor/target used in the 00952 * creation of the @a report_baton, @a link_path is an absolute filesystem 00953 * path! 00954 * 00955 * If @a start_empty is TRUE and @a path is a directory, then require the 00956 * caller to explicitly provide all the children of @a path - do not assume 00957 * that the tree also contains all the children of @a link_path at 00958 * @a revision. This is for 'low confidence' client reporting. 00959 * 00960 * If the caller has a lock token for @a link_path, then @a lock_token 00961 * should be set to that token. Else, @a lock_token should be NULL. 00962 * 00963 * All temporary allocations are done in @a pool. 00964 * 00965 * @since New in 1.5. 00966 */ 00967 svn_error_t * 00968 svn_repos_link_path3(void *report_baton, 00969 const char *path, 00970 const char *link_path, 00971 svn_revnum_t revision, 00972 svn_depth_t depth, 00973 svn_boolean_t start_empty, 00974 const char *lock_token, 00975 apr_pool_t *pool); 00976 00977 /** 00978 * Similar to svn_repos_link_path3(), but with @a depth set to 00979 * #svn_depth_infinity. 00980 * 00981 * @deprecated Provided for backward compatibility with the 1.4 API. 00982 */ 00983 SVN_DEPRECATED 00984 svn_error_t * 00985 svn_repos_link_path2(void *report_baton, 00986 const char *path, 00987 const char *link_path, 00988 svn_revnum_t revision, 00989 svn_boolean_t start_empty, 00990 const char *lock_token, 00991 apr_pool_t *pool); 00992 00993 /** 00994 * Similar to svn_repos_link_path2(), but with @a lock_token set to @c NULL. 00995 * 00996 * @deprecated Provided for backward compatibility with the 1.1 API. 00997 */ 00998 SVN_DEPRECATED 00999 svn_error_t * 01000 svn_repos_link_path(void *report_baton, 01001 const char *path, 01002 const char *link_path, 01003 svn_revnum_t revision, 01004 svn_boolean_t start_empty, 01005 apr_pool_t *pool); 01006 01007 /** Given a @a report_baton constructed by svn_repos_begin_report2(), 01008 * record the non-existence of @a path in the current tree. 01009 * 01010 * @a path may not be underneath a path on which svn_repos_set_path3() 01011 * was previously called with #svn_depth_exclude in this report. 01012 * 01013 * (This allows the reporter's driver to describe missing pieces of a 01014 * working copy, so that 'svn up' can recreate them.) 01015 * 01016 * All temporary allocations are done in @a pool. 01017 */ 01018 svn_error_t * 01019 svn_repos_delete_path(void *report_baton, 01020 const char *path, 01021 apr_pool_t *pool); 01022 01023 /** Given a @a report_baton constructed by svn_repos_begin_report2(), 01024 * finish the report and drive the editor as specified when the report 01025 * baton was constructed. 01026 * 01027 * If an error occurs during the driving of the editor, do NOT abort the 01028 * edit; that responsibility belongs to the caller of this function, if 01029 * it happens at all. 01030 * 01031 * After the call to this function, @a report_baton is no longer valid; 01032 * it should not be passed to any other reporting functions, including 01033 * svn_repos_abort_report(), even if this function returns an error. 01034 */ 01035 svn_error_t * 01036 svn_repos_finish_report(void *report_baton, 01037 apr_pool_t *pool); 01038 01039 01040 /** Given a @a report_baton constructed by svn_repos_begin_report2(), 01041 * abort the report. This function can be called anytime before 01042 * svn_repos_finish_report() is called. 01043 * 01044 * After the call to this function, @a report_baton is no longer valid; 01045 * it should not be passed to any other reporting functions. 01046 */ 01047 svn_error_t * 01048 svn_repos_abort_report(void *report_baton, 01049 apr_pool_t *pool); 01050 01051 01052 /* ---------------------------------------------------------------*/ 01053 01054 /* The magical dir_delta update routines. */ 01055 01056 /** Use the provided @a editor and @a edit_baton to describe the changes 01057 * necessary for making a given node (and its descendants, if it is a 01058 * directory) under @a src_root look exactly like @a tgt_path under 01059 * @a tgt_root. @a src_entry is the node to update. If @a src_entry 01060 * is empty, then compute the difference between the entire tree 01061 * anchored at @a src_parent_dir under @a src_root and @a tgt_path 01062 * under @a tgt_root. Else, describe the changes needed to update 01063 * only that entry in @a src_parent_dir. Typically, callers of this 01064 * function will use a @a tgt_path that is the concatenation of @a 01065 * src_parent_dir and @a src_entry. 01066 * 01067 * @a src_root and @a tgt_root can both be either revision or transaction 01068 * roots. If @a tgt_root is a revision, @a editor's set_target_revision() 01069 * will be called with the @a tgt_root's revision number, else it will 01070 * not be called at all. 01071 * 01072 * If @a authz_read_func is non-NULL, invoke it before any call to 01073 * 01074 * @a editor->open_root 01075 * @a editor->add_directory 01076 * @a editor->open_directory 01077 * @a editor->add_file 01078 * @a editor->open_file 01079 * 01080 * passing @a tgt_root, the same path that would be passed to the 01081 * editor function in question, and @a authz_read_baton. If the 01082 * @a *allowed parameter comes back TRUE, then proceed with the planned 01083 * editor call; else if FALSE, then invoke @a editor->absent_file or 01084 * @a editor->absent_directory as appropriate, except if the planned 01085 * editor call was open_root, throw SVN_ERR_AUTHZ_ROOT_UNREADABLE. 01086 * 01087 * If @a text_deltas is @c FALSE, send a single @c NULL txdelta window to 01088 * the window handler returned by @a editor->apply_textdelta(). 01089 * 01090 * If @a depth is #svn_depth_empty, invoke @a editor calls only on 01091 * @a src_entry (or @a src_parent_dir, if @a src_entry is empty). 01092 * If @a depth is #svn_depth_files, also invoke the editor on file 01093 * children, if any; if #svn_depth_immediates, invoke it on 01094 * immediate subdirectories as well as files; if #svn_depth_infinity, 01095 * recurse fully. 01096 * 01097 * If @a entry_props is @c TRUE, accompany each opened/added entry with 01098 * propchange editor calls that relay special "entry props" (this 01099 * is typically used only for working copy updates). 01100 * 01101 * @a ignore_ancestry instructs the function to ignore node ancestry 01102 * when determining how to transmit differences. 01103 * 01104 * Before completing successfully, this function calls @a editor's 01105 * close_edit(), so the caller should expect its @a edit_baton to be 01106 * invalid after its use with this function. 01107 * 01108 * Do any allocation necessary for the delta computation in @a pool. 01109 * This function's maximum memory consumption is at most roughly 01110 * proportional to the greatest depth of the tree under @a tgt_root, not 01111 * the total size of the delta. 01112 * 01113 * ### svn_repos_dir_delta2 is mostly superseded by the reporter 01114 * ### functionality (svn_repos_begin_report2 and friends). 01115 * ### svn_repos_dir_delta2 does allow the roots to be transaction 01116 * ### roots rather than just revision roots, and it has the 01117 * ### entry_props flag. Almost all of Subversion's own code uses the 01118 * ### reporter instead; there are some stray references to the 01119 * ### svn_repos_dir_delta[2] in comments which should probably 01120 * ### actually refer to the reporter. 01121 */ 01122 svn_error_t * 01123 svn_repos_dir_delta2(svn_fs_root_t *src_root, 01124 const char *src_parent_dir, 01125 const char *src_entry, 01126 svn_fs_root_t *tgt_root, 01127 const char *tgt_path, 01128 const svn_delta_editor_t *editor, 01129 void *edit_baton, 01130 svn_repos_authz_func_t authz_read_func, 01131 void *authz_read_baton, 01132 svn_boolean_t text_deltas, 01133 svn_depth_t depth, 01134 svn_boolean_t entry_props, 01135 svn_boolean_t ignore_ancestry, 01136 apr_pool_t *pool); 01137 01138 /** 01139 * Similar to svn_repos_dir_delta2(), but if @a recurse is TRUE, pass 01140 * #svn_depth_infinity for @a depth, and if @a recurse is FALSE, 01141 * pass #svn_depth_files for @a depth. 01142 * 01143 * @deprecated Provided for backward compatibility with the 1.4 API. 01144 */ 01145 SVN_DEPRECATED 01146 svn_error_t * 01147 svn_repos_dir_delta(svn_fs_root_t *src_root, 01148 const char *src_parent_dir, 01149 const char *src_entry, 01150 svn_fs_root_t *tgt_root, 01151 const char *tgt_path, 01152 const svn_delta_editor_t *editor, 01153 void *edit_baton, 01154 svn_repos_authz_func_t authz_read_func, 01155 void *authz_read_baton, 01156 svn_boolean_t text_deltas, 01157 svn_boolean_t recurse, 01158 svn_boolean_t entry_props, 01159 svn_boolean_t ignore_ancestry, 01160 apr_pool_t *pool); 01161 01162 01163 /** Use the provided @a editor and @a edit_baton to describe the 01164 * skeletal changes made in a particular filesystem @a root 01165 * (revision or transaction). 01166 * 01167 * Changes will be limited to those within @a base_dir, and if 01168 * @a low_water_mark is set to something other than #SVN_INVALID_REVNUM 01169 * it is assumed that the client has no knowledge of revisions prior to 01170 * @a low_water_mark. Together, these two arguments define the portion of 01171 * the tree that the client is assumed to have knowledge of, and thus any 01172 * copies of data from outside that part of the tree will be sent in their 01173 * entirety, not as simple copies or deltas against a previous version. 01174 * 01175 * The @a editor passed to this function should be aware of the fact 01176 * that, if @a send_deltas is FALSE, calls to its change_dir_prop(), 01177 * change_file_prop(), and apply_textdelta() functions will not 01178 * contain meaningful data, and merely serve as indications that 01179 * properties or textual contents were changed. 01180 * 01181 * If @a send_deltas is @c TRUE, the text and property deltas for changes 01182 * will be sent, otherwise NULL text deltas and empty prop changes will be 01183 * used. 01184 * 01185 * If @a authz_read_func is non-NULL, it will be used to determine if the 01186 * user has read access to the data being accessed. Data that the user 01187 * cannot access will be skipped. 01188 * 01189 * @note This editor driver passes SVN_INVALID_REVNUM for all 01190 * revision parameters in the editor interface except the copyfrom 01191 * parameter of the add_file() and add_directory() editor functions. 01192 * 01193 * @since New in 1.4. 01194 */ 01195 svn_error_t * 01196 svn_repos_replay2(svn_fs_root_t *root, 01197 const char *base_dir, 01198 svn_revnum_t low_water_mark, 01199 svn_boolean_t send_deltas, 01200 const svn_delta_editor_t *editor, 01201 void *edit_baton, 01202 svn_repos_authz_func_t authz_read_func, 01203 void *authz_read_baton, 01204 apr_pool_t *pool); 01205 01206 /** 01207 * Similar to svn_repos_replay2(), but with @a base_dir set to @c "", 01208 * @a low_water_mark set to #SVN_INVALID_REVNUM, @a send_deltas 01209 * set to @c FALSE, and @a authz_read_func and @a authz_read_baton 01210 * set to @c NULL. 01211 * 01212 * @deprecated Provided for backward compatibility with the 1.3 API. 01213 */ 01214 SVN_DEPRECATED 01215 svn_error_t * 01216 svn_repos_replay(svn_fs_root_t *root, 01217 const svn_delta_editor_t *editor, 01218 void *edit_baton, 01219 apr_pool_t *pool); 01220 01221 /* ---------------------------------------------------------------*/ 01222 01223 /* Making commits. */ 01224 01225 /** 01226 * Return an @a editor and @a edit_baton to commit changes to the 01227 * filesystem of @a repos, beginning at location 'rev:@a base_path', 01228 * where "rev" is the argument given to open_root(). 01229 * 01230 * @a repos is a previously opened repository. @a repos_url is the 01231 * decoded URL to the base of the repository, and is used to check 01232 * copyfrom paths. @a txn is a filesystem transaction object to use 01233 * during the commit, or @c NULL to indicate that this function should 01234 * create (and fully manage) a new transaction. 01235 * 01236 * Store the contents of @a revprop_table, a hash mapping <tt>const 01237 * char *</tt> property names to #svn_string_t values, as properties 01238 * of the commit transaction, including author and log message if 01239 * present. 01240 * 01241 * @note #SVN_PROP_REVISION_DATE may be present in @a revprop_table, but 01242 * it will be overwritten when the transaction is committed. 01243 * 01244 * Iff @a authz_callback is provided, check read/write authorizations 01245 * on paths accessed by editor operations. An operation which fails 01246 * due to authz will return SVN_ERR_AUTHZ_UNREADABLE or 01247 * SVN_ERR_AUTHZ_UNWRITABLE. 01248 * 01249 * Calling @a (*editor)->close_edit completes the commit. 01250 * 01251 * If @a callback is non-NULL, then before @c close_edit returns (but 01252 * after the commit has succeeded) @c close_edit will invoke 01253 * @a callback with a filled-in #svn_commit_info_t *, @a callback_baton, 01254 * and @a pool or some subpool thereof as arguments. If @a callback 01255 * returns an error, that error will be returned from @c close_edit, 01256 * otherwise if there was a post-commit hook failure, then that error 01257 * will be returned with code SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED. 01258 * (Note that prior to Subversion 1.6, @a callback cannot be NULL; if 01259 * you don't need a callback, pass a dummy function.) 01260 * 01261 * Calling @a (*editor)->abort_edit aborts the commit, and will also 01262 * abort the commit transaction unless @a txn was supplied (not @c 01263 * NULL). Callers who supply their own transactions are responsible 01264 * for cleaning them up (either by committing them, or aborting them). 01265 * 01266 * @since New in 1.5. 01267 * 01268 * @note Yes, @a repos_url is a <em>decoded</em> URL. We realize 01269 * that's sorta wonky. Sorry about that. 01270 */ 01271 svn_error_t * 01272 svn_repos_get_commit_editor5(const svn_delta_editor_t **editor, 01273 void **edit_baton, 01274 svn_repos_t *repos, 01275 svn_fs_txn_t *txn, 01276 const char *repos_url, 01277 const char *base_path, 01278 apr_hash_t *revprop_table, 01279 svn_commit_callback2_t callback, 01280 void *callback_baton, 01281 svn_repos_authz_callback_t authz_callback, 01282 void *authz_baton, 01283 apr_pool_t *pool); 01284 01285 /** 01286 * Similar to svn_repos_get_commit_editor5(), but with @a revprop_table 01287 * set to a hash containing @a user and @a log_msg as the 01288 * #SVN_PROP_REVISION_AUTHOR and #SVN_PROP_REVISION_LOG properties, 01289 * respectively. @a user and @a log_msg may both be @c NULL. 01290 * 01291 * @since New in 1.4. 01292 * 01293 * @deprecated Provided for backward compatibility with the 1.4 API. 01294 */ 01295 SVN_DEPRECATED 01296 svn_error_t * 01297 svn_repos_get_commit_editor4(const svn_delta_editor_t **editor, 01298 void **edit_baton, 01299 svn_repos_t *repos, 01300 svn_fs_txn_t *txn, 01301 const char *repos_url, 01302 const char *base_path, 01303 const char *user, 01304 const char *log_msg, 01305 svn_commit_callback2_t callback, 01306 void *callback_baton, 01307 svn_repos_authz_callback_t authz_callback, 01308 void *authz_baton, 01309 apr_pool_t *pool); 01310 01311 /** 01312 * Similar to svn_repos_get_commit_editor4(), but 01313 * uses the svn_commit_callback_t type. 01314 * 01315 * @since New in 1.3. 01316 * 01317 * @deprecated Provided for backward compatibility with the 1.3 API. 01318 */ 01319 SVN_DEPRECATED 01320 svn_error_t * 01321 svn_repos_get_commit_editor3(const svn_delta_editor_t **editor, 01322 void **edit_baton, 01323 svn_repos_t *repos, 01324 svn_fs_txn_t *txn, 01325 const char *repos_url, 01326 const char *base_path, 01327 const char *user, 01328 const char *log_msg, 01329 svn_commit_callback_t callback, 01330 void *callback_baton, 01331 svn_repos_authz_callback_t authz_callback, 01332 void *authz_baton, 01333 apr_pool_t *pool); 01334 01335 /** 01336 * Similar to svn_repos_get_commit_editor3(), but with @a 01337 * authz_callback and @a authz_baton set to @c NULL. 01338 * 01339 * @deprecated Provided for backward compatibility with the 1.2 API. 01340 */ 01341 SVN_DEPRECATED 01342 svn_error_t * 01343 svn_repos_get_commit_editor2(const svn_delta_editor_t **editor, 01344 void **edit_baton, 01345 svn_repos_t *repos, 01346 svn_fs_txn_t *txn, 01347 const char *repos_url, 01348 const char *base_path, 01349 const char *user, 01350 const char *log_msg, 01351 svn_commit_callback_t callback, 01352 void *callback_baton, 01353 apr_pool_t *pool); 01354 01355 01356 /** 01357 * Similar to svn_repos_get_commit_editor2(), but with @a txn always 01358 * set to @c NULL. 01359 * 01360 * @deprecated Provided for backward compatibility with the 1.1 API. 01361 */ 01362 SVN_DEPRECATED 01363 svn_error_t * 01364 svn_repos_get_commit_editor(const svn_delta_editor_t **editor, 01365 void **edit_baton, 01366 svn_repos_t *repos, 01367 const char *repos_url, 01368 const char *base_path, 01369 const char *user, 01370 const char *log_msg, 01371 svn_commit_callback_t callback, 01372 void *callback_baton, 01373 apr_pool_t *pool); 01374 01375 /* ---------------------------------------------------------------*/ 01376 01377 /* Finding particular revisions. */ 01378 01379 /** Set @a *revision to the revision number in @a repos's filesystem that was 01380 * youngest at time @a tm. 01381 */ 01382 svn_error_t * 01383 svn_repos_dated_revision(svn_revnum_t *revision, 01384 svn_repos_t *repos, 01385 apr_time_t tm, 01386 apr_pool_t *pool); 01387 01388 01389 /** Given a @a root/@a path within some filesystem, return three pieces of 01390 * information allocated in @a pool: 01391 * 01392 * - set @a *committed_rev to the revision in which the object was 01393 * last modified. (In fs parlance, this is the revision in which 01394 * the particular node-rev-id was 'created'.) 01395 * 01396 * - set @a *committed_date to the date of said revision, or @c NULL 01397 * if not available. 01398 * 01399 * - set @a *last_author to the author of said revision, or @c NULL 01400 * if not available. 01401 */ 01402 svn_error_t * 01403 svn_repos_get_committed_info(svn_revnum_t *committed_rev, 01404 const char **committed_date, 01405 const char **last_author, 01406 svn_fs_root_t *root, 01407 const char *path, 01408 apr_pool_t *pool); 01409 01410 01411 /** 01412 * Set @a *dirent to an #svn_dirent_t associated with @a path in @a 01413 * root. If @a path does not exist in @a root, set @a *dirent to 01414 * NULL. Use @a pool for memory allocation. 01415 * 01416 * @since New in 1.2. 01417 */ 01418 svn_error_t * 01419 svn_repos_stat(svn_dirent_t **dirent, 01420 svn_fs_root_t *root, 01421 const char *path, 01422 apr_pool_t *pool); 01423 01424 01425 /** 01426 * Given @a path which exists at revision @a start in @a fs, set 01427 * @a *deleted to the revision @a path was first deleted, within the 01428 * inclusive revision range bounded by @a start and @a end. If @a path 01429 * does not exist at revision @a start or was not deleted within the 01430 * specified range, then set @a *deleted to SVN_INVALID_REVNUM. 01431 * Use @a pool for memory allocation. 01432 * 01433 * @since New in 1.5. 01434 */ 01435 svn_error_t * 01436 svn_repos_deleted_rev(svn_fs_t *fs, 01437 const char *path, 01438 svn_revnum_t start, 01439 svn_revnum_t end, 01440 svn_revnum_t *deleted, 01441 apr_pool_t *pool); 01442 01443 01444 /** Callback type for use with svn_repos_history(). @a path and @a 01445 * revision represent interesting history locations in the lifetime 01446 * of the path passed to svn_repos_history(). @a baton is the same 01447 * baton given to svn_repos_history(). @a pool is provided for the 01448 * convenience of the implementor, who should not expect it to live 01449 * longer than a single callback call. 01450 * 01451 * Signal to callback driver to stop processing/invoking this callback 01452 * by returning the #SVN_ERR_CEASE_INVOCATION error code. 01453 * 01454 * @note SVN_ERR_CEASE_INVOCATION is new in 1.5. 01455 */ 01456 typedef svn_error_t *(*svn_repos_history_func_t)(void *baton, 01457 const char *path, 01458 svn_revnum_t revision, 01459 apr_pool_t *pool); 01460 01461 /** 01462 * Call @a history_func (with @a history_baton) for each interesting 01463 * history location in the lifetime of @a path in @a fs, from the 01464 * youngest of @a end and @a start to the oldest. Stop processing if 01465 * @a history_func returns #SVN_ERR_CEASE_INVOCATION. Only cross 01466 * filesystem copy history if @a cross_copies is @c TRUE. And do all 01467 * of this in @a pool. 01468 * 01469 * If @a authz_read_func is non-NULL, then use it (and @a 01470 * authz_read_baton) to verify that @a path in @a end is readable; if 01471 * not, return SVN_ERR_AUTHZ_UNREADABLE. Also verify the readability 01472 * of every ancestral path/revision pair before pushing them at @a 01473 * history_func. If a pair is deemed unreadable, then do not send 01474 * them; instead, immediately stop traversing history and return 01475 * SVN_NO_ERROR. 01476 * 01477 * @since New in 1.1. 01478 * 01479 * @note SVN_ERR_CEASE_INVOCATION is new in 1.5. 01480 */ 01481 svn_error_t * 01482 svn_repos_history2(svn_fs_t *fs, 01483 const char *path, 01484 svn_repos_history_func_t history_func, 01485 void *history_baton, 01486 svn_repos_authz_func_t authz_read_func, 01487 void *authz_read_baton, 01488 svn_revnum_t start, 01489 svn_revnum_t end, 01490 svn_boolean_t cross_copies, 01491 apr_pool_t *pool); 01492 01493 /** 01494 * Similar to svn_repos_history2(), but with @a authz_read_func 01495 * and @a authz_read_baton always set to NULL. 01496 * 01497 * @deprecated Provided for backward compatibility with the 1.0 API. 01498 */ 01499 SVN_DEPRECATED 01500 svn_error_t * 01501 svn_repos_history(svn_fs_t *fs, 01502 const char *path, 01503 svn_repos_history_func_t history_func, 01504 void *history_baton, 01505 svn_revnum_t start, 01506 svn_revnum_t end, 01507 svn_boolean_t cross_copies, 01508 apr_pool_t *pool); 01509 01510 01511 /** 01512 * Set @a *locations to be a mapping of the revisions to the paths of 01513 * the file @a fs_path present at the repository in revision 01514 * @a peg_revision, where the revisions are taken out of the array 01515 * @a location_revisions. 01516 * 01517 * @a location_revisions is an array of svn_revnum_t's and @a *locations 01518 * maps 'svn_revnum_t *' to 'const char *'. 01519 * 01520 * If optional @a authz_read_func is non-NULL, then use it (and @a 01521 * authz_read_baton) to verify that the peg-object is readable. If not, 01522 * return SVN_ERR_AUTHZ_UNREADABLE. Also use the @a authz_read_func 01523 * to check that every path returned in the hash is readable. If an 01524 * unreadable path is encountered, stop tracing and return 01525 * SVN_NO_ERROR. 01526 * 01527 * @a pool is used for all allocations. 01528 * 01529 * @since New in 1.1. 01530 */ 01531 svn_error_t * 01532 svn_repos_trace_node_locations(svn_fs_t *fs, 01533 apr_hash_t **locations, 01534 const char *fs_path, 01535 svn_revnum_t peg_revision, 01536 const apr_array_header_t *location_revisions, 01537 svn_repos_authz_func_t authz_read_func, 01538 void *authz_read_baton, 01539 apr_pool_t *pool); 01540 01541 01542 /** 01543 * Call @a receiver and @a receiver_baton to report successive 01544 * location segments in revisions between @a start_rev and @a end_rev 01545 * (inclusive) for the line of history identified by the peg-object @a 01546 * path in @a peg_revision (and in @a repos). 01547 * 01548 * @a end_rev may be #SVN_INVALID_REVNUM to indicate that you want 01549 * to trace the history of the object to its origin. 01550 * 01551 * @a start_rev may be #SVN_INVALID_REVNUM to indicate "the HEAD 01552 * revision". Otherwise, @a start_rev must be younger than @a end_rev 01553 * (unless @a end_rev is #SVN_INVALID_REVNUM). 01554 * 01555 * @a peg_revision may be #SVN_INVALID_REVNUM to indicate "the HEAD 01556 * revision", and must evaluate to be at least as young as @a start_rev. 01557 * 01558 * If optional @a authz_read_func is not @c NULL, then use it (and @a 01559 * authz_read_baton) to verify that the peg-object is readable. If 01560 * not, return #SVN_ERR_AUTHZ_UNREADABLE. Also use the @a 01561 * authz_read_func to check that every path reported in a location 01562 * segment is readable. If an unreadable path is encountered, report 01563 * a final (possibly truncated) location segment (if any), stop 01564 * tracing history, and return #SVN_NO_ERROR. 01565 * 01566 * @a pool is used for all allocations. 01567 * 01568 * @since New in 1.5. 01569 */ 01570 svn_error_t * 01571 svn_repos_node_location_segments(svn_repos_t *repos, 01572 const char *path, 01573 svn_revnum_t peg_revision, 01574 svn_revnum_t start_rev, 01575 svn_revnum_t end_rev, 01576 svn_location_segment_receiver_t receiver, 01577 void *receiver_baton, 01578 svn_repos_authz_func_t authz_read_func, 01579 void *authz_read_baton, 01580 apr_pool_t *pool); 01581 01582 01583 /* ### other queries we can do someday -- 01584 01585 * fetch the last revision created by <user> 01586 (once usernames become revision properties!) 01587 * fetch the last revision where <path> was modified 01588 01589 */ 01590 01591 01592 01593 /* ---------------------------------------------------------------*/ 01594 01595 /* Retrieving log messages. */ 01596 01597 01598 /** 01599 * Invoke @a receiver with @a receiver_baton on each log message from 01600 * @a start to @a end in @a repos's filesystem. @a start may be greater 01601 * or less than @a end; this just controls whether the log messages are 01602 * processed in descending or ascending revision number order. 01603 * 01604 * If @a start or @a end is #SVN_INVALID_REVNUM, it defaults to youngest. 01605 * 01606 * If @a paths is non-NULL and has one or more elements, then only show 01607 * revisions in which at least one of @a paths was changed (i.e., if 01608 * file, text or props changed; if dir, props or entries changed or any node 01609 * changed below it). Each path is a <tt>const char *</tt> representing 01610 * an absolute path in the repository. If @a paths is NULL or empty, 01611 * show all revisions regardless of what paths were changed in those 01612 * revisions. 01613 * 01614 * If @a limit is non-zero then only invoke @a receiver on the first 01615 * @a limit logs. 01616 * 01617 * If @a discover_changed_paths, then each call to @a receiver passes a 01618 * hash mapping paths committed in that revision to information about them 01619 * as the receiver's @a changed_paths argument. 01620 * Otherwise, each call to @a receiver passes NULL for @a changed_paths. 01621 * 01622 * If @a strict_node_history is set, copy history (if any exists) will 01623 * not be traversed while harvesting revision logs for each path. 01624 * 01625 * If @a include_merged_revisions is set, log information for revisions 01626 * which have been merged to @a paths will also be returned, unless these 01627 * revisions are already part of @a start to @a end in @a repos's 01628 * filesystem, as limited by @a paths. In the latter case those revisions 01629 * are skipped and @a receiver is not invoked. 01630 * 01631 * If @a revprops is NULL, retrieve all revprops; else, retrieve only the 01632 * revprops named in the array (i.e. retrieve none if the array is empty). 01633 * 01634 * If any invocation of @a receiver returns error, return that error 01635 * immediately and without wrapping it. 01636 * 01637 * If @a start or @a end is a non-existent revision, return the error 01638 * #SVN_ERR_FS_NO_SUCH_REVISION, without ever invoking @a receiver. 01639 * 01640 * If optional @a authz_read_func is non-NULL, then use this function 01641 * (along with optional @a authz_read_baton) to check the readability 01642 * of each changed-path in each revision about to be "pushed" at 01643 * @a receiver. If a revision has some changed-paths readable and 01644 * others unreadable, unreadable paths are omitted from the 01645 * changed_paths field and only svn:author and svn:date will be 01646 * available in the revprops field. If a revision has no 01647 * changed-paths readable at all, then all paths are omitted and no 01648 * revprops are available. 01649 * 01650 * See also the documentation for #svn_log_entry_receiver_t. 01651 * 01652 * Use @a pool for temporary allocations. 01653 * 01654 * @since New in 1.5. 01655 */ 01656 svn_error_t * 01657 svn_repos_get_logs4(svn_repos_t *repos, 01658 const apr_array_header_t *paths, 01659 svn_revnum_t start, 01660 svn_revnum_t end, 01661 int limit, 01662 svn_boolean_t discover_changed_paths, 01663 svn_boolean_t strict_node_history, 01664 svn_boolean_t include_merged_revisions, 01665 const apr_array_header_t *revprops, 01666 svn_repos_authz_func_t authz_read_func, 01667 void *authz_read_baton, 01668 svn_log_entry_receiver_t receiver, 01669 void *receiver_baton, 01670 apr_pool_t *pool); 01671 01672 /** 01673 * Same as svn_repos_get_logs4(), but with @a receiver being 01674 * #svn_log_message_receiver_t instead of #svn_log_entry_receiver_t. 01675 * Also, @a include_merged_revisions is set to @c FALSE and @a revprops is 01676 * svn:author, svn:date, and svn:log. If @a paths is empty, nothing 01677 * is returned. 01678 * 01679 * @since New in 1.2. 01680 * @deprecated Provided for backward compatibility with the 1.4 API. 01681 */ 01682 SVN_DEPRECATED 01683 svn_error_t * 01684 svn_repos_get_logs3(svn_repos_t *repos, 01685 const apr_array_header_t *paths, 01686 svn_revnum_t start, 01687 svn_revnum_t end, 01688 int limit, 01689 svn_boolean_t discover_changed_paths, 01690 svn_boolean_t strict_node_history, 01691 svn_repos_authz_func_t authz_read_func, 01692 void *authz_read_baton, 01693 svn_log_message_receiver_t receiver, 01694 void *receiver_baton, 01695 apr_pool_t *pool); 01696 01697 01698 /** 01699 * Same as svn_repos_get_logs3(), but with @a limit always set to 0. 01700 * 01701 * @deprecated Provided for backward compatibility with the 1.1 API. 01702 */ 01703 SVN_DEPRECATED 01704 svn_error_t * 01705 svn_repos_get_logs2(svn_repos_t *repos, 01706 const apr_array_header_t *paths, 01707 svn_revnum_t start, 01708 svn_revnum_t end, 01709 svn_boolean_t discover_changed_paths, 01710 svn_boolean_t strict_node_history, 01711 svn_repos_authz_func_t authz_read_func, 01712 void *authz_read_baton, 01713 svn_log_message_receiver_t receiver, 01714 void *receiver_baton, 01715 apr_pool_t *pool); 01716 01717 /** 01718 * Same as svn_repos_get_logs2(), but with @a authz_read_func and 01719 * @a authz_read_baton always set to NULL. 01720 * 01721 * @deprecated Provided for backward compatibility with the 1.0 API. 01722 */ 01723 SVN_DEPRECATED 01724 svn_error_t * 01725 svn_repos_get_logs(svn_repos_t *repos, 01726 const apr_array_header_t *paths, 01727 svn_revnum_t start, 01728 svn_revnum_t end, 01729 svn_boolean_t discover_changed_paths, 01730 svn_boolean_t strict_node_history, 01731 svn_log_message_receiver_t receiver, 01732 void *receiver_baton, 01733 apr_pool_t *pool); 01734 01735 01736 01737 /* ---------------------------------------------------------------*/ 01738 01739 /* Retrieving mergeinfo. */ 01740 01741 /** 01742 * Fetch the mergeinfo for @a paths at @a revision in @a repos, and 01743 * set @a *catalog to a catalog of this mergeinfo. @a *catalog will 01744 * never be @c NULL but may be empty. 01745 * 01746 * @a inherit indicates whether explicit, explicit or inherited, or 01747 * only inherited mergeinfo for @a paths is fetched. 01748 * 01749 * If @a revision is #SVN_INVALID_REVNUM, it defaults to youngest. 01750 * 01751 * If @a include_descendants is TRUE, then additionally return the 01752 * mergeinfo for any descendant of any element of @a paths which has 01753 * the #SVN_PROP_MERGEINFO property explicitly set on it. (Note 01754 * that inheritance is only taken into account for the elements in @a 01755 * paths; descendants of the elements in @a paths which get their 01756 * mergeinfo via inheritance are not included in @a *catalog.) 01757 * 01758 * If optional @a authz_read_func is non-NULL, then use this function 01759 * (along with optional @a authz_read_baton) to check the readability 01760 * of each path which mergeinfo was requested for (from @a paths). 01761 * Silently omit unreadable paths from the request for mergeinfo. 01762 * 01763 * Use @a pool for all allocations. 01764 * 01765 * @since New in 1.5. 01766 */ 01767 svn_error_t * 01768 svn_repos_fs_get_mergeinfo(svn_mergeinfo_catalog_t *catalog, 01769 svn_repos_t *repos, 01770 const apr_array_header_t *paths, 01771 svn_revnum_t revision, 01772 svn_mergeinfo_inheritance_t inherit, 01773 svn_boolean_t include_descendants, 01774 svn_repos_authz_func_t authz_read_func, 01775 void *authz_read_baton, 01776 apr_pool_t *pool); 01777 01778 01779 /* ---------------------------------------------------------------*/ 01780 01781 /* Retrieving multiple revisions of a file. */ 01782 01783 /** 01784 * Retrieve a subset of the interesting revisions of a file @a path in 01785 * @a repos as seen in revision @a end. Invoke @a handler with 01786 * @a handler_baton as its first argument for each such revision. 01787 * @a pool is used for all allocations. See svn_fs_history_prev() for 01788 * a discussion of interesting revisions. 01789 * 01790 * If optional @a authz_read_func is non-NULL, then use this function 01791 * (along with optional @a authz_read_baton) to check the readability 01792 * of the rev-path in each interesting revision encountered. 01793 * 01794 * Revision discovery happens from @a end to @a start, and if an 01795 * unreadable revision is encountered before @a start is reached, then 01796 * revision discovery stops and only the revisions from @a end to the 01797 * oldest readable revision are returned (So it will appear that @a 01798 * path was added without history in the latter revision). 01799 * 01800 * If there is an interesting revision of the file that is less than or 01801 * equal to start, the iteration will start at that revision. Else, the 01802 * iteration will start at the first revision of the file in the repository, 01803 * which has to be less than or equal to end. Note that if the function 01804 * succeeds, @a handler will have been called at least once. 01805 * 01806 * In a series of calls, the file contents for the first interesting revision 01807 * will be provided as a text delta against the empty file. In the following 01808 * calls, the delta will be against the contents for the previous call. 01809 * 01810 * If @a include_merged_revisions is TRUE, revisions which a included as a 01811 * result of a merge between @a start and @a end will be included. 01812 * 01813 * @since New in 1.5. 01814 */ 01815 svn_error_t * 01816 svn_repos_get_file_revs2(svn_repos_t *repos, 01817 const char *path, 01818 svn_revnum_t start, 01819 svn_revnum_t end, 01820 svn_boolean_t include_merged_revisions, 01821 svn_repos_authz_func_t authz_read_func, 01822 void *authz_read_baton, 01823 svn_file_rev_handler_t handler, 01824 void *handler_baton, 01825 apr_pool_t *pool); 01826 01827 /** 01828 * Similar to svn_repos_get_file_revs2(), with @a include_merged_revisions 01829 * set to FALSE. 01830 * 01831 * @deprecated Provided for backward compatibility with the 1.4 API. 01832 * @since New in 1.1. 01833 */ 01834 SVN_DEPRECATED 01835 svn_error_t * 01836 svn_repos_get_file_revs(svn_repos_t *repos, 01837 const char *path, 01838 svn_revnum_t start, 01839 svn_revnum_t end, 01840 svn_repos_authz_func_t authz_read_func, 01841 void *authz_read_baton, 01842 svn_repos_file_rev_handler_t handler, 01843 void *handler_baton, 01844 apr_pool_t *pool); 01845 01846 01847 /* ---------------------------------------------------------------*/ 01848 01849 /** 01850 * @defgroup svn_repos_hook_wrappers Hook-sensitive wrappers for libsvn_fs \ 01851 * routines. 01852 * @{ 01853 */ 01854 01855 /** Like svn_fs_commit_txn(), but invoke the @a repos' pre- and 01856 * post-commit hooks around the commit. Use @a pool for any necessary 01857 * allocations. 01858 * 01859 * If the pre-commit hook fails, do not attempt to commit the 01860 * transaction and throw the original error to the caller. 01861 * 01862 * A successful commit is indicated by a valid revision value in @a 01863 * *new_rev, not if svn_fs_commit_txn() returns an error, which can 01864 * occur during its post commit FS processing. If the transaction was 01865 * not committed, then return the associated error and do not execute 01866 * the post-commit hook. 01867 * 01868 * If the commit succeeds the post-commit hook is executed. If the 01869 * post-commit hook returns an error, always wrap it with 01870 * SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED; this allows the caller to 01871 * find the post-commit hook error in the returned error chain. If 01872 * both svn_fs_commit_txn() and the post-commit hook return errors, 01873 * then svn_fs_commit_txn()'s error is the parent error and the 01874 * SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED wrapped error is the child 01875 * error. 01876 * 01877 * @a conflict_p, @a new_rev, and @a txn are as in svn_fs_commit_txn(). 01878 */ 01879 svn_error_t * 01880 svn_repos_fs_commit_txn(const char **conflict_p, 01881 svn_repos_t *repos, 01882 svn_revnum_t *new_rev, 01883 svn_fs_txn_t *txn, 01884 apr_pool_t *pool); 01885 01886 /** Like svn_fs_begin_txn(), but use @a revprop_table, a hash mapping 01887 * <tt>const char *</tt> property names to #svn_string_t values, to 01888 * set the properties on transaction @a *txn_p. @a repos is the 01889 * repository object which contains the filesystem. @a rev, @a 01890 * *txn_p, and @a pool are as in svn_fs_begin_txn(). 01891 * 01892 * Before a txn is created, the repository's start-commit hooks are 01893 * run; if any of them fail, no txn is created, @a *txn_p is unaffected, 01894 * and #SVN_ERR_REPOS_HOOK_FAILURE is returned. 01895 * 01896 * @note @a revprop_table may contain an #SVN_PROP_REVISION_DATE property, 01897 * which will be set on the transaction, but that will be overwritten 01898 * when the transaction is committed. 01899 * 01900 * @since New in 1.5. 01901 */ 01902 svn_error_t * 01903 svn_repos_fs_begin_txn_for_commit2(svn_fs_txn_t **txn_p, 01904 svn_repos_t *repos, 01905 svn_revnum_t rev, 01906 apr_hash_t *revprop_table, 01907 apr_pool_t *pool); 01908 01909 01910 /** 01911 * Same as svn_repos_fs_begin_txn_for_commit2(), but with @a revprop_table 01912 * set to a hash containing @a author and @a log_msg as the 01913 * #SVN_PROP_REVISION_AUTHOR and #SVN_PROP_REVISION_LOG properties, 01914 * respectively. @a author and @a log_msg may both be @c NULL. 01915 * 01916 * @deprecated Provided for backward compatibility with the 1.4 API. 01917 */ 01918 SVN_DEPRECATED 01919 svn_error_t * 01920 svn_repos_fs_begin_txn_for_commit(svn_fs_txn_t **txn_p, 01921 svn_repos_t *repos, 01922 svn_revnum_t rev, 01923 const char *author, 01924 const char *log_msg, 01925 apr_pool_t *pool); 01926 01927 01928 /** Like svn_fs_begin_txn(), but use @a author to set the corresponding 01929 * property on transaction @a *txn_p. @a repos is the repository object 01930 * which contains the filesystem. @a rev, @a *txn_p, and @a pool are as in 01931 * svn_fs_begin_txn(). 01932 * 01933 * ### Someday: before a txn is created, some kind of read-hook could 01934 * be called here. 01935 */ 01936 svn_error_t * 01937 svn_repos_fs_begin_txn_for_update(svn_fs_txn_t **txn_p, 01938 svn_repos_t *repos, 01939 svn_revnum_t rev, 01940 const char *author, 01941 apr_pool_t *pool); 01942 01943 01944 /** @defgroup svn_repos_fs_locks Repository lock wrappers 01945 * @{ 01946 */ 01947 01948 /** Like svn_fs_lock(), but invoke the @a repos's pre- and 01949 * post-lock hooks before and after the locking action. Use @a pool 01950 * for any necessary allocations. 01951 * 01952 * If the pre-lock hook or svn_fs_lock() fails, throw the original 01953 * error to caller. If an error occurs when running the post-lock 01954 * hook, return the original error wrapped with 01955 * SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED. If the caller sees this 01956 * error, it knows that the lock succeeded anyway. 01957 * 01958 * The pre-lock hook may cause a different token to be used for the 01959 * lock, instead of @a token; see the pre-lock-hook documentation for 01960 * more. 01961 * 01962 * @since New in 1.2. 01963 */ 01964 svn_error_t * 01965 svn_repos_fs_lock(svn_lock_t **lock, 01966 svn_repos_t *repos, 01967 const char *path, 01968 const char *token, 01969 const char *comment, 01970 svn_boolean_t is_dav_comment, 01971 apr_time_t expiration_date, 01972 svn_revnum_t current_rev, 01973 svn_boolean_t steal_lock, 01974 apr_pool_t *pool); 01975 01976 01977 /** Like svn_fs_unlock(), but invoke the @a repos's pre- and 01978 * post-unlock hooks before and after the unlocking action. Use @a 01979 * pool for any necessary allocations. 01980 * 01981 * If the pre-unlock hook or svn_fs_unlock() fails, throw the original 01982 * error to caller. If an error occurs when running the post-unlock 01983 * hook, return the original error wrapped with 01984 * SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED. If the caller sees this 01985 * error, it knows that the unlock succeeded anyway. 01986 * 01987 * @since New in 1.2. 01988 */ 01989 svn_error_t * 01990 svn_repos_fs_unlock(svn_repos_t *repos, 01991 const char *path, 01992 const char *token, 01993 svn_boolean_t break_lock, 01994 apr_pool_t *pool); 01995 01996 01997 01998 /** Look up all the locks in and under @a path in @a repos, setting @a 01999 * *locks to a hash which maps <tt>const char *</tt> paths to the 02000 * #svn_lock_t locks associated with those paths. Use @a 02001 * authz_read_func and @a authz_read_baton to "screen" all returned 02002 * locks. That is: do not return any locks on any paths that are 02003 * unreadable in HEAD, just silently omit them. 02004 * 02005 * @a depth limits the returned locks to those associated with paths 02006 * within the specified depth of @a path, and must be one of the 02007 * following values: #svn_depth_empty, #svn_depth_files, 02008 * #svn_depth_immediates, or #svn_depth_infinity. 02009 * 02010 * @since New in 1.7. 02011 */ 02012 svn_error_t * 02013 svn_repos_fs_get_locks2(apr_hash_t **locks, 02014 svn_repos_t *repos, 02015 const char *path, 02016 svn_depth_t depth, 02017 svn_repos_authz_func_t authz_read_func, 02018 void *authz_read_baton, 02019 apr_pool_t *pool); 02020 02021 /** 02022 * Similar to svn_repos_fs_get_locks2(), but with @a depth always 02023 * passed as svn_depth_infinity. 02024 * 02025 * @since New in 1.2. 02026 * @deprecated Provided for backward compatibility with the 1.6 API. 02027 */ 02028 SVN_DEPRECATED 02029 svn_error_t * 02030 svn_repos_fs_get_locks(apr_hash_t **locks, 02031 svn_repos_t *repos, 02032 const char *path, 02033 svn_repos_authz_func_t authz_read_func, 02034 void *authz_read_baton, 02035 apr_pool_t *pool); 02036 02037 /** @} */ 02038 02039 /** 02040 * Like svn_fs_change_rev_prop2(), but validate the name and value of the 02041 * property and invoke the @a repos's pre- and post-revprop-change hooks 02042 * around the change as specified by @a use_pre_revprop_change_hook and 02043 * @a use_post_revprop_change_hook (respectively). 02044 * 02045 * @a rev is the revision whose property to change, @a name is the 02046 * name of the property, and @a new_value is the new value of the 02047 * property. If @a old_value_p is not @c NULL, then @a *old_value_p 02048 * is the expected current (preexisting) value of the property (or @c NULL 02049 * for "unset"). @a author is the authenticated username of the person 02050 * changing the property value, or NULL if not available. 02051 * 02052 * If @a authz_read_func is non-NULL, then use it (with @a 02053 * authz_read_baton) to validate the changed-paths associated with @a 02054 * rev. If the revision contains any unreadable changed paths, then 02055 * return #SVN_ERR_AUTHZ_UNREADABLE. 02056 * 02057 * Validate @a name and @a new_value like the same way 02058 * svn_repos_fs_change_node_prop() does. 02059 * 02060 * Use @a pool for temporary allocations. 02061 * 02062 * @since New in 1.7. 02063 */ 02064 svn_error_t * 02065 svn_repos_fs_change_rev_prop4(svn_repos_t *repos, 02066 svn_revnum_t rev, 02067 const char *author, 02068 const char *name, 02069 const svn_string_t *const *old_value_p, 02070 const svn_string_t *new_value, 02071 svn_boolean_t 02072 use_pre_revprop_change_hook, 02073 svn_boolean_t 02074 use_post_revprop_change_hook, 02075 svn_repos_authz_func_t 02076 authz_read_func, 02077 void *authz_read_baton, 02078 apr_pool_t *pool); 02079 02080 /** 02081 * Similar to svn_repos_fs_change_rev_prop4(), but with @a old_value_p always 02082 * set to @c NULL. (In other words, it is similar to 02083 * svn_fs_change_rev_prop().) 02084 * 02085 * @deprecated Provided for backward compatibility with the 1.6 API. 02086 * @since New in 1.5. 02087 */ 02088 SVN_DEPRECATED 02089 svn_error_t * 02090 svn_repos_fs_change_rev_prop3(svn_repos_t *repos, 02091 svn_revnum_t rev, 02092 const char *author, 02093 const char *name, 02094 const svn_string_t *new_value, 02095 svn_boolean_t 02096 use_pre_revprop_change_hook, 02097 svn_boolean_t 02098 use_post_revprop_change_hook, 02099 svn_repos_authz_func_t 02100 authz_read_func, 02101 void *authz_read_baton, 02102 apr_pool_t *pool); 02103 02104 /** 02105 * Similar to svn_repos_fs_change_rev_prop3(), but with the @a 02106 * use_pre_revprop_change_hook and @a use_post_revprop_change_hook 02107 * always set to @c TRUE. 02108 * 02109 * @deprecated Provided for backward compatibility with the 1.4 API. 02110 */ 02111 SVN_DEPRECATED 02112 svn_error_t * 02113 svn_repos_fs_change_rev_prop2(svn_repos_t *repos, 02114 svn_revnum_t rev, 02115 const char *author, 02116 const char *name, 02117 const svn_string_t *new_value, 02118 svn_repos_authz_func_t 02119 authz_read_func, 02120 void *authz_read_baton, 02121 apr_pool_t *pool); 02122 02123 /** 02124 * Similar to svn_repos_fs_change_rev_prop2(), but with the 02125 * @a authz_read_func parameter always NULL. 02126 * 02127 * @deprecated Provided for backward compatibility with the 1.0 API. 02128 */ 02129 SVN_DEPRECATED 02130 svn_error_t * 02131 svn_repos_fs_change_rev_prop(svn_repos_t *repos, 02132 svn_revnum_t rev, 02133 const char *author, 02134 const char *name, 02135 const svn_string_t *new_value, 02136 apr_pool_t *pool); 02137 02138 02139 02140 /** 02141 * Set @a *value_p to the value of the property named @a propname on 02142 * revision @a rev in the filesystem opened in @a repos. If @a rev 02143 * has no property by that name, set @a *value_p to zero. Allocate 02144 * the result in @a pool. 02145 * 02146 * If @a authz_read_func is non-NULL, then use it (with @a 02147 * authz_read_baton) to validate the changed-paths associated with @a 02148 * rev. If the changed-paths are all unreadable, then set @a *value_p 02149 * to zero unconditionally. If only some of the changed-paths are 02150 * unreadable, then allow 'svn:author' and 'svn:date' propvalues to be 02151 * fetched, but return 0 for any other property. 02152 * 02153 * @since New in 1.1. 02154 */ 02155 svn_error_t * 02156 svn_repos_fs_revision_prop(svn_string_t **value_p, 02157 svn_repos_t *repos, 02158 svn_revnum_t rev, 02159 const char *propname, 02160 svn_repos_authz_func_t 02161 authz_read_func, 02162 void *authz_read_baton, 02163 apr_pool_t *pool); 02164 02165 02166 /** 02167 * Set @a *table_p to the entire property list of revision @a rev in 02168 * filesystem opened in @a repos, as a hash table allocated in @a 02169 * pool. The table maps <tt>char *</tt> property names to 02170 * #svn_string_t * values; the names and values are allocated in @a 02171 * pool. 02172 * 02173 * If @a authz_read_func is non-NULL, then use it (with @a 02174 * authz_read_baton) to validate the changed-paths associated with @a 02175 * rev. If the changed-paths are all unreadable, then return an empty 02176 * hash. If only some of the changed-paths are unreadable, then return 02177 * an empty hash, except for 'svn:author' and 'svn:date' properties 02178 * (assuming those properties exist). 02179 * 02180 * @since New in 1.1. 02181 */ 02182 svn_error_t * 02183 svn_repos_fs_revision_proplist(apr_hash_t **table_p, 02184 svn_repos_t *repos, 02185 svn_revnum_t rev, 02186 svn_repos_authz_func_t 02187 authz_read_func, 02188 void *authz_read_baton, 02189 apr_pool_t *pool); 02190 02191 02192 02193 /* ---------------------------------------------------------------*/ 02194 02195 /* Prop-changing wrappers for libsvn_fs routines. */ 02196 02197 /* NOTE: svn_repos_fs_change_rev_prop() also exists, but is located 02198 above with the hook-related functions. */ 02199 02200 02201 /** Validating wrapper for svn_fs_change_node_prop() (which see for 02202 * argument descriptions). 02203 * 02204 * If @a name's kind is not #svn_prop_regular_kind, return 02205 * #SVN_ERR_REPOS_BAD_ARGS. If @a name is an "svn:" property, validate its 02206 * @a value and return SVN_ERR_BAD_PROPERTY_VALUE if it is invalid for the 02207 * property. 02208 * 02209 * @note Currently, the only properties validated are the "svn:" properties 02210 * #SVN_PROP_REVISION_LOG and #SVN_PROP_REVISION_DATE. This may change 02211 * in future releases. 02212 */ 02213 svn_error_t * 02214 svn_repos_fs_change_node_prop(svn_fs_root_t *root, 02215 const char *path, 02216 const char *name, 02217 const svn_string_t *value, 02218 apr_pool_t *pool); 02219 02220 /** Validating wrapper for svn_fs_change_txn_prop() (which see for 02221 * argument descriptions). See svn_repos_fs_change_txn_props() for more 02222 * information. 02223 */ 02224 svn_error_t * 02225 svn_repos_fs_change_txn_prop(svn_fs_txn_t *txn, 02226 const char *name, 02227 const svn_string_t *value, 02228 apr_pool_t *pool); 02229 02230 /** Validating wrapper for svn_fs_change_txn_props() (which see for 02231 * argument descriptions). Validate properties and their values the 02232 * same way svn_repos_fs_change_node_prop() does. 02233 * 02234 * @since New in 1.5. 02235 */ 02236 svn_error_t * 02237 svn_repos_fs_change_txn_props(svn_fs_txn_t *txn, 02238 const apr_array_header_t *props, 02239 apr_pool_t *pool); 02240 02241 /** @} */ 02242 02243 /* ---------------------------------------------------------------*/ 02244 02245 /** 02246 * @defgroup svn_repos_inspection Data structures and editor things for \ 02247 * repository inspection. 02248 * @{ 02249 * 02250 * As it turns out, the svn_repos_replay2(), svn_repos_dir_delta2() and 02251 * svn_repos_begin_report2() interfaces can be extremely useful for 02252 * examining the repository, or more exactly, changes to the repository. 02253 * These drivers allows for differences between two trees to be 02254 * described using an editor. 02255 * 02256 * By using the editor obtained from svn_repos_node_editor() with one of 02257 * the drivers mentioned above, the description of how to transform one 02258 * tree into another can be used to build an in-memory linked-list tree, 02259 * which each node representing a repository node that was changed. 02260 */ 02261 02262 /** A node in the repository. */ 02263 typedef struct svn_repos_node_t 02264 { 02265 /** Node type (file, dir, etc.) */ 02266 svn_node_kind_t kind; 02267 02268 /** How this node entered the node tree: 'A'dd, 'D'elete, 'R'eplace */ 02269 char action; 02270 02271 /** Were there any textual mods? (files only) */ 02272 svn_boolean_t text_mod; 02273 02274 /** Where there any property mods? */ 02275 svn_boolean_t prop_mod; 02276 02277 /** The name of this node as it appears in its parent's entries list */ 02278 const char *name; 02279 02280 /** The filesystem revision where this was copied from (if any) */ 02281 svn_revnum_t copyfrom_rev; 02282 02283 /** The filesystem path where this was copied from (if any) */ 02284 const char *copyfrom_path; 02285 02286 /** Pointer to the next sibling of this node */ 02287 struct svn_repos_node_t *sibling; 02288 02289 /** Pointer to the first child of this node */ 02290 struct svn_repos_node_t *child; 02291 02292 /** Pointer to the parent of this node */ 02293 struct svn_repos_node_t *parent; 02294 02295 } svn_repos_node_t; 02296 02297 02298 /** Set @a *editor and @a *edit_baton to an editor that, when driven by 02299 * a driver such as svn_repos_replay2(), builds an <tt>svn_repos_node_t *</tt> 02300 * tree representing the delta from @a base_root to @a root in @a 02301 * repos's filesystem. 02302 * 02303 * The editor can also be driven by svn_repos_dir_delta2() or 02304 * svn_repos_begin_report2(), but unless you have special needs, 02305 * svn_repos_replay2() is preferred. 02306 * 02307 * Invoke svn_repos_node_from_baton() on @a edit_baton to obtain the root 02308 * node afterwards. 02309 * 02310 * Note that the delta includes "bubbled-up" directories; that is, 02311 * many of the directory nodes will have no prop_mods. 02312 * 02313 * Allocate the tree and its contents in @a node_pool; do all other 02314 * allocation in @a pool. 02315 */ 02316 svn_error_t * 02317 svn_repos_node_editor(const svn_delta_editor_t **editor, 02318 void **edit_baton, 02319 svn_repos_t *repos, 02320 svn_fs_root_t *base_root, 02321 svn_fs_root_t *root, 02322 apr_pool_t *node_pool, 02323 apr_pool_t *pool); 02324 02325 /** Return the root node of the linked-list tree generated by driving the 02326 * editor (associated with @a edit_baton) created by svn_repos_node_editor(). 02327 * This is only really useful if used *after* the editor drive is completed. 02328 */ 02329 svn_repos_node_t * 02330 svn_repos_node_from_baton(void *edit_baton); 02331 02332 /** @} */ 02333 02334 /* ---------------------------------------------------------------*/ 02335 02336 /** 02337 * @defgroup svn_repos_dump_load Dumping and loading filesystem data 02338 * @{ 02339 * 02340 * The filesystem 'dump' format contains nothing but the abstract 02341 * structure of the filesystem -- independent of any internal node-id 02342 * schema or database back-end. All of the data in the dumpfile is 02343 * acquired by public function calls into svn_fs.h. Similarly, the 02344 * parser which reads the dumpfile is able to reconstruct the 02345 * filesystem using only public svn_fs.h routines. 02346 * 02347 * Thus the dump/load feature's main purpose is for *migrating* data 02348 * from one svn filesystem to another -- presumably two filesystems 02349 * which have different internal implementations. 02350 * 02351 * If you simply want to backup your filesystem, you're probably 02352 * better off using the built-in facilities of the DB backend (using 02353 * Berkeley DB's hot-backup feature, for example.) 02354 * 02355 * For a description of the dumpfile format, see 02356 * /trunk/notes/fs_dumprestore.txt. 02357 */ 02358 02359 /* The RFC822-style headers in our dumpfile format. */ 02360 #define SVN_REPOS_DUMPFILE_MAGIC_HEADER "SVN-fs-dump-format-version" 02361 #define SVN_REPOS_DUMPFILE_FORMAT_VERSION 3 02362 #define SVN_REPOS_DUMPFILE_UUID "UUID" 02363 #define SVN_REPOS_DUMPFILE_CONTENT_LENGTH "Content-length" 02364 02365 #define SVN_REPOS_DUMPFILE_REVISION_NUMBER "Revision-number" 02366 02367 #define SVN_REPOS_DUMPFILE_NODE_PATH "Node-path" 02368 #define SVN_REPOS_DUMPFILE_NODE_KIND "Node-kind" 02369 #define SVN_REPOS_DUMPFILE_NODE_ACTION "Node-action" 02370 #define SVN_REPOS_DUMPFILE_NODE_COPYFROM_PATH "Node-copyfrom-path" 02371 #define SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV "Node-copyfrom-rev" 02372 /** @since New in 1.6. */ 02373 #define SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_MD5 "Text-copy-source-md5" 02374 /** @since New in 1.6. */ 02375 #define SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_SHA1 "Text-copy-source-sha1" 02376 #define SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_CHECKSUM \ 02377 SVN_REPOS_DUMPFILE_TEXT_COPY_SOURCE_MD5 02378 /** @since New in 1.6. */ 02379 #define SVN_REPOS_DUMPFILE_TEXT_CONTENT_MD5 "Text-content-md5" 02380 /** @since New in 1.6. */ 02381 #define SVN_REPOS_DUMPFILE_TEXT_CONTENT_SHA1 "Text-content-sha1" 02382 #define SVN_REPOS_DUMPFILE_TEXT_CONTENT_CHECKSUM \ 02383 SVN_REPOS_DUMPFILE_TEXT_CONTENT_MD5 02384 02385 #define SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH "Prop-content-length" 02386 #define SVN_REPOS_DUMPFILE_TEXT_CONTENT_LENGTH "Text-content-length" 02387 02388 /** @since New in 1.1. */ 02389 #define SVN_REPOS_DUMPFILE_PROP_DELTA "Prop-delta" 02390 /** @since New in 1.1. */ 02391 #define SVN_REPOS_DUMPFILE_TEXT_DELTA "Text-delta" 02392 /** @since New in 1.6. */ 02393 #define SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5 "Text-delta-base-md5" 02394 /** @since New in 1.6. */ 02395 #define SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_SHA1 "Text-delta-base-sha1" 02396 /** @since New in 1.5. */ 02397 #define SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_CHECKSUM \ 02398 SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5 02399 02400 /** 02401 * Verify the contents of the file system in @a repos. 02402 * 02403 * If @a feedback_stream is not @c NULL, write feedback to it (lines of 02404 * the form "* Verified revision %ld\n"). 02405 * 02406 * If @a start_rev is #SVN_INVALID_REVNUM, then start verifying at 02407 * revision 0. If @a end_rev is #SVN_INVALID_REVNUM, then verify 02408 * through the @c HEAD revision. 02409 * 02410 * For every verified revision call @a notify_func with @a rev set to 02411 * the verified revision and @a warning_text @c NULL. For warnings call @a 02412 * notify_func with @a warning_text set. 02413 * 02414 * If @a cancel_func is not @c NULL, call it periodically with @a 02415 * cancel_baton as argument to see if the caller wishes to cancel the 02416 * verification. 02417 * 02418 * @since New in 1.7. 02419 */ 02420 svn_error_t * 02421 svn_repos_verify_fs2(svn_repos_t *repos, 02422 svn_revnum_t start_rev, 02423 svn_revnum_t end_rev, 02424 svn_repos_notify_func_t notify_func, 02425 void *notify_baton, 02426 svn_cancel_func_t cancel, 02427 void *cancel_baton, 02428 apr_pool_t *scratch_pool); 02429 02430 /** 02431 * Similar to svn_repos_verify_fs2(), but with a feedback_stream instead of 02432 * handling feedback via the notify_func handler 02433 * 02434 * @since New in 1.5. 02435 * @deprecated Provided for backward compatibility with the 1.6 API. 02436 */ 02437 SVN_DEPRECATED 02438 svn_error_t * 02439 svn_repos_verify_fs(svn_repos_t *repos, 02440 svn_stream_t *feedback_stream, 02441 svn_revnum_t start_rev, 02442 svn_revnum_t end_rev, 02443 svn_cancel_func_t cancel_func, 02444 void *cancel_baton, 02445 apr_pool_t *pool); 02446 02447 /** 02448 * Dump the contents of the filesystem within already-open @a repos into 02449 * writable @a dumpstream. Begin at revision @a start_rev, and dump every 02450 * revision up through @a end_rev. Use @a pool for all allocation. If 02451 * non-@c NULL, send feedback to @a feedback_stream. If @a dumpstream is 02452 * @c NULL, this is effectively a primitive verify. It is not complete, 02453 * however; see svn_fs_verify instead. 02454 * 02455 * If @a start_rev is #SVN_INVALID_REVNUM, then start dumping at revision 02456 * 0. If @a end_rev is #SVN_INVALID_REVNUM, then dump through the @c HEAD 02457 * revision. 02458 * 02459 * If @a incremental is @c TRUE, the first revision dumped will be a diff 02460 * against the previous revision (usually it looks like a full dump of 02461 * the tree). 02462 * 02463 * If @a use_deltas is @c TRUE, output only node properties which have 02464 * changed relative to the previous contents, and output text contents 02465 * as svndiff data against the previous contents. Regardless of how 02466 * this flag is set, the first revision of a non-incremental dump will 02467 * be done with full plain text. A dump with @a use_deltas set cannot 02468 * be loaded by Subversion 1.0.x. 02469 * 02470 * If @a notify_func is not @c NULL, then for every dumped revision call 02471 * @a notify_func with @a rev set to the dumped revision and @a warning_text 02472 * @c NULL. For warnings call @a notify_func with @a warning_text. 02473 * 02474 * If @a cancel_func is not @c NULL, it is called periodically with 02475 * @a cancel_baton as argument to see if the client wishes to cancel 02476 * the dump. 02477 * 02478 * @since New in 1.7. 02479 */ 02480 svn_error_t * 02481 svn_repos_dump_fs3(svn_repos_t *repos, 02482 svn_stream_t *dumpstream, 02483 svn_revnum_t start_rev, 02484 svn_revnum_t end_rev, 02485 svn_boolean_t incremental, 02486 svn_boolean_t use_deltas, 02487 svn_repos_notify_func_t notify_func, 02488 void *notify_baton, 02489 svn_cancel_func_t cancel_func, 02490 void *cancel_baton, 02491 apr_pool_t *scratch_pool); 02492 02493 /** 02494 * Similar to svn_repos_dump_fs3(), but with a feedback_stream instead of 02495 * handling feedback via the notify_func handler 02496 * 02497 * @since New in 1.1. 02498 * @deprecated Provided for backward compatibility with the 1.6 API. 02499 */ 02500 SVN_DEPRECATED 02501 svn_error_t * 02502 svn_repos_dump_fs2(svn_repos_t *repos, 02503 svn_stream_t *dumpstream, 02504 svn_stream_t *feedback_stream, 02505 svn_revnum_t start_rev, 02506 svn_revnum_t end_rev, 02507 svn_boolean_t incremental, 02508 svn_boolean_t use_deltas, 02509 svn_cancel_func_t cancel_func, 02510 void *cancel_baton, 02511 apr_pool_t *pool); 02512 02513 /** 02514 * Similar to svn_repos_dump_fs2(), but with the @a use_deltas 02515 * parameter always set to @c FALSE. 02516 * 02517 * @deprecated Provided for backward compatibility with the 1.0 API. 02518 */ 02519 SVN_DEPRECATED 02520 svn_error_t * 02521 svn_repos_dump_fs(svn_repos_t *repos, 02522 svn_stream_t *dumpstream, 02523 svn_stream_t *feedback_stream, 02524 svn_revnum_t start_rev, 02525 svn_revnum_t end_rev, 02526 svn_boolean_t incremental, 02527 svn_cancel_func_t cancel_func, 02528 void *cancel_baton, 02529 apr_pool_t *pool); 02530 02531 02532 /** 02533 * Read and parse dumpfile-formatted @a dumpstream, reconstructing 02534 * filesystem revisions in already-open @a repos, handling uuids in 02535 * accordance with @a uuid_action. Use @a pool for all allocation. 02536 * 02537 * If the dumpstream contains copy history that is unavailable in the 02538 * repository, an error will be thrown. 02539 * 02540 * The repository's UUID will be updated iff 02541 * the dumpstream contains a UUID and 02542 * @a uuid_action is not equal to #svn_repos_load_uuid_ignore and 02543 * either the repository contains no revisions or 02544 * @a uuid_action is equal to #svn_repos_load_uuid_force. 02545 * 02546 * If the dumpstream contains no UUID, then @a uuid_action is 02547 * ignored and the repository UUID is not touched. 02548 * 02549 * If @a parent_dir is not NULL, then the parser will reparent all the 02550 * loaded nodes, from root to @a parent_dir. The directory @a parent_dir 02551 * must be an existing directory in the repository. 02552 * 02553 * If @a use_pre_commit_hook is set, call the repository's pre-commit 02554 * hook before committing each loaded revision. 02555 * 02556 * If @a use_post_commit_hook is set, call the repository's 02557 * post-commit hook after committing each loaded revision. 02558 * 02559 * If @a validate_props is set, then validate Subversion revision and 02560 * node properties (those in the svn: namespace) against established 02561 * rules for those things. 02562 * 02563 * If non-NULL, use @a notify_func and @a notify_baton to send notification 02564 * of events to the caller. 02565 * 02566 * If @a cancel_func is not @c NULL, it is called periodically with 02567 * @a cancel_baton as argument to see if the client wishes to cancel 02568 * the load. 02569 * 02570 * @since New in 1.7. 02571 */ 02572 svn_error_t * 02573 svn_repos_load_fs3(svn_repos_t *repos, 02574 svn_stream_t *dumpstream, 02575 enum svn_repos_load_uuid uuid_action, 02576 const char *parent_dir, 02577 svn_boolean_t use_pre_commit_hook, 02578 svn_boolean_t use_post_commit_hook, 02579 svn_boolean_t validate_props, 02580 svn_repos_notify_func_t notify_func, 02581 void *notify_baton, 02582 svn_cancel_func_t cancel_func, 02583 void *cancel_baton, 02584 apr_pool_t *pool); 02585 02586 /** 02587 * Similar to svn_repos_load_fs3(), but with @a feedback_stream in 02588 * place of the #svn_repos_notify_func_t and baton and with 02589 * @a validate_props always FALSE. 02590 * 02591 * @since New in 1.2. 02592 * @deprecated Provided for backward compatibility with the 1.6 API. 02593 */ 02594 SVN_DEPRECATED 02595 svn_error_t * 02596 svn_repos_load_fs2(svn_repos_t *repos, 02597 svn_stream_t *dumpstream, 02598 svn_stream_t *feedback_stream, 02599 enum svn_repos_load_uuid uuid_action, 02600 const char *parent_dir, 02601 svn_boolean_t use_pre_commit_hook, 02602 svn_boolean_t use_post_commit_hook, 02603 svn_cancel_func_t cancel_func, 02604 void *cancel_baton, 02605 apr_pool_t *pool); 02606 02607 /** 02608 * Similar to svn_repos_load_fs2(), but with @a use_pre_commit_hook and 02609 * @a use_post_commit_hook always @c FALSE. 02610 * 02611 * @deprecated Provided for backward compatibility with the 1.1 API. 02612 */ 02613 SVN_DEPRECATED 02614 svn_error_t * 02615 svn_repos_load_fs(svn_repos_t *repos, 02616 svn_stream_t *dumpstream, 02617 svn_stream_t *feedback_stream, 02618 enum svn_repos_load_uuid uuid_action, 02619 const char *parent_dir, 02620 svn_cancel_func_t cancel_func, 02621 void *cancel_baton, 02622 apr_pool_t *pool); 02623 02624 02625 /** 02626 * A vtable that is driven by svn_repos_parse_dumpstream2(). 02627 * 02628 * @since New in 1.1. 02629 */ 02630 typedef struct svn_repos_parse_fns2_t 02631 { 02632 /** The parser has discovered a new revision record within the 02633 * parsing session represented by @a parse_baton. All the headers are 02634 * placed in @a headers (allocated in @a pool), which maps <tt>const 02635 * char *</tt> header-name ==> <tt>const char *</tt> header-value. 02636 * The @a revision_baton received back (also allocated in @a pool) 02637 * represents the revision. 02638 */ 02639 svn_error_t *(*new_revision_record)(void **revision_baton, 02640 apr_hash_t *headers, 02641 void *parse_baton, 02642 apr_pool_t *pool); 02643 02644 /** The parser has discovered a new uuid record within the parsing 02645 * session represented by @a parse_baton. The uuid's value is 02646 * @a uuid, and it is allocated in @a pool. 02647 */ 02648 svn_error_t *(*uuid_record)(const char *uuid, 02649 void *parse_baton, 02650 apr_pool_t *pool); 02651 02652 /** The parser has discovered a new node record within the current 02653 * revision represented by @a revision_baton. All the headers are 02654 * placed in @a headers (as with @c new_revision_record), allocated in 02655 * @a pool. The @a node_baton received back is allocated in @a pool 02656 * and represents the node. 02657 */ 02658 svn_error_t *(*new_node_record)(void **node_baton, 02659 apr_hash_t *headers, 02660 void *revision_baton, 02661 apr_pool_t *pool); 02662 02663 /** For a given @a revision_baton, set a property @a name to @a value. */ 02664 svn_error_t *(*set_revision_property)(void *revision_baton, 02665 const char *name, 02666 const svn_string_t *value); 02667 02668 /** For a given @a node_baton, set a property @a name to @a value. */ 02669 svn_error_t *(*set_node_property)(void *node_baton, 02670 const char *name, 02671 const svn_string_t *value); 02672 02673 /** For a given @a node_baton, delete property @a name. */ 02674 svn_error_t *(*delete_node_property)(void *node_baton, const char *name); 02675 02676 /** For a given @a node_baton, remove all properties. */ 02677 svn_error_t *(*remove_node_props)(void *node_baton); 02678 02679 /** For a given @a node_baton, receive a writable @a stream capable of 02680 * receiving the node's fulltext. After writing the fulltext, call 02681 * the stream's close() function. 02682 * 02683 * If a @c NULL is returned instead of a stream, the vtable is 02684 * indicating that no text is desired, and the parser will not 02685 * attempt to send it. 02686 */ 02687 svn_error_t *(*set_fulltext)(svn_stream_t **stream, 02688 void *node_baton); 02689 02690 /** For a given @a node_baton, set @a handler and @a handler_baton 02691 * to a window handler and baton capable of receiving a delta 02692 * against the node's previous contents. A NULL window will be 02693 * sent to the handler after all the windows are sent. 02694 * 02695 * If a @c NULL is returned instead of a handler, the vtable is 02696 * indicating that no delta is desired, and the parser will not 02697 * attempt to send it. 02698 */ 02699 svn_error_t *(*apply_textdelta)(svn_txdelta_window_handler_t *handler, 02700 void **handler_baton, 02701 void *node_baton); 02702 02703 /** The parser has reached the end of the current node represented by 02704 * @a node_baton, it can be freed. 02705 */ 02706 svn_error_t *(*close_node)(void *node_baton); 02707 02708 /** The parser has reached the end of the current revision 02709 * represented by @a revision_baton. In other words, there are no more 02710 * changed nodes within the revision. The baton can be freed. 02711 */ 02712 svn_error_t *(*close_revision)(void *revision_baton); 02713 02714 } svn_repos_parse_fns2_t; 02715 02716 /** @deprecated Provided for backward compatibility with the 1.2 API. */ 02717 typedef svn_repos_parse_fns2_t svn_repos_parser_fns2_t; 02718 02719 02720 /** 02721 * Read and parse dumpfile-formatted @a stream, calling callbacks in 02722 * @a parse_fns/@a parse_baton, and using @a pool for allocations. 02723 * 02724 * If @a cancel_func is not @c NULL, it is called periodically with 02725 * @a cancel_baton as argument to see if the client wishes to cancel 02726 * the dump. 02727 * 02728 * This parser has built-in knowledge of the dumpfile format, but only 02729 * in a general sense: 02730 * 02731 * * it recognizes revision and node records by looking for either 02732 * a REVISION_NUMBER or NODE_PATH headers. 02733 * 02734 * * it recognizes the CONTENT-LENGTH headers, so it knows if and 02735 * how to suck up the content body. 02736 * 02737 * * it knows how to parse a content body into two parts: props 02738 * and text, and pass the pieces to the vtable. 02739 * 02740 * This is enough knowledge to make it easy on vtable implementors, 02741 * but still allow expansion of the format: most headers are ignored. 02742 * 02743 * @since New in 1.1. 02744 */ 02745 svn_error_t * 02746 svn_repos_parse_dumpstream2(svn_stream_t *stream, 02747 const svn_repos_parse_fns2_t *parse_fns, 02748 void *parse_baton, 02749 svn_cancel_func_t cancel_func, 02750 void *cancel_baton, 02751 apr_pool_t *pool); 02752 02753 02754 /** 02755 * Set @a *parser and @a *parse_baton to a vtable parser which commits new 02756 * revisions to the fs in @a repos. The constructed parser will treat 02757 * UUID records in a manner consistent with @a uuid_action. Use @a pool 02758 * to operate on the fs. 02759 * 02760 * If @a use_history is set, then the parser will require relative 02761 * 'copyfrom' history to exist in the repository when it encounters 02762 * nodes that are added-with-history. 02763 * 02764 * If @a validate_props is set, then validate Subversion revision and 02765 * node properties (those in the svn: namespace) against established 02766 * rules for those things. 02767 * 02768 * If @a parent_dir is not NULL, then the parser will reparent all the 02769 * loaded nodes, from root to @a parent_dir. The directory @a parent_dir 02770 * must be an existing directory in the repository. 02771 * 02772 * Print all parsing feedback to @a outstream (if non-@c NULL). 02773 * 02774 * @since New in 1.7. 02775 */ 02776 svn_error_t * 02777 svn_repos_get_fs_build_parser3(const svn_repos_parse_fns2_t **parser, 02778 void **parse_baton, 02779 svn_repos_t *repos, 02780 svn_boolean_t use_history, 02781 svn_boolean_t validate_props, 02782 enum svn_repos_load_uuid uuid_action, 02783 const char *parent_dir, 02784 svn_repos_notify_func_t notify_func, 02785 void *notify_baton, 02786 apr_pool_t *pool); 02787 02788 /** 02789 * Similar to svn_repos_get_fs_build_parser3(), but with @a outstream 02790 * in place if a #svn_repos_notify_func_t and baton and with 02791 * @a validate_props always FALSE. 02792 * 02793 * @since New in 1.1. 02794 * @deprecated Provided for backward compatibility with the 1.6 API. 02795 */ 02796 SVN_DEPRECATED 02797 svn_error_t * 02798 svn_repos_get_fs_build_parser2(const svn_repos_parse_fns2_t **parser, 02799 void **parse_baton, 02800 svn_repos_t *repos, 02801 svn_boolean_t use_history, 02802 enum svn_repos_load_uuid uuid_action, 02803 svn_stream_t *outstream, 02804 const char *parent_dir, 02805 apr_pool_t *pool); 02806 02807 /** 02808 * A vtable that is driven by svn_repos_parse_dumpstream(). 02809 * Similar to #svn_repos_parse_fns2_t except that it lacks 02810 * the delete_node_property and apply_textdelta callbacks. 02811 * 02812 * @deprecated Provided for backward compatibility with the 1.0 API. 02813 */ 02814 typedef struct svn_repos_parse_fns_t 02815 { 02816 /** Same as #svn_repos_parse_fns2_t.new_revision_record. */ 02817 svn_error_t *(*new_revision_record)(void **revision_baton, 02818 apr_hash_t *headers, 02819 void *parse_baton, 02820 apr_pool_t *pool); 02821 /** Same as #svn_repos_parse_fns2_t.uuid_record. */ 02822 svn_error_t *(*uuid_record)(const char *uuid, 02823 void *parse_baton, 02824 apr_pool_t *pool); 02825 /** Same as #svn_repos_parse_fns2_t.new_node_record. */ 02826 svn_error_t *(*new_node_record)(void **node_baton, 02827 apr_hash_t *headers, 02828 void *revision_baton, 02829 apr_pool_t *pool); 02830 /** Same as #svn_repos_parse_fns2_t.set_revision_property. */ 02831 svn_error_t *(*set_revision_property)(void *revision_baton, 02832 const char *name, 02833 const svn_string_t *value); 02834 /** Same as #svn_repos_parse_fns2_t.set_node_property. */ 02835 svn_error_t *(*set_node_property)(void *node_baton, 02836 const char *name, 02837 const svn_string_t *value); 02838 /** Same as #svn_repos_parse_fns2_t.remove_node_props. */ 02839 svn_error_t *(*remove_node_props)(void *node_baton); 02840 /** Same as #svn_repos_parse_fns2_t.set_fulltext. */ 02841 svn_error_t *(*set_fulltext)(svn_stream_t **stream, 02842 void *node_baton); 02843 /** Same as #svn_repos_parse_fns2_t.close_node. */ 02844 svn_error_t *(*close_node)(void *node_baton); 02845 /** Same as #svn_repos_parse_fns2_t.close_revision. */ 02846 svn_error_t *(*close_revision)(void *revision_baton); 02847 } svn_repos_parser_fns_t; 02848 02849 02850 /** 02851 * Similar to svn_repos_parse_dumpstream2(), but uses the more limited 02852 * #svn_repos_parser_fns_t vtable type. 02853 * 02854 * @deprecated Provided for backward compatibility with the 1.0 API. 02855 */ 02856 SVN_DEPRECATED 02857 svn_error_t * 02858 svn_repos_parse_dumpstream(svn_stream_t *stream, 02859 const svn_repos_parser_fns_t *parse_fns, 02860 void *parse_baton, 02861 svn_cancel_func_t cancel_func, 02862 void *cancel_baton, 02863 apr_pool_t *pool); 02864 02865 02866 /** 02867 * Similar to svn_repos_get_fs_build_parser2(), but yields the more 02868 * limited svn_repos_parser_fns_t vtable type. 02869 * 02870 * @deprecated Provided for backward compatibility with the 1.0 API. 02871 */ 02872 SVN_DEPRECATED 02873 svn_error_t * 02874 svn_repos_get_fs_build_parser(const svn_repos_parser_fns_t **parser, 02875 void **parse_baton, 02876 svn_repos_t *repos, 02877 svn_boolean_t use_history, 02878 enum svn_repos_load_uuid uuid_action, 02879 svn_stream_t *outstream, 02880 const char *parent_dir, 02881 apr_pool_t *pool); 02882 02883 02884 /** @} */ 02885 02886 /** A data type which stores the authz information. 02887 * 02888 * @since New in 1.3. 02889 */ 02890 typedef struct svn_authz_t svn_authz_t; 02891 02892 /** Read authz configuration data from @a file (a file or registry 02893 * path) into @a *authz_p, allocated in @a pool. 02894 * 02895 * If @a file is not a valid authz rule file, then return 02896 * SVN_AUTHZ_INVALID_CONFIG. The contents of @a *authz_p is then 02897 * undefined. If @a must_exist is TRUE, a missing authz file is also 02898 * an error. 02899 * 02900 * @since New in 1.3. 02901 */ 02902 svn_error_t * 02903 svn_repos_authz_read(svn_authz_t **authz_p, 02904 const char *file, 02905 svn_boolean_t must_exist, 02906 apr_pool_t *pool); 02907 02908 /** 02909 * Check whether @a user can access @a path in the repository @a 02910 * repos_name with the @a required_access. @a authz lists the ACLs to 02911 * check against. Set @a *access_granted to indicate if the requested 02912 * access is granted. 02913 * 02914 * If @a path is NULL, then check whether @a user has the @a 02915 * required_access anywhere in the repository. Set @a *access_granted 02916 * to TRUE if at least one path is accessible with the @a 02917 * required_access. 02918 * 02919 * For compatibility with 1.6, and earlier, @a repos_name can be NULL 02920 * in which case it is equivalent to a @a repos_name of "". 02921 * 02922 * @since New in 1.3. 02923 */ 02924 svn_error_t * 02925 svn_repos_authz_check_access(svn_authz_t *authz, 02926 const char *repos_name, 02927 const char *path, 02928 const char *user, 02929 svn_repos_authz_access_t required_access, 02930 svn_boolean_t *access_granted, 02931 apr_pool_t *pool); 02932 02933 02934 02935 /** Revision Access Levels 02936 * 02937 * Like most version control systems, access to versioned objects in 02938 * Subversion is determined on primarily path-based system. Users either 02939 * do or don't have the ability to read a given path. 02940 * 02941 * However, unlike many version control systems where versioned objects 02942 * maintain their own distinct version information (revision numbers, 02943 * authors, log messages, change timestamps, etc.), Subversion binds 02944 * multiple paths changed as part of a single commit operation into a 02945 * set, calls the whole thing a revision, and hangs commit metadata 02946 * (author, date, log message, etc.) off of that revision. So, commit 02947 * metadata is shared across all the paths changed as part of a given 02948 * commit operation. 02949 * 02950 * It is common (or, at least, we hope it is) for log messages to give 02951 * detailed information about changes made in the commit to which the log 02952 * message is attached. Such information might include a mention of all 02953 * the files changed, what was changed in them, and so on. But this 02954 * causes a problem when presenting information to readers who aren't 02955 * authorized to read every path in the repository. Simply knowing that 02956 * a given path exists may be a security leak, even if the user can't see 02957 * the contents of the data located at that path. 02958 * 02959 * So Subversion does what it reasonably can to prevent the leak of this 02960 * information, and does so via a staged revision access policy. A 02961 * reader can be said to have one of three levels of access to a given 02962 * revision's metadata, based solely on the reader's access rights to the 02963 * paths changed or copied in that revision: 02964 * 02965 * 'full access' -- Granted when the reader has access to all paths 02966 * changed or copied in the revision, or when no paths were 02967 * changed in the revision at all, this access level permits 02968 * full visibility of all revision property names and values, 02969 * and the full changed-paths information. 02970 * 02971 * 'no access' -- Granted when the reader does not have access to any 02972 * paths changed or copied in the revision, this access level 02973 * denies the reader access to all revision properties and all 02974 * changed-paths information. 02975 * 02976 * 'partial access' -- Granted when the reader has access to at least 02977 * one, but not all, of the paths changed or copied in the revision, 02978 * this access level permits visibility of the svn:date and 02979 * svn:author revision properties and only the paths of the 02980 * changed-paths information to which the reader has access. 02981 * 02982 */ 02983 02984 02985 /** An enum defining levels of revision access. 02986 * 02987 * @since New in 1.5. 02988 */ 02989 typedef enum svn_repos_revision_access_level_t 02990 { 02991 svn_repos_revision_access_none, 02992 svn_repos_revision_access_partial, 02993 svn_repos_revision_access_full 02994 } 02995 svn_repos_revision_access_level_t; 02996 02997 02998 /** 02999 * Set @a access to the access level granted for @a revision in @a 03000 * repos, as determined by consulting the @a authz_read_func callback 03001 * function and its associated @a authz_read_baton. 03002 * 03003 * @a authz_read_func may be @c NULL, in which case @a access will be 03004 * set to #svn_repos_revision_access_full. 03005 * 03006 * @since New in 1.5. 03007 */ 03008 svn_error_t * 03009 svn_repos_check_revision_access(svn_repos_revision_access_level_t *access_level, 03010 svn_repos_t *repos, 03011 svn_revnum_t revision, 03012 svn_repos_authz_func_t authz_read_func, 03013 void *authz_read_baton, 03014 apr_pool_t *pool); 03015 03016 03017 03018 /** Capabilities **/ 03019 03020 /** 03021 * Store in @a repos the client-reported capabilities @a capabilities, 03022 * which must be allocated in memory at least as long-lived as @a repos. 03023 * 03024 * The elements of @a capabilities are 'const char *', a subset of 03025 * the constants beginning with @c SVN_RA_CAPABILITY_. 03026 * @a capabilities is not copied, so changing it later will affect 03027 * what is remembered by @a repos. 03028 * 03029 * @note The capabilities are passed along to the start-commit hook; 03030 * see that hook's template for details. 03031 * 03032 * @note As of Subversion 1.5, there are no error conditions defined, 03033 * so this always returns SVN_NO_ERROR. In future releases it may 03034 * return error, however, so callers should check. 03035 * 03036 * @since New in 1.5. 03037 */ 03038 svn_error_t * 03039 svn_repos_remember_client_capabilities(svn_repos_t *repos, 03040 const apr_array_header_t *capabilities); 03041 03042 03043 03044 #ifdef __cplusplus 03045 } 03046 #endif /* __cplusplus */ 03047 03048 #endif /* SVN_REPOS_H */