From 11e21e16c17964f7734ef9c8b97e3225553b891a Mon Sep 17 00:00:00 2001
From: Tobias Hunger <tobias.hunger@nokia.com>
Date: Mon, 20 Dec 2010 10:24:35 +0100
Subject: [PATCH] Git: Improve handling of git submodules

Task-number: QTCREATORBUG-3390
---
 src/plugins/git/commitdata.cpp | 66 ++++++++++++++++++----------------
 src/plugins/git/gitclient.cpp  |  2 ++
 2 files changed, 37 insertions(+), 31 deletions(-)

diff --git a/src/plugins/git/commitdata.cpp b/src/plugins/git/commitdata.cpp
index 71275202537..b1307515ff8 100644
--- a/src/plugins/git/commitdata.cpp
+++ b/src/plugins/git/commitdata.cpp
@@ -156,39 +156,43 @@ bool CommitData::parseFilesFromStatus(const QString &output)
 
     const QStringList::const_iterator cend = lines.constEnd();
     for (QStringList::const_iterator it =  lines.constBegin(); it != cend; ++it) {
-        const QString line = *it;
+        QString line = *it;
         if (line.startsWith(branchIndicator)) {
             panelInfo.branch = line.mid(branchIndicator.size() + 1);
-        } else {
-            if (line.startsWith(commitIndicator)) {
-                s = CommitFiles;
-            } else {
-                if (line.startsWith(notUpdatedIndicator)) {
-                    s = NotUpdatedFiles;
-                } else {
-                    if (line.startsWith(untrackedIndicator)) {
-                        // Now match untracked: "#<tab>foo.cpp"
-                        s = UntrackedFiles;
-                        filesPattern = QRegExp(QLatin1String("#\\t.+"));
-                        QTC_ASSERT(filesPattern.isValid(), return false);
-                    } else {
-                        if (filesPattern.exactMatch(line)) {
-                            switch (s) {
-                            case CommitFiles:
-                                addStateFileSpecification(line, &stagedFiles);
-                            break;
-                            case NotUpdatedFiles:
-                                addStateFileSpecification(line, &unstagedFiles);
-                                break;
-                            case UntrackedFiles:
-                                untrackedFiles.push_back(line.mid(2).trimmed());
-                                break;
-                            case None:
-                                break;
-                            }
-                        }
-                    }
-                }
+            continue;
+        }
+        if (line.startsWith(commitIndicator)) {
+            s = CommitFiles;
+            continue;
+        }
+        if (line.startsWith(notUpdatedIndicator)) {
+            s = NotUpdatedFiles;
+            continue;
+        }
+        if (line.startsWith(untrackedIndicator)) {
+            // Now match untracked: "#<tab>foo.cpp"
+            s = UntrackedFiles;
+            filesPattern = QRegExp(QLatin1String("#\\t.+"));
+            QTC_ASSERT(filesPattern.isValid(), return false);
+            continue;
+        }
+        if (filesPattern.exactMatch(line)) {
+            switch (s) {
+            case CommitFiles:
+                addStateFileSpecification(line, &stagedFiles);
+                break;
+            case NotUpdatedFiles:
+                // skip submodules:
+                if (line.endsWith(QLatin1String(" (modified content)"))
+                        || line.endsWith(" (new commits)"))
+                    line = line.left(line.lastIndexOf(QLatin1Char('(')) - 1);
+                addStateFileSpecification(line, &unstagedFiles);
+                break;
+            case UntrackedFiles:
+                untrackedFiles.push_back(line.mid(2).trimmed());
+                break;
+            case None:
+                break;
             }
         }
     }
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index be02c7fadb4..fce5c71102e 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -1801,6 +1801,8 @@ bool GitClient::getCommitData(const QString &workingDirectory,
     //    #   (use "git add <file>..." to update what will be committed)
     //    #
     //    #       modified:   someother.cpp
+    //    #       modified:   submodule (modified content)
+    //    #       modified:   submodule2 (new commit)
     //    #
     //    # Untracked files:
     //    #   (use "git add <file>..." to include in what will be committed)
-- 
GitLab