diff options
-rw-r--r-- | gnu/usr.bin/cvs/src/ignore.c | 117 |
1 files changed, 107 insertions, 10 deletions
diff --git a/gnu/usr.bin/cvs/src/ignore.c b/gnu/usr.bin/cvs/src/ignore.c index c4bf510ecd1..78689a4cd20 100644 --- a/gnu/usr.bin/cvs/src/ignore.c +++ b/gnu/usr.bin/cvs/src/ignore.c @@ -24,14 +24,18 @@ static int ign_count; /* Number of active entries */ static int s_ign_count = 0; static int ign_size; /* This many slots available (plus * one for a NULL) */ -static int ign_hold; /* Index where first "temporary" item - * is held */ +static int ign_hold = -1; /* Index where first "temporary" item + * is held, -1 if none. */ -const char *ign_default = ". .. core RCSLOG tags TAGS RCS SCCS .make.state .nse_depinfo #* .#* cvslog.* ,* CVS* .del-* *.a *.o *.so *.Z *~ *.old *.elc *.ln *.bak *.BAK *.orig *.rej"; +const char *ign_default = ". .. core RCSLOG tags TAGS RCS SCCS .make.state .nse_depinfo #* .#* cvslog.* ,* CVS CVS.adm .del-* *.a *.o *.obj *.so *.Z *~ *.old *.elc *.ln *.bak *.BAK *.orig *.rej"; #define IGN_GROW 16 /* grow the list by 16 elements at a * time */ +/* Nonzero if we have encountered an -I ! directive, which means one should + no longer ask the server about what is in CVSROOTADM_IGNORE. */ +int ign_inhibit_server; + /* * To the "ignore list", add the hard-coded default ignored wildcards above, * the wildcards found in $CVSROOT/CVSROOT/cvsignore, the wildcards found in @@ -45,14 +49,26 @@ ign_setup () char file[PATH_MAX]; char *tmp; + ign_inhibit_server = 0; + /* Start with default list and special case */ tmp = xstrdup (ign_default); ign_add (tmp, 0); free (tmp); - /* Then add entries found in repository, if it exists */ - (void) sprintf (file, "%s/%s/%s", CVSroot, CVSROOTADM, CVSROOTADM_IGNORE); - ign_add_file (file, 0); +#ifdef CLIENT_SUPPORT + /* The client handles another way, by (after it does its own ignore file + processing, and only if !ign_inhibit_server), letting the server + know about the files and letting it decide whether to ignore + them based on CVSROOOTADM_IGNORE. */ + if (!client_active) +#endif + { + /* Then add entries found in repository, if it exists */ + (void) sprintf (file, "%s/%s/%s", CVSroot, CVSROOTADM, + CVSROOTADM_IGNORE); + ign_add_file (file, 0); + } /* Then add entries found in home dir, (if user has one) and file exists */ if ((pw = (struct passwd *) getpwuid (getuid ())) && pw->pw_dir) @@ -99,7 +115,7 @@ ign_add_file (file, hold) if (hold) { /* re-set if we had already done a temporary file */ - if (ign_hold) + if (ign_hold >= 0) { int i; @@ -118,7 +134,7 @@ ign_add_file (file, hold) fp = fopen (file, "r"); if (fp == NULL) { - if (errno != ENOENT) + if (! existence_error (errno)) error (0, errno, "cannot open %s", file); return; } @@ -165,18 +181,21 @@ ign_add (ign, hold) /* if we are doing a '!', continue; otherwise add the '*' */ if (*ign == '!') + { + ign_inhibit_server = 1; continue; + } } else if (*ign == '!') { /* temporarily reset the ignore list */ int i; - if (ign_hold) + if (ign_hold >= 0) { for (i = ign_hold; i < ign_count; i++) free (ign_list[i]); - ign_hold = 0; + ign_hold = -1; } s_ign_list = (char **) xmalloc (ign_count * sizeof (char *)); for (i = 0; i < ign_count; i++) @@ -273,3 +292,81 @@ int ignore_directory (name) return 0; } + +/* + * Process the current directory, looking for files not in ILIST and not on + * the global ignore list for this directory. If we find one, call PROC + * passing it the name of the file and the update dir. + */ +void +ignore_files (ilist, update_dir, proc) + List *ilist; + char *update_dir; + Ignore_proc proc; +{ + DIR *dirp; + struct dirent *dp; + struct stat sb; + char *file; + char *xdir; + + /* we get called with update_dir set to "." sometimes... strip it */ + if (strcmp (update_dir, ".") == 0) + xdir = ""; + else + xdir = update_dir; + + dirp = opendir ("."); + if (dirp == NULL) + return; + + ign_add_file (CVSDOTIGNORE, 1); + wrap_add_file (CVSDOTWRAPPER, 1); + + while ((dp = readdir (dirp)) != NULL) + { + file = dp->d_name; + if (strcmp (file, ".") == 0 || strcmp (file, "..") == 0) + continue; + if (findnode_fn (ilist, file) != NULL) + continue; + + if ( +#ifdef DT_DIR + dp->d_type != DT_UNKNOWN || +#endif + lstat(file, &sb) != -1) + { + + if ( +#ifdef DT_DIR + dp->d_type == DT_DIR || dp->d_type == DT_UNKNOWN && +#endif + S_ISDIR(sb.st_mode)) + { + char temp[PATH_MAX]; + + (void) sprintf (temp, "%s/%s", file, CVSADM); + if (isdir (temp)) + continue; + } +#ifdef S_ISLNK + else if ( +#ifdef DT_DIR + dp->d_type == DT_LNK || dp->d_type == DT_UNKNOWN && +#endif + S_ISLNK(sb.st_mode)) + { + continue; + } +#endif + } + + /* We could be ignoring FIFOs and other files which are neither + regular files nor directories here. */ + if (ign_name (file)) + continue; + (*proc) (file, xdir); + } + (void) closedir (dirp); +} |