version 1.59, 2008/01/10 09:39:32 |
version 1.60, 2008/01/10 11:20:29 |
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
*/ |
*/ |
|
|
|
#include <errno.h> |
|
#include <string.h> |
#include <unistd.h> |
#include <unistd.h> |
|
|
#include "cvs.h" |
#include "cvs.h" |
|
|
static char *tag_name = NULL; |
static char *tag_name = NULL; |
static char *tag_oldname = NULL; |
static char *tag_oldname = NULL; |
|
|
|
struct cvs_cmd cvs_cmd_rtag = { |
|
CVS_OP_RTAG, 0, "rtag", |
|
{ "rt", "rfreeze" }, |
|
"Add a symbolic tag to a module", |
|
"[-bcdFflR] [-D date | -r rev] tag modules ...", |
|
"bcD:dFflRr:", |
|
NULL, |
|
cvs_tag |
|
}; |
|
|
struct cvs_cmd cvs_cmd_tag = { |
struct cvs_cmd cvs_cmd_tag = { |
CVS_OP_TAG, 0, "tag", |
CVS_OP_TAG, 0, "tag", |
{ "ta", "freeze" }, |
{ "ta", "freeze" }, |
|
|
int |
int |
cvs_tag(int argc, char **argv) |
cvs_tag(int argc, char **argv) |
{ |
{ |
int ch, flags; |
int ch, flags, i; |
char *arg = "."; |
char *arg = "."; |
struct cvs_recursion cr; |
struct cvs_recursion cr; |
|
|
|
|
argc -= optind; |
argc -= optind; |
argv += optind; |
argv += optind; |
|
|
if (argc == 0) |
if (cvs_cmdop == CVS_OP_RTAG) { |
|
if (argc < 2) |
|
fatal("%s", cvs_cmd_rtag.cmd_synopsis); |
|
|
|
for (i = 1; i < argc; i++) |
|
if (argv[i][0] == '/') |
|
fatal("Absolute path name is invalid: %s", |
|
argv[i]); |
|
} else if (cvs_cmdop == CVS_OP_TAG && argc == 0) |
fatal("%s", cvs_cmd_tag.cmd_synopsis); |
fatal("%s", cvs_cmd_tag.cmd_synopsis); |
|
|
tag_name = argv[0]; |
tag_name = argv[0]; |
|
|
|
|
cvs_client_send_request("Argument %s", tag_name); |
cvs_client_send_request("Argument %s", tag_name); |
} else { |
} else { |
|
if (cvs_cmdop == CVS_OP_RTAG && |
|
chdir(current_cvsroot->cr_dir) == -1) |
|
fatal("cvs_tag: %s", strerror(errno)); |
|
|
cr.fileproc = cvs_tag_local; |
cr.fileproc = cvs_tag_local; |
} |
} |
|
|
cr.flags = flags; |
cr.flags = flags; |
|
|
if (argc > 0) |
if (cvs_cmdop == CVS_OP_TAG || |
cvs_file_run(argc, argv, &cr); |
current_cvsroot->cr_method == CVS_METHOD_LOCAL)) { |
else |
if (argc > 0) |
cvs_file_run(1, &arg, &cr); |
cvs_file_run(argc, argv, &cr); |
|
else |
|
cvs_file_run(1, &arg, &cr); |
|
} |
|
|
if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) { |
if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) { |
cvs_client_send_files(argv, argc); |
cvs_client_send_files(argv, argc); |
cvs_client_senddir("."); |
cvs_client_senddir("."); |
cvs_client_send_request("tag"); |
|
|
cvs_client_send_request((cvs_cmdop == CVS_OP_RTAG) ? |
|
"rtag" : "tag"); |
|
|
cvs_client_get_responses(); |
cvs_client_get_responses(); |
} |
} |
|
|
|
|
{ |
{ |
cvs_log(LP_TRACE, "cvs_tag_local(%s)", cf->file_path); |
cvs_log(LP_TRACE, "cvs_tag_local(%s)", cf->file_path); |
|
|
|
cvs_file_classify(cf, tag); |
|
|
if (cf->file_type == CVS_DIR) { |
if (cf->file_type == CVS_DIR) { |
if (verbosity > 1) { |
if (verbosity > 1) { |
cvs_log(LP_NOTICE, "%s %s", |
cvs_log(LP_NOTICE, "%s %s", |
|
|
return; |
return; |
} |
} |
|
|
cvs_file_classify(cf, tag); |
|
|
|
if (runflags & T_CHECK_UPTODATE) { |
if (runflags & T_CHECK_UPTODATE) { |
if (cf->file_status != FILE_UPTODATE && |
if (cf->file_status != FILE_UPTODATE && |
cf->file_status != FILE_CHECKOUT && |
cf->file_status != FILE_CHECKOUT && |
|
|
return; |
return; |
case FILE_CHECKOUT: |
case FILE_CHECKOUT: |
case FILE_MODIFIED: |
case FILE_MODIFIED: |
|
case FILE_PATCH: |
case FILE_UPTODATE: |
case FILE_UPTODATE: |
if (tag_add(cf) == 0) { |
if (tag_add(cf) == 0) { |
if (verbosity > 0) |
if (verbosity > 0) |
|
|
tag_add(struct cvs_file *cf) |
tag_add(struct cvs_file *cf) |
{ |
{ |
char revbuf[CVS_REV_BUFSZ], trevbuf[CVS_REV_BUFSZ]; |
char revbuf[CVS_REV_BUFSZ], trevbuf[CVS_REV_BUFSZ]; |
RCSNUM *trev; |
RCSNUM *srev, *trev; |
struct rcs_sym *sym; |
struct rcs_sym *sym; |
|
|
if (cf->file_rcs == NULL) { |
if (cf->file_rcs == NULL) { |
|
|
return (-1); |
return (-1); |
} |
} |
|
|
|
if (cvs_cmdop == CVS_OP_TAG) { |
|
if (cf->file_ent == NULL) |
|
return (-1); |
|
srev = cf->file_ent->ce_rev; |
|
} else |
|
srev = cf->file_rcsrev; |
|
|
if (cvs_noexec == 1) |
if (cvs_noexec == 1) |
return (0); |
return (0); |
|
|
(void)rcsnum_tostr(cf->file_rcsrev, revbuf, sizeof(revbuf)); |
(void)rcsnum_tostr(srev, revbuf, sizeof(revbuf)); |
|
|
trev = rcs_sym_getrev(cf->file_rcs, tag_name); |
trev = rcs_sym_getrev(cf->file_rcs, tag_name); |
if (trev != NULL) { |
if (trev != NULL) { |
if (rcsnum_cmp(cf->file_rcsrev, trev, 0) == 0) { |
if (rcsnum_cmp(srev, trev, 0) == 0) { |
rcsnum_free(trev); |
rcsnum_free(trev); |
return (-1); |
return (-1); |
} |
} |
|
|
return (-1); |
return (-1); |
} else if (runflags & T_FORCE_MOVE) { |
} else if (runflags & T_FORCE_MOVE) { |
sym = rcs_sym_get(cf->file_rcs, tag_name); |
sym = rcs_sym_get(cf->file_rcs, tag_name); |
rcsnum_cpy(cf->file_rcsrev, sym->rs_num, 0); |
rcsnum_cpy(srev, sym->rs_num, 0); |
cf->file_rcs->rf_flags &= ~RCS_SYNCED; |
cf->file_rcs->rf_flags &= ~RCS_SYNCED; |
|
|
return (0); |
return (0); |
|
|
} |
} |
|
|
if (runflags & T_BRANCH) { |
if (runflags & T_BRANCH) { |
if ((trev = rcsnum_new_branch(cf->file_rcsrev)) == NULL) |
if ((trev = rcsnum_new_branch(srev)) == NULL) |
fatal("Cannot create a new branch"); |
fatal("Cannot create a new branch"); |
|
|
for (;;) { |
for (;;) { |
|
|
} |
} |
} else { |
} else { |
trev = rcsnum_alloc(); |
trev = rcsnum_alloc(); |
rcsnum_cpy(cf->file_rcsrev, trev, 0); |
rcsnum_cpy(srev, trev, 0); |
} |
} |
|
|
if (rcs_sym_add(cf->file_rcs, tag_name, trev) == -1) { |
if (rcs_sym_add(cf->file_rcs, tag_name, trev) == -1) { |