From 4105dc5f4b26f45651e5734d785566572247695b Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Fri, 8 Jan 2010 12:55:30 +0100
Subject: [PATCH] VCS[SVN]: svn add: Accommodate for older Mac-versions.

by adding directories in a loop. Introduce #ifdef for Macs in the hopes
that the code can be deprecated at some time.
---
 src/plugins/subversion/subversionplugin.cpp | 40 +++++++++++++++++++++
 src/plugins/subversion/subversionplugin.h   |  2 ++
 2 files changed, 42 insertions(+)

diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 3321652c6bb..e83d3262c08 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -1019,6 +1019,16 @@ SubversionPlugin *SubversionPlugin::subversionPluginInstance()
 }
 
 bool SubversionPlugin::vcsAdd(const QString &workingDir, const QString &rawFileName)
+{
+#ifdef Q_OS_MAC // See below.
+    return vcsAdd14(workingDir, rawFileName);
+#else
+    return vcsAdd15(workingDir, rawFileName);
+#endif
+}
+
+// Post 1.4 add: Use "--parents" to add directories
+bool SubversionPlugin::vcsAdd15(const QString &workingDir, const QString &rawFileName)
 {
     const QString file = QDir::toNativeSeparators(rawFileName);
     QStringList args;
@@ -1027,6 +1037,36 @@ bool SubversionPlugin::vcsAdd(const QString &workingDir, const QString &rawFileN
     return !response.error;
 }
 
+// Pre 1.5 add: Add directories in a loop. To be deprecated
+// once Mac ships newer svn-versions
+bool SubversionPlugin::vcsAdd14(const QString &workingDir, const QString &rawFileName)
+{
+    const QChar slash = QLatin1Char('/');
+    const QStringList relativePath = rawFileName.split(slash);
+    // Add directories (dir1/dir2/file.cpp) in a loop.
+    if (relativePath.size() > 1) {
+        QString path;
+        const int lastDir = relativePath.size() - 1;
+        for (int p = 0; p < lastDir; p++) {
+            if (!path.isEmpty())
+                path += slash;
+            path += relativePath.at(p);
+            if (!managesDirectory(QDir(path))) {
+                QStringList addDirArgs;
+                addDirArgs << QLatin1String("add") << QLatin1String("--non-recursive") << QDir::toNativeSeparators(path);
+                const SubversionResponse addDirResponse = runSvn(workingDir, addDirArgs, m_settings.timeOutMS(), true);
+                if (addDirResponse.error)
+                    return false;
+            }
+        }
+    }
+    // Add file
+    QStringList args;
+    args << QLatin1String("add") << QDir::toNativeSeparators(rawFileName);
+    const SubversionResponse response = runSvn(workingDir, args, m_settings.timeOutMS(), true);
+    return !response.error;
+}
+
 bool SubversionPlugin::vcsDelete(const QString &workingDir, const QString &rawFileName)
 {
     const QString file = QDir::toNativeSeparators(rawFileName);
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index 3a7e3bfb486..d8ca80810ba 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -88,6 +88,8 @@ public:
 
     // IVersionControl
     bool vcsAdd(const QString &workingDir, const QString &fileName);
+    bool vcsAdd14(const QString &workingDir, const QString &fileName);
+    bool vcsAdd15(const QString &workingDir, const QString &fileName);
     bool vcsDelete(const QString &workingDir, const QString &fileName);
     bool managesDirectory(const QString &directory) const;
     QString findTopLevelForDirectory(const QString &directory) const;
-- 
GitLab