Today, I setup a Subversion development environment for the first time in
... more years than I can recall.  I can confirm that the test suite passes
with this patch, and that the patch itself makes sense to me.  I also used
it for my own svnsync activity (I do nightly backups of personal
repositories), and it seems to work as advertised.

Not gonna lie, I feel too "out of the game" to commit this patch outright.
But, I *am* comfortable giving a +1 on it, for whatever that nuance might
mean.

-- Mike

On Sat, Jan 31, 2026 at 2:48 PM Timofei Zhakov <[email protected]> wrote:

> On Thu, Jan 29, 2026 at 10:47 PM Jordan Peck via dev <
> [email protected]> wrote:
>
>> Hi all,
>>
>> I'd like to propose a patch that optimises svnsync when synchronizing to
>> local filesystem repositories (file:// URLs). Currently, svnsync performs
>> a two-step process for each revision:
>>
>>   1. Commit the revision content (author/date are set to the current
>>      user and current time)
>>   2. Update svn:author and svn:date revision properties to match the
>>      source repository
>>
>> This works but is inefficient for file:// URLs where we have direct
>> repository access and can set these properties correctly during the
>> initial commit.
>>
>>
>> THE PROBLEM
>> -----------
>>
>> When svnsync replays a revision from a source repository, the commit
>> is created with the local user as the author and the current time as
>> the date. After the commit completes, svnsync then makes separate
>> svn_ra_change_rev_prop2() calls to update svn:author and svn:date to
>> match the source repository.
>>
>> For remote servers (svn://, http://), this two-step process is necessary
>> because the server enforces its own author/date policies. However, for
>> file:// URLs via ra_local, we have direct access to the repository and
>> can bypass this limitation.
>>
>> We have an SVN server acting as the slave via the Apache module proxy,
>> the slave server is kept in sync with the master using svnsync. This
>> two-step approach has caused issues with various tools that monitor the
>> slave SVN server for new revisions, they will occasionally get the data
>> for a synced revision that hasn't yet had the revision properties
>> copied. Having the sync be a single atomic operation means this can
>> never happen.
>>
>>
>> THE SOLUTION
>> ------------
>>
>> This patch introduces a new RA capability "commit-allow-rev-props" that
>> ra_local advertises. When svnsync detects this capability on the
>> destination repository, it:
>>
>>   1. Includes svn:author and svn:date in the initial commit's revprop
>>      table (instead of filtering them out)
>>
>>   2. ra_local now conditionally preserves these properties:
>>      - svn:author is only set to the session user if not already provided
>>      - If svn:date is provided, the SVN_FS_TXN_CLIENT_DATE flag is passed
>>        to svn_fs_begin_txn2() so the filesystem uses that date
>>
>>   3. Skips the post-commit revprop update step since author/date are
>>      already correct
>>
>>
>> CHANGES OVERVIEW
>> ----------------
>>
>> subversion/include/svn_ra.h:
>>   - Added SVN_RA_CAPABILITY_COMMIT_ALLOW_REV_PROPS capability definition
>>
>> subversion/include/svn_repos.h:
>>   - Added svn_repos_fs_begin_txn_for_commit3() with flags parameter
>>   - Added svn_repos_get_commit_editor6() with txn_flags parameter
>>
>> subversion/libsvn_repos/fs-wrap.c:
>>   - Implemented svn_repos_fs_begin_txn_for_commit3() which passes flags
>>     (including SVN_FS_TXN_CLIENT_DATE) to svn_fs_begin_txn2()
>>
>> subversion/libsvn_repos/commit.c:
>>   - Added txn_flags to edit_baton structure
>>   - Implemented svn_repos_get_commit_editor6() to support txn_flags
>>   - Updated open_root() to use the new begin_txn function
>>
>> subversion/libsvn_ra_local/ra_plugin.c:
>>   - Advertises SVN_RA_CAPABILITY_COMMIT_ALLOW_REV_PROPS
>>   - Modified get_commit_editor to preserve caller-provided author/date
>>   - Sets SVN_FS_TXN_CLIENT_DATE when date is provided in revprops
>>
>> subversion/svnsync/svnsync.c:
>>   - Detects the new capability on the destination
>>   - When capability is present, includes author/date in commit revprops
>>   - Skips post-commit revprop sync when capability is present
>>   - Updated user-facing messages to reflect the optimization
>>
>>
>> USER-VISIBLE CHANGES
>> --------------------
>>
>> When synchronizing to a file:// URL, svnsync now displays:
>>
>>   Destination supports commit-time author and date; no post-commit
>>   revprop sync needed.
>>   Committed revision 1.
>>   Committed revision 2.
>>   ...
>>
>> Instead of the previous:
>>
>>   Committed revision 1.
>>   Copied properties for revision 1.
>>   Committed revision 2.
>>   Copied properties for revision 2.
>>   ...
>>
>>
>> BENEFITS
>> --------
>>
>> 1. Atomicity: Author and date are set in the same transaction as the
>>    commit, rather than being updated afterward.
>>
>> 2. No behavioral change for remote servers: The optimization only
>>    applies when the destination advertises the capability, so svn://
>>    and http:// synchronization continues to work as before.
>>
>> 3. Reduced I/O: Eliminates separate revprop change operations for each
>>    revision synced to a file:// destination.
>>
>> COMPATIBILITY
>> -------------
>>
>> - The new capability is only advertised by ra_local, so this is a
>>   client-side optimization with no server protocol changes.
>>
>> - Existing svnsync mirrors continue to work unchanged.
>>
>> - The new API functions (svn_repos_fs_begin_txn_for_commit3 and
>>   svn_repos_get_commit_editor6) maintain backward compatibility
>>   through wrapper functions.
>>
>>
>> TESTING
>> -------
>>
>> I have tested this with svnsync to file:// URLs and verified that:
>> - Revision properties (author, date, log) match the source repository
>> - The new optimization message appears at sync start
>> - No "Copied properties" messages appear
>> - Subsequent incremental syncs work correctly
>>
>>
>> Please review and let me know if you have any questions or suggestions.
>>
>> Thanks,
>> Jordan Peck
>>
>
> Hi,
>
> +1
>
> I didn't look into the patch in detail, but the idea sounds good to me.
>
> --
> Timofei Zhakov
>

Reply via email to