version 1.48, 2005/12/19 18:24:12 |
version 1.49, 2005/12/23 00:59:56 |
|
|
#include "rcs.h" |
#include "rcs.h" |
#include "rcsprog.h" |
#include "rcsprog.h" |
|
|
#define CO_OPTSTRING "f::k:l::M::p::q::r::s:Tu::Vw::x:" |
#define CO_OPTSTRING "d:f::k:l::M::p::q::r::s:Tu::Vw::x:" |
|
|
static void checkout_err_nobranch(RCSFILE *, const char *, const char *, |
static void checkout_err_nobranch(RCSFILE *, const char *, const char *, |
const char *, int); |
const char *, int); |
|
|
RCSNUM *frev, *rev; |
RCSNUM *frev, *rev; |
RCSFILE *file; |
RCSFILE *file; |
char fpath[MAXPATHLEN]; |
char fpath[MAXPATHLEN]; |
char *author, *username; |
char *author, *username, *date; |
const char *state; |
const char *state; |
time_t rcs_mtime = -1; |
time_t rcs_mtime = -1; |
|
|
|
|
frev = NULL; |
frev = NULL; |
state = NULL; |
state = NULL; |
author = NULL; |
author = NULL; |
|
date = NULL; |
|
|
while ((ch = rcs_getopt(argc, argv, CO_OPTSTRING)) != -1) { |
while ((ch = rcs_getopt(argc, argv, CO_OPTSTRING)) != -1) { |
switch (ch) { |
switch (ch) { |
|
case 'd': |
|
date = xstrdup(rcs_optarg); |
|
break; |
case 'f': |
case 'f': |
rcs_set_rev(rcs_optarg, &rev); |
rcs_set_rev(rcs_optarg, &rev); |
flags |= FORCE; |
flags |= FORCE; |
|
|
frev = rev; |
frev = rev; |
|
|
if (checkout_rev(file, frev, argv[i], flags, |
if (checkout_rev(file, frev, argv[i], flags, |
username, author, state) < 0) { |
username, author, state, date) < 0) { |
rcs_close(file); |
rcs_close(file); |
continue; |
continue; |
} |
} |
|
|
* Checkout revision <rev> from RCSFILE <file>, writing it to the path <dst> |
* Checkout revision <rev> from RCSFILE <file>, writing it to the path <dst> |
* Currenly recognised <flags> are CO_LOCK, CO_UNLOCK and CO_REVDATE. |
* Currenly recognised <flags> are CO_LOCK, CO_UNLOCK and CO_REVDATE. |
* |
* |
* Looks up revision based upon <lockname>, <author>, <state> |
* Looks up revision based upon <lockname>, <author>, <state> and <date> |
* |
* |
* Returns 0 on success, -1 on failure. |
* Returns 0 on success, -1 on failure. |
*/ |
*/ |
int |
int |
checkout_rev(RCSFILE *file, RCSNUM *frev, const char *dst, int flags, |
checkout_rev(RCSFILE *file, RCSNUM *frev, const char *dst, int flags, |
const char *lockname, const char *author, const char *state) |
const char *lockname, const char *author, const char *state, |
|
const char *date) |
{ |
{ |
BUF *bp; |
BUF *bp; |
int lcount; |
int lcount; |
|
|
struct stat st; |
struct stat st; |
struct rcs_delta *rdp; |
struct rcs_delta *rdp; |
struct rcs_lock *lkp; |
struct rcs_lock *lkp; |
char *content, msg[128]; |
char *content, msg[128], *fdate; |
|
time_t rcsdate, givendate; |
|
|
|
rcsdate = givendate = -1; |
|
if (date != NULL) |
|
givendate = cvs_date_parse(date); |
|
|
/* Check out the latest revision if <frev> is greater than HEAD */ |
/* Check out the latest revision if <frev> is greater than HEAD */ |
if (rcsnum_cmp(frev, file->rf_head, 0) == -1) |
if (rcsnum_cmp(frev, file->rf_head, 0) == -1) |
frev = file->rf_head; |
frev = file->rf_head; |
|
|
} |
} |
|
|
TAILQ_FOREACH(rdp, &file->rf_delta, rd_list) { |
TAILQ_FOREACH(rdp, &file->rf_delta, rd_list) { |
|
if (date != NULL) { |
|
fdate = asctime(&rdp->rd_date); |
|
rcsdate = cvs_date_parse(fdate); |
|
if (givendate <= rcsdate) |
|
continue; |
|
} |
|
|
if ((author != NULL) && |
if ((author != NULL) && |
(strcmp(rdp->rd_author, author))) |
(strcmp(rdp->rd_author, author))) |
continue; |
continue; |
|
|
if ((state != NULL) && |
if ((state != NULL) && |
(strcmp(rdp->rd_state, state))) |
(strcmp(rdp->rd_state, state))) |
continue; |
continue; |
|
|
} |
} |
|
|
if (rdp == NULL) { |
if (rdp == NULL) { |
checkout_err_nobranch(file, author, NULL, state, flags); |
checkout_err_nobranch(file, author, date, state, flags); |
return (-1); |
return (-1); |
} |
} |
|
|