On the fsfs-pack branch:fsfs-packfsfs-pack
authorHyrum Kurt Wright <[email protected]>
Mon, 1 Dec 2008 16:31:28 +0000 (1 16:31 +0000)
committerHyrum Kurt Wright <[email protected]>
Mon, 1 Dec 2008 16:31:28 +0000 (1 16:31 +0000)
Bring up-to-date with trunk.

git-svn-id: https://svn.apache.org/repos/asf/subversion/branches/fsfs-pack@874575 13f79535-47bb-0310-9956-ffa450edef68

48 files changed:
build/ac-macros/swig.m4
build/generator/ezt.py
build/generator/gen_base.py
build/generator/gen_vcnet_vcproj.py
build/generator/gen_win.py
build/win32/make_dist.py
gen-make.py
subversion/bindings/ctypes-python/csvn/types.py
subversion/bindings/ctypes-python/examples/log.py
subversion/bindings/ctypes-python/examples/trunkify.py
subversion/bindings/javahl/native/SVNClient.cpp
subversion/bindings/swig/python/tests/mergeinfo.py
subversion/bindings/swig/python/tests/ra.py
subversion/bindings/swig/python/tests/trac/test.py
subversion/bindings/swig/python/tests/wc.py
subversion/include/svn_auth.h
subversion/include/svn_client.h
subversion/include/svn_subst.h
subversion/libsvn_client/deprecated.c
subversion/libsvn_fs_fs/fs_fs.c
subversion/libsvn_ra_serf/util.c
subversion/libsvn_subr/auth.c
subversion/libsvn_subr/cmdline.c
subversion/libsvn_wc/log.c
subversion/libsvn_wc/update_editor.c
subversion/po/pl.po
subversion/svn/main.c
subversion/tests/cmdline/commit_tests.py
subversion/tests/cmdline/depth_tests.py
subversion/tests/cmdline/externals_tests.py
subversion/tests/cmdline/merge_tests.py
subversion/tests/cmdline/svntest/actions.py
subversion/tests/cmdline/switch_tests.py
subversion/tests/cmdline/update_tests.py
subversion/tests/libsvn_subr/auth-test.c
tools/bdb/svn-bdb-view.py
tools/dev/contribulyze.py
tools/dev/gen-javahl-errors.py
tools/dev/graph-dav-servers.py
tools/dev/normalize-dump.py
tools/dev/po-merge.py
tools/dev/trails.py
tools/dev/which-error.py
tools/examples/svnshell.py
tools/hook-scripts/mailer/mailer.py
tools/hook-scripts/svnperms.py
www/images/svn-dav-securityspace-survey.png
www/svn-dav-securityspace-survey.html

index 7c8a80d..c7b94e7 100644 (file)
@@ -75,13 +75,13 @@ AC_DEFUN(SVN_FIND_SWIG,
     #   packages/rpm/rhel-4/subversion.spec
     if test -n "$SWIG_VERSION" &&
        test "$SWIG_VERSION" -ge "103024" &&
-       test "$SWIG_VERSION" -le "103031"; then
+       test "$SWIG_VERSION" -le "103036"; then
       SWIG_SUITABLE=yes
     else
       SWIG_SUITABLE=no
       AC_MSG_WARN([Detected SWIG version $SWIG_VERSION_RAW])
       AC_MSG_WARN([Subversion requires 1.3.24 or later, and is known to work])
-      AC_MSG_WARN([with versions up to 1.3.31])
+      AC_MSG_WARN([with versions up to 1.3.36])
     fi
   fi
  
index 6e443b6..0bbebd0 100755 (executable)
@@ -192,7 +192,7 @@ _re_args = re.compile(r'"(?:[^\\"]|\\.)*"|[-\w.]+')
 
 # block commands and their argument counts
 _block_cmd_specs = { 'if-index':2, 'for':1, 'is':2 }
-_block_cmds = _block_cmd_specs.keys()
+_block_cmds = list(_block_cmd_specs.keys())
 
 # two regular expressions for compressing whitespace. the first is used to
 # compress any whitespace including a newline into a single newline. the
index ec6f842..77b861d 100644 (file)
@@ -234,7 +234,7 @@ class DependencyGraph:
     return sources
 
   def get_deps(self, type):
-    return self.deps[type].items()
+    return list(self.deps[type].items())
 
 # dependency types
 dep_types = [
@@ -581,7 +581,7 @@ class TargetSWIG(TargetLib):
         self.targets[lang] = target
 
     def get_targets(self):
-      return self.targets.values()
+      return list(self.targets.values())
 
     def get_dep_targets(self, target):
       target = self.targets.get(target.lang, None)
index 9d996bf..d5d3107 100644 (file)
@@ -234,7 +234,7 @@ class Generator(gen_win.WinGeneratorBase):
       configs.append(gen_win.ProjectItem(name=self.configs[i], index=i))
 
     # sort the values for output stability.
-    guidvals = guids.values()
+    guidvals = list(guids.values())
     guidvals.sort()
 
     data = {
index e2aac88..63a14cb 100644 (file)
@@ -373,7 +373,7 @@ class WinGeneratorBase(GeneratorBase):
     deps = self.graph.deps[gen_base.DT_LINK]
     deps[dep.name] = deps[target.name]
 
-    for key in deps.iterkeys():
+    for key in deps.keys():
       # Link everything except tests against the dll. Tests need to be linked
       # against the static libraries because they sometimes access internal
       # library functions.
@@ -990,7 +990,7 @@ class WinGeneratorBase(GeneratorBase):
           reldir = ''
         sources[src] = src, obj, reldir
 
-    return sources.values()
+    return list(sources.values())
 
   def write_file_if_changed(self, fname, new_contents):
     """Rewrite the file if new_contents are different than its current content.
index c5e5e3e..e175de1 100644 (file)
@@ -432,7 +432,7 @@ def _make_dist(cfg):
       shutil.rmtree(distdir)
     os.makedirs(distdir)
 
-    dirlist = _disttree.keys()
+    dirlist = list(_disttree.keys())
     dirlist.sort()
 
     for reldir in dirlist:
index 12842c8..d960b61 100755 (executable)
@@ -46,13 +46,13 @@ def main(fname, gentype, verfname=None,
 
   if ('--debug', '') in other_options:
     for dep_type, target_dict in generator.graph.deps.items():
-      sorted_targets = target_dict.keys(); sorted_targets.sort()
+      sorted_targets = list(target_dict.keys()); sorted_targets.sort()
       for target in sorted_targets:
         print(dep_type + ": " + _objinfo(target))
         for source in target_dict[target]:
           print("  " + _objinfo(source))
       print("=" * 72)
-    gen_keys = generator.__dict__.keys()
+    gen_keys = list(generator.__dict__.keys())
     gen_keys.sort()
     for name in gen_keys:
       value = generator.__dict__[name]
@@ -82,7 +82,7 @@ def _usage_exit():
   print("  --reload  reuse all options from the previous invocation")
   print("            of the script, except -s, -t, --debug and --reload")
   print("  -t TYPE   use the TYPE generator; can be one of:")
-  items = gen_modules.items()
+  items = list(gen_modules.items())
   items.sort()
   for name, (module, desc) in items:
     print('            %-12s  %s' % (name, desc))
index cdbcc84..d006438 100644 (file)
@@ -28,6 +28,8 @@ class SvnDate(str):
 class Hash(DictMixin):
     """A dictionary wrapper for apr_hash_t"""
 
+    _keys = DictMixin.iterkeys
+
     def __init__(self, type, items={}, wrapper=None, dup=None):
         self.type = type
         self.pool = Pool()
@@ -68,13 +70,13 @@ class Hash(DictMixin):
         apr_hash_set(self, key, len(key), NULL)
 
     def keys(self):
-        return list(self.iterkeys())
+        return list(self._keys())
 
     def __iter__(self):
-        for (key, _) in self.iteritems():
+        for (key, _) in self.items():
             yield key
 
-    def iteritems(self):
+    def items(self):
         pool = Pool()
         hi = apr_hash_first(pool, self)
         while hi:
index 440329b..0747bca 100755 (executable)
@@ -70,7 +70,7 @@ for entry in \
                                   entry.date.as_human_string(), num_lines))
     if options.verbose:
         print("Changed paths:")
-        for key, value in entry.changed_paths.iteritems():
+        for key, value in entry.changed_paths.items():
             value = value[0]
             if value.copyfrom_rev != SVN_INVALID_REVNUM:
                 print("   %s %s (from %s:%d)" % (value.action, key,
index d26e87d..b817e51 100755 (executable)
@@ -50,7 +50,7 @@ s = RemoteRepository(repos_url, user=User(username=options.username))
 
 txn = s.txn()
 
-for name in s.list("").iterkeys():
+for name in s.list("").keys():
     txn.delete(name)
 
 txn.copy(src_path="", dest_path=new_dir_name)
index 01cce1b..55249a9 100644 (file)
@@ -1164,7 +1164,9 @@ svn_client_ctx_t *SVNClient::getContext(const char *message)
 
     /* Populate the registered providers with the platform-specific providers */
     SVN_JNI_ERR(svn_auth_get_platform_specific_client_providers(&providers,
-                                                                pool), NULL);
+                                                                NULL,
+                                                                pool),
+                NULL);
 
     /* The main disk-caching auth providers, for both
      * 'username/password' creds and 'username' creds.  */
index 8f15daa..c93681c 100644 (file)
@@ -126,9 +126,9 @@ class SubversionMergeinfoTestCase(unittest.TestCase):
                       "Missing revision range 'non-inheritable' flag")
 
   def compare_mergeinfo_catalogs(self, catalog1, catalog2):
-    keys1 = catalog1.keys()
+    keys1 = list(catalog1.keys())
     keys1.sort()
-    keys2 = catalog2.keys()
+    keys2 = list(catalog2.keys())
     keys2.sort()
     self.assertEqual(keys1, keys2)
 
@@ -136,9 +136,9 @@ class SubversionMergeinfoTestCase(unittest.TestCase):
         self.compare_mergeinfos(catalog1[k], catalog2[k])
 
   def compare_mergeinfos(self, mergeinfo1, mergeinfo2):
-    keys1 = mergeinfo1.keys()
+    keys1 = list(mergeinfo1.keys())
     keys1.sort()
-    keys2 = mergeinfo2.keys()
+    keys2 = list(mergeinfo2.keys())
     keys2.sort()
     self.assertEqual(keys1, keys2)
 
index 1370159..3d7c3a9 100644 (file)
@@ -161,7 +161,7 @@ class SubversionRepositoryAccessTestCase(unittest.TestCase):
         if file_baton is not None:
           editor.close_file(file_baton, None, pool)
         return dir_baton
-      delta.path_driver(editor, edit_baton, -1, all_paths.keys(), driver_cb)
+      delta.path_driver(editor, edit_baton, -1, list(all_paths.keys()), driver_cb)
       editor.close_edit(edit_baton)
     except:
       try:
@@ -185,7 +185,7 @@ class SubversionRepositoryAccessTestCase(unittest.TestCase):
       self.assertEqual(author, info.author)
       self.assertEqual(date, info.date)
       self.assertEqual(message, revprops['svn:log'])
-      for (path, change) in changed_paths.iteritems():
+      for (path, change) in changed_paths.items():
         path = path.lstrip('/')
         self.assert_(path in all_paths)
         if path in to_delete:
@@ -287,7 +287,7 @@ class SubversionRepositoryAccessTestCase(unittest.TestCase):
       called[0] = True
       self.assertEqual(log_entry.revision, rev)
       if discover_changed_paths:
-        self.assertEqual(log_entry.changed_paths.keys(), ['/bla3'])
+        self.assertEqual(list(log_entry.changed_paths.keys()), ['/bla3'])
         changed_path = log_entry.changed_paths['/bla3']
         self.assert_(changed_path.action in ['A', 'D', 'R', 'M'])
         self.assertEqual(changed_path.copyfrom_path, None)
@@ -299,7 +299,7 @@ class SubversionRepositoryAccessTestCase(unittest.TestCase):
       elif len(log_revprops) == 0:
         self.assert_(log_entry.revprops == None or len(log_entry.revprops) == 0)
       else:
-        revprop_names = log_entry.revprops.keys()
+        revprop_names = list(log_entry.revprops.keys())
         revprop_names.sort()
         log_revprops.sort()
         self.assertEqual(revprop_names, log_revprops)
index 5e45646..15cb68f 100755 (executable)
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 #
 # Copyright (C) 2003, 2004, 2005 Edgewall Software
 # Copyright (C) 2003, 2004, 2005 Jonas Borgström <[email protected]>
index 110470c..50d99ce 100644 (file)
@@ -188,7 +188,7 @@ class SubversionWorkingCopyTestCase(unittest.TestCase):
   def test_entries_read(self):
       entries = wc.entries_read(self.wc, True)
 
-      self.assertEqual(['', 'tags', 'branches', 'trunk'], entries.keys())
+      self.assertEqual(['', 'tags', 'branches', 'trunk'], list(entries.keys()))
 
   def test_get_ignores(self):
       self.assert_(isinstance(wc.get_ignores(None, self.wc), list))
@@ -301,7 +301,7 @@ class SubversionWorkingCopyTestCase(unittest.TestCase):
     # Save prop changes.
     got_prop_changes = []
     def props_changed(path, propchanges):
-      for (name, value) in propchanges.iteritems():
+      for (name, value) in propchanges.items():
         (kind, unused_prefix_len) = core.svn_property_kind(name)
         if kind != core.svn_prop_regular_kind:
           continue
index 47ef691..2a5c090 100644 (file)
@@ -25,6 +25,7 @@
 #include <apr_pools.h>
 
 #include "svn_types.h"
+#include "svn_config.h"
 #include "svn_version.h"
 
 #ifdef __cplusplus
@@ -793,10 +794,6 @@ svn_auth_get_simple_provider(svn_auth_provider_object_t **provider,
  *
  *    svn_auth_get_<name>_<type>_provider(@a provider, @a pool);
  *
- * In the case of the "gnome_keyring" and the "kwallet" @a platform_type, an
- * error can be thrown in the event that loading the respective shared library
- * fails.
- *
  * @since New in 1.6.
  */
 svn_error_t *
@@ -806,14 +803,14 @@ svn_auth_get_platform_specific_provider(svn_auth_provider_object_t **provider,
                                         apr_pool_t *pool);
 
 /** Create and return an array of <tt>svn_auth_provider_object_t *</tt> objects.
- * Only client auth providers available for the current platform are returned.
+ * Only client authentication providers available for the current platform are
+ * returned. Order of the platform-specific authentication providers is
+ * determined by the 'password-stores' configuration option which is retrieved
+ * from @a config. @a config can be NULL.
  *
  * Create and allocate @a *providers in @a pool.
  *
- * Can throw an error if the platform supports the "gnome_keyring" or the
- * "kwallet" auth provider and loading the respective shared library fails.
- *
- * Order of the platform-specific auth providers:
+ * Default order of the platform-specific authentication providers:
  *   1. gnome-keyring
  *   2. kwallet
  *   3. keychain
@@ -823,6 +820,7 @@ svn_auth_get_platform_specific_provider(svn_auth_provider_object_t **provider,
  */
 svn_error_t *
 svn_auth_get_platform_specific_client_providers(apr_array_header_t **providers,
+                                                svn_config_t *config,
                                                 apr_pool_t *pool);
 
 #if (defined(WIN32) && !defined(__MINGW32__)) || defined(DOXYGEN)
index 794b708..6a100c7 100644 (file)
@@ -1725,7 +1725,7 @@ svn_client_commit4(svn_commit_info_t **commit_info_p,
  * @a changelist_name, FALSE for @a keep_changelist, NULL for @a
  * revprop_table, and @a depth set according to @a recurse: if @a
  * recurse is TRUE, use @c svn_depth_infinity, else @c
- * svn_depth_files.
+ * svn_depth_empty.
  *
  * @deprecated Provided for backward compatibility with the 1.4 API.
  *
index a2621a6..7bf800b 100644 (file)
@@ -396,7 +396,7 @@ svn_subst_copy_and_translate(const char *src,
  * parameters @a *eol_str, @a repair, @a *keywords and @a expand are
  * defined the same as in svn_subst_translate_stream3().
  *
- * If @a special is TRUE, then the stream should define a special fine,
+ * If @a special is TRUE, then the stream should define a special file,
  * and be in "normal form". The file @a dst will then be a special file.
  *
  * The contents will be copied/translated into a temporary file, and then
index e56c203..a1fd5d3 100644 (file)
@@ -297,7 +297,7 @@ svn_client_commit3(svn_commit_info_t **commit_info_p,
                    svn_client_ctx_t *ctx,
                    apr_pool_t *pool)
 {
-  svn_depth_t depth = SVN_DEPTH_INFINITY_OR_FILES(recurse);
+  svn_depth_t depth = SVN_DEPTH_INFINITY_OR_EMPTY(recurse);
 
   return svn_client_commit4(commit_info_p, targets, depth, keep_locks,
                             FALSE, NULL, NULL, ctx, pool);
index c8f3a96..0a86970 100644 (file)
@@ -926,7 +926,7 @@ write_format(const char *path, int format, int max_files_per_dir,
 
   SVN_ERR_ASSERT(1 <= format && format <= SVN_FS_FS__FORMAT_NUMBER);
 
-  sb = svn_stringbuf_create(apr_psprintf(pool, "%d\n", format), pool);
+  sb = svn_stringbuf_createf(pool, "%d\n", format);
 
   if (format >= SVN_FS_FS__MIN_LAYOUT_FORMAT_OPTION_FORMAT)
     {
@@ -934,7 +934,7 @@ write_format(const char *path, int format, int max_files_per_dir,
         svn_stringbuf_appendcstr(sb, apr_psprintf(pool, "layout sharded %d\n",
                                                   max_files_per_dir));
       else
-        svn_stringbuf_appendcstr(sb, "layout linear");
+        svn_stringbuf_appendcstr(sb, "layout linear\n");
     }
 
   contents = svn_string_create_from_buf(sb, pool);
@@ -2369,8 +2369,8 @@ svn_fs_fs__rev_get_root(svn_fs_id_t **root_id_p,
 
   SVN_ERR(ensure_revision_exists(fs, rev, pool));
 
-  SVN_ERR(svn_cache__get((void **) root_id_p, &is_cached, ffd->rev_root_id_cache,
-                         &rev, pool));
+  SVN_ERR(svn_cache__get((void **) root_id_p, &is_cached,
+                         ffd->rev_root_id_cache, &rev, pool));
   if (is_cached)
     return SVN_NO_ERROR;
 
index 2950faa..071d4bc 100644 (file)
@@ -336,7 +336,7 @@ svn_ra_serf__conn_closed(serf_connection_t *conn,
 
   if (why)
     {
-      SVN_ERR_MALFUNCTION();
+      SVN_ERR_MALFUNCTION_NO_RETURN();
     }
 
   if (our_conn->using_ssl)
@@ -1018,7 +1018,7 @@ svn_ra_serf__handle_xml_parser(serf_request_t *request,
   if (sl.code == 404 && ctx->ignore_errors == FALSE)
     {
       /* If our caller won't know about the 404, abort() for now. */
-      SVN_ERR_ASSERT(ctx->status_code);
+      SVN_ERR_ASSERT_NO_RETURN(ctx->status_code);
 
       if (*ctx->done == FALSE)
         {
@@ -1059,7 +1059,7 @@ svn_ra_serf__handle_xml_parser(serf_request_t *request,
         {
           XML_ParserFree(ctx->xmlp);
 
-          SVN_ERR_ASSERT(ctx->status_code);
+          SVN_ERR_ASSERT_NO_RETURN(ctx->status_code);
 
           if (*ctx->done == FALSE)
             {
index 3290ebf..cb4184a 100644 (file)
@@ -24,6 +24,7 @@
 #include "svn_types.h"
 #include "svn_error.h"
 #include "svn_auth.h"
+#include "svn_config.h"
 #include "svn_private_config.h"
 #include "svn_dso.h"
 
@@ -478,79 +479,129 @@ svn_auth_get_platform_specific_provider(svn_auth_provider_object_t **provider,
 
 svn_error_t *
 svn_auth_get_platform_specific_client_providers(apr_array_header_t **providers,
+                                                svn_config_t *config,
                                                 apr_pool_t *pool)
 {
   svn_auth_provider_object_t *provider;
+  const char *password_stores_config_option;
+  apr_array_header_t *password_stores;
+  int i;
+
+  if (config)
+    {
+      svn_config_get(config,
+                     &password_stores_config_option,
+                     SVN_CONFIG_SECTION_AUTH,
+                     SVN_CONFIG_OPTION_PASSWORD_STORES,
+                     "gnome-keyring,kwallet,keychain,windows-cryptoapi");
+    }
+  else
+    {
+      password_stores_config_option = "gnome-keyring,kwallet,keychain,windows-cryptoapi";
+    }
 
   *providers = apr_array_make(pool, 12, sizeof(svn_auth_provider_object_t *));
 
-  /* Gnome Keyring */
-  SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
-                                                  "gnome_keyring",
-                                                  "simple",
-                                                  pool));
-
-  if (provider)
-    APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
-
-  SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
-                                                  "gnome_keyring",
-                                                  "ssl_client_cert_pw",
-                                                  pool));
-
-  if (provider)
-    APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
-
-  /* Kwallet */
-  SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
-                                                  "kwallet",
-                                                  "simple",
-                                                  pool));
-
-  if (provider)
-    APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
-
-  SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
-                                                  "kwallet",
-                                                  "ssl_client_cert_pw",
-                                                  pool));
-
-  if (provider)
-    APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
-
-  /* Keychain */
-  SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
-                                                  "keychain",
-                                                  "simple",
-                                                  pool));
-
-  if (provider)
-    APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
-
-  SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
-                                                  "keychain",
-                                                  "ssl_client_cert_pw",
-                                                  pool));
-
-  if (provider)
-    APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
-
-  /* Windows */
-  SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
-                                                  "windows",
-                                                  "simple",
-                                                  pool));
-
-  if (provider)
-    APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
-
-  SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
-                                                  "windows",
-                                                  "ssl_client_cert_pw",
-                                                  pool));
-
-  if (provider)
-    APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
+  password_stores
+    = svn_cstring_split(password_stores_config_option, " ,", TRUE, pool);
+
+  for (i = 0; i < password_stores->nelts; i++)
+    {
+      const char *password_store = APR_ARRAY_IDX(password_stores, i,
+                                                 const char *);
+
+
+      /* GNOME Keyring */
+      if (apr_strnatcmp(password_store, "gnome-keyring") == 0)
+        {
+          SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
+                                                          "gnome_keyring",
+                                                          "simple",
+                                                          pool));
+
+          if (provider)
+            APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
+
+          SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
+                                                          "gnome_keyring",
+                                                          "ssl_client_cert_pw",
+                                                          pool));
+
+          if (provider)
+            APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
+
+          continue;
+        }
+
+      /* KWallet */
+      if (apr_strnatcmp(password_store, "kwallet") == 0)
+        {
+          SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
+                                                          "kwallet",
+                                                          "simple",
+                                                          pool));
+
+          if (provider)
+            APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
+
+          SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
+                                                          "kwallet",
+                                                          "ssl_client_cert_pw",
+                                                          pool));
+          if (provider)
+            APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
+
+          continue;
+        }
+
+      /* Keychain */
+      if (apr_strnatcmp(password_store, "keychain") == 0)
+        {
+          SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
+                                                          "keychain",
+                                                          "simple",
+                                                          pool));
+
+          if (provider)
+            APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
+
+          SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
+                                                          "keychain",
+                                                          "ssl_client_cert_pw",
+                                                          pool));
+
+          if (provider)
+            APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
+
+          continue;
+        }
+
+      /* Windows */
+      if (apr_strnatcmp(password_store, "windows-cryptoapi") == 0)
+        {
+          SVN_ERR(svn_auth_get_platform_specific_provider(&provider,
+                                                          "windows",
+                                                          "simple",
+                                                          pool));
+
+          if (provider)
+            APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
+
+          SVN_ERR(svn_auth_get_platform_specific_provider(&provider, "windows",
+                                                          "ssl_client_cert_pw",
+                                                          pool));
+
+          if (provider)
+            APR_ARRAY_PUSH(*providers, svn_auth_provider_object_t *) = provider;
+
+          continue;
+        }
+
+      return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, NULL,
+                               _("Invalid config: unknown password store "
+                                 "'%s'"),
+                               password_store);
+    }
 
   return SVN_NO_ERROR;
 }
index 4dca9af..97c3a12 100644 (file)
@@ -410,7 +410,9 @@ svn_cmdline_create_auth_baton(svn_auth_baton_t **ab,
   apr_array_header_t *providers;
 
   /* Populate the registered providers with the platform-specific providers */
-  SVN_ERR(svn_auth_get_platform_specific_client_providers(&providers, pool));
+  SVN_ERR(svn_auth_get_platform_specific_client_providers(&providers,
+                                                          cfg,
+                                                          pool));
 
   /* If we have a cancellation function, cram it and the stuff it
      needs into the prompt baton. */
index a0e66b0..9866cd5 100644 (file)
@@ -1500,11 +1500,9 @@ log_do_add_tree_conflict(struct log_runner *loggy,
 {
   apr_array_header_t *new_conflicts;
   const svn_wc_conflict_description_t *new_conflict;
-  const char* dir_path =svn_wc_adm_access_path(loggy->adm_access);
+  const char *dir_path = svn_wc_adm_access_path(loggy->adm_access);
 
   /* Convert the text data to a conflict. */
-  new_conflict = apr_pcalloc(loggy->pool,
-                             sizeof(svn_wc_conflict_description_t *));
   new_conflicts = apr_array_make(loggy->pool, 1,
                                  sizeof(svn_wc_conflict_description_t *));
   SVN_ERR(svn_wc__read_tree_conflicts(&new_conflicts,
@@ -1521,7 +1519,7 @@ log_do_add_tree_conflict(struct log_runner *loggy,
     return svn_error_create(SVN_ERR_WC_CORRUPT, NULL,
                          _("Attempt to add tree conflict that already exists"));
 
-  /* Copy the new conflict to to the result pool.  Add its pointer to
+  /* Copy the new conflict to the result pool.  Add its pointer to
      the array of existing conflicts. */
   APR_ARRAY_PUSH(loggy->tree_conflicts,
                  const svn_wc_conflict_description_t *) = 
index d1f8d40..4739977 100644 (file)
@@ -219,16 +219,11 @@ struct edit_baton
   svn_wc_get_file_t fetch_func;
   void *fetch_baton;
 
-  /* Paths that were skipped during the edit, and therefore shouldn't
+  /* Subtrees that were skipped during the edit, and therefore shouldn't
      have their revision/url info updated at the end.  If a path is a
      directory, its descendants will also be skipped.  The keys are
      pathnames and the values unspecified. */
-  apr_hash_t *skipped_paths;
-
-  /* Path of the tree- or prop-conflicted directory, if the edit is
-     currently inside a conflicted tree.  NULL if the edit is not
-     inside a conflicted tree. */
-  const char *current_conflict;
+  apr_hash_t *skipped_trees;
 
   apr_pool_t *pool;
 };
@@ -236,16 +231,33 @@ struct edit_baton
 
 /* Record in the edit baton EB that PATH's base version is not being updated.
  *
- * Add to EB->skipped_paths a copy (allocated in EB->pool) of the string
+ * Add to EB->skipped_trees a copy (allocated in EB->pool) of the string
  * PATH.
  */
 static void
-remember_skipped_path(struct edit_baton *eb, const char *path)
+remember_skipped_tree(struct edit_baton *eb, const char *path)
 {
-  apr_hash_set(eb->skipped_paths, apr_pstrdup(eb->pool, path),
+  apr_hash_set(eb->skipped_trees, apr_pstrdup(eb->pool, path),
                APR_HASH_KEY_STRING, (void*)1);
 }
 
+/* Return TRUE if PATH or any of its ancestor is in the set of skipped
+ * trees, otherwise return FALSE.  Use SCRATCH_POOL for allocations. */
+static svn_boolean_t
+in_skipped_tree(struct edit_baton *eb, 
+                const char *path,
+                apr_pool_t *scratch_pool)
+{
+  while (! svn_path_is_empty(path))
+    {
+      if (apr_hash_get(eb->skipped_trees, path, APR_HASH_KEY_STRING))
+        return TRUE;
+
+      path = svn_path_dirname(path, scratch_pool);
+    }
+
+  return FALSE;
+}
 
 struct dir_baton
 {
@@ -582,7 +594,7 @@ complete_directory(struct edit_baton *eb,
   const char *name;
 
   /* If inside a tree conflict, do nothing. */
-  if (eb->current_conflict)
+  if (in_skipped_tree(eb, path, pool))
     return SVN_NO_ERROR;
 
   /* If this is the root directory and there is a target, we can't
@@ -1264,24 +1276,30 @@ static svn_error_t *
 entry_has_local_mods(svn_boolean_t *modified,
                      svn_wc_adm_access_t *adm_access,
                      svn_node_kind_t kind,
+                     svn_wc_schedule_t schedule,
                      const char *full_path,
                      apr_pool_t *pool)
 {
-  svn_boolean_t text_modified;
-  svn_boolean_t props_modified;
-
-  /* Check for text modifications */
-  if (kind == svn_node_file)
-    SVN_ERR(svn_wc_text_modified_p(&text_modified, full_path, FALSE,
-                                   adm_access, pool));
+  if (schedule != svn_wc_schedule_normal)
+    *modified = TRUE;
   else
-    text_modified = FALSE;
+    {
+      svn_boolean_t text_modified;
+      svn_boolean_t props_modified;
+
+      /* Check for text modifications */
+      if (kind == svn_node_file)
+        SVN_ERR(svn_wc_text_modified_p(&text_modified, full_path, FALSE,
+                                       adm_access, pool));
+      else
+        text_modified = FALSE;
 
-  /* Check for property modifications */
-  SVN_ERR(svn_wc_props_modified_p(&props_modified, full_path,
-                                  adm_access, pool));
+      /* Check for property modifications */
+      SVN_ERR(svn_wc_props_modified_p(&props_modified, full_path,
+                                      adm_access, pool));
 
-  *modified = (text_modified || props_modified);
+      *modified = (text_modified || props_modified);
+    }
   return SVN_NO_ERROR;
 }
 
@@ -1321,7 +1339,9 @@ modcheck_found_entry(const char *path,
         return err;
     }
 
-  SVN_ERR(entry_has_local_mods(&modified, adm_access, entry->kind, path, pool));
+  SVN_ERR(entry_has_local_mods(&modified, adm_access, entry->kind, 
+                               entry->schedule, path, pool));
+
   if (modified)
     baton->found_mod = TRUE;
 
@@ -1442,7 +1462,8 @@ check_tree_conflict(svn_wc_conflict_description_t **pconflict,
           /* Use case 2: Deleting a locally-modified item. */
           if (entry->kind == svn_node_file)
             SVN_ERR(entry_has_local_mods(&modified, parent_adm_access, 
-                                         entry->kind, full_path, pool));
+                                         entry->kind, entry->schedule,
+                                         full_path, pool));
 
           else if (entry->kind == svn_node_dir)
             {
@@ -1686,15 +1707,8 @@ do_entry_deletion(struct edit_baton *eb,
 
   /* Is an ancestor-dir (already visited by this edit) a tree conflict
      victim?  If so, skip without notification. */
-  if (eb->current_conflict)
-    {
-      SVN_ERR_ASSERT(svn_path_is_ancestor(eb->current_conflict,
-                                          full_path));
-
-      remember_skipped_path(eb, full_path);
-
-      return SVN_NO_ERROR;
-    }
+  if (in_skipped_tree(eb, full_path, pool))
+    return SVN_NO_ERROR;
 
   /* Is this path, or an ancestor-dir NOT visited by this edit, already
      marked as a tree conflict victim? */
@@ -1719,7 +1733,7 @@ do_entry_deletion(struct edit_baton *eb,
 
   if (victim_path != NULL || tree_conflict != NULL)
     {
-      remember_skipped_path(eb, full_path);
+      remember_skipped_tree(eb, full_path);
       
       /* ### TODO: Also print victim_path in the skip msg. */
       if (eb->notify_func)
@@ -1924,15 +1938,8 @@ add_directory(const char *path,
 
   /* Is an ancestor-dir (already visited by this edit) a tree conflict
      victim?  If so, skip without notification. */
-  if (eb->current_conflict)
-    {
-      SVN_ERR_ASSERT(svn_path_is_ancestor(eb->current_conflict,
-                                          full_path));
-
-      remember_skipped_path(eb, full_path);
-
-      return SVN_NO_ERROR;
-    }
+  if (in_skipped_tree(eb, full_path, pool))
+    return SVN_NO_ERROR;
 
   /* Is this path, or an ancestor-dir NOT visited by this edit, already
      marked as a tree conflict victim? */
@@ -1942,8 +1949,7 @@ add_directory(const char *path,
   if (victim_path != NULL)
     {
       /* Record this conflict so that its descendants are skipped silently. */
-      eb->current_conflict = victim_path;
-      remember_skipped_path(eb, full_path);
+      remember_skipped_tree(eb, full_path);
       
       /* ### TODO: Also print victim_path in the skip msg. */
       if (eb->notify_func)
@@ -2037,11 +2043,9 @@ add_directory(const char *path,
 
               if (tree_conflict != NULL)
                 {
-                  /* Record this conflict so that its descendants are skipped silently. */
-                  eb->current_conflict = apr_pstrdup(pool,
-                                                          tree_conflict->path);
-
-                  remember_skipped_path(eb, full_path);
+                  /* Record this conflict so that its descendants are
+                     skipped silently. */
+                  remember_skipped_tree(eb, full_path);
 
                   /* ### TODO: Also print victim_path in the skip msg. */
                   if (eb->notify_func)
@@ -2229,13 +2233,9 @@ open_directory(const char *path,
  
   /* Is an ancestor-dir (already visited by this edit) a tree conflict
      victim?  If so, skip the tree without notification. */
-  if (eb->current_conflict)
+  if (in_skipped_tree(eb, full_path, pool))
     {
-      SVN_ERR_ASSERT(svn_path_is_ancestor(eb->current_conflict,
-                                          full_path));
-
       db->bump_info->skipped = TRUE;
-      remember_skipped_path(eb, full_path);
 
       return SVN_NO_ERROR;
     }
@@ -2246,10 +2246,7 @@ open_directory(const char *path,
                                      eb->cancel_baton, pool));
 
   if (victim_path != NULL)
-    {
-      eb->current_conflict = victim_path;
-      tree_conflict = NULL;
-    }
+    tree_conflict = NULL;
   else
     /* Is this path a fresh tree conflict victim?  If so, skip the tree
        with one notification. */
@@ -2262,13 +2259,10 @@ open_directory(const char *path,
   SVN_ERR(svn_wc_conflicted_p2(NULL, &prop_conflicted, NULL, full_path,
                                adm_access, pool));
 
-  if (tree_conflict != NULL || prop_conflicted)
-    eb->current_conflict = full_path;
-
   if (victim_path != NULL || tree_conflict != NULL || prop_conflicted)
     {  
       db->bump_info->skipped = TRUE;
-      remember_skipped_path(eb, full_path);
+      remember_skipped_tree(eb, full_path);
       
       if (eb->notify_func)
         {
@@ -2386,16 +2380,12 @@ close_directory(void *dir_baton,
   apr_hash_t *base_props = NULL, *working_props = NULL;
   svn_wc_adm_access_t *adm_access;
 
-  /* Skip if we're in a conflicted tree.  Remove the tree-conflict flag if
-     we're closing the victim directory. */
-  if (db->edit_baton->current_conflict)
+  /* Skip if we're in a conflicted tree. */
+  if (in_skipped_tree(db->edit_baton, db->path, pool))
     {
       /* Allow the parent to complete its update. */
       SVN_ERR(maybe_bump_dir_info(db->edit_baton, db->bump_info, db->pool));
 
-      if (strcmp(db->edit_baton->current_conflict, db->path) == 0)
-        db->edit_baton->current_conflict = NULL;
-
       return SVN_NO_ERROR;
     }
 
@@ -3024,13 +3014,9 @@ add_file(const char *path,
 
   /* Is an ancestor-dir (already visited by this edit) a tree conflict
      victim?  If so, skip without notification. */
-  if (eb->current_conflict)
+  if (in_skipped_tree(eb, full_path, pool))
     {
-      SVN_ERR_ASSERT(svn_path_is_ancestor(eb->current_conflict,
-                                          full_path));
-
       fb->skipped = TRUE;
-      remember_skipped_path(eb, full_path);
 
       return SVN_NO_ERROR;
     }
@@ -3062,7 +3048,7 @@ add_file(const char *path,
   if (victim_path != NULL || tree_conflict != NULL)
     {
       fb->skipped = TRUE;
-      remember_skipped_path(eb, full_path);
+      remember_skipped_tree(eb, full_path);
       
       /* ### TODO: Also print victim_path in the skip msg. */
       if (eb->notify_func)
@@ -3199,13 +3185,9 @@ open_file(const char *path,
 
   /* Is an ancestor-dir (already visited by this edit) a tree conflict
      victim?  If so, skip without notification. */
-  if (eb->current_conflict)
+  if (in_skipped_tree(eb, full_path, pool))
     {
-      SVN_ERR_ASSERT(svn_path_is_ancestor(eb->current_conflict,
-                                          full_path));
-
       fb->skipped = TRUE;
-      remember_skipped_path(eb, full_path);
 
       return SVN_NO_ERROR;
     }
@@ -3232,7 +3214,7 @@ open_file(const char *path,
       || prop_conflicted)
     {
       fb->skipped = TRUE;
-      remember_skipped_path(eb, full_path);
+      remember_skipped_tree(eb, full_path);
       
       /* ### TODO: Also print victim_path in the t-c skip msg. */
       if (eb->notify_func)
@@ -4130,7 +4112,7 @@ close_edit(void *edit_baton,
                                       *(eb->target_revision),
                                       eb->notify_func,
                                       eb->notify_baton,
-                                      TRUE, eb->skipped_paths,
+                                      TRUE, eb->skipped_trees,
                                       eb->pool));
 
   /* The edit is over, free its pool.
@@ -4221,9 +4203,8 @@ make_editor(svn_revnum_t *target_revision,
   eb->fetch_func               = fetch_func;
   eb->fetch_baton              = fetch_baton;
   eb->allow_unver_obstructions = allow_unver_obstructions;
-  eb->skipped_paths            = apr_hash_make(subpool);
+  eb->skipped_trees            = apr_hash_make(subpool);
   eb->ext_patterns             = preserved_exts;
-  eb->current_conflict         = NULL;
 
   /* Construct an editor. */
   tree_editor->set_target_revision = set_target_revision;
index fb8d36d..5cc354f 100644 (file)
@@ -38,8 +38,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: subversion 1.6\n"
 "Report-Msgid-Bugs-To: [email protected]\n"
-"POT-Creation-Date: 2008-11-23 20:00+0100\n"
-"PO-Revision-Date: 2008-11-23 20:00+0100\n"
+"POT-Creation-Date: 2008-11-30 02:00+0100\n"
+"PO-Revision-Date: 2008-11-30 02:00+0100\n"
 "Last-Translator: Subversion Developers <[email protected]>\n"
 "Language-Team: Polish <[email protected]>\n"
 "MIME-Version: 1.0\n"
@@ -1411,7 +1411,7 @@ msgstr "'%s' leży w miejscu pliku podlegającego zarządzaniu wersjami"
 
 #: ../libsvn_client/delete.c:56 ../libsvn_wc/adm_ops.c:3131
 #: ../libsvn_wc/entries.c:1519 ../libsvn_wc/entries.c:2673
-#: ../libsvn_wc/entries.c:3291 ../libsvn_wc/update_editor.c:3597
+#: ../libsvn_wc/entries.c:3291 ../libsvn_wc/update_editor.c:3689
 #, c-format
 msgid "'%s' is not under version control"
 msgstr "'%s' nie podlega zarządzaniu wersjami"
@@ -1480,8 +1480,8 @@ msgstr "%s\t(kopia robocza)"
 msgid "Cannot display: file marked as a binary type.%s"
 msgstr "Nie można wyświetlić: plik binarny.%s"
 
-#: ../libsvn_client/diff.c:924 ../libsvn_client/merge.c:4805
-#: ../libsvn_client/merge.c:6502
+#: ../libsvn_client/diff.c:924 ../libsvn_client/merge.c:4886
+#: ../libsvn_client/merge.c:6584
 msgid "Not all required revisions are specified"
 msgstr "Nie wszystkie wymagane wersje zostały podane"
 
@@ -1531,7 +1531,7 @@ msgid "'%s' already exists"
 msgstr "'%s' już istnieje"
 
 #: ../libsvn_client/export.c:735 ../libsvn_wc/adm_crawler.c:959
-#: ../libsvn_wc/update_editor.c:3283 ../libsvn_wc/update_editor.c:3949
+#: ../libsvn_wc/update_editor.c:3375 ../libsvn_wc/update_editor.c:4042
 #, c-format
 msgid "Checksum mismatch for '%s'; expected: '%s', actual: '%s'"
 msgstr "Błąd sumy kontrolnej dla '%s'; oczekiwana: '%s', faktyczna: '%s'"
@@ -1616,9 +1616,9 @@ msgstr "URL '%s' nie istnieje w tej wersji"
 msgid "No common parent found, unable to operate on disjoint arguments"
 msgstr "Nie znaleziono wspólnego rodzica, nie można użyć rozłącznych argumentów"
 
-#: ../libsvn_client/locking_commands.c:265 ../libsvn_client/merge.c:6519
-#: ../libsvn_client/merge.c:6525 ../libsvn_client/merge.c:7426
-#: ../libsvn_client/merge.c:7610 ../libsvn_client/ra.c:400
+#: ../libsvn_client/locking_commands.c:265 ../libsvn_client/merge.c:6601
+#: ../libsvn_client/merge.c:6607 ../libsvn_client/merge.c:7508
+#: ../libsvn_client/merge.c:7692 ../libsvn_client/ra.c:400
 #: ../libsvn_client/ra.c:432 ../libsvn_client/ra.c:635
 #, c-format
 msgid "'%s' has no URL"
@@ -1675,25 +1675,25 @@ msgstr "Łączenie różnych schematów dostępu nie jest obsługiwane ('%s' i '
 #. xgettext: the '.working', '.merge-left.r%ld' and
 #. '.merge-right.r%ld' strings are used to tag onto a file
 #. name in case of a merge conflict
-#: ../libsvn_client/merge.c:1081
+#: ../libsvn_client/merge.c:1126
 msgid ".working"
 msgstr ".robocza"
 
-#: ../libsvn_client/merge.c:1083
+#: ../libsvn_client/merge.c:1128
 #, c-format
 msgid ".merge-left.r%ld"
 msgstr ".merge-lewo.w%ld"
 
-#: ../libsvn_client/merge.c:1086
+#: ../libsvn_client/merge.c:1131
 #, c-format
 msgid ".merge-right.r%ld"
 msgstr ".merge-prawo.w%ld"
 
-#: ../libsvn_client/merge.c:2763
+#: ../libsvn_client/merge.c:2798
 msgid "Cannot reverse-merge a range from a path's own future history; try updating first"
 msgstr "Nie można połączyć odwróconych zmian z własnej przyszłości ścieżki. Spróbuj najpierw zaktualizować kopię roboczą"
 
-#: ../libsvn_client/merge.c:3254
+#: ../libsvn_client/merge.c:3335
 #, c-format
 msgid ""
 "One or more conflicts were produced while merging r%ld:%ld into\n"
@@ -1706,50 +1706,50 @@ msgstr ""
 "rozwiąż wszystkie konflikty i uruchom merge ponownie, by zastosować\n"
 "pozostałe wersje"
 
-#: ../libsvn_client/merge.c:6201
+#: ../libsvn_client/merge.c:6283
 msgid "Use of two URLs is not compatible with mergeinfo modification"
 msgstr "Użycie dwu URL-i jest niekompatybilne z modyfikacją informacji o połączeniach zmian"
 
-#: ../libsvn_client/merge.c:6208 ../libsvn_client/merge.c:6438
+#: ../libsvn_client/merge.c:6290 ../libsvn_client/merge.c:6520
 msgid "Merge from foreign repository is not compatible with mergeinfo modification"
 msgstr "Łączenie zmian z zewnętrznego repozytorium jest niekompatybilne z modyfikacją informacji o połączeniach zmian"
 
-#: ../libsvn_client/merge.c:6717
+#: ../libsvn_client/merge.c:6799
 msgid "Cannot reintegrate into a working copy with a switched subtree"
 msgstr "Nie można reintegrować do kopii roboczej z przełączonym poddrzewem"
 
-#: ../libsvn_client/merge.c:6722
+#: ../libsvn_client/merge.c:6804
 msgid "Cannot reintegrate into a working copy not entirely at infinite depth"
 msgstr "Nie można reintegrować do kopii roboczej z niecałkowicie nieskończoną głębokością"
 
-#: ../libsvn_client/merge.c:6727
+#: ../libsvn_client/merge.c:6809
 msgid "Cannot reintegrate into a working copy that has local modifications"
 msgstr "Nie można reintegrować do kopii roboczej posiadającej lokalne modyfikacje"
 
-#: ../libsvn_client/merge.c:6733
+#: ../libsvn_client/merge.c:6815
 msgid "Cannot determine revision of working copy"
 msgstr "Nie można określić wersji kopii roboczej"
 
-#: ../libsvn_client/merge.c:6737
+#: ../libsvn_client/merge.c:6819
 msgid "Cannot reintegrate into mixed-revision working copy; try updating first"
 msgstr "Nie można reintegrować do kopii roboczej z mieszanymi wersjami. Spróbuj najpierw zaktualizować kopię roboczą"
 
-#: ../libsvn_client/merge.c:6816
+#: ../libsvn_client/merge.c:6898
 #, c-format
 msgid "At least one revision (r%ld) not yet merged from '%s'"
 msgstr "Przynajmniej jedna wersja (r%ld) niepołączona jeszcze z '%s'"
 
-#: ../libsvn_client/merge.c:7291 ../libsvn_client/merge.c:7497
+#: ../libsvn_client/merge.c:7373 ../libsvn_client/merge.c:7579
 #, c-format
 msgid "'%s@%ld' must be ancestrally related to '%s@%ld'"
 msgstr "'%s@%ld' musi być spokrewnione z '%s@%ld'"
 
-#: ../libsvn_client/merge.c:7444
+#: ../libsvn_client/merge.c:7526
 #, c-format
 msgid "'%s' must be from the same repository as '%s'"
 msgstr "'%s' musi być z tego samego repozytorium co '%s'"
 
-#: ../libsvn_client/merge.c:7521
+#: ../libsvn_client/merge.c:7603
 #, c-format
 msgid ""
 "Reintegrate can only be used if revisions %ld through %ld were previously merged from %s to the reintegrate source, but this is not the case:\n"
@@ -1863,7 +1863,7 @@ msgid "Cannot both exclude and switch a path"
 msgstr "Nie można zarówno wykluczyć, jak i przełączyć ścieżki"
 
 #: ../libsvn_client/switch.c:170 ../libsvn_ra_local/ra_plugin.c:193
-#: ../libsvn_ra_local/ra_plugin.c:268 ../libsvn_wc/update_editor.c:4108
+#: ../libsvn_ra_local/ra_plugin.c:268 ../libsvn_wc/update_editor.c:4206
 #, c-format
 msgid ""
 "'%s'\n"
@@ -2034,17 +2034,17 @@ msgstr "tworzenie zmiany"
 msgid "deleting changes"
 msgstr "usuwanie zmian"
 
-#: ../libsvn_fs_base/bdb/changes-table.c:143 ../libsvn_fs_fs/fs_fs.c:3335
+#: ../libsvn_fs_base/bdb/changes-table.c:143 ../libsvn_fs_fs/fs_fs.c:3346
 msgid "Missing required node revision ID"
 msgstr "Brak wymaganego ID wersji obiektu"
 
-#: ../libsvn_fs_base/bdb/changes-table.c:154 ../libsvn_fs_fs/fs_fs.c:3345
+#: ../libsvn_fs_base/bdb/changes-table.c:154 ../libsvn_fs_fs/fs_fs.c:3356
 msgid "Invalid change ordering: new node revision ID without delete"
 msgstr ""
 "Niewłaściwy porządek zmian: ID nowego węzła wersji nie jest\n"
 "zmianą typu usunięcie ścieżki"
 
-#: ../libsvn_fs_base/bdb/changes-table.c:164 ../libsvn_fs_fs/fs_fs.c:3356
+#: ../libsvn_fs_base/bdb/changes-table.c:164 ../libsvn_fs_fs/fs_fs.c:3367
 msgid "Invalid change ordering: non-add change on deleted path"
 msgstr ""
 "Niewłaściwy porządek zmian: zmiana typu non-add poprzedza\n"
@@ -2617,7 +2617,7 @@ msgid "Conflict at '%s'"
 msgstr "Konflikt z '%s'"
 
 #: ../libsvn_fs_base/tree.c:2022 ../libsvn_fs_base/tree.c:2773
-#: ../libsvn_fs_fs/tree.c:1222 ../libsvn_fs_fs/tree.c:1775
+#: ../libsvn_fs_fs/tree.c:1222 ../libsvn_fs_fs/tree.c:1773
 msgid "Bad merge; ancestor, source, and target not all in same fs"
 msgstr "Złe łączenie; przodek, źródłowy obiekt i docelowy obiekt nie mają tego samego typu systemu plików"
 
@@ -2636,20 +2636,20 @@ msgstr "Transakcja '%s' jest nieaktualna względem wersji '%s'"
 msgid "Cannot deltify revisions prior to r%ld"
 msgstr "Nie można zdeltyfikować wersji wcześniejszych od r%ld"
 
-#: ../libsvn_fs_base/tree.c:2974 ../libsvn_fs_fs/tree.c:1910
+#: ../libsvn_fs_base/tree.c:2974 ../libsvn_fs_fs/tree.c:1908
 msgid "The root directory cannot be deleted"
 msgstr "Katalog główny nie może zostać usunięty"
 
-#: ../libsvn_fs_base/tree.c:3193 ../libsvn_fs_fs/tree.c:1991
+#: ../libsvn_fs_base/tree.c:3193 ../libsvn_fs_fs/tree.c:1989
 #, c-format
 msgid "Cannot copy between two different filesystems ('%s' and '%s')"
 msgstr "Nie można porównać pomiędzy dwoma różnymi systemami plików ('%s' i '%s')"
 
-#: ../libsvn_fs_base/tree.c:3202 ../libsvn_fs_fs/tree.c:1997
+#: ../libsvn_fs_base/tree.c:3202 ../libsvn_fs_fs/tree.c:1995
 msgid "Copy from mutable tree not currently supported"
 msgstr "Kopiowanie ze zmiennego drzewa nie jest obecnie obsługiwane"
 
-#: ../libsvn_fs_base/tree.c:3701 ../libsvn_fs_fs/tree.c:2444
+#: ../libsvn_fs_base/tree.c:3701 ../libsvn_fs_fs/tree.c:2442
 #, c-format
 msgid ""
 "Base checksum mismatch on '%s':\n"
@@ -2660,12 +2660,12 @@ msgstr ""
 "   oczekiwano:     %s\n"
 "    wyliczono:     %s\n"
 
-#: ../libsvn_fs_base/tree.c:3951 ../libsvn_fs_fs/tree.c:2676
+#: ../libsvn_fs_base/tree.c:3951 ../libsvn_fs_fs/tree.c:2674
 msgid "Cannot compare file contents between two different filesystems"
 msgstr "Nie można porównać zawartości pliku w dwóch różnych systemach plików"
 
 #: ../libsvn_fs_base/tree.c:3960 ../libsvn_fs_base/tree.c:3965
-#: ../libsvn_fs_fs/tree.c:2685 ../libsvn_fs_fs/tree.c:2690
+#: ../libsvn_fs_fs/tree.c:2683 ../libsvn_fs_fs/tree.c:2688
 #: ../libsvn_ra/compat.c:676
 #, c-format
 msgid "'%s' is not a file"
@@ -2710,33 +2710,33 @@ msgstr ""
 "   oczekiwano:     %s\n"
 "    wyliczono:     %s\n"
 
-#: ../libsvn_fs_fs/dag.c:1120
+#: ../libsvn_fs_fs/dag.c:1122
 msgid "Empty noderev in cache"
 msgstr "Pusty rodzaj węzła w schowku pamięciowym"
 
-#: ../libsvn_fs_fs/dag.c:1130
+#: ../libsvn_fs_fs/dag.c:1132
 msgid "Kindless noderev in cache"
 msgstr "Nieprawidłowy rodzaj węzła w schowku pamięciowym"
 
-#: ../libsvn_fs_fs/dag.c:1137
+#: ../libsvn_fs_fs/dag.c:1139
 #, c-format
 msgid "Unknown kind for noderev in cache: '%c'"
 msgstr "Nieznany rodzaj węzła w schowku pamięciowym: '%c'"
 
-#: ../libsvn_fs_fs/dag.c:1144
+#: ../libsvn_fs_fs/dag.c:1146
 msgid "Unterminated ID in cache"
 msgstr "Niezakończony ID w schowku pamięciowym"
 
-#: ../libsvn_fs_fs/dag.c:1149
+#: ../libsvn_fs_fs/dag.c:1151
 #, c-format
 msgid "Bogus ID '%s' in cache"
 msgstr "Niepoprawny ID '%s' w schowku pamięciowym"
 
-#: ../libsvn_fs_fs/dag.c:1156
+#: ../libsvn_fs_fs/dag.c:1158
 msgid "No created path"
 msgstr "Brak utworzonej ścieżki"
 
-#: ../libsvn_fs_fs/dag.c:1182
+#: ../libsvn_fs_fs/dag.c:1184
 #, c-format
 msgid "Unknown node type in cache: '%c'"
 msgstr "Nieznany rodzaj obiektu w schowku pamięciowym: '%c'"
@@ -2850,104 +2850,104 @@ msgstr "Nie można odczytać pierwszej linii z formatowego pliku '%s'"
 msgid "'%s' contains invalid filesystem format option '%s'"
 msgstr "'%s' zawiera niepoprawną opcję '%s' formatu systemu plików"
 
-#: ../libsvn_fs_fs/fs_fs.c:964
+#: ../libsvn_fs_fs/fs_fs.c:961
 #, c-format
 msgid "Expected FS format between '1' and '%d'; found format '%d'"
 msgstr "Oczekiwany format systemu plików pomiędzy '1' a '%d'; znaleziony format '%d'"
 
-#: ../libsvn_fs_fs/fs_fs.c:1454 ../libsvn_fs_fs/fs_fs.c:1468
+#: ../libsvn_fs_fs/fs_fs.c:1451 ../libsvn_fs_fs/fs_fs.c:1465
 msgid "Found malformed header in revision file"
 msgstr "Błędny nagłówek w pliku wersji"
 
-#: ../libsvn_fs_fs/fs_fs.c:1502
+#: ../libsvn_fs_fs/fs_fs.c:1499
 #, c-format
 msgid "Invalid revision number '%ld'"
 msgstr "Nieprawidłowy numer wersji '%ld'"
 
-#: ../libsvn_fs_fs/fs_fs.c:1517 ../libsvn_fs_fs/fs_fs.c:2206
-#: ../libsvn_fs_fs/fs_fs.c:2286 ../libsvn_repos/log.c:1622
+#: ../libsvn_fs_fs/fs_fs.c:1514 ../libsvn_fs_fs/fs_fs.c:2214
+#: ../libsvn_fs_fs/fs_fs.c:2294 ../libsvn_repos/log.c:1622
 #: ../libsvn_repos/log.c:1626
 #, c-format
 msgid "No such revision %ld"
 msgstr "Nie ma takiej wersji %ld"
 
-#: ../libsvn_fs_fs/fs_fs.c:1609 ../libsvn_fs_fs/fs_fs.c:1623
-#: ../libsvn_fs_fs/fs_fs.c:1630 ../libsvn_fs_fs/fs_fs.c:1637
-#: ../libsvn_fs_fs/fs_fs.c:1645 ../libsvn_fs_fs/fs_fs.c:1659
+#: ../libsvn_fs_fs/fs_fs.c:1606 ../libsvn_fs_fs/fs_fs.c:1620
+#: ../libsvn_fs_fs/fs_fs.c:1627 ../libsvn_fs_fs/fs_fs.c:1634
+#: ../libsvn_fs_fs/fs_fs.c:1642 ../libsvn_fs_fs/fs_fs.c:1655
 msgid "Malformed text rep offset line in node-rev"
 msgstr "Błędny offset reprezentacji w node-rev"
 
-#: ../libsvn_fs_fs/fs_fs.c:1731
+#: ../libsvn_fs_fs/fs_fs.c:1727
 msgid "Missing id field in node-rev"
 msgstr "Brak pola id w node-rev"
 
-#: ../libsvn_fs_fs/fs_fs.c:1743
+#: ../libsvn_fs_fs/fs_fs.c:1739
 msgid "Missing kind field in node-rev"
 msgstr "Brak pola kind w node-rev"
 
-#: ../libsvn_fs_fs/fs_fs.c:1774
+#: ../libsvn_fs_fs/fs_fs.c:1770
 msgid "Missing cpath in node-rev"
 msgstr "Brak cpath w node-rev"
 
-#: ../libsvn_fs_fs/fs_fs.c:1801 ../libsvn_fs_fs/fs_fs.c:1807
+#: ../libsvn_fs_fs/fs_fs.c:1797 ../libsvn_fs_fs/fs_fs.c:1803
 msgid "Malformed copyroot line in node-rev"
 msgstr "Błędna linia copyroot w node-rev"
 
-#: ../libsvn_fs_fs/fs_fs.c:1825 ../libsvn_fs_fs/fs_fs.c:1831
+#: ../libsvn_fs_fs/fs_fs.c:1821 ../libsvn_fs_fs/fs_fs.c:1827
 msgid "Malformed copyfrom line in node-rev"
 msgstr "Błędna linia copyfrom w node-rev"
 
-#: ../libsvn_fs_fs/fs_fs.c:1978 ../libsvn_fs_fs/fs_fs.c:4677
+#: ../libsvn_fs_fs/fs_fs.c:1986 ../libsvn_fs_fs/fs_fs.c:4688
 msgid "Attempted to write to non-transaction"
 msgstr "Próba zapisu do nietransakcji"
 
-#: ../libsvn_fs_fs/fs_fs.c:2064
+#: ../libsvn_fs_fs/fs_fs.c:2072
 msgid "Malformed representation header"
 msgstr "Błędny nagłówek reprezentacji"
 
-#: ../libsvn_fs_fs/fs_fs.c:2090
+#: ../libsvn_fs_fs/fs_fs.c:2098
 msgid "Missing node-id in node-rev"
 msgstr "Brak node-id w node-rev"
 
-#: ../libsvn_fs_fs/fs_fs.c:2096
+#: ../libsvn_fs_fs/fs_fs.c:2104
 msgid "Corrupt node-id in node-rev"
 msgstr "Błędny node-id w node-rev"
 
-#: ../libsvn_fs_fs/fs_fs.c:2141
+#: ../libsvn_fs_fs/fs_fs.c:2149
 #, c-format
 msgid "Revision file lacks trailing newline"
 msgstr "W pliku wersji brak końcowego znaku końca wiersza"
 
-#: ../libsvn_fs_fs/fs_fs.c:2153
+#: ../libsvn_fs_fs/fs_fs.c:2161
 #, c-format
 msgid "Final line in revision file longer than 64 characters"
 msgstr "Ostatnia linia w pliku wersji dłuższa niż 64 znaki"
 
-#: ../libsvn_fs_fs/fs_fs.c:2168
+#: ../libsvn_fs_fs/fs_fs.c:2176
 msgid "Final line in revision file missing space"
 msgstr "Brak spacji w ostatniej linii pliku wersji"
 
-#: ../libsvn_fs_fs/fs_fs.c:2360
+#: ../libsvn_fs_fs/fs_fs.c:2368
 msgid "Malformed svndiff data in representation"
 msgstr "Błędne dane svndiff w reprezentacji"
 
-#: ../libsvn_fs_fs/fs_fs.c:2549 ../libsvn_fs_fs/fs_fs.c:2562
+#: ../libsvn_fs_fs/fs_fs.c:2560 ../libsvn_fs_fs/fs_fs.c:2573
 msgid "Reading one svndiff window read beyond the end of the representation"
 msgstr "Podczas czytania danych okna svndiff przekroczono koniec reprezentacji"
 
-#: ../libsvn_fs_fs/fs_fs.c:2702
+#: ../libsvn_fs_fs/fs_fs.c:2713
 msgid "svndiff data requested non-existent source"
 msgstr "Żądane dane svndiff wskazują na nieistniejące źródło"
 
-#: ../libsvn_fs_fs/fs_fs.c:2708
+#: ../libsvn_fs_fs/fs_fs.c:2719
 msgid "svndiff requested position beyond end of stream"
 msgstr "Żądana pozycja svndiff jest poza końcem strumienia"
 
-#: ../libsvn_fs_fs/fs_fs.c:2731 ../libsvn_fs_fs/fs_fs.c:2748
+#: ../libsvn_fs_fs/fs_fs.c:2742 ../libsvn_fs_fs/fs_fs.c:2759
 msgid "svndiff window length is corrupt"
 msgstr "Błędne okno danych svndiff"
 
-#: ../libsvn_fs_fs/fs_fs.c:2799
+#: ../libsvn_fs_fs/fs_fs.c:2810
 #, c-format
 msgid ""
 "Checksum mismatch while reading representation:\n"
@@ -2958,105 +2958,105 @@ msgstr ""
 "   oczekiwano:  %s\n"
 "   znaleziono:  %s\n"
 
-#: ../libsvn_fs_fs/fs_fs.c:3101 ../libsvn_fs_fs/fs_fs.c:3114
-#: ../libsvn_fs_fs/fs_fs.c:3120 ../libsvn_fs_fs/fs_fs.c:5844
-#: ../libsvn_fs_fs/fs_fs.c:5853 ../libsvn_fs_fs/fs_fs.c:5859
+#: ../libsvn_fs_fs/fs_fs.c:3112 ../libsvn_fs_fs/fs_fs.c:3125
+#: ../libsvn_fs_fs/fs_fs.c:3131 ../libsvn_fs_fs/fs_fs.c:5855
+#: ../libsvn_fs_fs/fs_fs.c:5864 ../libsvn_fs_fs/fs_fs.c:5870
 msgid "Directory entry corrupt"
 msgstr "Uszkodzony wpis w katalogu"
 
-#: ../libsvn_fs_fs/fs_fs.c:3501 ../libsvn_fs_fs/fs_fs.c:3506
-#: ../libsvn_fs_fs/fs_fs.c:3512 ../libsvn_fs_fs/fs_fs.c:3544
-#: ../libsvn_fs_fs/fs_fs.c:3564 ../libsvn_fs_fs/fs_fs.c:3598
-#: ../libsvn_fs_fs/fs_fs.c:3603
+#: ../libsvn_fs_fs/fs_fs.c:3512 ../libsvn_fs_fs/fs_fs.c:3517
+#: ../libsvn_fs_fs/fs_fs.c:3523 ../libsvn_fs_fs/fs_fs.c:3555
+#: ../libsvn_fs_fs/fs_fs.c:3575 ../libsvn_fs_fs/fs_fs.c:3609
+#: ../libsvn_fs_fs/fs_fs.c:3614
 msgid "Invalid changes line in rev-file"
 msgstr "Niewłaściwa linia zmian w pliku wersji"
 
-#: ../libsvn_fs_fs/fs_fs.c:3537
+#: ../libsvn_fs_fs/fs_fs.c:3548
 msgid "Invalid change kind in rev file"
 msgstr "Niewłaściwy rodzaj zmiany w pliku wersji"
 
-#: ../libsvn_fs_fs/fs_fs.c:3557
+#: ../libsvn_fs_fs/fs_fs.c:3568
 msgid "Invalid text-mod flag in rev-file"
 msgstr "Niewłaściwa flaga text-mod w pliku wersji"
 
-#: ../libsvn_fs_fs/fs_fs.c:3577
+#: ../libsvn_fs_fs/fs_fs.c:3588
 msgid "Invalid prop-mod flag in rev-file"
 msgstr "Niewłaściwa flaga prop-mod w pliku wersji"
 
-#: ../libsvn_fs_fs/fs_fs.c:3763
+#: ../libsvn_fs_fs/fs_fs.c:3774
 msgid "Copying from transactions not allowed"
 msgstr "Kopiowanie z transakcji niedozwolone"
 
-#: ../libsvn_fs_fs/fs_fs.c:3919
+#: ../libsvn_fs_fs/fs_fs.c:3930
 #, c-format
 msgid "Unable to create transaction directory in '%s' for revision %ld"
 msgstr "Nie można utworzyć katalogu transakcji w '%s' dla wersji %ld"
 
-#: ../libsvn_fs_fs/fs_fs.c:4126 ../libsvn_fs_fs/fs_fs.c:4133
+#: ../libsvn_fs_fs/fs_fs.c:4137 ../libsvn_fs_fs/fs_fs.c:4144
 msgid "next-id file corrupt"
 msgstr "Plik next-id jest uszkodzony"
 
-#: ../libsvn_fs_fs/fs_fs.c:4243
+#: ../libsvn_fs_fs/fs_fs.c:4254
 msgid "Transaction cleanup failed"
 msgstr "Nie powiodło się sprzątanie po transakcji"
 
-#: ../libsvn_fs_fs/fs_fs.c:4350
+#: ../libsvn_fs_fs/fs_fs.c:4361
 msgid "Invalid change type"
 msgstr "Niewłaściwy typ zmiany"
 
-#: ../libsvn_fs_fs/fs_fs.c:4696
+#: ../libsvn_fs_fs/fs_fs.c:4707
 msgid "Can't set text contents of a directory"
 msgstr "Nie można ustawić tekstowej zawartości katalogu"
 
-#: ../libsvn_fs_fs/fs_fs.c:4780 ../libsvn_fs_fs/fs_fs.c:4785
-#: ../libsvn_fs_fs/fs_fs.c:4792
+#: ../libsvn_fs_fs/fs_fs.c:4791 ../libsvn_fs_fs/fs_fs.c:4796
+#: ../libsvn_fs_fs/fs_fs.c:4803
 msgid "Corrupt current file"
 msgstr "Bieżący plik jest uszkodzony"
 
-#: ../libsvn_fs_fs/fs_fs.c:5100 ../libsvn_subr/io.c:2872 ../svn/util.c:383
+#: ../libsvn_fs_fs/fs_fs.c:5111 ../libsvn_subr/io.c:2872 ../svn/util.c:383
 #: ../svn/util.c:398 ../svn/util.c:422
 #, c-format
 msgid "Can't stat '%s'"
 msgstr "Nie można pobrać informacji o '%s'"
 
-#: ../libsvn_fs_fs/fs_fs.c:5104
+#: ../libsvn_fs_fs/fs_fs.c:5115
 #, c-format
 msgid "Can't chmod '%s'"
 msgstr "Nie można ustawić uprawnień '%s'"
 
-#: ../libsvn_fs_fs/fs_fs.c:5331
+#: ../libsvn_fs_fs/fs_fs.c:5342
 msgid "Transaction out of date"
 msgstr "Transakcja jest nieaktualna"
 
-#: ../libsvn_fs_fs/fs_fs.c:5785
+#: ../libsvn_fs_fs/fs_fs.c:5796
 msgid "Recovery encountered a non-directory node"
 msgstr "Odzyskiwanie spotkało węzeł niekatalogu"
 
-#: ../libsvn_fs_fs/fs_fs.c:5807
+#: ../libsvn_fs_fs/fs_fs.c:5818
 msgid "Recovery encountered a deltified directory representation"
 msgstr "Odzyskiwanie spotkało zróżnicowaną reprezentację katalogu"
 
-#: ../libsvn_fs_fs/fs_fs.c:5952
+#: ../libsvn_fs_fs/fs_fs.c:5963
 #, c-format
 msgid "Expected current rev to be <= %ld but found %ld"
 msgstr "Oczekiwano, że obecna wersja to <= %ld, ale znaleziono %ld"
 
-#: ../libsvn_fs_fs/fs_fs.c:6005
+#: ../libsvn_fs_fs/fs_fs.c:6016
 #, c-format
 msgid "Revision %ld has a revs file but no revprops file"
 msgstr "Wersja %ld posiada plik revs, ale nie posiada pliku revprops"
 
-#: ../libsvn_fs_fs/fs_fs.c:6010
+#: ../libsvn_fs_fs/fs_fs.c:6021
 #, c-format
 msgid "Revision %ld has a non-file where its revprops file should be"
 msgstr "Wersja %ld posiada nieplik, gdzie jej plik revprops powinien być"
 
-#: ../libsvn_fs_fs/fs_fs.c:6187
+#: ../libsvn_fs_fs/fs_fs.c:6198
 #, c-format
 msgid "Node origin for '%s' exists with a different value (%s) than what we were about to store (%s)"
 msgstr "Pochodzenie węzła dla '%s' istnieje z inną wartością (%s) niż ta, którą prawie mieliśmy zapisać (%s)"
 
-#: ../libsvn_fs_fs/fs_fs.c:6296
+#: ../libsvn_fs_fs/fs_fs.c:6307
 msgid "No such transaction"
 msgstr "Brak takiej transakcji"
 
@@ -3094,17 +3094,17 @@ msgstr "Klucz reprezentacji dla sumy kontrolnej '%%s' istnieje w systemie plikó
 msgid "Representation for hash '%s' not found"
 msgstr "Reprezentacja dla mieszanki '%s' nieznaleziona"
 
-#: ../libsvn_fs_fs/tree.c:3423
+#: ../libsvn_fs_fs/tree.c:3421
 #, c-format
 msgid "Node-revision #'%s' claims to have mergeinfo but doesn't"
 msgstr "Node-revision #'%s' twierdzi, że ma informacje o połączeniach zmian, ale nie ma ich"
 
-#: ../libsvn_fs_fs/tree.c:3546
+#: ../libsvn_fs_fs/tree.c:3544
 #, c-format
 msgid "Node-revision '%s@%ld' claims to have mergeinfo but doesn't"
 msgstr "Node-revision '%s@%ld' twierdzi, że ma informacje o połączeniach zmian, ale nie ma ich"
 
-#: ../libsvn_fs_fs/tree.c:3667
+#: ../libsvn_fs_fs/tree.c:3665
 #, c-format
 msgid "Querying mergeinfo requires version %d of the FSFS filesystem schema; filesystem '%s' uses only version %d"
 msgstr "Sprawdzanie informacji o połączeniach zmian wymaga wersję %d schematu systemu plików FSFS. System plików '%s' używa tylko wersję %d"
@@ -3253,13 +3253,13 @@ msgid "The CHECKOUT response did not contain a 'Location:' header"
 msgstr "Odpowiedź CHECKOUT nie zawierała nagłówka 'Location:'"
 
 #: ../libsvn_ra_neon/commit.c:513 ../libsvn_ra_neon/props.c:210
-#: ../libsvn_ra_neon/util.c:520 ../libsvn_ra_serf/commit.c:1288
-#: ../libsvn_ra_serf/commit.c:1690 ../libsvn_ra_serf/update.c:2029
+#: ../libsvn_ra_neon/util.c:520 ../libsvn_ra_serf/commit.c:1291
+#: ../libsvn_ra_serf/commit.c:1693 ../libsvn_ra_serf/update.c:2029
 #, c-format
 msgid "Unable to parse URL '%s'"
 msgstr "Nie można parsować URL-u: '%s'"
 
-#: ../libsvn_ra_neon/commit.c:1037 ../libsvn_ra_serf/commit.c:1539
+#: ../libsvn_ra_neon/commit.c:1037 ../libsvn_ra_serf/commit.c:1542
 #, c-format
 msgid "File '%s' already exists"
 msgstr "Plik '%s' już istnieje"
@@ -3296,7 +3296,7 @@ msgstr ""
 msgid "Server response missing the expected deadprop-count property"
 msgstr "Brak oczekiwanego atrybutu deadprop-count w odpowiedzi serwera"
 
-#: ../libsvn_ra_neon/fetch.c:1168 ../libsvn_ra_serf/commit.c:2063
+#: ../libsvn_ra_neon/fetch.c:1168 ../libsvn_ra_serf/commit.c:2066
 msgid "DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent"
 msgstr "Żądanie DAV nie powiodło się; prawdopodobnie skrypt pre-revprop-change nie istnieje lub zgłosił błąd w trakcie działania"
 
@@ -3553,7 +3553,7 @@ msgstr "Brak DAV:baseline-collection w bazowym obiekcie"
 msgid "'%s' was not present on the baseline resource"
 msgstr "'%s' nie był obecny w zasobie baseline"
 
-#: ../libsvn_ra_neon/props.c:1154 ../libsvn_ra_serf/commit.c:773
+#: ../libsvn_ra_neon/props.c:1154 ../libsvn_ra_serf/commit.c:776
 msgid "At least one property change failed; repository is unchanged"
 msgstr "Co najmniej jedna zmiana atrybutu nie powiodła się. Repozytorium nie uległo żadnym zmianom"
 
@@ -3740,46 +3740,46 @@ msgstr "Dla żądania '%s' otrzymano niepoprawny wynikowy XML: %s (%s)"
 msgid "Missing 'realm' attribute in Authorization header"
 msgstr "Brak atrybutu 'realm' w nagłówku Authorization"
 
-#: ../libsvn_ra_serf/commit.c:403 ../libsvn_ra_serf/commit.c:426
+#: ../libsvn_ra_serf/commit.c:406 ../libsvn_ra_serf/commit.c:429
 #, c-format
 msgid "Directory '%s' is out of date; try updating"
 msgstr "Katalog '%s' jest nieaktualny. Spróbuj zaktualizować"
 
-#: ../libsvn_ra_serf/commit.c:504 ../libsvn_repos/commit.c:388
+#: ../libsvn_ra_serf/commit.c:507 ../libsvn_repos/commit.c:388
 #, c-format
 msgid "Path '%s' not present"
 msgstr "Ścieżka '%s' nie istnieje"
 
-#: ../libsvn_ra_serf/commit.c:589 ../libsvn_ra_serf/commit.c:603
+#: ../libsvn_ra_serf/commit.c:592 ../libsvn_ra_serf/commit.c:606
 #, c-format
 msgid "File '%s' is out of date; try updating"
 msgstr "Plik '%s' jest nieaktualny. Spróbuj aktualizować"
 
-#: ../libsvn_ra_serf/commit.c:974
+#: ../libsvn_ra_serf/commit.c:977
 #, c-format
 msgid "Failed writing updated file"
 msgstr "Zapis zaktualizowanego pliku nie powiódł się"
 
-#: ../libsvn_ra_serf/commit.c:1026
+#: ../libsvn_ra_serf/commit.c:1029
 msgid "The OPTIONS response did not include the requested activity-collection-set value"
 msgstr "Odpowiedź OPTIONS nie zawiera wymaganej wartości activity-collection-set"
 
-#: ../libsvn_ra_serf/commit.c:1054
+#: ../libsvn_ra_serf/commit.c:1057
 #, c-format
 msgid "%s of '%s': %d %s (%s://%s)"
 msgstr "%s z '%s': %d %s (%s://%s)"
 
-#: ../libsvn_ra_serf/commit.c:1082 ../libsvn_ra_serf/property.c:963
+#: ../libsvn_ra_serf/commit.c:1085 ../libsvn_ra_serf/property.c:963
 #: ../libsvn_ra_serf/update.c:1128 ../libsvn_ra_serf/update.c:1671
 msgid "The OPTIONS response did not include the requested checked-in value"
 msgstr "Odpowiedź OPTIONS nie zawiera wymaganej wartości checked-in"
 
-#: ../libsvn_ra_serf/commit.c:1308 ../libsvn_ra_serf/commit.c:1710
+#: ../libsvn_ra_serf/commit.c:1311 ../libsvn_ra_serf/commit.c:1713
 #: ../libsvn_ra_serf/property.c:977
 msgid "The OPTIONS response did not include the requested baseline-collection value"
 msgstr "Odpowiedź OPTIONS nie zawiera wymaganej wartości baseline-collection"
 
-#: ../libsvn_ra_serf/commit.c:1334
+#: ../libsvn_ra_serf/commit.c:1337
 #, c-format
 msgid "Adding a directory failed: %s on %s (%d)"
 msgstr "Dodawanie katalogu nie powiodło się: %s na %s (%d)"
@@ -4694,6 +4694,11 @@ msgstr "Nie można odczytać ścieżki; dostęp zabroniony"
 msgid "'%s' is not a file in revision %ld"
 msgstr "'%s' nie jest plikiem w wersji %ld"
 
+#: ../libsvn_subr/auth.c:601
+#, c-format
+msgid "Invalid config: unknown password store '%s'"
+msgstr "Błąd konfiguracji: nieznane miejsce przechowywania haseł '%s'"
+
 #: ../libsvn_subr/cache-inprocess.c:179
 #, c-format
 msgid "Can't lock cache mutex"
@@ -4753,12 +4758,7 @@ msgstr "Nieznany błąd podczas dodawania serwera do memcache"
 msgid "Unknown error creating apr_memcache_t"
 msgstr "Nieznany błąd podczas tworzenia apr_memcache_t"
 
-#: ../libsvn_subr/cmdline.c:525
-#, c-format
-msgid "Invalid config: unknown password store '%s'"
-msgstr "Błąd konfiguracji: nieznane miejsce przechowywania haseł '%s'"
-
-#: ../libsvn_subr/cmdline.c:688
+#: ../libsvn_subr/cmdline.c:586
 #, c-format
 msgid "Error initializing command line arguments"
 msgstr "Błąd podczas inicjalizacji argumentów linii poleceń"
@@ -5327,19 +5327,19 @@ msgstr "Nie znaleziono końca linii w linii listy zakresu w '%s'"
 msgid "Could not parse mergeinfo string '%s'"
 msgstr "Nie można parsować ciągu znaków '%s' informacji o połączeniach zmian"
 
-#: ../libsvn_subr/mergeinfo.c:1579
+#: ../libsvn_subr/mergeinfo.c:1583
 msgid "NULL mergeinfo catalog\n"
 msgstr "NULL katalog informacji o połączeniach zmian\n"
 
-#: ../libsvn_subr/mergeinfo.c:1587
+#: ../libsvn_subr/mergeinfo.c:1591
 msgid "empty mergeinfo catalog\n"
 msgstr "Pusty katalog informacji o połączeniach zmian\n"
 
-#: ../libsvn_subr/mergeinfo.c:1620
+#: ../libsvn_subr/mergeinfo.c:1624
 msgid "NULL mergeinfo\n"
 msgstr "NULL informacja o połączeniach zmian\n"
 
-#: ../libsvn_subr/mergeinfo.c:1627
+#: ../libsvn_subr/mergeinfo.c:1631
 msgid "empty mergeinfo\n"
 msgstr "Pusta informacja o połączeniach zmian\n"
 
@@ -5432,7 +5432,7 @@ msgstr "'%s' nie jest ani nazwą pliku ani katalogu"
 msgid "Can't determine the native path encoding"
 msgstr "Nie można ustalić natywnego kodowania ścieżki"
 
-#: ../libsvn_subr/path.c:1142
+#: ../libsvn_subr/path.c:1138
 #, c-format
 msgid "Invalid control character '0x%02x' in path '%s'"
 msgstr "Błędny znak kontrolny '0x%02x' w ścieżce '%s'"
@@ -6177,123 +6177,123 @@ msgstr "Brak 'lewego' atrybutu w '%s'"
 msgid "Missing 'right' attribute in '%s'"
 msgstr "Brak 'prawego' atrybutu w '%s'"
 
-#: ../libsvn_wc/log.c:616
+#: ../libsvn_wc/log.c:617
 #, c-format
 msgid "Missing 'dest' attribute in '%s'"
 msgstr "Brak atrybutu 'cel' w '%s'"
 
-#: ../libsvn_wc/log.c:693
+#: ../libsvn_wc/log.c:694
 #, c-format
 msgid "Missing 'timestamp' attribute in '%s'"
 msgstr "Brak atrybutu 'timestamp' w '%s'"
 
-#: ../libsvn_wc/log.c:789 ../libsvn_wc/props.c:532
+#: ../libsvn_wc/log.c:790 ../libsvn_wc/props.c:532
 #, c-format
 msgid "Error getting 'affected time' on '%s'"
 msgstr "Błąd uzyskiwania czasu modyfikacji '%s'"
 
-#: ../libsvn_wc/log.c:837
+#: ../libsvn_wc/log.c:838
 #, c-format
 msgid "Error getting file size on '%s'"
 msgstr "Błąd uzyskiwania rozmiaru pliku '%s'"
 
-#: ../libsvn_wc/log.c:855
+#: ../libsvn_wc/log.c:856
 #, c-format
 msgid "Error modifying entry for '%s'"
 msgstr "Błąd przy modyfikacji informacji o '%s'"
 
-#: ../libsvn_wc/log.c:881
+#: ../libsvn_wc/log.c:882
 #, c-format
 msgid "Error removing lock from entry for '%s'"
 msgstr "Błąd podczas usuwania blokady dla '%s'"
 
-#: ../libsvn_wc/log.c:904
+#: ../libsvn_wc/log.c:905
 #, c-format
 msgid "Error removing changelist from entry '%s'"
 msgstr "Błąd podczas usuwania listy zmian z wpisu '%s'"
 
-#: ../libsvn_wc/log.c:1083
+#: ../libsvn_wc/log.c:1084
 #, c-format
 msgid "Missing 'revision' attribute for '%s'"
 msgstr "Brak atrybutu 'revision' dla '%s'"
 
-#: ../libsvn_wc/log.c:1107
+#: ../libsvn_wc/log.c:1108
 #, c-format
 msgid "Log command for directory '%s' is mislocated"
 msgstr "Polecenie log dla katalogu '%s' jest niepoprawnie umieszczone"
 
-#: ../libsvn_wc/log.c:1275
+#: ../libsvn_wc/log.c:1276
 #, c-format
 msgid "Error replacing text-base of '%s'"
 msgstr "Błąd zastępowania wersji bazowej '%s'"
 
-#: ../libsvn_wc/log.c:1280
+#: ../libsvn_wc/log.c:1281
 #, c-format
 msgid "Error getting 'affected time' of '%s'"
 msgstr "Błąd uzyskiwania czasu modyfikacji '%s'"
 
-#: ../libsvn_wc/log.c:1303
+#: ../libsvn_wc/log.c:1304
 #, c-format
 msgid "Error getting 'affected time' for '%s'"
 msgstr "Błąd uzyskiwania czasu modyfikacji dla '%s'"
 
-#: ../libsvn_wc/log.c:1323
+#: ../libsvn_wc/log.c:1324
 #, c-format
 msgid "Error comparing '%s' and '%s'"
 msgstr "Błąd porównywania '%s' i '%s'"
 
-#: ../libsvn_wc/log.c:1376 ../libsvn_wc/log.c:1425
+#: ../libsvn_wc/log.c:1377 ../libsvn_wc/log.c:1426
 #, c-format
 msgid "Error modifying entry of '%s'"
 msgstr "Błąd modyfikacji wpisu '%s'"
 
-#: ../libsvn_wc/log.c:1480
+#: ../libsvn_wc/log.c:1481
 msgid "Invalid 'format' attribute"
 msgstr "Błędny atrybut 'format'"
 
-#: ../libsvn_wc/log.c:1521
+#: ../libsvn_wc/log.c:1522
 msgid "Attempt to add tree conflict that already exists"
 msgstr "Próba dodania już istniejącego konfliktu drzewnego"
 
-#: ../libsvn_wc/log.c:1554
+#: ../libsvn_wc/log.c:1555
 #, c-format
 msgid "Log entry missing 'name' attribute (entry '%s' for directory '%s')"
 msgstr "Zapis w logu nie zawiera atrybutu 'name' (element '%s' w katalogu '%s')"
 
-#: ../libsvn_wc/log.c:1628
+#: ../libsvn_wc/log.c:1629
 #, c-format
 msgid "Unrecognized logfile element '%s' in '%s'"
 msgstr "Nierozpoznany element '%s' w logu '%s'"
 
-#: ../libsvn_wc/log.c:1639
+#: ../libsvn_wc/log.c:1640
 #, c-format
 msgid "Error processing command '%s' in '%s'"
 msgstr "Błąd podczas wykonywania polecenia '%s' w '%s'"
 
-#: ../libsvn_wc/log.c:1839
+#: ../libsvn_wc/log.c:1840
 msgid "Couldn't open log"
 msgstr "Błąd otwarcia logu"
 
-#: ../libsvn_wc/log.c:1880
+#: ../libsvn_wc/log.c:1881
 #, c-format
 msgid "Error recording tree conflicts in '%s'"
 msgstr "Błąd podczas zapisywania konfliktów drzewnych w '%s'"
 
-#: ../libsvn_wc/log.c:2504
+#: ../libsvn_wc/log.c:2505
 #, c-format
 msgid "Error writing log for '%s'"
 msgstr "Błąd zapisu logu dla '%s'"
 
-#: ../libsvn_wc/log.c:2551
+#: ../libsvn_wc/log.c:2552
 #, c-format
 msgid "'%s' is not a working copy directory"
 msgstr "'%s' nie jest katalogiem kopii roboczej"
 
-#: ../libsvn_wc/merge.c:430 ../libsvn_wc/merge.c:738
+#: ../libsvn_wc/merge.c:435 ../libsvn_wc/merge.c:746
 msgid "Conflict callback violated API: returned no results"
 msgstr "Konfliktowe wywołanie zwrotne naruszyło API: nie zwróciło wyników"
 
-#: ../libsvn_wc/merge.c:781
+#: ../libsvn_wc/merge.c:789
 msgid "Conflict callback violated API: returned no merged file"
 msgstr "Konfliktowe wywołanie zwrotne naruszyło API: nie zwróciło połączonego pliku"
 
@@ -6494,10 +6494,14 @@ msgstr ""
 msgid "Relocate can only change the repository part of an URL"
 msgstr "Polecenie relocate może tylko zmienić repozytorialną część URL-u"
 
-#: ../libsvn_wc/tree_conflicts.c:88
-msgid "Missing field delimiter in tree conflict description"
+#: ../libsvn_wc/tree_conflicts.c:73
+msgid "Missing field separator in tree conflict description"
 msgstr "Brakujący separator pola w opisie konfliktu drzewnego"
 
+#: ../libsvn_wc/tree_conflicts.c:87
+msgid "No separator at end of tree conflict description, even though there is still data left to read"
+msgstr "Brak separatora na końcu opisu konfliktu drzewnego, chociaż są tam jeszcze dane pozostawione do odczytania"
+
 #: ../libsvn_wc/tree_conflicts.c:118
 msgid "Unfinished escape sequence in tree conflict description"
 msgstr "Niezakończona sekwencja ucieczki w opisie konfliktu drzewnego"
@@ -6506,121 +6510,99 @@ msgstr "Niezakończona sekwencja ucieczki w opisie konfliktu drzewnego"
 msgid "Illegal escaped character in tree conflict description"
 msgstr "Nieprawidłowy znak poprzedzany przez znak ucieczki w opisu konfliktu drzewnego"
 
-#: ../libsvn_wc/tree_conflicts.c:159
+#: ../libsvn_wc/tree_conflicts.c:210
+msgid "Unknown enumeration value in tree conflict description"
+msgstr "Nieznana wartość wyliczenia w opisie konfliktu drzewnego"
+
+#: ../libsvn_wc/tree_conflicts.c:285
 msgid "Empty 'victim' field in tree conflict description"
 msgstr "Puste pole 'victim' w opisie konfliktu drzewnego"
 
-#: ../libsvn_wc/tree_conflicts.c:179 ../libsvn_wc/tree_conflicts.c:204
-#: ../libsvn_wc/tree_conflicts.c:231 ../libsvn_wc/tree_conflicts.c:258
-#: ../libsvn_wc/tree_conflicts.c:295
-msgid "Expected tree conflict data but got none"
-msgstr "Oczekiwano danych konfliktu drzewnego, ale nic nie uzyskano"
-
-#: ../libsvn_wc/tree_conflicts.c:187
+#: ../libsvn_wc/tree_conflicts.c:294
 msgid "Invalid 'node_kind' field in tree conflict description"
 msgstr "Nieprawidłowe pole 'node_kind' w opisie konfliktu drzewnego"
 
-#: ../libsvn_wc/tree_conflicts.c:214
-msgid "Invalid 'operation' field in tree conflict description"
-msgstr "Niepoprawne pole 'operation' w opisie konfliktu drzewnego"
-
-#: ../libsvn_wc/tree_conflicts.c:241
-msgid "Invalid 'action' field in tree conflict description"
-msgstr "Nieprawidłowe pole 'action' w opisie konfliktu drzewnego"
-
-#: ../libsvn_wc/tree_conflicts.c:272
-msgid "Invalid 'reason' field in tree conflict description"
-msgstr "Nieprawidłowe pole 'reason' w opisie konfliktu drzewnego"
-
-#: ../libsvn_wc/tree_conflicts.c:321
-msgid "No delimiter at end of tree conflict description, even though there is still data left to read"
-msgstr "Brak ogranicznika na końcu opisu konfliktu drzewnego, chociaż są tam jeszcze dane pozostawione do odczytania"
-
-#: ../libsvn_wc/tree_conflicts.c:360
-msgid "Invalid tree conflict data in 'entries' file, but no idea what went wrong"
-msgstr "Nieprawidłowe dane konfliktu drzewnego w pliku 'entries', ale brak pomysłu, co poszło źle"
-
-#: ../libsvn_wc/update_editor.c:634
+#: ../libsvn_wc/update_editor.c:639
 #, c-format
 msgid "No '.' entry in: '%s'"
 msgstr "Brak elementu '.' w: '%s'"
 
-#: ../libsvn_wc/update_editor.c:1127
+#: ../libsvn_wc/update_editor.c:1132
 #, c-format
 msgid "Path '%s' is not in the working copy"
 msgstr "Ścieżka '%s' nie jest w kopii roboczej"
 
-#: ../libsvn_wc/update_editor.c:1839
+#: ../libsvn_wc/update_editor.c:1929
 #, c-format
 msgid "Failed to add directory '%s': a non-directory object of the same name already exists"
 msgstr "Błąd dodawania katalogu '%s': niekatalogowy obiekt o tej samej nazwie już istnieje"
 
-#: ../libsvn_wc/update_editor.c:1909
+#: ../libsvn_wc/update_editor.c:1997
 #, c-format
 msgid "Failed to add directory '%s': an unversioned directory of the same name already exists"
 msgstr "Błąd dodawania katalogu '%s': niewersjonowany katalog o tej samej nazwie już istnieje"
 
-#: ../libsvn_wc/update_editor.c:1985
+#: ../libsvn_wc/update_editor.c:2074
 #, c-format
 msgid "Failed to add directory '%s': object of the same name as the administrative directory"
 msgstr "Błąd dodawania katalogu '%s': obiekt o tej samej nazwie jak katalog administracyjny"
 
-#: ../libsvn_wc/update_editor.c:2019
+#: ../libsvn_wc/update_editor.c:2108
 #, c-format
 msgid "Failed to add directory '%s': copyfrom arguments not yet supported"
 msgstr "Błąd dodawania katalogu '%s': argumenty copyfrom nie są jeszcze obsługiwane"
 
-#: ../libsvn_wc/update_editor.c:2425
+#: ../libsvn_wc/update_editor.c:2515
 msgid "Couldn't do property merge"
 msgstr "Nie udało się łączenie zmian atrybutu"
 
-#: ../libsvn_wc/update_editor.c:2498
+#: ../libsvn_wc/update_editor.c:2588
 #, c-format
 msgid "Failed to mark '%s' absent: item of the same name is already scheduled for addition"
 msgstr "Nie udało się oznaczanie '%s' jako brakującego: element o tej samej nazwie oczekuje na dodanie"
 
-#: ../libsvn_wc/update_editor.c:2588
+#: ../libsvn_wc/update_editor.c:2678
 msgid "Destination directory of add-with-history is missing a URL"
 msgstr "Katalog docelowy add-with-history nie posiada URL-u"
 
-#: ../libsvn_wc/update_editor.c:2603
+#: ../libsvn_wc/update_editor.c:2693
 msgid "Destination URLs are broken"
 msgstr "Docelowe URL-e są uszkodzone"
 
-#: ../libsvn_wc/update_editor.c:2864
+#: ../libsvn_wc/update_editor.c:2954
 msgid "No fetch_func supplied to update_editor"
 msgstr "fetch_func niedostarczone do update_editor"
 
-#: ../libsvn_wc/update_editor.c:2938
+#: ../libsvn_wc/update_editor.c:3028
 msgid "Bad copyfrom arguments received"
 msgstr "Otrzymano złe argumenty copyfrom"
 
-#: ../libsvn_wc/update_editor.c:3031
+#: ../libsvn_wc/update_editor.c:3122
 #, c-format
 msgid "Failed to add file '%s': a non-file object of the same name already exists"
 msgstr "Błąd dodawania pliku '%s': nieplik o tej samej nazwie już istnieje"
 
-#: ../libsvn_wc/update_editor.c:3046
+#: ../libsvn_wc/update_editor.c:3137
 #, c-format
 msgid "Failed to add file '%s': object of the same name already exists"
 msgstr "Błąd dodawania pliku '%s': obiekt o tej samej nazwie już istnieje"
 
-#: ../libsvn_wc/update_editor.c:3113
+#: ../libsvn_wc/update_editor.c:3204
 #, c-format
 msgid "File '%s' in directory '%s' is not a versioned resource"
 msgstr "Plik '%s' w katalogu '%s' nie podlega zarządzaniu wersjami"
 
-#: ../libsvn_wc/update_editor.c:3292
+#: ../libsvn_wc/update_editor.c:3384
 #, c-format
 msgid "Checksum mismatch for '%s'; recorded: '%s', actual: '%s'"
 msgstr "Błąd sumy kontrolnej dla '%s'; zapisana: '%s', faktyczna: '%s'"
 
-#: ../libsvn_wc/update_editor.c:4573
+#: ../libsvn_wc/update_editor.c:4671
 #, c-format
 msgid "'%s' has no ancestry information"
 msgstr "Brak informacji o pochodzeniu '%s'"
 
-#: ../libsvn_wc/update_editor.c:4730
+#: ../libsvn_wc/update_editor.c:4828
 #, c-format
 msgid "Copyfrom-url '%s' has different repository root than '%s'"
 msgstr "Źródłowy URL '%s' jest z innego repozytorium niż '%s'"
@@ -6643,7 +6625,7 @@ msgstr "Nie można znaleźć URL-u dla '%s'"
 msgid "'verbose' option invalid in XML mode"
 msgstr "Opcja 'verbose' nie jest prawidłową opcją dla trybu XML"
 
-#: ../svn/blame-cmd.c:273 ../svn/info-cmd.c:484 ../svn/list-cmd.c:242
+#: ../svn/blame-cmd.c:273 ../svn/info-cmd.c:508 ../svn/list-cmd.c:242
 #: ../svn/status-cmd.c:209
 msgid "'incremental' option only valid in XML mode"
 msgstr "Opcja 'incremental' jest prawidłowa tylko w trybie XML"
@@ -7169,12 +7151,19 @@ msgstr[2] ""
 msgid "Changelist: %s\n"
 msgstr "Lista zmian: %s\n"
 
-#: ../svn/info-cmd.c:437
-#, c-format
-msgid "Tree conflict: %s"
-msgstr "Konflikt drzewny: %s"
+#: ../svn/info-cmd.c:445
+msgid "Tree conflict"
+msgstr "Konflikt drzewny"
 
-#: ../svn/info-cmd.c:521
+#: ../svn/info-cmd.c:451
+msgid "Source  left"
+msgstr "Źródło  lewe"
+
+#: ../svn/info-cmd.c:460
+msgid "Source right"
+msgstr "Źródło prawe"
+
+#: ../svn/info-cmd.c:545
 #, c-format
 msgid ""
 "%s:  (Not a versioned resource)\n"
@@ -7183,7 +7172,7 @@ msgstr ""
 "%s:  (Obiekt niepodlegający zarządzaniu wersjami)\n"
 "\n"
 
-#: ../svn/info-cmd.c:528
+#: ../svn/info-cmd.c:552
 #, c-format
 msgid ""
 "%s:  (Not a valid URL)\n"
@@ -9483,34 +9472,34 @@ msgstr "'%s' posiada żeton blokady, ale brakuje właściciela blokady"
 msgid "'%s' to '%s' is not a valid relocation"
 msgstr "'%s' do '%s' nie jest prawidłowym przeniesieniem"
 
-#: ../svn/tree-conflicts.c:32 ../svn/tree-conflicts.c:48
+#: ../svn/tree-conflicts.c:34 ../svn/tree-conflicts.c:50
 msgid "edit"
 msgstr "modyfikacja"
 
-#: ../svn/tree-conflicts.c:34 ../svn/tree-conflicts.c:54
+#: ../svn/tree-conflicts.c:36 ../svn/tree-conflicts.c:56
 msgid "add"
 msgstr "dodanie"
 
-#: ../svn/tree-conflicts.c:36 ../svn/tree-conflicts.c:52
+#: ../svn/tree-conflicts.c:38 ../svn/tree-conflicts.c:54
 msgid "delete"
 msgstr "usunięcie"
 
-#: ../svn/tree-conflicts.c:50
+#: ../svn/tree-conflicts.c:52
 msgid "obstruction"
 msgstr "zagrodzenie"
 
-#: ../svn/tree-conflicts.c:56
+#: ../svn/tree-conflicts.c:58
 msgid "missing"
 msgstr "brak"
 
-#: ../svn/tree-conflicts.c:58
+#: ../svn/tree-conflicts.c:60
 msgid "unversioned"
 msgstr "niewersjonowane"
 
-#: ../svn/tree-conflicts.c:74
+#: ../svn/tree-conflicts.c:77
 #, c-format
-msgid "incoming %s, local %s"
-msgstr "przychodzące: %s, lokalne: %s"
+msgid "local %s, incoming %s upon %s"
+msgstr "lokalne: %s, przychodzące: %s, operacja: %s"
 
 #: ../svn/util.c:64
 #, c-format
@@ -9613,7 +9602,35 @@ msgstr ""
 msgid "Use --force to override this restriction"
 msgstr "Użyj opcję --force, aby obejść to ograniczenie"
 
-#: ../svn/util.c:1114
+#: ../svn/util.c:1023
+msgid "none"
+msgstr "nic"
+
+#: ../svn/util.c:1025
+msgid "dir"
+msgstr "katalog"
+
+#: ../svn/util.c:1027
+msgid "file"
+msgstr "plik"
+
+#: ../svn/util.c:1054
+msgid "update"
+msgstr "aktualizacja"
+
+#: ../svn/util.c:1056
+msgid "switch"
+msgstr "przełączanie"
+
+#: ../svn/util.c:1058
+msgid "merge"
+msgstr "łączenie zmian"
+
+#: ../svn/util.c:1060
+msgid "unknown operation"
+msgstr "nieznana operacja"
+
+#: ../svn/util.c:1162
 msgid "(invalid date)"
 msgstr "(nieprawidłowa data)"
 
index cd5f4a8..e7e3d5b 100644 (file)
@@ -1801,7 +1801,8 @@ main(int argc, const char *argv[])
           opt_state.depth = SVN_DEPTH_INFINITY_OR_IMMEDIATES(FALSE);
         }
       else if (subcommand->cmd_func == svn_cl__revert
-               || subcommand->cmd_func == svn_cl__add)
+               || subcommand->cmd_func == svn_cl__add
+               || subcommand->cmd_func == svn_cl__commit)
         {
           /* In pre-1.5 Subversion, some commands treated -N like
              --depth=empty, so force that mapping here.  Anyway, with
index 0e48508..8cc7d03 100755 (executable)
@@ -1534,17 +1534,14 @@ def commit_nonrecursive(sbox):
   ### commit to behave differently from other commands taking -N.
   ###
   ### These days, -N should be equivalent to --depth=files in almost
-  ### all cases.  There are some exceptions (e.g., status), but commit
-  ### is not an exception.  Thus, the above recipe is now incorrect,
-  ### because "wc/dirA/dirB" was given as an explicit target, and
-  ### therefore the file "wc/dirA/dirB/nocommit" *should* have been
-  ### committed after all, since it's a file child of a named target
-  ### and -N means --depth=files.
+  ### all cases.  There are some exceptions (e.g., status), and commit
+  ### is one of them: 'commit -N' means 'commit --depth=empty'.
   ###
-  ### So we really need two tests: one for commit -N (--depth=files),
-  ### and another for --depth=empty.  I've changed this test to cover
-  ### the -N case, and added 'commit_propmods_with_depth_empty' to
-  ### depth_tests.py to cover the --depth=empty case.
+  ### The original implementation, as well as this test, mistakenly
+  ### mapped 'commit -N' to 'commit --depth=files'; that was a bug that
+  ### made 'svn ci -N' incompatible with 1.4 and earlier versions.
+  ###
+  ### See also 'commit_propmods_with_depth_empty' in depth_tests.py .
 
   # Now add these directories and files, except the last:
   dirA_path  = 'dirA'
@@ -1564,19 +1561,19 @@ def commit_nonrecursive(sbox):
 
   # Add them to version control.
   svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
-                                     'add', '--depth=empty',
+                                     'add', '-N',
                                      os.path.join(wc_dir, dirA_path),
                                      os.path.join(wc_dir, fileA_path),
-                                     os.path.join(wc_dir, fileB_path),
+                                     # don't add fileB
                                      os.path.join(wc_dir, dirB_path),
                                      os.path.join(wc_dir, nope_1_path),
-                                     os.path.join(wc_dir, nope_2_path))
+                                     # don't add nope_2
+                                     )
 
   expected_output = svntest.wc.State(
     wc_dir,
     { dirA_path  : Item(verb='Adding'),
-      fileA_path : Item(verb='Adding'),
-      fileB_path : Item(verb='Adding'),
+      # no children!
       }
     )
 
@@ -1595,11 +1592,11 @@ def commit_nonrecursive(sbox):
   # Expect some commits and some non-commits from this part of the test.
   expected_status.add({
     dirA_path     : Item(status='  ', wc_rev=3),
-    fileA_path    : Item(status='  ', wc_rev=3),
-    fileB_path    : Item(status='  ', wc_rev=3),
+    fileA_path    : Item(status='A ', wc_rev=0),
+    # no fileB
     dirB_path     : Item(status='A ', wc_rev=0),
     nope_1_path   : Item(status='A ', wc_rev=0),
-    nope_2_path   : Item(status='A ', wc_rev=0)
+    # no nope_2
     })
 
   svntest.actions.run_and_verify_commit(wc_dir,
index f65a012..4c77d21 100755 (executable)
@@ -937,8 +937,10 @@ def depth_update_to_more_depth(sbox):
   verify_depth("Non-infinity depth detected after an upgrade to depth-infinity",
                "infinity", "A")
 
-def commit_propmods_with_depth_empty(sbox):
-  "commit property mods only, using --depth=empty"
+def commit_propmods_with_depth_empty_helper(sbox, depth_arg):
+  """Helper for commit_propmods_with_depth_empty().
+  DEPTH_ARG should be either '--depth=empty' or '-N'."""
+
   sbox.build()
   wc_dir = sbox.wc_dir
 
@@ -987,9 +989,20 @@ def commit_propmods_with_depth_empty(sbox):
                                         expected_output,
                                         expected_status,
                                         None,
-                                        '--depth=empty',
+                                        depth_arg,
                                         wc_dir, D_path)
 
+# See also commit_tests 26: commit_nonrecursive
+def commit_propmods_with_depth_empty(sbox):
+  "commit property mods only, using --depth=empty"
+
+  sbox2 = sbox.clone_dependent()
+
+  # Run once with '-N' and once with '--depth=empty' to make sure they
+  # function identically.
+  commit_propmods_with_depth_empty_helper(sbox, '-N')
+  commit_propmods_with_depth_empty_helper(sbox2, '--depth=empty')
+
 # Test for issue #2845.
 def diff_in_depthy_wc(sbox):
   "diff at various depths in non-infinity wc"
index 9d5880d..b94faf9 100755 (executable)
@@ -653,24 +653,24 @@ def disallow_dot_or_dotdot_directory_reference(sbox):
   C_path = os.path.join(wc_dir, 'A', 'C')
   F_path = os.path.join(wc_dir, 'A', 'C', 'F')
 
-  external_urls = external_url_for.values()
+  external_urls = list(external_url_for.values())
 
   externals_value_1 = "../foo"         + " " + external_urls.pop() + "\n"
-  if not external_urls: external_urls = external_url_for.values()
+  if not external_urls: external_urls = list(external_url_for.values())
   externals_value_2 = "foo/bar/../baz" + " " + external_urls.pop() + "\n"
-  if not external_urls: external_urls = external_url_for.values()
+  if not external_urls: external_urls = list(external_url_for.values())
   externals_value_3 = "foo/.."         + " " + external_urls.pop() + "\n"
-  if not external_urls: external_urls = external_url_for.values()
+  if not external_urls: external_urls = list(external_url_for.values())
   externals_value_4 = "."              + " " + external_urls.pop() + "\n"
-  if not external_urls: external_urls = external_url_for.values()
+  if not external_urls: external_urls = list(external_url_for.values())
   externals_value_5 = "./"             + " " + external_urls.pop() + "\n"
-  if not external_urls: external_urls = external_url_for.values()
+  if not external_urls: external_urls = list(external_url_for.values())
   externals_value_6 = ".."             + " " + external_urls.pop() + "\n"
-  if not external_urls: external_urls = external_url_for.values()
+  if not external_urls: external_urls = list(external_url_for.values())
   externals_value_7 = "././/.///."     + " " + external_urls.pop() + "\n"
-  if not external_urls: external_urls = external_url_for.values()
+  if not external_urls: external_urls = list(external_url_for.values())
   externals_value_8 = "/foo"           + " " + external_urls.pop() + "\n"
-  if not external_urls: external_urls = external_url_for.values()
+  if not external_urls: external_urls = list(external_url_for.values())
 
   set_externals_for_path_expect_error(B_path, externals_value_1)
   set_externals_for_path_expect_error(G_path, externals_value_2)
index da2f1b0..4ae22e6 100755 (executable)
@@ -13386,6 +13386,8 @@ state_after_leaf_edit = svntest.actions.deep_trees_after_leaf_edit
 state_after_leaf_del = svntest.actions.deep_trees_after_leaf_del
 state_after_tree_del = svntest.actions.deep_trees_after_tree_del
 
+deep_trees_conflict_output = svntest.actions.deep_trees_conflict_output
+
 j = os.path.join
 
 DeepTreesTestCase = svntest.actions.DeepTreesTestCase
@@ -13403,14 +13405,7 @@ def tree_conflicts_on_merge_local_ci_4_1(sbox):
   # use case 4, as in notes/tree-conflicts/use-cases.txt
   # 4.1) local tree delete, incoming leaf edit
 
-  expected_output = svntest.wc.State('', {
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'D/D1'              : Item(status='  ', treeconflict='C'),
-    'DF/D1'             : Item(status='  ', treeconflict='C'),
-    'DD/D1'             : Item(status='  ', treeconflict='C'),
-    'DDF/D1'            : Item(status='  ', treeconflict='C'),
-    'DDD/D1'            : Item(status='  ', treeconflict='C'),
-    })
+  expected_output = deep_trees_conflict_output
 
   expected_disk = state_after_tree_del
 
@@ -13448,14 +13443,7 @@ def tree_conflicts_on_merge_local_ci_4_2(sbox):
 
   # 4.2) local tree delete, incoming leaf delete
 
-  expected_output = svntest.wc.State('', {
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'D/D1'              : Item(status='  ', treeconflict='C'),
-    'DF/D1'             : Item(status='  ', treeconflict='C'),
-    'DD/D1'             : Item(status='  ', treeconflict='C'),
-    'DDF/D1'            : Item(status='  ', treeconflict='C'),
-    'DDD/D1'            : Item(status='  ', treeconflict='C'),
-    })
+  expected_output = deep_trees_conflict_output
 
   expected_disk = state_after_tree_del
 
@@ -13496,46 +13484,32 @@ def tree_conflicts_on_merge_local_ci_5_1(sbox):
   # use case 5, as in notes/tree-conflicts/use-cases.txt
   # 5.1) local leaf edit, incoming tree delete
 
-  expected_output = svntest.wc.State('', {
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'D/D1'              : Item(status='D '),
-    'DF/D1'             : Item(status='D '),
-    'DD/D1'             : Item(status='D '),
-    'DDF/D1'            : Item(status='D '),
-    'DDD/D1'            : Item(status='D '),
-    })
+  expected_output = deep_trees_conflict_output
 
-  expected_disk = svntest.wc.State('', {
-    'DF/D1'             : Item(),
-    'DDF/D1/D2'         : Item(),
-    'F/alpha'           : Item(contents="This is the file 'alpha'.\nMore text for file alpha.\n"),
-    'DDD/D1/D2/D3'      : Item(),
-    'DD/D1/D2'          : Item(),
-    'D/D1'              : Item(),
-    })
+  expected_disk = disk_after_leaf_edit
 
   # We should detect 6 tree conflicts, and nothing should be deleted (when
   # we skip tree conflict victims).
   expected_status = svntest.wc.State('', {
     ''                  : Item(status=' M', wc_rev='3'),
     'D'                 : Item(status='  ', wc_rev='3'),
-    'D/D1'              : Item(status='D ', wc_rev='3'), # tree conflict?
+    'D/D1'              : Item(status='  ', treeconflict='C', wc_rev='4'),
     'D/D1/delta'        : Item(status='D ', wc_rev='4'),
     'DD'                : Item(status='  ', wc_rev='3'),
-    'DD/D1'             : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DD/D1'             : Item(status='  ', treeconflict='C', wc_rev='4'),
     'DD/D1/D2'          : Item(status='D ', wc_rev='3'),
     'DD/D1/D2/epsilon'  : Item(status='D ', wc_rev='4'),
     'DDD'               : Item(status='  ', wc_rev='3'),
-    'DDD/D1'            : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DDD/D1'            : Item(status='  ', treeconflict='C', wc_rev='4'),
     'DDD/D1/D2'         : Item(status='D ', wc_rev='3'),
     'DDD/D1/D2/D3'      : Item(status='D ', wc_rev='3'),
     'DDD/D1/D2/D3/zeta' : Item(status='D ', wc_rev='4'),
     'DDF'               : Item(status='  ', wc_rev='3'),
-    'DDF/D1'            : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DDF/D1'            : Item(status='  ', treeconflict='C', wc_rev='4'),
     'DDF/D1/D2'         : Item(status='D ', wc_rev='3'),
     'DDF/D1/D2/gamma'   : Item(status='D ', wc_rev='4'),
     'DF'                : Item(status='  ', wc_rev='3'),
-    'DF/D1'             : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DF/D1'             : Item(status='  ', treeconflict='C', wc_rev='4'),
     'DF/D1/beta'        : Item(status='D ', wc_rev='4'),
     'F'                 : Item(status='  ', wc_rev='3'),
     'F/alpha'           : Item(status='  ', treeconflict='C', wc_rev='4'),
@@ -13561,15 +13535,7 @@ def tree_conflicts_on_merge_local_ci_5_2(sbox):
 
   # 5.2) local leaf del, incoming tree delete
 
-  expected_output = svntest.wc.State('', {
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'D/D1'              : Item(status='  ', treeconflict='C'),
-    'DF/D1'             : Item(status='D '),
-    'DD/D1'             : Item(status='D '),
-    'DDF/D1'            : Item(status='D '),
-    'DDD/D1'            : Item(status='D '),
-    })
-
+  expected_output = deep_trees_conflict_output
 
   expected_disk = svntest.wc.State('', {
     'F'                 : Item(),
@@ -13585,14 +13551,14 @@ def tree_conflicts_on_merge_local_ci_5_2(sbox):
     'D'                 : Item(status='  ', wc_rev='3'),
     'F'                 : Item(status='  ', wc_rev='3'),
     'DD'                : Item(status='  ', wc_rev='3'),
-    'DD/D1'             : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DD/D1'             : Item(status='! ', treeconflict='C'),
     'DF'                : Item(status='  ', wc_rev='3'),
-    'DF/D1'             : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DF/D1'             : Item(status='! ', treeconflict='C'),
     'DDD'               : Item(status='  ', wc_rev='3'),
-    'DDD/D1'            : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DDD/D1'            : Item(status='! ', treeconflict='C'),
     'DDD/D1/D2'         : Item(status='D ', wc_rev='3'),
     'DDF'               : Item(status='  ', wc_rev='3'),
-    'DDF/D1'            : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DDF/D1'            : Item(status='! ', treeconflict='C'),
     'DDF/D1/D2'         : Item(status='D ', wc_rev='3'),
     'D/D1'              : Item(status='! ', treeconflict='C'),
     'F/alpha'           : Item(status='! ', treeconflict='C'),
@@ -13617,14 +13583,7 @@ def tree_conflicts_on_merge_local_ci_6(sbox):
   # use case 6, as in notes/tree-conflicts/use-cases.txt
   # local tree delete, incoming tree delete
 
-  expected_output = svntest.wc.State('', {
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'D/D1'              : Item(status='  ', treeconflict='C'),
-    'DF/D1'             : Item(status='  ', treeconflict='C'),
-    'DD/D1'             : Item(status='  ', treeconflict='C'),
-    'DDF/D1'            : Item(status='  ', treeconflict='C'),
-    'DDD/D1'            : Item(status='  ', treeconflict='C'),
-    })
+  expected_output = deep_trees_conflict_output
 
   expected_disk = state_after_tree_del
 
@@ -13665,14 +13624,7 @@ def tree_conflicts_on_merge_no_local_ci_4_1(sbox):
   # use case 4, as in notes/tree-conflicts/use-cases.txt
   # 4.1) local tree delete, incoming leaf edit
 
-  expected_output = svntest.wc.State('', {
-    'D/D1'              : Item(status='  ', treeconflict='C'),
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'DD/D1'             : Item(status='  ', treeconflict='C'),
-    'DF/D1'             : Item(status='  ', treeconflict='C'),
-    'DDD/D1'            : Item(status='  ', treeconflict='C'),
-    'DDF/D1'            : Item(status='  ', treeconflict='C'),
-    })
+  expected_output = deep_trees_conflict_output
 
   expected_disk = svntest.wc.State('', {
     'F'                 : Item(),
@@ -13725,14 +13677,7 @@ def tree_conflicts_on_merge_no_local_ci_4_2(sbox):
 
   # 4.2) local tree delete, incoming leaf delete
 
-  expected_output = svntest.wc.State('', {
-    'D/D1'              : Item(status='  ', treeconflict='C'),
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'DD/D1'             : Item(status='  ', treeconflict='C'),
-    'DF/D1'             : Item(status='  ', treeconflict='C'),
-    'DDD/D1'            : Item(status='  ', treeconflict='C'),
-    'DDF/D1'            : Item(status='  ', treeconflict='C'),
-    })
+  expected_output = deep_trees_conflict_output
 
   expected_disk = svntest.wc.State('', {
     'F'                 : Item(),
@@ -13789,43 +13734,36 @@ def tree_conflicts_on_merge_no_local_ci_5_1(sbox):
   # use case 5, as in notes/tree-conflicts/use-cases.txt
   # 5.1) local leaf edit, incoming tree delete
 
-  expected_output = svntest.wc.State('', {
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    })
+  expected_output = deep_trees_conflict_output
 
   expected_disk = state_after_leaf_edit
 
   expected_status = svntest.wc.State('', {
     ''                  : Item(status=' M', wc_rev='3'),
     'D'                 : Item(status='  ', wc_rev='3'),
-    'D/D1'              : Item(status=' M', wc_rev='3'),
+    'D/D1'              : Item(status=' M', treeconflict='C', wc_rev='3'),
     'D/D1/delta'        : Item(status='A ', wc_rev='0'),
     'DD'                : Item(status='  ', wc_rev='3'),
-    'DD/D1'             : Item(status=' M', wc_rev='3'),
+    'DD/D1'             : Item(status=' M', treeconflict='C', wc_rev='3'),
     'DD/D1/D2'          : Item(status='  ', wc_rev='3'),
     'DD/D1/D2/epsilon'  : Item(status='A ', wc_rev='0'),
     'DDD'               : Item(status='  ', wc_rev='3'),
-    'DDD/D1'            : Item(status=' M', wc_rev='3'),
+    'DDD/D1'            : Item(status=' M', treeconflict='C', wc_rev='3'),
     'DDD/D1/D2'         : Item(status='  ', wc_rev='3'),
     'DDD/D1/D2/D3'      : Item(status='  ', wc_rev='3'),
     'DDD/D1/D2/D3/zeta' : Item(status='A ', wc_rev='0'),
     'DDF'               : Item(status='  ', wc_rev='3'),
-    'DDF/D1'            : Item(status=' M', wc_rev='3'),
+    'DDF/D1'            : Item(status=' M', treeconflict='C', wc_rev='3'),
     'DDF/D1/D2'         : Item(status='  ', wc_rev='3'),
     'DDF/D1/D2/gamma'   : Item(status='M ', wc_rev='3'),
     'DF'                : Item(status='  ', wc_rev='3'),
-    'DF/D1'             : Item(status=' M', wc_rev='3'),
+    'DF/D1'             : Item(status=' M', treeconflict='C', wc_rev='3'),
     'DF/D1/beta'        : Item(status='M ', wc_rev='3'),
     'F'                 : Item(status='  ', wc_rev='3'),
     'F/alpha'           : Item(status='M ', treeconflict='C', wc_rev='3'),
     })
 
   expected_skip = svntest.wc.State('', {
-    'D/D1'              : Item(),
-    'DF/D1'             : Item(),
-    'DD/D1'             : Item(),
-    'DDF/D1'            : Item(),
-    'DDD/D1'            : Item(),
     })
 
   svntest.actions.deep_trees_run_tests_scheme_for_merge(sbox,
@@ -13846,15 +13784,7 @@ def tree_conflicts_on_merge_no_local_ci_5_2(sbox):
 
   # 5.2) local leaf del, incoming tree delete
 
-  expected_output = svntest.wc.State('', {
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'D/D1'              : Item(status='  ', treeconflict='C'),
-    'DF/D1'             : Item(status='D '),
-    'DD/D1'             : Item(status='D '),
-    'DDF/D1'            : Item(status='D '),
-    'DDD/D1'            : Item(status='D '),
-    })
-
+  expected_output = deep_trees_conflict_output
 
   expected_disk = svntest.wc.State('', {
     'F'                 : Item(),
@@ -13872,17 +13802,17 @@ def tree_conflicts_on_merge_no_local_ci_5_2(sbox):
     'F'                 : Item(status='  ', wc_rev='3'),
     'F/alpha'           : Item(status='D ', wc_rev='3', treeconflict='C'),
     'DD'                : Item(status='  ', wc_rev='3'),
-    'DD/D1'             : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DD/D1'             : Item(status='D ', wc_rev='3', treeconflict='C'),
     'DD/D1/D2'          : Item(status='D ', wc_rev='3'),
     'DF'                : Item(status='  ', wc_rev='3'),
-    'DF/D1'             : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DF/D1'             : Item(status='D ', wc_rev='3', treeconflict='C'),
     'DF/D1/beta'        : Item(status='D ', wc_rev='3'),
     'DDD'               : Item(status='  ', wc_rev='3'),
-    'DDD/D1'            : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DDD/D1'            : Item(status='D ', wc_rev='3', treeconflict='C'),
     'DDD/D1/D2'         : Item(status='D ', wc_rev='3'),
     'DDD/D1/D2/D3'      : Item(status='D ', wc_rev='3'),
     'DDF'               : Item(status='  ', wc_rev='3'),
-    'DDF/D1'            : Item(status='D ', wc_rev='3'), # tree conflict?
+    'DDF/D1'            : Item(status='D ', wc_rev='3', treeconflict='C'),
     'DDF/D1/D2'         : Item(status='D ', wc_rev='3'),
     'DDF/D1/D2/gamma'   : Item(status='D ', wc_rev='3'),
     })
@@ -13908,14 +13838,7 @@ def tree_conflicts_on_merge_no_local_ci_6(sbox):
   # use case 6, as in notes/tree-conflicts/use-cases.txt
   # local tree delete, incoming tree delete
 
-  expected_output = svntest.wc.State('', {
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'D/D1'              : Item(status='  ', treeconflict='C'),
-    'DF/D1'             : Item(status='  ', treeconflict='C'),
-    'DD/D1'             : Item(status='  ', treeconflict='C'),
-    'DDF/D1'            : Item(status='  ', treeconflict='C'),
-    'DDD/D1'            : Item(status='  ', treeconflict='C'),
-    })
+  expected_output = deep_trees_conflict_output
 
   expected_disk = svntest.wc.State('', {
     'F'                 : Item(),
@@ -13933,17 +13856,17 @@ def tree_conflicts_on_merge_no_local_ci_6(sbox):
     'F'                 : Item(status='  ', wc_rev='3'),
     'F/alpha'           : Item(status='D ', wc_rev='3', treeconflict='C'),
     'DD'                : Item(status='  ', wc_rev='3'),
-    'DD/D1'             : Item(status='D ', wc_rev='3'),
+    'DD/D1'             : Item(status='D ', wc_rev='3', treeconflict='C'),
     'DD/D1/D2'          : Item(status='D ', wc_rev='3'),
     'DF'                : Item(status='  ', wc_rev='3'),
-    'DF/D1'             : Item(status='D ', wc_rev='3'),
+    'DF/D1'             : Item(status='D ', wc_rev='3', treeconflict='C'),
     'DF/D1/beta'        : Item(status='D ', wc_rev='3'),
     'DDD'               : Item(status='  ', wc_rev='3'),
-    'DDD/D1'            : Item(status='D ', wc_rev='3'),
+    'DDD/D1'            : Item(status='D ', wc_rev='3', treeconflict='C'),
     'DDD/D1/D2'         : Item(status='D ', wc_rev='3'),
     'DDD/D1/D2/D3'      : Item(status='D ', wc_rev='3'),
     'DDF'               : Item(status='  ', wc_rev='3'),
-    'DDF/D1'            : Item(status='D ', wc_rev='3'),
+    'DDF/D1'            : Item(status='D ', wc_rev='3', treeconflict='C'),
     'DDF/D1/D2'         : Item(status='D ', wc_rev='3'),
     'DDF/D1/D2/gamma'   : Item(status='D ', wc_rev='3'),
     })
@@ -15153,13 +15076,13 @@ test_list = [ None,
               tree_conflicts_and_obstructions,
               tree_conflicts_on_merge_local_ci_4_1,
               tree_conflicts_on_merge_local_ci_4_2,
-              tree_conflicts_on_merge_local_ci_5_1,
-              tree_conflicts_on_merge_local_ci_5_2,
+              XFail(tree_conflicts_on_merge_local_ci_5_1),
+              XFail(tree_conflicts_on_merge_local_ci_5_2),
               tree_conflicts_on_merge_local_ci_6,
               tree_conflicts_on_merge_no_local_ci_4_1,
               tree_conflicts_on_merge_no_local_ci_4_2,
-              tree_conflicts_on_merge_no_local_ci_5_1,
-              tree_conflicts_on_merge_no_local_ci_5_2,
+              XFail(tree_conflicts_on_merge_no_local_ci_5_1),
+              XFail(tree_conflicts_on_merge_no_local_ci_5_2),
               tree_conflicts_on_merge_no_local_ci_6,
               SkipUnless(subtree_gets_changes_even_if_ultimately_deleted,
                          server_has_mergeinfo),
index 492a828..d7465eb 100644 (file)
@@ -793,7 +793,7 @@ def run_and_verify_info(expected_infos, *args):
   try:
     for actual, expected in zip(actual_infos, expected_infos):
       # compare dicts
-      for key, value in expected.iteritems():
+      for key, value in expected.items():
         if value is None and key in actual:
           raise main.SVNLineUnequal("Found unexpected key '%s' with value '%s'"
                                     % (key, actual[key]))
@@ -992,7 +992,7 @@ def run_and_verify_mergeinfo(error_re_string = None,
         del(exp_hash[rev])
       else:
         extra_out.append(rev)
-    extra_exp = exp_hash.keys()
+    extra_exp = list(exp_hash.keys())
     raise Exception("Unexpected 'svn mergeinfo' output:\n"
                     "  expected but not found: %s\n"
                     "  found but not expected: %s"
index dfbea33..3ed648a 100755 (executable)
@@ -2209,7 +2209,7 @@ disk_after_leaf_edit = svntest.actions.deep_trees_after_leaf_edit
 disk_after_leaf_del = svntest.actions.deep_trees_after_leaf_del
 disk_after_tree_del = svntest.actions.deep_trees_after_tree_del
 
-state_empty_dirs = svntest.actions.deep_trees_empty_dirs
+disk_empty_dirs = svntest.actions.deep_trees_empty_dirs
 
 deep_trees_conflict_output = svntest.actions.deep_trees_conflict_output
 deep_trees_conflict_output_skipped = \
@@ -2235,7 +2235,7 @@ def tree_conflicts_on_switch_1_1(sbox):
 
   expected_output = deep_trees_conflict_output
 
-  expected_disk = state_empty_dirs
+  expected_disk = disk_empty_dirs
 
   # The tree conflict victims are skipped, which means they're switched
   # relative to their parent dirs.
@@ -2259,7 +2259,7 @@ def tree_conflicts_on_switch_1_2(sbox):
 
   expected_output = deep_trees_conflict_output
 
-  expected_disk = state_empty_dirs
+  expected_disk = disk_empty_dirs
 
   expected_status = deep_trees_status_local_tree_del.copy()
   expected_status.tweak('F/alpha', 'D/D1', 'DF/D1', 'DD/D1', 'DDF/D1',
@@ -2305,42 +2305,41 @@ def tree_conflicts_on_switch_2_2(sbox):
   ### Current behaviour fails to show conflicts when deleting
   ### a directory tree that has modifications. (Will be solved
   ### when dirs_same_p() is implemented)
-  expected_output = svntest.wc.State('', {
-    'D/D1'              : Item(status='  ', treeconflict='C'),
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'DD/D1'             : Item(status='D '),
-    'DF/D1'             : Item(status='D '),
-    'DDD/D1'            : Item(status='D '),
-    'DDF/D1'            : Item(status='D '),
-    })
+  expected_output = deep_trees_conflict_output
+
+  expected_disk = disk_empty_dirs
 
-  expected_disk = svntest.actions.deep_trees_virginal_state.copy()
-  expected_disk.remove(
+  expected_status = svntest.actions.deep_trees_virginal_state.copy()
+  expected_status.add({'' : Item(),
+                       'F/alpha' : Item()})
+  expected_status.tweak(contents=None, status='  ', wc_rev=3)
+  # Tree conflicts.
+  expected_status.tweak(
+    'D/D1',
     'F/alpha',
-    'DF/D1',
-    'DF/D1/beta',
     'DD/D1',
-    'DD/D1/D2',
+    'DF/D1',
+    'DDD/D1',
     'DDF/D1',
+    treeconflict='C', wc_rev=2, switched='S')
+  # Anything that's below a tree-conflict is also at an earlier rev.
+  expected_status.tweak(
+    'DD/D1/D2',
+    'DF/D1/beta',
+    'DDD/D1/D2',
+    'DDD/D1/D2/D3',
     'DDF/D1/D2',
     'DDF/D1/D2/gamma',
-    'DDD/D1',
-    'DDD/D1/D2',
+    wc_rev=2)
+  # The locally deleted nodes.
+  expected_status.tweak(
+    'D/D1',
+    'F/alpha',
+    'DD/D1/D2',
+    'DF/D1/beta',
     'DDD/D1/D2/D3',
-    )
-
-  expected_status = svntest.wc.State('', {
-    ''                  : Item(status='  ', wc_rev=3),
-    'D'                 : Item(status='  ', wc_rev=3),
-    'DD'                : Item(status='  ', wc_rev=3),
-    'DDD'               : Item(status='  ', wc_rev=3),
-    'DDF'               : Item(status='  ', wc_rev=3),
-    'DF'                : Item(status='  ', wc_rev=3),
-    'F'                 : Item(status='  ', wc_rev=3),
-    'D/D1'              : Item(status='D ', wc_rev=2, treeconflict='C'),
-    'F/alpha'           : Item(status='D ', wc_rev=2, treeconflict='C'),
-    })
-  expected_status.tweak('F/alpha', 'D/D1', switched='S')
+    'DDF/D1/D2/gamma',
+    status='D ')
  
   svntest.actions.deep_trees_run_tests_scheme_for_switch(sbox,
     [ DeepTreesTestCase("local_leaf_del_incoming_tree_del",
@@ -2359,7 +2358,7 @@ def tree_conflicts_on_switch_3(sbox):
 
   expected_output = deep_trees_conflict_output
 
-  expected_disk = state_empty_dirs
+  expected_disk = disk_empty_dirs
 
   expected_status = deep_trees_status_local_tree_del
   expected_status.tweak('F/alpha', 'D/D1', 'DF/D1', 'DD/D1', 'DDF/D1',
index 969843c..03bf10a 100755 (executable)
@@ -3930,7 +3930,7 @@ disk_after_leaf_edit = svntest.actions.deep_trees_after_leaf_edit
 disk_after_leaf_del = svntest.actions.deep_trees_after_leaf_del
 disk_after_tree_del = svntest.actions.deep_trees_after_tree_del
 
-state_empty_dirs = svntest.actions.deep_trees_empty_dirs
+disk_empty_dirs = svntest.actions.deep_trees_empty_dirs
 
 deep_trees_conflict_output = svntest.actions.deep_trees_conflict_output
 deep_trees_conflict_output_skipped = \
@@ -3951,7 +3951,7 @@ def tree_conflicts_on_update_1_1(sbox):
 
   expected_output = deep_trees_conflict_output
 
-  expected_disk = state_empty_dirs
+  expected_disk = disk_empty_dirs
 
   # Files delta, epsilon, and zeta are not in the working copy, but
   # "unquiet" status includes them.
@@ -3978,7 +3978,7 @@ def tree_conflicts_on_update_1_2(sbox):
 
   expected_output = deep_trees_conflict_output
 
-  expected_disk = state_empty_dirs
+  expected_disk = disk_empty_dirs
 
   expected_status = deep_trees_status_local_tree_del
 
@@ -4021,41 +4021,40 @@ def tree_conflicts_on_update_2_2(sbox):
   ### Current behaviour fails to show conflicts when deleting
   ### a directory tree that has modifications. (Will be solved
   ### when dirs_same_p() is implemented)
-  expected_output = svntest.wc.State('', {
-    'D/D1'              : Item(status='  ', treeconflict='C'),
-    'F/alpha'           : Item(status='  ', treeconflict='C'),
-    'DD/D1'             : Item(status='D '),
-    'DF/D1'             : Item(status='D '),
-    'DDD/D1'            : Item(status='D '),
-    'DDF/D1'            : Item(status='D '),
-    })
+  expected_output = deep_trees_conflict_output
+
+  expected_disk = disk_empty_dirs
 
-  expected_disk = svntest.actions.deep_trees_virginal_state.copy()
-  expected_disk.remove(
+  expected_status = svntest.actions.deep_trees_virginal_state.copy()
+  expected_status.add({'' : Item()})
+  expected_status.tweak(contents=None, status='  ', wc_rev=3)
+  # Tree conflicts.
+  expected_status.tweak(
+    'D/D1',
     'F/alpha',
-    'DF/D1',
-    'DF/D1/beta',
     'DD/D1',
-    'DD/D1/D2',
+    'DF/D1',
+    'DDD/D1',
     'DDF/D1',
+    treeconflict='C', wc_rev=2)
+  # Anything that's below a tree-conflict is also at an earlier rev.
+  expected_status.tweak(
+    'DD/D1/D2',
+    'DF/D1/beta',
+    'DDD/D1/D2',
+    'DDD/D1/D2/D3',
     'DDF/D1/D2',
     'DDF/D1/D2/gamma',
-    'DDD/D1',
-    'DDD/D1/D2',
+    wc_rev=2)
+  # The locally deleted nodes.
+  expected_status.tweak(
+    'D/D1',
+    'F/alpha',
+    'DD/D1/D2',
+    'DF/D1/beta',
     'DDD/D1/D2/D3',
-    )
-
-  expected_status = svntest.wc.State('', {
-    ''                  : Item(status='  ', wc_rev=3),
-    'D'                 : Item(status='  ', wc_rev=3),
-    'DD'                : Item(status='  ', wc_rev=3),
-    'DDD'               : Item(status='  ', wc_rev=3),
-    'DDF'               : Item(status='  ', wc_rev=3),
-    'DF'                : Item(status='  ', wc_rev=3),
-    'F'                 : Item(status='  ', wc_rev=3),
-    'D/D1'              : Item(status='D ', wc_rev=2, treeconflict='C'),
-    'F/alpha'           : Item(status='D ', wc_rev=2, treeconflict='C'),
-    })
+    'DDF/D1/D2/gamma',
+    status='D ')
 
   svntest.actions.deep_trees_run_tests_scheme_for_update(sbox,
     [ DeepTreesTestCase("local_leaf_del_incoming_tree_del",
@@ -4082,16 +4081,19 @@ def tree_conflicts_on_update_2_3(sbox):
     'D/D1',
     'F/alpha',
     'DDD/D1',
-    'DDD/D1/D2/D3',  ### No output!
+    'DDD/D1/D2/D3',
     ]
 
   chdir_skip_paths = [
     ('D', 'D1'),
-    ('D/D1', ''),  ### 16005: path does not exist (in repo)
     ('F', 'alpha'),
     ('DDD', 'D1'),
-    ('DDD/D1/D2/D3', ''), ### ditto
     ]
+  # Note: We don't step *into* a directory that's deleted in the repository.
+  # E.g. ('DDD/D1/D2', '') would correctly issue a "path does not
+  # exist" error, because at that point it can't know about the
+  # tree-conflict on DDD/D1. ('D/D1', '') likewise, as tree-conflict
+  # information is stored in the parent of a victim directory.
 
   svntest.actions.deep_trees_skipping_on_update(sbox,
     DeepTreesTestCase("local_leaf_edit_incoming_tree_del",
@@ -4112,7 +4114,7 @@ def tree_conflicts_on_update_3(sbox):
 
   expected_output = deep_trees_conflict_output
 
-  expected_disk = state_empty_dirs
+  expected_disk = disk_empty_dirs
 
   expected_status = deep_trees_status_local_tree_del
 
@@ -4184,7 +4186,7 @@ test_list = [ None,
               tree_conflicts_on_update_1_2,
               tree_conflicts_on_update_2_1,
               tree_conflicts_on_update_2_2,
-              XFail(tree_conflicts_on_update_2_3),
+              tree_conflicts_on_update_2_3,
               tree_conflicts_on_update_3,
              ]
 
index 6cb8e02..c64969c 100644 (file)
@@ -44,7 +44,7 @@ test_platform_specific_auth_providers(const char **msg,
        "return NULL");
 
   /* Make sure you get two providers when retrieving all auth providers */
-  svn_auth_get_platform_specific_client_providers(&providers, pool);
+  svn_auth_get_platform_specific_client_providers(&providers, NULL, pool);
 
 #if defined(SVN_HAVE_KEYCHAIN_SERVICES) || defined(SVN_HAVE_GNOME_KEYRING) || defined(SVN_HAVE_KWALLET) || (defined(WIN32) && !defined(__MINGW32__))
   if (providers->nelts != 2)
index 3cb1cc2..e770200 100755 (executable)
@@ -39,7 +39,7 @@ opmap = {
 def am_uuid(ctx):
   "uuids"
   db = ctx.uuids_db
-  ok(db.keys() == [1], 'uuid Table Structure')
+  ok(list(db.keys()) == [1], 'uuid Table Structure')
   ok(re.match(r'^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',
     db[1]), 'UUID format')
   print "Repos UUID: %s" % db[1]
@@ -153,7 +153,7 @@ def am_nodes(ctx):
       nid,cid,tid = rec[0].split(".")
       data[tid.rjust(20)+nd.createpath] = (rec[0], nd)
       rec = cur.next()
-    k = data.keys()
+    k = list(data.keys())
     k.sort()
     reptype = {"fulltext":"F", "delta":"D"}
     for i in k:
index a3e85a5..826e197 100755 (executable)
@@ -364,7 +364,7 @@ class Contributor:
                           self.big_name(html=True), True))
     unique_logs = { }
 
-    sorted_activities = self.activities.keys()
+    sorted_activities = list(self.activities.keys())
     sorted_activities.sort()
 
     out.write('<div class="h2" id="activities" title="activities">\n\n')
@@ -389,7 +389,7 @@ class Contributor:
     out.write('</table>\n\n')
     out.write('</div>\n\n')
 
-    sorted_logs = unique_logs.keys()
+    sorted_logs = list(unique_logs.keys())
     sorted_logs.sort()
     for log in sorted_logs:
       out.write('<hr />\n')
@@ -658,7 +658,7 @@ def drop(revision_url_pattern):
   # sort by number of contributions, so the most active people appear at
   # the top -- that way we know whom to look at first for commit access
   # proposals.
-  sorted_contributors = Contributor.all_contributors.values()
+  sorted_contributors = list(Contributor.all_contributors.values())
   sorted_contributors.sort()
   for c in sorted_contributors:
     if c not in seen_contributors:
index 0f0ae14..9171771 100755 (executable)
@@ -4,7 +4,7 @@
 #                       C error codes
 #
 # ====================================================================
-# Copyright (c) 2007 CollabNet.  All rights reserved.
+# Copyright (c) 2007-2008 CollabNet.  All rights reserved.
 #
 # * This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution.  The terms
@@ -58,7 +58,7 @@ public class ErrorCodes
 {
 """)
 
-  keys = error_codes.keys()
+  keys = list(error_codes.keys())
   keys.sort()
 
   for key in keys:
index 9d1bdae..634047f 100755 (executable)
@@ -93,7 +93,8 @@ STATS = """1/1/2003       70
 8/1/2008              307923
 9/1/2008              254757
 10/1/2008             268081
-11/1/2008             299071"""
+11/1/2008             299071
+12/1/2008             330884"""
 
 
 def get_date(raw_date):
index 5152c97..b7149e5 100755 (executable)
@@ -12,7 +12,7 @@ class NodePath:
 
     def dump(self):
         print (' ' * 3) + self.path
-        headers = self.headers.keys()
+        headers = list(self.headers.keys())
         headers.sort()
         for header in headers:
             print (' ' * 6) + header + ': ' + self.headers[header]
@@ -21,7 +21,7 @@ class NodePath:
 def dump_revision(rev, nodepaths):
     sys.stderr.write('* Normalizing revision ' + rev + '...')
     print 'Revision ' + rev
-    paths = nodepaths.keys()
+    paths = list(nodepaths.keys())
     paths.sort()
     for path in paths:
         nodepath = nodepaths[path]
index 97ad01c..e2c25fd 100755 (executable)
@@ -1,19 +1,23 @@
 #!/usr/bin/env python
 
-import os, sys
+import os, re, sys
+
+msgstr_re = re.compile('msgstr\[\d+\] "')
 
 def parse_translation(f):
     """Read a single translation entry from the file F and return a
-    tuple with the comments, msgid and msgstr.  The comments is returned
-    as a list of lines which do not end in new-lines.  The msgid and
-    msgstr are strings, possibly with embedded newlines"""
+    tuple with the comments, msgid, msgid_plural and msgstr.  The comments is
+    returned as a list of lines which do not end in new-lines.  The msgid is
+    string.  The msgid_plural is string or None.  The msgstr is a list of
+    strings.  The msgid, msgid_plural and msgstr strings can contain embedded
+    newlines"""
     line = f.readline()
 
     # Parse comments
     comments = []
     while 1:
         if line.strip() == '':
-            return comments, None, None
+            return comments, None, None, None
         elif line[0] == '#':
             comments.append(line[:-1])
         else:
@@ -30,20 +34,51 @@ def parse_translation(f):
             break
         msgid += '\n' + line[:-1]
 
+    # Parse optional msgid_plural
+    msgid_plural = None
+    if line[:14] == 'msgid_plural "':
+        if line[-2] != '"':
+            raise RuntimeError("parse error")
+        msgid_plural = line[13:-1]
+        while 1:
+            line = f.readline()
+            if line[0] != '"':
+                break
+            msgid_plural += '\n' + line[:-1]
+
     # Parse msgstr
-    if line[:8] != 'msgstr "' or line[-2] != '"':
-        raise RuntimeError("parse error")
-    msgstr = line[7:-1]
-    while 1:
-        line = f.readline()
-        if len(line) == 0 or line[0] != '"':
-            break
-        msgstr += '\n' + line[:-1]
+    msgstr = []
+    if not msgid_plural:
+        if line[:8] != 'msgstr "' or line[-2] != '"':
+            raise RuntimeError("parse error")
+        msgstr.append(line[7:-1])
+        while 1:
+            line = f.readline()
+            if len(line) == 0 or line[0] != '"':
+                break
+            msgstr[0] += '\n' + line[:-1]
+    else:
+        if line[:7] != 'msgstr[' or line[-2] != '"':
+            raise RuntimeError("parse error")
+        i = 0
+        while 1:
+            matched_msgstr = msgstr_re.match(line)
+            if matched_msgstr:
+                matched_msgstr_len = len(matched_msgstr.group(0))
+                msgstr.append(line[matched_msgstr_len-1:-1])
+            else:
+                break
+            while 1:
+                line = f.readline()
+                if len(line) == 0 or line[0] != '"':
+                    break
+                msgstr[i] += '\n' + line[:-1]
+            i += 1
 
     if line.strip() != '':
         raise RuntimeError("parse error")
 
-    return comments, msgid, msgstr
+    return comments, msgid, msgid_plural, msgstr
 
 def split_comments(comments):
     """Split COMMENTS into flag comments and other comments.  Flag
@@ -74,7 +109,7 @@ def main(argv):
     # Read the source po file into a hash
     source = {}
     while 1:
-        comments, msgid, msgstr = parse_translation(sys.stdin)
+        comments, msgid, msgid_plural, msgstr = parse_translation(sys.stdin)
         if not comments and msgid is None:
             break
         if msgid is not None:
@@ -92,7 +127,7 @@ def main(argv):
     update_count = 0
     untranslated = 0
     while 1:
-        comments, msgid, msgstr = parse_translation(infile)
+        comments, msgid, msgid_plural, msgstr = parse_translation(infile)
         if not comments and msgid is None:
             break
         if not first:
@@ -114,9 +149,17 @@ def main(argv):
                     comments = new_comments
             outfile.write('\n'.join(comments) + '\n')
             outfile.write('msgid ' + msgid + '\n')
-            outfile.write('msgstr ' + msgstr + '\n')
-        if msgstr == '""':
-            untranslated += 1
+            if not msgid_plural:
+                outfile.write('msgstr ' + msgstr[0] + '\n')
+            else:
+                outfile.write('msgid_plural ' + msgid_plural + '\n')
+                n = 0
+                for i in msgstr:
+                    outfile.write('msgstr[%s] %s\n' % (n, msgstr[n]))
+                    n += 1
+        for m in msgstr:
+            if m == '""':
+                untranslated += 1
 
     # We're done.  Tell the user what we did.
     print('%d strings updated. '
index a64ca75..9418cd8 100755 (executable)
@@ -87,7 +87,7 @@ def list_frequencies(list):
   for item in list:
     counter[item] = counter.get(item, 0) + 1
 
-  frequencies = counter.items()
+  frequencies = list(counter.items())
   frequencies.sort(_freqtable_cmp)
 
   return frequencies
index 6c08746..1acdd93 100755 (executable)
@@ -4,7 +4,7 @@
 #                 their numeric error code values
 #
 # ====================================================================
-# Copyright (c) 2005 CollabNet.  All rights reserved.
+# Copyright (c) 2005, 2008 CollabNet.  All rights reserved.
 #
 # * This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution.  The terms
@@ -88,7 +88,7 @@ if __name__ == "__main__":
   if sys.argv[1] == 'list':
     if len(sys.argv) > 2:
       usage_and_exit()
-    codes = __svn_error_codes.keys()
+    codes = list(__svn_error_codes.keys())
     codes.sort()
 
   # Get a list of code by parsing stdin for apr_err=CODE instances
index b456e51..afa68dc 100755 (executable)
@@ -117,7 +117,7 @@ class SVNShell(Cmd):
         print "Path '%s' not found." % newpath
         return
 
-    keys = entries.keys()
+    keys = list(entries.keys())
     keys.sort()
 
     print "   REV   AUTHOR  NODE-REV-ID     SIZE         DATE NAME"
index 3f9af9b..17c8c11 100755 (executable)
@@ -349,7 +349,7 @@ class Commit(Messenger):
     e_ptr, e_baton = svn.delta.make_editor(editor, self.pool)
     svn.repos.replay(repos.root_this, e_ptr, e_baton, self.pool)
 
-    self.changelist = editor.get_changes().items()
+    self.changelist = list(editor.get_changes().items())
     self.changelist.sort()
 
     # collect the set of groups and the unique sets of params for the options
@@ -357,7 +357,7 @@ class Commit(Messenger):
     for path, change in self.changelist:
       for (group, params) in self.cfg.which_groups(path):
         # turn the params into a hashable object and stash it away
-        param_list = params.items()
+        param_list = list(params.items())
         param_list.sort()
         # collect the set of paths belonging to this group
         if (group, tuple(param_list)) in self.groups:
@@ -379,7 +379,7 @@ class Commit(Messenger):
         else:
           dirs[path[:idx]] = None
 
-    dirlist = dirs.keys()
+    dirlist = list(dirs.keys())
 
     commondir, dirlist = get_commondir(dirlist)
 
@@ -446,7 +446,7 @@ class PropChange(Messenger):
     self.groups = { }
     for (group, params) in self.cfg.which_groups(''):
       # turn the params into a hashable object and stash it away
-      param_list = params.items()
+      param_list = list(params.items())
       param_list.sort()
       self.groups[group, tuple(param_list)] = params
 
@@ -537,7 +537,7 @@ class Lock(Messenger):
     for path in self.dirlist:
       for (group, params) in self.cfg.which_groups(path):
         # turn the params into a hashable object and stash it away
-        param_list = params.items()
+        param_list = list(params.items())
         param_list.sort()
         # collect the set of paths belonging to this group
         if (group, tuple(param_list)) in self.groups:
index 575a365..068f9b9 100755 (executable)
@@ -77,10 +77,10 @@ class Config:
                                      (filename, lineno))
 
     def sections(self):
-        return self._sections_dict.keys()
+        return list(self._sections_dict.keys())
 
     def options(self, section):
-        return self._sections_dict.get(section, {}).keys()
+        return list(self._sections_dict.get(section, {}).keys())
 
     def get(self, section, option, default=None):
         return self._sections_dict.get(option, default)
dissimilarity index 77%
index d21decc..fdab4fb 100644 (file)
Binary files a/www/images/svn-dav-securityspace-survey.png and b/www/images/svn-dav-securityspace-survey.png differ
index 922adb8..db250c9 100644 (file)
@@ -44,6 +44,7 @@ for <code>mod_dav_svn</code>.  Thanks Security Space!</p>
 <table style="margin-left: auto; margin-right: auto;" border="0"
   cellpadding="5" cellspacing="0">
   <tr><th>Date</th><th># Servers</th></tr>
+  <tr><td>December 2008</td><td style="text-align: right">330,884</td></tr>
   <tr><td>November 2008</td><td style="text-align: right">299,071</td></tr>
   <tr><td>October 2008</td><td style="text-align: right">268,081</td></tr>
   <tr><td>September 2008</td><td style="text-align: right">254,757</td></tr>