[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