xref: /openbsd/gnu/usr.bin/cvs/src/classify.c (revision 50bf276c)
11e72d8d2Sderaadt /*
21e72d8d2Sderaadt  * Copyright (c) 1992, Brian Berliner and Jeff Polk
31e72d8d2Sderaadt  * Copyright (c) 1989-1992, Brian Berliner
41e72d8d2Sderaadt  *
51e72d8d2Sderaadt  * You may distribute under the terms of the GNU General Public License as
61e72d8d2Sderaadt  * specified in the README file that comes with the CVS 1.4 kit.
71e72d8d2Sderaadt  *
81e72d8d2Sderaadt  */
91e72d8d2Sderaadt 
101e72d8d2Sderaadt #include "cvs.h"
111e72d8d2Sderaadt 
121e72d8d2Sderaadt #ifdef SERVER_SUPPORT
131e72d8d2Sderaadt static void sticky_ck PROTO((char *file, int aflag, Vers_TS * vers,
141e72d8d2Sderaadt 			     List * entries,
151e72d8d2Sderaadt 			     char *repository, char *update_dir));
161e72d8d2Sderaadt #else
171e72d8d2Sderaadt static void sticky_ck PROTO((char *file, int aflag, Vers_TS * vers, List * entries));
181e72d8d2Sderaadt #endif
191e72d8d2Sderaadt 
201e72d8d2Sderaadt /*
211e72d8d2Sderaadt  * Classify the state of a file
221e72d8d2Sderaadt  */
231e72d8d2Sderaadt Ctype
24*50bf276cStholo Classify_File (finfo, tag, date, options, force_tag_match, aflag, versp,
25*50bf276cStholo 	       pipeout)
26*50bf276cStholo     struct file_info *finfo;
271e72d8d2Sderaadt     char *tag;
281e72d8d2Sderaadt     char *date;
291e72d8d2Sderaadt     char *options;
301e72d8d2Sderaadt     int force_tag_match;
311e72d8d2Sderaadt     int aflag;
321e72d8d2Sderaadt     Vers_TS **versp;
331e72d8d2Sderaadt     int pipeout;
341e72d8d2Sderaadt {
351e72d8d2Sderaadt     Vers_TS *vers;
361e72d8d2Sderaadt     Ctype ret;
371e72d8d2Sderaadt 
381e72d8d2Sderaadt     /* get all kinds of good data about the file */
39*50bf276cStholo     vers = Version_TS (finfo, options, tag, date,
40*50bf276cStholo 		       force_tag_match, 0);
411e72d8d2Sderaadt 
421e72d8d2Sderaadt     if (vers->vn_user == NULL)
431e72d8d2Sderaadt     {
441e72d8d2Sderaadt 	/* No entry available, ts_rcs is invalid */
451e72d8d2Sderaadt 	if (vers->vn_rcs == NULL)
461e72d8d2Sderaadt 	{
471e72d8d2Sderaadt 	    /* there is no RCS file either */
481e72d8d2Sderaadt 	    if (vers->ts_user == NULL)
491e72d8d2Sderaadt 	    {
501e72d8d2Sderaadt 		/* there is no user file */
511e72d8d2Sderaadt 		if (!force_tag_match || !(vers->tag || vers->date))
521e72d8d2Sderaadt 		    if (!really_quiet)
53*50bf276cStholo 			error (0, 0, "nothing known about %s", finfo->fullname);
541e72d8d2Sderaadt 		ret = T_UNKNOWN;
551e72d8d2Sderaadt 	    }
561e72d8d2Sderaadt 	    else
571e72d8d2Sderaadt 	    {
581e72d8d2Sderaadt 		/* there is a user file */
591e72d8d2Sderaadt 		if (!force_tag_match || !(vers->tag || vers->date))
601e72d8d2Sderaadt 		    if (!really_quiet)
611e72d8d2Sderaadt 			error (0, 0, "use `cvs add' to create an entry for %s",
62*50bf276cStholo 			       finfo->fullname);
631e72d8d2Sderaadt 		ret = T_UNKNOWN;
641e72d8d2Sderaadt 	    }
651e72d8d2Sderaadt 	}
661e72d8d2Sderaadt 	else if (RCS_isdead (vers->srcfile, vers->vn_rcs))
671e72d8d2Sderaadt 	{
681e72d8d2Sderaadt 	    if (vers->ts_user == NULL)
69*50bf276cStholo 		ret = T_UPTODATE;
701e72d8d2Sderaadt 	    else
711e72d8d2Sderaadt 	    {
721e72d8d2Sderaadt 		error (0, 0, "use `cvs add' to create an entry for %s",
73*50bf276cStholo 		       finfo->fullname);
741e72d8d2Sderaadt 		ret = T_UNKNOWN;
751e72d8d2Sderaadt 	    }
761e72d8d2Sderaadt 	}
771e72d8d2Sderaadt 	else
781e72d8d2Sderaadt 	{
791e72d8d2Sderaadt 	    /* there is an rcs file */
801e72d8d2Sderaadt 
811e72d8d2Sderaadt 	    if (vers->ts_user == NULL)
821e72d8d2Sderaadt 	    {
831e72d8d2Sderaadt 		/* There is no user file; needs checkout */
841e72d8d2Sderaadt 		ret = T_CHECKOUT;
851e72d8d2Sderaadt 	    }
861e72d8d2Sderaadt 	    else
871e72d8d2Sderaadt 	    {
881e72d8d2Sderaadt 		if (pipeout)
891e72d8d2Sderaadt 		{
901e72d8d2Sderaadt 		    /*
911e72d8d2Sderaadt 		     * The user file doesn't necessarily have anything
921e72d8d2Sderaadt 		     * to do with this.
931e72d8d2Sderaadt 		     */
941e72d8d2Sderaadt 		    ret = T_CHECKOUT;
951e72d8d2Sderaadt 		}
961e72d8d2Sderaadt 		/*
971e72d8d2Sderaadt 		 * There is a user file; print a warning and add it to the
981e72d8d2Sderaadt 		 * conflict list, only if it is indeed different from what we
991e72d8d2Sderaadt 		 * plan to extract
1001e72d8d2Sderaadt 		 */
101*50bf276cStholo 		else if (No_Difference (finfo, vers))
1021e72d8d2Sderaadt 		{
1031e72d8d2Sderaadt 		    /* the files were different so it is a conflict */
1041e72d8d2Sderaadt 		    if (!really_quiet)
1051e72d8d2Sderaadt 			error (0, 0, "move away %s; it is in the way",
106*50bf276cStholo 			       finfo->fullname);
1071e72d8d2Sderaadt 		    ret = T_CONFLICT;
1081e72d8d2Sderaadt 		}
1091e72d8d2Sderaadt 		else
1101e72d8d2Sderaadt 		    /* since there was no difference, still needs checkout */
1111e72d8d2Sderaadt 		    ret = T_CHECKOUT;
1121e72d8d2Sderaadt 	    }
1131e72d8d2Sderaadt 	}
1141e72d8d2Sderaadt     }
1151e72d8d2Sderaadt     else if (strcmp (vers->vn_user, "0") == 0)
1161e72d8d2Sderaadt     {
1171e72d8d2Sderaadt 	/* An entry for a new-born file; ts_rcs is dummy */
1181e72d8d2Sderaadt 
1191e72d8d2Sderaadt 	if (vers->ts_user == NULL)
1201e72d8d2Sderaadt 	{
1211e72d8d2Sderaadt 	    /*
1221e72d8d2Sderaadt 	     * There is no user file, but there should be one; remove the
1231e72d8d2Sderaadt 	     * entry
1241e72d8d2Sderaadt 	     */
1251e72d8d2Sderaadt 	    if (!really_quiet)
126*50bf276cStholo 		error (0, 0, "warning: new-born %s has disappeared", finfo->fullname);
1271e72d8d2Sderaadt 	    ret = T_REMOVE_ENTRY;
1281e72d8d2Sderaadt 	}
1291e72d8d2Sderaadt 	else
1301e72d8d2Sderaadt 	{
1311e72d8d2Sderaadt 	    /* There is a user file */
1321e72d8d2Sderaadt 
1331e72d8d2Sderaadt 	    if (vers->vn_rcs == NULL)
1341e72d8d2Sderaadt 		/* There is no RCS file, added file */
1351e72d8d2Sderaadt 		ret = T_ADDED;
1361e72d8d2Sderaadt 	    else if (RCS_isdead (vers->srcfile, vers->vn_rcs))
1371e72d8d2Sderaadt 		/* we are resurrecting. */
1381e72d8d2Sderaadt 		ret = T_ADDED;
1391e72d8d2Sderaadt 	    else
1401e72d8d2Sderaadt 	    {
1411e72d8d2Sderaadt 		if (vers->srcfile->flags & INATTIC
1421e72d8d2Sderaadt 		    && vers->srcfile->flags & VALID)
1431e72d8d2Sderaadt 		{
1441e72d8d2Sderaadt 		    /* This file has been added on some branch other than
1451e72d8d2Sderaadt 		       the one we are looking at.  In the branch we are
1461e72d8d2Sderaadt 		       looking at, the file was already valid.  */
1471e72d8d2Sderaadt 		    if (!really_quiet)
1481e72d8d2Sderaadt 			error (0, 0,
149c26070a5Stholo 			       "\
150c26070a5Stholo conflict: %s has been added, but already exists",
151*50bf276cStholo 			       finfo->fullname);
1521e72d8d2Sderaadt 		}
1531e72d8d2Sderaadt 		else
1541e72d8d2Sderaadt 		{
1551e72d8d2Sderaadt 		    /*
1561e72d8d2Sderaadt 		     * There is an RCS file, so someone else must have checked
1571e72d8d2Sderaadt 		     * one in behind our back; conflict
1581e72d8d2Sderaadt 		     */
1591e72d8d2Sderaadt 		    if (!really_quiet)
1601e72d8d2Sderaadt 			error (0, 0,
161c26070a5Stholo 			       "\
162c26070a5Stholo conflict: %s created independently by second party",
163*50bf276cStholo 			       finfo->fullname);
1641e72d8d2Sderaadt 		}
1651e72d8d2Sderaadt 		ret = T_CONFLICT;
1661e72d8d2Sderaadt 	    }
1671e72d8d2Sderaadt 	}
1681e72d8d2Sderaadt     }
1691e72d8d2Sderaadt     else if (vers->vn_user[0] == '-')
1701e72d8d2Sderaadt     {
1711e72d8d2Sderaadt 	/* An entry for a removed file, ts_rcs is invalid */
1721e72d8d2Sderaadt 
1731e72d8d2Sderaadt 	if (vers->ts_user == NULL)
1741e72d8d2Sderaadt 	{
1751e72d8d2Sderaadt 	    char tmp[PATH_MAX];
1761e72d8d2Sderaadt 
1771e72d8d2Sderaadt 	    /* There is no user file (as it should be) */
1781e72d8d2Sderaadt 
1791e72d8d2Sderaadt 	    (void) sprintf (tmp, "-%s", vers->vn_rcs ? vers->vn_rcs : "");
1801e72d8d2Sderaadt 
181*50bf276cStholo 	    if (vers->vn_rcs == NULL
182*50bf276cStholo 		|| RCS_isdead (vers->srcfile, vers->vn_rcs))
1831e72d8d2Sderaadt 	    {
1841e72d8d2Sderaadt 
1851e72d8d2Sderaadt 		/*
1861e72d8d2Sderaadt 		 * There is no RCS file; this is all-right, but it has been
1871e72d8d2Sderaadt 		 * removed independently by a second party; remove the entry
1881e72d8d2Sderaadt 		 */
1891e72d8d2Sderaadt 		ret = T_REMOVE_ENTRY;
1901e72d8d2Sderaadt 	    }
1911e72d8d2Sderaadt 	    else if (strcmp (tmp, vers->vn_user) == 0)
1921e72d8d2Sderaadt 
1931e72d8d2Sderaadt 		/*
1941e72d8d2Sderaadt 		 * The RCS file is the same version as the user file was, and
1951e72d8d2Sderaadt 		 * that's OK; remove it
1961e72d8d2Sderaadt 		 */
1971e72d8d2Sderaadt 		ret = T_REMOVED;
1981e72d8d2Sderaadt 	    else
1991e72d8d2Sderaadt 	    {
2001e72d8d2Sderaadt 
2011e72d8d2Sderaadt 		/*
2021e72d8d2Sderaadt 		 * The RCS file is a newer version than the removed user file
2031e72d8d2Sderaadt 		 * and this is definitely not OK; make it a conflict.
2041e72d8d2Sderaadt 		 */
2051e72d8d2Sderaadt 		if (!really_quiet)
2061e72d8d2Sderaadt 		    error (0, 0,
2071e72d8d2Sderaadt 			   "conflict: removed %s was modified by second party",
208*50bf276cStholo 			   finfo->fullname);
2091e72d8d2Sderaadt 		ret = T_CONFLICT;
2101e72d8d2Sderaadt 	    }
2111e72d8d2Sderaadt 	}
2121e72d8d2Sderaadt 	else
2131e72d8d2Sderaadt 	{
2141e72d8d2Sderaadt 	    /* The user file shouldn't be there */
2151e72d8d2Sderaadt 	    if (!really_quiet)
2161e72d8d2Sderaadt 		error (0, 0, "%s should be removed and is still there",
217*50bf276cStholo 		       finfo->fullname);
2181e72d8d2Sderaadt 	    ret = T_REMOVED;
2191e72d8d2Sderaadt 	}
2201e72d8d2Sderaadt     }
2211e72d8d2Sderaadt     else
2221e72d8d2Sderaadt     {
2231e72d8d2Sderaadt 	/* A normal entry, TS_Rcs is valid */
2241e72d8d2Sderaadt 	if (vers->vn_rcs == NULL)
2251e72d8d2Sderaadt 	{
2261e72d8d2Sderaadt 	    /* There is no RCS file */
2271e72d8d2Sderaadt 
2281e72d8d2Sderaadt 	    if (vers->ts_user == NULL)
2291e72d8d2Sderaadt 	    {
2301e72d8d2Sderaadt 		/* There is no user file, so just remove the entry */
2311e72d8d2Sderaadt 		if (!really_quiet)
2321e72d8d2Sderaadt 		    error (0, 0, "warning: %s is not (any longer) pertinent",
233*50bf276cStholo 			   finfo->fullname);
2341e72d8d2Sderaadt 		ret = T_REMOVE_ENTRY;
2351e72d8d2Sderaadt 	    }
2361e72d8d2Sderaadt 	    else if (strcmp (vers->ts_user, vers->ts_rcs) == 0)
2371e72d8d2Sderaadt 	    {
2381e72d8d2Sderaadt 
2391e72d8d2Sderaadt 		/*
2401e72d8d2Sderaadt 		 * The user file is still unmodified, so just remove it from
2411e72d8d2Sderaadt 		 * the entry list
2421e72d8d2Sderaadt 		 */
2431e72d8d2Sderaadt 		if (!really_quiet)
2441e72d8d2Sderaadt 		    error (0, 0, "%s is no longer in the repository",
245*50bf276cStholo 			   finfo->fullname);
2461e72d8d2Sderaadt 		ret = T_REMOVE_ENTRY;
2471e72d8d2Sderaadt 	    }
2481e72d8d2Sderaadt 	    else
2491e72d8d2Sderaadt 	    {
2501e72d8d2Sderaadt 		/*
2511e72d8d2Sderaadt 		 * The user file has been modified and since it is no longer
2521e72d8d2Sderaadt 		 * in the repository, a conflict is raised
2531e72d8d2Sderaadt 		 */
254*50bf276cStholo 		if (No_Difference (finfo, vers))
2551e72d8d2Sderaadt 		{
2561e72d8d2Sderaadt 		    /* they are different -> conflict */
2571e72d8d2Sderaadt 		    if (!really_quiet)
2581e72d8d2Sderaadt 			error (0, 0,
2591e72d8d2Sderaadt 	       "conflict: %s is modified but no longer in the repository",
260*50bf276cStholo 			   finfo->fullname);
2611e72d8d2Sderaadt 		    ret = T_CONFLICT;
2621e72d8d2Sderaadt 		}
2631e72d8d2Sderaadt 		else
2641e72d8d2Sderaadt 		{
2651e72d8d2Sderaadt 		    /* they weren't really different */
2661e72d8d2Sderaadt 		    if (!really_quiet)
2671e72d8d2Sderaadt 			error (0, 0,
2681e72d8d2Sderaadt 			       "warning: %s is not (any longer) pertinent",
269*50bf276cStholo 			       finfo->fullname);
2701e72d8d2Sderaadt 		    ret = T_REMOVE_ENTRY;
2711e72d8d2Sderaadt 		}
2721e72d8d2Sderaadt 	    }
2731e72d8d2Sderaadt 	}
2741e72d8d2Sderaadt 	else if (strcmp (vers->vn_rcs, vers->vn_user) == 0)
2751e72d8d2Sderaadt 	{
2761e72d8d2Sderaadt 	    /* The RCS file is the same version as the user file */
2771e72d8d2Sderaadt 
2781e72d8d2Sderaadt 	    if (vers->ts_user == NULL)
2791e72d8d2Sderaadt 	    {
2801e72d8d2Sderaadt 
2811e72d8d2Sderaadt 		/*
2821e72d8d2Sderaadt 		 * There is no user file, so note that it was lost and
2831e72d8d2Sderaadt 		 * extract a new version
2841e72d8d2Sderaadt 		 */
2851e72d8d2Sderaadt 		if (strcmp (command_name, "update") == 0)
2861e72d8d2Sderaadt 		    if (!really_quiet)
287*50bf276cStholo 			error (0, 0, "warning: %s was lost", finfo->fullname);
2881e72d8d2Sderaadt 		ret = T_CHECKOUT;
2891e72d8d2Sderaadt 	    }
2901e72d8d2Sderaadt 	    else if (strcmp (vers->ts_user, vers->ts_rcs) == 0)
2911e72d8d2Sderaadt 	    {
2921e72d8d2Sderaadt 
2931e72d8d2Sderaadt 		/*
2941e72d8d2Sderaadt 		 * The user file is still unmodified, so nothing special at
2951e72d8d2Sderaadt 		 * all to do -- no lists updated, unless the sticky -k option
2961e72d8d2Sderaadt 		 * has changed.  If the sticky tag has changed, we just need
2971e72d8d2Sderaadt 		 * to re-register the entry
2981e72d8d2Sderaadt 		 */
2991e72d8d2Sderaadt 		if (vers->entdata->options &&
3001e72d8d2Sderaadt 		    strcmp (vers->entdata->options, vers->options) != 0)
3011e72d8d2Sderaadt 		    ret = T_CHECKOUT;
3021e72d8d2Sderaadt 		else
3031e72d8d2Sderaadt 		{
3041e72d8d2Sderaadt #ifdef SERVER_SUPPORT
305*50bf276cStholo 		    sticky_ck (finfo->file, aflag, vers, finfo->entries,
306*50bf276cStholo 			       finfo->repository, finfo->update_dir);
3071e72d8d2Sderaadt #else
308*50bf276cStholo 		    sticky_ck (finfo->file, aflag, vers, finfo->entries);
3091e72d8d2Sderaadt #endif
3101e72d8d2Sderaadt 		    ret = T_UPTODATE;
3111e72d8d2Sderaadt 		}
3121e72d8d2Sderaadt 	    }
3131e72d8d2Sderaadt 	    else
3141e72d8d2Sderaadt 	    {
3151e72d8d2Sderaadt 
3161e72d8d2Sderaadt 		/*
3171e72d8d2Sderaadt 		 * The user file appears to have been modified, but we call
3181e72d8d2Sderaadt 		 * No_Difference to verify that it really has been modified
3191e72d8d2Sderaadt 		 */
320*50bf276cStholo 		if (No_Difference (finfo, vers))
3211e72d8d2Sderaadt 		{
3221e72d8d2Sderaadt 
3231e72d8d2Sderaadt 		    /*
3241e72d8d2Sderaadt 		     * they really are different; modified if we aren't
3251e72d8d2Sderaadt 		     * changing any sticky -k options, else needs merge
3261e72d8d2Sderaadt 		     */
3271e72d8d2Sderaadt #ifdef XXX_FIXME_WHEN_RCSMERGE_IS_FIXED
3281e72d8d2Sderaadt 		    if (strcmp (vers->entdata->options ?
3291e72d8d2Sderaadt 			   vers->entdata->options : "", vers->options) == 0)
3301e72d8d2Sderaadt 			ret = T_MODIFIED;
3311e72d8d2Sderaadt 		    else
3321e72d8d2Sderaadt 			ret = T_NEEDS_MERGE;
3331e72d8d2Sderaadt #else
3341e72d8d2Sderaadt 		    ret = T_MODIFIED;
3351e72d8d2Sderaadt #ifdef SERVER_SUPPORT
336*50bf276cStholo 		    sticky_ck (finfo->file, aflag, vers, finfo->entries,
337*50bf276cStholo 			       finfo->repository, finfo->update_dir);
3381e72d8d2Sderaadt #else
339*50bf276cStholo 		    sticky_ck (finfo->file, aflag, vers, finfo->entries);
3401e72d8d2Sderaadt #endif /* SERVER_SUPPORT */
3411e72d8d2Sderaadt #endif
3421e72d8d2Sderaadt 		}
3431e72d8d2Sderaadt 		else
3441e72d8d2Sderaadt 		{
3451e72d8d2Sderaadt 		    /* file has not changed; check out if -k changed */
3461e72d8d2Sderaadt 		    if (strcmp (vers->entdata->options ?
3471e72d8d2Sderaadt 			   vers->entdata->options : "", vers->options) != 0)
3481e72d8d2Sderaadt 		    {
3491e72d8d2Sderaadt 			ret = T_CHECKOUT;
3501e72d8d2Sderaadt 		    }
3511e72d8d2Sderaadt 		    else
3521e72d8d2Sderaadt 		    {
3531e72d8d2Sderaadt 
3541e72d8d2Sderaadt 			/*
3551e72d8d2Sderaadt 			 * else -> note that No_Difference will Register the
3561e72d8d2Sderaadt 			 * file already for us, using the new tag/date. This
3571e72d8d2Sderaadt 			 * is the desired behaviour
3581e72d8d2Sderaadt 			 */
3591e72d8d2Sderaadt 			ret = T_UPTODATE;
3601e72d8d2Sderaadt 		    }
3611e72d8d2Sderaadt 		}
3621e72d8d2Sderaadt 	    }
3631e72d8d2Sderaadt 	}
3641e72d8d2Sderaadt 	else
3651e72d8d2Sderaadt 	{
3661e72d8d2Sderaadt 	    /* The RCS file is a newer version than the user file */
3671e72d8d2Sderaadt 
3681e72d8d2Sderaadt 	    if (vers->ts_user == NULL)
3691e72d8d2Sderaadt 	    {
3701e72d8d2Sderaadt 		/* There is no user file, so just get it */
3711e72d8d2Sderaadt 
3721e72d8d2Sderaadt 		if (strcmp (command_name, "update") == 0)
3731e72d8d2Sderaadt 		    if (!really_quiet)
374*50bf276cStholo 			error (0, 0, "warning: %s was lost", finfo->fullname);
3751e72d8d2Sderaadt 		ret = T_CHECKOUT;
3761e72d8d2Sderaadt 	    }
3771e72d8d2Sderaadt 	    else if (strcmp (vers->ts_user, vers->ts_rcs) == 0)
3781e72d8d2Sderaadt 	    {
3791e72d8d2Sderaadt 
3801e72d8d2Sderaadt 		/*
3811e72d8d2Sderaadt 		 * The user file is still unmodified, so just get it as well
3821e72d8d2Sderaadt 		 */
3831e72d8d2Sderaadt #ifdef SERVER_SUPPORT
3841e72d8d2Sderaadt 	        if (strcmp (vers->entdata->options ?
3851e72d8d2Sderaadt 			    vers->entdata->options : "", vers->options) != 0
3861e72d8d2Sderaadt 		    || (vers->srcfile != NULL
3871e72d8d2Sderaadt 			&& (vers->srcfile->flags & INATTIC) != 0))
3881e72d8d2Sderaadt 		    ret = T_CHECKOUT;
3891e72d8d2Sderaadt 		else
3901e72d8d2Sderaadt 		    ret = T_PATCH;
3911e72d8d2Sderaadt #else
3921e72d8d2Sderaadt 		ret = T_CHECKOUT;
3931e72d8d2Sderaadt #endif
3941e72d8d2Sderaadt 	    }
3951e72d8d2Sderaadt 	    else
3961e72d8d2Sderaadt 	    {
397*50bf276cStholo 		if (No_Difference (finfo, vers))
3981e72d8d2Sderaadt 		    /* really modified, needs to merge */
3991e72d8d2Sderaadt 		    ret = T_NEEDS_MERGE;
4001e72d8d2Sderaadt #ifdef SERVER_SUPPORT
4011e72d8d2Sderaadt 	        else if ((strcmp (vers->entdata->options ?
4021e72d8d2Sderaadt 				  vers->entdata->options : "", vers->options)
4031e72d8d2Sderaadt 			  != 0)
4041e72d8d2Sderaadt 			 || (vers->srcfile != NULL
4051e72d8d2Sderaadt 			     && (vers->srcfile->flags & INATTIC) != 0))
4061e72d8d2Sderaadt 		    /* not really modified, check it out */
4071e72d8d2Sderaadt 		    ret = T_CHECKOUT;
4081e72d8d2Sderaadt 		else
4091e72d8d2Sderaadt 		    ret = T_PATCH;
4101e72d8d2Sderaadt #else
4111e72d8d2Sderaadt 		else
4121e72d8d2Sderaadt 		    /* not really modified, check it out */
4131e72d8d2Sderaadt 		    ret = T_CHECKOUT;
4141e72d8d2Sderaadt #endif
4151e72d8d2Sderaadt 	    }
4161e72d8d2Sderaadt 	}
4171e72d8d2Sderaadt     }
4181e72d8d2Sderaadt 
4191e72d8d2Sderaadt     /* free up the vers struct, or just return it */
4201e72d8d2Sderaadt     if (versp != (Vers_TS **) NULL)
4211e72d8d2Sderaadt 	*versp = vers;
4221e72d8d2Sderaadt     else
4231e72d8d2Sderaadt 	freevers_ts (&vers);
4241e72d8d2Sderaadt 
4251e72d8d2Sderaadt     /* return the status of the file */
4261e72d8d2Sderaadt     return (ret);
4271e72d8d2Sderaadt }
4281e72d8d2Sderaadt 
4291e72d8d2Sderaadt static void
4301e72d8d2Sderaadt #ifdef SERVER_SUPPORT
4311e72d8d2Sderaadt sticky_ck (file, aflag, vers, entries, repository, update_dir)
4321e72d8d2Sderaadt #else
4331e72d8d2Sderaadt sticky_ck (file, aflag, vers, entries)
4341e72d8d2Sderaadt #endif
4351e72d8d2Sderaadt     char *file;
4361e72d8d2Sderaadt     int aflag;
4371e72d8d2Sderaadt     Vers_TS *vers;
4381e72d8d2Sderaadt     List *entries;
4391e72d8d2Sderaadt #ifdef SERVER_SUPPORT
4401e72d8d2Sderaadt     char *repository;
4411e72d8d2Sderaadt     char *update_dir;
4421e72d8d2Sderaadt #endif
4431e72d8d2Sderaadt {
4441e72d8d2Sderaadt     if (aflag || vers->tag || vers->date)
4451e72d8d2Sderaadt     {
4461e72d8d2Sderaadt 	char *enttag = vers->entdata->tag;
4471e72d8d2Sderaadt 	char *entdate = vers->entdata->date;
4481e72d8d2Sderaadt 
4491e72d8d2Sderaadt 	if ((enttag && vers->tag && strcmp (enttag, vers->tag)) ||
4501e72d8d2Sderaadt 	    ((enttag && !vers->tag) || (!enttag && vers->tag)) ||
4511e72d8d2Sderaadt 	    (entdate && vers->date && strcmp (entdate, vers->date)) ||
4521e72d8d2Sderaadt 	    ((entdate && !vers->date) || (!entdate && vers->date)))
4531e72d8d2Sderaadt 	{
4541e72d8d2Sderaadt 	    Register (entries, file, vers->vn_user, vers->ts_rcs,
4551e72d8d2Sderaadt 		      vers->options, vers->tag, vers->date, vers->ts_conflict);
4561e72d8d2Sderaadt 
4571e72d8d2Sderaadt #ifdef SERVER_SUPPORT
4581e72d8d2Sderaadt 	    if (server_active)
4591e72d8d2Sderaadt 	    {
4601e72d8d2Sderaadt 		/* We need to update the entries line on the client side.
4611e72d8d2Sderaadt 		   It is possible we will later update it again via
4621e72d8d2Sderaadt 		   server_updated or some such, but that is OK.  */
4631e72d8d2Sderaadt 		server_update_entries
4641e72d8d2Sderaadt 		  (file, update_dir, repository,
4651e72d8d2Sderaadt 		   strcmp (vers->ts_rcs, vers->ts_user) == 0 ?
4661e72d8d2Sderaadt 		   SERVER_UPDATED : SERVER_MERGED);
4671e72d8d2Sderaadt 	    }
4681e72d8d2Sderaadt #endif
4691e72d8d2Sderaadt 	}
4701e72d8d2Sderaadt     }
4711e72d8d2Sderaadt }
472