Karl Fogel <kfogel@newton.ch.collab.net> writes:
> Marcus, the patch doesn't have a log message.
> 
> Can you repost it with a log message?  (If your mailer allows you to
> put the patch inline, instead of as an attachment, that would be great
> too, but not a big deal either way).
Certainly.
---8<--- log message ---8<---
* subversion/clients/cmdline/util.c
  (svn_cl__edit_externally): Avoid the need to put base_dir into the
  tmpfile filename by doing a cd there first.  Fixes issue #809.
  Fixed problem in cleanup code with using tmpfile_native, which may
  not have been initialized yet.
  Fixed one spelling error.
---8<--- 
        ^^^ no pun intended, really.  :-)
---8<--- patch ---8<---
Index: subversion/clients/cmdline/util.c
===================================================================
--- subversion/clients/cmdline/util.c
+++ subversion/clients/cmdline/util.c	Tue Jul 23 23:16:05 2002
@@ -351,11 +351,12 @@
   const char *cmd;
   apr_file_t *tmp_file;
   const char *tmpfile_name;
-  const char *contents_native, *tmpfile_native;
+  const char *contents_native, *tmpfile_native, *base_dir_native;
   apr_status_t apr_err, apr_err2;
   apr_size_t written;
   apr_finfo_t finfo_before, finfo_after;
-  svn_error_t *err = SVN_NO_ERROR;
+  svn_error_t *err = SVN_NO_ERROR, *err2;
+  char *old_cwd;
   int sys_err;
 
   /* Try to find an editor in the environment. */
@@ -375,12 +376,33 @@
   /* Convert file contents from UTF-8 */
   SVN_ERR (svn_utf_cstring_from_utf8 (&contents_native, contents, pool));
 
-  /* Ask the working copy for a temporary file based on BASE_DIR */
-  SVN_ERR (svn_io_open_unique_file 
-           (&tmp_file, &tmpfile_name,
-            svn_path_join (base_dir, "msg", pool), ".tmp", FALSE, pool));
+  /* Move to BASE_DIR to avoid getting characters that need quoting
+     into tmpfile_name */
+  apr_err = apr_filepath_get (&old_cwd, APR_FILEPATH_NATIVE, pool);
+  if (apr_err)
+    {
+      return svn_error_create
+        (apr_err, 0, NULL, pool, "failed to get current working directory");
+    }
+  SVN_ERR (svn_utf_cstring_from_utf8 (&base_dir_native, base_dir, pool));
+  apr_err = apr_filepath_set (base_dir_native, pool);
+  if (apr_err)
+    {
+      return svn_error_createf
+        (apr_err, 0, NULL, pool,
+         "failed to change working directory to '%s'", base_dir);
+    }
+
+  /*** From here on, any problems that occur require us to cd back!! ***/
 
-  /*** From here one, any problems that occur require us to cleanup
+  /* Ask the working copy for a temporary file */
+  err = svn_io_open_unique_file 
+    (&tmp_file, &tmpfile_name,
+     "msg", ".tmp", FALSE, pool);
+  if (err)
+    goto cleanup2;
+
+  /*** From here on, any problems that occur require us to cleanup
        the file we just created!! ***/
 
   /* Dump initial CONTENTS to TMP_FILE. */
@@ -416,7 +438,7 @@
     }
 
   /* Now, run the editor command line.  */
-  cmd = apr_psprintf (pool, "%s \"%s\"", editor, tmpfile_native);
+  cmd = apr_psprintf (pool, "%s %s", editor, tmpfile_native);
   sys_err = system (cmd);
   if (sys_err != 0)
     {
@@ -457,12 +479,24 @@
 
  cleanup:
 
-  apr_err = apr_file_remove (tmpfile_native, pool);
+  err2 = svn_io_remove_file (tmpfile_name, pool);
 
   /* Only report remove error if there was no previous error. */
-  if (! err && apr_err)
-    err = svn_error_createf (apr_err, 0, NULL, pool,
-                             "failed to remove '%s'", tmpfile_name);
+  if (! err && err2)
+    err = err2;
+
+ cleanup2:
+
+  /* If we against all probability can't cd back, all further relative
+     file references would be screwed up, so we have to abort. */
+  apr_err = apr_filepath_set (old_cwd, pool);
+  if (apr_err)
+    {
+      svn_handle_error (svn_error_create
+                        (apr_err, 0, NULL, pool,
+                         "failed to restore current working directory"),
+                        stderr, TRUE /* fatal */);
+    }
 
   return err;
 }
---8<---
  // Marcus
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Wed Jul 24 01:54:33 2002