#include "cvs.h"
static void sticky_ck PROTO ((struct file_info *finfo, int aflag,
Vers_TS * vers));
Ctype
Classify_File (finfo, tag, date, options, force_tag_match, aflag, versp,
pipeout)
struct file_info *finfo;
char *tag;
char *date;
char *options;
int force_tag_match;
int aflag;
Vers_TS **versp;
int pipeout;
{
Vers_TS *vers;
Ctype ret;
vers = Version_TS (finfo, options, tag, date,
force_tag_match, 0);
if (vers->vn_user == NULL)
{
if (vers->vn_rcs == NULL)
{
if (vers->ts_user == NULL)
{
if (!force_tag_match || !(vers->tag || vers->date))
if (!really_quiet)
error (0, 0, "nothing known about %s", finfo->fullname);
ret = T_UNKNOWN;
}
else
{
if (!force_tag_match || !(vers->tag || vers->date))
if (!really_quiet)
error (0, 0, "use `%s add' to create an entry for %s",
program_name, finfo->fullname);
ret = T_UNKNOWN;
}
}
else if (RCS_isdead (vers->srcfile, vers->vn_rcs))
{
if (vers->ts_user == NULL)
ret = T_UPTODATE;
else
{
error (0, 0, "use `%s add' to create an entry for %s",
program_name, finfo->fullname);
ret = T_UNKNOWN;
}
}
else if (!pipeout && vers->ts_user && No_Difference (finfo, vers))
{
if (!really_quiet)
error (0, 0, "move away %s; it is in the way",
finfo->fullname);
ret = T_CONFLICT;
}
else
ret = T_CHECKOUT;
}
else if (strcmp (vers->vn_user, "0") == 0)
{
if (vers->ts_user == NULL)
{
if (pipeout)
{
ret = T_CHECKOUT;
}
else
{
if (!really_quiet)
error (0, 0, "warning: new-born %s has disappeared",
finfo->fullname);
ret = T_REMOVE_ENTRY;
}
}
else if (vers->vn_rcs == NULL ||
RCS_isdead (vers->srcfile, vers->vn_rcs))
ret = T_ADDED;
else
{
if (pipeout)
{
ret = T_CHECKOUT;
}
else
{
if (vers->srcfile->flags & INATTIC
&& vers->srcfile->flags & VALID)
{
if (!really_quiet)
error (0, 0,
"conflict: %s has been added, but already exists",
finfo->fullname);
}
else
{
if (!really_quiet)
error (0, 0,
"conflict: %s created independently by second party",
finfo->fullname);
}
ret = T_CONFLICT;
}
}
}
else if (vers->vn_user[0] == '-')
{
if (vers->ts_user == NULL)
{
if (vers->vn_rcs == NULL
|| RCS_isdead (vers->srcfile, vers->vn_rcs))
{
ret = T_REMOVE_ENTRY;
}
else if (strcmp (vers->vn_rcs, vers->vn_user + 1) == 0)
ret = T_REMOVED;
else if (pipeout)
ret = T_NEEDS_MERGE;
else
{
if (!really_quiet)
error (0, 0,
"conflict: removed %s was modified by second party",
finfo->fullname);
ret = T_CONFLICT;
}
}
else
{
if (!really_quiet)
error (0, 0, "%s should be removed and is still there",
finfo->fullname);
ret = T_REMOVED;
}
}
else
{
if (vers->vn_rcs == NULL || RCS_isdead (vers->srcfile, vers->vn_rcs))
{
if (vers->ts_user == NULL)
{
if (!really_quiet)
error (0, 0, "warning: %s is not (any longer) pertinent",
finfo->fullname);
ret = T_REMOVE_ENTRY;
}
else if (strcmp (vers->ts_user, vers->ts_rcs) == 0)
{
if (!really_quiet)
error (0, 0, "%s is no longer in the repository",
finfo->fullname);
ret = T_REMOVE_ENTRY;
}
else if (No_Difference (finfo, vers))
{
if (!really_quiet)
error (0, 0,
"conflict: %s is modified but no longer in the repository",
finfo->fullname);
ret = T_CONFLICT;
}
else
{
if (!really_quiet)
error (0, 0,
"warning: %s is not (any longer) pertinent",
finfo->fullname);
ret = T_REMOVE_ENTRY;
}
}
else if (strcmp (vers->vn_rcs, vers->vn_user) == 0)
{
if (vers->ts_user == NULL)
{
if (strcmp (cvs_cmd_name, "update") == 0)
if (!really_quiet)
error (0, 0, "warning: %s was lost", finfo->fullname);
ret = T_CHECKOUT;
}
else if (strcmp (vers->ts_user, vers->ts_rcs) == 0)
{
if (vers->entdata->options &&
strcmp (vers->entdata->options, vers->options) != 0)
ret = T_CHECKOUT;
else
{
sticky_ck (finfo, aflag, vers);
ret = T_UPTODATE;
}
}
else if (No_Difference (finfo, vers))
{
#ifdef XXX_FIXME_WHEN_RCSMERGE_IS_FIXED
if (strcmp (vers->entdata->options ?
vers->entdata->options : "", vers->options) == 0)
ret = T_MODIFIED;
else
ret = T_NEEDS_MERGE;
#else
ret = T_MODIFIED;
sticky_ck (finfo, aflag, vers);
#endif
}
else if (strcmp (vers->entdata->options ?
vers->entdata->options : "", vers->options) != 0)
{
ret = T_CHECKOUT;
}
else
{
ret = T_UPTODATE;
}
}
else
{
if (vers->ts_user == NULL)
{
if (strcmp (cvs_cmd_name, "update") == 0)
if (!really_quiet)
error (0, 0, "warning: %s was lost", finfo->fullname);
ret = T_CHECKOUT;
}
else if (strcmp (vers->ts_user, vers->ts_rcs) == 0)
{
if (strcmp (vers->entdata->options ?
vers->entdata->options : "", vers->options) != 0
|| (vers->srcfile != NULL
&& (vers->srcfile->flags & INATTIC) != 0))
ret = T_CHECKOUT;
else
ret = T_PATCH;
}
else if (No_Difference (finfo, vers))
ret = T_NEEDS_MERGE;
else if ((strcmp (vers->entdata->options ?
vers->entdata->options : "", vers->options)
!= 0)
|| (vers->srcfile != NULL
&& (vers->srcfile->flags & INATTIC) != 0))
ret = T_CHECKOUT;
else
ret = T_PATCH;
}
}
if (versp != (Vers_TS **) NULL)
*versp = vers;
else
freevers_ts (&vers);
return (ret);
}
static void
sticky_ck (finfo, aflag, vers)
struct file_info *finfo;
int aflag;
Vers_TS *vers;
{
if (aflag || vers->tag || vers->date)
{
char *enttag = vers->entdata->tag;
char *entdate = vers->entdata->date;
if ((enttag && vers->tag && strcmp (enttag, vers->tag)) ||
((enttag && !vers->tag) || (!enttag && vers->tag)) ||
(entdate && vers->date && strcmp (entdate, vers->date)) ||
((entdate && !vers->date) || (!entdate && vers->date)))
{
Register (finfo->entries, finfo->file, vers->vn_user, vers->ts_rcs,
vers->options, vers->tag, vers->date, vers->ts_conflict);
#ifdef SERVER_SUPPORT
if (server_active)
{
server_update_entries
(finfo->file, finfo->update_dir, finfo->repository,
strcmp (vers->ts_rcs, vers->ts_user) == 0 ?
SERVER_UPDATED : SERVER_MERGED);
}
#endif
}
}
}