You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2013/07/03 01:12:44 UTC
svn commit: r1499145 [4/4] - in /subversion/branches/fsfs-format7: ./
build/ac-macros/ subversion/bindings/javahl/native/
subversion/bindings/javahl/src/org/apache/subversion/javahl/
subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/...
Modified: subversion/branches/fsfs-format7/subversion/svn/cleanup-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/svn/cleanup-cmd.c?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/svn/cleanup-cmd.c (original)
+++ subversion/branches/fsfs-format7/subversion/svn/cleanup-cmd.c Tue Jul 2 23:12:42 2013
@@ -109,6 +109,14 @@ svn_cl__cleanup(apr_getopt_t *os,
subpool));
}
}
+ else if (err && err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY &&
+ (opt_state->remove_unversioned || opt_state->remove_ignored))
+ {
+ err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, err,
+ _("Cannot remove unversioned or ignored "
+ "items from something that is not a "
+ "working copy"));
+ }
SVN_ERR(err);
}
Modified: subversion/branches/fsfs-format7/subversion/svn/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/svn/status.c?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/svn/status.c (original)
+++ subversion/branches/fsfs-format7/subversion/svn/status.c Tue Jul 2 23:12:42 2013
@@ -269,14 +269,15 @@ print_status(const char *cwd_abspath, co
if (tree_conflicted)
{
- const svn_wc_conflict_description2_t *tree_conflict;
+ const svn_wc_conflict_description3_t *tree_conflict;
SVN_ERR(svn_wc__get_tree_conflict(&tree_conflict, ctx->wc_ctx,
local_abspath, pool, pool));
SVN_ERR_ASSERT(tree_conflict != NULL);
tree_status_code = 'C';
SVN_ERR(svn_cl__get_human_readable_tree_conflict_description(
- &desc, tree_conflict, pool));
+ &desc, svn_wc__cd3_to_cd2(tree_conflict, pool),
+ pool));
tree_desc_line = apr_psprintf(pool, "\n > %s", desc);
(*tree_conflicts)++;
}
Modified: subversion/branches/fsfs-format7/subversion/svn/svn.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/svn/svn.c?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/svn/svn.c (original)
+++ subversion/branches/fsfs-format7/subversion/svn/svn.c Tue Jul 2 23:12:42 2013
@@ -512,7 +512,7 @@ const svn_opt_subcommand_desc2_t svn_cl_
" Note that the 'svn status' command shows unversioned items as '?',\n"
" and ignored items as 'I' if the --no-ignore option is given to it.\n"),
{opt_merge_cmd, opt_remove_unversioned, opt_remove_ignored,
- opt_include_externals} },
+ opt_include_externals, 'q'} },
{ "commit", svn_cl__commit, {"ci"},
N_("Send changes from your working copy to the repository.\n"
Modified: subversion/branches/fsfs-format7/subversion/svnserve/serve.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/svnserve/serve.c?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/svnserve/serve.c (original)
+++ subversion/branches/fsfs-format7/subversion/svnserve/serve.c Tue Jul 2 23:12:42 2013
@@ -1392,13 +1392,13 @@ static svn_error_t *commit(svn_ra_svn_co
apr_array_header_t *params, void *baton)
{
server_baton_t *b = baton;
- const char *log_msg = NULL,
+ const char *log_msg,
*date = NULL,
*author = NULL,
*post_commit_err = NULL;
apr_array_header_t *lock_tokens;
svn_boolean_t keep_locks;
- apr_array_header_t *revprop_list = NULL;
+ apr_array_header_t *revprop_list;
apr_hash_t *revprop_table;
const svn_delta_editor_t *editor;
void *edit_baton;
Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/svnlook_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/svnlook_tests.py?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/svnlook_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/svnlook_tests.py Tue Jul 2 23:12:42 2013
@@ -709,10 +709,8 @@ fp.close()"""
' bogus_rev_prop\n',
' svn:date\n',
' svn:txn-client-compat-version\n',
+ ' svn:txn-user-agent\n',
]
- # ra_dav and ra_svn add the user-agent ephemeral property
- if svntest.main.is_ra_type_dav() or svntest.main.is_ra_type_svn():
- expected_data.append(' svn:txn-user-agent\n')
verify_logfile(logfilepath, svntest.verify.UnorderedOutput(expected_data))
def property_delete(sbox):
Propchange: subversion/branches/fsfs-format7/subversion/tests/libsvn_client/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Tue Jul 2 23:12:42 2013
@@ -5,3 +5,5 @@ test-patch*
test-wc*
test-copy-crash
test-youngest-common-ancestor
+foreign-copy1
+foreign-copy2
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_fs/fs-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_fs/fs-test.c?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_fs/fs-test.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_fs/fs-test.c Tue Jul 2 23:12:42 2013
@@ -27,6 +27,7 @@
#include "../svn_test.h"
+#include "svn_hash.h"
#include "svn_pools.h"
#include "svn_time.h"
#include "svn_string.h"
@@ -4957,12 +4958,14 @@ filename_trailing_newline(const svn_test
svn_fs_root_t *txn_root, *root;
svn_revnum_t youngest_rev = 0;
svn_error_t *err;
- svn_boolean_t allow_newlines;
+ svn_boolean_t legacy_backend;
+ static const char contents[] = "foo\003bar";
- /* Some filesystem implementations can handle newlines in filenames
- * and can be white-listed here.
- * Currently, only BDB supports \n in filenames. */
- allow_newlines = (strcmp(opts->fs_type, "bdb") == 0);
+ /* The FS API wants \n to be permitted, but FSFS never implemented that,
+ * so for FSFS we expect errors rather than successes in some of the commits.
+ * Use a blacklist approach so that new FSes default to implementing the API
+ * as originally defined. */
+ legacy_backend = (!strcmp(opts->fs_type, SVN_FS_TYPE_FSFS));
SVN_ERR(svn_test__create_fs(&fs, "test-repo-filename-trailing-newline",
opts, pool));
@@ -4980,17 +4983,59 @@ filename_trailing_newline(const svn_test
SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
SVN_ERR(svn_fs_revision_root(&root, fs, youngest_rev, subpool));
err = svn_fs_copy(root, "/foo", txn_root, "/bar\n", subpool);
- if (allow_newlines)
+ if (!legacy_backend)
SVN_TEST_ASSERT(err == SVN_NO_ERROR);
else
SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_PATH_SYNTAX);
/* Attempt to create a file /foo/baz\n. This should fail on FSFS. */
err = svn_fs_make_file(txn_root, "/foo/baz\n", subpool);
- if (allow_newlines)
+ if (!legacy_backend)
SVN_TEST_ASSERT(err == SVN_NO_ERROR);
else
SVN_TEST_ASSERT_ERROR(err, SVN_ERR_FS_PATH_SYNTAX);
+
+
+ /* Create another file, with contents. */
+ if (!legacy_backend)
+ {
+ SVN_ERR(svn_fs_make_file(txn_root, "/bar\n/baz\n", subpool));
+ SVN_ERR(svn_test__set_file_contents(txn_root, "bar\n/baz\n",
+ contents, pool));
+ }
+
+ if (!legacy_backend)
+ {
+ svn_revnum_t after_rev;
+ static svn_test__tree_entry_t expected_entries[] = {
+ { "foo", NULL },
+ { "bar\n", NULL },
+ { "foo/baz\n", "" },
+ { "bar\n/baz\n", contents },
+ { NULL, NULL }
+ };
+ const char *expected_changed_paths[] = {
+ "/bar\n",
+ "/foo/baz\n",
+ "/bar\n/baz\n",
+ NULL
+ };
+ apr_hash_t *expected_changes = apr_hash_make(pool);
+ int i;
+
+ SVN_ERR(svn_fs_commit_txn(NULL, &after_rev, txn, subpool));
+ SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(after_rev));
+
+ /* Validate the DAG. */
+ SVN_ERR(svn_fs_revision_root(&root, fs, after_rev, pool));
+ SVN_ERR(svn_test__validate_tree(root, expected_entries, 4, pool));
+
+ /* Validate changed-paths, where the problem originally occurred. */
+ for (i = 0; expected_changed_paths[i]; i++)
+ svn_hash_sets(expected_changes, expected_changed_paths[i],
+ "undefined value");
+ SVN_ERR(svn_test__validate_changes(root, expected_changes, pool));
+ }
return SVN_NO_ERROR;
}
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/config-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/config-test.c?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/config-test.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/config-test.c Tue Jul 2 23:12:42 2013
@@ -336,6 +336,22 @@ test_stream_interface(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_ignore_bom(apr_pool_t *pool)
+{
+ svn_config_t *cfg;
+ svn_string_t *cfg_string = svn_string_create("\xEE\xBB\xBF[s1]\nfoo=bar\n",
+ pool);
+ svn_stream_t *stream = svn_stream_from_string(cfg_string, pool);
+
+ SVN_ERR(svn_config_parse(&cfg, stream, TRUE, TRUE, pool));
+
+ if (! svn_config_has_section(cfg, "s1"))
+ return fail(pool, "failed to find section s1");
+
+ return SVN_NO_ERROR;
+}
+
/*
====================================================================
If you add a new test to this file, update this array.
@@ -359,5 +375,6 @@ struct svn_test_descriptor_t test_funcs[
"test case-sensitive option name lookup"),
SVN_TEST_PASS2(test_stream_interface,
"test svn_config_parse"),
+ SVN_TEST_XFAIL2(test_ignore_bom, "test parsing config file with BOM"),
SVN_TEST_NULL
};
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/conflict-data-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/conflict-data-test.c?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/conflict-data-test.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/conflict-data-test.c Tue Jul 2 23:12:42 2013
@@ -88,8 +88,8 @@ compare_version(const svn_wc_conflict_ve
* (including names of temporary files), or are both NULL. Return an
* error if not. */
static svn_error_t *
-compare_conflict(const svn_wc_conflict_description2_t *actual,
- const svn_wc_conflict_description2_t *expected)
+compare_conflict(const svn_wc_conflict_description3_t *actual,
+ const svn_wc_conflict_description3_t *expected)
{
if (actual == NULL && expected == NULL)
return SVN_NO_ERROR;
@@ -181,7 +181,7 @@ compare_prop_conflict(const svn_wc_confl
}
/* Create and return a tree conflict description */
-static svn_wc_conflict_description2_t *
+static svn_wc_conflict_description3_t *
tree_conflict_create(const char *local_abspath,
svn_node_kind_t node_kind,
svn_wc_operation_t operation,
@@ -198,14 +198,14 @@ tree_conflict_create(const char *local_a
apr_pool_t *result_pool)
{
svn_wc_conflict_version_t *left, *right;
- svn_wc_conflict_description2_t *conflict;
+ svn_wc_conflict_description3_t *conflict;
left = svn_wc_conflict_version_create2(left_repo, NULL, left_path,
left_revnum, left_kind, result_pool);
right = svn_wc_conflict_version_create2(right_repo, NULL, right_path,
right_revnum, right_kind,
result_pool);
- conflict = svn_wc_conflict_description_create_tree2(
+ conflict = svn_wc_conflict_description_create_tree3(
local_abspath, node_kind, operation,
left, right, result_pool);
conflict->action = action;
@@ -216,8 +216,8 @@ tree_conflict_create(const char *local_a
static svn_error_t *
test_deserialize_tree_conflict(apr_pool_t *pool)
{
- const svn_wc_conflict_description2_t *conflict;
- svn_wc_conflict_description2_t *exp_conflict;
+ const svn_wc_conflict_description3_t *conflict;
+ svn_wc_conflict_description3_t *exp_conflict;
const char *tree_conflict_data;
const char *local_abspath;
const svn_skel_t *skel;
@@ -226,7 +226,7 @@ test_deserialize_tree_conflict(apr_pool_
"(version 0 2 -1 0 0 ) (version 0 2 -1 0 0 ))";
SVN_ERR(svn_dirent_get_absolute(&local_abspath, "Foo.c", pool));
- exp_conflict = svn_wc_conflict_description_create_tree2(
+ exp_conflict = svn_wc_conflict_description_create_tree3(
local_abspath, svn_node_file, svn_wc_operation_update,
NULL, NULL, pool);
exp_conflict->action = svn_wc_conflict_action_delete;
@@ -248,7 +248,7 @@ test_deserialize_tree_conflict(apr_pool_
static svn_error_t *
test_serialize_tree_conflict_data(apr_pool_t *pool)
{
- svn_wc_conflict_description2_t *conflict;
+ svn_wc_conflict_description3_t *conflict;
const char *tree_conflict_data;
const char *expected;
const char *local_abspath;
@@ -256,7 +256,7 @@ test_serialize_tree_conflict_data(apr_po
SVN_ERR(svn_dirent_get_absolute(&local_abspath, "Foo.c", pool));
- conflict = svn_wc_conflict_description_create_tree2(
+ conflict = svn_wc_conflict_description_create_tree3(
local_abspath, svn_node_file, svn_wc_operation_update,
NULL, NULL, pool);
conflict->action = svn_wc_conflict_action_delete;
@@ -285,7 +285,7 @@ test_read_write_tree_conflicts(const svn
const char *parent_abspath;
const char *child1_abspath, *child2_abspath;
- svn_wc_conflict_description2_t *conflict1, *conflict2;
+ svn_wc_conflict_description3_t *conflict1, *conflict2;
SVN_ERR(svn_test__sandbox_create(&sbox, "read_write_tree_conflicts", opts, pool));
parent_abspath = svn_dirent_join(sbox.wc_abspath, "A", pool);
@@ -337,7 +337,7 @@ test_read_write_tree_conflicts(const svn
/* Read conflicts back */
{
- const svn_wc_conflict_description2_t *read_conflict;
+ const svn_wc_conflict_description3_t *read_conflict;
SVN_ERR(svn_wc__get_tree_conflict(&read_conflict, sbox.wc_ctx,
child1_abspath, pool, pool));
Modified: subversion/branches/fsfs-format7/subversion/tests/svn_test_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/svn_test_fs.c?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/svn_test_fs.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/svn_test_fs.c Tue Jul 2 23:12:42 2013
@@ -370,6 +370,8 @@ get_dir_entries(apr_hash_t *tree_entries
}
+/* Verify that PATH under ROOT is: a directory if contents is NULL;
+ a file with contents CONTENTS otherwise. */
static svn_error_t *
validate_tree_entry(svn_fs_root_t *root,
const char *path,
@@ -531,6 +533,42 @@ svn_test__validate_tree(svn_fs_root_t *r
svn_error_t *
+svn_test__validate_changes(svn_fs_root_t *root,
+ apr_hash_t *expected,
+ apr_pool_t *pool)
+{
+ apr_hash_t *actual;
+ apr_hash_index_t *hi;
+
+ SVN_ERR(svn_fs_paths_changed2(&actual, root, pool));
+
+#if 0
+ /* Print ACTUAL and EXPECTED. */
+ {
+ int i;
+ for (i=0, hi = apr_hash_first(pool, expected); hi; hi = apr_hash_next(hi))
+ SVN_DBG(("expected[%d] = '%s'\n", i++, svn__apr_hash_index_key(hi)));
+ for (i=0, hi = apr_hash_first(pool, actual); hi; hi = apr_hash_next(hi))
+ SVN_DBG(("actual[%d] = '%s'\n", i++, svn__apr_hash_index_key(hi)));
+ }
+#endif
+
+ for (hi = apr_hash_first(pool, expected); hi; hi = apr_hash_next(hi))
+ if (NULL == svn_hash_gets(actual, svn__apr_hash_index_key(hi)))
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "Path '%s' missing from actual changed-paths",
+ svn__apr_hash_index_key(hi));
+
+ for (hi = apr_hash_first(pool, actual); hi; hi = apr_hash_next(hi))
+ if (NULL == svn_hash_gets(expected, svn__apr_hash_index_key(hi)))
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "Path '%s' missing from expected changed-paths",
+ svn__apr_hash_index_key(hi));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
svn_test__txn_script_exec(svn_fs_root_t *txn_root,
svn_test__txn_script_command_t *script,
int num_edits,
Modified: subversion/branches/fsfs-format7/subversion/tests/svn_test_fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/svn_test_fs.h?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/svn_test_fs.h (original)
+++ subversion/branches/fsfs-format7/subversion/tests/svn_test_fs.h Tue Jul 2 23:12:42 2013
@@ -112,6 +112,14 @@ svn_test__validate_tree(svn_fs_root_t *r
int num_entries,
apr_pool_t *pool);
+/* Verify that svn_fs_paths_changed2(ROOT) returns a hash with exactly
+ the same keys as EXPECTED_KEYS. Values are not currently verified.
+ */
+svn_error_t *
+svn_test__validate_changes(svn_fs_root_t *root,
+ apr_hash_t *expected_keys,
+ apr_pool_t *pool);
+
/* Structure for describing script-ish commands to perform on a
transaction using svn_test__txn_script_exec(). */
typedef struct svn_test__txn_script_command_t
Modified: subversion/branches/fsfs-format7/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd (original)
+++ subversion/branches/fsfs-format7/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd Tue Jul 2 23:12:42 2013
@@ -59,6 +59,7 @@ taskkill /im svnsync.exe /f 2> nul:
taskkill /im httpd.exe /f 2> nul:
taskkill /im fs-test.exe /f 2> nul:
taskkill /im op-depth-test.exe /f 2> nul:
+taskkill /im atomic-ra-revprop-change.exe /f 2> nul:
taskkill /im java.exe /f 2> nul:
taskkill /im perl.exe /f 2> nul:
taskkill /im mspdbsrv.exe /f 2> nul:
Modified: subversion/branches/fsfs-format7/tools/dev/po-merge.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/tools/dev/po-merge.py?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/tools/dev/po-merge.py (original)
+++ subversion/branches/fsfs-format7/tools/dev/po-merge.py Tue Jul 2 23:12:42 2013
@@ -178,9 +178,10 @@ def main(argv):
for i in msgstr:
outfile.write('msgstr[%s] %s\n' % (n, msgstr[n]))
n += 1
- for m in msgstr:
- if m == '""':
- untranslated += 1
+ if msgstr is not None:
+ for m in msgstr:
+ if m == '""':
+ untranslated += 1
for c in comments:
if c.startswith('#,') and 'fuzzy' in c.split(', '):
fuzzy += 1
Modified: subversion/branches/fsfs-format7/tools/dev/unix-build/Makefile.svn
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/tools/dev/unix-build/Makefile.svn?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/tools/dev/unix-build/Makefile.svn (original)
+++ subversion/branches/fsfs-format7/tools/dev/unix-build/Makefile.svn Tue Jul 2 23:12:42 2013
@@ -1193,8 +1193,9 @@ else
endif
ifdef PROFILE
-SVN_ALL_STATIC=--enable-all-static
+SVN_STATIC_FLAG=--enable-all-static
else
+SVN_STATIC_FLAG=--disable-static
SVN_WITH_HTTPD=--with-apxs="$(PREFIX)/httpd/bin/apxs" \
--with-apache-libexecdir="$(PREFIX)/httpd/modules/svn-$(WC)"
SVN_WITH_SASL=--with-sasl="$(PREFIX)/cyrus-sasl"
@@ -1224,7 +1225,7 @@ $(SVN_OBJDIR)/.configured: $(SVN_OBJDIR)
--disable-mod-activation \
$(JAVAHL_FLAG) \
$(LIBMAGIC_FLAG) \
- $(SVN_ALL_STATIC) \
+ $(SVN_STATIC_FLAG) \
$(DISABLE_NEON_VERSION_CHECK)
touch $@
Modified: subversion/branches/fsfs-format7/tools/dist/backport.pl
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/tools/dist/backport.pl?rev=1499145&r1=1499144&r2=1499145&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/tools/dist/backport.pl (original)
+++ subversion/branches/fsfs-format7/tools/dist/backport.pl Tue Jul 2 23:12:42 2013
@@ -192,14 +192,18 @@ sub parse_entry {
$branch = sanitize_branch $1
if $_[0] =~ /^(\S*) branch$/ or $_[0] =~ m#branches/(\S+)#;
while ($_[0] =~ /^r/) {
+ my $sawrevnum = 0;
while ($_[0] =~ s/^r(\d+)(?:$|[,; ]+)//) {
push @revisions, $1;
+ $sawrevnum++;
}
- shift;
+ $sawrevnum ? shift : last;
}
# summary
- push @logsummary, shift until $_[0] =~ /^\s*\w+:/ or not defined $_[0];
+ do {
+ push @logsummary, shift
+ } until $_[0] =~ /^\s*\w+:/ or not defined $_[0];
# votes
unshift @votes, pop until $_[-1] =~ /^\s*Votes:/ or not defined $_[-1];
@@ -273,6 +277,12 @@ sub handle_entry {
1;
}
+sub maybe_revert {
+ # This is both a SIGINT handler, and the tail end of main() in normal runs.
+ system $SVN, qw/revert -R ./ if !$YES and prompt 'Revert? ';
+ exit if @_;
+}
+
sub main {
usage, exit 0 if @ARGV;
@@ -294,6 +304,8 @@ sub main {
}
$/ = ""; # paragraph mode
+ $SIG{INT} = \&maybe_revert;
+
my $in_approved = 0;
while (<STATUS>) {
my @lines = split /\n/;
@@ -324,7 +336,7 @@ sub main {
}
}
- system $SVN, qw/revert -R ./ if !$YES and prompt 'Revert? ';
+ maybe_revert;
}
&main