From my original patch (http://svn.haxx.se/dev/archive-2007-11/0708.shtml)
through discussions about a better implementation
(http://svn.haxx.se/dev/archive-2007-11/1113.shtml and
http://svn.haxx.se/dev/archive-2007-12/0047.shtml) I have returned with a
better relative url implementation for the svn client, at least so I believe.
In this patch I implement the following logic for parsing the svn CLI
client args:
- If there is a relative url in the target list
- Then use the repository root url from the other targets to resolve the
relative url.
- If there are no other targets, use the root url of the current directory.
- If the current directory is not a working copy, issue an error.
This seems to get most of the use cases right. It does leave multi-repository
urls out, but they are much less frequent and we couldn't come up with a
simple (to understand) method of resolving them.
This patch contains what is likely a ridiculous amount of svn tests, basically
one for every command of interest to relative urls. It might be too much
because ultimately they all run the same function. However, I had them from
my previous attempt (in which each svn subcommand had it's own implementation)
and I figured they could be useful in making sure checks and translations
don't get made before the call to svn_cl__args_to_target_array() that break
relative url support.
Here's my log message:
[[[
Implement repository root relative url support for the svn command-line
client.
Create some infrastructure:
* subversion/libsvn_subr/path.c
(svn_path_is_relative_url): New function to test whether a given string is a
relative url.
(svn_path_resolve_relative_url): New function to resolve a relative url
given the repository root url.
* subversion/include/svn_path.h
(svn_path_is_relative_url): New function prototype.
(svn_path_resolve_relative_url): New function prototype.
* subversion/tests/libsvn_subr/path-test.c
(test_is_relative_url): New test.
(test_resolve_relative_url): New test.
(test_funcs): Run new tests.
* subversion/libsvn_subr/opt.c
(svn_opt_args_to_target_array3): Allow a bare relative url for the root of a
repository ('^/') by testing whether a given argument is a relative url
before attempting to canonicalize it.
* subversion/libsvn_client/externals.c
(resolve_relative_external_url): Include a brief note mentioning the fact
there is a partial reimplementation in libsvn_subr/path.c.
Add relative url support to the svn command-line client:
* subversion/svn/util.c
(svn_cl__args_to_target_array_print_reserved): Replace this function with a
more generically named svn_cl__args_to_target_array().
(svn_cl__args_to_target_array): Resolve repository root relative urls in the
arguments and known_targets.
* subversion/svn/cl.h
(svn_cl__args_to_target_array_print_reserved): Deleted old function
prototype.
(svn_cl__args_to_target_array): Add new function prototype.
* subversion/svn/propdel-cmd.c,
subversion/svn/merge-cmd.c,
subversion/svn/checkout-cmd.c,
subversion/svn/move-cmd.c,
subversion/svn/mkdir-cmd.c,
subversion/svn/cat-cmd.c,
subversion/svn/revert-cmd.c,
subversion/svn/diff-cmd.c,
subversion/svn/copy-cmd.c,
subversion/svn/mergeinfo-cmd.c,
subversion/svn/list-cmd.c,
subversion/svn/blame-cmd.c,
subversion/svn/propget-cmd.c,
subversion/svn/changelist-cmd.c,
subversion/svn/log-cmd.c,
subversion/svn/resolved-cmd.c,
subversion/svn/cleanup-cmd.c,
subversion/svn/commit-cmd.c,
subversion/svn/add-cmd.c,
subversion/svn/propset-cmd.c,
subversion/svn/switch-cmd.c,
subversion/svn/delete-cmd.c,
subversion/svn/import-cmd.c,
subversion/svn/proplist-cmd.c,
subversion/svn/export-cmd.c,
subversion/svn/status-cmd.c,
subversion/svn/propedit-cmd.c,
subversion/svn/lock-cmd.c,
subversion/svn/info-cmd.c,
subversion/svn/unlock-cmd.c
(svn_cl__add, svn_cl__blame, svn_cl__cat, svn_cl__changelist,
svn_cl__checkout, svn_cl__cleanup, svn_cl__commit, svn_cl__copy,
svn_cl__delete, svn_cl__diff, svn_cl__export, svn_cl__import, svn_cl__info,
svn_cl__list, svn_cl__lock, svn_cl__log, svn_cl__merge, svn_cl__mergeinfo,
svn_cl__mkdir, svn_cl__move, svn_cl__propdel, svn_cl__propedit,
svn_cl__propget, svn_cl__proplist, svn_cl__propset, svn_cl__resolved,
svn_cl__revert, svn_cl__status, svn_cl__switch, svn_cl__unlock):
Replaced the usage of svn_cl__args_to_target_array_print_reserved() with
the more generically named svn_cl__args_to_target_array() which combines
the original function's functionality with relative url resolution.
(svn_cl__diff): Add access to the client context handle.
* subversion/svn/update-cmd.c
(svn_cl__update): Replace svn_opt_args_to_target_array3() with
svn_cl__args_to_target_array().
* subversion/tests/cmdline/cat_tests.py
(cat_relative_url): New test.
(test_list): Run it.
* subversion/tests/cmdline/checkout_tests.py
(co_with_relative_url): New test.
(test_list): Run it.
* subversion/tests/cmdline/copy_tests.py
(copy_with_relative_urls): New test.
(test_list): Run it.
* subversion/tests/cmdline/diff_tests.py
(diff_relative_url): New test.
(test_list): Run it.
* subversion/tests/cmdline/export_tests.py
(export_relative_url): New test.
(test_list): Run it.
* subversion/tests/cmdline/import_tests.py
(import_to_relative_url): New test.
(test_list): Run it.
* subversion/tests/cmdline/lock_tests.py
(lock_file_with_relative_url): New test.
(test_list): Run it.
* subversion/tests/cmdline/log_tests.py
(log_with_relative_urls): New test.
(test_list): Run it.
* subversion/tests/cmdline/merge_tests.py
(merge_with_relative_urls): New test.
(test_list): Run it.
* subversion/tests/cmdline/prop_tests.py
(url_props_relative_url): New test.
(test_list): Run it.
* subversion/tests/cmdline/switch_tests.py
(switch_with_relative_url): New test.
(test_list): Run it.
* subversion/tests/cmdline/blame_tests.py
(blame_relative_url): New test.
(test_list): Run it.
]]]
Troy
--
Beware of spyware. If you can, use the Firefox browser. - USA Today
Download now at http://getfirefox.com
Registered Linux User #354814 ( http://counter.li.org/)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe_at_subversion.tigris.org
For additional commands, e-mail: dev-help_at_subversion.tigris.org
Received on 2008-02-13 06:46:32 CET