Currently, users who want to exclude multiple specific files or paths
must pass them one-by-one using --exclude-path or --exclude-regex via
the command line. This becomes cumbersome for complex build systems
with dozens of exclusions.

This patch introduces --exclude-path-from=FILE and
--exclude-regex-from=FILE flags to mkfs.erofs. Similar to standard
archiving tools, they allow users to supply a text file containing a
list of literal paths or regular expressions to exclude, which are
read line-by-line and applied to the EROFS build process.

Signed-off-by: Nithurshen <[email protected]>
---
 mkfs/main.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/mkfs/main.c b/mkfs/main.c
index 07ef086..1240771 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -39,6 +39,8 @@ static struct option long_options[] = {
        {"help", no_argument, 0, 'h'},
        {"exclude-path", required_argument, NULL, 2},
        {"exclude-regex", required_argument, NULL, 3},
+       {"exclude-path-from", required_argument, NULL, 540},
+       {"exclude-regex-from", required_argument, NULL, 541},
 #ifdef HAVE_LIBSELINUX
        {"file-contexts", required_argument, NULL, 4},
 #endif
@@ -199,6 +201,8 @@ static void usage(int argc, char **argv)
                " --dsunit=#             align all data block addresses to 
multiples of #\n"
                " --exclude-path=X       avoid including file X (X = exact 
literal path)\n"
                " --exclude-regex=X      avoid including files that match X (X 
= regular expression)\n"
+               " --exclude-path-from=X  avoid including files listed in file 
X\n"
+               " --exclude-regex-from=X avoid including regexes listed in file 
X\n"
 #ifdef HAVE_LIBSELINUX
                " --file-contexts=X      specify a file contexts file to setup 
selinux labels\n"
 #endif
@@ -1246,6 +1250,41 @@ static int mkfs_parse_options_cfg(struct 
erofs_importer_params *params,
                case 7:
                        params->fixed_uid = params->fixed_gid = 0;
                        break;
+                       case 540:
+                       case 541: {
+                               FILE *f = fopen(optarg, "r");
+                               if (!f) {
+                                       erofs_err("failed to open exclude file: 
%s", optarg);
+                                       return -errno;
+                               }
+
+                               char *line = NULL;
+                               size_t len = 0;
+                               ssize_t read;
+                               bool is_regex = (opt == 541);
+
+                               while ((read = getline(&line, &len, f)) != -1) {
+                                       if (read > 0 && line[read - 1] == '\n') 
{
+                                               line[read - 1] = '\0';
+                                               read--;
+                                       }
+
+                                       if (read == 0) continue;
+
+                                       err = erofs_parse_exclude_path(line, 
is_regex);
+                                       if (err) {
+                                               erofs_err("failed to parse 
exclude rule from file: %s",
+                                                         erofs_strerror(err));
+                                               free(line);
+                                               fclose(f);
+                                               return err;
+                                       }
+                               }
+                               free(line);
+                               fclose(f);
+                               break;
+                       }
+
 #ifndef NDEBUG
                case 8:
                        cfg.c_random_pclusterblks = true;
-- 
2.51.0


Reply via email to