Author: brane Date: Mon Oct 21 11:29:41 2019 New Revision: 1868698 URL: http://svn.apache.org/viewvc?rev=1868698&view=rev Log: On the swig-py3 branch: Sync with trunk up to r1868691.
Added: subversion/branches/swig-py3/tools/dist/templates/STATUS.ezt - copied unchanged from r1868691, subversion/trunk/tools/dist/templates/STATUS.ezt subversion/branches/swig-py3/tools/dist/templates/release-notes.ezt - copied unchanged from r1868691, subversion/trunk/tools/dist/templates/release-notes.ezt Removed: subversion/branches/swig-py3/tools/dist/create-minor-release-branch.py Modified: subversion/branches/swig-py3/ (props changed) subversion/branches/swig-py3/INSTALL subversion/branches/swig-py3/build/run_tests.py subversion/branches/swig-py3/notes/moves subversion/branches/swig-py3/notes/repos-dictated-config subversion/branches/swig-py3/subversion/include/private/svn_repos_private.h subversion/branches/swig-py3/subversion/libsvn_fs_fs/fs.c subversion/branches/swig-py3/subversion/libsvn_repos/authz_parse.c subversion/branches/swig-py3/subversion/libsvn_repos/dump_editor.c subversion/branches/swig-py3/subversion/libsvn_repos/fs-wrap.c subversion/branches/swig-py3/subversion/libsvn_repos/load-fs-vtable.c subversion/branches/swig-py3/subversion/libsvn_subr/sysinfo.c subversion/branches/swig-py3/subversion/libsvn_wc/wc_db.c subversion/branches/swig-py3/subversion/svnrdump/load_editor.c subversion/branches/swig-py3/subversion/svnrdump/util.c subversion/branches/swig-py3/subversion/tests/cmdline/diff_tests.py subversion/branches/swig-py3/subversion/tests/cmdline/move_tests.py subversion/branches/swig-py3/subversion/tests/cmdline/svnadmin_tests.py subversion/branches/swig-py3/subversion/tests/cmdline/svnserveautocheck.sh subversion/branches/swig-py3/subversion/tests/cmdline/tree_conflict_tests.py subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild-bindings.sh subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck.sh subversion/branches/swig-py3/tools/dist/backport.pl subversion/branches/swig-py3/tools/dist/release.py subversion/branches/swig-py3/tools/dist/templates/download.ezt Propchange: subversion/branches/swig-py3/ ------------------------------------------------------------------------------ Merged /subversion/trunk:r1867213-1868691 Modified: subversion/branches/swig-py3/INSTALL URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/INSTALL?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/INSTALL (original) +++ subversion/branches/swig-py3/INSTALL Mon Oct 21 11:29:41 2019 @@ -293,7 +293,7 @@ I. INTRODUCTION instead. Apache Serf can be obtained via your system's package distribution - system or directly from http://code.google.com/p/serf/. + system or directly from https://serf.apache.org/. For more information on Apache Serf and Subversion's ra_serf, see the file subversion/libsvn_ra_serf/README. @@ -924,7 +924,7 @@ II. INSTALLATION C:>nmake -f Makefile.win C:>nmake -f Makefile.win install - Please refere to the build instructions provided by the library source + Please refer to the build instructions provided by the library source for actual build instructions. ZLib @@ -933,7 +933,7 @@ II. INSTALLATION Building ZLib using Visual Studio should be quite simple. Just open the appropriate solution and build the project zlibstat using the IDE. - Please refere to the build instructions provided by the library source + Please refer to the build instructions provided by the library source for actual build instructions. Note that you'd make sure to define ZLIB_WINAPI in the ZLib config Modified: subversion/branches/swig-py3/build/run_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/build/run_tests.py?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/build/run_tests.py (original) +++ subversion/branches/swig-py3/build/run_tests.py Mon Oct 21 11:29:41 2019 @@ -713,9 +713,11 @@ class TestHarness: # Summary. if failed or xpassed or failed_list: - print("SUMMARY: Some tests failed.\n") + summary = "Some tests failed" else: - print("SUMMARY: All tests successful.\n") + summary = "All tests successful" + print("Python version: %d.%d.%d." % sys.version_info[:3]) + print("SUMMARY: %s\n" % summary) self._close_log() return failed Modified: subversion/branches/swig-py3/notes/moves URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/notes/moves?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/notes/moves (original) +++ subversion/branches/swig-py3/notes/moves Mon Oct 21 11:29:41 2019 @@ -75,7 +75,7 @@ private libsvn_wc API: More API changes might be needed (TBD). In particular, scan_deletion may need to return a list of moves -in the multi-layer case (http://wiki.apache.org/subversion/MultiLayerMoves) +in the multi-layer case (https://cwiki.apache.org/confluence/display/SVN/MultiLayerMoves) We might require a working copy upgrade when going from 1.7 to 1.8, and only allow new move functionality to be used with 1.8 working copies. Modified: subversion/branches/swig-py3/notes/repos-dictated-config URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/notes/repos-dictated-config?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/notes/repos-dictated-config (original) +++ subversion/branches/swig-py3/notes/repos-dictated-config Mon Oct 21 11:29:41 2019 @@ -1,2 +1,2 @@ [ The contents and further evolution of this document have been moved to ] -[ http://wiki.apache.org/subversion/ServerDictatedConfiguration ] +[ https://cwiki.apache.org/confluence/display/SVN/ServerDictatedConfiguration ] Modified: subversion/branches/swig-py3/subversion/include/private/svn_repos_private.h URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/include/private/svn_repos_private.h?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/include/private/svn_repos_private.h (original) +++ subversion/branches/swig-py3/subversion/include/private/svn_repos_private.h Mon Oct 21 11:29:41 2019 @@ -86,9 +86,11 @@ svn_repos__validate_prop(const char *nam * * NAME is used to check that VALUE should be normalized, and if this * is the case, VALUE is then normalized, allocated from RESULT_POOL. - * If no normalization is required, VALUE will be copied to RESULT_POOL - * unchanged. If NORMALIZED_P is not NULL, and the normalization - * happened, set *NORMALIZED_P to non-zero. If the property is returned + * If no normalization happened, *RESULT_P will be set to VALUE, and + * no copying of the value will occur. + * + * If NORMALIZED_P is not NULL, and the normalization happened, + * set *NORMALIZED_P to non-zero. If the property is returned * unchanged and NORMALIZED_P is not NULL, then *NORMALIZED_P will be * set to zero. SCRATCH_POOL will be used for temporary allocations. */ Modified: subversion/branches/swig-py3/subversion/libsvn_fs_fs/fs.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/libsvn_fs_fs/fs.c?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/libsvn_fs_fs/fs.c (original) +++ subversion/branches/swig-py3/subversion/libsvn_fs_fs/fs.c Mon Oct 21 11:29:41 2019 @@ -277,6 +277,7 @@ fs_ioctl(svn_fs_t *fs, svn_fs_ioctl_code cancel_func, cancel_baton, result_pool, scratch_pool)); *output_p = output; + return SVN_NO_ERROR; } else if (ctlcode.code == SVN_FS_FS__IOCTL_DUMP_INDEX.code) { @@ -288,6 +289,7 @@ fs_ioctl(svn_fs_t *fs, svn_fs_ioctl_code cancel_func, cancel_baton, scratch_pool)); *output_p = NULL; + return SVN_NO_ERROR; } else if (ctlcode.code == SVN_FS_FS__IOCTL_LOAD_INDEX.code) { @@ -296,6 +298,7 @@ fs_ioctl(svn_fs_t *fs, svn_fs_ioctl_code SVN_ERR(svn_fs_fs__load_index(fs, input->revision, input->entries, scratch_pool)); *output_p = NULL; + return SVN_NO_ERROR; } else if (ctlcode.code == SVN_FS_FS__IOCTL_REVISION_SIZE.code) { @@ -307,14 +310,11 @@ fs_ioctl(svn_fs_t *fs, svn_fs_ioctl_code fs, input->revision, scratch_pool)); *output_p = output; + return SVN_NO_ERROR; } - else - return svn_error_create(SVN_ERR_FS_UNRECOGNIZED_IOCTL_CODE, NULL, NULL); } - else - return svn_error_create(SVN_ERR_FS_UNRECOGNIZED_IOCTL_CODE, NULL, NULL); - return SVN_NO_ERROR; + return svn_error_create(SVN_ERR_FS_UNRECOGNIZED_IOCTL_CODE, NULL, NULL); } /* The vtable associated with a specific open filesystem. */ Modified: subversion/branches/swig-py3/subversion/libsvn_repos/authz_parse.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/libsvn_repos/authz_parse.c?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/libsvn_repos/authz_parse.c (original) +++ subversion/branches/swig-py3/subversion/libsvn_repos/authz_parse.c Mon Oct 21 11:29:41 2019 @@ -569,7 +569,7 @@ parse_rule_path(authz_rule_t *rule, || (pattern->len == 2 && pattern->data[1] == '*')) { /* Process * and **, applying normalization as per - https://wiki.apache.org/subversion/AuthzImprovements. */ + https://cwiki.apache.org/confluence/display/SVN/Authz+Improvements. */ authz_rule_segment_t *const prev = (nseg > 1 ? segment - 1 : NULL); Modified: subversion/branches/swig-py3/subversion/libsvn_repos/dump_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/libsvn_repos/dump_editor.c?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/libsvn_repos/dump_editor.c (original) +++ subversion/branches/swig-py3/subversion/libsvn_repos/dump_editor.c Mon Oct 21 11:29:41 2019 @@ -61,8 +61,8 @@ normalize_props(apr_hash_t **normal_prop svn_pool_clear(iterpool); SVN_ERR(svn_repos__normalize_prop(&value, NULL, key, value, - result_pool, iterpool)); - svn_hash_sets(*normal_props, key, value); + iterpool, iterpool)); + svn_hash_sets(*normal_props, key, svn_string_dup(value, result_pool)); } svn_pool_destroy(iterpool); Modified: subversion/branches/swig-py3/subversion/libsvn_repos/fs-wrap.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/libsvn_repos/fs-wrap.c?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/libsvn_repos/fs-wrap.c (original) +++ subversion/branches/swig-py3/subversion/libsvn_repos/fs-wrap.c Mon Oct 21 11:29:41 2019 @@ -282,7 +282,7 @@ svn_repos__normalize_prop(const svn_stri } else { - *result_p = svn_string_dup(value, result_pool); + *result_p = value; if (normalized_p) *normalized_p = FALSE; } Modified: subversion/branches/swig-py3/subversion/libsvn_repos/load-fs-vtable.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/libsvn_repos/load-fs-vtable.c?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/libsvn_repos/load-fs-vtable.c (original) +++ subversion/branches/swig-py3/subversion/libsvn_repos/load-fs-vtable.c Mon Oct 21 11:29:41 2019 @@ -155,9 +155,11 @@ get_revision_mapping(apr_hash_t *rev_map } -/* Change revision property NAME to VALUE for REVISION in REPOS. If - VALIDATE_PROPS is set, use functions which perform validation of - the property value. Otherwise, bypass those checks. */ +/* Change revision property NAME to VALUE for REVISION in REPOS. + If NORMALIZE_PROPS is set, attempt to normalize properties before + changing them, if that is needed. If VALIDATE_PROPS is set, use + functions which perform validation of the property value. + Otherwise, bypass those checks. */ static svn_error_t * change_rev_prop(svn_repos_t *repos, svn_revnum_t revision, @@ -179,17 +181,23 @@ change_rev_prop(svn_repos_t *repos, NULL, value, pool); } -/* Change property NAME to VALUE for PATH in TXN_ROOT. If - VALIDATE_PROPS is set, use functions which perform validation of - the property value. Otherwise, bypass those checks. */ +/* Change property NAME to VALUE for PATH in TXN_ROOT. + If NORMALIZE_PROPS is set, attempt to normalize properties before + changing them, if that is needed. If VALIDATE_PROPS is set, use + functions which perform validation of the property value. + Otherwise, bypass those checks. */ static svn_error_t * change_node_prop(svn_fs_root_t *txn_root, const char *path, const char *name, const svn_string_t *value, svn_boolean_t validate_props, + svn_boolean_t normalize_props, apr_pool_t *pool) { + if (normalize_props) + SVN_ERR(svn_repos__normalize_prop(&value, NULL, name, value, pool, pool)); + if (validate_props) return svn_repos_fs_change_node_prop(txn_root, path, name, value, pool); else @@ -874,7 +882,8 @@ set_node_property(void *baton, } return change_node_prop(rb->txn_root, nb->path, name, value, - pb->validate_props, nb->pool); + pb->validate_props, rb->pb->normalize_props, + nb->pool); } @@ -890,7 +899,8 @@ delete_node_property(void *baton, return SVN_NO_ERROR; return change_node_prop(rb->txn_root, nb->path, name, NULL, - rb->pb->validate_props, nb->pool); + rb->pb->validate_props, rb->pb->normalize_props, + nb->pool); } @@ -914,7 +924,8 @@ remove_node_props(void *baton) const char *key = apr_hash_this_key(hi); SVN_ERR(change_node_prop(rb->txn_root, nb->path, key, NULL, - rb->pb->validate_props, nb->pool)); + rb->pb->validate_props, rb->pb->normalize_props, + nb->pool)); } return SVN_NO_ERROR; Modified: subversion/branches/swig-py3/subversion/libsvn_subr/sysinfo.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/libsvn_subr/sysinfo.c?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/libsvn_subr/sysinfo.c (original) +++ subversion/branches/swig-py3/subversion/libsvn_subr/sysinfo.c Mon Oct 21 11:29:41 2019 @@ -1,3 +1,4 @@ + /* * sysinfo.c : information about the running system * @@ -1386,6 +1387,7 @@ release_name_from_minor_version(int mino case 12: return "Sierra"; case 13: return "High Sierra"; case 14: return "Mojave"; + case 15: return "Catalina"; } } return NULL; Modified: subversion/branches/swig-py3/subversion/libsvn_wc/wc_db.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/libsvn_wc/wc_db.c?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/libsvn_wc/wc_db.c (original) +++ subversion/branches/swig-py3/subversion/libsvn_wc/wc_db.c Mon Oct 21 11:29:41 2019 @@ -7991,7 +7991,7 @@ struct op_delete_baton_t { * Note that the following sequence results in the same DB state: * mv A B; mv B/F B/G * We do not care about the order the moves were performed in. - * For details, see http://wiki.apache.org/subversion/MultiLayerMoves + * For details, see https://cwiki.apache.org/confluence/display/SVN/MultiLayerMoves */ struct moved_node_t { /* The source of the move. */ Modified: subversion/branches/swig-py3/subversion/svnrdump/load_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/svnrdump/load_editor.c?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/svnrdump/load_editor.c (original) +++ subversion/branches/swig-py3/subversion/svnrdump/load_editor.c Mon Oct 21 11:29:41 2019 @@ -576,7 +576,8 @@ set_revision_property(void *baton, { if (! svn_hash_gets(rb->pb->skip_revprops, name)) svn_hash_sets(rb->revprop_table, - apr_pstrdup(rb->pool, name), value); + apr_pstrdup(rb->pool, name), + svn_string_dup(value, rb->pool)); } else if (rb->head_rev_before_commit == 0 && ! svn_hash_gets(rb->pb->skip_revprops, name)) @@ -591,9 +592,9 @@ set_revision_property(void *baton, /* Remember any datestamp/ author that passes through (see comment in close_revision). */ if (!strcmp(name, SVN_PROP_REVISION_DATE)) - rb->datestamp = value; + rb->datestamp = svn_string_dup(value, rb->pool); if (!strcmp(name, SVN_PROP_REVISION_AUTHOR)) - rb->author = value; + rb->author = svn_string_dup(value, rb->pool); return SVN_NO_ERROR; } @@ -636,7 +637,7 @@ set_node_property(void *baton, prop = apr_palloc(nb->rb->pool, sizeof (*prop)); prop->name = apr_pstrdup(pool, name); - prop->value = value; + prop->value = svn_string_dup(value, pool); svn_hash_sets(nb->prop_changes, prop->name, prop); return SVN_NO_ERROR; Modified: subversion/branches/swig-py3/subversion/svnrdump/util.c URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/svnrdump/util.c?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/svnrdump/util.c (original) +++ subversion/branches/swig-py3/subversion/svnrdump/util.c Mon Oct 21 11:29:41 2019 @@ -46,8 +46,8 @@ svn_rdump__normalize_props(apr_hash_t ** svn_pool_clear(iterpool); SVN_ERR(svn_repos__normalize_prop(&value, NULL, key, value, - result_pool, iterpool)); - svn_hash_sets(*normal_props, key, value); + iterpool, iterpool)); + svn_hash_sets(*normal_props, key, svn_string_dup(value, result_pool)); } svn_pool_destroy(iterpool); Modified: subversion/branches/swig-py3/subversion/tests/cmdline/diff_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/diff_tests.py?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/diff_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/diff_tests.py Mon Oct 21 11:29:41 2019 @@ -5253,6 +5253,83 @@ def diff_git_format_copy(sbox): svntest.actions.run_and_verify_svn(expected_output, [], 'diff', '--git', '.') +#---------------------------------------------------------------------- +# Regression test for issue #1722: 'svn diff' produced a wrong header, +# indicating one revision as being in the working copy when it should +# be 'nonexistent' +@Issue(1722) +def diff_nonexistent_in_wc(sbox): + "nonexistent in working copy" + + sbox.build(empty=True) + wc_dir = sbox.wc_dir + + # We mirror the actions of the reproduction script (with one exception: + # we 'svn up -r 0' instead of checking out a second working copy) + + sbox.simple_add_text('test\n', 'file') + sbox.simple_commit() + sbox.simple_update(revision=0) + + # Expected output is empty for these cases: + # svn diff -r BASE + # svn diff -r 0:BASE + # svn diff -r 0 + + # Expected output for: + # svn diff -r BASE:HEAD + # svn diff -r 0:HEAD + # svn diff -r 0:1 + expected_output_base_head = make_diff_header("file", "nonexistent", + "revision 1") + [ + "@@ -0,0 +1 @@\n", + "+test\n", + ] + + # Expected output for: + # svn diff -r HEAD:BASE + # svn diff -r HEAD + # svn diff -r 1:0 + # svn diff -r 1 + expected_output_head_base = make_diff_header("file", "revision 1", + "nonexistent") + [ + "@@ -1 +0,0 @@\n", + "-test\n" + ] + + os.chdir(wc_dir) + + svntest.actions.run_and_verify_svn(expected_output_base_head, [], + 'diff', '-r', 'BASE:HEAD') + + svntest.actions.run_and_verify_svn(expected_output_head_base, [], + 'diff', '-r', 'HEAD:BASE') + + svntest.actions.run_and_verify_svn([], [], + 'diff', '-r', 'BASE') + + svntest.actions.run_and_verify_svn(expected_output_head_base, [], + 'diff', '-r', 'HEAD') + + svntest.actions.run_and_verify_svn([], [], + 'diff', '-r', '0:BASE') + + svntest.actions.run_and_verify_svn(expected_output_base_head, [], + 'diff', '-r', '0:HEAD') + + svntest.actions.run_and_verify_svn(expected_output_base_head, [], + 'diff', '-r', '0:1') + + svntest.actions.run_and_verify_svn(expected_output_head_base, [], + 'diff', '-r', '1:0') + + svntest.actions.run_and_verify_svn([], [], + 'diff', '-r', '0') + + svntest.actions.run_and_verify_svn(expected_output_head_base, [], + 'diff', '-r', '1') + + ######################################################################## #Run the tests @@ -5353,6 +5430,7 @@ test_list = [ None, diff_summary_repo_wc_local_copy_unmodified, diff_file_replaced_by_symlink, diff_git_format_copy, + diff_nonexistent_in_wc, ] if __name__ == '__main__': Modified: subversion/branches/swig-py3/subversion/tests/cmdline/move_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/move_tests.py?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/move_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/move_tests.py Mon Oct 21 11:29:41 2019 @@ -883,7 +883,7 @@ def build_simple_file_move_func(sbox, so # # Each test must return on success or raise on failure. # -# See http://wiki.apache.org/subversion/LocalMoves +# See https://cwiki.apache.org/confluence/display/SVN/LocalMoves def lateral_move_file_test(sbox): "lateral (rename) move of a file test" Modified: subversion/branches/swig-py3/subversion/tests/cmdline/svnadmin_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/svnadmin_tests.py?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/svnadmin_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/svnadmin_tests.py Mon Oct 21 11:29:41 2019 @@ -3859,7 +3859,7 @@ def dump_no_canonicalize_svndate(sbox): sbox.repo_url) dump_lines = svntest.actions.run_and_verify_dump(sbox.repo_dir) - assert propval + '\n' in dump_lines + assert propval.encode() + b'\n' in dump_lines def check_recover_prunes_rep_cache(sbox, enable_rep_sharing): """Check 'recover' prunes the rep-cache while enable-rep-sharing is @@ -3965,6 +3965,78 @@ def dump_include_copied_directory(sbox): svntest.actions.run_and_verify_svn(expected_output, [], 'log', '-v', '-q', sbox2.repo_url) +def load_normalize_node_props(sbox): + "svnadmin load --normalize node props" + + dump_str = b"""SVN-fs-dump-format-version: 2 + +UUID: dc40867b-38f6-0310-9f5f-f81aa277e06f + +Revision-number: 0 +Prop-content-length: 56 +Content-length: 56 + +K 8 +svn:date +V 27 +2005-05-03T19:09:41.129900Z +PROPS-END + +Revision-number: 1 +Prop-content-length: 99 +Content-length: 99 + +K 7 +svn:log +V 0 + +K 10 +svn:author +V 2 +pl +K 8 +svn:date +V 27 +2005-05-03T19:10:19.975578Z +PROPS-END + +Node-path: +Node-kind: dir +Node-action: change +Prop-content-length: 32 +Content-length: 32 + +K 10 +svn:ignore +V 3 +\n\r\n +PROPS-END + + +""" + sbox.build(empty=True) + + # Try to load the dumpstream, expecting a failure (because of mixed + # EOLs in the svn:ignore property value). + exp_err = svntest.verify.RegexListOutput(['svnadmin: E125005:.*', + 'svnadmin: E125017:.*'], + match_all=False) + load_and_verify_dumpstream(sbox, [], exp_err, dumpfile_revisions, + False, dump_str, '--ignore-uuid') + + # Now try it again with prop normalization. + svntest.actions.load_repo(sbox, dump_str=dump_str, + bypass_prop_validation=False, + normalize_props=True) + # We should get the normalized property value. + exit_code, output, _ = svntest.main.run_svn(None, 'pg', 'svn:ignore', + '--no-newline', + sbox.repo_url) + svntest.verify.verify_exit_code(None, exit_code, 0) + if output != ['\n', '\n']: + raise svntest.Failure("Unexpected property value %s" % output) + + ######################################################################## # Run the tests @@ -4043,6 +4115,7 @@ test_list = [ None, recover_prunes_rep_cache_when_enabled, recover_prunes_rep_cache_when_disabled, dump_include_copied_directory, + load_normalize_node_props, ] if __name__ == '__main__': Modified: subversion/branches/swig-py3/subversion/tests/cmdline/svnserveautocheck.sh URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/svnserveautocheck.sh?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/svnserveautocheck.sh (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/svnserveautocheck.sh Mon Oct 21 11:29:41 2019 @@ -134,7 +134,7 @@ random_port() { if [ -n "$BASH_VERSION" ]; then echo $(($RANDOM+1024)) else - $PYTHON -c 'import random; print random.randint(1024, 2**16-1)' + $PYTHON -c 'import random; print(random.randint(1024, 2**16-1))' fi } Modified: subversion/branches/swig-py3/subversion/tests/cmdline/tree_conflict_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/cmdline/tree_conflict_tests.py?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/subversion/tests/cmdline/tree_conflict_tests.py (original) +++ subversion/branches/swig-py3/subversion/tests/cmdline/tree_conflict_tests.py Mon Oct 21 11:29:41 2019 @@ -1518,7 +1518,7 @@ def local_missing_dir_endless_loop(sbox) sbox.simple_move('A/B', 'A/B2') sbox.simple_commit() sbox.simple_update() - main.file_append_binary(sbox.ospath("A/B2/lambda"), "This is more content.\n") + main.file_append(sbox.ospath("A/B2/lambda"), "This is more content.\n") sbox.simple_commit() sbox.simple_update() @@ -1541,7 +1541,7 @@ interactive-conflicts = true # If everything works as expected the resolver will recommended a # resolution option and 'svn' will resolve the conflict automatically. # Verify that 'A1/B/lambda' contains the merged content: - contents = open(sbox.ospath('A1/B/lambda'), 'rb').readlines() + contents = open(sbox.ospath('A1/B/lambda'), 'r').readlines() svntest.verify.compare_and_display_lines( "A1/B/lambda has unexpectected contents", sbox.ospath("A1/B/lambda"), [ "This is the file 'lambda'.\n", "This is more content.\n"], contents) Modified: subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild-bindings.sh URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild-bindings.sh?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild-bindings.sh (original) +++ subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild-bindings.sh Mon Oct 21 11:29:41 2019 @@ -24,17 +24,51 @@ scripts=$(cd $(dirname "$0") && pwd) . ${scripts}/setenv.sh +# Parse arguments to find out which bindings we should build +if [ -z "$1" ]; then + use_python3=false + build_swig_py=true + build_swig_pl=true + build_swig_rb=true + build_javahl=true +else + use_python3=false + build_swig_py=false + build_swig_pl=false + build_swig_rb=false + build_javahl=false + + while [ ! -z "$1" ]; do + case "$1" in + python3) use_python3=true;; + swig-py) build_swig_py=true;; + swig-pl) build_swig_pl=true;; + swig-rb) build_swig_rb=true;; + javahl) build_javahl=true;; + *) exit 1;; + esac + shift + done +fi + +${use_python3} \ + && test -n "${SVNBB_PYTHON3ENV}" \ + && . ${SVNBB_PYTHON3ENV}/bin/activate \ + && export PYTHON="$(which python)" + # -# Step 4: build bindings +# Step 1: build bindings # build_bindings() { echo "============ make $1" cd ${absbld} - make $1 + make $1 || exit 1 } -build_bindings swig-py -build_bindings swig-pl -build_bindings swig-rb -build_bindings javahl +${build_swig_py} && build_bindings swig-py +${build_swig_pl} && build_bindings swig-pl +${build_swig_rb} && build_bindings swig-rb +${build_javahl} && build_bindings javahl + +exit 0 Modified: subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh (original) +++ subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh Mon Oct 21 11:29:41 2019 @@ -54,6 +54,13 @@ else parallel=${SVNBB_PARALLEL} fi +# An optional parameter tells us if this build should use Python 3. +if [ "$3" = "python3" ]; then + test -n "${SVNBB_PYTHON3ENV}" \ + && . ${SVNBB_PYTHON3ENV}/bin/activate \ + && export PYTHON="$(which python)" +fi + # # Step 0: Create a directory for the test log files # Modified: subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh (original) +++ subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh Mon Oct 21 11:29:41 2019 @@ -37,6 +37,7 @@ scripts=$(cd $(dirname "$0") && pwd) . ${scripts}/setenv.sh # Parse arguments to find out which tests we should run +use_python3=false check_swig_py=false check_swig_pl=false check_swig_rb=false @@ -44,15 +45,21 @@ check_javahl=false while [ ! -z "$1" ]; do case "$1" in + python3) use_python3=true;; swig-py) check_swig_py=true;; swig-pl) check_swig_pl=true;; swig-rb) check_swig_rb=true;; javahl) check_javahl=true;; - *) exit 1;; + *) exit 1;; esac shift done +${use_python3} \ + && test -n "${SVNBB_PYTHON3ENV}" \ + && . ${SVNBB_PYTHON3ENV}/bin/activate \ + && export PYTHON="$(which python)" + ${check_swig_py} && run_tests swig-py ${check_swig_pl} && run_tests swig-pl ${check_swig_rb} && run_tests swig-rb Modified: subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck.sh URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck.sh?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck.sh (original) +++ subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck.sh Mon Oct 21 11:29:41 2019 @@ -98,7 +98,10 @@ while [ ! -z "$1" ]; do shift done -${use_python3} && test -n "${SVNBB_PYTHON3ENV}" && . ${SVNBB_PYTHON3ENV}/bin/activate +${use_python3} \ + && test -n "${SVNBB_PYTHON3ENV}" \ + && . ${SVNBB_PYTHON3ENV}/bin/activate \ + && export PYTHON="$(which python)" ${check_local} && check_tests local ${check_svn} && check_tests svn Modified: subversion/branches/swig-py3/tools/dist/backport.pl URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/dist/backport.pl?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/tools/dist/backport.pl (original) +++ subversion/branches/swig-py3/tools/dist/backport.pl Mon Oct 21 11:29:41 2019 @@ -262,6 +262,9 @@ numbers); it will be ignored. For examp $0 "Committed revision 42." "\$Some_justification" will nominate r42. +Revision numbers within the last thousand revisions may be specified using +the last three digits only. + The justification can be an arbitrarily-long string; if it is wider than the available width, this script will wrap it for you (and allow you to review the result before committing). @@ -1238,6 +1241,20 @@ sub nominate_main { die "Unable to proceed." if warned_cannot_commit "Nominating failed"; + # To save typing, require just the last three digits if they're unambiguous. + my $BASE_revision = `$SVN info --show-item=revision` + 0; + if ($BASE_revision > 1000) { + my $residue = $BASE_revision % 1000; + my $thousands = $BASE_revision - $residue; + @revnums = map { + $_ >= 1000 + ? $_ + : $thousands + $_ - 1000 * ($_ > $residue) + } + @revnums; + } + + # Deduplicate and sort @revnums = sort { $a <=> $b } keys %{{ map { $_ => 1 } @revnums }}; die "No revision numbers specified" unless @revnums; Modified: subversion/branches/swig-py3/tools/dist/release.py URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/dist/release.py?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/tools/dist/release.py (original) +++ subversion/branches/swig-py3/tools/dist/release.py Mon Oct 21 11:29:41 2019 @@ -68,77 +68,52 @@ except ImportError: # Our required / recommended release tool versions by release branch -tool_versions = { - 'trunk' : { +tool_versions = {} +tool_versions['1.8'] = { 'autoconf' : ['2.69', '954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969'], - 'libtool' : ['2.4.6', - 'e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3'], - 'swig' : ['3.0.12', - '7cf9f447ae7ed1c51722efc45e7f14418d15d7a1e143ac9f09a668999f4fc94d'], - }, - '1.13' : { - 'autoconf' : ['2.69', - '954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969'], - 'libtool' : ['2.4.6', - 'e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3'], - 'swig' : ['3.0.12', - '7cf9f447ae7ed1c51722efc45e7f14418d15d7a1e143ac9f09a668999f4fc94d'], - }, - '1.12' : { - 'autoconf' : ['2.69', - '954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969'], - 'libtool' : ['2.4.6', - 'e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3'], - 'swig' : ['3.0.12', - '7cf9f447ae7ed1c51722efc45e7f14418d15d7a1e143ac9f09a668999f4fc94d'], - }, - '1.11' : { + 'libtool' : ['2.4.3', + '36b4881c1843d7585de9c66c4c3d9a067ed3a3f792bc670beba21f5a4960acdf'], + 'swig' : ['2.0.9', + '586954000d297fafd7e91d1ad31089cc7e249f658889d11a44605d3662569539'], + } +tool_versions['1.9'] = { 'autoconf' : ['2.69', '954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969'], 'libtool' : ['2.4.6', 'e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3'], - 'swig' : ['3.0.12', - '7cf9f447ae7ed1c51722efc45e7f14418d15d7a1e143ac9f09a668999f4fc94d'], - }, - '1.10' : { + 'swig' : ['2.0.12', + '65e13f22a60cecd7279c59882ff8ebe1ffe34078e85c602821a541817a4317f7'], + } +tool_versions['1.10'] = { 'autoconf' : ['2.69', '954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969'], 'libtool' : ['2.4.6', 'e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3'], 'swig' : ['3.0.12', '7cf9f447ae7ed1c51722efc45e7f14418d15d7a1e143ac9f09a668999f4fc94d'], - }, - '1.9' : { - 'autoconf' : ['2.69', - '954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969'], - 'libtool' : ['2.4.6', - 'e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3'], - 'swig' : ['2.0.12', - '65e13f22a60cecd7279c59882ff8ebe1ffe34078e85c602821a541817a4317f7'], - }, - '1.8' : { - 'autoconf' : ['2.69', - '954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969'], - 'libtool' : ['2.4.3', - '36b4881c1843d7585de9c66c4c3d9a067ed3a3f792bc670beba21f5a4960acdf'], - 'swig' : ['2.0.9', - '586954000d297fafd7e91d1ad31089cc7e249f658889d11a44605d3662569539'], - }, -} + } +tool_versions['1.11'] = tool_versions['1.10'] +tool_versions['1.12'] = tool_versions['1.10'] +tool_versions['1.13'] = tool_versions['1.10'] +tool_versions['trunk'] = tool_versions['1.10'] # The version that is our current recommended release # ### TODO: derive this from svn_version.h; see ../../build/getversion.py -recommended_release = '1.12' +recommended_release = '1.13' # For clean-dist, a whitelist of artifacts to keep, by version. supported_release_lines = frozenset({"1.9", "1.10", "1.12", "1.13"}) # Some constants -svn_repos = 'https://svn.apache.org/repos/asf/subversion' -dist_repos = 'https://dist.apache.org/repos/dist' +svn_repos = os.getenv('SVN_RELEASE_SVN_REPOS', + 'https://svn.apache.org/repos/asf/subversion') +dist_repos = os.getenv('SVN_RELEASE_DIST_REPOS', + 'https://dist.apache.org/repos/dist') dist_dev_url = dist_repos + '/dev/subversion' dist_release_url = dist_repos + '/release/subversion' dist_archive_url = 'https://archive.apache.org/dist/subversion' +buildbot_repos = os.getenv('SVN_RELEASE_BUILDBOT_REPOS', + 'https://svn.apache.org/repos/infra/infrastructure/buildbot/aegis/buildmaster') KEYS = 'https://people.apache.org/keys/group/subversion.asc' extns = ['zip', 'tar.gz', 'tar.bz2'] @@ -183,18 +158,6 @@ class Version(object): def is_prerelease(self): return self.pre != None - def is_recommended(self): - return self.branch == recommended_release - - def get_download_anchor(self): - if self.is_prerelease(): - return 'pre-releases' - else: - if self.is_recommended(): - return 'recommended-release' - else: - return 'supported-releases' - def get_ver_tags(self, revnum): # These get substituted into svn_version.h ver_tag = '' @@ -282,15 +245,12 @@ def get_exportdir(base_dir, version, rev return os.path.join(get_tempdir(base_dir), 'subversion-%s-r%d' % (version, revnum)) -def get_deploydir(base_dir): - return os.path.join(base_dir, 'deploy') - def get_target(args): "Return the location of the artifacts" if args.target: return args.target else: - return get_deploydir(args.base_dir) + return os.path.join(args.base_dir, 'deploy') def get_branch_path(args): if not args.branch: @@ -314,7 +274,7 @@ def get_tmplfile(filename): def get_nullfile(): return open(os.path.devnull, 'w') -def run_command(cmd, verbose=True, hide_stderr=False): +def run_command(cmd, verbose=True, hide_stderr=False, dry_run=False): if verbose: print("+ " + ' '.join(cmd)) stderr = None @@ -325,7 +285,10 @@ def run_command(cmd, verbose=True, hide_ if hide_stderr: stderr = get_nullfile() - subprocess.check_call(cmd, stdout=stdout, stderr=stderr) + if not dry_run: + subprocess.check_call(cmd, stdout=stdout, stderr=stderr) + else: + print(' ## dry-run; not executed') def run_script(verbose, script, hide_stderr=False): for l in script.split('\n'): @@ -345,15 +308,28 @@ def download_file(url, target, checksum) "downloaded: '%s'; expected: '%s'" % \ (target, checksum, checksum2)) -def run_svn(cmd, verbose=True, username=None): +def run_svn(cmd, verbose=True, dry_run=False, username=None): if (username): cmd[:0] = ['--username', username] - run_command(['svn'] + cmd, verbose) + run_command(['svn'] + cmd, verbose=verbose, dry_run=dry_run) -def run_svnmucc(cmd, verbose=True, username=None): +def run_svnmucc(cmd, verbose=True, dry_run=False, username=None): if (username): cmd[:0] = ['--username', username] - run_command(['svnmucc'] + cmd, verbose) + run_command(['svnmucc'] + cmd, verbose=verbose, dry_run=dry_run) + +#---------------------------------------------------------------------- +def is_recommended(version): + return version.branch == recommended_release + +def get_download_anchor(version): + if version.is_prerelease(): + return 'pre-releases' + else: + if is_recommended(version): + return 'recommended-release' + else: + return 'supported-releases' #---------------------------------------------------------------------- # ezt helpers @@ -378,7 +354,7 @@ def cleanup(args): shutil.rmtree(get_prefix(args.base_dir), True) shutil.rmtree(get_tempdir(args.base_dir), True) - shutil.rmtree(get_deploydir(args.base_dir), True) + shutil.rmtree(get_target(args), True) #---------------------------------------------------------------------- @@ -535,6 +511,217 @@ def build_env(args): #---------------------------------------------------------------------- +# Create a new minor release branch + +def get_trunk_wc_path(base_dir, path=None): + trunk_wc_path = os.path.join(get_tempdir(base_dir), 'svn-trunk') + if path is None: return trunk_wc_path + return os.path.join(trunk_wc_path, path) + +def get_buildbot_wc_path(base_dir, path=None): + buildbot_wc_path = os.path.join(get_tempdir(base_dir), 'svn-buildmaster') + if path is None: return buildbot_wc_path + return os.path.join(buildbot_wc_path, path) + +def get_trunk_url(revnum=None): + return svn_repos + '/trunk' + '@' + (str(revnum) if revnum else '') + +def get_branch_url(ver): + return svn_repos + '/branches/' + ver.branch + '.x' + +def get_tag_url(ver): + return svn_repos + '/tags/' + ver.base + +def edit_file(path, pattern, replacement): + print("Editing '%s'" % (path,)) + print(" pattern='%s'" % (pattern,)) + print(" replace='%s'" % (replacement,)) + old_text = open(path, 'r').read() + new_text = re.sub(pattern, replacement, old_text) + assert new_text != old_text + open(path, 'w').write(new_text) + +def edit_changes_file(path, newtext): + """Insert NEWTEXT in the 'CHANGES' file found at PATH, + just before the first line that starts with 'Version '. + """ + print("Prepending to '%s'" % (path,)) + print(" text='%s'" % (newtext,)) + lines = open(path, 'r').readlines() + for i, line in enumerate(lines): + if line.startswith('Version '): + with open(path, 'w') as newfile: + newfile.writelines(lines[:i]) + newfile.write(newtext) + newfile.writelines(lines[i:]) + break + +#---------------------------------------------------------------------- +def make_release_branch(args): + ver = args.version + run_svn(['copy', + get_trunk_url(args.revnum), + get_branch_url(ver), + '-m', 'Create the ' + ver.branch + '.x release branch.'], + dry_run=args.dry_run) + +#---------------------------------------------------------------------- +def update_minor_ver_in_trunk(args): + """Change the minor version in trunk to the next (future) minor version. + """ + ver = args.version + trunk_wc = get_trunk_wc_path(args.base_dir) + run_svn(['checkout', + get_trunk_url(args.revnum), + trunk_wc]) + + prev_ver = Version('1.%d.0' % (ver.minor - 1,)) + next_ver = Version('1.%d.0' % (ver.minor + 1,)) + relpaths = [] + + relpath = 'subversion/include/svn_version.h' + relpaths.append(relpath) + edit_file(get_trunk_wc_path(args.base_dir, relpath), + r'(#define SVN_VER_MINOR *)%s' % (ver.minor,), + r'\g<1>%s' % (next_ver.minor,)) + + relpath = 'subversion/tests/cmdline/svntest/main.py' + relpaths.append(relpath) + edit_file(get_trunk_wc_path(args.base_dir, relpath), + r'(SVN_VER_MINOR = )%s' % (ver.minor,), + r'\g<1>%s' % (next_ver.minor,)) + + relpath = 'subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java' + relpaths.append(relpath) + try: + # since r1817921 (just after branching 1.10) + edit_file(get_trunk_wc_path(args.base_dir, relpath), + r'SVN_VER_MINOR = %s;' % (ver.minor,), + r'SVN_VER_MINOR = %s;' % (next_ver.minor,)) + except: + # before r1817921: two separate places + edit_file(get_trunk_wc_path(args.base_dir, relpath), + r'version.isAtLeast\(1, %s, 0\)' % (ver.minor,), + r'version.isAtLeast\(1, %s, 0\)' % (next_ver.minor,)) + edit_file(get_trunk_wc_path(args.base_dir, relpath), + r'1.%s.0, but' % (ver.minor,), + r'1.%s.0, but' % (next_ver.minor,)) + + relpath = 'CHANGES' + relpaths.append(relpath) + # insert at beginning of CHANGES file + edit_changes_file(get_trunk_wc_path(args.base_dir, relpath), + 'Version ' + next_ver.base + '\n' + + '(?? ??? 20XX, from /branches/' + next_ver.branch + '.x)\n' + + get_tag_url(next_ver) + '\n' + + '\n') + + log_msg = '''\ +Increment the trunk version number to %s, and introduce a new CHANGES +section, following the creation of the %s.x release branch. + +* subversion/include/svn_version.h, + subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java, + subversion/tests/cmdline/svntest/main.py + (SVN_VER_MINOR): Increment to %s. + +* CHANGES: New section for %s.0. +''' % (next_ver.branch, ver.branch, next_ver.minor, next_ver.branch) + commit_paths = [get_trunk_wc_path(args.base_dir, p) for p in relpaths] + run_svn(['commit'] + commit_paths + ['-m', log_msg], + dry_run=args.dry_run) + +#---------------------------------------------------------------------- +def create_status_file_on_branch(args): + ver = args.version + branch_wc = get_workdir(args.base_dir) + branch_url = get_branch_url(ver) + run_svn(['checkout', branch_url, branch_wc, '--depth=immediates']) + + status_local_path = os.path.join(branch_wc, 'STATUS') + template_filename = 'STATUS.ezt' + data = { 'major-minor' : ver.branch, + 'major-minor-patch' : ver.base, + } + + template = ezt.Template(compress_whitespace=False) + template.parse(get_tmplfile(template_filename).read()) + + with open(status_local_path, 'wx') as g: + template.generate(g, data) + run_svn(['add', status_local_path]) + run_svn(['commit', status_local_path, + '-m', '* branches/' + ver.branch + '.x/STATUS: New file.'], + dry_run=args.dry_run) + +#---------------------------------------------------------------------- +def update_backport_bot(args): + ver = args.version + print("""\ + +*** MANUAL STEP REQUIRED *** + + Ask someone with appropriate access to add the %s.x branch + to the backport merge bot. See + http://subversion.apache.org/docs/community-guide/releasing.html#backport-merge-bot + +*** + +""" % (ver.branch,)) + +#---------------------------------------------------------------------- +def update_buildbot_config(args): + """Add the new branch to the list of branches monitored by the buildbot + master. + """ + ver = args.version + buildbot_wc = get_buildbot_wc_path(args.base_dir) + run_svn(['checkout', buildbot_repos, buildbot_wc]) + + prev_ver = Version('1.%d.0' % (ver.minor - 1,)) + next_ver = Version('1.%d.0' % (ver.minor + 1,)) + + relpath = 'master1/projects/subversion.conf' + edit_file(get_buildbot_wc_path(args.base_dir, relpath), + r'(MINOR_LINES=\[.*%s)(\])' % (prev_ver.minor,), + r'\1, %s\2' % (ver.minor,)) + + log_msg = '''\ +Subversion: start monitoring the %s branch. +''' % (ver.branch) + commit_paths = [get_buildbot_wc_path(args.base_dir, relpath)] + run_svn(['commit'] + commit_paths + ['-m', log_msg], + dry_run=args.dry_run) + +#---------------------------------------------------------------------- +def create_release_branch(args): + make_release_branch(args) + update_minor_ver_in_trunk(args) + create_status_file_on_branch(args) + update_backport_bot(args) + update_buildbot_config(args) + + +#---------------------------------------------------------------------- +def write_release_notes(args): + + template_filename = 'release-notes.ezt' + + prev_ver = Version('%d.%d.0' % (args.version.major, args.version.minor - 1)) + data = { 'major-minor' : args.version.branch, + 'previous-major-minor' : prev_ver.branch, + } + + template = ezt.Template(compress_whitespace=False) + template.parse(get_tmplfile(template_filename).read()) + + if args.edit_html_file: + with open(args.edit_html_file, 'w') as g: + template.generate(g, data) + else: + template.generate(sys.stdout, data) + +#---------------------------------------------------------------------- # Create release artifacts def compare_changes(repos, branch, revision): @@ -611,11 +798,11 @@ def roll_tarballs(args): compare_changes(svn_repos, branch, args.revnum) # Ensure the output directory doesn't already exist - if os.path.exists(get_deploydir(args.base_dir)): + if os.path.exists(get_target(args)): raise RuntimeError('output directory \'%s\' already exists' - % get_deploydir(args.base_dir)) + % get_target(args)) - os.mkdir(get_deploydir(args.base_dir)) + os.mkdir(get_target(args)) logging.info('Preparing working copy source') shutil.rmtree(get_workdir(args.base_dir), True) @@ -682,9 +869,9 @@ def roll_tarballs(args): def export(windows): shutil.rmtree(exportdir, True) if windows: - eol_style = "--native-eol CRLF" + eol_style = "--native-eol=CRLF" else: - eol_style = "--native-eol LF" + eol_style = "--native-eol=LF" run_svn(['export', eol_style, get_workdir(args.base_dir), exportdir], verbose=args.verbose) @@ -761,8 +948,8 @@ def roll_tarballs(args): for e in extns: filename = basename + '.' + e filepath = os.path.join(get_tempdir(args.base_dir), filename) - shutil.move(filepath, get_deploydir(args.base_dir)) - filepath = os.path.join(get_deploydir(args.base_dir), filename) + shutil.move(filepath, get_target(args)) + filepath = os.path.join(get_target(args), filename) if args.version < Version("1.11.0-alpha1"): # 1.10 and earlier generate *.sha1 files for compatibility reasons. # They are deprecated, however, so we don't publicly link them in @@ -778,7 +965,7 @@ def roll_tarballs(args): if args.version.pre != 'nightly': shutil.copy(os.path.join(get_workdir(args.base_dir), 'subversion', 'include', 'svn_version.h'), - os.path.join(get_deploydir(args.base_dir), + os.path.join(get_target(args), 'svn_version.h.dist-%s' % str(args.version))) # And we're done! @@ -1006,8 +1193,8 @@ def write_news(args): 'major-minor' : args.version.branch, 'version' : str(args.version), 'version_base' : args.version.base, - 'anchor': args.version.get_download_anchor(), - 'is_recommended': ezt_bool(args.version.is_recommended()), + 'anchor': get_download_anchor(args.version), + 'is_recommended': ezt_bool(is_recommended(args.version)), 'announcement_url': args.announcement_url, } @@ -1067,7 +1254,7 @@ def write_announcement(args): 'siginfo' : "\n".join(siginfo) + "\n", 'major-minor' : args.version.branch, 'major-minor-patch' : args.version.base, - 'anchor' : args.version.get_download_anchor(), + 'anchor' : get_download_anchor(args.version), } if args.version.is_prerelease(): @@ -1468,13 +1655,18 @@ def main(): parser = argparse.ArgumentParser( description='Create an Apache Subversion release.') parser.add_argument('--clean', action='store_true', default=False, - help='Remove any directories previously created by %(prog)s') + help='''Remove any directories previously created by %(prog)s, + including the 'prefix' dir, the 'temp' dir, and the + default or specified target dir.''') parser.add_argument('--verbose', action='store_true', default=False, help='Increase output verbosity') parser.add_argument('--base-dir', default=os.getcwd(), help='''The directory in which to create needed files and folders. The default is the current working directory.''') + parser.add_argument('--target', + help='''The full path to the directory containing + release artifacts. Default: <BASE_DIR>/deploy''') parser.add_argument('--branch', help='''The branch to base the release on, as a path relative to ^/subversion/. @@ -1499,6 +1691,39 @@ def main(): help='''Attempt to use existing build dependencies before downloading and building a private set.''') + # Setup the parser for the create-release-branch subcommand + subparser = subparsers.add_parser('create-release-branch', + help='''Create a minor release branch: branch from trunk, + update version numbers on trunk, create status + file on branch, update backport bot, + update buildbot config.''') + subparser.set_defaults(func=create_release_branch) + subparser.add_argument('version', type=Version, + help='''A version number to indicate the branch, such as + '1.7.0' (the '.0' is required).''') + subparser.add_argument('revnum', type=lambda arg: int(arg.lstrip('r')), + nargs='?', default=None, + help='''The trunk revision number to base the branch on. + Default is HEAD.''') + subparser.add_argument('--dry-run', action='store_true', default=False, + help='Avoid committing any changes to repositories.') + + # Setup the parser for the create-release-branch subcommand + subparser = subparsers.add_parser('write-release-notes', + help='''Write a template release-notes file.''') + subparser.set_defaults(func=write_release_notes) + subparser.add_argument('version', type=Version, + help='''A version number to indicate the branch, such as + '1.7.0' (the '.0' is required).''') + subparser.add_argument('revnum', type=lambda arg: int(arg.lstrip('r')), + nargs='?', default=None, + help='''The trunk revision number to base the branch on. + Default is HEAD.''') + subparser.add_argument('--edit-html-file', + help='''Write the template release-notes to this file.''') + subparser.add_argument('--dry-run', action='store_true', default=False, + help='Avoid committing any changes to repositories.') + # Setup the parser for the roll subcommand subparser = subparsers.add_parser('roll', help='''Create the release artifacts.''') @@ -1516,9 +1741,6 @@ def main(): subparser.set_defaults(func=sign_candidates) subparser.add_argument('version', type=Version, help='''The release label, such as '1.7.0-alpha1'.''') - subparser.add_argument('--target', - help='''The full path to the directory containing - release artifacts.''') subparser.add_argument('--userid', help='''The (optional) USER-ID specifying the key to be used for signing, such as '110B1C95' (Key-ID). If @@ -1531,9 +1753,6 @@ def main(): subparser.set_defaults(func=post_candidates) subparser.add_argument('version', type=Version, help='''The release label, such as '1.7.0-alpha1'.''') - subparser.add_argument('--target', - help='''The full path to the directory containing - release artifacts.''') # Setup the parser for the create-tag subcommand subparser = subparsers.add_parser('create-tag', @@ -1544,9 +1763,6 @@ def main(): help='''The release label, such as '1.7.0-alpha1'.''') subparser.add_argument('revnum', type=lambda arg: int(arg.lstrip('r')), help='''The revision number to base the release on.''') - subparser.add_argument('--target', - help='''The full path to the directory containing - release artifacts.''') # Setup the parser for the bump-versions-on-branch subcommand subparser = subparsers.add_parser('bump-versions-on-branch', @@ -1556,9 +1772,6 @@ def main(): help='''The release label, such as '1.7.0-alpha1'.''') subparser.add_argument('revnum', type=lambda arg: int(arg.lstrip('r')), help='''The revision number to base the release on.''') - subparser.add_argument('--target', - help='''The full path to the directory containing - release artifacts.''') # The clean-dist subcommand subparser = subparsers.add_parser('clean-dist', @@ -1597,9 +1810,6 @@ def main(): subparser.add_argument('--security', action='store_true', default=False, help='''The release being announced includes security fixes.''') - subparser.add_argument('--target', - help='''The full path to the directory containing - release artifacts.''') subparser.add_argument('version', type=Version, help='''The release label, such as '1.7.0-alpha1'.''') @@ -1608,9 +1818,6 @@ def main(): help='''Output to stdout template text for the download table for subversion.apache.org''') subparser.set_defaults(func=write_downloads) - subparser.add_argument('--target', - help='''The full path to the directory containing - release artifacts.''') subparser.add_argument('version', type=Version, help='''The release label, such as '1.7.0-alpha1'.''') @@ -1621,9 +1828,6 @@ def main(): subparser.set_defaults(func=check_sigs) subparser.add_argument('version', type=Version, help='''The release label, such as '1.7.0-alpha1'.''') - subparser.add_argument('--target', - help='''The full path to the directory containing - release artifacts.''') # get-keys subparser = subparsers.add_parser('get-keys', Modified: subversion/branches/swig-py3/tools/dist/templates/download.ezt URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/dist/templates/download.ezt?rev=1868698&r1=1868697&r2=1868698&view=diff ============================================================================== --- subversion/branches/swig-py3/tools/dist/templates/download.ezt (original) +++ subversion/branches/swig-py3/tools/dist/templates/download.ezt Mon Oct 21 11:29:41 2019 @@ -7,8 +7,6 @@ </tr> [for fileinfo]<tr> <td><a href="[[]preferred]subversion/[fileinfo.filename]">[fileinfo.filename]</a></td> - <!-- The sha512 line does not have a class="checksum" since the link needn't - be rendered in monospace. --> <td>[<a href="https://www.apache.org/dist/subversion/[fileinfo.filename].sha512">SHA-512</a>]</td> <td>[<a href="https://www.apache.org/dist/subversion/[fileinfo.filename].asc">PGP</a>]</td> </tr>[end]