--- classify.c.old 2005-06-16 19:19:30.000000000 -0700 +++ classify.c 2005-06-16 22:52:13.000000000 -0700 @@ -341,7 +341,7 @@ } else { - /* The RCS file is a newer version than the user file */ + /* The RCS file version does not match the user file */ if (vers->ts_user == NULL) { @@ -354,19 +354,43 @@ error (0, 0, "warning: %s was lost", finfo->fullname); ret = T_CHECKOUT; } + /* if vers->tag is set, then we could be updating a file + on a branch, which if the file hasn't been modified on the + branch, could wind up being a lower version than our file + basically: + add 1.1 + tag -b foo + remove (dead 1.2) + add (1.3) + update -r foo (vn_rcs == 1.1, vn_user == 1.3) + (see resurrection tests) + */ else if (strcmp (vers->ts_user, vers->ts_rcs) == 0) { - - /* - * The user file is still unmodified, so just get it as well - */ - 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 (((!vers->tag) || (0 == strcmp(vers->tag, "HEAD"))) + && (!vers->date) + /* comparing versions is only reliable if numdots is the same */ + && (numdots(vers->vn_user) == numdots(vers->vn_rcs)) + && (compare_revnums(vers->vn_user, vers->vn_rcs) > 0)) + { + ret = T_MODIFIED; + error (1, 0, "file '%s` has revision %s, but the repository only has %s\n", + finfo->fullname, vers->vn_user, vers->vn_rcs); + + } else { + + + /* + * The user file is still unmodified, so just get it as well + */ + 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)) /* really modified, needs to merge */