You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by iv...@apache.org on 2013/07/19 20:07:18 UTC
svn commit: r1504951 - in /subversion/trunk/subversion: include/ libsvn_fs/
libsvn_fs_base/ libsvn_fs_fs/ libsvn_repos/
Author: ivan
Date: Fri Jul 19 18:07:17 2013
New Revision: 1504951
URL: http://svn.apache.org/r1504951
Log:
Make svnadmin load really atomic by adding option to
svn_fs_commit_txn2 to disable updating 'svn:date' revision property after
committing transaction.
* subversion/include/svn_fs.h
(svn_fs_commit_txn2): New. Revv svn_fs_commit_txn() and add new
SET_TIMESTAMP argument to disable setting 'svn:date' in FS layer.
* subversion/libsvn_fs/fs-loader.h
* subversion/libsvn_fs/fs-loader.c
(svn_fs_commit_txn2): Revv svn_fs_commit_txn() and pass set_timestamp
argument to commit vtable method.
(svn_fs_commit_txn): Call svn_fs_commit_txn2() with SET_TIMESTAMP=TRUE.
* subversion/libsvn_fs_base/dag.h
* subversion/libsvn_fs_base/dag.c
(svn_fs_base__dag_commit_txn): Add SET_TIMESTAMP argument and update
'svn:date' revision property only if SET_TIMESTAMP is non-zero.
* subversion/libsvn_fs_base/tree.c
* subversion/libsvn_fs_base/tree.h
(commit_args): Add SET_TIMESTAMP member.
(txn_body_commit): Pass SET_TIMESTAMP to svn_fs_base__dag_commit_txn().
(svn_fs_base__commit_txn): Add SET_TIMESTAMP argument and store it in
commit baton.
* subversion/libsvn_fs_fs/fs_fs.h
* subversion/libsvn_fs_fs/fs_fs.c
(commit_baton): Add SET_TIMESTAMP member.
(commit_body): Update 'svn:date' revision property only if SET_TIMESTAMP
is non-zero.
(svn_fs_fs__commit): Add SET_TIMESTAMP argument and store it in commit
baton.
* subversion/libsvn_fs_fs/tree.c
* subversion/libsvn_fs_fs/tree.h
(svn_fs_fs__commit_txn): Add SET_TIMESTAMP argument and pass it to
svn_fs_fs__commit().
* subversion/libsvn_repos/load-fs-vtable.c
(close_revision): Use svn_fs_commit_txn2() and do not fix-up 'svn:date'
property after commit.
Modified:
subversion/trunk/subversion/include/svn_fs.h
subversion/trunk/subversion/libsvn_fs/fs-loader.c
subversion/trunk/subversion/libsvn_fs/fs-loader.h
subversion/trunk/subversion/libsvn_fs_base/dag.c
subversion/trunk/subversion/libsvn_fs_base/dag.h
subversion/trunk/subversion/libsvn_fs_base/tree.c
subversion/trunk/subversion/libsvn_fs_base/tree.h
subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h
subversion/trunk/subversion/libsvn_fs_fs/tree.c
subversion/trunk/subversion/libsvn_fs_fs/tree.h
subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c
Modified: subversion/trunk/subversion/include/svn_fs.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_fs.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_fs.h (original)
+++ subversion/trunk/subversion/include/svn_fs.h Fri Jul 19 18:07:17 2013
@@ -45,7 +45,8 @@
extern "C" {
#endif /* __cplusplus */
-
+
+
/**
* Get libsvn_fs version information.
*
@@ -175,7 +176,8 @@ typedef struct svn_fs_t svn_fs_t;
*/
svn_error_t *
svn_fs_initialize(apr_pool_t *pool);
-
+
+
/** The type of a warning callback function. @a baton is the value specified
* in the call to svn_fs_set_warning_func(); the filesystem passes it through
@@ -201,7 +203,8 @@ svn_fs_set_warning_func(svn_fs_t *fs,
svn_fs_warning_callback_t warning,
void *warning_baton);
-
+
+
/**
* Create a new, empty Subversion filesystem, stored in the directory
@@ -635,7 +638,8 @@ svn_fs_berkeley_recover(const char *path
/** @} */
-
+
+
/** Filesystem Access Contexts.
*
* @since New in 1.2.
@@ -722,7 +726,8 @@ svn_fs_access_add_lock_token(svn_fs_acce
/** @} */
-
+
+
/** Filesystem Nodes and Node-Revisions.
*
* In a Subversion filesystem, a `node' corresponds roughly to an
@@ -813,7 +818,8 @@ svn_fs_unparse_id(const svn_fs_id_t *id,
/** @} */
-
+
+
/** Filesystem Transactions.
*
* To make a change to a Subversion filesystem:
@@ -989,6 +995,9 @@ svn_fs_begin_txn(svn_fs_txn_t **txn_p,
* the conflict in @a txn, allocated within @a pool;
* otherwise, set @a *conflict_p to NULL.
*
+ * If @ set_timestamp is non-zero 'svn:date' revision property will be updated
+ * to current time to ensure that svn:date revprops remain ordered.
+ *
* If the commit succeeds, @a txn is invalid.
*
* If the commit fails for any reason, @a *new_rev is an invalid
@@ -1020,6 +1029,19 @@ svn_fs_begin_txn(svn_fs_txn_t **txn_p,
* ### conflict string
* ### *new_rev will always be initialized to SVN_INVALID_REVNUM, or
* ### to a valid, committed revision number
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_commit_txn2(const char **conflict_p,
+ svn_revnum_t *new_rev,
+ svn_fs_txn_t *txn,
+ svn_boolean_t set_timestamp,
+ apr_pool_t *pool);
+
+/*
+ * Same as svn_fs_commit_txn2(), but with @a set_timestamp
+ * always set to @c TRUE.
*/
svn_error_t *
svn_fs_commit_txn(const char **conflict_p,
@@ -1146,7 +1168,8 @@ svn_fs_change_txn_props(svn_fs_txn_t *tx
/** @} */
-
+
+
/** Roots.
*
* An #svn_fs_root_t object represents the root directory of some
@@ -1230,7 +1253,8 @@ svn_fs_revision_root_revision(svn_fs_roo
/** @} */
-
+
+
/** Directory entry names and directory paths.
*
* Here are the rules for directory entry names, and directory paths:
@@ -1258,7 +1282,8 @@ svn_fs_revision_root_revision(svn_fs_roo
*/
-
+
+
/** The kind of change that occurred on the path. */
typedef enum svn_fs_path_change_kind_t
{
@@ -1387,7 +1412,8 @@ svn_fs_paths_changed(apr_hash_t **change
/** @} */
-
+
+
/* Operations appropriate to all kinds of nodes. */
/** Set @a *kind_p to the type of node present at @a path under @a
@@ -1764,7 +1790,8 @@ svn_fs_merge(const char **conflict_p,
apr_pool_t *pool);
-
+
+
/* Directories. */
@@ -1869,7 +1896,8 @@ svn_fs_revision_link(svn_fs_root_t *from
svn_fs_root_t *to_root,
const char *path,
apr_pool_t *pool);
-
+
+
/* Files. */
/** Set @a *length_p to the length of the file @a path in @a root, in bytes.
@@ -2103,7 +2131,8 @@ svn_fs_contents_changed(svn_boolean_t *c
apr_pool_t *pool);
-
+
+
/* Filesystem revisions. */
@@ -2236,7 +2265,8 @@ svn_fs_change_rev_prop(svn_fs_t *fs,
apr_pool_t *pool);
-
+
+
/* Computing deltas. */
@@ -2258,7 +2288,8 @@ svn_fs_get_file_delta_stream(svn_txdelta
apr_pool_t *pool);
-
+
+
/* UUID manipulation. */
/** Populate @a *uuid with the UUID associated with @a fs. Allocate
@@ -2278,13 +2309,15 @@ svn_fs_set_uuid(svn_fs_t *fs,
const char *uuid,
apr_pool_t *pool);
-
+
+
/* Non-historical properties. */
/* [[Yes, do tell.]] */
-
+
+
/** @defgroup svn_fs_locks Filesystem locks
* @{
* @since New in 1.2. */
Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.c Fri Jul 19 18:07:17 2013
@@ -787,8 +787,9 @@ svn_fs_begin_txn(svn_fs_txn_t **txn_p, s
svn_error_t *
-svn_fs_commit_txn(const char **conflict_p, svn_revnum_t *new_rev,
- svn_fs_txn_t *txn, apr_pool_t *pool)
+svn_fs_commit_txn2(const char **conflict_p, svn_revnum_t *new_rev,
+ svn_fs_txn_t *txn, svn_boolean_t set_timestamp,
+ apr_pool_t *pool)
{
svn_error_t *err;
@@ -796,7 +797,7 @@ svn_fs_commit_txn(const char **conflict_
if (conflict_p)
*conflict_p = NULL;
- err = txn->vtable->commit(conflict_p, new_rev, txn, pool);
+ err = txn->vtable->commit(conflict_p, new_rev, txn, set_timestamp, pool);
#ifdef SVN_DEBUG
/* Check postconditions. */
@@ -829,6 +830,12 @@ svn_fs_commit_txn(const char **conflict_
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_fs_commit_txn(const char **conflict_p, svn_revnum_t *new_rev,
+ svn_fs_txn_t *txn, apr_pool_t *pool)
+{
+ return svn_fs_commit_txn2(conflict_p, new_rev, txn, TRUE, pool);
+}
svn_error_t *
svn_fs_abort_txn(svn_fs_txn_t *txn, apr_pool_t *pool)
Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.h (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.h Fri Jul 19 18:07:17 2013
@@ -248,7 +248,8 @@ typedef struct fs_vtable_t
typedef struct txn_vtable_t
{
svn_error_t *(*commit)(const char **conflict_p, svn_revnum_t *new_rev,
- svn_fs_txn_t *txn, apr_pool_t *pool);
+ svn_fs_txn_t *txn, svn_boolean_t set_timestamp,
+ apr_pool_t *pool);
svn_error_t *(*abort)(svn_fs_txn_t *txn, apr_pool_t *pool);
svn_error_t *(*get_prop)(svn_string_t **value_p, svn_fs_txn_t *txn,
const char *propname, apr_pool_t *pool);
Modified: subversion/trunk/subversion/libsvn_fs_base/dag.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/dag.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/dag.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/dag.c Fri Jul 19 18:07:17 2013
@@ -59,7 +59,8 @@
#include "svn_private_config.h"
-
+
+
/* Initializing a filesystem. */
struct dag_node_t
@@ -90,7 +91,8 @@ struct dag_node_t
};
-
+
+
/* Trivial helper/accessor functions. */
svn_node_kind_t svn_fs_base__dag_node_kind(dag_node_t *node)
{
@@ -265,7 +267,8 @@ svn_fs_base__dag_init_fs(svn_fs_t *fs)
}
-
+
+
/*** Directory node functions ***/
/* Some of these are helpers for functions outside this section. */
@@ -538,7 +541,8 @@ svn_fs_base__dag_set_entry(dag_node_t *n
}
-
+
+
/*** Proplists. ***/
svn_error_t *
@@ -669,7 +673,8 @@ svn_fs_base__dag_set_proplist(dag_node_t
}
-
+
+
/*** Roots. ***/
svn_error_t *
@@ -1450,7 +1455,8 @@ svn_fs_base__dag_copy(dag_node_t *to_nod
}
-
+
+
/*** Deltification ***/
/* Maybe change the representation identified by TARGET_REP_KEY to be
@@ -1569,17 +1575,18 @@ svn_fs_base__dag_index_checksums(dag_nod
}
-
+
+
/*** Committing ***/
svn_error_t *
svn_fs_base__dag_commit_txn(svn_revnum_t *new_rev,
svn_fs_txn_t *txn,
trail_t *trail,
+ svn_boolean_t set_timestamp,
apr_pool_t *pool)
{
revision_t revision;
- svn_string_t date;
apr_hash_t *txnprops;
svn_fs_t *fs = txn->fs;
const char *txn_id = txn->id;
@@ -1605,15 +1612,22 @@ svn_fs_base__dag_commit_txn(svn_revnum_t
SVN_ERR(svn_fs_base__txn_make_committed(fs, txn_id, *new_rev,
trail, pool));
- /* Set a date on the commit. We wait until now to fetch the date,
- so it's definitely newer than any previous revision's date. */
- date.data = svn_time_to_cstring(apr_time_now(), pool);
- date.len = strlen(date.data);
- return svn_fs_base__set_rev_prop(fs, *new_rev, SVN_PROP_REVISION_DATE,
- NULL, &date, trail, pool);
+ if (set_timestamp)
+ {
+ /* Set a date on the commit if requested. We wait until now to fetch the
+ date, so it's definitely newer than any previous revision's date. */
+ svn_string_t date;
+ date.data = svn_time_to_cstring(apr_time_now(), pool);
+ date.len = strlen(date.data);
+ SVN_ERR(svn_fs_base__set_rev_prop(fs, *new_rev, SVN_PROP_REVISION_DATE,
+ NULL, &date, trail, pool));
+ }
+
+ return SVN_NO_ERROR;
}
-
+
+
/*** Comparison. ***/
svn_error_t *
@@ -1657,7 +1671,8 @@ svn_fs_base__things_different(svn_boolea
}
-
+
+
/*** Mergeinfo tracking stuff ***/
svn_error_t *
Modified: subversion/trunk/subversion/libsvn_fs_base/dag.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/dag.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/dag.h (original)
+++ subversion/trunk/subversion/libsvn_fs_base/dag.h Fri Jul 19 18:07:17 2013
@@ -273,12 +273,16 @@ svn_error_t *svn_fs_base__dag_clone_root
latest revision in TXN->FS. If the caller doesn't take care of this,
you may lose people's work!
+ Update commit time to ensure that svn:date revprops remain ordered if
+ SET_TIMESTAMP is non-zero.
+
Do any necessary temporary allocation in a subpool of POOL.
Consume temporary space at most proportional to the maximum depth
of SVN_TXN's tree of mutable nodes. */
svn_error_t *svn_fs_base__dag_commit_txn(svn_revnum_t *new_rev,
svn_fs_txn_t *txn,
trail_t *trail,
+ svn_boolean_t set_timestamp,
apr_pool_t *pool);
Modified: subversion/trunk/subversion/libsvn_fs_base/tree.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/tree.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/tree.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/tree.c Fri Jul 19 18:07:17 2013
@@ -2560,6 +2560,7 @@ struct commit_args
{
svn_fs_txn_t *txn;
svn_revnum_t new_rev;
+ svn_boolean_t set_timestamp;
};
@@ -2619,7 +2620,7 @@ txn_body_commit(void *baton, trail_t *tr
/* Else, commit the txn. */
return svn_fs_base__dag_commit_txn(&(args->new_rev), txn, trail,
- trail->pool);
+ args->set_timestamp, trail->pool);
}
@@ -2629,6 +2630,7 @@ svn_error_t *
svn_fs_base__commit_txn(const char **conflict_p,
svn_revnum_t *new_rev,
svn_fs_txn_t *txn,
+ svn_boolean_t set_timestamp,
apr_pool_t *pool)
{
/* How do commits work in Subversion?
@@ -2732,6 +2734,7 @@ svn_fs_base__commit_txn(const char **con
/* Try to commit. */
commit_args.txn = txn;
+ commit_args.set_timestamp = set_timestamp;
err = svn_fs_base__retry_txn(fs, txn_body_commit, &commit_args,
FALSE, subpool);
if (err && (err->apr_err == SVN_ERR_FS_TXN_OUT_OF_DATE))
Modified: subversion/trunk/subversion/libsvn_fs_base/tree.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/tree.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/tree.h (original)
+++ subversion/trunk/subversion/libsvn_fs_base/tree.h Fri Jul 19 18:07:17 2013
@@ -42,6 +42,7 @@ svn_error_t *svn_fs_base__deltify(svn_fs
svn_error_t *svn_fs_base__commit_txn(const char **conflict_p,
svn_revnum_t *new_rev, svn_fs_txn_t *txn,
+ svn_boolean_t set_timestamp,
apr_pool_t *pool);
svn_error_t *svn_fs_base__txn_root(svn_fs_root_t **root_p, svn_fs_txn_t *txn,
Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Fri Jul 19 18:07:17 2013
@@ -8492,6 +8492,7 @@ struct commit_baton {
svn_revnum_t *new_rev_p;
svn_fs_t *fs;
svn_fs_txn_t *txn;
+ svn_boolean_t set_timestamp;
apr_array_header_t *reps_to_cache;
apr_hash_t *reps_hash;
apr_pool_t *reps_pool;
@@ -8517,7 +8518,6 @@ commit_body(void *baton, apr_pool_t *poo
apr_hash_t *txnprops;
apr_array_header_t *txnprop_list;
svn_prop_t prop;
- svn_string_t date;
/* Get the current youngest revision. */
SVN_ERR(svn_fs_fs__youngest_rev(&old_rev, cb->fs, pool));
@@ -8638,12 +8638,18 @@ commit_body(void *baton, apr_pool_t *poo
remove the transaction directory later. */
SVN_ERR(unlock_proto_rev(cb->fs, cb->txn->id, proto_file_lockcookie, pool));
- /* Update commit time to ensure that svn:date revprops remain ordered. */
- date.data = svn_time_to_cstring(apr_time_now(), pool);
- date.len = strlen(date.data);
+ /* Update commit time to ensure that svn:date revprops remain ordered if
+ requested. */
+ if (cb->set_timestamp)
+ {
+ svn_string_t date;
+
+ date.data = svn_time_to_cstring(apr_time_now(), pool);
+ date.len = strlen(date.data);
- SVN_ERR(svn_fs_fs__change_txn_prop(cb->txn, SVN_PROP_REVISION_DATE,
- &date, pool));
+ SVN_ERR(svn_fs_fs__change_txn_prop(cb->txn, SVN_PROP_REVISION_DATE,
+ &date, pool));
+ }
/* Move the revprops file into place. */
SVN_ERR_ASSERT(! is_packed_revprop(cb->fs, new_rev));
@@ -8697,6 +8703,7 @@ svn_error_t *
svn_fs_fs__commit(svn_revnum_t *new_rev_p,
svn_fs_t *fs,
svn_fs_txn_t *txn,
+ svn_boolean_t set_timestamp,
apr_pool_t *pool)
{
struct commit_baton cb;
@@ -8705,6 +8712,7 @@ svn_fs_fs__commit(svn_revnum_t *new_rev_
cb.new_rev_p = new_rev_p;
cb.fs = fs;
cb.txn = txn;
+ cb.set_timestamp = set_timestamp;
if (ffd->rep_sharing_allowed)
{
Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h Fri Jul 19 18:07:17 2013
@@ -360,11 +360,13 @@ svn_error_t *svn_fs_fs__set_proplist(svn
/* Commit the transaction TXN in filesystem FS and return its new
revision number in *REV. If the transaction is out of date, return
- the error SVN_ERR_FS_TXN_OUT_OF_DATE. Use POOL for temporary
- allocations. */
+ the error SVN_ERR_FS_TXN_OUT_OF_DATE. Update commit time to ensure that
+ svn:date revprops remain ordered if SET_TIMESTAMP is non-zero. Use POOL for
+ temporary allocations. */
svn_error_t *svn_fs_fs__commit(svn_revnum_t *new_rev_p,
svn_fs_t *fs,
svn_fs_txn_t *txn,
+ svn_boolean_t set_timestamp,
apr_pool_t *pool);
/* Return the next available copy_id in *COPY_ID for the transaction
Modified: subversion/trunk/subversion/libsvn_fs_fs/tree.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/tree.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/tree.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/tree.c Fri Jul 19 18:07:17 2013
@@ -2001,6 +2001,7 @@ svn_error_t *
svn_fs_fs__commit_txn(const char **conflict_p,
svn_revnum_t *new_rev,
svn_fs_txn_t *txn,
+ svn_boolean_t set_timestamp,
apr_pool_t *pool)
{
/* How do commits work in Subversion?
@@ -2097,7 +2098,7 @@ svn_fs_fs__commit_txn(const char **confl
txn->base_rev = youngish_rev;
/* Try to commit. */
- err = svn_fs_fs__commit(new_rev, fs, txn, iterpool);
+ err = svn_fs_fs__commit(new_rev, fs, txn, set_timestamp, iterpool);
if (err && (err->apr_err == SVN_ERR_FS_TXN_OUT_OF_DATE))
{
/* Did someone else finish committing a new revision while we
Modified: subversion/trunk/subversion/libsvn_fs_fs/tree.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/tree.h?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/tree.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/tree.h Fri Jul 19 18:07:17 2013
@@ -48,10 +48,12 @@ svn_error_t *svn_fs_fs__deltify(svn_fs_t
/* Commit the transaction TXN as a new revision. Return the new
revision in *NEW_REV. If the transaction conflicts with other
changes return SVN_ERR_FS_CONFLICT and set *CONFLICT_P to a string
- that details the cause of the conflict. Perform temporary
- allocations in POOL. */
+ that details the cause of the conflict.
+ Update commit time to ensure that svn:date revprops remain ordered if
+ SET_TIMESTAMP is non-zero. Perform temporary allocations in POOL. */
svn_error_t *svn_fs_fs__commit_txn(const char **conflict_p,
svn_revnum_t *new_rev, svn_fs_txn_t *txn,
+ svn_boolean_t set_timestamp,
apr_pool_t *pool);
/* Set ROOT_P to the root directory of transaction TXN. Allocate the
Modified: subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c?rev=1504951&r1=1504950&r2=1504951&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c (original)
+++ subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c Fri Jul 19 18:07:17 2013
@@ -926,6 +926,15 @@ close_revision(void *baton)
if (rb->skipped || (rb->rev <= 0))
return SVN_NO_ERROR;
+ if (!rb->datestamp)
+ {
+ /* Remove 'svn:date' revision property that was set by FS layer when TXN
+ created if source dump doesn't have 'svn:date' property. */
+ svn_prop_t *prop = &APR_ARRAY_PUSH(rb->revprops, svn_prop_t);
+ prop->name = SVN_PROP_REVISION_DATE;
+ prop->value = NULL;
+ }
+
/* Apply revision property changes. */
if (rb->pb->validate_props)
SVN_ERR(svn_repos_fs_change_txn_props(rb->txn, rb->revprops, rb->pool));
@@ -959,7 +968,8 @@ close_revision(void *baton)
}
/* Commit. */
- err = svn_fs_commit_txn(&conflict_msg, &committed_rev, rb->txn, rb->pool);
+ err = svn_fs_commit_txn2(&conflict_msg, &committed_rev, rb->txn, FALSE,
+ rb->pool);
if (SVN_IS_VALID_REVNUM(committed_rev))
{
if (err)
@@ -1017,15 +1027,6 @@ close_revision(void *baton)
/* Deltify the predecessors of paths changed in this revision. */
SVN_ERR(svn_fs_deltify_revision(pb->fs, committed_rev, rb->pool));
- /* Grrr, svn_fs_commit_txn rewrites the datestamp property to the
- current clock-time. We don't want that, we want to preserve
- history exactly. Good thing revision props aren't versioned!
- Note that if rb->datestamp is NULL, that's fine -- if the dump
- data doesn't carry a datestamp, we want to preserve that fact in
- the load. */
- SVN_ERR(change_rev_prop(pb->repos, committed_rev, SVN_PROP_REVISION_DATE,
- rb->datestamp, pb->validate_props, rb->pool));
-
if (pb->notify_func)
{
pb->notify->action = svn_repos_notify_load_txn_committed;