diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-08-05 16:22:51 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-08-05 16:22:51 +0000 |
commit | cf46733632c7279a9fd0fe6ce26f9185a4ae82a9 (patch) | |
tree | da27775a2161723ef342e91af41a8b51fedef405 /subversion/svn/util.c | |
parent | bb0ef45f7c46b0ae221b26265ef98a768c33f820 (diff) | |
download | subversion-tarball-master.tar.gz |
subversion-1.9.7HEADsubversion-1.9.7master
Diffstat (limited to 'subversion/svn/util.c')
-rw-r--r-- | subversion/svn/util.c | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/subversion/svn/util.c b/subversion/svn/util.c index 092bc7e..88ae27b 100644 --- a/subversion/svn/util.c +++ b/subversion/svn/util.c @@ -75,8 +75,15 @@ svn_cl__print_commit_info(const svn_commit_info_t *commit_info, void *baton, apr_pool_t *pool) { + /* Be very careful with returning errors from this callback as those + will be returned as errors from editor->close_edit(...), which may + cause callers to assume that the commit itself failed. + + See log message of r1659867 and the svn_ra_get_commit_editor3 + documentation for details on error scenarios. */ + if (SVN_IS_VALID_REVNUM(commit_info->revision)) - SVN_ERR(svn_cmdline_printf(pool, _("\nCommitted revision %ld%s.\n"), + SVN_ERR(svn_cmdline_printf(pool, _("Committed revision %ld%s.\n"), commit_info->revision, commit_info->revision == 42 && getenv("SVN_I_LOVE_PANGALACTIC_GARGLE_BLASTERS") @@ -164,9 +171,9 @@ svn_cl__merge_file_externally(const char *base_path, * is OK to continue with the merge. * Any other exit code means there was a real problem. */ if (exitcode != 0 && exitcode != 1) - return svn_error_createf - (SVN_ERR_EXTERNAL_PROGRAM, NULL, - _("The external merge tool exited with exit code %d"), exitcode); + return svn_error_createf(SVN_ERR_EXTERNAL_PROGRAM, NULL, + _("The external merge tool '%s' exited with exit code %d."), + merge_tool, exitcode); else if (remains_in_conflict) *remains_in_conflict = exitcode == 1; } @@ -197,7 +204,7 @@ svn_cl__make_log_msg_baton(void **baton, apr_hash_t *config, apr_pool_t *pool) { - struct log_msg_baton *lmb = apr_palloc(pool, sizeof(*lmb)); + struct log_msg_baton *lmb = apr_pcalloc(pool, sizeof(*lmb)); if (opt_state->filedata) { @@ -230,8 +237,10 @@ svn_cl__make_log_msg_baton(void **baton, SVN_CONFIG_OPTION_LOG_ENCODING, NULL); } + else + lmb->message_encoding = NULL; - lmb->base_dir = base_dir ? base_dir : ""; + lmb->base_dir = base_dir; lmb->tmpfile_left = NULL; lmb->config = config; lmb->keep_locks = opt_state->no_unlock; @@ -343,22 +352,17 @@ svn_cl__get_log_message(const char **log_msg, *tmp_file = NULL; if (lmb->message) { - svn_stringbuf_t *log_msg_buf = svn_stringbuf_create(lmb->message, pool); - svn_string_t *log_msg_str = apr_pcalloc(pool, sizeof(*log_msg_str)); - - /* Trim incoming messages of the EOF marker text and the junk - that follows it. */ - truncate_buffer_at_prefix(&(log_msg_buf->len), log_msg_buf->data, - EDITOR_EOF_PREFIX); + svn_string_t *log_msg_str = svn_string_create(lmb->message, pool); - /* Make a string from a stringbuf, sharing the data allocation. */ - log_msg_str->data = log_msg_buf->data; - log_msg_str->len = log_msg_buf->len; - SVN_ERR_W(svn_subst_translate_string2(&log_msg_str, FALSE, FALSE, + SVN_ERR_W(svn_subst_translate_string2(&log_msg_str, NULL, NULL, log_msg_str, lmb->message_encoding, FALSE, pool, pool), _("Error normalizing log message to internal format")); + /* Strip off the EOF marker text and the junk that follows it. */ + truncate_buffer_at_prefix(&(log_msg_str->len), (char *)log_msg_str->data, + EDITOR_EOF_PREFIX); + *log_msg = log_msg_str->data; return SVN_NO_ERROR; } @@ -388,14 +392,11 @@ svn_cl__get_log_message(const char **log_msg, if (! path) path = item->url; - else if (! *path) - path = "."; - - if (! svn_path_is_url(path) && lmb->base_dir) + else if (lmb->base_dir) path = svn_dirent_is_child(lmb->base_dir, path, pool); /* If still no path, then just use current directory. */ - if (! path) + if (! path || !*path) path = "."; if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE) @@ -434,7 +435,8 @@ svn_cl__get_log_message(const char **log_msg, if (! lmb->non_interactive) { err = svn_cmdline__edit_string_externally(&msg_string, &lmb->tmpfile_left, - lmb->editor_cmd, lmb->base_dir, + lmb->editor_cmd, + lmb->base_dir ? lmb->base_dir : "", msg_string, "svn-commit", lmb->config, TRUE, lmb->message_encoding, @@ -466,7 +468,7 @@ svn_cl__get_log_message(const char **log_msg, if (msg_string) message = svn_stringbuf_create_from_string(msg_string, pool); - /* Strip the prefix from the buffer. */ + /* Strip off the EOF marker text and the junk that follows it. */ if (message) truncate_buffer_at_prefix(&message->len, message->data, EDITOR_EOF_PREFIX); @@ -565,8 +567,8 @@ svn_cl__error_checked_fputs(const char *string, FILE* stream) if (fputs(string, stream) == EOF) { - if (errno) - return svn_error_wrap_apr(errno, _("Write error")); + if (apr_get_os_error()) /* is errno on POSIX */ + return svn_error_wrap_apr(apr_get_os_error(), _("Write error")); else return svn_error_create(SVN_ERR_IO_WRITE_ERROR, NULL, NULL); } @@ -631,7 +633,7 @@ svn_cl__xml_tagged_cdata(svn_stringbuf_t **sb, if (string) { svn_xml_make_open_tag(sb, pool, svn_xml_protect_pcdata, - tagname, NULL); + tagname, SVN_VA_NULL); svn_xml_escape_cdata_cstring(sb, string, pool); svn_xml_make_close_tag(sb, pool, tagname); } @@ -648,7 +650,7 @@ svn_cl__print_xml_commit(svn_stringbuf_t **sb, /* "<commit ...>" */ svn_xml_make_open_tag(sb, pool, svn_xml_normal, "commit", "revision", - apr_psprintf(pool, "%ld", revision), NULL); + apr_psprintf(pool, "%ld", revision), SVN_VA_NULL); /* "<author>xx</author>" */ if (author) @@ -669,7 +671,7 @@ svn_cl__print_xml_lock(svn_stringbuf_t **sb, apr_pool_t *pool) { /* "<lock>" */ - svn_xml_make_open_tag(sb, pool, svn_xml_normal, "lock", NULL); + svn_xml_make_open_tag(sb, pool, svn_xml_normal, "lock", SVN_VA_NULL); /* "<token>xx</token>" */ svn_cl__xml_tagged_cdata(sb, pool, "token", lock->token); @@ -704,7 +706,7 @@ svn_cl__xml_print_header(const char *tagname, svn_xml_make_header2(&sb, "UTF-8", pool); /* "<TAGNAME>" */ - svn_xml_make_open_tag(&sb, pool, svn_xml_normal, tagname, NULL); + svn_xml_make_open_tag(&sb, pool, svn_xml_normal, tagname, SVN_VA_NULL); return svn_cl__error_checked_fputs(sb->data, stdout); } |