You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2017/12/07 14:42:10 UTC

svn commit: r1817375 [2/2] - in /subversion/branches/shelve-checkpoint: ./ build/generator/ subversion/include/ subversion/include/private/ subversion/libsvn_client/ subversion/libsvn_fs_fs/ subversion/libsvn_ra_serf/ subversion/libsvn_ra_svn/ subversi...

Modified: subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svnadmin_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svnadmin_tests.py?rev=1817375&r1=1817374&r2=1817375&view=diff
==============================================================================
--- subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svnadmin_tests.py (original)
+++ subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svnadmin_tests.py Thu Dec  7 14:42:10 2017
@@ -129,6 +129,15 @@ def check_hotcopy_fsfs_fsx(src, dst):
         if src_file == 'rep-cache.db':
           db1 = svntest.sqlite3.connect(src_path)
           db2 = svntest.sqlite3.connect(dst_path)
+          schema1 = db1.execute("pragma user_version").fetchone()[0]
+          schema2 = db2.execute("pragma user_version").fetchone()[0]
+          if schema1 != schema2:
+            raise svntest.Failure("rep-cache schema differs: '%s' vs. '%s'"
+                                  % (schema1, schema2))
+          # Can't test newer rep-cache schemas with an old built-in SQLite.
+          if schema1 >= 2 and svntest.sqlite3.sqlite_version_info < (3, 8, 2):
+            continue
+
           rows1 = []
           rows2 = []
           for row in db1.execute("select * from rep_cache order by hash"):
@@ -746,7 +755,7 @@ def verify_windows_paths_in_repos(sbox):
                  "* Verified revision 0.\n",
                  "* Verified revision 1.\n",
                  "* Verified revision 2.\n"], output)
-  elif svntest.main.fs_has_rep_sharing():
+  elif svntest.main.fs_has_rep_sharing() and not svntest.main.is_fs_type_bdb():
     svntest.verify.compare_and_display_lines(
       "Error while running 'svnadmin verify'.",
       'STDOUT', ["* Verifying repository metadata ...\n",
@@ -790,6 +799,10 @@ def fsfs_file(repo_dir, kind, rev):
 def verify_incremental_fsfs(sbox):
   """svnadmin verify detects corruption dump can't"""
 
+  if svntest.main.options.fsfs_version is not None and \
+     svntest.main.options.fsfs_version not in [4, 6]:
+    raise svntest.Skip("Unsupported prepackaged repository version")
+
   # setup a repo with a directory 'c:hi'
   # use physical addressing as this is hard to provoke with logical addressing
   sbox.build(create_wc = False,
@@ -807,7 +820,7 @@ def verify_incremental_fsfs(sbox):
   # the listing itself is valid.
   r2 = fsfs_file(sbox.repo_dir, 'revs', '2')
   if r2.endswith('pack'):
-    raise svntest.Skip('Test doesn\'t handle packed revisions')
+    raise svntest.Skip("Test doesn't handle packed revisions")
 
   fp = open(r2, 'wb')
   fp.write(b"""id: 0-2.0.r2/0
@@ -1654,6 +1667,10 @@ text
 def verify_non_utf8_paths(sbox):
   "svnadmin verify with non-UTF-8 paths"
 
+  if svntest.main.options.fsfs_version is not None and \
+     svntest.main.options.fsfs_version not in [4, 6]:
+    raise svntest.Skip("Unsupported prepackaged repository version")
+
   dumpfile = clean_dumpfile()
 
   # Corruption only possible in physically addressed revisions created
@@ -1682,9 +1699,6 @@ def verify_non_utf8_paths(sbox):
     elif line == b"text: 1 340 44 32 a6be7b4cf075fd39e6a99eb69a31232b\n":
       # phys, deltified directories: fix up the representation checksum
       fp_new.write(b"text: 1 340 44 32 f2e93e73272cac0f18fccf16f224eb93\n")
-    elif line == b"text: 1 6 31 31 90f306aa9bfd72f456072076a2bd94f7\n":
-      # log addressing: fix up the representation checksum
-      fp_new.write(b"text: 1 6 31 31 db2d4a0bad5dff0aea9a288dec02f1fb\n")
     elif line == b"cpath: /A\n":
       # also fix up the 'created path' field
       fp_new.write(b"cpath: /\xE6\n")
@@ -2520,7 +2534,7 @@ def verify_denormalized_names(sbox):
     ".*Verified revision 7."]
 
   # The BDB backend doesn't do global metadata verification.
-  if (svntest.main.fs_has_rep_sharing()):
+  if (svntest.main.fs_has_rep_sharing() and not svntest.main.is_fs_type_bdb()):
     expected_output_regex_list.insert(0, ".*Verifying repository metadata.*")
 
   if svntest.main.options.fsfs_sharding is not None:
@@ -3351,6 +3365,7 @@ def dump_no_op_change(sbox):
                                      sbox2.repo_url + '/bar')
 
 @XFail(svntest.main.is_fs_type_bdb)
+@XFail(svntest.main.is_fs_type_fsx)
 @Issue(4623)
 def dump_no_op_prop_change(sbox):
   "svnadmin dump with no-op property change"

Modified: subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/__init__.py
URL: http://svn.apache.org/viewvc/subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/__init__.py?rev=1817375&r1=1817374&r2=1817375&view=diff
==============================================================================
--- subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/__init__.py (original)
+++ subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/__init__.py Thu Dec  7 14:42:10 2017
@@ -35,11 +35,8 @@ if sys.hexversion < 0x2070000:
 try:
   import sqlite3
 except ImportError:
-  try:
-    from pysqlite2 import dbapi2 as sqlite3
-  except ImportError:
-    sys.stderr.write('[SKIPPED] Python sqlite3 module required\n')
-    sys.exit(0)
+  sys.stderr.write('[SKIPPED] Python sqlite3 module required\n')
+  sys.exit(0)
 
 # don't export this name
 del sys

Modified: subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/main.py
URL: http://svn.apache.org/viewvc/subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/main.py?rev=1817375&r1=1817374&r2=1817375&view=diff
==============================================================================
--- subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/main.py (original)
+++ subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/main.py Thu Dec  7 14:42:10 2017
@@ -1574,9 +1574,11 @@ def is_fs_log_addressing():
   return is_fs_type_fsx() or \
         (is_fs_type_fsfs() and options.server_minor_version >= 9)
 
+def fs_has_sha1():
+  return fs_has_rep_sharing()
+
 def fs_has_rep_sharing():
-  return is_fs_type_fsx() or \
-        (is_fs_type_fsfs() and options.server_minor_version >= 6)
+  return options.server_minor_version >= 6
 
 def fs_has_pack():
   return is_fs_type_fsx() or \
@@ -2216,19 +2218,18 @@ def parse_options(arglist=sys.argv[1:],
                  % SVN_VER_MINOR)
 
   # Make sure the server-minor-version matches the fsfs-version parameter.
+  #
+  # Server versions that introduced the respective FSFS formats:
+  introducing_version = { 1:1, 2:4, 3:5, 4:6, 6:8, 7:9 }
   if options.fsfs_version:
-    if options.fsfs_version == 6:
-      if options.server_minor_version \
-        and options.server_minor_version != 8 \
-        and options.server_minor_version != SVN_VER_MINOR:
-        parser.error("--fsfs-version=6 requires --server-minor-version=8")
-      options.server_minor_version = 8
-    if options.fsfs_version == 4:
+    if options.fsfs_version in introducing_version:
+      introduced_in = introducing_version[options.fsfs_version]
       if options.server_minor_version \
-        and options.server_minor_version != 7 \
+        and options.server_minor_version != introduced_in \
         and options.server_minor_version != SVN_VER_MINOR:
-        parser.error("--fsfs-version=4 requires --server-minor-version=7")
-      options.server_minor_version = 7
+        parser.error("--fsfs-version=%d requires --server-minor-version=%d" \
+                     % (options.fsfs_version, introduced_in))
+      options.server_minor_version = introduced_in
     pass
     # ### Add more tweaks here if and when we support pre-cooked versions
     # ### of FSFS repositories.

Modified: subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/verify.py
URL: http://svn.apache.org/viewvc/subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/verify.py?rev=1817375&r1=1817374&r2=1817375&view=diff
==============================================================================
--- subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/verify.py (original)
+++ subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/verify.py Thu Dec  7 14:42:10 2017
@@ -467,10 +467,11 @@ def verify_exit_code(message, actual, ex
 # A simple dump file parser.  While sufficient for the current
 # testsuite it doesn't cope with all valid dump files.
 class DumpParser:
-  def __init__(self, lines):
+  def __init__(self, lines, ignore_sha1=False):
     self.current = 0
     self.lines = lines
     self.parsed = {}
+    self.ignore_sha1 = ignore_sha1
 
   def parse_line(self, regex, required=True):
     m = re.match(regex, self.lines[self.current])
@@ -660,6 +661,9 @@ class DumpParser:
       if not header in headers:
         node[key] = None
         continue
+      if self.ignore_sha1 and (key in ['copy_sha1', 'text_sha1']):
+        node[key] = None
+        continue
       m = re.match(regex, headers[header])
       if not m:
         raise SVNDumpParseError("expected '%s' at line %d\n%s"
@@ -735,8 +739,7 @@ def compare_dump_files(message, label, e
   of lines as returned by run_and_verify_dump, and check that the same
   revisions, nodes, properties, etc. are present in both dumps.
   """
-
-  parsed_expected = DumpParser(expected).parse()
+  parsed_expected = DumpParser(expected, not svntest.main.fs_has_sha1()).parse()
   parsed_actual = DumpParser(actual).parse()
 
   if ignore_uuid:

Modified: subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/wc.py
URL: http://svn.apache.org/viewvc/subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/wc.py?rev=1817375&r1=1817374&r2=1817375&view=diff
==============================================================================
--- subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/wc.py (original)
+++ subversion/branches/shelve-checkpoint/subversion/tests/cmdline/svntest/wc.py Thu Dec  7 14:42:10 2017
@@ -1092,17 +1092,8 @@ def svn_uri_quote(url):
 
 def python_sqlite_can_read_wc():
   """Check if the Python builtin is capable enough to peek into wc.db"""
-
-  try:
-    db = svntest.sqlite3.connect('')
-
-    c = db.cursor()
-    c.execute('select sqlite_version()')
-    ver = tuple(map(int, c.fetchall()[0][0].split('.')))
-
-    return ver >= (3, 6, 18) # Currently enough (1.7-1.9)
-  except:
-    return False
+  # Currently enough (1.7-1.9)
+  return svntest.sqlite3.sqlite_version_info >= (3, 6, 18)
 
 def open_wc_db(local_path):
   """Open the SQLite DB for the WC path LOCAL_PATH.

Modified: subversion/branches/shelve-checkpoint/subversion/tests/cmdline/update_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/shelve-checkpoint/subversion/tests/cmdline/update_tests.py?rev=1817375&r1=1817374&r2=1817375&view=diff
==============================================================================
--- subversion/branches/shelve-checkpoint/subversion/tests/cmdline/update_tests.py (original)
+++ subversion/branches/shelve-checkpoint/subversion/tests/cmdline/update_tests.py Thu Dec  7 14:42:10 2017
@@ -6840,6 +6840,21 @@ def update_delete_switched(sbox):
   svntest.actions.run_and_verify_update(wc_dir, None, None, expected_status,
                                         [], False, sbox.ospath('A'), '-r', 0)
 
+@XFail()
+def update_add_missing_local_add(sbox):
+  "update adds missing local addition"
+  
+  sbox.build(read_only=True)
+  
+  # Note that updating 'A' to r0 doesn't reproduce this issue...
+  sbox.simple_update('', revision='0')
+  sbox.simple_mkdir('A')
+  sbox.simple_add_text('mumumu', 'A/mu')
+  os.unlink(sbox.ospath('A/mu'))
+  os.rmdir(sbox.ospath('A'))
+  
+  sbox.simple_update()
+
 #######################################################################
 # Run the tests
 
@@ -6930,6 +6945,7 @@ test_list = [ None,
               update_add_conflicted_deep,
               missing_tmp_update,
               update_delete_switched,
+              update_add_missing_local_add,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/shelve-checkpoint/subversion/tests/libsvn_ra/ra-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/shelve-checkpoint/subversion/tests/libsvn_ra/ra-test.c?rev=1817375&r1=1817374&r2=1817375&view=diff
==============================================================================
--- subversion/branches/shelve-checkpoint/subversion/tests/libsvn_ra/ra-test.c (original)
+++ subversion/branches/shelve-checkpoint/subversion/tests/libsvn_ra/ra-test.c Thu Dec  7 14:42:10 2017
@@ -427,17 +427,7 @@ lock_cb(void *baton,
   struct lock_result_t *result = apr_palloc(b->pool,
                                             sizeof(struct lock_result_t));
 
-  if (lock)
-    {
-      result->lock = apr_palloc(b->pool, sizeof(svn_lock_t));
-      *result->lock = *lock;
-      result->lock->path = apr_pstrdup(b->pool, lock->path);
-      result->lock->token = apr_pstrdup(b->pool, lock->token);
-      result->lock->owner = apr_pstrdup(b->pool, lock->owner);
-      result->lock->comment = apr_pstrdup(b->pool, lock->comment);
-    }
-  else
-    result->lock = NULL;
+  result->lock = svn_lock_dup(lock, b->pool);
   result->err = ra_err;
 
   svn_hash_sets(b->results, apr_pstrdup(b->pool, path), result);
@@ -1682,6 +1672,118 @@ commit_empty_last_change(const svn_test_
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+commit_locked_file(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+  const char *url;
+  svn_ra_callbacks2_t *cbtable;
+  svn_ra_session_t *session;
+  const svn_delta_editor_t *editor;
+  void *edit_baton;
+  void *root_baton;
+  void *file_baton;
+  struct lock_result_t *lock_result;
+  apr_hash_t *lock_tokens;
+  svn_txdelta_window_handler_t handler;
+  void *handler_baton;
+  svn_revnum_t fetched_rev;
+  apr_hash_t *fetched_props;
+  const svn_string_t *propval;
+
+  SVN_ERR(svn_test__create_repos2(NULL, &url, NULL,
+                                  "test-repo-commit-locked-file-test",
+                                  opts, pool, pool));
+
+  SVN_ERR(svn_ra_initialize(pool));
+  SVN_ERR(svn_ra_create_callbacks(&cbtable, pool));
+  SVN_ERR(svn_test__init_auth_baton(&cbtable->auth_baton, pool));
+
+  SVN_ERR(svn_ra_open4(&session, NULL, url, NULL, cbtable,
+                       NULL, NULL, pool));
+  SVN_ERR(svn_ra_get_commit_editor3(session, &editor, &edit_baton,
+                                    apr_hash_make(pool),
+                                    NULL, NULL, NULL, TRUE, pool));
+  /* Add a file. */
+  SVN_ERR(editor->open_root(edit_baton, SVN_INVALID_REVNUM,
+                            pool, &root_baton));
+  SVN_ERR(editor->add_file("file", root_baton, NULL, SVN_INVALID_REVNUM,
+                           pool, &file_baton));
+  SVN_ERR(editor->close_file(file_baton, NULL, pool));
+  SVN_ERR(editor->close_directory(root_baton, pool));
+  SVN_ERR(editor->close_edit(edit_baton, pool));
+
+  /* Acquire a lock on this file. */
+  {
+    struct lock_baton_t baton = {0};
+    svn_revnum_t rev = 1;
+    apr_hash_t *lock_targets;
+
+    baton.results = apr_hash_make(pool);
+    baton.pool = pool;
+
+    lock_targets = apr_hash_make(pool);
+    svn_hash_sets(lock_targets, "file", &rev);
+    SVN_ERR(svn_ra_lock(session, lock_targets, "comment", FALSE,
+                        lock_cb, &baton, pool));
+
+    SVN_ERR(expect_lock("file", baton.results, session, pool));
+    lock_result = svn_hash_gets(baton.results, "file");
+  }
+
+  /* Open a new session using the file parent's URL. */
+  SVN_ERR(svn_ra_open4(&session, NULL, url, NULL, cbtable,
+                       NULL, NULL, pool));
+
+  /* Create a new commit editor supplying our lock token. */
+  lock_tokens = apr_hash_make(pool);
+  svn_hash_sets(lock_tokens, "file", lock_result->lock->token);
+  SVN_ERR(svn_ra_get_commit_editor3(session, &editor, &edit_baton,
+                                    apr_hash_make(pool), NULL, NULL,
+                                    lock_tokens, TRUE, pool));
+  /* Edit the locked file. */
+  SVN_ERR(editor->open_root(edit_baton, SVN_INVALID_REVNUM,
+                            pool, &root_baton));
+  SVN_ERR(editor->open_file("file", root_baton, SVN_INVALID_REVNUM, pool,
+                            &file_baton));
+  SVN_ERR(editor->apply_textdelta(file_baton, NULL, pool, &handler,
+                                  &handler_baton));
+  SVN_ERR(svn_txdelta_send_string(svn_string_create("A", pool),
+                                  handler, handler_baton, pool));
+  SVN_ERR(editor->close_file(file_baton, NULL, pool));
+  SVN_ERR(editor->close_directory(root_baton, pool));
+  SVN_ERR(editor->close_edit(edit_baton, pool));
+
+  /* Check the result. */
+  SVN_ERR(svn_ra_get_file(session, "file", SVN_INVALID_REVNUM, NULL,
+                          &fetched_rev, NULL, pool));
+  SVN_TEST_INT_ASSERT((int) fetched_rev, 2);
+
+  /* Change property of the locked file. */
+  SVN_ERR(svn_ra_get_commit_editor3(session, &editor, &edit_baton,
+                                    apr_hash_make(pool), NULL, NULL,
+                                    lock_tokens, TRUE, pool));
+  SVN_ERR(editor->open_root(edit_baton, SVN_INVALID_REVNUM,
+                            pool, &root_baton));
+  SVN_ERR(editor->open_file("file", root_baton, SVN_INVALID_REVNUM, pool,
+                            &file_baton));
+  SVN_ERR(editor->change_file_prop(file_baton, "propname",
+                                   svn_string_create("propval", pool),
+                                   pool));
+  SVN_ERR(editor->close_file(file_baton, NULL, pool));
+  SVN_ERR(editor->close_directory(root_baton, pool));
+  SVN_ERR(editor->close_edit(edit_baton, pool));
+
+  /* Check the result. */
+  SVN_ERR(svn_ra_get_file(session, "file", SVN_INVALID_REVNUM, NULL,
+                          &fetched_rev, &fetched_props, pool));
+  SVN_TEST_INT_ASSERT((int) fetched_rev, 3);
+  propval = svn_hash_gets(fetched_props, "propname");
+  SVN_TEST_ASSERT(propval);
+  SVN_TEST_STRING_ASSERT(propval->data, "propval");
+
+  return SVN_NO_ERROR;
+}
+
 
 /* The test table.  */
 
@@ -1716,6 +1818,8 @@ static struct svn_test_descriptor_t test
                        "verify checkout over a tunnel"),
     SVN_TEST_OPTS_PASS(commit_empty_last_change,
                        "check how last change applies to empty commit"),
+    SVN_TEST_OPTS_PASS(commit_locked_file,
+                       "check commit editor for a locked file"),
     SVN_TEST_NULL
   };
 

Modified: subversion/branches/shelve-checkpoint/subversion/tests/libsvn_subr/subst_translate-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/shelve-checkpoint/subversion/tests/libsvn_subr/subst_translate-test.c?rev=1817375&r1=1817374&r2=1817375&view=diff
==============================================================================
--- subversion/branches/shelve-checkpoint/subversion/tests/libsvn_subr/subst_translate-test.c (original)
+++ subversion/branches/shelve-checkpoint/subversion/tests/libsvn_subr/subst_translate-test.c Thu Dec  7 14:42:10 2017
@@ -158,7 +158,7 @@ test_svn_subst_translate_string2_null_en
     };
   const char **other_locale;
 
-  strncpy(orig_lc_all, setlocale(LC_ALL, NULL), sizeof (orig_lc_all));
+  strncpy(orig_lc_all, setlocale(LC_ALL, NULL), sizeof (orig_lc_all) - 1);
 
   for (other_locale = other_locales; *other_locale != NULL; ++other_locale)
   {

Modified: subversion/branches/shelve-checkpoint/tools/client-side/bash_completion
URL: http://svn.apache.org/viewvc/subversion/branches/shelve-checkpoint/tools/client-side/bash_completion?rev=1817375&r1=1817374&r2=1817375&view=diff
==============================================================================
--- subversion/branches/shelve-checkpoint/tools/client-side/bash_completion (original)
+++ subversion/branches/shelve-checkpoint/tools/client-side/bash_completion Thu Dec  7 14:42:10 2017
@@ -883,8 +883,8 @@ _svn()
                          --force"
 		;;
 	cleanup)
-		cmdOpts="--diff3-cmd $pOpts --include-externals -q --quiet\
-			--remove-ignored --remove-unversioned"
+		cmdOpts="$pOpts --include-externals -q --quiet\
+			--remove-ignored --remove-unversioned --vacuum-pristines"
 		;;
 	commit|ci)
 		cmdOpts="$mOpts $qOpts $nOpts --targets --editor-cmd $pOpts \
@@ -953,7 +953,7 @@ _svn()
 		cmdOpts="$mOpts $qOpts --editor-cmd $pOpts --parents"
 		;;
 	move|mv|rename|ren)
-		cmdOpts="$mOpts $rOpts $qOpts --force --editor-cmd $pOpts \
+		cmdOpts="$mOpts $qOpts --force --editor-cmd $pOpts \
                          --parents --allow-mixed-revisions"
 		;;
 	patch)
@@ -1006,7 +1006,7 @@ _svn()
                          $rOpts $cOpts"
 		;;
 	switch|sw)
-		cmdOpts="--relocate $rOpts $nOpts $qOpts $pOpts --diff3-cmd \
+		cmdOpts="$rOpts $nOpts $qOpts $pOpts --diff3-cmd \
                          --force --accept --ignore-externals --set-depth \
 		         --ignore-ancestry"
 		;;
@@ -1026,13 +1026,13 @@ _svn()
 		cmdOpts="$qOpts save restore list --list"
 		;;
 	shelve)
-		cmdOpts="$qOpts --keep-local --delete --list $qOpts --dry-run --depth --targets $cOpts"
+		cmdOpts="$qOpts --keep-local --delete --list -m --message -F --file --encoding --force-log --editor-cmd --dry-run --depth --targets $cOpts $pOpts"
 		;;
 	unshelve)
-		cmdOpts="$qOpts --list $qOpts --dry-run"
+		cmdOpts="$qOpts --list $pOpts --dry-run"
 		;;
 	shelves)
-		cmdOpts="$qOpts"
+		cmdOpts="$qOpts $pOpts"
 		;;
 	*)
 		;;

Modified: subversion/branches/shelve-checkpoint/tools/client-side/bash_completion_test
URL: http://svn.apache.org/viewvc/subversion/branches/shelve-checkpoint/tools/client-side/bash_completion_test?rev=1817375&r1=1817374&r2=1817375&view=diff
==============================================================================
--- subversion/branches/shelve-checkpoint/tools/client-side/bash_completion_test (original)
+++ subversion/branches/shelve-checkpoint/tools/client-side/bash_completion_test Thu Dec  7 14:42:10 2017
@@ -117,7 +117,7 @@ get_svn_options() {
       # Remove deprecated options
       grep -v deprecated |
       # Find the relevant lines; remove "arg" and description.
-      sed -n -e '1,/^Valid options:$/d;/^  -/!d' \
+      sed -n -e '1,/^\(Valid\|Global\) options:$/d;/^  -/!d' \
              -e 's/\( ARG\)* * : .*//;p' |
       # Remove brackets; put each word on its own line.
       tr -d '] ' | tr '[' '\n'