version 1.20, 2005/04/13 16:37:50 |
version 1.21, 2005/04/13 19:44:42 |
|
|
#define CVS_GETLOG_REVEND \ |
#define CVS_GETLOG_REVEND \ |
"=============================================================================" |
"=============================================================================" |
|
|
static int cvs_getlog_file (CVSFILE *, void *); |
static int cvs_getlog_remote (CVSFILE *, void *); |
static int cvs_getlog_local (CVSFILE *, void *); |
static int cvs_getlog_local (CVSFILE *, void *); |
|
|
int cvs_getlog_options(char *, int, char **, int *); |
int cvs_getlog_options(char *, int, char **, int *); |
|
|
struct cvs_cmd_info cvs_getlog = { |
struct cvs_cmd_info cvs_getlog = { |
cvs_getlog_options, |
cvs_getlog_options, |
NULL, |
NULL, |
cvs_getlog_file, |
cvs_getlog_remote, |
NULL, NULL, |
NULL, NULL, |
CF_RECURSE, |
CF_RECURSE, |
CVS_REQ_LOG, |
CVS_REQ_LOG, |
CVS_CMD_SENDDIR | CVS_CMD_ALLOWSPEC | CVS_CMD_SENDARGS2 |
CVS_CMD_SENDDIR | CVS_CMD_ALLOWSPEC | CVS_CMD_SENDARGS2 |
}; |
}; |
|
|
static int rfonly = 0; |
static int log_rfonly = 0; |
static int honly = 0; |
static int log_honly = 0; |
|
static int log_notags = 0; |
|
|
int |
int |
cvs_getlog_options(char *opt, int argc, char **argv, int *arg) |
cvs_getlog_options(char *opt, int argc, char **argv, int *arg) |
|
|
case 'd': |
case 'd': |
break; |
break; |
case 'h': |
case 'h': |
honly = 1; |
log_honly = 1; |
break; |
break; |
case 'l': |
case 'l': |
cvs_getlog.file_flags &= ~CF_RECURSE; |
cvs_getlog.file_flags &= ~CF_RECURSE; |
break; |
break; |
|
case 'N': |
|
log_notags = 1; |
|
break; |
case 'R': |
case 'R': |
rfonly = 1; |
log_rfonly = 1; |
break; |
break; |
case 'r': |
case 'r': |
break; |
break; |
|
|
|
|
|
|
/* |
/* |
* cvs_getlog_file() |
* cvs_getlog_remote() |
* |
* |
* Diff a single file. |
|
*/ |
*/ |
static int |
static int |
cvs_getlog_file(CVSFILE *cf, void *arg) |
cvs_getlog_remote(CVSFILE *cf, void *arg) |
{ |
{ |
int ret; |
int ret; |
char *repo, fpath[MAXPATHLEN]; |
char *repo, fpath[MAXPATHLEN]; |
RCSFILE *rf; |
|
struct cvsroot *root; |
struct cvsroot *root; |
struct cvs_ent *entp; |
struct cvs_ent *entp; |
|
|
ret = 0; |
ret = 0; |
rf = NULL; |
|
root = CVS_DIR_ROOT(cf); |
root = CVS_DIR_ROOT(cf); |
repo = CVS_DIR_REPO(cf); |
repo = CVS_DIR_REPO(cf); |
|
|
|
|
|
|
switch (cf->cf_cvstat) { |
switch (cf->cf_cvstat) { |
case CVS_FST_UNKNOWN: |
case CVS_FST_UNKNOWN: |
ret = cvs_sendreq(root, CVS_REQ_QUESTIONABLE, |
ret = cvs_sendreq(root, CVS_REQ_QUESTIONABLE, cf->cf_name); |
CVS_FILE_NAME(cf)); |
|
break; |
break; |
case CVS_FST_UPTODATE: |
case CVS_FST_UPTODATE: |
ret = cvs_sendreq(root, CVS_REQ_UNCHANGED, |
ret = cvs_sendreq(root, CVS_REQ_UNCHANGED, cf->cf_name); |
CVS_FILE_NAME(cf)); |
|
break; |
break; |
case CVS_FST_ADDED: |
case CVS_FST_ADDED: |
case CVS_FST_MODIFIED: |
case CVS_FST_MODIFIED: |
ret = cvs_sendreq(root, CVS_REQ_ISMODIFIED, |
ret = cvs_sendreq(root, CVS_REQ_ISMODIFIED, cf->cf_name); |
CVS_FILE_NAME(cf)); |
|
break; |
break; |
default: |
default: |
break; |
break; |
|
|
cvs_getlog_local(CVSFILE *cf, void *arg) |
cvs_getlog_local(CVSFILE *cf, void *arg) |
{ |
{ |
int nrev; |
int nrev; |
char fpath[MAXPATHLEN], rcspath[MAXPATHLEN], numbuf[64]; |
char rcspath[MAXPATHLEN], numbuf[64]; |
char *repo; |
char *repo; |
RCSFILE *rf; |
RCSFILE *rf; |
struct rcs_sym *sym; |
struct rcs_sym *sym; |
struct rcs_delta *rdp; |
struct rcs_delta *rdp; |
|
struct rcs_access *acp; |
struct cvsroot *root; |
struct cvsroot *root; |
|
|
cvs_file_getpath(cf, fpath, sizeof(fpath)); |
|
if (cf->cf_cvstat == CVS_FST_UNKNOWN) { |
if (cf->cf_cvstat == CVS_FST_UNKNOWN) { |
cvs_printf("? %s\n", fpath); |
cvs_log(LP_WARN, "nothing known about %s", cf->cf_name); |
return (0); |
return (0); |
} |
} |
|
|
if (cf->cf_type == DT_DIR) |
if (cf->cf_type == DT_DIR) { |
|
cvs_log(LP_INFO, "Logging %s", cf->cf_name); |
return (0); |
return (0); |
|
} |
|
|
nrev = 0; |
nrev = 0; |
root = CVS_DIR_ROOT(cf); |
root = CVS_DIR_ROOT(cf); |
|
|
snprintf(rcspath, sizeof(rcspath), "%s/%s/%s%s", |
snprintf(rcspath, sizeof(rcspath), "%s/%s/%s%s", |
root->cr_dir, repo, CVS_FILE_NAME(cf), RCS_FILE_EXT); |
root->cr_dir, repo, CVS_FILE_NAME(cf), RCS_FILE_EXT); |
|
|
|
if (log_rfonly) { |
|
cvs_printf("%s\n", rcspath); |
|
return (0); |
|
} |
|
|
rf = rcs_open(rcspath, RCS_READ); |
rf = rcs_open(rcspath, RCS_READ); |
if (rf == NULL) |
if (rf == NULL) |
return (-1); |
return (-1); |
|
|
rcsnum_tostr(rcs_head_get(rf), numbuf, sizeof(numbuf))); |
rcsnum_tostr(rcs_head_get(rf), numbuf, sizeof(numbuf))); |
cvs_printf("branch: %s\n", |
cvs_printf("branch: %s\n", |
rcsnum_tostr(rcs_branch_get(rf), numbuf, sizeof(numbuf))); |
rcsnum_tostr(rcs_branch_get(rf), numbuf, sizeof(numbuf))); |
cvs_printf("locks:\naccess list:\n"); |
cvs_printf("locks: %s\n", (rf->rf_flags & RCS_SLOCK) ? "strict" : ""); |
|
|
cvs_printf("symbolic names:\n"); |
cvs_printf("access list:\n"); |
TAILQ_FOREACH(sym, &(rf->rf_symbols), rs_list) { |
TAILQ_FOREACH(acp, &(rf->rf_access), ra_list) |
cvs_printf("\t%s: %s\n", sym->rs_name, |
cvs_printf("\t%s\n", acp->ra_name); |
rcsnum_tostr(sym->rs_num, numbuf, sizeof(numbuf))); |
|
|
if (!log_notags) { |
|
cvs_printf("symbolic names:\n"); |
|
TAILQ_FOREACH(sym, &(rf->rf_symbols), rs_list) |
|
cvs_printf("\t%s: %s\n", sym->rs_name, |
|
rcsnum_tostr(sym->rs_num, numbuf, sizeof(numbuf))); |
} |
} |
|
|
cvs_printf("keyword substitution: %s\n", ""); |
cvs_printf("keyword substitution: %s\n", ""); |
cvs_printf("total revisions: %u;\tselected revisions: %u\n", |
|
rf->rf_ndelta, nrev); |
|
|
|
cvs_printf("description:\n"); |
if (log_honly) |
|
cvs_printf("total revisions: %u;\n", rf->rf_ndelta); |
TAILQ_FOREACH(rdp, &(rf->rf_delta), rd_list) { |
else { |
rcsnum_tostr(rdp->rd_num, numbuf, sizeof(numbuf)); |
cvs_printf("total revisions: %u;\tselected revisions: %u\n", |
cvs_printf(CVS_GETLOG_REVSEP "\nrevision %s\n", numbuf); |
rf->rf_ndelta, nrev); |
cvs_printf("date: %d/%02d/%02d %02d:%02d:%02d; author: %s;" |
cvs_printf("description:\n%s", rf->rf_desc); |
" state: %s;\n", |
TAILQ_FOREACH(rdp, &(rf->rf_delta), rd_list) { |
rdp->rd_date.tm_year + 1900, rdp->rd_date.tm_mon + 1, |
rcsnum_tostr(rdp->rd_num, numbuf, sizeof(numbuf)); |
rdp->rd_date.tm_mday, rdp->rd_date.tm_hour, |
cvs_printf(CVS_GETLOG_REVSEP "\nrevision %s\n", numbuf); |
rdp->rd_date.tm_min, rdp->rd_date.tm_sec, |
cvs_printf("date: %d/%02d/%02d %02d:%02d:%02d;" |
rdp->rd_author, rdp->rd_state); |
" author: %s; state: %s;\n", |
cvs_printf("%s", rdp->rd_log); |
rdp->rd_date.tm_year + 1900, |
|
rdp->rd_date.tm_mon + 1, |
|
rdp->rd_date.tm_mday, rdp->rd_date.tm_hour, |
|
rdp->rd_date.tm_min, rdp->rd_date.tm_sec, |
|
rdp->rd_author, rdp->rd_state); |
|
cvs_printf("%s", rdp->rd_log); |
|
} |
} |
} |
|
|
cvs_printf(CVS_GETLOG_REVEND "\n"); |
cvs_printf(CVS_GETLOG_REVEND "\n"); |