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(&params.cfg, &params.pwdb, &params.authzdb,
-                             &params.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(&params.cfg, config_filename,
+                                   TRUE, /* must_exist */
+                                   FALSE, /* section_names_case_sensitive */
+                                   pool));
+    }
 
   if (log_filename)
     SVN_INT_ERR(svn_io_file_open(&params.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} \


Reply via email to