From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21762 invoked from network); 2 Dec 2002 23:08:39 -0000 Received: from unknown (HELO monty-python.gnu.org) (199.232.76.173) by sources.redhat.com with SMTP; 2 Dec 2002 23:08:39 -0000 Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.10.13) id 18IzfY-00072s-00; Mon, 02 Dec 2002 18:08:04 -0500 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10.13) id 18Izeg-0006f2-00 for help-gnats@gnu.org; Mon, 02 Dec 2002 18:07:10 -0500 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10.13) id 18Ized-0006Va-00 for help-gnats@gnu.org; Mon, 02 Dec 2002 18:07:09 -0500 Received: from natint.juniper.net ([207.17.136.129] helo=merlot.juniper.net) by monty-python.gnu.org with esmtp (Exim 4.10.13) id 18Izec-0006VB-00 for help-gnats@gnu.org; Mon, 02 Dec 2002 18:07:06 -0500 Received: from juniper.net (snowy.juniper.net [172.17.13.16]) by merlot.juniper.net (8.11.3/8.11.3) with ESMTP id gB2N75S90704; Mon, 2 Dec 2002 15:07:05 -0800 (PST) (envelope-from hatzis@juniper.net) Message-ID: <3DEBE798.4030702@juniper.net> From: Mel Hatzis Reply-To: hatzis@juniper.net User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20021003 X-Accept-Language: en-us, en MIME-Version: 1.0 To: help-gnats@gnu.org Subject: patch to display new PR number for new submissions References: <200212021037.gB2Ab8D04083@localhost.localdomain> Content-Type: multipart/mixed; boundary="------------020800090905040800060905" Sender: help-gnats-admin@gnu.org Errors-To: help-gnats-admin@gnu.org X-BeenThere: help-gnats@gnu.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: General discussion about GNU GNATS List-Archive: Date: Tue, 03 Dec 2002 19:52:00 -0000 X-SW-Source: 2002-q4/txt/msg00067.txt.bz2 This is a multi-part message in MIME format. --------------020800090905040800060905 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 577 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. --------------020800090905040800060905 Content-Type: text/plain; name="display_newprnum.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="display_newprnum.patch" Content-length: 17275 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} | --lock=@var{username} ] [ -u | --unlockdb ] [ -L | --lockdb ] [ -U | --unlockdb ] [ -c | --check ] - [ -C | --check-initial ] [ -s | --submit ] + [ -C | --check-initial ] [ -s | --submit [ --show-prnum ] ] [ -a @var{field} | --append field=@var{field} ] [ -r @var{field} | --replace=@var{field} ] [ --delete-pr ] [ -R @var{reason} | --reason=@var{reason} ] @@ -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. + +@item --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. --------------020800090905040800060905-- _______________________________________________ Help-gnats mailing list Help-gnats@gnu.org http://mail.gnu.org/mailman/listinfo/help-gnats