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 an \`--exclude-from=FILE\` flag to mkfs.erofs.

Similar to standard archiving tools, it allows users to supply a text file 
containing a list of paths or regexes to exclude, which are read line-by-line 
and applied to the EROFS build process.

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

diff --git a/mkfs/main.c b/mkfs/main.c
index 07ef086..a6cd251 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -39,6 +39,7 @@ static struct option long_options[] = {
        {"help", no_argument, 0, 'h'},
        {"exclude-path", required_argument, NULL, 2},
        {"exclude-regex", required_argument, NULL, 3},
+       {"exclude-from", required_argument, NULL, 540},
 #ifdef HAVE_LIBSELINUX
        {"file-contexts", required_argument, NULL, 4},
 #endif
@@ -199,6 +200,7 @@ 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-from=X       avoid including files listed in file 
X\n"
 #ifdef HAVE_LIBSELINUX
                " --file-contexts=X      specify a file contexts file to setup 
selinux labels\n"
 #endif
@@ -1246,6 +1248,39 @@ static int mkfs_parse_options_cfg(struct 
erofs_importer_params *params,
                case 7:
                        params->fixed_uid = params->fixed_gid = 0;
                        break;
+               case 540: {
+                       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;
+
+                       while ((read = getline(&line, &len, f)) != -1) {
+                               if (read > 0 && line[read - 1] == '\n') {
+                                       line[read - 1] = '\0';
+                                       read--;
+                               }
+
+                               if (read == 0) continue;
+
+                               opt = erofs_parse_exclude_path(line, false);
+                               if (opt) {
+                                       erofs_err("failed to parse exclude path 
from file: %s",
+                                                 erofs_strerror(opt));
+                                       free(line);
+                                       fclose(f);
+                                       return opt;
+                               }
+                       }
+                       free(line);
+                       fclose(f);
+                       break;
+                       }
+
 #ifndef NDEBUG
                case 8:
                        cfg.c_random_pclusterblks = true;
-- 
2.51.0


Reply via email to