Added: subversion/trunk/tools/hook-scripts/mailer/tests/t2-reference/output.1912632 URL: http://svn.apache.org/viewvc/subversion/trunk/tools/hook-scripts/mailer/tests/t2-reference/output.1912632?rev=1914650&view=auto ============================================================================== --- subversion/trunk/tools/hook-scripts/mailer/tests/t2-reference/output.1912632 (added) +++ subversion/trunk/tools/hook-scripts/mailer/tests/t2-reference/output.1912632 Thu Dec 14 07:42:34 2023 @@ -0,0 +1,1538 @@ +Group: defaults +Subject: r2 - in subversion/trunk: build build/generator build/generator/swig subversion/tests/cmdline subversion/tests/cmdline/legacy subversion/tests/cmdline/svntest tools/dist + +Author: dsahlberg +Date: Sat Sep 30 13:13:16 2023 +New Revision: 2 + +Log: +Fix `invalid escape sequence` in Python scripts to prevent many +`SyntaxWarning`s since Python 3.12. + +* build/generator/gen_win.py +* build/generator/gen_win_dependencies.py +* build/generator/swig/__init__.py +* build/transform_sql.py +* subversion/tests/cmdline/basic_tests.py +* subversion/tests/cmdline/changelist_tests.py +* subversion/tests/cmdline/checkout_tests.py +* subversion/tests/cmdline/copy_tests.py +* subversion/tests/cmdline/diff_tests.py +* subversion/tests/cmdline/getopt_tests.py +* subversion/tests/cmdline/info_tests.py +* subversion/tests/cmdline/legacy/utf8_tests.py +* subversion/tests/cmdline/lock_tests.py +* subversion/tests/cmdline/log_tests.py +* subversion/tests/cmdline/merge_authz_tests.py +* subversion/tests/cmdline/merge_automatic_tests.py +* subversion/tests/cmdline/merge_tests.py +* subversion/tests/cmdline/merge_tree_conflict_tests.py +* subversion/tests/cmdline/patch_tests.py +* subversion/tests/cmdline/prop_tests.py +* subversion/tests/cmdline/special_tests.py +* subversion/tests/cmdline/stat_tests.py +* subversion/tests/cmdline/svnadmin_tests.py +* subversion/tests/cmdline/svnfsfs_tests.py +* subversion/tests/cmdline/svnmover_tests.py +* subversion/tests/cmdline/svnmucc_tests.py +* subversion/tests/cmdline/svntest/actions.py +* subversion/tests/cmdline/svntest/main.py +* subversion/tests/cmdline/svntest/verify.py +* subversion/tests/cmdline/svntest/wc.py +* subversion/tests/cmdline/trans_tests.py +* subversion/tests/cmdline/update_tests.py +* subversion/tests/cmdline/upgrade_tests.py +* subversion/tests/manual/tree-conflicts-add-vs-add.py +* tools/dist/release.py + Use raw literals or correct escape sequences. + +Patch by: jun66j5 +Review by: futatuki + +Discussed: https://lists.apache.org/thread/m5s9zpj2jvsmtof07c0vvpjlwnwpdwsl + +Modified: + subversion/trunk/build/generator/gen_win.py + subversion/trunk/build/generator/gen_win_dependencies.py + subversion/trunk/build/generator/swig/__init__.py + subversion/trunk/build/transform_sql.py + subversion/trunk/subversion/tests/cmdline/basic_tests.py + subversion/trunk/subversion/tests/cmdline/changelist_tests.py + subversion/trunk/subversion/tests/cmdline/checkout_tests.py + subversion/trunk/subversion/tests/cmdline/copy_tests.py + subversion/trunk/subversion/tests/cmdline/diff_tests.py + subversion/trunk/subversion/tests/cmdline/getopt_tests.py + subversion/trunk/subversion/tests/cmdline/info_tests.py + subversion/trunk/subversion/tests/cmdline/legacy/utf8_tests.py + subversion/trunk/subversion/tests/cmdline/lock_tests.py + subversion/trunk/subversion/tests/cmdline/log_tests.py + subversion/trunk/subversion/tests/cmdline/merge_authz_tests.py + subversion/trunk/subversion/tests/cmdline/merge_automatic_tests.py + subversion/trunk/subversion/tests/cmdline/merge_tests.py + subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py + subversion/trunk/subversion/tests/cmdline/patch_tests.py + subversion/trunk/subversion/tests/cmdline/prop_tests.py + subversion/trunk/subversion/tests/cmdline/special_tests.py + subversion/trunk/subversion/tests/cmdline/stat_tests.py + subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py + subversion/trunk/subversion/tests/cmdline/svnfsfs_tests.py + subversion/trunk/subversion/tests/cmdline/svnmover_tests.py + subversion/trunk/subversion/tests/cmdline/svnmucc_tests.py + subversion/trunk/subversion/tests/cmdline/svntest/actions.py + subversion/trunk/subversion/tests/cmdline/svntest/main.py + subversion/trunk/subversion/tests/cmdline/svntest/verify.py + subversion/trunk/subversion/tests/cmdline/svntest/wc.py + subversion/trunk/subversion/tests/cmdline/trans_tests.py + subversion/trunk/subversion/tests/cmdline/update_tests.py + subversion/trunk/subversion/tests/cmdline/upgrade_tests.py + subversion/trunk/tools/dist/release.py + +Modified: subversion/trunk/build/generator/gen_win.py +============================================================================== +--- subversion/trunk/build/generator/gen_win.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/build/generator/gen_win.py Sat Sep 30 13:13:16 2023 (r2) +@@ -574,7 +574,7 @@ + # This section parses those dependencies and adds them to the dependency list + # for this target. + if name.startswith('javahl') or name == 'libsvnjavahl': +- for dep in re.findall('\$\(([^\)]*)_DEPS\)', target.add_deps): ++ for dep in re.findall(r'\$\(([^\)]*)_DEPS\)', target.add_deps): + dep = dep.replace('_', '-') + depends.extend(self.sections[dep].get_targets()) + +@@ -728,7 +728,7 @@ + + for dep in self.get_win_depends(target, FILTER_EXTERNALLIBS): + if dep.external_lib: +- for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib): ++ for elib in re.findall(r'\$\(SVN_([^)]*)_LIBS\)', dep.external_lib): + external_lib = elib.lower() + + if external_lib in self._libraries: +@@ -758,7 +758,7 @@ + + for dep in self.get_win_depends(target, FILTER_EXTERNALLIBS): + if dep.external_lib: +- for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib): ++ for elib in re.findall(r'\$\(SVN_([^)]*)_LIBS\)', dep.external_lib): + external_lib = elib.lower() + + if external_lib in self._libraries: +@@ -833,7 +833,7 @@ + + for dep in self.get_win_depends(target, FILTER_LIBS): + if dep.external_lib: +- for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib): ++ for elib in re.findall(r'\$\(SVN_([^)]*)_LIBS\)', dep.external_lib): + external_lib = elib.lower() + + if external_lib not in self._libraries: +@@ -887,7 +887,7 @@ + nondeplibs.extend(dep.msvc_libs) + + if dep.external_lib: +- for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib): ++ for elib in re.findall(r'\$\(SVN_([^)]*)_LIBS\)', dep.external_lib): + + external_lib = elib.lower() + +@@ -938,7 +938,7 @@ + + for dep in self.get_win_depends(target, FILTER_EXTERNALLIBS): + if dep.external_lib: +- for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib): ++ for elib in re.findall(r'\$\(SVN_([^)]*)_LIBS\)', dep.external_lib): + external_lib = elib.lower() + + if external_lib in self._libraries: + +Modified: subversion/trunk/build/generator/gen_win_dependencies.py +============================================================================== +--- subversion/trunk/build/generator/gen_win_dependencies.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/build/generator/gen_win_dependencies.py Sat Sep 30 13:13:16 2023 (r2) +@@ -235,22 +235,22 @@ + elif opt == '-D': + self.cpp_defines.append(val) + elif opt == '--vsnet-version': +- if val == '2002' or re.match('^7(\.\d+)?$', val): ++ if val == '2002' or re.match(r'^7(\.\d+)?$', val): + self.vs_version = '2002' + self.sln_version = '7.00' + self.vcproj_version = '7.00' + self.vcproj_extension = '.vcproj' +- elif val == '2003' or re.match('^8(\.\d+)?$', val): ++ elif val == '2003' or re.match(r'^8(\.\d+)?$', val): + self.vs_version = '2003' + self.sln_version = '8.00' + self.vcproj_version = '7.10' + self.vcproj_extension = '.vcproj' +- elif val == '2005' or re.match('^9(\.\d+)?$', val): ++ elif val == '2005' or re.match(r'^9(\.\d+)?$', val): + self.vs_version = '2005' + self.sln_version = '9.00' + self.vcproj_version = '8.00' + self.vcproj_extension = '.vcproj' +- elif val == '2008' or re.match('^10(\.\d+)?$', val): ++ elif val == '2008' or re.match(r'^10(\.\d+)?$', val): + self.vs_version = '2008' + self.sln_version = '10.00' + self.vcproj_version = '9.00' +@@ -290,14 +290,14 @@ + self.sln_version = '12.00' + self.vcproj_version = '14.3' + self.vcproj_extension = '.vcxproj' +- elif re.match('^20\d+$', val): ++ elif re.match(r'^20\d+$', val): + print('WARNING: Unknown VS.NET version "%s",' + ' assuming VS2012. Your VS can probably upgrade') + self.vs_version = '2012' + self.sln_version = '12.00' + self.vcproj_version = '11.0' + self.vcproj_extension = '.vcxproj' +- elif re.match('^1\d+$', val): ++ elif re.match(r'^1\d+$', val): + self.vs_version = val + self.sln_version = '12.00' + self.vcproj_version = val + '.0' + +Modified: subversion/trunk/build/generator/swig/__init__.py +============================================================================== +--- subversion/trunk/build/generator/swig/__init__.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/build/generator/swig/__init__.py Sat Sep 30 13:13:16 2023 (r2) +@@ -72,7 +72,7 @@ + + if not self._swigVersion: + swig_version = subprocess.check_output([self.swig_path, "-version"]).decode('utf8') +- m = re.search("Version (\d+).(\d+).(\d+)", swig_version) ++ m = re.search(r"Version (\d+).(\d+).(\d+)", swig_version) + if m: + self._swigVersion = tuple(map(int, m.groups())) + else: + +Modified: subversion/trunk/build/transform_sql.py +============================================================================== +--- subversion/trunk/build/transform_sql.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/build/transform_sql.py Sat Sep 30 13:13:16 2023 (r2) +@@ -50,7 +50,7 @@ + + # a few SQL comments that act as directives for this transform system + re_format = re.compile('-- *format: *([0-9]+)') +- re_statement = re.compile('-- *STMT_([A-Z_0-9]+)( +\(([^\)]*)\))?') ++ re_statement = re.compile(r'-- *STMT_([A-Z_0-9]+)( +\(([^)]*)\))?') + re_include = re.compile('-- *include: *([-a-z]+)') + re_define = re.compile('-- *define: *([A-Z_0-9]+)') + + +Modified: subversion/trunk/subversion/tests/cmdline/basic_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/basic_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/basic_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -705,8 +705,8 @@ + + # "Extra" files that we expect to result from the conflicts. + # These are expressed as list of regexps. What a cool system! :-) +- extra_files = ['mu.*\.r1', 'mu.*\.r2', 'mu.*\.mine', +- 'rho.*\.r1', 'rho.*\.r2', 'rho.*\.mine',] ++ extra_files = [r'mu.*\.r1', r'mu.*\.r2', r'mu.*\.mine', ++ r'rho.*\.r1', r'rho.*\.r2', r'rho.*\.mine',] + + # Do the update and check the results in three ways. + # All "extra" files are passed to detect_conflict_files(). +@@ -2267,11 +2267,11 @@ + + # "Extra" files that we expect to result from the conflicts. + # These are expressed as list of regexps. What a cool system! :-) +- extra_files = ['mu.*\.r1', 'mu.*\.r2', 'mu.*\.mine', +- 'lambda.*\.r1', 'lambda.*\.r2', 'lambda.*\.mine', +- 'omega.*\.r1', 'omega.*\.r2', 'omega.*\.mine', +- 'rho.*\.r1', 'rho.*\.r2', 'rho.*\.mine', +- 'tau.*\.r1', 'tau.*\.r2', 'tau.*\.mine', ++ extra_files = [r'mu.*\.r1', r'mu.*\.r2', r'mu.*\.mine', ++ r'lambda.*\.r1', r'lambda.*\.r2', r'lambda.*\.mine', ++ r'omega.*\.r1', r'omega.*\.r2', r'omega.*\.mine', ++ r'rho.*\.r1', r'rho.*\.r2', r'rho.*\.mine', ++ r'tau.*\.r1', r'tau.*\.r2', r'tau.*\.mine', + ] + + # Do the update and check the results in three ways. +@@ -2347,7 +2347,7 @@ + ""])) + + # Set the expected extra files for the test +- extra_files = ['omega.*\.r1', 'omega.*\.r2', 'omega.*\.mine',] ++ extra_files = [r'omega.*\.r1', r'omega.*\.r2', r'omega.*\.mine',] + + # Set the expected status for the test + expected_status = svntest.actions.get_virginal_state(wc_backup, 2) + +Modified: subversion/trunk/subversion/tests/cmdline/changelist_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/changelist_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/changelist_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -130,9 +130,9 @@ + + + # Regular expressions for 'svn changelist' output. +-_re_cl_rem_pattern = "^D \[(.*)\] (.*)" +-_re_cl_skip = re.compile("Skipped '(.*)'") +-_re_cl_add = re.compile("^A \[(.*)\] (.*)") ++_re_cl_rem_pattern = r"^D \[(.*)\] (.*)" ++_re_cl_skip = re.compile(r"Skipped '(.*)'") ++_re_cl_add = re.compile(r"^A \[(.*)\] (.*)") + _re_cl_rem = re.compile(_re_cl_rem_pattern) + + def verify_changelist_output(output, expected_adds=None, + +Modified: subversion/trunk/subversion/tests/cmdline/checkout_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/checkout_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/checkout_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -882,8 +882,8 @@ + }) + + # "Extra" files that we expect to result from the conflicts. +- extra_files = ['eta\.r0', 'eta\.r2', 'eta\.mine', +- 'kappa\.r0', 'kappa\.r2', 'kappa\.mine'] ++ extra_files = [r'eta\.r0', r'eta\.r2', r'eta\.mine', ++ r'kappa\.r0', r'kappa\.r2', r'kappa\.mine'] + + # Perform the checkout and check the results in three ways. + # We use --force here because run_and_verify_checkout() will delete + +Modified: subversion/trunk/subversion/tests/cmdline/copy_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/copy_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/copy_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -1419,7 +1419,7 @@ + if re.match(b'[^\\r]\\n', raw_contents): + raise svntest.Failure + +- if not re.match(b'.*\$LastChangedRevision:\s*\d+\s*\$', line_contents[3]): ++ if not re.match(b'.*\\$LastChangedRevision:\\s*\\d+\\s*\\$', line_contents[3]): + raise svntest.Failure + + #------------------------------------------------------------- + +Modified: subversion/trunk/subversion/tests/cmdline/diff_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/diff_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/diff_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -833,7 +833,7 @@ + ' This is the file \'mu\'.\n', + '+\n', + '+Actually, it\'s a new mu.\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + ] + + svntest.actions.run_and_verify_svn(expected_output, [], +@@ -1024,7 +1024,7 @@ + None, [], 'diff', '-r', 'BASE:2', wc_dir) + + # to do the comparison, remove all output lines starting with +++ or --- +- re_infoline = re.compile('^(\+\+\+|---).*$') ++ re_infoline = re.compile(r'^(\+\+\+|---).*$') + list1 = [] + list2 = [] + +@@ -4256,7 +4256,7 @@ + '+++ %s\t(working copy)\n' % sbox.path('A/B/E'), + '@@ -0,0 +1 @@\n', + '+text\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + ] + + svntest.actions.run_and_verify_svn(expected_output, [], +@@ -4464,7 +4464,7 @@ + 'Added: K\n', + '## -0,0 +1 ##\n', + '+V\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + 'Index: %s\n' % (sbox.path('iota'),), + '===================================================================\n', + '--- %s\t(revision 1)\n' % (sbox.path('iota'),), +@@ -4475,7 +4475,7 @@ + 'Added: K\n', + '## -0,0 +1 ##\n', + '+V\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + ] + svntest.actions.run_and_verify_svn(expected_output, [], 'diff', wc_dir) + +@@ -4639,7 +4639,7 @@ + 'Deleted: svn:mime-type\n', + '## -1 +0,0 ##\n', + '-text/plain\n', +- '\ No newline at end of property\n'] ++ '\\ No newline at end of property\n'] + svntest.actions.run_and_verify_svn(expected_output, [], 'diff', + '-r2:1', newfile) + +@@ -4661,7 +4661,7 @@ + '@@ -1 +1,2 @@\n', + ' This is the file \'mu\'.\n', + '+Mu????\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'diff', '-r', '1', sbox.ospath('iota')) +@@ -4676,7 +4676,7 @@ + '-This is the file \'iota\'.\n', + '+This is the file \'mu\'.\n', + '+Mu????\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'diff', '-r', '1', sbox.ospath('')) +@@ -4709,7 +4709,7 @@ + 'Deleted: A\n', + '## -1 +0,0 ##\n', + '-B\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + ] + + svntest.actions.run_and_verify_svn(expected_output, [], +@@ -4726,7 +4726,7 @@ + 'Deleted: A\n', + '## -1 +0,0 ##\n', + '-B\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + ] + + svntest.actions.run_and_verify_svn(expected_output, [], +@@ -4823,7 +4823,7 @@ + 'Added: p2\n', + '## -0,0 +1 ##\n', + '+v2\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + ] + + svntest.actions.run_and_verify_svn(expected_output_C2, [], +@@ -5036,14 +5036,14 @@ + '+++ %s\t(working copy)\n' % sbox.path('to-iota'), + '@@ -0,0 +1 @@\n', + '+link iota\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + '\n', + 'Property changes on: %s\n' % sbox.path('to-iota'), + '___________________________________________________________________\n', + 'Added: svn:special\n', + '## -0,0 +1 ##\n', + '+*\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + ], [], 'diff', wc_dir) + + svntest.actions.run_and_verify_svn([ +@@ -5055,14 +5055,14 @@ + '+++ b/to-iota\t(working copy)\n', + '@@ -0,0 +1 @@\n', + '+iota\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + '\n', + 'Property changes on: to-iota\n', + '___________________________________________________________________\n', + 'Added: svn:special\n', + '## -0,0 +1 ##\n', + '+*\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + ], [], 'diff', wc_dir, '--git') + + sbox.simple_commit() +@@ -5076,9 +5076,9 @@ + '+++ %s\t(working copy)\n' % sbox.path('to-iota'), + '@@ -1 +1 @@\n', + '-link iota\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + '+link A/B/E/alpha\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + ], [], 'diff', wc_dir) + + svntest.actions.run_and_verify_svn([ +@@ -5090,9 +5090,9 @@ + '+++ b/to-iota\t(working copy)\n', + '@@ -1 +1 @@\n', + '-iota\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + '+A/B/E/alpha\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + ], [], 'diff', wc_dir, '--git') + + + +Modified: subversion/trunk/subversion/tests/cmdline/getopt_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/getopt_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/getopt_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -94,7 +94,7 @@ + 'version X.Y.Z '), + # The copyright end date keeps changing; fix forever. + (re.compile(r'Copyright \(C\) 20\d\d The Apache ' +- 'Software Foundation\.'), ++ r'Software Foundation\.'), + 'Copyright (C) YYYY The Apache Software Foundation'), + # In 'svn --version --quiet', we print only the version + # number in a single line. +@@ -120,7 +120,7 @@ + # seen switch_res_line. + switched_rep_lines_res = [ + # We don't care about the actual canonical host +- (re.compile('^\* running on.*$'), '* running on'), ++ (re.compile(r'^\* running on.*$'), '* running on'), + ] + + def process_lines(lines): + +Modified: subversion/trunk/subversion/tests/cmdline/info_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/info_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/info_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -96,7 +96,7 @@ + atttribute_re = re.compile( + r"\s+(?P<key>[\w-]+)\s*=\s*(['\"])(?P<val>[^'\"]*)\2", re.M) + self_closing_re = re.compile(r"\s*/>", re.M) +- content_re_str = "\\s*>(?P<content>.*?)</%s\s*>" ++ content_re_str = r"\s*>(?P<content>.*?)</%s\s*>" + + m = start_tag_re.match(str) + if not m: +@@ -402,7 +402,7 @@ + 'Path' : re.escape(os.path.basename(sbox.repo_dir)), + 'Repository Root' : re.escape(sbox.repo_url), + 'URL' : re.escape(sbox.repo_url), +- 'Relative URL' : '\^/', # escape ^ -- this isn't a regexp ++ 'Relative URL' : r'\^/', # escape ^ -- this isn't a regexp + 'Revision' : '1', + 'Node Kind' : 'directory', + 'Last Changed Rev' : '1', +@@ -412,7 +412,7 @@ + 'Name' : 'iota', + 'Repository Root' : re.escape(sbox.repo_url), + 'URL' : re.escape(sbox.repo_url + '/iota'), +- 'Relative URL' : '\^/iota', # escape ^ -- this isn't a regexp ++ 'Relative URL' : r'\^/iota', # escape ^ -- this isn't a regexp + 'Revision' : '1', + 'Node Kind' : 'file', + 'Last Changed Rev' : '1', + +Modified: subversion/trunk/subversion/tests/cmdline/legacy/utf8_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/legacy/utf8_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/legacy/utf8_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -143,7 +143,7 @@ + # Also check that the environment contains the expected locale settings + # either by default, or because we set them above. + if localematch: +- localeregex = re.compile('^en_US\.ISO-?8859-1$', re.I) ++ localeregex = re.compile(r'^en_US\.ISO-?8859-1$', re.I) + for env in [ 'LC_ALL', 'LC_CTYPE', 'LANG' ]: + env_value = os.getenv(env) + if env_value: + +Modified: subversion/trunk/subversion/tests/cmdline/lock_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/lock_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/lock_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -91,8 +91,8 @@ + '-m', '', file_path) + + # --- Meanwhile, in our other working copy... --- +- err_re = "(svn\: E195022\: File '.*iota' is locked in another)|" + \ +- "(svn\: E160039: User '?jconstant'? does not own lock on path.*iota')" ++ err_re = r"(svn\: E195022\: File '.*iota' is locked in another)|" + \ ++ r"(svn\: E160039: User '?jconstant'? does not own lock on path.*iota')" + + svntest.main.run_svn(None, 'update', wc_b) + # -- Try to change a file -- +@@ -112,8 +112,8 @@ + # change the locked file's properties + svntest.main.run_svn(None, 'propset', 'sneakyuser', 'Sally', file_path_b) + +- err_re = "(svn\: E195022\: File '.*iota' is locked in another)|" + \ +- "(svn\: E160039\: User '?jconstant'? does not own lock on path)" ++ err_re = r"(svn\: E195022\: File '.*iota' is locked in another)|" + \ ++ r"(svn\: E160039\: User '?jconstant'? does not own lock on path)" + + # attempt (and fail) to commit as user Sally + svntest.actions.run_and_verify_commit(wc_b, None, None, err_re, +@@ -1275,8 +1275,8 @@ + [], "lock", fname) + + # Make sure ls shows it being locked. +- expected_output = " +2 " + re.escape(svntest.main.wc_author) + " +O .+f|" \ +- " +2 " + re.escape(svntest.main.wc_author) + " .+\./" ++ expected_output = r" +2 %(author)s +O .+f| +2 %(author)s .+\./" % \ ++ {'author': re.escape(svntest.main.wc_author)} + svntest.actions.run_and_verify_svn(expected_output, [], + "list", "-v", dirname) + + +Modified: subversion/trunk/subversion/tests/cmdline/log_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/log_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/log_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -471,8 +471,7 @@ + + # Regular expression to match the header line of a log message, with + # these groups: (revision number), (author), (date), (num lines). +- header_re = re.compile('^r([0-9]+) \| ' \ +- + '([^|]*) \| ([^|]*) \| ([0-9]+) lines?') ++ header_re = re.compile(r'^r([0-9]+) \| ([^|]*) \| ([^|]*) \| ([0-9]+) lines?') + + # The log chain to return. + chain = [] +@@ -984,10 +983,10 @@ + + # Verify the output contains either the expected fuzzy escape + # sequence, or the literal control char. +- match_unescaped_ctrl_re = "This msg contains a Ctrl-T \(.\) " \ +- "and a Ctrl-I \(\t\)\." +- match_escaped_ctrl_re = "^This msg contains a Ctrl-T \(\?\\\\020\) " \ +- "and a Ctrl-I \(\t\)\." ++ match_unescaped_ctrl_re = r"This msg contains a Ctrl-T \(.\) " \ ++ r"and a Ctrl-I \(\t\)\." ++ match_escaped_ctrl_re = r"^This msg contains a Ctrl-T \(\?\\020\) " \ ++ r"and a Ctrl-I \(\t\)\." + matched = None + for line in output: + if re.match(match_unescaped_ctrl_re, line) \ +@@ -1490,8 +1489,8 @@ + + # Can't set revprops with log. + svntest.actions.run_and_verify_log_xml( +- expected_stderr=(".*cannot assign with 'with-revprop' option" +- " \(drop the '='\)"), ++ expected_stderr=(r".*cannot assign with 'with-revprop' option" ++ r" \(drop the '='\)"), + args=['--with-revprop=foo=bar']) + + # basic test without revprop options +@@ -2670,8 +2669,8 @@ + '-r2') + + expected_output = svntest.verify.RegexListOutput([ +- '-+\\n', +- 'r3\ .*\n', ++ r'-+\n', ++ r'r3 .*\n', + re.escape('Changed paths:\n'), + re.escape(' D /A/B/E\n'), + re.escape(' A /E (from /A/B/E:2)\n'), # Patched - Direct move +@@ -2680,7 +2679,7 @@ + re.escape(' D /iota\n'), + re.escape(' A /iotb (from /iota:2)\n'), # Patched - Direct move + re.escape(' A /mutb (from /A/mu:1)\n'), # Copy (always r1) +- '-+\\n' ++ r'-+\n', + ]) + svntest.actions.run_and_verify_svn(expected_output, [], + 'log', '-v', '-q', sbox.wc_dir, + +Modified: subversion/trunk/subversion/tests/cmdline/merge_authz_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/merge_authz_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/merge_authz_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -773,7 +773,7 @@ + 'Added: k\n', + '## -0,0 +1 ##\n', + '+v\n', +- '\ No newline at end of property\n' ++ '\\ No newline at end of property\n' + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'diff', sbox.repo_url + '/A', '-c', '2') +@@ -830,9 +830,9 @@ + 'Modified: this-is\n', + '## -1 +1 ##\n', + '-E\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + '+G\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + ] + else: + # ### We should also see a property deletion here! +@@ -847,7 +847,7 @@ + 'Deleted: this-is\n', + '## -1 +0,0 ##\n', + '-E\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + 'Index: .\n', + '===================================================================\n', + '--- .\t(nonexistent)\n', +@@ -858,7 +858,7 @@ + 'Added: this-is\n', + '## -0,0 +1 ##\n', + '+G\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + ] + + # Use two url diff, because 'svn diff url -c' uses copyfrom to diff against + +Modified: subversion/trunk/subversion/tests/cmdline/merge_automatic_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/merge_automatic_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/merge_automatic_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -1361,9 +1361,9 @@ + + # Let commit fix the eols + sbox.simple_add_text('with\rCRLF\rhere!', 'A/crlf') +- sbox.simple_add_text('with\rnative\r\eol', 'A/native') +- sbox.simple_add_text('with\rCR\r\eol', 'A/cr') +- sbox.simple_add_text('with\rLF\r\eol', 'A/lf') ++ sbox.simple_add_text('with\rnative\r\\eol', 'A/native') ++ sbox.simple_add_text('with\rCR\r\\eol', 'A/cr') ++ sbox.simple_add_text('with\rLF\r\\eol', 'A/lf') + + # And apply the magic property + sbox.simple_propset('svn:eol-style', 'CRLF', 'A/crlf') + +Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/merge_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -247,9 +247,9 @@ + + expected_skip = wc.State('', { }) + +- tau_conflict_support_files = ["tau\.working", +- "tau\.merge-right\.r3", +- "tau\.merge-left\.r1"] ++ tau_conflict_support_files = [r"tau\.working", ++ r"tau\.merge-right\.r3", ++ r"tau\.merge-left\.r1"] + + svntest.actions.run_and_verify_merge(other_wc, '1', '3', + sbox.repo_url, None, +@@ -2629,7 +2629,7 @@ + expected_skip = wc.State('', { }) + + # should have 3 'prej' files left behind, describing prop conflicts: +- extra_files = ['alpha.*\.prej', 'beta.*\.prej', 'dir_conflicts.*\.prej'] ++ extra_files = [r'alpha.*\.prej', r'beta.*\.prej', r'dir_conflicts.*\.prej'] + + svntest.actions.run_and_verify_merge(B2_path, '3', '4', B_url, None, + expected_output, +@@ -2752,7 +2752,7 @@ + expected_skip = wc.State('', { }) + + # should have 2 'prej' files left behind, describing prop conflicts: +- extra_files = ['alpha.*\.prej', 'dir_conflicts.*\.prej'] ++ extra_files = [r'alpha.*\.prej', r'dir_conflicts.*\.prej'] + + svntest.actions.run_and_verify_merge(B2_path, '3', '4', B_url, None, + expected_output, +@@ -2952,9 +2952,9 @@ + expected_skip, + expected_error, + extra_files= +- ["mu\.working", +- "mu\.merge-right\.r4", +- "mu\.merge-left\.r3"]) ++ [r"mu\.working", ++ r"mu\.merge-right\.r4", ++ r"mu\.merge-left\.r3"]) + + #---------------------------------------------------------------------- + # Test for issue 2135 +@@ -14517,9 +14517,9 @@ + "=======\n" + "New content>>>>>>> .merge-right.r3\n") + expected_status.tweak('D/H/psi', status='C ') +- psi_conflict_support_files = ["psi\.working", +- "psi\.merge-right\.r3", +- "psi\.merge-left\.r2"] ++ psi_conflict_support_files = [r"psi\.working", ++ r"psi\.merge-right\.r3", ++ r"psi\.merge-left\.r2"] + svntest.actions.run_and_verify_merge(A_COPY_path, '2', '3', + sbox.repo_url + '/A', None, + expected_output, +@@ -17301,7 +17301,7 @@ + + # r4 + svntest.main.file_write(sbox.ospath('dir/binary-file'), +- '\9\8\7\6\5\4\3\2\1') ++ '\x09\x08\7\6\5\4\3\2\1') + sbox.simple_commit() + + sbox.simple_update() + +Modified: subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -1856,9 +1856,9 @@ + actions.run_and_verify_status(wc_dir, expected_status) + + # Check the tree conflict types: +- expected_stdout = '(R.*)|(Summary of conflicts.*)|( Tree conflicts.*)' \ +- '|(.*local delete, incoming replace upon merge.*)' \ +- '|( \>.*)' ++ expected_stdout = r'(R.*)|(Summary of conflicts.*)|( Tree conflicts.*)' \ ++ r'|(.*local delete, incoming replace upon merge.*)' \ ++ r'|( \>.*)' + tree_conflicted_path = [A_B_E, A_mu, A_D_G_pi, A_D_H] + for path in tree_conflicted_path: + actions.run_and_verify_svn2(expected_stdout, [], 0, 'st', + +Modified: subversion/trunk/subversion/tests/cmdline/patch_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/patch_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/patch_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -3433,7 +3433,7 @@ + value = "v\n" + else: + value = "v" +- unidiff_patch += ['\ No newline at end of property\n'] ++ unidiff_patch += ['\\ No newline at end of property\n'] + + svntest.main.file_write(patch_file_path, ''.join(unidiff_patch), 'wb') + +@@ -5807,7 +5807,7 @@ + 'Added: svn:mime-type\n', + '## -0,0 +1 ##\n', + '+application/binary\n', +- '\ No newline at end of property\n', ++ '\\ No newline at end of property\n', + ] + + _, diff_output, _ = svntest.actions.run_and_verify_svn(expected_output, [], +@@ -6005,7 +6005,7 @@ + '@@ -1 +1 @@\n', + '-This is the file \'mu\'.\n', + '+This is the file \'mu\'.\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + 'Index: iota\n', + '===================================================================\n', + '--- iota\t(revision 1)\n', +@@ -6013,7 +6013,7 @@ + '@@ -1 +1 @@\n', + '-This is the file \'iota\'.\n', + '+This is the file \'iota\'.\n', +- '\ No newline at end of file' # Missing EOL ++ '\\ No newline at end of file' # Missing EOL + ] + + patch = sbox.get_tempname('patch') +@@ -6073,7 +6073,7 @@ + '+++ A/mu\t(working copy)\n', + '@@ -1 +1 @@\n', + '-This is the file \'mu\'.\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + '+This is the file \'mu\'.\n', + 'Index: iota\n', + '===================================================================\n', +@@ -6081,7 +6081,7 @@ + '+++ iota\t(working copy)\n', + '@@ -1 +1 @@\n', + '-This is the file \'iota\'.\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + '+This is the file \'iota\'.' # Missing eol + ] + +@@ -6746,9 +6746,9 @@ + sbox.build() + wc_dir = sbox.wc_dir + +- eicar_data = 'X5O!P%@AP[4\PZX54(P^)7CC)7}$' \ ++ eicar_data = 'X5O!P%@AP[4\\PZX54(P^)7CC)7}$' \ + 'EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*\0' +- other_data = 'X5O!P%@AP[4\PZX54(P^)7CC)7}$' \ ++ other_data = 'X5O!P%@AP[4\\PZX54(P^)7CC)7}$' \ + 'SOME-LESS-INTERESTING-OTHER-TEXT!!!$H+H*\0' \ + '\0\0\0\0\0\0\0\0' + +@@ -6912,7 +6912,7 @@ + '+++ b/link-to-iota\n', + '@@ -0,0 +1 @@\n', + '+iota\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + ] + + patch_edit = [ +@@ -6922,9 +6922,9 @@ + '+++ b/link-to-iota\n', + '@@ -1 +1 @@\n', + '-iota\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + '+A/mu\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + ] + + patch_to_file = [ +@@ -6935,7 +6935,7 @@ + '+++ /dev/null\n', + '@@ -1 +0,0 @@\n', + '-A/mu\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + 'diff --git a/link-to-iota b/link-to-iota\n', + 'new file mode 100644\n', + 'index 0000000..1b130bf\n', +@@ -7039,7 +7039,7 @@ + '+++ b/link-to-iota\n', + '@@ -0,0 +1 @@\n', + '+iota\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + ] + + patch_edit = [ +@@ -7049,9 +7049,9 @@ + '+++ b/link-to-iota\n', + '@@ -1 +1 @@\n', + '-iota\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + '+A/mu\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + ] + + patch_to_file = [ +@@ -7062,7 +7062,7 @@ + '+++ /dev/null\n', + '@@ -1 +0,0 @@\n', + '-A/mu\n', +- '\ No newline at end of file\n', ++ '\\ No newline at end of file\n', + 'diff --git a/link-to-iota b/link-to-iota\n', + 'new file mode 100644\n', + 'index 0000000..1b130bf\n', +@@ -7709,7 +7709,7 @@ + ' J\n' + ' K\n' + ' L\n' +- '\ No newline at end of file', mode='wb') ++ '\\ No newline at end of file', mode='wb') + + expected_skip = wc.State('', { }) + expected_output = wc.State(wc_dir, { +@@ -7735,7 +7735,7 @@ + ' J\n' + ' K\n' + ' L\n' +- '\ No newline at end of file', mode='wb') ++ '\\ No newline at end of file', mode='wb') + + svntest.actions.run_and_verify_patch(wc_dir, local_patch, + expected_output, None, +@@ -7871,7 +7871,7 @@ + value = "v\n" + else: + value = "v" +- unidiff_patch += ['\ No newline at end of property\n'] ++ unidiff_patch += ['\\ No newline at end of property\n'] + + patch_file_path = sbox.get_tempname('my.patch') + svntest.main.file_write(patch_file_path, ''.join(unidiff_patch), 'wb') + +Modified: subversion/trunk/subversion/tests/cmdline/prop_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/prop_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/prop_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -349,7 +349,7 @@ + expected_status = svntest.actions.get_virginal_state(wc_dir, 2) + expected_status.tweak('A/mu', 'A', status=' C') + +- extra_files = ['mu.*\.prej', 'dir_conflicts.*\.prej'] ++ extra_files = [r'mu.*\.prej', r'dir_conflicts.*\.prej'] + # Do the update and check the results in three ways... INCLUDING PROPS + svntest.actions.run_and_verify_update(wc_dir, + expected_output, + +Modified: subversion/trunk/subversion/tests/cmdline/special_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/special_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/special_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -71,7 +71,7 @@ + exit_code, stdout_lines, stderr_lines = svntest.main.run_svn(1, 'diff', + wc_dir) + +- regex = '^\+link linktarget' ++ regex = r'^\+link linktarget' + for line in stdout_lines: + if re.match(regex, line): + break + +Modified: subversion/trunk/subversion/tests/cmdline/stat_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/stat_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/stat_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -559,7 +559,7 @@ + + for line in out: + # The "/?" is just to allow for an optional trailing slash. +- if re.match("\\s+\\*.*\.other/?$", line): ++ if re.match(r"\s+\*.*\.other/?$", line): + raise svntest.Failure + + @Issue(1289) + +Modified: subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -1790,7 +1790,7 @@ + "Owner: jrandom", + "Created:.*", + "Expires:.*", +- "Comment \(1 line\):", ++ r"Comment \(1 line\):", + "Locking files", + "\n", # empty line + ] +@@ -3514,8 +3514,8 @@ + + # Check log. + expected_output = svntest.verify.RegexListOutput([ +- '-+\\n', +- 'r1\ .*\n', ++ r'-+\n', ++ r'r1 .*\n', + # '/A/D/H' and '/A/B/E' is not added. + re.escape('Changed paths:\n'), + re.escape(' A /A\n'), +@@ -3531,7 +3531,7 @@ + re.escape(' A /A/D/gamma\n'), + re.escape(' A /A/mu\n'), + re.escape(' A /iota\n'), +- '-+\\n' ++ r'-+\n', + ]) + svntest.actions.run_and_verify_svn(expected_output, [], + 'log', '-v', '-q', sbox2.repo_url) +@@ -3567,18 +3567,18 @@ + + # Check log. + expected_output = svntest.verify.RegexListOutput([ +- '-+\\n', +- 'r2\ .*\n', ++ r'-+\n', ++ r'r2 .*\n', + re.escape('Changed paths:\n'), + # Simple add, not copy. + re.escape(' A /branches/branch1\n'), +- '-+\\n', +- 'r1\ .*\n', ++ r'-+\n', ++ r'r1 .*\n', + # '/trunk' is not added. + re.escape('Changed paths:\n'), + re.escape(' A /branches\n'), + re.escape(' A /tags\n'), +- '-+\\n' ++ r'-+\n', + ]) + svntest.actions.run_and_verify_svn(expected_output, [], + 'log', '-v', '-q', sbox2.repo_url) +@@ -3612,13 +3612,13 @@ + + # Check log. + expected_output = svntest.verify.RegexListOutput([ +- '-+\\n', +- 'r1\ .*\n', ++ r'-+\n', ++ r'r1 .*\n', + # '/B' is not added. + re.escape('Changed paths:\n'), + re.escape(' A /A\n'), + re.escape(' A /C\n'), +- '-+\\n' ++ r'-+\n', + ]) + svntest.actions.run_and_verify_svn(expected_output, [], + 'log', '-v', '-q', sbox2.repo_url) +@@ -3654,17 +3654,17 @@ + + # Check log. + expected_output = svntest.verify.RegexListOutput([ +- '-+\\n', +- 'r2\ .*\n', ++ r'-+\n', ++ r'r2 .*\n', + re.escape('Changed paths:\n'), + # Simple add, not copy. + re.escape(' A /branches/branch1\n'), +- '-+\\n', +- 'r1\ .*\n', ++ r'-+\n', ++ r'r1 .*\n', + # Only '/branches' is added in r1. + re.escape('Changed paths:\n'), + re.escape(' A /branches\n'), +- '-+\\n' ++ r'-+\n', + ]) + svntest.actions.run_and_verify_svn(expected_output, [], + 'log', '-v', '-q', sbox2.repo_url) +@@ -3696,12 +3696,12 @@ + + # Check log. + expected_output = svntest.verify.RegexListOutput([ +- '-+\\n', +- 'r1\ .*\n', ++ r'-+\n', ++ r'r1 .*\n', + re.escape('Changed paths:\n'), + # Only '/bbc' is added in r1. + re.escape(' A /bbc\n'), +- '-+\\n' ++ r'-+\n', + ]) + svntest.actions.run_and_verify_svn(expected_output, [], + 'log', '-v', '-q', sbox2.repo_url) +@@ -3733,14 +3733,14 @@ + + # Check log. + expected_output = svntest.verify.RegexListOutput([ +- '-+\\n', +- 'r1\ .*\n', ++ r'-+\n', ++ r'r1 .*\n', + # '/bbc' is not added. + re.escape('Changed paths:\n'), + re.escape(' A /aaa\n'), + re.escape(' A /aab\n'), + re.escape(' A /aac\n'), +- '-+\\n' ++ r'-+\n', + ]) + svntest.actions.run_and_verify_svn(expected_output, [], + 'log', '-v', '-q', sbox2.repo_url) +@@ -3785,27 +3785,27 @@ + + # Check log. Revision properties ('svn:log' etc.) should be empty for r2. + expected_output = svntest.verify.RegexListOutput([ +- '-+\\n', +- 'r3 | jrandom | .* | 1 line\\n', ++ r'-+\n', ++ r'r3 \| jrandom \| .* \| 1 line\n', + re.escape('Changed paths:'), + re.escape(' A /r3a'), + re.escape(' A /r3b'), + re.escape(' A /r3c'), + '', + re.escape('Revision 3.'), +- '-+\\n', ++ r'-+\n', + re.escape('r2 | (no author) | (no date) | 1 line'), + '', + '', +- '-+\\n', +- 'r1 | jrandom | .* | 1 line\\n', ++ r'-+\n', ++ r'r1 | jrandom | .* | 1 line\n', + re.escape('Changed paths:'), + re.escape(' A /r1a'), + re.escape(' A /r1b'), + re.escape(' A /r1c'), + '', + re.escape('Revision 1.'), +- '-+\\n', ++ r'-+\n', + ]) + svntest.actions.run_and_verify_svn(expected_output, [], + 'log', '-v', sbox2.repo_url) +@@ -3947,8 +3947,8 @@ + + # Check log. + expected_output = svntest.verify.RegexListOutput([ +- '-+\\n', +- 'r2\ .*\n', ++ r'-+\n', ++ r'r2 .*\n', + # Only '/COPY' is added + re.escape('Changed paths:\n'), + re.escape(' A /COPY'), +@@ -3961,9 +3961,9 @@ + re.escape(' A /COPY/H/omega'), + re.escape(' A /COPY/H/psi'), + re.escape(' A /COPY/gamma'), +- '-+\\n', +- 'r1\ .*\n', +- '-+\\n' ++ r'-+\n', ++ r'r1 .*\n', ++ r'-+\n', + ]) + svntest.actions.run_and_verify_svn(expected_output, [], + 'log', '-v', '-q', sbox2.repo_url) + +Modified: subversion/trunk/subversion/tests/cmdline/svnfsfs_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/svnfsfs_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/svnfsfs_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -167,38 +167,38 @@ + 'Histogram of directory property sizes:', + 'Histogram of directory property representation sizes:'] + patterns_to_find = { +- 'Reading revisions' : ['\s+ 0[ 0-9]*'], +- 'Global .*' : ['.*\d+ bytes in .*\d+ revisions', +- '.*\d+ bytes in .*\d+ changes', +- '.*\d+ bytes in .*\d+ node revision records', +- '.*\d+ bytes in .*\d+ representations', +- '.*\d+ bytes expanded representation size', +- '.*\d+ bytes with rep-sharing off' ], +- 'Noderev .*' : ['.*\d+ bytes in .*\d+ nodes total', +- '.*\d+ bytes in .*\d+ directory noderevs', +- '.*\d+ bytes in .*\d+ file noderevs' ], +- 'Representation .*' : ['.*\d+ bytes in .*\d+ representations total', +- '.*\d+ bytes in .*\d+ directory representations', +- '.*\d+ bytes in .*\d+ file representations', +- '.*\d+ bytes in .*\d+ representations of added file nodes', +- '.*\d+ bytes in .*\d+ directory property representations', +- '.*\d+ bytes in .*\d+ file property representations', +- '.*\d+ average delta chain length', +- '.*\d+ bytes in header & footer overhead' ], ++ 'Reading revisions' : [r'\s+ 0[ 0-9]*'], ++ 'Global .*' : [r'.*\d+ bytes in .*\d+ revisions', ++ r'.*\d+ bytes in .*\d+ changes', ++ r'.*\d+ bytes in .*\d+ node revision records', ++ r'.*\d+ bytes in .*\d+ representations', ++ r'.*\d+ bytes expanded representation size', ++ r'.*\d+ bytes with rep-sharing off' ], ++ 'Noderev .*' : [r'.*\d+ bytes in .*\d+ nodes total', ++ r'.*\d+ bytes in .*\d+ directory noderevs', ++ r'.*\d+ bytes in .*\d+ file noderevs' ], ++ 'Representation .*' : [r'.*\d+ bytes in .*\d+ representations total', ++ r'.*\d+ bytes in .*\d+ directory representations', ++ r'.*\d+ bytes in .*\d+ file representations', ++ r'.*\d+ bytes in .*\d+ representations of added file nodes', ++ r'.*\d+ bytes in .*\d+ directory property representations', ++ r'.*\d+ bytes in .*\d+ file property representations', ++ r'.*\d+ average delta chain length', ++ r'.*\d+ bytes in header & footer overhead' ], + '.* representation statistics:' : +- ['.*\d+ bytes in .*\d+ reps', +- '.*\d+ bytes in .*\d+ shared reps', +- '.*\d+ bytes expanded size', +- '.*\d+ bytes expanded shared size', +- '.*\d+ bytes with rep-sharing off', +- '.*\d+ shared references', +- '.*\d+ average delta chain length'], +- 'Largest.*:' : ['.*\d+ r\d+ */\S*'], ++ [r'.*\d+ bytes in .*\d+ reps', ++ r'.*\d+ bytes in .*\d+ shared reps', ++ r'.*\d+ bytes expanded size', ++ r'.*\d+ bytes expanded shared size', ++ r'.*\d+ bytes with rep-sharing off', ++ r'.*\d+ shared references', ++ r'.*\d+ average delta chain length'], ++ 'Largest.*:' : [r'.*\d+ r\d+ */\S*'], + 'Extensions by number .*:' : +- ['.*\d+ \( ?\d+%\) representations'], ++ [r'.*\d+ \( ?\d+%\) representations'], + 'Extensions by size .*:' : +- ['.*\d+ \( ?\d+%\) bytes'], +- 'Histogram of .*:' : ['.*\d+ \.\. < \d+.*\d+ \( ?\d+%\) bytes in *\d+ \( ?\d+%\) items'] ++ [r'.*\d+ \( ?\d+%\) bytes'], ++ 'Histogram of .*:' : [r'.*\d+ \.\. < \d+.*\d+ \( ?\d+%\) bytes in *\d+ \( ?\d+%\) items'] + } + + # check that the output contains all sections + +Modified: subversion/trunk/subversion/tests/cmdline/svnmover_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/svnmover_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/svnmover_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -35,7 +35,7 @@ + ###################################################################### + + _commit_re = re.compile('^Committed r([0-9]+)') +-_log_re = re.compile('^ ([ADRM] /[^\(]+($| \(from .*:[0-9]+\)$))') ++_log_re = re.compile(r'^ ([ADRM] /[^\(]+($| \(from .*:[0-9]+\)$))') + _err_re = re.compile('^svnmover: (.*)$') + + def mk_file(sbox, file_name): + +Modified: subversion/trunk/subversion/tests/cmdline/svnmucc_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/svnmucc_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/svnmucc_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -49,7 +49,7 @@ + sbox.repo_url + '/A') + + _svnmucc_re = re.compile(b'^(r[0-9]+) committed by jrandom at (.*)$') +-_log_re = re.compile('^ ([ADRM] /[^\(]+($| \(from .*:[0-9]+\)$))') ++_log_re = re.compile(r'^ ([ADRM] /[^\(]+($| \(from .*:[0-9]+\)$))') + _err_re = re.compile('^svnmucc: (.*)$') + + def test_svnmucc(repo_url, expected_path_changes, *varargs): + +Modified: subversion/trunk/subversion/tests/cmdline/svntest/actions.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/svntest/actions.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/svntest/actions.py Sat Sep 30 13:13:16 2023 (r2) +@@ -1046,9 +1046,9 @@ + # normal line + key, value = line.split(':', 1) + +- if re.search(' \(\d+ lines?\)$', key): ++ if re.search(r' \(\d+ lines?\)$', key): + # numbered continuation lines +- match = re.match('^(.*) \((\d+) lines?\)$', key) ++ match = re.match(r'^(.*) \((\d+) lines?\)$', key) + key = match.group(1) + lock_comment_lines = int(match.group(2)) + elif len(value) > 1: + +Modified: subversion/trunk/subversion/tests/cmdline/svntest/main.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/svntest/main.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/svntest/main.py Sat Sep 30 13:13:16 2023 (r2) +@@ -1511,7 +1511,7 @@ + merge operation on revisions REVSTART through REVEND. Omit both + REVSTART and REVEND for the case where the left and right sides of + the merge are from different URLs.""" +- from_foreign_phrase = foreign and "\(from foreign repository\) " or "" ++ from_foreign_phrase = foreign and r"\(from foreign repository\) " or "" + if target: + target_re = re.escape(target) + else: + +Modified: subversion/trunk/subversion/tests/cmdline/svntest/verify.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/svntest/verify.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/svntest/verify.py Sat Sep 30 13:13:16 2023 (r2) +@@ -1024,7 +1024,7 @@ + ] + make_diff_prop_val("+", pval) + + def make_diff_prop_modified(pname, pval1, pval2): +- """Return a property diff for modification of property PNAME, old value ++ r"""Return a property diff for modification of property PNAME, old value + PVAL1, new value PVAL2. + + PVAL is a single string with no embedded newlines. A newline at the + +Modified: subversion/trunk/subversion/tests/cmdline/svntest/wc.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/svntest/wc.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/svntest/wc.py Sat Sep 30 13:13:16 2023 (r2) +@@ -93,30 +93,30 @@ + '([KOBT ])' + '([C ]) ' + '([* ]) +' +- '((?P<wc_rev>\d+|-|\?) +(\d|-|\?)+ +(\S+) +)?' ++ r'((?P<wc_rev>\d+|-|\?) +(\d|-|\?)+ +(\S+) +)?' + '(?P<path>.+)$') + + _re_parse_status_ex = re.compile('^ (' +- '( \> moved (from (?P<moved_from>.+)|to (?P<moved_to>.*)))' +- '|( \> swapped places with (?P<swapped_with>.+).*)' +- '|(\> (?P<tc>.+))' ++ r'( \> moved (from (?P<moved_from>.+)|to (?P<moved_to>.*)))' ++ r'|( \> swapped places with (?P<swapped_with>.+).*)' ++ r'|(\> (?P<tc>.+))' + ')$') + + _re_parse_skipped = re.compile("^(Skipped[^']*) '(.+)'( --.*)?\n") + + _re_parse_summarize = re.compile("^([MAD ][M ]) (.+)\n") + +-_re_parse_checkout = re.compile('^([RMAGCUDE_ B][MAGCUDE_ ])' +- '([B ])' +- '([CAUD ])\s+' +- '(.+)') +-_re_parse_co_skipped = re.compile('^(Restored|Skipped|Removed external)' +- '\s+\'(.+)\'(( --|: ).*)?') +-_re_parse_co_restored = re.compile('^(Restored)\s+\'(.+)\'') ++_re_parse_checkout = re.compile(r'^([RMAGCUDE_ B][MAGCUDE_ ])' ++ r'([B ])' ++ r'([CAUD ])\s+' ++ r'(.+)') ++_re_parse_co_skipped = re.compile(r'^(Restored|Skipped|Removed external)' ++ r'\s+\'(.+)\'(( --|: ).*)?') ++_re_parse_co_restored = re.compile(r'^(Restored)\s+\'(.+)\'') + + # Lines typically have a verb followed by whitespace then a path. +-_re_parse_commit_ext = re.compile('^(([A-Za-z]+( [a-z]+)*)) \'(.+)\'( --.*)?') +-_re_parse_commit = re.compile('^(\w+( \(bin\))?)\s+(.+)') ++_re_parse_commit_ext = re.compile("^(([A-Za-z]+( [a-z]+)*)) '(.+)'( --.*)?") ++_re_parse_commit = re.compile(r'^(\w+( \(bin\))?)\s+(.+)') + + #rN: eids 0 15 branches 4 + _re_parse_eid_header = re.compile('^r(-1|[0-9]+): eids ([0-9]+) ([0-9]+) ' + +Modified: subversion/trunk/subversion/tests/cmdline/trans_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/trans_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/trans_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -304,7 +304,7 @@ + fp = open(url_unexp_path, 'r') + lines = fp.readlines() + if not ((len(lines) == 1) +- and (re.match("\$URL: (http|https|file|svn|svn\\+ssh)://", ++ and (re.match(r"\$URL: (http|https|file|svn|svn\+ssh)://", + lines[0]))): + logger.warn("URL expansion failed for %s", url_unexp_path) + raise svntest.Failure +@@ -314,7 +314,7 @@ + fp = open(url_exp_path, 'r') + lines = fp.readlines() + if not ((len(lines) == 1) +- and (re.match("\$URL: (http|https|file|svn|svn\\+ssh)://", ++ and (re.match(r"\$URL: (http|https|file|svn|svn\+ssh)://", + lines[0]))): + logger.warn("URL expansion failed for %s", url_exp_path) + raise svntest.Failure +@@ -324,7 +324,7 @@ + fp = open(id_unexp_path, 'r') + lines = fp.readlines() + if not ((len(lines) == 1) +- and (re.match("\$Id: id_unexp", lines[0]))): ++ and (re.match(r"\$Id: id_unexp", lines[0]))): + logger.warn("Id expansion failed for %s", id_exp_path) + raise svntest.Failure + fp.close() +@@ -333,7 +333,7 @@ + fp = open(id_exp_path, 'r') + lines = fp.readlines() + if not ((len(lines) == 1) +- and (re.match("\$Id: id_exp", lines[0]))): ++ and (re.match(r"\$Id: id_exp", lines[0]))): + logger.warn("Id expansion failed for %s", id_exp_path) + raise svntest.Failure + fp.close() +@@ -342,7 +342,7 @@ + fp = open(header_unexp_path, 'r') + lines = fp.readlines() + if not ((len(lines) == 1) +- and (re.match("\$Header: (https?|file|svn|svn\\+ssh)://.* jrandom", ++ and (re.match(r"\$Header: (https?|file|svn|svn\+ssh)://.* jrandom", + lines[0]))): + logger.warn("Header expansion failed for %s", header_unexp_path) + raise svntest.Failure +@@ -352,7 +352,7 @@ + fp = open(header_exp_path, 'r') + lines = fp.readlines() + if not ((len(lines) == 1) +- and (re.match("\$Header: (https?|file|svn|svn\\+ssh)://.* jrandom", ++ and (re.match(r"\$Header: (https?|file|svn|svn\+ssh)://.* jrandom", + lines[0]))): + logger.warn("Header expansion failed for %s", header_exp_path) + raise svntest.Failure +@@ -409,7 +409,7 @@ + fp = open(id_with_space_path, 'r') + lines = fp.readlines() + if not ((len(lines) == 1) +- and (re.match("\$Id: .*id with space", lines[0]))): ++ and (re.match(r"\$Id: .*id with space", lines[0]))): + logger.warn("Id expansion failed for %s", id_with_space_path) + raise svntest.Failure + fp.close() +@@ -418,7 +418,7 @@ + fp = open(id_exp_with_dollar_path, 'r') + lines = fp.readlines() + if not ((len(lines) == 1) +- and (re.match("\$Id: .*id_exp with_\$_sign [^$]* jrandom \$", ++ and (re.match(r"\$Id: .*id_exp with_\$_sign [^$]* jrandom \$", + lines[0]))): + logger.warn("Id expansion failed for %s", id_exp_with_dollar_path) + +@@ -645,7 +645,7 @@ + fp = open(other_url_path, 'r') + lines = fp.readlines() + if not ((len(lines) == 1) +- and (re.match("\$URL: (http|https|file|svn|svn\\+ssh)://", ++ and (re.match(r"\$URL: (http|https|file|svn|svn\+ssh)://", + lines[0]))): + logger.warn("URL expansion failed for %s", other_url_path) + raise svntest.Failure + +Modified: subversion/trunk/subversion/tests/cmdline/update_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/update_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/update_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -620,8 +620,8 @@ + + # "Extra" files that we expect to result from the conflicts. + # These are expressed as list of regexps. What a cool system! :-) +- extra_files = ['mu.*\.r1', 'mu.*\.r2', 'mu.*\.mine', +- 'rho.*\.r1', 'rho.*\.r2', 'rho.*\.mine', 'rho.*\.prej'] ++ extra_files = [r'mu.*\.r1', r'mu.*\.r2', r'mu.*\.mine', ++ r'rho.*\.r1', r'rho.*\.r2', r'rho.*\.mine', r'rho.*\.prej'] + + # Do the update and check the results in three ways. + # All "extra" files are passed to detect_conflict_files(). +@@ -2700,10 +2700,10 @@ + }) + + # "Extra" files that we expect to result from the conflicts. +- extra_files = ['eta\.r0', 'eta\.r2', 'eta\.mine', +- 'kappa\.r0', 'kappa\.r2', 'kappa\.mine', +- 'epsilon\.r0', 'epsilon\.r2', 'epsilon\.mine', +- 'kappa.prej', 'zeta.prej', 'dir_conflicts.prej'] ++ extra_files = [r'eta\.r0', r'eta\.r2', r'eta\.mine', ++ r'kappa\.r0', r'kappa\.r2', r'kappa\.mine', ++ r'epsilon\.r0', r'epsilon\.r2', r'epsilon\.mine', ++ r'kappa.prej', r'zeta.prej', r'dir_conflicts.prej'] + + # Perform forced update and check the results in three + # ways (including props). +@@ -3826,9 +3826,9 @@ + 'foo\n')) + + # Set the expected extra files for the test +- extra_files = ['iota.*\.r2', 'iota.*\.r3', 'iota.*\.mine', +- 'lambda.*\.r2', 'lambda.*\.r3', 'lambda.*\.mine', +- 'rho.*\.r2', 'rho.*\.r3', 'rho.*\.mine'] ++ extra_files = [r'iota.*\.r2', r'iota.*\.r3', r'iota.*\.mine', ++ r'lambda.*\.r2', r'lambda.*\.r3', r'lambda.*\.mine', ++ r'rho.*\.r2', r'rho.*\.r3', r'rho.*\.mine'] + + # Set the expected status for the test + expected_status = svntest.actions.get_virginal_state(wc_backup, 3) + +Modified: subversion/trunk/subversion/tests/cmdline/upgrade_tests.py +============================================================================== +--- subversion/trunk/subversion/tests/cmdline/upgrade_tests.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/subversion/tests/cmdline/upgrade_tests.py Sat Sep 30 13:13:16 2023 (r2) +@@ -51,7 +51,7 @@ + Issue = svntest.testcase.Issue_deco + Wimp = svntest.testcase.Wimp_deco + +-wc_is_too_old_regex = (".*is too old \(format \d+.*\).*") ++wc_is_too_old_regex = (r".*is too old \(format \d+.*\).*") + + + def get_current_format(): + +Modified: subversion/trunk/tools/dist/release.py +============================================================================== +--- subversion/trunk/tools/dist/release.py Sat Sep 30 11:00:27 2023 (r1) ++++ subversion/trunk/tools/dist/release.py Sat Sep 30 13:13:16 2023 (r2) +@@ -1567,7 +1567,7 @@ + mergeinfo = mergeinfo.splitlines() + + separator_pattern = re.compile('^-{72}$') +- revline_pattern = re.compile('^r(\d+) \| [^\|]+ \| [^\|]+ \| \d+ lines?$') ++ revline_pattern = re.compile(r'^r(\d+) \| [^|]+ \| [^|]+ \| \d+ lines?$') + changes_prefix_pattern = re.compile(r'^\[(U|D)?:?([^\]]+)?\](.+)$') + changes_suffix_pattern = re.compile(r'^(.+)\[(U|D)?:?([^\]]+)?\]$') + # TODO: push this into backport.status as a library function
