From 455a85bd861edab91dea9d03765187154329e208 Mon Sep 17 00:00:00 2001
From: cerf <delorme.hugues@gmail.com>
Date: Tue, 15 Mar 2011 15:47:45 +0100
Subject: [PATCH] Bazaar: set global Bazaar user ID when changed

This ID is automatically set when the user settings have been changed
and applied from the "Options" dialog. This calls 'bzr whoami' under
the hood

Merge-request: 275
Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com>
---
 src/plugins/bazaar/bazaarclient.cpp   | 10 ++++++++++
 src/plugins/bazaar/bazaarclient.h     |  1 +
 src/plugins/bazaar/bazaarplugin.cpp   |  5 ++++-
 src/plugins/bazaar/bazaarsettings.cpp |  5 +++++
 src/plugins/bazaar/bazaarsettings.h   |  1 +
 src/plugins/vcsbase/vcsbaseclient.cpp |  5 +++++
 src/plugins/vcsbase/vcsbaseclient.h   |  2 ++
 7 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/plugins/bazaar/bazaarclient.cpp b/src/plugins/bazaar/bazaarclient.cpp
index 3f7d2920539..e45f0b4f374 100644
--- a/src/plugins/bazaar/bazaarclient.cpp
+++ b/src/plugins/bazaar/bazaarclient.cpp
@@ -34,6 +34,7 @@
 #include "bazaarclient.h"
 #include "constants.h"
 
+#include <vcsbase/vcsbaseclientsettings.h>
 #include <vcsbase/vcsbaseplugin.h>
 
 #include <QtCore/QDir>
@@ -74,6 +75,15 @@ BazaarClient::BazaarClient(const VCSBase::VCSBaseClientSettings &settings) :
 {
 }
 
+bool BazaarClient::synchronousSetUserId()
+{
+    QStringList args;
+    args << QLatin1String("whoami")
+         << QString("%1 <%2>").arg(settings().userName()).arg(settings().email());
+    QByteArray stdOut;
+    return vcsFullySynchronousExec(QDir::currentPath(), args, &stdOut);
+}
+
 BranchInfo BazaarClient::synchronousBranchQuery(const QString &repositoryRoot) const
 {
     QFile branchConfFile(repositoryRoot + QDir::separator() +
diff --git a/src/plugins/bazaar/bazaarclient.h b/src/plugins/bazaar/bazaarclient.h
index 93133f98fb6..e1118b3a814 100644
--- a/src/plugins/bazaar/bazaarclient.h
+++ b/src/plugins/bazaar/bazaarclient.h
@@ -71,6 +71,7 @@ public:
 
     BazaarClient(const VCSBase::VCSBaseClientSettings &settings);
 
+    bool synchronousSetUserId();
     BranchInfo synchronousBranchQuery(const QString &repositoryRoot) const;
     virtual QString findTopLevelForFile(const QFileInfo &file) const;
 
diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp
index cf4680dd754..e0cb34f666b 100644
--- a/src/plugins/bazaar/bazaarplugin.cpp
+++ b/src/plugins/bazaar/bazaarplugin.cpp
@@ -205,7 +205,10 @@ const BazaarSettings &BazaarPlugin::settings() const
 void BazaarPlugin::setSettings(const BazaarSettings &settings)
 {
     if (settings != m_bazaarSettings) {
-        m_bazaarSettings = settings;
+      const bool userIdChanged = !m_bazaarSettings.sameUserId(settings);
+      m_bazaarSettings = settings;
+      if (userIdChanged)
+          client()->synchronousSetUserId();
     }
 }
 
diff --git a/src/plugins/bazaar/bazaarsettings.cpp b/src/plugins/bazaar/bazaarsettings.cpp
index e105f4b3fb8..0027e62a1fb 100644
--- a/src/plugins/bazaar/bazaarsettings.cpp
+++ b/src/plugins/bazaar/bazaarsettings.cpp
@@ -48,5 +48,10 @@ BazaarSettings& BazaarSettings::operator=(const BazaarSettings& other)
     return *this;
 }
 
+bool BazaarSettings::sameUserId(const BazaarSettings& other) const
+{
+    return userName() == other.userName() && email() == other.email();
+}
+
 } // namespace Internal
 } // namespace Bazaar
diff --git a/src/plugins/bazaar/bazaarsettings.h b/src/plugins/bazaar/bazaarsettings.h
index a683b34465b..58cd6a359c8 100644
--- a/src/plugins/bazaar/bazaarsettings.h
+++ b/src/plugins/bazaar/bazaarsettings.h
@@ -44,6 +44,7 @@ class BazaarSettings : public VCSBase::VCSBaseClientSettings
 public:
     BazaarSettings();
     BazaarSettings& operator=(const BazaarSettings& other);
+    bool sameUserId(const BazaarSettings& other) const;
 };
 
 } // namespace Internal
diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp
index edc48f7e88b..496c86ff3d0 100644
--- a/src/plugins/vcsbase/vcsbaseclient.cpp
+++ b/src/plugins/vcsbase/vcsbaseclient.cpp
@@ -427,6 +427,11 @@ void VCSBaseClient::commit(const QString &repositoryRoot,
     enqueueJob(job);
 }
 
+const VCSBaseClientSettings &VCSBaseClient::settings() const
+{
+    return d->m_clientSettings;
+}
+
 void VCSBaseClient::settingsChanged()
 {
     if (d->m_jobManager) {
diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h
index e20b32c82b2..a9ef78eb7c6 100644
--- a/src/plugins/vcsbase/vcsbaseclient.h
+++ b/src/plugins/vcsbase/vcsbaseclient.h
@@ -105,6 +105,8 @@ public:
 
     virtual QString findTopLevelForFile(const QFileInfo &file) const = 0;
 
+    const VCSBaseClientSettings &settings() const;
+
 signals:
     void parsedStatus(const QList<QPair<QString, QString> > &statusList);
     // Passes on changed signals from VCSJob to Control
-- 
GitLab