version 1.150, 2008/06/11 21:24:50 |
version 1.151, 2008/06/12 07:16:14 |
|
|
static int nflag = 0; |
static int nflag = 0; |
|
|
char *checkout_target_dir = NULL; |
char *checkout_target_dir = NULL; |
|
|
time_t cvs_specified_date = -1; |
time_t cvs_specified_date = -1; |
|
int disable_fast_checkout = 0; |
|
|
struct cvs_cmd cvs_cmd_checkout = { |
struct cvs_cmd cvs_cmd_checkout = { |
CVS_OP_CHECKOUT, CVS_USE_WDIR, "checkout", |
CVS_OP_CHECKOUT, CVS_USE_WDIR, "checkout", |
|
|
fatal("-d specified two or more times"); |
fatal("-d specified two or more times"); |
dflag = optarg; |
dflag = optarg; |
checkout_target_dir = dflag; |
checkout_target_dir = dflag; |
|
|
|
if (cvs_server_active == 1) |
|
disable_fast_checkout = 1; |
break; |
break; |
case 'j': |
case 'j': |
if (cvs_join_rev1 == NULL) |
if (cvs_join_rev1 == NULL) |
|
|
if (argc == 0) |
if (argc == 0) |
fatal("%s", cvs_cmd_checkout.cmd_synopsis); |
fatal("%s", cvs_cmd_checkout.cmd_synopsis); |
|
|
|
if (cvs_server_active == 1 && disable_fast_checkout != 1) { |
|
cmdp->cmd_flags &= ~CVS_USE_WDIR; |
|
cvs_noexec = 1; |
|
} |
|
|
checkout_check_repository(argc, argv); |
checkout_check_repository(argc, argv); |
|
|
|
if (cvs_server_active == 1 && disable_fast_checkout != 1) |
|
cvs_noexec = 0; |
|
|
return (0); |
return (0); |
} |
} |
|
|
|
|
cr.leavedir = NULL; |
cr.leavedir = NULL; |
} else { |
} else { |
cr.enterdir = cvs_update_enterdir; |
cr.enterdir = cvs_update_enterdir; |
cr.leavedir = cvs_update_leavedir; |
if (cvs_server_active == 1) { |
|
if (disable_fast_checkout != 1) |
|
cr.leavedir = NULL; |
|
else |
|
cr.leavedir = cvs_update_leavedir; |
|
} else { |
|
cr.leavedir = prune_dirs ? cvs_update_leavedir : NULL; |
|
} |
} |
} |
cr.fileproc = cvs_update_local; |
cr.fileproc = cvs_update_local; |
cr.flags = flags; |
cr.flags = flags; |
|
|
void |
void |
cvs_checkout_file(struct cvs_file *cf, RCSNUM *rnum, char *tag, int co_flags) |
cvs_checkout_file(struct cvs_file *cf, RCSNUM *rnum, char *tag, int co_flags) |
{ |
{ |
|
BUF *bp; |
mode_t mode; |
mode_t mode; |
int cf_kflag, exists, fd; |
int cf_kflag, exists, fd; |
time_t rcstime; |
time_t rcstime; |
CVSENTRIES *ent; |
CVSENTRIES *ent; |
struct timeval tv[2]; |
struct timeval tv[2]; |
struct tm datetm; |
struct tm datetm; |
char *tosend; |
char *entry, *tosend; |
char template[MAXPATHLEN], *entry; |
|
char kbuf[8], sticky[CVS_REV_BUFSZ], rev[CVS_REV_BUFSZ]; |
char kbuf[8], sticky[CVS_REV_BUFSZ], rev[CVS_REV_BUFSZ]; |
char timebuf[CVS_TIME_BUFSZ], tbuf[CVS_TIME_BUFSZ]; |
char timebuf[CVS_TIME_BUFSZ], tbuf[CVS_TIME_BUFSZ]; |
|
|
|
|
xfree(entry); |
xfree(entry); |
|
|
if (!(co_flags & CO_MERGE)) { |
if (!(co_flags & CO_MERGE)) { |
(void)xsnprintf(template, MAXPATHLEN, |
|
"%s/checkout.XXXXXXXXXX", cvs_tmpdir); |
|
|
|
fd = rcs_rev_write_stmp(cf->file_rcs, rnum, |
|
template, 0); |
|
|
|
mode = cf->file_rcs->rf_mode; |
mode = cf->file_rcs->rf_mode; |
mode |= S_IWUSR; |
mode |= S_IWUSR; |
|
bp = rcs_rev_getbuf(cf->file_rcs, rnum, 0); |
if (fchmod(fd, mode) == -1) { |
cvs_remote_send_file_buf(cf->file_path, |
cvs_log(LP_ERR, |
bp, mode); |
"failed to set mode for %s", |
} else { |
cf->file_path); |
cvs_remote_send_file(tosend, fd); |
} |
|
|
|
tosend = template; |
|
} |
|
|
|
cvs_remote_send_file(tosend, fd); |
|
|
|
if (!(co_flags & CO_MERGE)) { |
|
close(fd); |
|
(void)unlink(template); |
|
cvs_worklist_run(&temp_files, |
|
cvs_worklist_unlink); |
|
} |
} |
} |
} |
} |
} |