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