version 1.5, 2005/10/08 11:50:59 |
version 1.6, 2005/10/08 14:09:18 |
|
|
extern char *__progname; |
extern char *__progname; |
|
|
static char * checkin_diff_file(RCSFILE *, RCSNUM *, const char *); |
static char * checkin_diff_file(RCSFILE *, RCSNUM *, const char *); |
|
static char * checkin_getlogmsg(char *, char *, RCSNUM *); |
|
|
void |
void |
checkin_usage(void) |
checkin_usage(void) |
|
|
|
|
-r | -r[rev]: check in revision rev |
-r | -r[rev]: check in revision rev |
-l[rev]: ", but do co -l |
-l[rev]: ", but do co -l |
-u[rev]: ", bt do co -u |
-u[rev]: ", but do co -u |
-f[rev]: force a deposit (check in?) |
-f[rev]: force a deposit (check in?) |
-k[rev]: ? |
-k[rev]: ? |
-q[rev]: quiet mode |
-q[rev]: quiet mode |
-i[rev]: initial check in, errors if RCS file already exists. |
-i[rev]: initial check in, errors if RCS file already exists. |
-j[rev]: just checkin and do not initialize, errors if RCS file already exists. |
-j[rev]: just checkin and do not initialize, errors if RCS file already exists. |
-I[rev]: user is prompted even if stdin is not a tty |
-I[rev]: user is prompted even if stdin is not a tty |
-d[date]: uses date for checkin dat and time. |
-d[date]: uses date for checkin date and time. |
-M[rev]: set modification time on any new working file to be that of the retrieved version. |
-M[rev]: set modification time on any new working file to be that of the retrieved version. |
-mmsg: msg is the log message, don't start editor. log messages with #are comments. |
-mmsg: msg is the log message, don't start editor. log messages with #are comments. |
*/ |
*/ |
int |
int |
checkin_main(int argc, char **argv) |
checkin_main(int argc, char **argv) |
{ |
{ |
int i, ch, dflag, flags, lkmode; |
int i, ch, dflag, flags, lkmode, interactive; |
mode_t fmode; |
mode_t fmode; |
RCSFILE *file; |
RCSFILE *file; |
RCSNUM *frev; |
RCSNUM *frev; |
|
|
flags = RCS_RDWR; |
flags = RCS_RDWR; |
file = NULL; |
file = NULL; |
rcs_msg = rev = NULL; |
rcs_msg = rev = NULL; |
fmode = dflag = 0; |
fmode = dflag = verbose = 0; |
|
interactive = 1; |
|
|
while ((ch = getopt(argc, argv, "j:l:M:N:qu:d:r::m:k:V")) != -1) { |
while ((ch = getopt(argc, argv, "j:l:M:N:qu:d:r::m:k:V")) != -1) { |
switch (ch) { |
switch (ch) { |
|
|
exit(0); |
exit(0); |
case 'm': |
case 'm': |
rcs_msg = optarg; |
rcs_msg = optarg; |
|
interactive = 0; |
break; |
break; |
case 'q': |
case 'q': |
verbose = 0; |
verbose = 0; |
|
|
exit(1); |
exit(1); |
} |
} |
|
|
if (rcs_msg == NULL) { |
|
cvs_log(LP_ERR, "no log message"); |
|
exit(1); |
|
} |
|
|
|
if (dflag) { |
if (dflag) { |
/* XXX */ |
/* XXX */ |
} |
} |
|
|
if (rev == NULL) |
|
frev = file->rf_head; |
|
|
|
/* |
/* |
* Load file contents |
* Load file contents |
|
|
exit(1); |
exit(1); |
} |
} |
|
|
|
if (rev == NULL) |
|
frev = file->rf_head; |
|
/* |
|
* If no log message specified, get it interactively. |
|
*/ |
|
if (rcs_msg == NULL) |
|
rcs_msg = checkin_getlogmsg(fpath, argv[i], frev); |
|
|
if (cvs_buf_putc(bp, '\0') < 0) |
if (cvs_buf_putc(bp, '\0') < 0) |
exit(1); |
exit(1); |
|
|
|
|
cvs_log(LP_ERR, "failed to set new rd_text for head rev"); |
cvs_log(LP_ERR, "failed to set new rd_text for head rev"); |
exit (1); |
exit (1); |
} |
} |
|
|
/* |
/* |
* Now add our new revision |
* Now add our new revision |
*/ |
*/ |
|
|
* Delete the working file - we do not support -u/-l just yet |
* Delete the working file - we do not support -u/-l just yet |
*/ |
*/ |
(void)unlink(argv[i]); |
(void)unlink(argv[i]); |
|
if (interactive) { |
|
free(rcs_msg); |
|
rcs_msg = NULL; |
|
} |
} |
} |
|
|
return (0); |
return (0); |
|
|
char rbuf[64], *deltatext; |
char rbuf[64], *deltatext; |
|
|
rcsnum_tostr(rev, rbuf, sizeof(rbuf)); |
rcsnum_tostr(rev, rbuf, sizeof(rbuf)); |
if (verbose) |
|
printf("retrieving revision %s\n", rbuf); |
|
|
|
if ((b1 = cvs_buf_load(filename, BUF_AUTOEXT)) == NULL) { |
if ((b1 = cvs_buf_load(filename, BUF_AUTOEXT)) == NULL) { |
cvs_log(LP_ERR, "failed to load file: '%s'", filename); |
cvs_log(LP_ERR, "failed to load file: '%s'", filename); |
|
|
deltatext = (char *)cvs_buf_release(b3); |
deltatext = (char *)cvs_buf_release(b3); |
|
|
return (deltatext); |
return (deltatext); |
|
} |
|
|
|
/* |
|
* Get log message from user interactively. |
|
*/ |
|
static char * |
|
checkin_getlogmsg(char *rcsfile, char *workingfile, RCSNUM *rev) |
|
{ |
|
char *rcs_msg, buf[128], nrev[16], prev[16]; |
|
BUF *logbuf; |
|
RCSNUM *tmprev; |
|
|
|
tmprev = rcsnum_alloc(); |
|
rcsnum_cpy(rev, tmprev, 16); |
|
rcsnum_tostr(rev, prev, sizeof(prev)); |
|
rcsnum_tostr(rcsnum_inc(tmprev), nrev, sizeof(nrev)); |
|
rcsnum_free(tmprev); |
|
|
|
if ((logbuf = cvs_buf_alloc(64, BUF_AUTOEXT)) == NULL) { |
|
cvs_log(LP_ERR, |
|
"failed to allocate log buffer"); |
|
return (NULL); |
|
} |
|
cvs_printf("%s <-- %s\n", rcsfile, workingfile); |
|
cvs_printf("new revision: %s; previous revision: %s\n", |
|
nrev, prev); |
|
cvs_printf("enter log message, terminated with single " |
|
"'.' or end of file:\n"); |
|
cvs_printf(">> "); |
|
for (;;) { |
|
fgets(buf, (int)sizeof(buf), stdin); |
|
if (feof(stdin) || ferror(stdin) |
|
|| buf[0] == '.') |
|
break; |
|
cvs_buf_append(logbuf, buf, strlen(buf)); |
|
cvs_printf(">> "); |
|
} |
|
rcs_msg = (char *)cvs_buf_release(logbuf); |
|
return (rcs_msg); |
} |
} |