[clang] [clang-format] Add .clang-format.ignore for ignoring files (PR #76327)
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 26 07:18:44 PST 2023
================
@@ -570,6 +571,74 @@ static int dumpConfig(bool IsSTDIN) {
return 0;
}
+// Check whether `FilePath` is ignored according to the nearest
+// .clang-format-ignore file based on the rules below:
+// - A blank line is skipped.
+// - Leading and trailing spaces of a line are trimmed.
+// - A line starting with a hash (`#`) is a comment.
+// - A non-comment line is a single pattern.
+// - The slash (`/`) is used as the directory separator.
+// - A pattern is relative to the directory of the .clang-format-ignore file (or
+// the root directory if the pattern starts with a slash).
+// - A pattern is negated if it starts with a bang (`!`).
+static bool isIgnored(StringRef FilePath) {
+ using namespace llvm::sys::fs;
+ if (!is_regular_file(FilePath))
+ return false;
+
+ using namespace llvm::sys::path;
+ SmallString<128> Path, AbsPath{FilePath};
+
+ make_absolute(AbsPath);
+ remove_dots(AbsPath, /*remove_dot_dot=*/true);
+
+ StringRef IgnoreDir{AbsPath};
+ do {
+ IgnoreDir = parent_path(IgnoreDir);
+ if (IgnoreDir.empty())
+ return false;
+
+ Path = IgnoreDir;
+ append(Path, ".clang-format-ignore");
+ } while (!is_regular_file(Path));
+
+ std::ifstream IgnoreFile{Path.c_str()};
+ if (!IgnoreFile.good())
+ return false;
+
+ AbsPath = convert_to_slash(AbsPath);
+
+ bool HasMatch = false;
+ for (std::string Pattern; std::getline(IgnoreFile, Pattern);) {
+ Pattern = StringRef(Pattern).trim();
+ if (Pattern.empty() || Pattern[0] == '#')
+ continue;
+
+ const bool IsNegated = Pattern[0] == '!';
+ if (IsNegated)
+ Pattern.erase(0, 1);
+
+ if (Pattern.empty())
+ continue;
+
+ Pattern = StringRef(Pattern).ltrim();
+ if (Pattern[0] != '/') {
+ Path = IgnoreDir;
+ append(Path, Pattern);
+ remove_dots(Path, /*remove_dot_dot=*/true);
+ Pattern = convert_to_slash(Path);
----------------
owenca wrote:
```suggestion
Path = convert_to_slash(IgnoreDir);
append(Path, Style::posix, Pattern);
remove_dots(Path, /*remove_dot_dot=*/true, Style::posix);
Pattern = Path.str();
```
https://github.com/llvm/llvm-project/pull/76327
More information about the cfe-commits
mailing list