Modified: subversion/branches/ev2-export/subversion/svnserve/server.h URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnserve/server.h?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/svnserve/server.h (original) +++ subversion/branches/ev2-export/subversion/svnserve/server.h Sat Dec 22 03:14:36 2012 @@ -42,6 +42,7 @@ typedef struct server_baton_t { svn_repos_t *repos; const char *repos_name; /* URI-encoded name of repository (not for authz) */ svn_fs_t *fs; /* For convenience; same as svn_repos_fs(repos) */ + const char *base; /* Base directory for config files */ svn_config_t *cfg; /* Parsed repository svnserve.conf */ svn_config_t *pwdb; /* Parsed password database */ svn_authz_t *authzdb; /* Parsed authz rules */ @@ -87,24 +88,15 @@ typedef struct serve_params_t { which forces all connections to be read-only. */ svn_boolean_t read_only; + /* The base directory for any relative configuration files. */ + const char *base; + /* A parsed repository svnserve configuration file, ala svnserve.conf. If this is NULL, then no configuration file was specified on the command line. If this is non-NULL, then per-repository svnserve.conf are not read. */ svn_config_t *cfg; - /* A parsed repository password database. If this is NULL, then - either no svnserve configuration file was specified on the - command line, or it was specified and it did not refer to a - password database. */ - svn_config_t *pwdb; - - /* A parsed repository authorization database. If this is NULL, - then either no svnserve configuration file was specified on the - command line, or it was specified and it did not refer to a - authorization database. */ - svn_authz_t *authzdb; - /* A filehandle open for writing logs to; possibly NULL. */ apr_file_t *log_file; @@ -145,31 +137,24 @@ typedef struct serve_params_t { svn_error_t *serve(svn_ra_svn_conn_t *conn, serve_params_t *params, apr_pool_t *pool); -/* Load a svnserve configuration file located at FILENAME into CFG, - and if such as found, then: +/* Load the password database for the listening server based on the + entries in the SERVER struct. - - set *PWDB to any referenced password database, - - set *AUTHZDB to any referenced authorization database, and - - set *USERNAME_CASE to the enumerated value of the - 'force-username-case' configuration value (or its default). - - If MUST_EXIST is true and FILENAME does not exist, then return an - error. BASE may be specified as the base path to any referenced - password and authorization files found in FILENAME. - - If SERVER is not NULL, log the real errors with SERVER and CONN but - return generic errors to the client. CONN must not be NULL if SERVER - is not NULL. */ -svn_error_t *load_configs(svn_config_t **cfg, - svn_config_t **pwdb, - svn_authz_t **authzdb, - enum username_case_type *username_case, - const char *filename, - svn_boolean_t must_exist, - const char *base, - server_baton_t *server, - svn_ra_svn_conn_t *conn, - apr_pool_t *pool); + SERVER and CONN must not be NULL. The real errors will be logged with + SERVER and CONN but return generic errors to the client. */ +svn_error_t *load_pwdb_config(server_baton_t *server, + svn_ra_svn_conn_t *conn, + apr_pool_t *pool); + +/* Load the authz database for the listening server based on the + entries in the SERVER struct. + + SERVER and CONN must not be NULL. The real errors will be logged with + SERVER and CONN but return generic errors to the client. */ +svn_error_t *load_authz_config(server_baton_t *server, + svn_ra_svn_conn_t *conn, + const char *repos_root, + apr_pool_t *pool); /* Initialize the Cyrus SASL library. POOL is used for allocations. */ svn_error_t *cyrus_init(apr_pool_t *pool);
Modified: subversion/branches/ev2-export/subversion/svnserve/svnserve.8 URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnserve/svnserve.8?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/svnserve/svnserve.8 (original) +++ subversion/branches/ev2-export/subversion/svnserve/svnserve.8 Sat Dec 22 03:14:36 2012 @@ -110,12 +110,12 @@ still backgrounds itself at startup time .TP 5 \fB\-\-config\-file\fP=\fIfilename\fP When specified, \fBsvnserve\fP reads \fIfilename\fP once at program -startup and caches the \fBsvnserve\fP configuration and any passwords -and authorization configuration referenced from \fIfilename\fP. -\fBsvnserve\fP will not read any per-repository -\fBconf/svnserve.conf\fP files when this option is used. See the -\fBsvnserve.conf\fP(5) man page for details of the file format for -this option. +startup and caches the \fBsvnserve\fP configuration. The password +and authorization configurations referenced from \fIfilename\fP will +be loaded on each connection. \fBsvnserve\fP will not read any +per-repository \fBconf/svnserve.conf\fP files when this option is +used. See the \fBsvnserve.conf\fP(5) man page for details of the +file format for this option. .PP .TP 5 \fB\-\-pid\-file\fP=\fIfilename\fP Modified: subversion/branches/ev2-export/subversion/svnserve/svnserve.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnserve/svnserve.c?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/svnserve/svnserve.c (original) +++ subversion/branches/ev2-export/subversion/svnserve/svnserve.c Sat Dec 22 03:14:36 2012 @@ -503,9 +503,8 @@ int main(int argc, const char *argv[]) params.tunnel = FALSE; params.tunnel_user = NULL; params.read_only = FALSE; + params.base = NULL; params.cfg = NULL; - params.pwdb = NULL; - params.authzdb = NULL; params.compression_level = SVN_DELTA_COMPRESSION_LEVEL_DEFAULT; params.log_file = NULL; params.vhost = FALSE; @@ -747,11 +746,14 @@ int main(int argc, const char *argv[]) /* If a configuration file is specified, load it and any referenced * password and authorization files. */ if (config_filename) - SVN_INT_ERR(load_configs(¶ms.cfg, ¶ms.pwdb, ¶ms.authzdb, - ¶ms.username_case, config_filename, TRUE, - svn_dirent_dirname(config_filename, pool), - NULL, NULL, /* server baton, conn */ - pool)); + { + params.base = svn_dirent_dirname(config_filename, pool); + + SVN_INT_ERR(svn_config_read2(¶ms.cfg, config_filename, + TRUE, /* must_exist */ + FALSE, /* section_names_case_sensitive */ + pool)); + } if (log_filename) SVN_INT_ERR(svn_io_file_open(¶ms.log_file, log_filename, Modified: subversion/branches/ev2-export/subversion/svnserve/svnserve.conf.5 URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnserve/svnserve.conf.5?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/svnserve/svnserve.conf.5 (original) +++ subversion/branches/ev2-export/subversion/svnserve/svnserve.conf.5 Sat Dec 22 03:14:36 2012 @@ -61,11 +61,13 @@ uses only one section "users"; each vari username, and each value is a password. .PP .TP 5 -\fBauthz-db\fP = \fIfilename\fP +\fBauthz-db\fP = \fIpath\fP The authz-db option controls the location of the authorization -rules for path-based access control. \fIfilename\fP may be -relative to the repository conf directory. There is no default value. -If you don't specify an authz-db, no path-based access control is done. +rules for path-based access control. \fIpath\fP may be +relative to the repository conf directory. \fIpath\fP may be a repository +relative URL (^/) or absolute file:// URL to a text file in a Subversion +repository. There is no default value. If you don't specify an authz-db, +no path-based access control is done. .PP .TP 5 \fBrealm\fP = \fIrealm\-name\fP Modified: subversion/branches/ev2-export/subversion/tests/cmdline/merge_reintegrate_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/merge_reintegrate_tests.py?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/tests/cmdline/merge_reintegrate_tests.py (original) +++ subversion/branches/ev2-export/subversion/tests/cmdline/merge_reintegrate_tests.py Sat Dec 22 03:14:36 2012 @@ -740,6 +740,7 @@ def reintegrate_fail_on_switched_wc(sbox # Test for issue #3603 'allow reintegrate merges into WCs with # missing subtrees'. @Issue(3603) +@XFail() def reintegrate_on_shallow_wc(sbox): "merge --reintegrate in shallow wc" @@ -825,6 +826,18 @@ def reintegrate_on_shallow_wc(sbox): 'Some more work on the A_COPY branch', wc_dir) # Reuse the same expectations as the prior merge, except for the mergeinfo # on the target root that now includes the latest rev on the branch. + expected_mergeinfo_output.add({ + 'D' : Item(status=' U') + }) + expected_A_status.tweak('D', status=' M') + expected_A_disk.tweak('D', props={SVN_PROP_MERGEINFO : '/A_COPY/D:2-4*'}) + # ... a depth-restricted item is skipped ... + expected_A_skip.add({ + 'D/H' : Item() + }) + # Currently this fails due to r1424469. For a full explanation see + # http://svn.haxx.se/dev/archive-2012-12/0472.shtml + # and http://svn.haxx.se/dev/archive-2012-12/0475.shtml expected_A_disk.tweak('', props={SVN_PROP_MERGEINFO : '/A_COPY:2-4'}) svntest.actions.run_and_verify_merge(A_path, None, None, sbox.repo_url + '/A_COPY', None, Modified: subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py (original) +++ subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py Sat Dec 22 03:14:36 2012 @@ -7731,6 +7731,7 @@ def merge_away_subtrees_noninheritable_r # Handle merge info for sparsely-populated directories @Issue(2827) @SkipUnless(server_has_mergeinfo) +@XFail() def merge_to_sparse_directories(sbox): "merge to sparse directories" @@ -7812,10 +7813,14 @@ def merge_to_sparse_directories(sbox): # Merge r4:9 into the immediates WC. # The root of the immediates WC should get inheritable r4:9 as should # the one file present 'mu'. The three directory children present, 'B', - # 'C', and 'D' are checked out at depth empty; the one of these affected - # by the merge, 'D', gets non-inheritable mergeinfo for r4:9. + # 'C', and 'D' are checked out at depth empty; the two of these affected + # by the merge, 'B' and 'D', get non-inheritable mergeinfo for r4:9. # The root and 'D' do should also get the changes # that affect them directly (the prop adds from r8 and r9). + # + # Currently this fails due to r1424469. For a full explanation see + # http://svn.haxx.se/dev/archive-2012-12/0472.shtml + # and http://svn.haxx.se/dev/archive-2012-12/0475.shtml expected_output = wc.State(immediates_dir, { 'D' : Item(status=' U'), 'mu' : Item(status='U '), @@ -7823,14 +7828,14 @@ def merge_to_sparse_directories(sbox): }) expected_mergeinfo_output = wc.State(immediates_dir, { '' : Item(status=' U'), + 'B' : Item(status=' U'), 'D' : Item(status=' U'), }) expected_elision_output = wc.State(immediates_dir, { - 'D' : Item(status=' U'), }) expected_status = wc.State(immediates_dir, { '' : Item(status=' M', wc_rev=9), - 'B' : Item(status=' ', wc_rev=9), + 'B' : Item(status=' M', wc_rev=9), 'mu' : Item(status='M ', wc_rev=9), 'C' : Item(status=' ', wc_rev=9), 'D' : Item(status=' M', wc_rev=9), @@ -7838,10 +7843,15 @@ def merge_to_sparse_directories(sbox): expected_disk = wc.State('', { '' : Item(props={SVN_PROP_MERGEINFO : '/A:5-9', "prop:name" : "propval"}), - 'B' : Item(), + 'B' : Item(props={SVN_PROP_MERGEINFO : '/A/B:5-9*'}), 'mu' : Item("New content"), 'C' : Item(), - 'D' : Item(props={"prop:name" : "propval"}), + 'D' : Item(props={SVN_PROP_MERGEINFO : '/A/D:5-9*', + "prop:name" : "propval"}), + }) + expected_skip = svntest.wc.State(immediates_dir, { + 'D/H' : Item(), + 'B/E' : Item(), }) expected_skip = svntest.wc.State(immediates_dir, { }) Modified: subversion/branches/ev2-export/subversion/tests/cmdline/merge_tree_conflict_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/merge_tree_conflict_tests.py?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/tests/cmdline/merge_tree_conflict_tests.py (original) +++ subversion/branches/ev2-export/subversion/tests/cmdline/merge_tree_conflict_tests.py Sat Dec 22 03:14:36 2012 @@ -1271,6 +1271,7 @@ def tree_conflicts_on_merge_no_local_ci_ ) ], False) #---------------------------------------------------------------------- +@XFail() def tree_conflicts_merge_edit_onto_missing(sbox): "tree conflicts: tree missing, leaf edit" @@ -1329,11 +1330,20 @@ def tree_conflicts_merge_edit_onto_missi expected_status.tweak('DDD/D1/D2', wc_rev=3, status='! ') expected_status.tweak('DDD/D1/D2/D3', wc_rev=3, status='! ') + # Currently this fails due to r1424469, we are not showing the roots of + # missing subtrees as skipped even though there are operative changes + # within those subtrees. + # See http://svn.haxx.se/dev/archive-2012-12/0472.shtml + # and http://svn.haxx.se/dev/archive-2012-12/0475.shtml expected_skip = svntest.wc.State('', { 'F/alpha' : Item(), # BH: After fixing several issues in the obstruction handling - # I get the following Skip notification. Please review! + # I get the following Skip notifications. Please review! 'D/D1' : Item(), + 'DD/D1' : Item(), + 'DF/D1' : Item(), + 'DDD/D1' : Item(), + 'DDF/D1' : Item(), }) @@ -1349,6 +1359,7 @@ def tree_conflicts_merge_edit_onto_missi ) ], False, do_commit_conflicts=False, ignore_ancestry=True) #---------------------------------------------------------------------- +@XFail() def tree_conflicts_merge_del_onto_missing(sbox): "tree conflicts: tree missing, leaf del" @@ -1407,9 +1418,21 @@ def tree_conflicts_merge_del_onto_missin expected_status.tweak('DDD/D1/D2', wc_rev=3, status='! ') expected_status.tweak('DDD/D1/D2/D3', wc_rev=3, status='! ') + # Currently this fails due to r1424469, we are not showing the roots of + # missing subtrees as skipped even though there are operative changes + # within those subtrees. + # See http://svn.haxx.se/dev/archive-2012-12/0472.shtml + # and http://svn.haxx.se/dev/archive-2012-12/0475.shtml expected_skip = svntest.wc.State('', { 'F/alpha' : Item(), 'D/D1' : Item(), + # BH: After fixing several issues in the obstruction handling + # I get the following Skip notifications. Please review! + 'D/D1' : Item(), + 'DD/D1' : Item(), + 'DF/D1' : Item(), + 'DDD/D1' : Item(), + 'DDF/D1' : Item(), }) svntest.actions.deep_trees_run_tests_scheme_for_merge(sbox, Modified: subversion/branches/ev2-export/subversion/tests/cmdline/svnmucc_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/svnmucc_tests.py?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/tests/cmdline/svnmucc_tests.py (original) +++ subversion/branches/ev2-export/subversion/tests/cmdline/svnmucc_tests.py Sat Dec 22 03:14:36 2012 @@ -45,6 +45,7 @@ def reject_bogus_mergeinfo(sbox): # validate the mergeinfo up front then it will only test the client svntest.actions.run_and_verify_svnmucc(None, [], expected_error, 'propset', 'svn:mergeinfo', '/B:0', + '-m', 'log msg', sbox.repo_url + '/A') _svnmucc_re = re.compile('^(r[0-9]+) committed by jrandom at (.*)$') @@ -111,12 +112,14 @@ def basic_svnmucc(sbox): test_svnmucc(sbox.repo_url, ['A /foo' ], # --------- + '-m', 'log msg', 'mkdir', 'foo') # revision 3 test_svnmucc(sbox.repo_url, ['A /z.c', ], # --------- + '-m', 'log msg', 'put', empty_file, 'z.c') # revision 4 @@ -124,6 +127,7 @@ def basic_svnmucc(sbox): ['A /foo/z.c (from /z.c:3)', 'A /foo/bar (from /foo:3)', ], # --------- + '-m', 'log msg', 'cp', '3', 'z.c', 'foo/z.c', 'cp', '3', 'foo', 'foo/bar') @@ -134,6 +138,7 @@ def basic_svnmucc(sbox): 'D /foo', 'A /zig/zag (from /foo:4)', ], # --------- + '-m', 'log msg', 'cp', '4', 'foo', 'zig', 'rm', 'zig/bar', 'mv', 'foo', 'zig/zag') @@ -144,6 +149,7 @@ def basic_svnmucc(sbox): 'A /zig/zag/bar/y.c (from /z.c:5)', 'A /zig/zag/bar/x.c (from /z.c:3)', ], # --------- + '-m', 'log msg', 'mv', 'z.c', 'zig/zag/bar/y.c', 'cp', '3', 'z.c', 'zig/zag/bar/x.c') @@ -153,6 +159,7 @@ def basic_svnmucc(sbox): 'A /zig/zag/bar/y y.c (from /zig/zag/bar/y.c:6)', 'A /zig/zag/bar/y%20y.c (from /zig/zag/bar/y.c:6)', ], # --------- + '-m', 'log msg', 'mv', 'zig/zag/bar/y.c', 'zig/zag/bar/y%20y.c', 'cp', 'HEAD', 'zig/zag/bar/y.c', 'zig/zag/bar/y%2520y.c') @@ -163,6 +170,7 @@ def basic_svnmucc(sbox): 'A /zig/zag/bar/z%20z.c (from /zig/zag/bar/y%20y.c:7)', 'A /zig/zag/bar/z z2.c (from /zig/zag/bar/y y.c:7)', ], #--------- + '-m', 'log msg', 'mv', 'zig/zag/bar/y%20y.c', 'zig/zag/bar/z z1.c', 'cp', 'HEAD', 'zig/zag/bar/y%2520y.c', 'zig/zag/bar/z%2520z.c', 'cp', 'HEAD', 'zig/zag/bar/y y.c', 'zig/zag/bar/z z2.c') @@ -176,6 +184,7 @@ def basic_svnmucc(sbox): 'D /zig/foo/bar/z z2.c', 'R /zig/foo/bar/z z1.c (from /zig/zag/bar/x.c:6)', ], #--------- + '-m', 'log msg', 'mv', 'zig/zag', 'zig/foo', 'rm', 'zig/foo/bar/z z1.c', 'rm', 'zig/foo/bar/z%20z2.c', @@ -186,6 +195,7 @@ def basic_svnmucc(sbox): test_svnmucc(sbox.repo_url, ['R /zig/foo/bar (from /zig/z.c:9)', ], #--------- + '-m', 'log msg', 'rm', 'zig/foo/bar', 'cp', '9', 'zig/z.c', 'zig/foo/bar') @@ -194,6 +204,7 @@ def basic_svnmucc(sbox): ['R /zig/foo/bar (from /zig/foo/bar:9)', 'D /zig/foo/bar/z z1.c', ], #--------- + '-m', 'log msg', 'rm', 'zig/foo/bar', 'cp', '9', 'zig/foo/bar', 'zig/foo/bar', 'rm', 'zig/foo/bar/z%20z1.c') @@ -202,6 +213,7 @@ def basic_svnmucc(sbox): test_svnmucc(sbox.repo_url, ['R /zig/foo (from /zig/foo/bar:11)', ], #--------- + '-m', 'log msg', 'rm', 'zig/foo', 'cp', 'head', 'zig/foo/bar', 'zig/foo') @@ -214,6 +226,7 @@ def basic_svnmucc(sbox): 'D /foo/foo/bar', 'R /foo/foo/foo/bar (from /foo:4)', ], #--------- + '-m', 'log msg', 'rm', 'zig', 'cp', '4', 'foo', 'foo', 'cp', '4', 'foo', 'foo/foo', @@ -228,6 +241,7 @@ def basic_svnmucc(sbox): 'A /boozle/buz', 'A /boozle/buz/nuz', ], #--------- + '-m', 'log msg', 'cp', '4', 'foo', 'boozle', 'mkdir', 'boozle/buz', 'mkdir', 'boozle/buz/nuz') @@ -238,6 +252,7 @@ def basic_svnmucc(sbox): 'A /boozle/guz (from /boozle/buz:14)', 'A /boozle/guz/svnmucc-test.py', ], #--------- + '-m', 'log msg', 'put', empty_file, 'boozle/buz/svnmucc-test.py', 'cp', '14', 'boozle/buz', 'boozle/guz', 'put', empty_file, 'boozle/guz/svnmucc-test.py') @@ -247,20 +262,25 @@ def basic_svnmucc(sbox): ['M /boozle/buz/svnmucc-test.py', 'R /boozle/guz/svnmucc-test.py', ], #--------- + '-m', 'log msg', 'put', empty_file, 'boozle/buz/svnmucc-test.py', 'rm', 'boozle/guz/svnmucc-test.py', 'put', empty_file, 'boozle/guz/svnmucc-test.py') # revision 17 test_svnmucc(sbox.repo_url, - ['R /foo/bar (from /foo/foo:16)'], #--------- + ['R /foo/bar (from /foo/foo:16)' + ], #--------- + '-m', 'log msg', 'rm', 'foo/bar', 'cp', '16', 'foo/foo', 'foo/bar', 'propset', 'testprop', 'true', 'foo/bar') # revision 18 test_svnmucc(sbox.repo_url, - ['M /foo/bar'], #--------- + ['M /foo/bar' + ], #--------- + '-m', 'log msg', 'propdel', 'testprop', 'foo/bar') # revision 19 @@ -268,6 +288,7 @@ def basic_svnmucc(sbox): ['M /foo/z.c', 'M /foo/foo', ], #--------- + '-m', 'log msg', 'propset', 'testprop', 'true', 'foo/z.c', 'propset', 'testprop', 'true', 'foo/foo') @@ -276,6 +297,7 @@ def basic_svnmucc(sbox): ['M /foo/z.c', 'M /foo/foo', ], #--------- + '-m', 'log msg', 'propsetf', 'testprop', empty_file, 'foo/z.c', 'propsetf', 'testprop', empty_file, 'foo/foo') @@ -283,6 +305,7 @@ def basic_svnmucc(sbox): xtest_svnmucc(sbox.repo_url, ["svnmucc: E200004: 'a' is not a revision" ], #--------- + '-m', 'log msg', 'cp', 'a', 'b') # Expected cannot be younger error @@ -290,18 +313,21 @@ def basic_svnmucc(sbox): ['svnmucc: E205000: Copy source revision cannot be younger ' + 'than base revision', ], #--------- + '-m', 'log msg', 'cp', '42', 'a', 'b') # Expected already exists error xtest_svnmucc(sbox.repo_url, ["svnmucc: E125002: 'foo' already exists", ], #--------- + '-m', 'log msg', 'cp', '17', 'a', 'foo') # Expected copy_src already exists error xtest_svnmucc(sbox.repo_url, ["svnmucc: E125002: 'a/bar' (from 'foo/bar:17') already exists", ], #--------- + '-m', 'log msg', 'cp', '17', 'foo', 'a', 'cp', '17', 'foo/foo', 'a/bar') @@ -309,12 +335,14 @@ def basic_svnmucc(sbox): xtest_svnmucc(sbox.repo_url, ["svnmucc: E125002: 'a' not found", ], #--------- + '-m', 'log msg', 'cp', '17', 'a', 'b') def propset_root_internal(sbox, target): ## propset on ^/ svntest.actions.run_and_verify_svnmucc(None, None, [], + '-m', 'log msg', 'propset', 'foo', 'bar', target) svntest.actions.run_and_verify_svn(None, 'bar', [], @@ -323,6 +351,7 @@ def propset_root_internal(sbox, target): ## propdel on ^/ svntest.actions.run_and_verify_svnmucc(None, None, [], + '-m', 'log msg', 'propdel', 'foo', target) svntest.actions.run_and_verify_svn(None, [], [], @@ -338,12 +367,58 @@ def propset_root(sbox): propset_root_internal(sbox, sbox.repo_url + '/iota') +def too_many_log_messages(sbox): + "test log message mutual exclusivity checks" + + sbox.build() # would use read-only=True, but need a place to stuff msg_file + msg_file = sbox.ospath('svnmucc_msg') + svntest.main.file_append(msg_file, 'some log message') + err_msg = ["svnmucc: E205000: --message (-m), --file (-F), and " + "--with-revprop=svn:log are mutually exclusive"] + + xtest_svnmucc(sbox.repo_url, err_msg, + '--non-interactive', + '-m', 'log msg', + '-F', msg_file, + 'mkdir', 'A/subdir') + xtest_svnmucc(sbox.repo_url, err_msg, + '--non-interactive', + '-m', 'log msg', + '--with-revprop', 'svn:log=proppy log message', + 'mkdir', 'A/subdir') + xtest_svnmucc(sbox.repo_url, err_msg, + '--non-interactive', + '-F', msg_file, + '--with-revprop', 'svn:log=proppy log message', + 'mkdir', 'A/subdir') + xtest_svnmucc(sbox.repo_url, err_msg, + '--non-interactive', + '-m', 'log msg', + '-F', msg_file, + '--with-revprop', 'svn:log=proppy log message', + 'mkdir', 'A/subdir') + +@Issues(3418) +def no_log_msg_non_interactive(sbox): + "test non-interactive without a log message" + + sbox.build(create_wc=False) + xtest_svnmucc(sbox.repo_url, + ["svnmucc: E205001: Cannot invoke editor to get log message " + "when non-interactive" + ], #--------- + '--non-interactive', + 'mkdir', 'A/subdir') + + ###################################################################### test_list = [ None, reject_bogus_mergeinfo, basic_svnmucc, propset_root, + too_many_log_messages, + no_log_msg_non_interactive, ] if __name__ == '__main__': Modified: subversion/branches/ev2-export/subversion/tests/cmdline/svntest/main.py URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/svntest/main.py?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/tests/cmdline/svntest/main.py (original) +++ subversion/branches/ev2-export/subversion/tests/cmdline/svntest/main.py Sat Dec 22 03:14:36 2012 @@ -651,13 +651,6 @@ def _with_auth(args): else: return args + ('--username', wc_author ) -def _with_log_message(args): - - if '-m' in args or '--message' in args or '-F' in args: - return args - else: - return args + ('--message', 'default log message') - # For running subversion and returning the output def run_svn(error_expected, *varargs): """Run svn with VARARGS; return exit code as int; stdout, stderr as @@ -705,7 +698,7 @@ def run_svnmucc(*varargs): """Run svnmucc with VARARGS, returns exit code as int; stdout, stderr as list of lines (including line terminators). Use binary mode for output.""" return run_command(svnmucc_binary, 1, 1, - *(_with_auth(_with_config_dir(_with_log_message(varargs))))) + *(_with_auth(_with_config_dir(varargs)))) def run_entriesdump(path): """Run the entries-dump helper, returning a dict of Entry objects.""" Modified: subversion/branches/ev2-export/subversion/tests/cmdline/update_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/update_tests.py?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/tests/cmdline/update_tests.py (original) +++ subversion/branches/ev2-export/subversion/tests/cmdline/update_tests.py Sat Dec 22 03:14:36 2012 @@ -5653,7 +5653,6 @@ def update_moved_dir_file_add(sbox): None, None, None, None, None, 1) -@XFail() def update_moved_dir_dir_add(sbox): "update locally moved dir with incoming dir" sbox.build() @@ -5672,8 +5671,9 @@ def update_moved_dir_dir_add(sbox): # the incoming file should auto-merge expected_output = svntest.wc.State(wc_dir, { - 'A/B/E2/foo' : Item(status='A '), - 'A/B/E2/foo/bar' : Item(status='A '), + 'A/B/E' : Item(status=' ', treeconflict='C'), + 'A/B/E/foo' : Item(status=' ', treeconflict='A'), + 'A/B/E/foo/bar' : Item(status=' ', treeconflict='A'), }) expected_disk = svntest.main.greek_state.copy() expected_disk.remove('A/B/E/alpha', 'A/B/E/beta', 'A/B/E') @@ -5681,19 +5681,16 @@ def update_moved_dir_dir_add(sbox): 'A/B/E2' : Item(), 'A/B/E2/alpha' : Item(contents="This is the file 'alpha'.\n"), 'A/B/E2/beta' : Item(contents="This is the file 'beta'.\n"), - 'A/B/E2/foo' : Item(), - 'A/B/E2/foo/bar' : Item(contents=bar_content), }) expected_status = svntest.actions.get_virginal_state(wc_dir, 2) expected_status.tweak('A/B/E', 'A/B/E/alpha', 'A/B/E/beta', status='D ') + expected_status.tweak('A/B/E', treeconflict='C') expected_status.add({ 'A/B/E/foo' : Item(status='D ', wc_rev='2'), 'A/B/E/foo/bar' : Item(status='D ', wc_rev='2'), 'A/B/E2' : Item(status='A ', copied='+', wc_rev='-'), 'A/B/E2/beta' : Item(status=' ', copied='+', wc_rev='-'), 'A/B/E2/alpha' : Item(status=' ', copied='+', wc_rev='-'), - 'A/B/E2/foo' : Item(status='A ', copied='+', wc_rev='-'), - 'A/B/E2/foo/bar' : Item(status='A ', copied='+', wc_rev='-'), }) svntest.actions.run_and_verify_update(wc_dir, expected_output, @@ -5701,6 +5698,16 @@ def update_moved_dir_dir_add(sbox): expected_status, None, None, None, None, None, 1) + svntest.actions.run_and_verify_svn("resolve failed", None, [], + 'resolve', + '--recursive', + '--accept=mine-conflict', wc_dir) + expected_status.tweak(treeconflict=None) + expected_status.add({ + 'A/B/E2/foo' : Item(status=' ', copied='+', wc_rev='-'), + 'A/B/E2/foo/bar' : Item(status=' ', copied='+', wc_rev='-'), + }) + svntest.actions.run_and_verify_status(wc_dir, expected_status) @XFail() @Issue(4037) Modified: subversion/branches/ev2-export/subversion/tests/cmdline/upgrade_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/upgrade_tests.py?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/tests/cmdline/upgrade_tests.py (original) +++ subversion/branches/ev2-export/subversion/tests/cmdline/upgrade_tests.py Sat Dec 22 03:14:36 2012 @@ -1143,18 +1143,21 @@ def upgrade_file_externals(sbox): expected_output = svntest.verify.RegexOutput('r2 committed.*') svntest.actions.run_and_verify_svnmucc(None, expected_output, [], + '-m', 'r2', 'propset', 'svn:externals', '^/A/B/E EX\n^/A/mu muX', sbox.repo_url + '/A/B/F') expected_output = svntest.verify.RegexOutput('r3 committed.*') svntest.actions.run_and_verify_svnmucc(None, expected_output, [], + '-m', 'r3', 'propset', 'svn:externals', '^/A/B/F FX\n^/A/B/lambda lambdaX', sbox.repo_url + '/A/C') expected_output = svntest.verify.RegexOutput('r4 committed.*') svntest.actions.run_and_verify_svnmucc(None, expected_output, [], + '-m', 'r4', 'propset', 'pname1', 'pvalue1', sbox.repo_url + '/A/mu', 'propset', 'pname2', 'pvalue2', Modified: subversion/branches/ev2-export/subversion/tests/libsvn_repos/repos-test.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/libsvn_repos/repos-test.c?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/tests/libsvn_repos/repos-test.c (original) +++ subversion/branches/ev2-export/subversion/tests/libsvn_repos/repos-test.c Sat Dec 22 03:14:36 2012 @@ -1147,6 +1147,60 @@ authz_get_handle(svn_authz_t **authz_p, return SVN_NO_ERROR; } +struct check_access_tests { + const char *path; + const char *repo_name; + const char *user; + const svn_repos_authz_access_t required; + const svn_boolean_t expected; +}; + +/* Helper for the authz test. Runs a set of tests against AUTHZ_CFG + * as defined in TESTS. */ +static svn_error_t * +authz_check_access(svn_authz_t *authz_cfg, + const struct check_access_tests *tests, + apr_pool_t *pool) +{ + int i; + svn_boolean_t access_granted; + + /* Loop over the test array and test each case. */ + for (i = 0; !(tests[i].path == NULL + && tests[i].required == svn_authz_none); i++) + { + SVN_ERR(svn_repos_authz_check_access(authz_cfg, + tests[i].repo_name, + tests[i].path, + tests[i].user, + tests[i].required, + &access_granted, pool)); + + if (access_granted != tests[i].expected) + { + return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, + "Authz incorrectly %s %s%s access " + "to %s%s%s for user %s", + access_granted ? + "grants" : "denies", + tests[i].required + & svn_authz_recursive ? + "recursive " : "", + tests[i].required + & svn_authz_read ? + "read" : "write", + tests[i].repo_name ? + tests[i].repo_name : "", + tests[i].repo_name ? + ":" : "", + tests[i].path, + tests[i].user ? + tests[i].user : "-"); + } + } + + return SVN_NO_ERROR; +} /* Test that authz is giving out the right authorizations. */ @@ -1158,36 +1212,30 @@ authz(apr_pool_t *pool) svn_error_t *err; svn_boolean_t access_granted; apr_pool_t *subpool = svn_pool_create(pool); - int i; + /* Definition of the paths to test and expected replies for each. */ - struct - { - const char *path; - const char *user; - const svn_repos_authz_access_t required; - const svn_boolean_t expected; - } test_set[] = { + struct check_access_tests test_set[] = { /* Test that read rules are correctly used. */ - { "/A", NULL, svn_authz_read, TRUE }, - { "/iota", NULL, svn_authz_read, FALSE }, + { "/A", "greek", NULL, svn_authz_read, TRUE }, + { "/iota", "greek", NULL, svn_authz_read, FALSE }, /* Test that write rules are correctly used. */ - { "/A", "plato", svn_authz_write, TRUE }, - { "/A", NULL, svn_authz_write, FALSE }, + { "/A", "greek", "plato", svn_authz_write, TRUE }, + { "/A", "greek", NULL, svn_authz_write, FALSE }, /* Test that pan-repository rules are found and used. */ - { "/A/B/lambda", "plato", svn_authz_read, TRUE }, - { "/A/B/lambda", NULL, svn_authz_read, FALSE }, + { "/A/B/lambda", "greek", "plato", svn_authz_read, TRUE }, + { "/A/B/lambda", "greek", NULL, svn_authz_read, FALSE }, /* Test that authz uses parent path ACLs if no rule for the path exists. */ - { "/A/C", NULL, svn_authz_read, TRUE }, + { "/A/C", "greek", NULL, svn_authz_read, TRUE }, /* Test that recursive access requests take into account the rules of subpaths. */ - { "/A/D", "plato", svn_authz_read | svn_authz_recursive, TRUE }, - { "/A/D", NULL, svn_authz_read | svn_authz_recursive, FALSE }, + { "/A/D", "greek", "plato", svn_authz_read | svn_authz_recursive, TRUE }, + { "/A/D", "greek", NULL, svn_authz_read | svn_authz_recursive, FALSE }, /* Test global write access lookups. */ - { NULL, "plato", svn_authz_read, TRUE }, - { NULL, NULL, svn_authz_write, FALSE }, + { NULL, "greek", "plato", svn_authz_read, TRUE }, + { NULL, "greek", NULL, svn_authz_write, FALSE }, /* Sentinel */ - { NULL, NULL, svn_authz_none, FALSE } + { NULL, NULL, NULL, svn_authz_none, FALSE } }; /* The test logic: @@ -1242,34 +1290,7 @@ authz(apr_pool_t *pool) SVN_ERR(authz_get_handle(&authz_cfg, contents, subpool)); /* Loop over the test array and test each case. */ - for (i = 0; !(test_set[i].path == NULL - && test_set[i].required == svn_authz_none); i++) - { - SVN_ERR(svn_repos_authz_check_access(authz_cfg, "greek", - test_set[i].path, - test_set[i].user, - test_set[i].required, - &access_granted, subpool)); - - if (access_granted != test_set[i].expected) - { - return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, - "Authz incorrectly %s %s%s access " - "to greek:%s for user %s", - access_granted ? - "grants" : "denies", - test_set[i].required - & svn_authz_recursive ? - "recursive " : "", - test_set[i].required - & svn_authz_read ? - "read" : "write", - test_set[i].path, - test_set[i].user ? - test_set[i].user : "-"); - } - } - + SVN_ERR(authz_check_access(authz_cfg, test_set, subpool)); /* The authz rules for the phase 2 tests, first case (cyclic dependency). */ @@ -1341,6 +1362,119 @@ authz(apr_pool_t *pool) return SVN_NO_ERROR; } + +/* Test in-repo authz paths */ +static svn_error_t * +in_repo_authz(const svn_test_opts_t *opts, + apr_pool_t *pool) +{ + svn_repos_t *repos; + svn_fs_t *fs; + svn_fs_txn_t *txn; + svn_fs_root_t *txn_root; + svn_revnum_t youngest_rev; + svn_authz_t *authz_cfg; + const char *authz_contents; + const char *repos_root; + const char *repos_url; + const char *authz_url; + svn_error_t *err; + struct check_access_tests test_set[] = { + /* reads */ + { "/A", NULL, NULL, svn_authz_read, FALSE }, + { "/A", NULL, "plato", svn_authz_read, TRUE }, + { "/A", NULL, "socrates", svn_authz_read, TRUE }, + /* writes */ + { "/A", NULL, NULL, svn_authz_write, FALSE }, + { "/A", NULL, "socrates", svn_authz_write, FALSE }, + { "/A", NULL, "plato", svn_authz_write, TRUE }, + /* Sentinel */ + { NULL, NULL, NULL, svn_authz_none, FALSE } + }; + + /* Test plan: + * Create an authz file and put it in the repository. + * Verify it can be read with an relative URL. + * Verify it can be read with an absolute URL. + * Verify non-existant path does not error out when must_exist is FALSE. + * Verify non-existant path does error out when must_exist is TRUE. + * Verify that an http:// URL produces an error. + * Verify that an svn:// URL produces an error. + */ + + /* What we'll put in the authz file, it's simple since we're not testing + * the parsing, just that we got what we expected. */ + authz_contents = + "" NL + "" NL + "[/]" NL + "plato = rw" NL + "socrates = r"; + + /* Create a filesystem and repository. */ + SVN_ERR(svn_test__create_repos(&repos, "test-repo-in-repo-authz", + opts, pool)); + fs = svn_repos_fs(repos); + + /* Commit the authz file to the repo. */ + SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool)); + SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool)); + SVN_ERR(svn_fs_make_file(txn_root, "authz", pool)); + SVN_ERR(svn_test__set_file_contents(txn_root, "authz", authz_contents, + pool)); + SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool)); + SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev)); + + /* repos relative URL */ + repos_root = svn_repos_path(repos, pool); + SVN_ERR(svn_repos_authz_read2(&authz_cfg, "^/authz", TRUE, repos_root, + pool)); + SVN_ERR(authz_check_access(authz_cfg, test_set, pool)); + + /* absolute file URL, repos_root is NULL to validate the contract that it + * is not needed except when a repos relative URL is passed. */ + SVN_ERR(svn_uri_get_file_url_from_dirent(&repos_url, repos_root, pool)); + authz_url = apr_pstrcat(pool, repos_url, "/authz", (char *)NULL); + SVN_ERR(svn_repos_authz_read2(&authz_cfg, authz_url, TRUE, NULL, pool)); + SVN_ERR(authz_check_access(authz_cfg, test_set, pool)); + + /* Non-existant path in the repo with must_exist set to FALSE */ + SVN_ERR(svn_repos_authz_read2(&authz_cfg, "^/A/authz", FALSE, repos_root, + pool)); + + /* Non-existant path in the repo with must_exist set to TRUE */ + err = svn_repos_authz_read2(&authz_cfg, "^/A/authz", TRUE, repos_root, + pool); + if (!err || err->apr_err != SVN_ERR_AUTHZ_INVALID_CONFIG) + return svn_error_createf(SVN_ERR_TEST_FAILED, err, + "Got %s error instead of expected " + "SVN_ERR_AUTHZ_INVALID_CONFIG", + err ? "unexpected" : "no"); + svn_error_clear(err); + + /* http:// URL which is unsupported */ + err = svn_repos_authz_read2(&authz_cfg, "http://example.com/repo/authz", + TRUE, repos_root, pool); + if (!err || err->apr_err != SVN_ERR_RA_ILLEGAL_URL) + return svn_error_createf(SVN_ERR_TEST_FAILED, err, + "Got %s error instead of expected " + "SVN_ERR_RA_ILLEGAL_URL", + err ? "unexpected" : "no"); + svn_error_clear(err); + + /* svn:// URL which is unsupported */ + err = svn_repos_authz_read2(&authz_cfg, "svn://example.com/repo/authz", + TRUE, repos_root, pool); + if (!err || err->apr_err != SVN_ERR_RA_ILLEGAL_URL) + return svn_error_createf(SVN_ERR_TEST_FAILED, err, + "Got %s error instead of expected " + "SVN_ERR_RA_ILLEGAL_URL", + err ? "unexpected" : "no"); + svn_error_clear(err); + + + return SVN_NO_ERROR; +} /* Callback for the commit editor tests that relays requests to @@ -2585,6 +2719,8 @@ struct svn_test_descriptor_t test_funcs[ "test removal of defunct locks"), SVN_TEST_PASS2(authz, "test authz access control"), + SVN_TEST_OPTS_PASS(in_repo_authz, + "test authz stored in the repo"), SVN_TEST_OPTS_PASS(commit_editor_authz, "test authz in the commit editor"), SVN_TEST_OPTS_PASS(commit_continue_txn, Modified: subversion/branches/ev2-export/subversion/tests/libsvn_subr/config-test.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/libsvn_subr/config-test.c?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/tests/libsvn_subr/config-test.c (original) +++ subversion/branches/ev2-export/subversion/tests/libsvn_subr/config-test.c Sat Dec 22 03:14:36 2012 @@ -269,6 +269,31 @@ test_has_section_case_sensitive(apr_pool return SVN_NO_ERROR; } + +static svn_error_t * +test_stream_interface(apr_pool_t *pool) +{ + svn_config_t *cfg; + const char *cfg_file; + svn_stream_t *stream; + + if (!srcdir) + SVN_ERR(init_params(pool)); + + cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL); + SVN_ERR(svn_stream_open_readonly(&stream, cfg_file, pool, pool)); + + SVN_ERR(svn_config_parse(&cfg, stream, TRUE, pool)); + + /* nominal test to make sure cfg is populated with something since + * svn_config_parse will happily return an empty cfg if the stream is + * empty. */ + if (! svn_config_has_section(cfg, "section1")) + return fail(pool, "Failed to find section1"); + + return SVN_NO_ERROR; +} + /* ==================================================================== If you add a new test to this file, update this array. @@ -288,5 +313,7 @@ struct svn_test_descriptor_t test_funcs[ "test svn_config_has_section (case insensitive)"), SVN_TEST_PASS2(test_has_section_case_sensitive, "test svn_config_has_section (case sensitive)"), + SVN_TEST_PASS2(test_stream_interface, + "test svn_config_parse"), SVN_TEST_NULL }; Modified: subversion/branches/ev2-export/subversion/tests/libsvn_subr/path-test.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/libsvn_subr/path-test.c?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/subversion/tests/libsvn_subr/path-test.c (original) +++ subversion/branches/ev2-export/subversion/tests/libsvn_subr/path-test.c Sat Dec 22 03:14:36 2012 @@ -1624,6 +1624,71 @@ test_path_condense_targets(apr_pool_t *p return SVN_NO_ERROR; } +static svn_error_t * +test_path_is_repos_relative_url(apr_pool_t *pool) +{ + int i; + struct { + const char* path; + svn_boolean_t result; + } tests[] = { + { "^/A", TRUE }, + { "http://host/A", FALSE }, + { "/A/B", FALSE }, + }; + + for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) + { + svn_boolean_t result = svn_path_is_repos_relative_url(tests[i].path); + + if (tests[i].result != result) + return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, + "svn_path_is_repos_relative_url(\"%s\")" + " returned \"%s\" expected \"%s\"", + tests[i].path, + result ? "TRUE" : "FALSE", + tests[i].result ? "TRUE" : "FALSE"); + } + + return SVN_NO_ERROR; +} + +static svn_error_t * +test_path_resolve_repos_relative_url(apr_pool_t *pool) +{ + int i; + struct { + const char *relative_url; + const char *repos_root_url; + const char *absolute_url; + } tests[] = { + { "^/A", "file:///Z/X", "file:///Z/X/A" }, + { "^/A", "file:///Z/X/", "file:///Z/X//A" }, /* doesn't canonicalize */ + { "^/A@2", "file:///Z/X", "file:///Z/X/A@2" }, /* peg rev */ + { "^/A", "/Z/X", "/Z/X/A" }, /* doesn't verify repos_root is URL */ + }; + + for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) + { + const char *result; + + SVN_ERR(svn_path_resolve_repos_relative_url(&result, + tests[i].relative_url, + tests[i].repos_root_url, + pool)); + + if (strcmp(tests[i].absolute_url,result)) + return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, + "svn_path_resolve_repos_relative_url(\"%s\"," + "\"%s\") returned \"%s\" expected \"%s\"", + tests[i].relative_url, + tests[i].repos_root_url, + result, tests[i].absolute_url); + } + + return SVN_NO_ERROR; +} + /* local define to support XFail-ing tests on Windows/Cygwin only */ #ifdef SVN_USE_DOS_PATHS @@ -1688,5 +1753,9 @@ struct svn_test_descriptor_t test_funcs[ "test svn_path_internal_style"), SVN_TEST_PASS2(test_path_condense_targets, "test svn_path_condense_targets"), + SVN_TEST_PASS2(test_path_is_repos_relative_url, + "test svn_path_is_repos_relative_url"), + SVN_TEST_PASS2(test_path_resolve_repos_relative_url, + "test svn_path_resolve_repos_relative_url"), SVN_TEST_NULL }; Modified: subversion/branches/ev2-export/tools/server-side/svnauthz-validate.c URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/tools/server-side/svnauthz-validate.c?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/tools/server-side/svnauthz-validate.c (original) +++ subversion/branches/ev2-export/tools/server-side/svnauthz-validate.c Sat Dec 22 03:14:36 2012 @@ -34,6 +34,7 @@ #include "svn_pools.h" #include "svn_repos.h" #include "svn_utf.h" +#include "svn_path.h" enum { OPT_USERNAME = SVN_OPT_FIRST_LONGOPT_ID, @@ -49,6 +50,8 @@ usage(const char *argv0) "Optionally prints the access available to USER for FSPATH in\n" "repository with authz name REPOS_NAME. If FSPATH is omitted, reports\n" "whether USER has any access at all.\n" + "FILE can also be an absolute file:// URL to a authz file in a\n" + "repository, but cannot be a repository relative URL (^/).\n" "Returns:\n" " 0 when syntax is OK.\n" " 1 when syntax is invalid.\n" @@ -141,10 +144,15 @@ main(int argc, const char **argv) return 2; } - opts.authz_file = svn_dirent_internal_style(opts.authz_file, pool); + /* Can't accept repos relative urls since we don't have the path to the + * repository and URLs don't need to be converted to internal style. */ + if (svn_path_is_repos_relative_url(opts.authz_file)) + return usage(argv[0]); + else if (!svn_path_is_url(opts.authz_file)) + opts.authz_file = svn_dirent_internal_style(opts.authz_file, pool); /* Read the access file and validate it. */ - err = svn_repos_authz_read(&authz, opts.authz_file, TRUE, pool); + err = svn_repos_authz_read2(&authz, opts.authz_file, TRUE, NULL, pool); /* Optionally, print the access a USER has to a given PATH in REPOS. PATH and REPOS may be NULL. */ Modified: subversion/branches/ev2-export/tools/server-side/svnpubsub/commit-hook.py URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/tools/server-side/svnpubsub/commit-hook.py?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/tools/server-side/svnpubsub/commit-hook.py (original) +++ subversion/branches/ev2-export/tools/server-side/svnpubsub/commit-hook.py Sat Dec 22 03:14:36 2012 @@ -42,11 +42,11 @@ def svncmd_uuid(repo): def svncmd_info(repo, revision): cmd = "%s info -r %s %s" % (SVNLOOK, revision, repo) p = svncmd(cmd) - data = p.stdout.read().strip().split("\n") + data = p.stdout.read().split("\n") #print data - return {'author': data[0], - 'date': data[1], - 'log': "\n".join(data[3:])} + return {'author': data[0].strip(), + 'date': data[1].strip(), + 'log': "\n".join(data[3:]).strip()} def svncmd_dirs(repo, revision): cmd = "%s dirs-changed -r %s %s" % (SVNLOOK, revision, repo) Modified: subversion/branches/ev2-export/tools/server-side/svnpubsub/irkerbridge.py URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/tools/server-side/svnpubsub/irkerbridge.py?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/tools/server-side/svnpubsub/irkerbridge.py (original) +++ subversion/branches/ev2-export/tools/server-side/svnpubsub/irkerbridge.py Sat Dec 22 03:14:36 2012 @@ -145,6 +145,12 @@ class BigDoEverythingClass(object): return result def fill_in_extra_args(self, rev): + # Set any empty members to the string "<null>" + v = vars(rev) + for k in v.keys(): + if not v[k]: + v[k] = '<null>' + # Add entries to the rev object that are useful for # formatting. rev.log_firstline = rev.log.split("\n",1)[0] Modified: subversion/branches/ev2-export/tools/server-side/svnpubsub/rc.d/svnpubsub.freebsd URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/tools/server-side/svnpubsub/rc.d/svnpubsub.freebsd?rev=1425235&r1=1425234&r2=1425235&view=diff ============================================================================== --- subversion/branches/ev2-export/tools/server-side/svnpubsub/rc.d/svnpubsub.freebsd (original) +++ subversion/branches/ev2-export/tools/server-side/svnpubsub/rc.d/svnpubsub.freebsd Sat Dec 22 03:14:36 2012 @@ -20,11 +20,13 @@ svnpubsub_user=${svnpubsub_user-"svn"} svnpubsub_group=${svnpubsub_group-"svn"} svnpubsub_reactor=${svnpubsub_reactor-"poll"} svnpubsub_pidfile=${svnpubsub_pidfile-"/var/run/svnpubsub/svnpubsub.pid"} +svnpubsub_cmd_int=${svnpubsub_cmd_int-"python"} pidfile="${svnpubsub_pidfile}" export PYTHON_EGG_CACHE="/home/svn/.python-eggs" command="/usr/local/bin/twistd" +command_interpreter="/usr/local/bin/${svnwcsub_cmd_int}" command_args="-y /usr/local/svnpubsub/svnpubsub.tac \ --logfile=/var/log/vc/svnpubsub.log \ --pidfile=${pidfile} \
