diff --git a/src/main/java/org/cobbzilla/util/main/FileHeaderMain.java b/src/main/java/org/cobbzilla/util/main/FileHeaderMain.java index d826dfa..96da57c 100644 --- a/src/main/java/org/cobbzilla/util/main/FileHeaderMain.java +++ b/src/main/java/org/cobbzilla/util/main/FileHeaderMain.java @@ -3,7 +3,10 @@ package org.cobbzilla.util.main; import org.cobbzilla.util.io.FileUtil; import org.cobbzilla.util.io.FilesystemWalker; +import java.io.File; +import java.util.Arrays; import java.util.Map; +import java.util.Objects; import java.util.regex.Matcher; import static org.cobbzilla.util.io.FileUtil.*; @@ -15,43 +18,55 @@ public class FileHeaderMain extends BaseMain { @Override protected void run() throws Exception { final FileHeaderOptions opts = getOptions(); final Map headers = opts.getHeaders(); - new FilesystemWalker() - .withDir(opts.getDir()) - .withVisitor(file -> { - if (opts.exclude(file)) { - err("excluding: "+abs(file)); - return; - } - final String ext = FileUtil.extension(file); - final FileHeader header = headers.get(ext.length() > 0 ? ext.substring(1) : ext); - if (header != null) { - String contents = toStringOrDie(file); - if (contents == null) contents = ""; - final String prefix; - if (header.hasPrefix()) { - final Matcher prefixMatcher = header.getPrefixPattern().matcher(contents); - if (!prefixMatcher.find()) { - err("prefix not found ("+header.getPrefix().replace("\n", "\\n")+") in file: "+abs(file)); - prefix = ""; - } else { - prefix = contents.substring(0, prefixMatcher.start()) - + contents.substring(prefixMatcher.start(), prefixMatcher.end()); - contents = contents.substring(prefixMatcher.end()); - } - } else { - prefix = ""; - } - final Matcher matcher = header.getPattern().matcher(contents); - if (matcher.find()) { - contents = prefix + contents.substring(0, matcher.start()) - + header.getHeader() + "\n" + contents.substring(matcher.end()); - } else { - contents = prefix + header.getHeader() + "\n" + contents; - } - out(abs(file)); - toFileOrDie(file, contents); - } - }).walk(); + if (opts.isShallow()) { + Arrays.stream(Objects.requireNonNull(opts.getDir().listFiles())) + .forEach(file -> processFile(opts, headers, file)); + } else { + new FilesystemWalker() + .withDir(opts.getDir()) + .withVisitor(file -> processFile(opts, headers, file)) + .walk(); + } + } + + private void processFile(FileHeaderOptions opts, Map headers, File file) { + if (opts.exclude(file)) { + err("excluding: "+abs(file)); + return; + } + if (!file.isFile()) { + err("skipping non-file: "+abs(file)); + return; + } + final String ext = FileUtil.extension(file); + final FileHeader header = headers.get(ext.length() > 0 ? ext.substring(1) : ext); + if (header != null) { + String contents = toStringOrDie(file); + if (contents == null) contents = ""; + final String prefix; + if (header.hasPrefix()) { + final Matcher prefixMatcher = header.getPrefixPattern().matcher(contents); + if (!prefixMatcher.find()) { + err("prefix not found ("+header.getPrefix().replace("\n", "\\n")+") in file: "+abs(file)); + prefix = ""; + } else { + prefix = contents.substring(0, prefixMatcher.start()) + + contents.substring(prefixMatcher.start(), prefixMatcher.end()); + contents = contents.substring(prefixMatcher.end()); + } + } else { + prefix = ""; + } + final Matcher matcher = header.getPattern().matcher(contents); + if (matcher.find()) { + contents = prefix + contents.substring(0, matcher.start()) + + header.getHeader() + "\n" + contents.substring(matcher.end()); + } else { + contents = prefix + header.getHeader() + "\n" + contents; + } + out(abs(file)); + toFileOrDie(file, contents); + } } } diff --git a/src/main/java/org/cobbzilla/util/main/FileHeaderOptions.java b/src/main/java/org/cobbzilla/util/main/FileHeaderOptions.java index c552652..b73c91d 100644 --- a/src/main/java/org/cobbzilla/util/main/FileHeaderOptions.java +++ b/src/main/java/org/cobbzilla/util/main/FileHeaderOptions.java @@ -29,6 +29,12 @@ public class FileHeaderOptions extends BaseMainOptions { @Option(name=OPT_DIR, aliases=LONGOPT_DIR, usage=USAGE_DIR, required=true) @Getter @Setter private File dir; + public static final String USAGE_SHALLOW = "Do not recurse into subdirectories"; + public static final String OPT_SHALLOW = "-S"; + public static final String LONGOPT_SHALLOW = "--shallow"; + @Option(name=OPT_SHALLOW, aliases=LONGOPT_SHALLOW, usage=USAGE_SHALLOW) + @Getter @Setter private boolean shallow = false; + public static final String USAGE_HEADERS_JSON = "JSON file with header info, or - to read from stdin"; public static final String OPT_HEADERS_JSON = "-H"; public static final String LONGOPT_HEADERS_JSON = "--headers";