summaryrefslogtreecommitdiff
path: root/subversion/svn/util.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-08-05 16:22:51 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-08-05 16:22:51 +0000
commitcf46733632c7279a9fd0fe6ce26f9185a4ae82a9 (patch)
treeda27775a2161723ef342e91af41a8b51fedef405 /subversion/svn/util.c
parentbb0ef45f7c46b0ae221b26265ef98a768c33f820 (diff)
downloadsubversion-tarball-master.tar.gz
Diffstat (limited to 'subversion/svn/util.c')
-rw-r--r--subversion/svn/util.c62
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);
}