[Top][All Lists]
[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.