update from MirBSD; for us relevant:
[alioth/cvs.git] / src / logmsg.c
index b61b7ef..3c82759 100644 (file)
@@ -15,6 +15,8 @@
 #include "cvs.h"
 #include "getline.h"
 
+__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/logmsg.c,v 1.12 2010/09/19 19:43:05 tg Exp $");
+
 static int find_type (Node * p, void *closure);
 static int fmt_proc (Node * p, void *closure);
 static int logfile_write (const char *repository, const char *filter,
@@ -31,6 +33,8 @@ static int verifymsg_proc (const char *repository, const char *script,
 static FILE *fp;
 static Ctype type;
 
+char *LogMsgFile = NULL;
+
 struct verifymsg_proc_data
 {
     /* The name of the temp file storing the log message to be verified.  This
@@ -201,6 +205,7 @@ do_editor (const char *dir, char **messagep, const char *repository,
     char *fname;
     struct stat pre_stbuf, post_stbuf;
     int retcode = 0;
+    int finish = 0;
 
     assert (!current_parsed_root->isremote != !repository);
 
@@ -224,6 +229,10 @@ do_editor (const char *dir, char **messagep, const char *repository,
            (*messagep)[strlen (*messagep) - 1] != '\n')
            (void) fprintf (fp, "\n");
     }
+    else
+       (void) fputc ('\n', fp);
+    if (finish)
+       goto finish_off;
 
     if (repository != NULL)
        /* tack templates on if necessary */
@@ -267,6 +276,9 @@ do_editor (const char *dir, char **messagep, const char *repository,
     (void) fprintf (fp,
   "%s----------------------------------------------------------------------\n",
                    CVSEDITPREFIX);
+    if (readonlyfs)
+      (void) fprintf (fp, "%sATTENTION: read-only mode selected!\n",
+                     CVSEDITPREFIX);
     (void) fprintf (fp,
   "%sEnter Log.  Lines beginning with `%.*s' are removed automatically\n%s\n",
                    CVSEDITPREFIX, CVSEDITPREFIXLEN, CVSEDITPREFIX,
@@ -280,28 +292,38 @@ do_editor (const char *dir, char **messagep, const char *repository,
   "%s----------------------------------------------------------------------\n",
                    CVSEDITPREFIX);
 
+ finish_off:
     /* finish off the temp file */
     if (fclose (fp) == EOF)
         error (1, errno, "%s", fname);
-    if (stat (fname, &pre_stbuf) == -1)
+    if (LogMsgFile)
+    {
+       if (unlink_file (LogMsgFile) < 0)
+           error (0, errno, "warning: cannot remove temp file %s", LogMsgFile);
+       free (LogMsgFile);
+    }
+    LogMsgFile = fname;
+    if (finish)
+       return;
+    if (stat (LogMsgFile, &pre_stbuf) == -1)
        pre_stbuf.st_mtime = 0;
 
     /* run the editor */
     run_setup (Editor);
-    run_add_arg (fname);
+    run_add_arg (LogMsgFile);
     if ((retcode = run_exec (RUN_TTY, RUN_TTY, RUN_TTY,
                             RUN_NORMAL | RUN_SIGIGNORE)) != 0)
        error (0, retcode == -1 ? errno : 0, "warning: editor session failed");
 
     /* put the entire message back into the *messagep variable */
 
-    fp = xfopen (fname, "r");
+    fp = xfopen (LogMsgFile, "r");
 
     if (*messagep)
        free (*messagep);
 
-    if (stat (fname, &post_stbuf) != 0)
-           error (1, errno, "cannot find size of temp file %s", fname);
+    if (stat (LogMsgFile, &post_stbuf) != 0)
+           error (1, errno, "cannot find size of temp file %s", LogMsgFile);
 
     if (post_stbuf.st_size == 0)
        *messagep = NULL;
@@ -326,7 +348,7 @@ do_editor (const char *dir, char **messagep, const char *repository,
            if (line_length == -1)
            {
                if (ferror (fp))
-                   error (0, errno, "warning: cannot read %s", fname);
+                   error (0, errno, "warning: cannot read %s", LogMsgFile);
                break;
            }
            if (strncmp (line, CVSEDITPREFIX, CVSEDITPREFIXLEN) == 0)
@@ -339,7 +361,7 @@ do_editor (const char *dir, char **messagep, const char *repository,
        }
     }
     if (fclose (fp) < 0)
-       error (0, errno, "warning: cannot close %s", fname);
+       error (0, errno, "warning: cannot close %s", LogMsgFile);
 
     /* canonicalize emply messages */
     if (*messagep != NULL &&
@@ -349,7 +371,11 @@ do_editor (const char *dir, char **messagep, const char *repository,
        *messagep = NULL;
     }
 
-    if (pre_stbuf.st_mtime == post_stbuf.st_mtime || *messagep == NULL)
+    if (pre_stbuf.st_mtime == post_stbuf.st_mtime || 
+        *messagep == NULL ||
+        (*messagep)[0] == '\0' ||
+        strcmp (*messagep, "\n") == 0 ||
+        strcmp (*messagep, "\n\n") == 0)
     {
        for (;;)
        {
@@ -361,9 +387,11 @@ do_editor (const char *dir, char **messagep, const char *repository,
            if (line_length < 0)
            {
                error (0, errno, "cannot read from stdin");
-               if (unlink_file (fname) < 0)
+               if (unlink_file (LogMsgFile) < 0)
                    error (0, errno,
-                          "warning: cannot remove temp file %s", fname);
+                          "warning: cannot remove temp file %s", LogMsgFile);
+               free (LogMsgFile);
+               LogMsgFile = NULL;
                error (1, 0, "aborting");
            }
            else if (line_length == 0
@@ -371,8 +399,10 @@ do_editor (const char *dir, char **messagep, const char *repository,
                break;
            if (*line == 'a' || *line == 'A')
                {
-                   if (unlink_file (fname) < 0)
-                       error (0, errno, "warning: cannot remove temp file %s", fname);
+                   if (unlink_file (LogMsgFile) < 0)
+                       error (0, errno, "warning: cannot remove temp file %s", LogMsgFile);
+                   free (LogMsgFile);
+                   LogMsgFile = NULL;
                    error (1, 0, "aborted by user");
                }
            if (*line == 'e' || *line == 'E')
@@ -387,15 +417,14 @@ do_editor (const char *dir, char **messagep, const char *repository,
     }
     if (line)
        free (line);
-    if (unlink_file (fname) < 0)
-       error (0, errno, "warning: cannot remove temp file %s", fname);
-    free (fname);
+    finish = 1;
+    goto again;
 }
 
 /* Runs the user-defined verification script as part of the commit or import 
    process.  This verification is meant to be run whether or not the user 
    included the -m attribute.  unlike the do_editor function, this is 
-   independant of the running of an editor for getting a message.
+   independent of the running of an editor for getting a message.
  */
 void
 do_verify (char **messagep, const char *repository, List *changes)
@@ -785,6 +814,7 @@ logfile_write (const char *repository, const char *filter, const char *message,
        `%s' is left as an exercise for the reader. */
 
     /* %c = cvs_cmd_name
+     * %I = commit ID
      * %p = shortrepos
      * %r = repository
      * %{sVv} = file name, old revision (precommit), new revision (postcommit)
@@ -800,6 +830,7 @@ logfile_write (const char *repository, const char *filter, const char *message,
 #endif /* SUPPORT_OLD_INFO_FMT_STRINGS */
                              filter,
                              "c", "s", cvs_cmd_name,
+                             "I", "s", global_session_id,
 #ifdef SERVER_SUPPORT
                              "R", "s", referrer ? referrer->original : "NONE",
 #endif /* SERVER_SUPPORT */
@@ -922,6 +953,7 @@ verifymsg_proc (const char *repository, const char *script, void *closure)
 #endif /* SUPPORT_OLD_INFO_FMT_STRINGS */
                                        script,
                                       "c", "s", cvs_cmd_name,
+                                      "I", "s", global_session_id,
 #ifdef SERVER_SUPPORT
                                       "R", "s", referrer
                                       ? referrer->original : "NONE",
@@ -975,3 +1007,20 @@ verifymsg_proc (const char *repository, const char *script, void *closure)
     return abs (run_exec (RUN_TTY, RUN_TTY, RUN_TTY,
                          RUN_NORMAL | RUN_SIGIGNORE));
 }
+
+void
+logmsg_cleanup (int err)
+{
+    if (!use_editor || LogMsgFile == NULL)
+       return;
+
+    if (err == 0)
+    {
+       if (unlink_file (LogMsgFile) < 0)
+           error (0, errno, "warning: cannot remove temp file %s", LogMsgFile);
+    }
+    else
+       error (0, 0, "your log message was saved in %s", LogMsgFile);
+    free (LogMsgFile);
+    LogMsgFile = NULL;
+}