[clang-tools-extra] [clangd] gitignore index directories (PR #90305)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 26 17:44:25 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clangd
Author: Sumit Sahrawat (sumit-sahrawat)
<details>
<summary>Changes</summary>
This PR makes `clangd` add a `.gitignore` file when creating index directories (`.cache/clangd/index`), with the content `*`. This makes git repos automatically ignore this directory.
This is similar to the behaviour of tools like meson, which adds a gitignore file to the build directories.
---
Full diff: https://github.com/llvm/llvm-project/pull/90305.diff
2 Files Affected:
- (modified) clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp (+24)
- (modified) clang-tools-extra/clangd/test/background-index.test (+12)
``````````diff
diff --git a/clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp b/clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
index d887b09482a959..2931d5999ee5cd 100644
--- a/clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
+++ b/clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
@@ -33,6 +33,20 @@ std::string getShardPathFromFilePath(llvm::StringRef ShardRoot,
return std::string(ShardRootSS);
}
+std::string getGitignorePathForShardRoot(llvm::StringRef ShardRoot) {
+ llvm::SmallString<128> ShardRootSS(ShardRoot);
+ llvm::sys::path::append(ShardRootSS, ".gitignore");
+ return ShardRootSS.str().str();
+}
+
+llvm::Error addGitignore(llvm::StringRef Directory) {
+ auto FilePath = getGitignorePathForShardRoot(Directory);
+ return llvm::writeFileAtomically(
+ FilePath + ".tmp.%%%%%%%%", FilePath,
+ "# This file is autogenerated by clangd. If you change or delete it, "
+ "it won't be recreated.\n*");
+}
+
// Uses disk as a storage for index shards.
class DiskBackedIndexStorage : public BackgroundIndexStorage {
std::string DiskShardRoot;
@@ -40,12 +54,22 @@ class DiskBackedIndexStorage : public BackgroundIndexStorage {
public:
// Creates `DiskShardRoot` and any parents during construction.
DiskBackedIndexStorage(llvm::StringRef Directory) : DiskShardRoot(Directory) {
+ bool CreatingNewDirectory = !llvm::sys::fs::is_directory(DiskShardRoot);
+
std::error_code OK;
std::error_code EC = llvm::sys::fs::create_directories(DiskShardRoot);
if (EC != OK) {
elog("Failed to create directory {0} for index storage: {1}",
DiskShardRoot, EC.message());
}
+
+ if (CreatingNewDirectory) {
+ llvm::Error error = addGitignore(DiskShardRoot);
+ if (error) {
+ elog("Failed to add .gitignore to directory {0} for index storage: {1}",
+ DiskShardRoot, std::move(error));
+ }
+ }
}
std::unique_ptr<IndexFileIn>
diff --git a/clang-tools-extra/clangd/test/background-index.test b/clang-tools-extra/clangd/test/background-index.test
index 1983f0957dccf1..c937443a79b77e 100644
--- a/clang-tools-extra/clangd/test/background-index.test
+++ b/clang-tools-extra/clangd/test/background-index.test
@@ -18,6 +18,18 @@
# RUN: ls %/t/.cache/clangd/index/foo.cpp.*.idx
# RUN: ls %/t/sub_dir/.cache/clangd/index/foo.h.*.idx
+# Test that the index directories also have a .gitignore file present.
+# RUN: ls %/t/.cache/clangd/index/.gitignore
+# RUN: ls %/t/sub_dir/.cache/clangd/index/.gitignore
+
+# Delete .gitignore files to test that they're not recreated when loading an existing index directory.
+# RUN: rm %/t/.cache/clangd/index/.gitignore
+# RUN: rm %/t/sub_dir/.cache/clangd/index/.gitignore
+
# Test the index is read from disk: delete code and restart clangd.
# RUN: rm %/t/foo.cpp
# RUN: clangd -background-index -lit-test < %/t/definition.jsonrpc | FileCheck %/t/definition.jsonrpc --check-prefixes=CHECK,USE
+
+# Test that the existing index directories do not have recreated .gitignore files.
+# RUN: test ! -e %/t/.cache/clangd/index/.gitignore
+# RUN: test ! -e %/t/sub_dir/.cache/clangd/index/.gitignore
``````````
</details>
https://github.com/llvm/llvm-project/pull/90305
More information about the cfe-commits
mailing list