diff options
Diffstat (limited to 'contrib/cvs/src/classify.c')
-rw-r--r-- | contrib/cvs/src/classify.c | 68 |
1 files changed, 48 insertions, 20 deletions
diff --git a/contrib/cvs/src/classify.c b/contrib/cvs/src/classify.c index 8bb471d..d8bf399 100644 --- a/contrib/cvs/src/classify.c +++ b/contrib/cvs/src/classify.c @@ -17,6 +17,50 @@ static void sticky_ck PROTO ((struct file_info *finfo, int aflag, Vers_TS * vers)); + + +static inline int keywords_may_change PROTO ((int aflag, Vers_TS * vers)); +static inline int +keywords_may_change (aflag, vers) + int aflag; + Vers_TS * vers; +{ + int retval; + + if (/* Options are different... */ + strcmp (vers->entdata->options, vers->options) + /* ...or... */ + || (/* ...clearing stickies... */ + aflag + /* ...and... */ + && (/* ...there used to be a tag which subs in Name keys... */ + (vers->entdata->tag && !isdigit (vers->entdata->tag[0])) + /* ...or there used to be a keyword mode which may be + * changed by -A... + */ + || (strlen (vers->entdata->options) + && strcmp (vers->entdata->options, "-kkv") + && strcmp (vers->entdata->options, "-kb")))) + /* ...or... */ + || (/* ...this is not commit... */ + strcmp (cvs_cmd_name, "commit") + /* ...and... */ + && (/* ...the tag is changing in a way that affects Name keys... */ + (vers->entdata->tag && vers->tag + && strcmp (vers->entdata->tag, vers->tag) + && !(isdigit (vers->entdata->tag[0]) + && isdigit (vers->entdata->tag[0]))) + || (!vers->entdata->tag && vers->tag + && !isdigit (vers->tag[0]))))) + retval = 1; + else + retval = 0; + + return retval; +} + + + /* * Classify the state of a file */ @@ -297,15 +341,14 @@ Classify_File (finfo, tag, date, options, force_tag_match, aflag, versp, */ /* TODO: decide whether we need to check file permissions for a mismatch, and return T_CONFLICT if so. */ - if (vers->entdata->options && - strcmp (vers->entdata->options, vers->options) != 0) - ret = T_CHECKOUT; + if (keywords_may_change (aflag, vers)) + ret = T_PATCH; else if (vers->ts_conflict) ret = T_CONFLICT; else { - sticky_ck (finfo, aflag, vers); ret = T_UPTODATE; + sticky_ck (finfo, aflag, vers); } } else if (No_Difference (finfo, vers)) @@ -366,29 +409,14 @@ Classify_File (finfo, tag, date, options, force_tag_match, aflag, versp, ret = T_CHECKOUT; } 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; - } + ret = T_PATCH; else if (No_Difference (finfo, vers)) /* really modified, needs to merge */ ret = T_NEEDS_MERGE; - else if ((strcmp (vers->entdata->options ? - vers->entdata->options : "", vers->options) - != 0) - || (vers->srcfile != NULL - && (vers->srcfile->flags & INATTIC) != 0)) - /* not really modified, check it out */ - ret = T_CHECKOUT; else ret = T_PATCH; } |