help-gnats
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

patch to display new PR number for new submissions


From: Mel Hatzis
Subject: patch to display new PR number for new submissions
Date: Mon, 02 Dec 2002 15:07:04 -0800
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20021003

Now that 4.0 beta2 is out the door please review
(and hopefully accept) the following patch which
allows send-pr and "pr-edit --submit" to display
newly created PR numbers.

The patch basically provides an optional '--show-prnum'
sub-option to 'pr-edit --submit' which tells
pr-edit to display the PR number associated with
the submitted PR.

This has proven really useful in our environment,
especially for reporting associated with automated
PR creation. We've been running with this patch
for several months so it's fairly well tested.

--
Mel Hatzis
Juniper Networks, Inc.
Index: gnats/client.c
===================================================================
RCS file: /cvsroot/gnats/gnats/gnats/client.c,v
retrieving revision 1.46
diff -b -u -p -r1.46 client.c
--- gnats/client.c      25 Nov 2002 13:58:33 -0000      1.46
+++ gnats/client.c      2 Dec 2002 22:20:43 -0000
@@ -270,11 +270,12 @@ read_server (FILE *outfp)
 /* Return the code of the response from the server, or 0 if there wasn't
    any. */
 int
-get_reply (FILE *outfp)
+get_reply (FILE *outfp, char **buf, int *bufsz)
 {
   Reply *r;
   int done = 0;
   int retval = 0;
+  int buf_len, txt_len;
 
   /* Make sure anything we've written has gone to them.  */
   if (fflush (serv_write) == EOF || ferror (serv_write))
@@ -299,6 +300,19 @@ get_reply (FILE *outfp)
                       program_name, r->state, r->text);
            }
 
+         if (buf != NULL && *buf != NULL && bufsz != NULL && *bufsz > 0)
+           {
+              (*buf)[*bufsz-1] = '\0'; /* ensure NUL termination */
+              buf_len = strlen (*buf);
+              txt_len = strlen (r->text);
+              if ((buf_len + txt_len) >= *bufsz)
+                {
+                  *bufsz += txt_len * 2;
+                  *buf = xrealloc (*buf, *bufsz);
+                }
+              strncat (*buf, r->text, txt_len);
+           }
+
          switch (r->state)
            {
            case CODE_GREETING:
@@ -568,7 +582,7 @@ clientConnect (ErrorDesc *err, const cha
   serv_write = file;
 
   /* Get the hello.  */
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 
 #ifdef HAVE_KERBEROS
   {
@@ -699,7 +713,7 @@ clientConnect (ErrorDesc *err, const cha
        response if authorization succeeds, or an error if it fails.
        (Not everyone listed in the Kerberos database is necessarily
        permitted to retrieve information from GNATS.)  */
-    get_reply (stdout);
+    get_reply (stdout, NULL, NULL);
 
   krb_exit:
     /* Zero out the Kerberos scratch area, since it includes
@@ -755,7 +769,7 @@ client_chdb (const char *newRoot)
       fprintf (stderr, "%s: writing `CHDB %s'\n", program_name, newRoot);
     }
   fprintf (serv_write, "CHDB %s\r\n", newRoot);
-  get_reply (stdout);                  /* this will exit on error */
+  get_reply (stdout, NULL, NULL);      /* this will exit on error */
 }
 
 static void
@@ -768,7 +782,7 @@ client_user (const char *user, const cha
               user, passwd);
     }
   fprintf (serv_write, "USER %s %s\r\n", user, passwd);
-  get_reply(stdout);                   /* this will exit on error */
+  get_reply(stdout, NULL, NULL);       /* this will exit on error */
 }
 
 /* Scan the environment and the global database configuration file for the 
@@ -1095,7 +1109,7 @@ sendRemoteListQuery (ListTypes whichList
       fprintf (serv_write, "LIST %s\r\n", listName);
       if (outfile != NULL)
        {
-         get_reply (outfile);
+         get_reply (outfile, NULL, NULL);
        }
     }
 }
@@ -1108,7 +1122,7 @@ sendQueryFormat (const char *name)
       fprintf (stderr, "%s: writing `QFMT %s'\n", program_name, name);
     }
   fprintf (serv_write, "QFMT %s\r\n", name);
-  get_reply (NULL);
+  get_reply (NULL, NULL, NULL);
 }
 
 void
@@ -1127,7 +1141,7 @@ sendRemoteQuery (const char *queryString
                   queryString);
        }
       fprintf (serv_write, "EXPR %s\r\n", queryString);
-      get_reply (NULL);
+      get_reply (NULL, NULL, NULL);
     }
 
   sendQueryFormat (query_format_name);
@@ -1159,7 +1173,7 @@ sendRemoteQuery (const char *queryString
 
   if (outfile != NULL)
     {
-      get_reply (outfile);
+      get_reply (outfile, NULL, NULL);
     }
 }
 
@@ -1172,7 +1186,7 @@ clientGetAdmField (FILE *outfile, const 
       admSubfield = "";
     }
   fprintf (serv_write, "ADMV %s %s %s\r\n", admField, admKey, admSubfield);
-  get_reply (outfile);
+  get_reply (outfile, NULL, NULL);
 }
 
 /* Read PR PRNUM from the GNATS server, and return it.  */
@@ -1183,12 +1197,12 @@ clientReadPR (const char *prNum)
 
   prBeingRead = allocPR (NULL);
   fprintf (serv_write, "RSET\r\n");
-  get_reply (NULL);
+  get_reply (NULL, NULL, NULL);
   fprintf (serv_write, "QFMT full\r\n");
-  get_reply (NULL);
+  get_reply (NULL, NULL, NULL);
   fprintf (serv_write, "QUER %s\r\n", prNum);
   initReadPR (prBeingRead);
-  get_reply (NULL);
+  get_reply (NULL, NULL, NULL);
   res = prBeingRead;
   prBeingRead = NULL;
   return res;
@@ -1201,10 +1215,10 @@ clientGetPRList (const char *expr)
   StringList *res = NULL;
 
   fprintf (serv_write, "RSET\r\n");
-  get_reply (NULL);
+  get_reply (NULL, NULL, NULL);
   sendRemoteQuery (expr, NULL, "Number", NULL);
   prList = &res;
-  get_reply (NULL);
+  get_reply (NULL, NULL, NULL);
   return res;
 }
 
@@ -1212,7 +1226,53 @@ void
 netSetEditEmailAddr (const char *addr)
 {
   fprintf (serv_write, "EDITADDR %s\r\n", addr);
-  get_reply (NULL);
+  get_reply (NULL, NULL, NULL);
+}
+
+static int
+netSendSubmitCmd (FILE *file)
+{
+  int new_pr_num = 0;
+  int msgsz = 128; /* size of message from gnatsd...contains the new pr num */
+  char *line, *reply_text, *p1, *p2;
+  const char *cmd = "SUBM";
+
+  if (debug)
+    {
+      fprintf (stderr, "%s: writing `%s'\n", program_name, cmd);
+    }
+  fprintf (serv_write, "%s\r\n", cmd);
+  get_reply (stdout, NULL, NULL);
+  
+  while ((line = read_line (file, NULL)) != NULL)
+    {
+      write_multitext (serv_write, line, "\r\n");
+      free (line);
+    }
+  fprintf (serv_write, ".\r\n");
+
+  /* read the new PR number from the server response... */
+  reply_text = xmalloc (msgsz);
+  memset (reply_text, '\0', msgsz);
+
+  /* if get_reply finds errors it writes messages and doesn't return */
+  get_reply (stdout, &reply_text, &msgsz);
+
+  if (reply_text != NULL)
+    {
+      /* strip out the new PR number from the server response */
+      p1 = strstr(reply_text, "PR ");
+      p2 = strstr(reply_text, " added");
+      if (p1 != NULL && p2 != NULL)
+        {
+          p2 = '\0';
+          new_pr_num = atoi(p1+3);
+        }
+
+      free(reply_text);
+    }
+
+  return new_pr_num;
 }
 
 static void
@@ -1224,7 +1284,7 @@ netSendPRCmd (const char *cmd, FILE *fil
       fprintf (stderr, "%s: writing `%s'\n", program_name, cmd);
     }
   fprintf (serv_write, "%s\r\n", cmd);
-  get_reply (stdout); /* XXX */
+  get_reply (stdout, NULL, NULL); /* XXX */
   
   while ((line = read_line (file, NULL)) != NULL)
     {
@@ -1233,7 +1293,7 @@ netSendPRCmd (const char *cmd, FILE *fil
     }
   fprintf (serv_write, ".\r\n");
   /* if get_reply finds errors it writes messages and doesn't return */
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 }
 
 void
@@ -1262,7 +1322,7 @@ netEditField (FILE *fp, const char *prnu
   fprintf (serv_write, "%s %s %s\r\n", cmd, prnum, fieldname);
 
   do {
-    reply = get_reply (stdout);
+    reply = get_reply (stdout, NULL, NULL);
     switch (reply)
       {
         case CODE_SEND_TEXT:
@@ -1297,10 +1357,10 @@ netEditField (FILE *fp, const char *prnu
   } while (reply != CODE_OK);
 }
 
-void
+int
 netSubmitNewPR (FILE *file)
 {
-  netSendPRCmd ("SUBM", file);
+  return netSendSubmitCmd (file);
 }
 
 void
@@ -1322,7 +1382,7 @@ netLockDB (void)
       fprintf (stderr, "%s: writing `LKDB'\n", program_name);
     }
   fprintf (serv_write, "LKDB\r\n");
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 }
 
 void
@@ -1333,7 +1393,7 @@ netUnlockDB (void)
       fprintf (stderr, "%s: writing `UNDB'\n", program_name);
     }
   fprintf (serv_write, "UNDB\r\n");
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 }
 
 void
@@ -1347,7 +1407,7 @@ netLockPR (const char *prNum, const char
     {
       fprintf (serv_write, "LOCK %s %s\r\n", prNum, username);
     }
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 }
 
 void
@@ -1358,7 +1418,7 @@ netUnlockPR (const char *prNum)
       fprintf (stderr, "%s: writing `UNLK %s'\n", program_name, prNum);
     }
   fprintf (serv_write, "UNLK %s\r\n", prNum);
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 }
 
 void
@@ -1370,33 +1430,33 @@ netDeletePR (const char *prNum, const ch
       fprintf (stderr, "%s: writing `DELETE %s'\n", program_name, prNum);
     }
   fprintf (serv_write, "DELETE %s\r\n", prNum);
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 }
 
 void
 netFieldFlags (const char *fieldname)
 {
   fprintf (serv_write, "FIELDFLAGS %s\r\n", fieldname);
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 }
 
 void
 netValidValues (const char *fieldname)
 {
   fprintf (serv_write, "FVLD %s\r\n", fieldname);
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 }
 
 void
 netFieldDescription (const char *fieldname)
 {
   fprintf (serv_write, "FDSC %s\r\n", fieldname);
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 }
 
 void
 netFieldType (const char *fieldname)
 {
   fprintf (serv_write, "FTYP %s\r\n", fieldname);
-  get_reply (stdout);
+  get_reply (stdout, NULL, NULL);
 }
Index: gnats/cmds.c
===================================================================
RCS file: /cvsroot/gnats/gnats/gnats/cmds.c,v
retrieving revision 1.70
diff -b -u -p -r1.70 cmds.c
--- gnats/cmds.c        14 Oct 2002 11:42:25 -0000      1.70
+++ gnats/cmds.c        2 Dec 2002 22:20:44 -0000
@@ -478,6 +478,7 @@ GNATS_subm (int ac, char **av ATTRIBUTE_
   char *tempfile;
   FILE *fp;
   ErrorDesc err;
+  int new_pr_num;
 
   if (ac != 0)
     {
@@ -507,9 +508,9 @@ GNATS_subm (int ac, char **av ATTRIBUTE_
     {
       if (daemon_lock_gnats (FALSE) == 0)
        {
-         if (submit_pr (currentDatabase, fp, &err) != 0)
+         if ((new_pr_num = submit_pr (currentDatabase, fp, &err)) != 0)
            {
-             printf ("%d PR added.\r\n", CODE_OK);
+             printf ("%d PR %d added.\r\n", CODE_OK, new_pr_num);
              fflush (stdout);
            }
          else
Index: gnats/file-pr.c
===================================================================
RCS file: /cvsroot/gnats/gnats/gnats/file-pr.c,v
retrieving revision 1.51
diff -b -u -p -r1.51 file-pr.c
--- gnats/file-pr.c     1 Nov 2002 11:37:51 -0000       1.51
+++ gnats/file-pr.c     2 Dec 2002 22:20:44 -0000
@@ -930,11 +930,13 @@ getBugNumber (const DatabaseInfo databas
   return bug_number;
 }
 
-/* Submit the PR whose contents are referred to by FP.  */
+/* Submit the PR whose contents are referred to by FP.
+ * Return the new PR number if it's a new PR, or return the PR number of
+ * the PR which was appended to if it's an existing PR. */
 int
 submit_pr (const DatabaseInfo database, FILE *fp, ErrorDesc *err)
 {
-  int result;
+  int result, retval;
   PR *pr = allocPR (database);
 
   result = (read_header (pr, fp) >= 0);
@@ -956,10 +958,8 @@ submit_pr (const DatabaseInfo database, 
            }
          else
            {
-             if (append_report (fp, pr, prID, err) != 0)
-               {
-                 result = 0;
-               }
+             retval = append_report (fp, pr, prID, err);
+             result = (retval == 0) ? atoi (prID) : 0;
              free_pr (pr);
            }
          free (prID);
@@ -967,10 +967,8 @@ submit_pr (const DatabaseInfo database, 
       else
        {
          read_pr (pr, fp, 0);
-         if (createNewPRFile (pr, createCategoryDirs (database), err) < 0)
-           {
-             result = 0;
-           }
+         retval = createNewPRFile (pr, createCategoryDirs (database), err);
+         result = (retval < 0) ? 0 : retval;
        }
     }
   else
Index: gnats/gnats.h
===================================================================
RCS file: /cvsroot/gnats/gnats/gnats/gnats.h,v
retrieving revision 1.52
diff -b -u -p -r1.52 gnats.h
--- gnats/gnats.h       31 Oct 2002 23:43:28 -0000      1.52
+++ gnats/gnats.h       2 Dec 2002 22:20:44 -0000
@@ -250,7 +250,7 @@ extern struct tm *get_response_time (con
                                     unsigned int responseTimeInDays);
 
 /* in client.c */
-extern int get_reply (FILE *);
+extern int get_reply (FILE *, char **buf, int *bufsz);
 extern void client_exit (void);
 extern void safe_exit (void);
 extern void client_chdb (const char *database);
@@ -292,7 +292,7 @@ extern void netEditField (FILE *fieldDat
                          const char *editUserEmailAddr, int appendToField,
                          char *reason);
 
-extern void netSubmitNewPR (FILE *file);
+extern int netSubmitNewPR (FILE *file);
 extern void netModifyPR (FILE *file, const char *prNum,
                         const char *editUserEmailAddr);
 extern void netLockDB (void);
Index: gnats/pr-edit.c
===================================================================
RCS file: /cvsroot/gnats/gnats/gnats/pr-edit.c,v
retrieving revision 1.37
diff -b -u -p -r1.37 pr-edit.c
--- gnats/pr-edit.c     1 Nov 2002 09:02:23 -0000       1.37
+++ gnats/pr-edit.c     2 Dec 2002 22:20:44 -0000
@@ -43,6 +43,7 @@ enum {
 } edit_options;
 
 #define DELETE_PR_OPT 256
+#define SHOW_PRNUM_OPT 257
 
 struct option long_options[] =
 {
@@ -61,6 +62,7 @@ struct option long_options[] =
   {"filename", 1, NULL, 'f'},
   {"version", 0, NULL, 'V'},
   {"delete-pr", 0, NULL, DELETE_PR_OPT},
+  {"show-prnum", 0, NULL, SHOW_PRNUM_OPT},
   {"help", 0, NULL, 'h'},
   {"user", 1, NULL, 'v'},
   {"passwd", 1, NULL, 'w'},
@@ -83,9 +85,10 @@ Modify database.\n\
   -L --lockdb              lock the whole database\n\
   -U --unlockdb            unlock the database\n\
   -c --check               check input for editting, don't change PR\n\
-  -C --check-initial       check input for submition, don't submit new PR\n\
+  -C --check-initial       check input for submission, don't submit new PR\n\
   -s --submit              submit new PR\n",
   "\
+     --show-prnum          display the newly created PR number (for 
--submit)\n\
   -a --append=FIELDNAME    append input to FIELDNAME\n\
   -r --replace=FIELDNAME   replace FIELDNAME with input\n\
      --delete-pr           delete PR from the database completely\n\
@@ -145,9 +148,10 @@ read_file (FILE *inp)
 static void
 handleNetworkEdit (int edit_options, FILE *fpin, char *prnum, char *username,
                   char *editEmailAddr, char *processid, char *fieldname,
-                  char *reason)
+                  char *reason, int show_prnum)
 {
   int exitcode = 0;
+  int new_pr_num = 0;
 
   switch (edit_options)
     {
@@ -165,7 +169,11 @@ handleNetworkEdit (int edit_options, FIL
       break;
     case SUBMIT:
       {
-       netSubmitNewPR (fpin);
+       new_pr_num = netSubmitNewPR (fpin);
+        if (show_prnum && new_pr_num)
+          {
+            fprintf(stdout, "submitted PR %d\n", new_pr_num);
+          }
        break;
       }
     case CHECK:
@@ -216,6 +224,7 @@ main (int argc, char **argv)
   int networkmode = 0;
   char *editUserEmailAddr = NULL;
   char *reason = NULL;
+  int show_prnum = 0;
 
   program_name = basename (argv[0]);
   edit_options = MODIFY;
@@ -233,6 +242,10 @@ main (int argc, char **argv)
          debug = 1;
          break;
 
+       case SHOW_PRNUM_OPT:
+         show_prnum = 1;
+         break;
+
        case 'f':
          fp = fopen (optarg, "r");
          /* If they gave a bogus argument, then exit right away; we don't
@@ -398,7 +411,7 @@ main (int argc, char **argv)
          exit (3);
        }
       handleNetworkEdit (edit_options, fp, prnum, username, editUserEmailAddr,
-                        processid, fieldname, reason);
+                        processid, fieldname, reason, show_prnum);
     }
 
   database = init_gnats (program_name, nameOfDatabase, &err);
@@ -467,6 +480,10 @@ main (int argc, char **argv)
        case SUBMIT:
          {
            result = submit_pr (database, fp, &err);
+            if (show_prnum && result)
+              {
+                fprintf (stdout, "submitted PR %d\n", result);
+              }
            break;
          }
        case APPEND:
Index: send-pr/send-pr.sh
===================================================================
RCS file: /cvsroot/gnats/gnats/send-pr/send-pr.sh,v
retrieving revision 1.23
diff -b -u -p -r1.23 send-pr.sh
--- send-pr/send-pr.sh  29 Oct 2002 09:58:15 -0000      1.23
+++ send-pr/send-pr.sh  2 Dec 2002 22:20:44 -0000
@@ -536,8 +536,9 @@ do
     echo "$COMMAND: problem report mailed"
     xs=0; exit
   else
-    if $LIBEXECDIR/pr-edit --submit < $REF; then
-      echo "$COMMAND: problem report filed"
+    if cmd_msg=`$LIBEXECDIR/pr-edit --submit --show-prnum < $REF` ; then
+      pr_num=`expr //"$cmd_msg" : '.* \(.*\)'` # strip out the PR number
+      echo "$COMMAND: problem report $pr_num filed"
       xs=0; exit
     else
       echo "$COMMAND: the problem report is not sent."
Index: p-admin.texi
===================================================================
RCS file: /cvsroot/gnats/gnats/doc/p-admin.texi,v
retrieving revision 1.34
diff -b -u -p -r1.34 p-admin.texi
--- p-admin.texi        27 Nov 2002 22:04:38 -0000      1.34
+++ p-admin.texi        2 Dec 2002 23:04:12 -0000
@@ -2083,7 +2083,7 @@ The usage for @code{pr-edit} is:
 @smallexample
 pr-edit   [ -l @var{username} | address@hidden ] [ -u | --unlockdb ]
           [ -L | --lockdb ] [ -U | --unlockdb ] [ -c | --check ]
-          [ -C | --check-initial ] [ -s | --submit ]
+          [ -C | --check-initial ] [ -s | --submit [ --show-prnum ] ]
           [ -a @var{field} | --append address@hidden ]
           [ -r @var{field} | address@hidden ] [ --delete-pr ]
           [ -R @var{reason} | address@hidden ]
@@ -2150,6 +2150,10 @@ for content; if the PR is valid as an in
 the database. A zero exit code is returned if the submission was
 successful.  Otherwise, the reason(s) for the PR being rejected are
 printed to stdout, and a non-zero exit code is returned.
+
address@hidden --show-prnum
+This option is used with the @code{--submit} option to display the PR
+number associated with the submitted PR.
 @end table

 @noindent The following options require a PR number to be given.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]