[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kate] addons/project: project plugin: git: list submodules files too
From: Michal Humpula <michal.humpula () hudrydum ! cz>
Date: 2015-09-29 18:19:04
Message-ID: E1ZgzUW-0002W4-SX () scm ! kde ! org
[Download RAW message or body]
Git commit f8f38c6c04266a238b3fde2454c8b0d23d46e06b by Michal Humpula.
Committed on 29/09/2015 at 18:18.
Pushed by michalhumpula into branch 'master'.
project plugin: git: list submodules files too
REVIEW: 125409
M +69 -16 addons/project/kateprojectworker.cpp
http://commits.kde.org/kate/f8f38c6c04266a238b3fde2454c8b0d23d46e06b
diff --git a/addons/project/kateprojectworker.cpp b/addons/project/kateprojectworker.cpp
index 5433ee8..5d0be85 100644
--- a/addons/project/kateprojectworker.cpp
+++ b/addons/project/kateprojectworker.cpp
@@ -249,37 +249,84 @@ namespace {
bool recursive;
QString basedir;
};
-}
-
-QStringList KateProjectWorker::filesFromGit(const QDir &dir, bool recursive)
-{
- QStringList files;
- git_repository *repo = nullptr;
- git_object *root_tree = nullptr, *tree = nullptr;
- const char *working_dir;
- QDir workdir;
- QString relpath;
- struct git_walk_payload payload = {&files, recursive, dir.absolutePath()};
- auto callback = [] (const char *root, const git_tree_entry *entry, void *payload) -> int {
+ int gitTreeWalker(const char *root, const git_tree_entry *entry, void *payload)
+ {
struct git_walk_payload *data = static_cast<git_walk_payload *>(payload);
if (git_tree_entry_type(entry) == GIT_OBJ_BLOB) {
QString name = QString::fromUtf8(git_tree_entry_name(entry));
QString dir = QString::fromUtf8(root);
- QString filepath = QDir(data->basedir + QDir::separator() + dir).filePath(name);
+ QString filepath = QDir(data->basedir + dir).filePath(name);
data->files->append(filepath);
} else if (git_tree_entry_type(entry) == GIT_OBJ_TREE && !data->recursive) {
return 1; // don't walk that way
}
return 0;
- };
+ }
+
+ QStringList gitSearchTree(git_object *tree, const QString &basedir, bool recursive)
+ {
+ QStringList files;
+ struct git_walk_payload payload = {&files, recursive, basedir};
+
+ git_tree_walk((git_tree *)tree, GIT_TREEWALK_PRE, gitTreeWalker, (void *)&payload);
+
+ return files;
+ }
+
+ int gitSubmoduleWalker(git_submodule *submodule, const char *, void *payload)
+ {
+ struct git_walk_payload *data = static_cast<git_walk_payload *>(payload);
+
+ git_repository *repo = nullptr;
+
+ if (git_submodule_open(&repo, submodule)) {
+ return 1;
+ }
+
+ git_object *tree = nullptr;
+
+ if (git_revparse_single(&tree, repo, "HEAD^{tree}")) {
+ git_repository_free(repo);
+ return 2;
+ }
+
+ QString submodulePath = QString::fromUtf8(git_submodule_path(submodule));
+ QString basedir = data->basedir + submodulePath + QDir::separator();
+
+ data->files->append(gitSearchTree(tree, basedir, true));
+
+ git_object_free(tree);
+ git_repository_free(repo);
+ return 0;
+ }
+
+ QStringList gitSearchSubmodules(git_repository *repo, const QString &workdir)
+ {
+ QStringList files;
+
+ struct git_walk_payload payload = {&files, true, workdir};
+ git_submodule_foreach(repo, gitSubmoduleWalker, (void *)&payload);
+
+ return files;
+ }
+}
+
+QStringList KateProjectWorker::filesFromGit(const QDir &dir, bool recursive)
+{
+ QStringList files;
+ git_repository *repo = nullptr;
+ git_object *root_tree = nullptr, *tree = nullptr;
+ const char *working_dir;
+ QDir workdir;
+ QString relpath;
git_libgit2_init();
if (git_repository_open_ext(&repo, dir.path().toUtf8().data(), 0, NULL)) {
- return QStringList();
+ return files;
}
if ((working_dir = git_repository_workdir(repo)) == nullptr) {
@@ -308,7 +355,13 @@ QStringList KateProjectWorker::filesFromGit(const QDir &dir, bool recursive)
}
}
- git_tree_walk((git_tree *)tree, GIT_TREEWALK_PRE, callback, (void *)&payload);
+ QString path = workdir.absolutePath() + QDir::separator();
+
+ files.append(gitSearchTree(tree, path, recursive));
+
+ if (recursive && relpath.isEmpty()) {
+ files.append(gitSearchSubmodules(repo, path));
+ }
if (tree != root_tree) {
git_object_free(tree);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic