Checkout Tools
  • last updated 2 hours ago
Constraints
Constraints: committers
 
Constraints: files
Constraints: dates
Make 'svn update' not record a tree conflict when deleting an unmodified

directory which happens to contain unversioned items. Instead, just leave

the unversioned items behind on disk when deleting the unmodified directory,

which matches the behaviour of Subversion 1.8.

Prompted by a question on users@:

https://svn.haxx.se/users/archive-2019-01/0060.shtml

* subversion/libsvn_wc/update_editor.c

(check_tree_conflict): Ignore unversioned items during check for local mods.

This prevents a tree conflict from being recorded.

* subversion/tests/cmdline/switch_tests.py

(tolerate_local_mods): Don't expect an unversioned item to cause a tree

conflict. Add the item to version control instead to meet this test's

expectations.

* subversion/tests/cmdline/update_tests.py

(update_keeps_unversioned_items_in_deleted_dir, test_list): New test

which ensures that update will leave unversioned items on disk when

deleting an unmodified directory.

  1. … 2 more files in changeset.
Record the move target path in a moved-away tree conflict skel.

Updates can modify the NODES table in ways which discard local move

information about tree conflict victims. One example is:

echo foo >> epsilon/foo.txt

svn mv epsilon alpha

svn ci # create r2

svn up -r1

svn mv epsilon beta

svn up -r2

When 'epsilon' is updated to r2, a tree conflict is raised and the move

'epsilon' -> 'beta' is deleted from the NODES table. 'beta' remains a copy.

$ svn status

A + beta

! C epsilon

> local dir moved away, incoming dir delete or move upon update

$

The conflict skel for the tree conflict on 'epsilon' now contains:

(tree () moved-away deleted epsilon)

This leaves the resolver with insufficient information about the local

move 'epsilon' -> 'beta' which existed before the update. To resolve this

conflict we must be able to identify the copy 'beta' as one potential move

target. The fact that copyfrom on 'beta' points to 'epsilon' is insufficient

because, in the general case, this copy could have occurred independently

of the tree conflict.

As of this commit, the tree conflict skel also records a move destination

path, 'beta' in our example:

(tree () moved-away deleted epsilon beta)

Apart from recording the path in the skel, this commit introduces no other

visible change in behaviour. In the future, the conflict resolver will be

able to make use of this new information to correlate the copy 'beta' with

the conflict victim 'epsilon' in the above example.

Note that old clients will simply ignore the new extra element at the end

of the conflict skel.

* subversion/libsvn_wc/conflicts.c

(svn_wc__conflict_skel_add_tree_conflict): Add move_dst_op_root_abspath

parameter and append it to the skel if it is non-NULL.

(svn_wc__conflict_read_tree_conflict): Return the move_dst_op_root_abspath

if present in the conflict skel.

(read_tree_conflict_desc, resolve_tree_conflict_on_node,

svn_wc__conflict_tree_update_break_moved_away,

svn_wc__conflict_tree_update_incoming_move,

svn_wc__conflict_tree_update_local_add): Update callers.

* subversion/libsvn_wc/conflicts.h

(svn_wc__conflict_skel_add_tree_conflict,

svn_wc__conflict_read_tree_conflict): Update declaration and docstring.

* subversion/libsvn_wc/questions.c

(internal_conflicted_p): Update caller.

* subversion/libsvn_wc/tree_conflicts.c

(svn_wc__add_tree_conflict): Update caller.

* subversion/libsvn_wc/update_editor.c

(open_root, check_tree_conflict, add_directory, open_directory,

add_file, open_file, change_file_prop): Update callers.

* subversion/libsvn_wc/upgrade.c

(svn_wc__upgrade_conflict_skel_from_raw): Update caller.

* subversion/libsvn_wc/wc_db.c

(revert_maybe_raise_moved_away): Update caller.

* subversion/libsvn_wc/wc_db_update_move.c

(create_tree_conflict, fetch_conflict_details): Update callers.

* subversion/tests/libsvn_wc/conflict-data-test.c

(test_serialize_tree_conflict): Update test expectations.

* subversion/tests/libsvn_wc/op-depth-test.c

(check_db_conflicts): Update caller.

  1. … 9 more files in changeset.
Resolve a regression in our auth handling on update, which it appears I

introduced somewhere during the WC-NG work for Subversion 1.7.

Before this patch directories that are hidden by a change in authz settings

cause a skip caused by unversioned working copy message. After this patch

the nodes are properly removed from the working copy, introducing tree

conflicts if there are local changes.

* subversion/libsvn_wc/update_editor.c

(absent_node): Properly hide newly server excluded nodes.

* subversion/tests/cmdline/authz_tests.py

(remove_access_after_commit): New test

(test_list): Add new test.

  1. … 1 more file in changeset.
Resolve an obscure segfault when updating inside an already conflicted tree.

Found by: TortoiseSVN dump

ivan

(Reproduction recipe and patch by me)

* subversion/libsvn_wc/update_editor.c

(add_directory,

add_file): Don't calculate new repository paths inside a skipped tree.

* subversion/tests/cmdline/update_tests.py

(update_add_conflicted_deep): New test.

(test_list): Add test.

  1. … 1 more file in changeset.
Fix attempt to use uninitialized svn_wc__db_install_data_t pointer on error

in working copy update editor. I don't know exact reproduction script, but

this problem reported more than 400 times using TortoiseSVN crash reporter

tool.

* subversion/libsvn_wc/update_editor.c

(lazy_open_target): Do not rely that output parameter INSTALL_DATA will be

unchanged when svn_wc__db_pristine_prepare_install() returns error.

Avoid a db operation for each property conflict in some invocations of

the interactive conflict resolver.

* subversion/libsvn_wc/conflicts.c

(generate_propconflict): Add kind argument.

(svn_wc__conflict_invoke_resolver): Update caller. Add argument.

* subversion/libsvn_wc/conflicts.h

(svn_wc__conflict_invoke_resolver): Add kind argument.

* subversion/libsvn_wc/merge.c

(svn_wc_merge5): Extend scope of variable. Update caller.

* subversion/libsvn_wc/props.c

(svn_wc_merge_props3): Update caller.

* subversion/libsvn_wc/update_editor.c

(delete_entry,

close_directory,

absent_node,

close_file): Update caller.

  1. … 4 more files in changeset.
In the working copy update-editor: handle finding incomplete nodes where no

BASE node is expected the same as finding status 'normal' nodes: by checking

for driving errors and obstructing working copies.

This avoids an assertion in the tree conflict detection code when a

bad update driver tries to add something that is already there.

It looks like restarting a cancelled checkout from github can trigger this

problem. In this case just partially skipping the checkout allows the checkout

to complete the parent directory; likely fixing the working copy.

* subversion/libsvn_wc/update_editor.c

(add_directory,

add_file): Handle incomplete like normal.

Following up on r1659365 fix a segfault when the root of an update gets

conflicted.

Found by: philip

* subversion/libsvn_wc/update_editor.c

(close_directory): Following up on r1659365, don't try to check if the

update root is registered as replaced in its parent, which caused

a segfault.

* subversion/tests/cmdline/prop_tests.py

(prop_conflict_root): Remove XFail marker from test added in r1666270.

  1. … 1 more file in changeset.
Don't replace directories with a not-present node when a not supported

subversion server (read: GitHub) describes that we should add a directory

where one already exists.

In this case the reporter got told that the directory already exists,

but still described that one should be added in its place.

(A well behaving server would describe an open, or a delete before

the add).

In any case: this is not an obstructing working copy as we assumed,

so we don't have to break wc.db's info to allow recovering.

* subversion/libsvn_wc/update_editor.c

(add_directory,

add_file): Check that there really is an obstructing working copy,

before taking action.

Fix another misreported reason in the update editor, and the resolver to

handle this change without affecting features.

As part of this fix a few TODO's in the move-update conflict resolver code,

by combining the group of functions that handled breaking moves, and creating

moved_away conflicts to just two functions, that can handle the direct move

and descendant cases alike, and with proper op-depth handling.

Combining the functions uncovered yet another op-depth bug where the break

moves operation was applied to the wrong layer.

* subversion/libsvn_wc/conflicts.c

(resolve_tree_conflict_on_node): Update caller.

(conflict_status_walker_baton): Add boolean.

(conflict_status_walker): Set value in baton if we resolved something.

(svn_wc__resolve_conflicts): Continue as long as we resolved something

in the previous batch. Handle depth filtering in second pass.

Use the resolved_one boolean.

* subversion/libsvn_wc/update_editor.c

(check_tree_conflict): Report local replacements as replacements, even when

whatever was there was moved to make the conflict resolver pick the

right strategy.

* subversion/libsvn_wc/wc-queries.sql

(STMT_SELECT_MOVED_DESCENDANTS_SHD): Remove now unused query.

* subversion/libsvn_wc/wc_db.c

(svn_wc__db_op_break_move_internal): Rename argument to match task.

(db_op_mark_resolved): Rename to...

(svn_wc__db_op_mark_resolved_internal): ... this.

(svn_wc__db_op_mark_resolved): Update caller.

(op_revert_txn): Update caller. Pass proper origin depth.

* subversion/libsvn_wc/wc_db.h

(svn_wc__db_resolve_delete_raise_moved_away): Rename to...

(svn_wc__db_op_raise_moved_away): ... this.

(svn_wc__db_resolve_break_moved_away,

svn_wc__db_resolve_break_moved_away_children): Combine into..

(svn_wc__db_op_break_moved_away): ... this.

* subversion/libsvn_wc/wc_db_private.h

(svn_wc__db_op_break_move_internal): Rename argument.

(svn_wc__db_op_mark_resolved_internal): Rename argument.

* subversion/libsvn_wc/wc_db_update_move.c

(find_src_op_depth): Return a more generic error, as this function

is used in more places than inside the conflict resolver.

(get_tc_info): Remove function.

(fetch_conflict_details): New function, partially based on get_tc_info.

(svn_wc__db_op_raise_moved_away_internal): Update argument. Fetch true

delete depth for created conflicts.

(svn_wc__db_resolve_delete_raise_moved_away): Rename to...

(svn_wc__db_op_raise_moved_away): ... this. Use SVN_WC__DB_WITH_TXN4()

to obtain everything inside a transaction. Mark conflict resolved

before installing new tree conflicts.

(break_moved_away_children): Rename to...

(break_moved_away): ... this and handle both cases in a single function.

(svn_wc__db_resolve_break_moved_away): Rename to...

(svn_wc__db_op_break_moved_away): ... this. Update caller. Use

SVN_WC__DB_WITH_TXN4() to calculate values inside txn.

* subversion/tests/libsvn_wc/op-depth-test.c

(FILE_EXTERNAL): New macro.

(print_row): Handle a few more cases with C compatible output.

(del4_update_edit_AAA,

move4_update_delself_AAA): Update expected results.

  1. … 7 more files in changeset.
Consolidate all places in libsvn_wc where we 'determine if a tree has

modifications', because all of them had similar shortcomings where

they missed certain kinds of changes.

This consolidates the svnversion, crop and update checks for

modifications to a single function that handles all cases.

* subversion/include/private/svn_wc_private.h

(svn_wc__has_local_mods): Add ignore_unversioned argument.

* subversion/libsvn_client/copy.c

(pin_externals_prop): Update caller.

* subversion/libsvn_client/merge.c

(ensure_wc_is_suitable_merge_target): Update caller.

* subversion/libsvn_wc/crop.c

(modcheck_baton_t): Remove struct.

(modcheck_callback,

allow_crop): Remove function.

* subversion/libsvn_wc/questions.c

(modcheck_baton_t,

modcheck_callback): Move here from update_editor.c.

Support ignore_unversioned.

(svn_wc__node_has_local_mods): Move here. Perform db changes check first.

(svn_wc__has_local_mods): Use svn_wc__node_has_local_mods.

* subversion/libsvn_wc/revision_status.c

(svn_wc_revision_status2): Update caller.

* subversion/libsvn_wc/update_editor.c

(modcheck_baton_t,

modcheck_callback,

svn_wc__node_has_local_mods): Move to questions.c.

(check_tree_conflict): Update caller.

* subversion/libsvn_wc/wc-queries.sql

(STMT_SELECT_BASE_FILES_RECURSIVE): Remove statement.

* subversion/libsvn_wc/wc.h

(svn_wc__node_has_local_mods): Add argument.

* subversion/libsvn_wc/wc_db.c

(has_local_mods): Rename to...

(has_db_mods): ... and leave walking the working copy to the status walker.

(svn_wc__db_has_local_mods): Rename to...

(svn_wc__db_has_db_mods): ... this.

* subversion/libsvn_wc/wc_db.h

(svn_wc__db_revision_status): Remove cancel callbacks. Update documentation.

* subversion/libsvn_wc/wc_db_update_move.c

(tc_editor_delete): Update caller.

  1. … 11 more files in changeset.
Fix tree conflict detection in the update editor on unversioned nodes that

exist where there used to be a deleted node.

* subversion/include/svn_wc.h

(svn_wc_status3_t): Provide kind of what is actually in the working copy,

to allow status callbacks to see that there is really something else,

where we just deleted something.

* subversion/libsvn_wc/status.c

(assemble_status,

assemble_unversioned): Set actual_kind.

* subversion/libsvn_wc/update_editor.c

(modcheck_callback): Handle unversioned nodes as a change, even when they

are in the same place as a delete.

* subversion/tests/cmdline/special_tests.py

(update_obstructing_symlink): Update expected results: tree conflict!

  1. … 3 more files in changeset.
Make svn_wc__db_base_delete() take a single argument to specify that you

either want to keep the working copy the same (by copying to WORKING

if necessary), or want to remove everything.

This removes some of the calculation logic from the callers and as

such causes some behavior changes that need further tweaks. The current

behavior already fixes a few bugs, but I'm not entirely sure why this

has so much effect on the conflict resolver without changing the

NODES layout, nor the conflict skels.

* subversion/libsvn_wc/crop.c

(crop_children,

svn_wc_exclude): Update caller.

* subversion/libsvn_wc/externals.c

(svn_wc__external_remove): Update caller.

* subversion/libsvn_wc/update_editor.c

(delete_entry): Simplify calculations that can be done in the

db layer.

(close_edit): Update caller.

* subversion/libsvn_wc/wc_db.c

(db_base_remove): Calculate what must be done on a single argument.

Always process moves, not only when somebody installs a new conflict.

Remove a bit of double work.

(svn_wc__db_base_remove): Update caller.

(svn_wc__db_op_make_copy_internal): Make moving the moves to the direct

delete of BASE optional in the internal api.

(svn_wc__db_op_make_copy): Update caller.

* subversion/libsvn_wc/wc_db.h

(svn_wc__db_base_remove): Update prototype and docs.

* subversion/libsvn_wc/wc_db_private.h

(svn_wc__db_op_make_copy_internal): Add argument.

* subversion/libsvn_wc/wc_db_update_move.c

(tc_editor_delete): Update caller.

* subversion/libsvn_wc/workqueue.c

(run_base_remove): Update caller.

* subversion/tests/libsvn_wc/op-depth-test.c

(base_dir_insert_remove): Update caller.

(move_away_delete_update): Assume still moved.

(move_retract): Update assumptions.

(move_update_parent_replace): Assume still moved.

(make_copy_and_delete_mixed): Update caller. Assume one move fixed.

(test_funcs): Mark some more functions XFail that can't be resolved

by the existing conflict resolver setting.

  1. … 8 more files in changeset.
In preparation for some cleanup of the working copy crop (and backing) code,

and a big number of bugfixes in svn_wc__db_base_remove() make it possible to

install a not-present node with the svn_wc__db_base_remove() function.

* subversion/libsvn_wc/crop.c

(crop_children): Update caller.

* subversion/libsvn_wc/externals.c

(svn_wc__external_remove): Update caller.

* subversion/libsvn_wc/update_editor.c

(delete_entry,

close_edit): Update caller.

* subversion/libsvn_wc/wc_db.c

(db_base_remove): Remove support for removing locks and allow

setting an excluded node instead of just not-present.

(bump_node_revision): Use just one of the 20 features of

db_base_remove, by doing the delete directly.

* subversion/libsvn_wc/wc_db.h

(svn_wc__db_base_remove): Update arguments and docs.

* subversion/libsvn_wc/workqueue.c

(run_base_remove): Update caller.

* subversion/tests/libsvn_wc/op-depth-test.c

(base_dir_insert_remove): Update caller.

  1. … 6 more files in changeset.
Fix a nasty bug in our update editor's tree conflict detection. On an

incoming delete, it reports the local operation as delete if the only

change somewhere in the tree is a delete. This make it take the wrong

decisions on how to handle the tree conflict: it just deletes everything

while it should have made a copy in WORKING.

Only when the root is deleted (or moved), it should be reported as a

local deleted or the conflict resolver will take the wrong strategy.

This will allow implementing automatic move-update logic for quite a

few cases where that appeared impossible before.

* subversion/libsvn_wc/update_editor.c

(check_tree_conflict): Only report the tree as deleted, when it

is deleted.

* subversion/tests/cmdline/switch_tests.py

(tree_conflicts_on_switch_2_2): Update expectations.

* subversion/tests/cmdline/update_tests.py

(tree_conflicts_on_update_2_2): Update expectations.

* subversion/tests/libsvn_wc/op-depth-test.c

(move_away_delete_update,

move_update_parent_replace): Update expected results. These

cases currently expect a broken move.

  1. … 3 more files in changeset.
Stop setting last-rev, last-date and last-author on foreign repos copies

and merges. Fix consistency between svn_wc__db_op_copy_XXX() methods.

This fixes a bug in our entries compatibility code, as that assumes that

there is a copy if there is a last-rev.

* subversion/libsvn_wc/adm_ops.c

(svn_wc_add4): Update caller.

* subversion/libsvn_wc/update_editor.c

(svn_wc__complete_directory_add): Update caller.

* subversion/libsvn_wc/wc_db.c

(insert_working_node): Don't set pristine properties on local additions.

(svn_wc__db_op_copy_dir): Move is_moved argument last. Don't set changed*

and properties on local additions.

(svn_wc__db_op_copy_file): Don't set changed* and properties on local

additions.

(svn_wc__db_op_copy_symlink): Calulate moved_to like the other operations.

Don't set changed* and properties on local

additions.

* subversion/tests/cmdline/copy_tests.py

(repos_to_wc): Fix test expectation.

  1. … 4 more files in changeset.
Another indentation fix. Sorry for noise.

* subversion/libsvn_wc/update_editor.c

(add_file): Fix indentation.

Follow-up to r1658115: Formatting fix.

* subversion/libsvn_wc/update_editor.c

(add_directory): Fix indentation.

Apply the standard pre-branch whitespace cleanup via

tools/dev/remove-trailing-whitespace.zsh

There should be no functional changes.

* .ycm_extra_conf.py

* build/generator/gen_win.py

* build/generator/gen_win_dependencies.py

* subversion/bindings/javahl/native/EditorProxy.h

* subversion/bindings/javahl/native/StateReporter.cpp

* subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.cpp

* subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c

* subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h

* subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c

* subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c

* subversion/bindings/swig/ruby/test/test_fs.rb

* subversion/bindings/swig/ruby/test/util.rb

* subversion/bindings/swig/ruby/test/windows_util.rb

* subversion/include/private/svn_fs_fs_private.h

* subversion/include/private/svn_packed_data.h

* subversion/include/private/svn_repos_private.h

* subversion/include/private/svn_sorts_private.h

* subversion/include/private/svn_subr_private.h

* subversion/include/private/svn_wc_private.h

* subversion/include/svn_auth.h

* subversion/include/svn_cache_config.h

* subversion/include/svn_client.h

* subversion/include/svn_cmdline.h

* subversion/include/svn_diff.h

* subversion/include/svn_fs.h

* subversion/include/svn_io.h

* subversion/include/svn_ra.h

* subversion/include/svn_repos.h

* subversion/include/svn_string.h

* subversion/libsvn_client/blame.c

* subversion/libsvn_client/commit.c

* subversion/libsvn_client/commit_util.c

* subversion/libsvn_client/copy.c

* subversion/libsvn_client/diff.c

* subversion/libsvn_client/externals.c

* subversion/libsvn_client/log.c

* subversion/libsvn_client/patch.c

* subversion/libsvn_client/ra.c

* subversion/libsvn_client/update.c

* subversion/libsvn_delta/svndiff.c

* subversion/libsvn_diff/parse-diff.c

* subversion/libsvn_fs/fs-loader.c

* subversion/libsvn_fs_base/lock.c

* subversion/libsvn_fs_fs/cached_data.c

* subversion/libsvn_fs_fs/fs_fs.c

* subversion/libsvn_fs_fs/hotcopy.c

* subversion/libsvn_fs_fs/id.c

* subversion/libsvn_fs_fs/index.c

* subversion/libsvn_fs_fs/index.h

* subversion/libsvn_fs_fs/lock.c

* subversion/libsvn_fs_fs/low_level.c

* subversion/libsvn_fs_fs/low_level.h

* subversion/libsvn_fs_fs/pack.c

* subversion/libsvn_fs_fs/recovery.c

* subversion/libsvn_fs_fs/rev_file.c

* subversion/libsvn_fs_fs/revprops.c

* subversion/libsvn_fs_fs/revprops.h

* subversion/libsvn_fs_fs/stats.c

* subversion/libsvn_fs_fs/transaction.c

* subversion/libsvn_fs_fs/tree.c

* subversion/libsvn_fs_fs/verify.c

* subversion/libsvn_fs_x/cached_data.c

* subversion/libsvn_fs_x/changes.c

* subversion/libsvn_fs_x/dag.h

* subversion/libsvn_fs_x/fs.h

* subversion/libsvn_fs_x/fs_id.c

* subversion/libsvn_fs_x/fs_x.c

* subversion/libsvn_fs_x/hotcopy.c

* subversion/libsvn_fs_x/hotcopy.h

* subversion/libsvn_fs_x/index.c

* subversion/libsvn_fs_x/index.h

* subversion/libsvn_fs_x/lock.c

* subversion/libsvn_fs_x/lock.h

* subversion/libsvn_fs_x/low_level.c

* subversion/libsvn_fs_x/low_level.h

* subversion/libsvn_fs_x/noderevs.c

* subversion/libsvn_fs_x/pack.c

* subversion/libsvn_fs_x/reps.c

* subversion/libsvn_fs_x/rev_file.c

* subversion/libsvn_fs_x/revprops.c

* subversion/libsvn_fs_x/revprops.h

* subversion/libsvn_fs_x/string_table.c

* subversion/libsvn_fs_x/string_table.h

* subversion/libsvn_fs_x/transaction.c

* subversion/libsvn_fs_x/tree.c

* subversion/libsvn_fs_x/util.c

* subversion/libsvn_fs_x/verify.c

* subversion/libsvn_ra_local/ra_plugin.c

* subversion/libsvn_ra_serf/ra_serf.h

* subversion/libsvn_ra_serf/serf.c

* subversion/libsvn_ra_serf/update.c

* subversion/libsvn_ra_serf/util.c

* subversion/libsvn_ra_svn/client.c

* subversion/libsvn_ra_svn/marshal.c

* subversion/libsvn_repos/authz_pool.c

* subversion/libsvn_repos/config_pool.c

* subversion/libsvn_repos/dump.c

* subversion/libsvn_repos/fs-wrap.c

* subversion/libsvn_repos/log.c

* subversion/libsvn_subr/bit_array.c

* subversion/libsvn_subr/cache-membuffer.c

* subversion/libsvn_subr/config.c

* subversion/libsvn_subr/dirent_uri.c

* subversion/libsvn_subr/fnv1a.c

* subversion/libsvn_subr/gpg_agent.c

* subversion/libsvn_subr/hash.c

* subversion/libsvn_subr/io.c

* subversion/libsvn_subr/object_pool.c

* subversion/libsvn_subr/packed_data.c

* subversion/libsvn_subr/prefix_string.c

* subversion/libsvn_subr/sorts.c

* subversion/libsvn_subr/sqlite.c

* subversion/libsvn_subr/subst.c

* subversion/libsvn_subr/sysinfo.c

* subversion/libsvn_subr/types.c

* subversion/libsvn_subr/utf.c

* subversion/libsvn_subr/utf8proc/utf8proc_data.c

* subversion/libsvn_subr/x509info.c

* subversion/libsvn_wc/diff.h

* subversion/libsvn_wc/props.c

* subversion/libsvn_wc/update_editor.c

* subversion/libsvn_wc/wc.h

* subversion/libsvn_wc/wc_db.c

* subversion/libsvn_wc/wc_db.h

* subversion/mod_dav_svn/lock.c

* subversion/mod_dav_svn/mod_dav_svn.c

* subversion/mod_dav_svn/status.c

* subversion/svn/auth-cmd.c

* subversion/svn/info-cmd.c

* subversion/svn/mergeinfo-cmd.c

* subversion/svn/notify.c

* subversion/svn/propget-cmd.c

* subversion/svn/svn.c

* subversion/svnadmin/svnadmin.c

* subversion/svnserve/logger.c

* subversion/svnserve/serve.c

* subversion/svnserve/server.h

* subversion/svnserve/svnserve.c

* subversion/tests/cmdline/blame_tests.py

* subversion/tests/cmdline/checkout_tests.py

* subversion/tests/cmdline/commit_tests.py

* subversion/tests/cmdline/export_tests.py

* subversion/tests/cmdline/externals_tests.py

* subversion/tests/cmdline/lock_tests.py

* subversion/tests/cmdline/merge_tests.py

* subversion/tests/cmdline/merge_tree_conflict_tests.py

* subversion/tests/cmdline/move_tests.py

* subversion/tests/cmdline/redirect_tests.py

* subversion/tests/cmdline/stat_tests.py

* subversion/tests/cmdline/svnadmin_tests.py

* subversion/tests/cmdline/switch_tests.py

* subversion/tests/cmdline/update_tests.py

* subversion/tests/libsvn_client/client-test.c

* subversion/tests/libsvn_client/mtcc-test.c

* subversion/tests/libsvn_fs/fs-test.c

* subversion/tests/libsvn_fs/locks-test.c

* subversion/tests/libsvn_fs_fs/fs-fs-fuzzy-test.c

* subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c

* subversion/tests/libsvn_fs_x/fs-x-pack-test.c

* subversion/tests/libsvn_fs_x/string-table-test.c

* subversion/tests/libsvn_ra/ra-test.c

* subversion/tests/libsvn_subr/cache-test.c

* subversion/tests/libsvn_subr/checksum-test.c

* subversion/tests/libsvn_subr/config-test.c

* subversion/tests/libsvn_subr/io-test.c

* subversion/tests/libsvn_subr/packed-data-test.c

* subversion/tests/libsvn_subr/priority-queue-test.c

* subversion/tests/libsvn_subr/sqlite-test.c

* subversion/tests/libsvn_subr/string-test.c

* subversion/tests/libsvn_subr/subst_translate-test.c

* subversion/tests/libsvn_subr/x509-test.c

* subversion/tests/libsvn_wc/op-depth-test.c

* subversion/tests/svn_test_main.c

* tools/dev/benchmarks/RepoPerf/copy_repo.py

* tools/dev/benchmarks/RepoPerf/win_repo_bench.py

* tools/dev/build-svn-deps-win.pl

* tools/dev/fsfs-access-map.c

* tools/dev/po-merge.py

* tools/dev/x509-parser.c

* tools/diff/diff.c

* tools/dist/backport.pl

* tools/dist/backport_tests.py

* tools/hook-scripts/mailer/mailer.py

* tools/server-side/svnpubsub/daemonize.py

* win-tests.py

Remove unneeded whitespace via script.

  1. … 184 more files in changeset.
* subversion/libsvn_wc/update_editor.c

(complete_conflict): Apply a few constness fixes. Remove unused variable.

Add regression test on several tree conflict descriptions on update and

fix some missing repository information on incoming replace conflicts.

* subversion/libsvn_wc/update_editor.c

(complete_conflict): Add delete_conflict argument and use this to

fill in missing information on replacements.

(mark_directory_edited,

mark_file_edited,

open_root): Update caller.

(delete_entry): Remove unneeded kind transforms.

(add_directory,

close_directory): Pass replace info.

(absent_node): Update caller.

(add_file): Pass replace info.

(change_file_prop): Update caller.

(close_file): Pass replace info.

* subversion/tests/cmdline/update_tests.py

(update_conflict_details): New test.

(test_list): Add update_conflict_details.

  1. … 1 more file in changeset.
Minor argument cleanup inside wc_db private code. No external behaviour changes.

* subversion/libsvn_wc/update_editor.c

(close_directory): Update caller.

* subversion/libsvn_wc/wc_db.c

(svn_wc__db_base_add_directory): Use default argument order for conflicts.

(svn_wc__db_op_break_move_internal): Move function here to allow calling

into clear_moved_here() which was identical to the second part of this

function.

(op_revert_txn,

op_revert_recursive_txn): Update caller.

* subversion/libsvn_wc/wc_db.h

(svn_wc__db_base_add_directory): Use default argument order for conflicts.

* subversion/libsvn_wc/wc_db_update_move.c

(svn_wc__db_op_break_move_internal): Remove function here.

(break_moved_away,

break_moved_away_children): Update caller.

* subversion/tests/libsvn_wc/db-test.c

(test_inserting_nodes): Update caller.

* subversion/tests/libsvn_wc/op-depth-test.c

(base_dir_insert_remove): Update caller.

  1. … 6 more files in changeset.
Call the interactive conflict resolver in the update editor only after

a file or directory is added, instead of sometimes before *and* after

processing the descendants.

Currently the interactive conflict resolver doesn't allow to resolve

these tree conflicts at this stage, but if that is fixed this patch

is relevant. ('svn' doesn't even use this hook, as it prefers to handle

all conflicts when the operation is done)

* subversion/libsvn_wc/update_editor.c

(add_directory): Don't invoke resolver here. Just stash conflict.

(add_file): Fix some pool usages (one interesting). Don't invoke

resolver here. Just stash conflict.

Keep track of the move_src_op_root_abspath value in tree conflicts

when turning an incoming delete into a replacement.

* subversion/libsvn_wc/update_editor.c

(add_directory,

add_file): Track move_src_op_root_abspath value. Remove comment that was

obsolete before 1.8.0.

Make svn_string_dup() more comfortable to use. Allow the input string

to be NULL and return NULL for the copy in that case.

Right now, it will segfault for NULL pointers and virtually all callers

check for NULL before calling and emulate the improved logic.

So, this change will not break any legal API user code but save us lots

of duplicated logic.

* subversion/include/svn_string.h

(svn_string_dup): Update docstring.

* subversion/libsvn_subr/string.c

(svn_string_dup): Return NULL as copy for NULL inputs.

* subversion/libsvn_client/mtcc.c

(mtcc_prop_getter): Simplify caller.

* subversion/libsvn_client/repos_diff.c

(change_file_prop,

change_dir_prop): Same.

* subversion/libsvn_fs_base/tree.c

(base_node_prop): Same.

* subversion/libsvn_ra_serf/commit.c

(change_dir_prop,

change_file_prop): Same.

* subversion/libsvn_repos/reporter.c

(get_revision_info): Same.

* subversion/libsvn_wc/diff_editor.c

(change_file_prop,

change_dir_prop): Same.

* subversion/libsvn_wc/externals.c

(change_file_prop): Same.

* subversion/libsvn_wc/props.c

(svn_wc__merge_props): Same.

* subversion/libsvn_wc/update_editor.c

(change_dir_prop,

change_file_prop): Same.

* subversion/svnrdump/load_editor.c

(set_node_property): Same.

  1. … 11 more files in changeset.
In preparation for running more of the post commit processing in a single

sqlite transaction, update read only status for unlock operations from the

working queue.

This probably introduces a temporary performance regression for this scenario.

* subversion/libsvn_wc/adm_ops.c

(svn_wc_remove_lock2): Create work item and pass that to db operation.

* subversion/libsvn_wc/update_editor.c

(close_file): Update caller.

* subversion/libsvn_wc/wc_db.c

(lock_remove_txn,

svn_wc__db_lock_remove): Add work_items handling.

* subversion/libsvn_wc/wc_db.h

(svn_wc__db_lock_remove): Add work_items handling.

  1. … 3 more files in changeset.
* subversion/libsvn_wc/update_editor.c

(check_tree_conflict): Remove unnecessary forward declaration.

* subversion/libsvn_wc/update_editor.c

(absent_node): Fix thinko, switch old and new kind in conflict.

Raise a tree-conflict and continue the update, rather than stopping,

with an obstruction, when an incoming server-excluded node conflicts

with a locally added node.

* subversion/libsvn_wc/update_editor.c

(absent_node): Raise a tree-conflict.

* subversion/tests/cmdline/authz_tests.py

(authz_tree_conflict): Expect a tree-conflict and a complete update.

  1. … 1 more file in changeset.
When flagging a tree conflict involving a deleted entry during update/switch,

record the deleted target path and target revision for use by the conflict

resolver.

This is an alternative fix for the issue addressed by r1617909, which was

reverted in r1617930.

* subversion/libsvn_wc/update_editor.c

(complete_conflict): Expect a non-null new_repos_relpath. Callers should

always provide one, even if it matches repos_relpath.

(delete_entry): Instead of passing a NULL new_repos_relpath, determine

the deleted target path (which is different in case of update vs. switch)

so complete_conflict() will record information on it.

Suggested by: rhuijben