Subversion 1.6.16
|
Data Structures | |
struct | svn_fs_dirent_t |
The type of a Subversion directory entry. More... | |
Modules | |
Berkeley DB filesystems | |
Subversion filesystems based on Berkeley DB. | |
Filesystem access contexts | |
Filesystem Access Contexts. | |
Filesystem nodes | |
Filesystem Nodes. | |
Filesystem transactions | |
Filesystem Transactions. | |
Filesystem roots | |
Roots. | |
Filesystem directories | |
Directory entry names and directory paths. | |
Filesystem locks | |
Typedefs | |
typedef struct svn_fs_t | svn_fs_t |
An object representing a Subversion filesystem. | |
typedef void(* | svn_fs_warning_callback_t )(void *baton, svn_error_t *err) |
The type of a warning callback function. | |
typedef struct svn_fs_history_t | svn_fs_history_t |
An opaque node history object. | |
typedef struct svn_fs_dirent_t | svn_fs_dirent_t |
The type of a Subversion directory entry. | |
typedef svn_error_t *(* | svn_fs_pack_notify_t )(void *baton, apr_int64_t shard, svn_fs_pack_notify_action_t action, apr_pool_t *pool) |
The type of a pack notification function. | |
Enumerations | |
enum | svn_fs_pack_notify_action_t { svn_fs_pack_notify_start = 0, svn_fs_pack_notify_end } |
The kind of action being taken by 'pack'. More... | |
Functions | |
svn_error_t * | svn_fs_initialize (apr_pool_t *pool) |
Callers should invoke this function to initialize global state in the FS library before creating FS objects. | |
void | svn_fs_set_warning_func (svn_fs_t *fs, svn_fs_warning_callback_t warning, void *warning_baton) |
Provide a callback function, warning, that fs should use to report (non-fatal) errors. | |
svn_error_t * | svn_fs_create (svn_fs_t **fs_p, const char *path, apr_hash_t *fs_config, apr_pool_t *pool) |
Create a new, empty Subversion filesystem, stored in the directory path, and return a pointer to it in *fs_p. | |
svn_error_t * | svn_fs_open (svn_fs_t **fs_p, const char *path, apr_hash_t *fs_config, apr_pool_t *pool) |
Open a Subversion filesystem located in the directory path, and return a pointer to it in *fs_p. | |
svn_error_t * | svn_fs_upgrade (const char *path, apr_pool_t *pool) |
Upgrade the Subversion filesystem located in the directory path to the latest version supported by this library. | |
svn_error_t * | svn_fs_type (const char **fs_type, const char *path, apr_pool_t *pool) |
Return, in *fs_type, a string identifying the back-end type of the Subversion filesystem located in path. | |
const char * | svn_fs_path (svn_fs_t *fs, apr_pool_t *pool) |
Return the path to fs's repository, allocated in pool. | |
svn_error_t * | svn_fs_delete_fs (const char *path, apr_pool_t *pool) |
Delete the filesystem at path. | |
svn_error_t * | svn_fs_hotcopy (const char *src_path, const char *dest_path, svn_boolean_t clean, apr_pool_t *pool) |
Copy a possibly live Subversion filesystem from src_path to dest_path. | |
svn_error_t * | svn_fs_recover (const char *path, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *pool) |
Perform any necessary non-catastrophic recovery on the Subversion filesystem located at path. | |
svn_error_t * | svn_fs_check_path (svn_node_kind_t *kind_p, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *kind_p to the type of node present at path under root. | |
svn_error_t * | svn_fs_node_history (svn_fs_history_t **history_p, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *history_p to an opaque node history object which represents path under root. | |
svn_error_t * | svn_fs_history_prev (svn_fs_history_t **prev_history_p, svn_fs_history_t *history, svn_boolean_t cross_copies, apr_pool_t *pool) |
Set *prev_history_p to an opaque node history object which represents the previous (or "next oldest") interesting history location for the filesystem node represented by history, or NULL if no such previous history exists. | |
svn_error_t * | svn_fs_history_location (const char **path, svn_revnum_t *revision, svn_fs_history_t *history, apr_pool_t *pool) |
Set *path and *revision to the path and revision, respectively, of the history object. | |
svn_error_t * | svn_fs_is_dir (svn_boolean_t *is_dir, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *is_dir to TRUE iff path in root is a directory. | |
svn_error_t * | svn_fs_is_file (svn_boolean_t *is_file, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *is_file to TRUE iff path in root is a file. | |
svn_error_t * | svn_fs_node_id (const svn_fs_id_t **id_p, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Get the id of a node. | |
svn_error_t * | svn_fs_node_created_rev (svn_revnum_t *revision, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *revision to the revision in which path under root was created. | |
svn_error_t * | svn_fs_node_origin_rev (svn_revnum_t *revision, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *revision to the revision in which the line of history represented by path under root originated. | |
svn_error_t * | svn_fs_node_created_path (const char **created_path, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *created_path to the path at which path under root was created. | |
svn_error_t * | svn_fs_node_prop (svn_string_t **value_p, svn_fs_root_t *root, const char *path, const char *propname, apr_pool_t *pool) |
Set *value_p to the value of the property named propname of path in root. | |
svn_error_t * | svn_fs_node_proplist (apr_hash_t **table_p, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *table_p to the entire property list of path in root, as an APR hash table allocated in pool. | |
svn_error_t * | svn_fs_change_node_prop (svn_fs_root_t *root, const char *path, const char *name, const svn_string_t *value, apr_pool_t *pool) |
Change a node's property's value, or add/delete a property. | |
svn_error_t * | svn_fs_props_changed (svn_boolean_t *changed_p, svn_fs_root_t *root1, const char *path1, svn_fs_root_t *root2, const char *path2, apr_pool_t *pool) |
Determine if the properties of two path/root combinations are different. | |
svn_error_t * | svn_fs_copied_from (svn_revnum_t *rev_p, const char **path_p, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Discover a node's copy ancestry, if any. | |
svn_error_t * | svn_fs_closest_copy (svn_fs_root_t **root_p, const char **path_p, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *root_p and *path_p to the revision root and path of the destination of the most recent copy event that caused path to exist where it does in root, or to NULL if no such copy exists. | |
svn_error_t * | svn_fs_get_mergeinfo (svn_mergeinfo_catalog_t *catalog, svn_fs_root_t *root, const apr_array_header_t *paths, svn_mergeinfo_inheritance_t inherit, svn_boolean_t include_descendants, apr_pool_t *pool) |
Retrieve mergeinfo for multiple nodes. | |
svn_error_t * | svn_fs_merge (const char **conflict_p, svn_fs_root_t *source_root, const char *source_path, svn_fs_root_t *target_root, const char *target_path, svn_fs_root_t *ancestor_root, const char *ancestor_path, apr_pool_t *pool) |
Merge changes between two nodes into a third node. | |
svn_error_t * | svn_fs_dir_entries (apr_hash_t **entries_p, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *entries_p to a newly allocated APR hash table containing the entries of the directory at path in root. | |
svn_error_t * | svn_fs_make_dir (svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Create a new directory named path in root. | |
svn_error_t * | svn_fs_delete (svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Delete the node named path in root. | |
svn_error_t * | svn_fs_copy (svn_fs_root_t *from_root, const char *from_path, svn_fs_root_t *to_root, const char *to_path, apr_pool_t *pool) |
Create a copy of from_path in from_root named to_path in to_root. | |
svn_error_t * | svn_fs_revision_link (svn_fs_root_t *from_root, svn_fs_root_t *to_root, const char *path, apr_pool_t *pool) |
Like svn_fs_copy(), but doesn't record copy history, and preserves the PATH. | |
svn_error_t * | svn_fs_file_length (svn_filesize_t *length_p, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *length_p to the length of the file path in root, in bytes. | |
svn_error_t * | svn_fs_file_checksum (svn_checksum_t **checksum, svn_checksum_kind_t kind, svn_fs_root_t *root, const char *path, svn_boolean_t force, apr_pool_t *pool) |
Set *checksum to the checksum of type kind for the file path. | |
svn_error_t * | svn_fs_file_md5_checksum (unsigned char digest[], svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Same as svn_fs_file_checksum(), only always put the MD5 checksum of file path into digest, which should point to APR_MD5_DIGESTSIZE bytes of storage. | |
svn_error_t * | svn_fs_file_contents (svn_stream_t **contents, svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Set *contents to a readable generic stream that will yield the contents of the file path in root. | |
svn_error_t * | svn_fs_make_file (svn_fs_root_t *root, const char *path, apr_pool_t *pool) |
Create a new file named path in root. | |
svn_error_t * | svn_fs_apply_textdelta (svn_txdelta_window_handler_t *contents_p, void **contents_baton_p, svn_fs_root_t *root, const char *path, const char *base_checksum, const char *result_checksum, apr_pool_t *pool) |
Apply a text delta to the file path in root. | |
svn_error_t * | svn_fs_apply_text (svn_stream_t **contents_p, svn_fs_root_t *root, const char *path, const char *result_checksum, apr_pool_t *pool) |
Write data directly to the file path in root. | |
svn_error_t * | svn_fs_contents_changed (svn_boolean_t *changed_p, svn_fs_root_t *root1, const char *path1, svn_fs_root_t *root2, const char *path2, apr_pool_t *pool) |
Check if the contents of two root/path combos have changed. | |
svn_error_t * | svn_fs_youngest_rev (svn_revnum_t *youngest_p, svn_fs_t *fs, apr_pool_t *pool) |
Set *youngest_p to the number of the youngest revision in filesystem fs. | |
svn_error_t * | svn_fs_deltify_revision (svn_fs_t *fs, svn_revnum_t revision, apr_pool_t *pool) |
Provide filesystem fs the opportunity to compress storage relating to associated with revision in filesystem fs. | |
svn_error_t * | svn_fs_revision_prop (svn_string_t **value_p, svn_fs_t *fs, svn_revnum_t rev, const char *propname, apr_pool_t *pool) |
Set *value_p to the value of the property named propname on revision rev in the filesystem fs. | |
svn_error_t * | svn_fs_revision_proplist (apr_hash_t **table_p, svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool) |
Set *table_p to the entire property list of revision rev in filesystem fs, as an APR hash table allocated in pool. | |
svn_error_t * | svn_fs_change_rev_prop (svn_fs_t *fs, svn_revnum_t rev, const char *name, const svn_string_t *value, apr_pool_t *pool) |
Change a revision's property's value, or add/delete a property. | |
svn_error_t * | svn_fs_get_file_delta_stream (svn_txdelta_stream_t **stream_p, svn_fs_root_t *source_root, const char *source_path, svn_fs_root_t *target_root, const char *target_path, apr_pool_t *pool) |
Set *stream_p to a pointer to a delta stream that will turn the contents of the file source into the contents of the file target. | |
svn_error_t * | svn_fs_get_uuid (svn_fs_t *fs, const char **uuid, apr_pool_t *pool) |
Populate *uuid with the UUID associated with fs. | |
svn_error_t * | svn_fs_set_uuid (svn_fs_t *fs, const char *uuid, apr_pool_t *pool) |
If not NULL , associate *uuid with fs. | |
svn_error_t * | svn_fs_print_modules (svn_stringbuf_t *output, apr_pool_t *pool) |
Append a textual list of all available FS modules to the stringbuf output. | |
svn_error_t * | svn_fs_pack (const char *db_path, svn_fs_pack_notify_t notify_func, void *notify_baton, svn_cancel_func_t cancel_func, void *cancel_baton, apr_pool_t *pool) |
Possibly update the filesystem located in the directory path to use disk space more efficiently. | |
Filesystem configuration options | |
#define | SVN_FS_CONFIG_BDB_TXN_NOSYNC "bdb-txn-nosync" |
#define | SVN_FS_CONFIG_BDB_LOG_AUTOREMOVE "bdb-log-autoremove" |
#define | SVN_FS_CONFIG_FS_TYPE "fs-type" |
#define | SVN_FS_TYPE_BDB "bdb" |
#define | SVN_FS_TYPE_FSFS "fsfs" |
#define | SVN_FS_CONFIG_PRE_1_4_COMPATIBLE "pre-1.4-compatible" |
Create repository format compatible with Subversion versions earlier than 1.4. | |
#define | SVN_FS_CONFIG_PRE_1_5_COMPATIBLE "pre-1.5-compatible" |
Create repository format compatible with Subversion versions earlier than 1.5. | |
#define | SVN_FS_CONFIG_PRE_1_6_COMPATIBLE "pre-1.6-compatible" |
Create repository format compatible with Subversion versions earlier than 1.6. |
#define SVN_FS_CONFIG_PRE_1_4_COMPATIBLE "pre-1.4-compatible" |
#define SVN_FS_CONFIG_PRE_1_5_COMPATIBLE "pre-1.5-compatible" |
#define SVN_FS_CONFIG_PRE_1_6_COMPATIBLE "pre-1.6-compatible" |
typedef struct svn_fs_dirent_t svn_fs_dirent_t |
The type of a Subversion directory entry.
typedef struct svn_fs_history_t svn_fs_history_t |
typedef svn_error_t*(* svn_fs_pack_notify_t)(void *baton, apr_int64_t shard, svn_fs_pack_notify_action_t action, apr_pool_t *pool) |
The type of a pack notification function.
shard is the shard being acted upon; action is the type of action being performed. baton is the corresponding baton for the notification function, and pool can be used for temporary allocations, but will be cleared between invocations.
typedef void(* svn_fs_warning_callback_t)(void *baton, svn_error_t *err) |
The type of a warning callback function.
baton is the value specified in the call to svn_fs_set_warning_func(); the filesystem passes it through to the callback. err contains the warning message.
The callback function should not clear the error that is passed to it; its caller should do that.
svn_error_t* svn_fs_apply_text | ( | svn_stream_t ** | contents_p, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
const char * | result_checksum, | ||
apr_pool_t * | pool | ||
) |
Write data directly to the file path in root.
root must be the root of a transaction, not a revision.
Set *contents_p to a stream ready to receive full textual data. When the caller closes this stream, the data replaces the previous contents of the file. The caller must write all file data and close the stream before making further changes to the transaction.
If path does not exist in root, return an error. (You cannot use this routine to create new files; use svn_fs_make_file() to create an empty file first.)
result_checksum is the hex MD5 digest for the final fulltext written to the stream. It is ignored if NULL, but if not null, it must match the checksum of the result; if it does not, then the *contents_p call which detects the mismatch will return the error SVN_ERR_CHECKSUM_MISMATCH
.
Do any necessary temporary allocation in pool.
### This is like svn_fs_apply_textdelta(), but takes the text straight. It is currently used only by the loader, see libsvn_repos/load.c. It should accept a checksum, of course, which would come from an (optional) header in the dump file. See http://subversion.tigris.org/issues/show_bug.cgi?id=1102 for more.
svn_error_t* svn_fs_apply_textdelta | ( | svn_txdelta_window_handler_t * | contents_p, |
void ** | contents_baton_p, | ||
svn_fs_root_t * | root, | ||
const char * | path, | ||
const char * | base_checksum, | ||
const char * | result_checksum, | ||
apr_pool_t * | pool | ||
) |
Apply a text delta to the file path in root.
root must be the root of a transaction, not a revision.
Set *contents_p to a function ready to receive text delta windows describing how to change the file's contents, relative to its current contents. Set *contents_baton_p to a baton to pass to *contents_p.
If path does not exist in root, return an error. (You cannot use this routine to create new files; use svn_fs_make_file() to create an empty file first.)
base_checksum is the hex MD5 digest for the base text against which the delta is to be applied; it is ignored if NULL, and may be ignored even if not NULL. If it is not ignored, it must match the checksum of the base text against which svndiff data is being applied; if not, svn_fs_apply_textdelta() or the *contents_p call which detects the mismatch will return the error SVN_ERR_CHECKSUM_MISMATCH
(if there is no base text, there may still be an error if base_checksum is neither NULL nor the checksum of the empty string).
result_checksum is the hex MD5 digest for the fulltext that results from this delta application. It is ignored if NULL, but if not NULL, it must match the checksum of the result; if it does not, then the *contents_p call which detects the mismatch will return the error SVN_ERR_CHECKSUM_MISMATCH
.
The caller must send all delta windows including the terminating NULL window to *contents_p before making further changes to the transaction.
Do temporary allocation in pool.
svn_error_t* svn_fs_change_node_prop | ( | svn_fs_root_t * | root, |
const char * | path, | ||
const char * | name, | ||
const svn_string_t * | value, | ||
apr_pool_t * | pool | ||
) |
Change a node's property's value, or add/delete a property.
svn_error_t* svn_fs_change_rev_prop | ( | svn_fs_t * | fs, |
svn_revnum_t | rev, | ||
const char * | name, | ||
const svn_string_t * | value, | ||
apr_pool_t * | pool | ||
) |
Change a revision's property's value, or add/delete a property.
Note that revision properties are non-historied --- you can change them after the revision has been committed. They are not protected via transactions.
Do any necessary temporary allocation in pool.
svn_error_t* svn_fs_check_path | ( | svn_node_kind_t * | kind_p, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *kind_p to the type of node present at path under root.
If path does not exist under root, set *kind_p to svn_node_none
. Use pool for temporary allocation.
svn_error_t* svn_fs_closest_copy | ( | svn_fs_root_t ** | root_p, |
const char ** | path_p, | ||
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *root_p and *path_p to the revision root and path of the destination of the most recent copy event that caused path to exist where it does in root, or to NULL if no such copy exists.
When non-NULL, allocate *root_p and *path_p in pool.
*path_p might be a parent of path, rather than path itself. However, it will always be the deepest relevant path. That is, if a copy occurs underneath another copy in the same txn, this function makes sure to set *path_p to the longest copy destination path that is still a parent of or equal to path.
svn_error_t* svn_fs_contents_changed | ( | svn_boolean_t * | changed_p, |
svn_fs_root_t * | root1, | ||
const char * | path1, | ||
svn_fs_root_t * | root2, | ||
const char * | path2, | ||
apr_pool_t * | pool | ||
) |
Check if the contents of two root/path combos have changed.
Set *changed_p to 1 if the contents at path1 under root1 differ from those at path2 under root2, or set it to 0 if they are the same. Both paths must exist under their respective roots, and both roots must be in the same filesystem.
svn_error_t* svn_fs_copied_from | ( | svn_revnum_t * | rev_p, |
const char ** | path_p, | ||
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Discover a node's copy ancestry, if any.
If the node at path in root was copied from some other node, set *rev_p and *path_p to the revision and path of the other node, allocating *path_p in pool.
Else if there is no copy ancestry for the node, set *rev_p to SVN_INVALID_REVNUM
and *path_p to NULL.
If an error is returned, the values of *rev_p and *path_p are undefined, but otherwise, if one of them is set as described above, you may assume the other is set correspondingly.
root may be a revision root or a transaction root.
Notes:
svn_error_t* svn_fs_copy | ( | svn_fs_root_t * | from_root, |
const char * | from_path, | ||
svn_fs_root_t * | to_root, | ||
const char * | to_path, | ||
apr_pool_t * | pool | ||
) |
Create a copy of from_path in from_root named to_path in to_root.
If from_path in from_root is a directory, copy the tree it refers to recursively.
The copy will remember its source; use svn_fs_copied_from() to access this information.
to_root must be the root of a transaction; from_root must be the root of a revision. (Requiring from_root to be the root of a revision makes the implementation trivial: there is no detectable difference (modulo node revision ID's) between copying from and simply adding a reference to it. So the operation takes place in constant time. However, there's no reason not to extend this to mutable nodes --- it's just more code.) Further, to_root and from_root must represent the same filesystem.
Do any necessary temporary allocation in pool.
svn_error_t* svn_fs_create | ( | svn_fs_t ** | fs_p, |
const char * | path, | ||
apr_hash_t * | fs_config, | ||
apr_pool_t * | pool | ||
) |
Create a new, empty Subversion filesystem, stored in the directory path, and return a pointer to it in *fs_p.
path must not currently exist, but its parent must exist. If fs_config is not NULL
, the options it contains modify the behavior of the filesystem. The interpretation of fs_config is specific to the filesystem back-end. The new filesystem may be closed by destroying pool.
If fs_config contains a value for SVN_FS_CONFIG_FS_TYPE
, that value determines the filesystem type for the new filesystem. Currently defined values are:
SVN_FS_TYPE_BDB Berkeley-DB implementation SVN_FS_TYPE_FSFS Native-filesystem implementation
If fs_config is NULL
or does not contain a value for SVN_FS_CONFIG_FS_TYPE
then the default filesystem type will be used. This will typically be BDB for version 1.1 and FSFS for later versions, though the caller should not rely upon any particular default if they wish to ensure that a filesystem of a specific type is created.
svn_error_t* svn_fs_delete | ( | svn_fs_root_t * | root, |
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Delete the node named path in root.
If the node being deleted is a directory, its contents will be deleted recursively. root must be the root of a transaction, not of a revision. Use pool for temporary allocation.
This function may be more efficient than making the equivalent series of calls to svn_fs_delete(), because it takes advantage of the fact that, to delete an immutable subtree, shared with some committed revision, you need only remove the directory entry. The dumb algorithm would recurse into the subtree and end up cloning each non-empty directory it contains, only to delete it later.
If return SVN_ERR_FS_NO_SUCH_ENTRY
, then the basename of path is missing from its parent, that is, the final target of the deletion is missing.
Attempting to remove the root dir also results in an error, SVN_ERR_FS_ROOT_DIR
, even if the dir is empty.
svn_error_t* svn_fs_delete_fs | ( | const char * | path, |
apr_pool_t * | pool | ||
) |
Delete the filesystem at path.
svn_error_t* svn_fs_deltify_revision | ( | svn_fs_t * | fs, |
svn_revnum_t | revision, | ||
apr_pool_t * | pool | ||
) |
Provide filesystem fs the opportunity to compress storage relating to associated with revision in filesystem fs.
Use pool for all allocations.
svn_error_t* svn_fs_dir_entries | ( | apr_hash_t ** | entries_p, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *entries_p to a newly allocated APR hash table containing the entries of the directory at path in root.
The keys of the table are entry names, as byte strings, excluding the final NULL character; the table's values are pointers to svn_fs_dirent_t
structures. Allocate the table and its contents in pool.
svn_error_t* svn_fs_file_checksum | ( | svn_checksum_t ** | checksum, |
svn_checksum_kind_t | kind, | ||
svn_fs_root_t * | root, | ||
const char * | path, | ||
svn_boolean_t | force, | ||
apr_pool_t * | pool | ||
) |
Set *checksum to the checksum of type kind for the file path.
*checksum will be allocated out of pool, which will also be used for temporary allocations.
If the filesystem does not have a prerecorded checksum of kind for path, and force is not TRUE, do not calculate a checksum dynamically, just put NULL into checksum. (By convention, the NULL checksum is considered to match any checksum.)
Notes:
You might wonder, why do we only provide this interface for file contents, and not for properties or directories?
The answer is that property lists and directory entry lists are essentially data structures, not text. We serialize them for transmission, but there is no guarantee that the consumer will parse them into the same form, or even the same order, as the producer. It's difficult to find a checksumming method that reaches the same result given such variation in input. (I suppose we could calculate an independent MD5 sum for each propname and value, and XOR them together; same with directory entry names. Maybe that's the solution?) Anyway, for now we punt. The most important data, and the only data that goes through svndiff processing, is file contents, so that's what we provide checksumming for.
Internally, of course, the filesystem checksums everything, because it has access to the lowest level storage forms: strings behind representations.
svn_error_t* svn_fs_file_contents | ( | svn_stream_t ** | contents, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *contents to a readable generic stream that will yield the contents of the file path in root.
Allocate the stream in pool. You can only use *contents for as long as the underlying filesystem is open. If path is not a file, return SVN_ERR_FS_NOT_FILE
.
If root is the root of a transaction, it is possible that the contents of the file path will change between calls to svn_fs_file_contents(). In that case, the result of reading from *contents is undefined.
###
svn_error_t* svn_fs_file_length | ( | svn_filesize_t * | length_p, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *length_p to the length of the file path in root, in bytes.
Do any necessary temporary allocation in pool.
svn_error_t* svn_fs_file_md5_checksum | ( | unsigned char | digest[], |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Same as svn_fs_file_checksum(), only always put the MD5 checksum of file path into digest, which should point to APR_MD5_DIGESTSIZE
bytes of storage.
If the checksum doesn't exist, put all 0's into digest.
svn_error_t* svn_fs_get_file_delta_stream | ( | svn_txdelta_stream_t ** | stream_p, |
svn_fs_root_t * | source_root, | ||
const char * | source_path, | ||
svn_fs_root_t * | target_root, | ||
const char * | target_path, | ||
apr_pool_t * | pool | ||
) |
Set *stream_p to a pointer to a delta stream that will turn the contents of the file source into the contents of the file target.
If source_root is zero, use a file with zero length as the source.
This function does not compare the two files' properties.
Allocate *stream_p, and do any necessary temporary allocation, in pool.
svn_error_t* svn_fs_get_mergeinfo | ( | svn_mergeinfo_catalog_t * | catalog, |
svn_fs_root_t * | root, | ||
const apr_array_header_t * | paths, | ||
svn_mergeinfo_inheritance_t | inherit, | ||
svn_boolean_t | include_descendants, | ||
apr_pool_t * | pool | ||
) |
Retrieve mergeinfo for multiple nodes.
*catalog is a catalog for paths. It will never be NULL
, but may be empty.
root is revision root to use when looking up paths.
paths are the paths you are requesting information for.
inherit indicates whether to retrieve explicit, explicit-or-inherited, or only inherited mergeinfo.
If include_descendants is TRUE, then additionally return the mergeinfo for any descendant of any element of paths which has the SVN_PROP_MERGEINFO
property explicitly set on it. (Note that inheritance is only taken into account for the elements in paths; descendants of the elements in paths which get their mergeinfo via inheritance are not included in *mergeoutput.)
Do any necessary temporary allocation in pool.
svn_error_t* svn_fs_get_uuid | ( | svn_fs_t * | fs, |
const char ** | uuid, | ||
apr_pool_t * | pool | ||
) |
Populate *uuid with the UUID associated with fs.
Allocate *uuid in pool.
svn_error_t* svn_fs_history_location | ( | const char ** | path, |
svn_revnum_t * | revision, | ||
svn_fs_history_t * | history, | ||
apr_pool_t * | pool | ||
) |
Set *path and *revision to the path and revision, respectively, of the history object.
Use pool for all allocations.
svn_error_t* svn_fs_history_prev | ( | svn_fs_history_t ** | prev_history_p, |
svn_fs_history_t * | history, | ||
svn_boolean_t | cross_copies, | ||
apr_pool_t * | pool | ||
) |
Set *prev_history_p to an opaque node history object which represents the previous (or "next oldest") interesting history location for the filesystem node represented by history, or NULL
if no such previous history exists.
If cross_copies is FALSE
, also return NULL
if stepping backwards in history to *prev_history_p would cross a filesystem copy operation.
svn_error_t* svn_fs_hotcopy | ( | const char * | src_path, |
const char * | dest_path, | ||
svn_boolean_t | clean, | ||
apr_pool_t * | pool | ||
) |
Copy a possibly live Subversion filesystem from src_path to dest_path.
If clean is TRUE
, perform cleanup on the source filesystem as part of the copy operation; currently, this means deleting copied, unused logfiles for a Berkeley DB source filesystem.
svn_error_t* svn_fs_initialize | ( | apr_pool_t * | pool | ) |
Callers should invoke this function to initialize global state in the FS library before creating FS objects.
If this function is invoked, no FS objects may be created in another thread at the same time as this invocation, and the provided pool must last longer than any FS object created subsequently.
If this function is not called, the FS library will make a best effort to bootstrap a mutex for protecting data common to FS objects; however, there is a small window of failure. Also, a small amount of data will be leaked if the Subversion FS library is dynamically unloaded, and using the bdb FS can potentially segfault or invoke other undefined behavior if this function is not called with an appropriate pool (such as the pool the module was loaded into) when loaded dynamically.
If this function is called multiple times before the pool passed to the first call is destroyed or cleared, the later calls will have no effect.
svn_error_t* svn_fs_is_dir | ( | svn_boolean_t * | is_dir, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *is_dir to TRUE
iff path in root is a directory.
Do any necessary temporary allocation in pool.
svn_error_t* svn_fs_is_file | ( | svn_boolean_t * | is_file, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *is_file to TRUE
iff path in root is a file.
Do any necessary temporary allocation in pool.
svn_error_t* svn_fs_make_dir | ( | svn_fs_root_t * | root, |
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Create a new directory named path in root.
The new directory has no entries, and no properties. root must be the root of a transaction, not a revision.
Do any necessary temporary allocation in pool.
svn_error_t* svn_fs_make_file | ( | svn_fs_root_t * | root, |
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Create a new file named path in root.
The file's initial contents are the empty string, and it has no properties. root must be the root of a transaction, not a revision.
Do any necessary temporary allocation in pool.
svn_error_t* svn_fs_merge | ( | const char ** | conflict_p, |
svn_fs_root_t * | source_root, | ||
const char * | source_path, | ||
svn_fs_root_t * | target_root, | ||
const char * | target_path, | ||
svn_fs_root_t * | ancestor_root, | ||
const char * | ancestor_path, | ||
apr_pool_t * | pool | ||
) |
Merge changes between two nodes into a third node.
Given nodes source and target, and a common ancestor ancestor, modify target to contain all the changes made between ancestor and source, as well as the changes made between ancestor and target. target_root must be the root of a transaction, not a revision.
source, target, and ancestor are generally directories; this function recursively merges the directories' contents. If they are files, this function simply returns an error whenever source, target, and ancestor are all distinct node revisions.
If there are differences between ancestor and source that conflict with changes between ancestor and target, this function returns an SVN_ERR_FS_CONFLICT
error.
If the merge is successful, target is left in the merged state, and the base root of target's txn is set to the root node of source. If an error is returned (whether for conflict or otherwise), target is left unaffected.
If conflict_p is non-NULL, then: a conflict error sets *conflict_p to the name of the node in target which couldn't be merged, otherwise, success sets *conflict_p to NULL.
Do any necessary temporary allocation in pool.
svn_error_t* svn_fs_node_created_path | ( | const char ** | created_path, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *created_path to the path at which path under root was created.
Use pool for all allocations. Callers may use this function in conjunction with svn_fs_node_created_rev() to perform a reverse lookup of the mapping of (path, revision) -> node-id that svn_fs_node_id() performs.
svn_error_t* svn_fs_node_created_rev | ( | svn_revnum_t * | revision, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *revision to the revision in which path under root was created.
Use pool for any temporary allocations. *revision will be set to SVN_INVALID_REVNUM
for uncommitted nodes (i.e. modified nodes under a transaction root). Note that the root of an unmodified transaction is not itself considered to be modified; in that case, return the revision upon which the transaction was based.
svn_error_t* svn_fs_node_history | ( | svn_fs_history_t ** | history_p, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *history_p to an opaque node history object which represents path under root.
root must be a revision root. Use pool for all allocations.
svn_error_t* svn_fs_node_id | ( | const svn_fs_id_t ** | id_p, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Get the id of a node.
Set *id_p to the node revision ID of path in root, allocated in pool.
If root is the root of a transaction, keep in mind that other changes to the transaction can change which node path refers to, and even whether the path exists at all.
svn_error_t* svn_fs_node_origin_rev | ( | svn_revnum_t * | revision, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *revision to the revision in which the line of history represented by path under root originated.
Use pool for any temporary allocations. If root is a transaction root, *revision will be set to SVN_INVALID_REVNUM
for any nodes newly added in that transaction (brand new files or directories created using svn_fs_make_dir
or svn_fs_make_file
).
svn_error_t* svn_fs_node_prop | ( | svn_string_t ** | value_p, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
const char * | propname, | ||
apr_pool_t * | pool | ||
) |
Set *value_p to the value of the property named propname of path in root.
If the node has no property by that name, set *value_p to zero. Allocate the result in pool.
svn_error_t* svn_fs_node_proplist | ( | apr_hash_t ** | table_p, |
svn_fs_root_t * | root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Set *table_p to the entire property list of path in root, as an APR hash table allocated in pool.
The resulting table maps property names to pointers to svn_string_t
objects containing the property value.
svn_error_t* svn_fs_open | ( | svn_fs_t ** | fs_p, |
const char * | path, | ||
apr_hash_t * | fs_config, | ||
apr_pool_t * | pool | ||
) |
Open a Subversion filesystem located in the directory path, and return a pointer to it in *fs_p.
If fs_config is not NULL
, the options it contains modify the behavior of the filesystem. The interpretation of fs_config is specific to the filesystem back-end. The opened filesystem may be closed by destroying pool.
Only one thread may operate on any given filesystem object at once. Two threads may access the same filesystem simultaneously only if they open separate filesystem objects.
svn_error_t* svn_fs_pack | ( | const char * | db_path, |
svn_fs_pack_notify_t | notify_func, | ||
void * | notify_baton, | ||
svn_cancel_func_t | cancel_func, | ||
void * | cancel_baton, | ||
apr_pool_t * | pool | ||
) |
Possibly update the filesystem located in the directory path to use disk space more efficiently.
const char* svn_fs_path | ( | svn_fs_t * | fs, |
apr_pool_t * | pool | ||
) |
Return the path to fs's repository, allocated in pool.
svn_error_t* svn_fs_print_modules | ( | svn_stringbuf_t * | output, |
apr_pool_t * | pool | ||
) |
Append a textual list of all available FS modules to the stringbuf output.
svn_error_t* svn_fs_props_changed | ( | svn_boolean_t * | changed_p, |
svn_fs_root_t * | root1, | ||
const char * | path1, | ||
svn_fs_root_t * | root2, | ||
const char * | path2, | ||
apr_pool_t * | pool | ||
) |
Determine if the properties of two path/root combinations are different.
Set *changed_p to 1 if the properties at path1 under root1 differ from those at path2 under root2, or set it to 0 if they are the same. Both paths must exist under their respective roots, and both roots must be in the same filesystem.
svn_error_t* svn_fs_recover | ( | const char * | path, |
svn_cancel_func_t | cancel_func, | ||
void * | cancel_baton, | ||
apr_pool_t * | pool | ||
) |
Perform any necessary non-catastrophic recovery on the Subversion filesystem located at path.
If cancel_func is not NULL
, it is called periodically with cancel_baton as argument to see if the client wishes to cancel recovery. BDB filesystems do not currently support cancellation.
Do any necessary allocation within pool.
For FSFS filesystems, recovery is currently limited to recreating the db/current file, and does not require exclusive access.
For BDB filesystems, recovery requires exclusive access, and is described in detail below.
After an unexpected server exit, due to a server crash or a system crash, a Subversion filesystem based on Berkeley DB needs to run recovery procedures to bring the database back into a consistent state and release any locks that were held by the deceased process. The recovery procedures require exclusive access to the database --- while they execute, no other process or thread may access the database.
In a server with multiple worker processes, like Apache, if a worker process accessing the filesystem dies, you must stop the other worker processes, and run recovery. Then, the other worker processes can re-open the database and resume work.
If the server exited cleanly, there is no need to run recovery, but there is no harm in it, either, and it take very little time. So it's a fine idea to run recovery when the server process starts, before it begins handling any requests.
svn_error_t* svn_fs_revision_link | ( | svn_fs_root_t * | from_root, |
svn_fs_root_t * | to_root, | ||
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Like svn_fs_copy(), but doesn't record copy history, and preserves the PATH.
You cannot use svn_fs_copied_from() later to find out where this copy came from.
Use svn_fs_revision_link() in situations where you don't care about the copy history, and where to_path and from_path are the same, because it is cheaper than svn_fs_copy().
svn_error_t* svn_fs_revision_prop | ( | svn_string_t ** | value_p, |
svn_fs_t * | fs, | ||
svn_revnum_t | rev, | ||
const char * | propname, | ||
apr_pool_t * | pool | ||
) |
Set *value_p to the value of the property named propname on revision rev in the filesystem fs.
If rev has no property by that name, set *value_p to zero. Allocate the result in pool.
svn_error_t* svn_fs_revision_proplist | ( | apr_hash_t ** | table_p, |
svn_fs_t * | fs, | ||
svn_revnum_t | rev, | ||
apr_pool_t * | pool | ||
) |
Set *table_p to the entire property list of revision rev in filesystem fs, as an APR hash table allocated in pool.
The table maps char *
property names to svn_string_t
* values; the names and values are allocated in pool.
svn_error_t* svn_fs_set_uuid | ( | svn_fs_t * | fs, |
const char * | uuid, | ||
apr_pool_t * | pool | ||
) |
If not NULL
, associate *uuid with fs.
Otherwise (if uuid is NULL
), generate a new UUID for fs. Use pool for any scratchwork.
void svn_fs_set_warning_func | ( | svn_fs_t * | fs, |
svn_fs_warning_callback_t | warning, | ||
void * | warning_baton | ||
) |
Provide a callback function, warning, that fs should use to report (non-fatal) errors.
To print an error, the filesystem will call warning, passing it warning_baton and the error.
By default, this is set to a function that will crash the process. Dumping to stderr
or /dev/tty
is not acceptable default behavior for server processes, since those may both be equivalent to /dev/null
.
svn_error_t* svn_fs_type | ( | const char ** | fs_type, |
const char * | path, | ||
apr_pool_t * | pool | ||
) |
Return, in *fs_type, a string identifying the back-end type of the Subversion filesystem located in path.
Allocate *fs_type in pool.
The string should be equal to one of the SVN_FS_TYPE_*
defined constants, unless the filesystem is a new back-end type added in a later version of Subversion.
In general, the type should make no difference in the filesystem's semantics, but there are a few situations (such as backups) where it might matter.
svn_error_t* svn_fs_upgrade | ( | const char * | path, |
apr_pool_t * | pool | ||
) |
Upgrade the Subversion filesystem located in the directory path to the latest version supported by this library.
Return SVN_ERR_FS_UNSUPPORTED_UPGRADE
and make no changes to the filesystem if the requested upgrade is not supported. Use pool for necessary allocations.
svn_error_t* svn_fs_youngest_rev | ( | svn_revnum_t * | youngest_p, |
svn_fs_t * | fs, | ||
apr_pool_t * | pool | ||
) |
Set *youngest_p to the number of the youngest revision in filesystem fs.
Use pool for all temporary allocation.
The oldest revision in any filesystem is numbered zero.