From 324565cfc142b08e957f02d97f97309d06130342 Mon Sep 17 00:00:00 2001 From: Semenova Date: Tue, 9 Jul 2013 15:40:02 +0400 Subject: [PATCH 1/8] Corrected subversion plugin --- plugins/plugins.pro | 2 +- plugins/subversionClient/subversionClient.pro | 1 + plugins/subversionClient/subversionPlugin.cpp | 56 +++++++++++---- plugins/subversionClient/subversionPlugin.h | 4 ++ plugins/subversionClient/tags.h | 27 +++++++ .../authenticationSettingsWidget.cpp | 6 ++ qrutils/versioningUtils/boolCallback.h | 72 ------------------- .../externalClientPluginBase.cpp | 12 ++-- .../externalClientPluginBase.h | 7 +- qrutils/versioningUtils/versioningUtils.pri | 1 - 10 files changed, 91 insertions(+), 97 deletions(-) create mode 100644 plugins/subversionClient/tags.h delete mode 100644 qrutils/versioningUtils/boolCallback.h diff --git a/plugins/plugins.pro b/plugins/plugins.pro index 43650e5918..c44732e73f 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -15,7 +15,7 @@ SUBDIRS = \ # requirements/requirements.pro \ # robots/robots.pro \ # sbt/sbt.pro \ - subversionClient/subversionClient.pro \ + subversionClient/subversionClient.pro \ # testEditor/testEditor.pro \ # testInvocation/testInvocation.pro \ # ubiq/ubiq.pro \ diff --git a/plugins/subversionClient/subversionClient.pro b/plugins/subversionClient/subversionClient.pro index 82b49db118..8483b393db 100644 --- a/plugins/subversionClient/subversionClient.pro +++ b/plugins/subversionClient/subversionClient.pro @@ -19,6 +19,7 @@ HEADERS = \ gui/commitDialog.h \ gui/versioningPage.h \ ../../qrgui/dialogs/preferencesPages/preferencesPage.h \ + tags.h SOURCES = \ subversionPlugin.cpp \ diff --git a/plugins/subversionClient/subversionPlugin.cpp b/plugins/subversionClient/subversionPlugin.cpp index c1deb04d06..caa581eb37 100644 --- a/plugins/subversionClient/subversionPlugin.cpp +++ b/plugins/subversionClient/subversionPlugin.cpp @@ -3,6 +3,7 @@ #include "subversionPlugin.h" #include "../../qrkernel/settingsManager.h" #include "../../qrutils/fileSystemUtils.h" +#include "tags.h" using namespace versioning; using namespace qReal::versioning; @@ -16,6 +17,8 @@ SubversionPlugin::SubversionPlugin() { qReal::SettingsManager::instance()->setValue("svnTempDir", mTempDir); setPathToClient(pathToSvn()); + + connect(this, SIGNAL(operationIsFinished(QVariant&)), SLOT(doAfterOperationIsFinished(QVariant&))); } SubversionPlugin::~SubversionPlugin() @@ -142,10 +145,11 @@ void SubversionPlugin::startCheckout(QString const &from arguments << QString::number(revision); } arguments << authenticationArgs(); - invokeOperationAsync(arguments - , new invocation::BoolClassMemberCallback(this - , &SubversionPlugin::onCheckoutComplete, targetProject, quiet) - , false, QString(), QString(), false, !quiet); + + Tag tagStruct("checkout", targetProject, quiet); + QVariant tagVariant; + tagVariant.setValue(tagStruct); + invokeOperationAsync(arguments, tagVariant, false, QString(), QString(), false, !quiet); } void SubversionPlugin::startUpdate(QString const &to @@ -155,9 +159,13 @@ void SubversionPlugin::startUpdate(QString const &to QStringList arguments; arguments << "update" << targetDir; arguments << authenticationArgs(); - invokeOperationAsync(arguments - , new invocation::BoolClassMemberCallback(this, &SubversionPlugin::onUpdateComplete) - , true, to, sourceProject); + + QString emptyString = ""; + QString const &emptyStringAdress = emptyString; + Tag tagStruct("update", emptyStringAdress, false); + QVariant tagVariant; + tagVariant.setValue(tagStruct); + invokeOperationAsync(arguments, tagVariant, true, to, sourceProject); } void SubversionPlugin::startCommit(QString const &message, QString const &from @@ -167,9 +175,13 @@ void SubversionPlugin::startCommit(QString const &message, QString const &from QStringList arguments; arguments << "commit" << targetDir << "-m" << message; arguments << authenticationArgs(); - invokeOperationAsync(arguments - , new invocation::BoolClassMemberCallback(this, &SubversionPlugin::onCommitComplete) - , true, from, sourceProject); + + QString emptyString = ""; + QString const &emptyStringAdress = emptyString; + Tag tagStruct("commit", emptyStringAdress, false); + QVariant tagVariant; + tagVariant.setValue(tagStruct); + invokeOperationAsync(arguments, tagVariant, true, from, sourceProject); } bool SubversionPlugin::doCleanUp(QString const &what @@ -191,9 +203,13 @@ void SubversionPlugin::startRevert(QString const &what QString targetDir = what.isEmpty() ? tempFolder() : what; // TODO: Add different variants arguments << "revert" << "-R" << targetDir; - invokeOperationAsync(arguments - , new invocation::BoolClassMemberCallback(this, &SubversionPlugin::onRevertComplete) - , true, targetDir, sourceProject, true, true); + + QString emptyString = ""; + QString const &emptyStringAdress = emptyString; + Tag tagStruct("revert", emptyStringAdress, false); + QVariant tagVariant; + tagVariant.setValue(tagStruct); + invokeOperationAsync(arguments, tagVariant, true, targetDir, sourceProject, true, true); } void SubversionPlugin::onCheckoutComplete(bool const result, QString const &targetProject, bool const quiet) @@ -360,3 +376,17 @@ void SubversionPlugin::editProxyConfiguration() // TODO: add proxy settings into settings page; // teach to edit config file to set proxy } + +void SubversionPlugin::doAfterOperationIsFinished(QVariant &tag) +{ + Tag tagStruct = tag.value(); + if (tagStruct.operation == "checkout"){ + onCheckoutComplete(true, tagStruct.stringTag, tagStruct.boolTag); + } else if (tagStruct.operation == "update"){ + onUpdateComplete(true); + } else if (tagStruct.operation == "commit"){ + onCommitComplete(true); + } else if (tagStruct.operation == "revert"){ + onRevertComplete(true); + } +} diff --git a/plugins/subversionClient/subversionPlugin.h b/plugins/subversionClient/subversionPlugin.h index b4b100ba26..b656292fda 100644 --- a/plugins/subversionClient/subversionPlugin.h +++ b/plugins/subversionClient/subversionPlugin.h @@ -68,6 +68,8 @@ public slots: int currentRevision(QString const &target = QString(), bool const reportErrors = false , QString const &sourceProject = QString()); + void doAfterOperationIsFinished(QVariant &tag); + signals: void workingCopyDownloaded(const bool success, QString const &targetProject); void workingCopyUpdated(const bool success); @@ -82,6 +84,7 @@ public slots: void removeComplete(bool const success); void operationComplete(QString const &name, bool const success); + protected: // External client overloads virtual int timeout() const; @@ -104,3 +107,4 @@ public slots: }; } + diff --git a/plugins/subversionClient/tags.h b/plugins/subversionClient/tags.h new file mode 100644 index 0000000000..731d0c85c8 --- /dev/null +++ b/plugins/subversionClient/tags.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include + +namespace versioning +{ +struct Tag +{ + Tag() + { + } + + Tag(QString const &oper, QString const &strTag, bool bTag) + : operation(oper) + , stringTag(strTag) + , boolTag(bTag) + { + } + + QString operation; + QString stringTag; + bool boolTag; +}; +} + +Q_DECLARE_METATYPE(versioning::Tag) diff --git a/qrutils/versioningUtils/authenticationSettingsWidget.cpp b/qrutils/versioningUtils/authenticationSettingsWidget.cpp index 3200cc0926..11a0e322b4 100644 --- a/qrutils/versioningUtils/authenticationSettingsWidget.cpp +++ b/qrutils/versioningUtils/authenticationSettingsWidget.cpp @@ -10,6 +10,8 @@ AuthenticationSettingsWidget::AuthenticationSettingsWidget(QWidget *parent) { mUi->setupUi(this); reinit(); + + connect(mUi->enabledCheckBox, SIGNAL(clicked()), this, SLOT(onEnableChecked())); } AuthenticationSettingsWidget::AuthenticationSettingsWidget(QString const &settingsPrefix @@ -20,6 +22,8 @@ AuthenticationSettingsWidget::AuthenticationSettingsWidget(QString const &settin { mUi->setupUi(this); reinit(); + + connect(mUi->enabledCheckBox, SIGNAL(clicked()), this, SLOT(onEnableChecked())); } AuthenticationSettingsWidget::~AuthenticationSettingsWidget() @@ -50,6 +54,8 @@ void AuthenticationSettingsWidget::save() void AuthenticationSettingsWidget::onEnableChecked() { + //mUi->userEditor->setEnabled(mUi->enabledCheckBox->isChecked()); + mUi->userEditor->setEnabled(mUi->enabledCheckBox->isChecked()); mUi->passwordEditor->setEnabled(mUi->enabledCheckBox->isChecked()); } diff --git a/qrutils/versioningUtils/boolCallback.h b/qrutils/versioningUtils/boolCallback.h deleted file mode 100644 index ec0265e13a..0000000000 --- a/qrutils/versioningUtils/boolCallback.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once - -#include "../utilsDeclSpec.h" - -namespace invocation -{ - -/// Base for construction callbacks with bool param from class members -struct BoolCallback -{ - virtual ~BoolCallback() {} - virtual void operator()(bool const param) = 0; -}; - -/// Class for construction callbacks with bool param -/// or bool param and string one or with bool param and string and bool one -// TODO: Get rid of this nightmare and use lambdas or smth -template -class QRUTILS_EXPORT BoolClassMemberCallback : public BoolCallback -{ - typedef void (TOwner::*BoolMember)(bool const param); - typedef void (TOwner::*BoolMemberWithStringTag)(bool const param, QString const &tag); - typedef void (TOwner::*BoolMemberWithStringAndBoolTag)(bool const param, QString const &stringTag, bool const boolTag); - -public: - BoolClassMemberCallback(TOwner *ownerClass, BoolMember member) - : mOwner(ownerClass), mIsTaggedWithString(false) - , mIsTaggedWithBoolAndString(false), mMember(member) - { - } - - /// @param tag Will be called as second parameter. Just a way to store some info in callback - BoolClassMemberCallback(TOwner *ownerClass, BoolMemberWithStringTag member, QString const &tag) - : mOwner(ownerClass), mIsTaggedWithString(true) - , mIsTaggedWithBoolAndString(false) - , mStringTaggedMember(member), mStringTag(tag) - { - } - - /// @param tag Will be called as second parameter. Just a way to store some info in callback - BoolClassMemberCallback(TOwner *ownerClass, BoolMemberWithStringAndBoolTag member - , QString const &stringTag, bool const &boolTag) - : mOwner(ownerClass), mIsTaggedWithString(false) - , mIsTaggedWithBoolAndString(true) - , mBoolStringTaggedMember(member), mStringTag(stringTag) - , mBoolTag(boolTag) - { - } - - virtual void operator ()(bool const param) - { - if (mIsTaggedWithBoolAndString) { - (mOwner->*mBoolStringTaggedMember)(param, mStringTag, mBoolTag); - } else if (mIsTaggedWithString) { - (mOwner->*mStringTaggedMember)(param, mStringTag); - } else { - (mOwner->*mMember)(param); - } - } - -private: - TOwner *mOwner; - bool mIsTaggedWithString; - bool mIsTaggedWithBoolAndString; - BoolMember mMember; - BoolMemberWithStringTag mStringTaggedMember; - BoolMemberWithStringAndBoolTag mBoolStringTaggedMember; - QString mStringTag; - bool mBoolTag; -}; - -} diff --git a/qrutils/versioningUtils/externalClientPluginBase.cpp b/qrutils/versioningUtils/externalClientPluginBase.cpp index c18997007b..1a7a0866e7 100644 --- a/qrutils/versioningUtils/externalClientPluginBase.cpp +++ b/qrutils/versioningUtils/externalClientPluginBase.cpp @@ -68,7 +68,7 @@ bool ExternalClientPluginBase::invokeOperation(const QStringList &args invocation::LongOperation* ExternalClientPluginBase::invokeOperationAsync( QStringList const &args - , invocation::BoolCallback *callback + , QVariant tag , bool needPreparation , QString const &workingDir , QString const &sourceProject @@ -85,7 +85,7 @@ invocation::LongOperation* ExternalClientPluginBase::invokeOperationAsync( , reportErrors, workingDir, checkWorkingDir); connect(operation, SIGNAL(finished(invocation::LongOperation*)) , this, SLOT(onOperationComplete(invocation::LongOperation*))); - mRunningOperationsCallbacksMap.insert(operation, callback); + mRunningOperationsCallbacksMap.insert(operation, tag); mMainWindow->reportOperation(operation); operation->invokeAsync(); return operation; @@ -137,11 +137,9 @@ void ExternalClientPluginBase::onOperationComplete(invocation::LongOperation *op dynamic_cast *>(operation); bool result = functor->invocationState() == invocation::FinishedNormally; result = result && functor->result(); - invocation::BoolCallback *callback = mRunningOperationsCallbacksMap[operation]; - if (callback) { - (*callback)(result); - } - mRunningOperationsCallbacksMap.remove(operation); + + QVariant tag = mRunningOperationsCallbacksMap[operation]; + emit operationIsFinished(tag); } bool ExternalClientPluginBase::startProcess(const QStringList &args, bool reportErrors) diff --git a/qrutils/versioningUtils/externalClientPluginBase.h b/qrutils/versioningUtils/externalClientPluginBase.h index 1ef34abe68..2bc3f9074f 100644 --- a/qrutils/versioningUtils/externalClientPluginBase.h +++ b/qrutils/versioningUtils/externalClientPluginBase.h @@ -5,7 +5,6 @@ #include "../utilsDeclSpec.h" #include "../../qrgui/versioning/versioningPluginInterface.h" -#include "boolCallback.h" namespace qReal { @@ -48,7 +47,7 @@ class QRUTILS_EXPORT ExternalClientPluginBase : public VersioningPluginInterface /// @param reportErrors Specifies if all occured errors are reported to GUI /// @returns Pointer to started operaton invocation::LongOperation *invokeOperationAsync(QStringList const &args - , invocation::BoolCallback *callback = 0 + , QVariant tag , bool needPreparation = true , QString const &workingDir = QString() , QString const &sourceProject = QString() @@ -100,6 +99,8 @@ protected slots: signals: /// The easiest way to invoke @see onErrorOccured() in on thread void errorOccured(QString const &message); + /// Signal for notification plagins about end of operation + void operationIsFinished(QVariant &tag); private slots: @@ -119,7 +120,7 @@ private slots: ErrorReporterInterface *mErrorReporter; QString mPathToClient; QProcess *mClientProcess; - QMap mRunningOperationsCallbacksMap; + QMap mRunningOperationsCallbacksMap; }; } diff --git a/qrutils/versioningUtils/versioningUtils.pri b/qrutils/versioningUtils/versioningUtils.pri index 320e9b9ea9..00fa652a70 100644 --- a/qrutils/versioningUtils/versioningUtils.pri +++ b/qrutils/versioningUtils/versioningUtils.pri @@ -4,7 +4,6 @@ HEADERS += \ versioningUtils/authenticationSettingsWidget.h \ versioningUtils/networkSettingsWidget.h \ versioningUtils/versionSelector.h \ - versioningUtils/boolCallback.h \ SOURCES += \ versioningUtils/externalClientPluginBase.cpp \ From 8ed642ecd45aba4039d0d6d19bbc70261d0d0554 Mon Sep 17 00:00:00 2001 From: anastasia143 Date: Wed, 17 Jul 2013 11:05:32 +0400 Subject: [PATCH 2/8] 47 From 1163ac5c617f115be903b9ff193bf0b22e05d1ee Mon Sep 17 00:00:00 2001 From: anastasia143 Date: Wed, 17 Jul 2013 11:08:44 +0400 Subject: [PATCH 3/8] j0 From 10b099506b4b4843d65b0251f4ecdc0ada4262ec Mon Sep 17 00:00:00 2001 From: anastasia143 Date: Wed, 17 Jul 2013 11:11:59 +0400 Subject: [PATCH 4/8] 89 From 4a626c0aa01432f610716f1c5959cfc27d4da49b Mon Sep 17 00:00:00 2001 From: anastasia143 Date: Thu, 18 Jul 2013 13:16:47 +0400 Subject: [PATCH 5/8] GIT PLUGIN TEST From 91179d0944f027629d2475d87991e4cd18cf0148 Mon Sep 17 00:00:00 2001 From: anastasia143 Date: Mon, 22 Jul 2013 17:05:06 +0400 Subject: [PATCH 6/8] Before merger From 78966481f4aaf291bfe9ceb641d921c63dc3056c Mon Sep 17 00:00:00 2001 From: anastasia143 Date: Mon, 22 Jul 2013 17:14:58 +0400 Subject: [PATCH 7/8] Before merge From d8eebab36bf41c1366bf293e47cdb3e0da0019e6 Mon Sep 17 00:00:00 2001 From: anastasia143 Date: Mon, 22 Jul 2013 17:20:50 +0400 Subject: [PATCH 8/8] Before 1 merge --- plugins/gitClient/gitClient.pro | 40 ++ plugins/gitClient/gitPlugin.cpp | 399 ++++++++++++++++++ plugins/gitClient/gitPlugin.h | 110 +++++ plugins/gitClient/gui/cloneDialog.cpp | 56 +++ plugins/gitClient/gui/cloneDialog.h | 32 ++ plugins/gitClient/gui/commitDialog.cpp | 35 ++ plugins/gitClient/gui/commitDialog.h | 29 ++ plugins/gitClient/gui/pullDialog.cpp | 56 +++ plugins/gitClient/gui/pullDialog.h | 32 ++ plugins/gitClient/gui/pushDialog.cpp | 55 +++ plugins/gitClient/gui/pushDialog.h | 32 ++ plugins/gitClient/gui/remoteDialog.cpp | 65 +++ plugins/gitClient/gui/remoteDialog.h | 35 ++ plugins/gitClient/gui/resetDialog.cpp | 56 +++ plugins/gitClient/gui/resetDialog.h | 32 ++ plugins/gitClient/gui/versioningPage.cpp | 75 ++++ plugins/gitClient/gui/versioningPage.h | 46 ++ plugins/gitClient/gui/versioningPage.ui | 96 +++++ plugins/gitClient/tags.h | 27 ++ plugins/gitClient/viewInteraction.cpp | 223 ++++++++++ plugins/gitClient/viewInteraction.h | 66 +++ plugins/plugins.pro | 3 +- plugins/subversionClient/subversionClient.pro | 2 +- plugins/subversionClient/subversionPlugin.cpp | 12 +- plugins/subversionClient/subversionPlugin.h | 2 - plugins/subversionClient/tags.h | 4 +- qrrepo/private/serializer.cpp | 7 + qrutils/invocationUtils/longOperation.cpp | 2 +- .../authenticationSettingsWidget.cpp | 15 +- .../authenticationSettingsWidget.h | 3 + .../authenticationSettingsWidget.ui | 37 +- .../externalClientPluginBase.cpp | 10 +- .../externalClientPluginBase.h | 5 +- 33 files changed, 1664 insertions(+), 35 deletions(-) create mode 100644 plugins/gitClient/gitClient.pro create mode 100644 plugins/gitClient/gitPlugin.cpp create mode 100644 plugins/gitClient/gitPlugin.h create mode 100644 plugins/gitClient/gui/cloneDialog.cpp create mode 100644 plugins/gitClient/gui/cloneDialog.h create mode 100644 plugins/gitClient/gui/commitDialog.cpp create mode 100644 plugins/gitClient/gui/commitDialog.h create mode 100644 plugins/gitClient/gui/pullDialog.cpp create mode 100644 plugins/gitClient/gui/pullDialog.h create mode 100644 plugins/gitClient/gui/pushDialog.cpp create mode 100644 plugins/gitClient/gui/pushDialog.h create mode 100644 plugins/gitClient/gui/remoteDialog.cpp create mode 100644 plugins/gitClient/gui/remoteDialog.h create mode 100644 plugins/gitClient/gui/resetDialog.cpp create mode 100644 plugins/gitClient/gui/resetDialog.h create mode 100644 plugins/gitClient/gui/versioningPage.cpp create mode 100644 plugins/gitClient/gui/versioningPage.h create mode 100644 plugins/gitClient/gui/versioningPage.ui create mode 100644 plugins/gitClient/tags.h create mode 100644 plugins/gitClient/viewInteraction.cpp create mode 100644 plugins/gitClient/viewInteraction.h diff --git a/plugins/gitClient/gitClient.pro b/plugins/gitClient/gitClient.pro new file mode 100644 index 0000000000..6787de5b89 --- /dev/null +++ b/plugins/gitClient/gitClient.pro @@ -0,0 +1,40 @@ +QT += widgets +LIBS += -L../../bin -lqrkernel -lqrutils + +TEMPLATE = lib +CONFIG += plugin +DESTDIR = ../../bin/plugins/ + +MOC_DIR = .moc +RCC_DIR = .rcc +UI_DIR = .ui +OBJECTS_DIR = .obj + +TRANSLATIONS += subversionClient_ru.ts + +HEADERS += \ + gitPlugin.h \ + viewInteraction.h \ + tags.h \ + gui/versioningPage.h \ + ../../qrgui/dialogs/preferencesPages/preferencesPage.h \ + gui/commitDialog.h \ + gui/pushDialog.h \ + gui/cloneDialog.h \ + gui/remoteDialog.h \ + gui/pullDialog.h \ + gui/resetDialog.h + +SOURCES += \ + gitPlugin.cpp \ + viewInteraction.cpp \ + gui/versioningPage.cpp \ + gui/commitDialog.cpp \ + gui/pushDialog.cpp \ + gui/cloneDialog.cpp \ + gui/remoteDialog.cpp \ + gui/pullDialog.cpp \ + gui/resetDialog.cpp + +FORMS += \ + gui/versioningPage.ui diff --git a/plugins/gitClient/gitPlugin.cpp b/plugins/gitClient/gitPlugin.cpp new file mode 100644 index 0000000000..9c5ad6e78e --- /dev/null +++ b/plugins/gitClient/gitPlugin.cpp @@ -0,0 +1,399 @@ +#include + +#include "gitPlugin.h" +#include "../../qrkernel/settingsManager.h" +#include "../../qrutils/fileSystemUtils.h" +#include "tags.h" + +using namespace versioning; +using namespace qReal::versioning; + +QString const tempFolderName = "tempGit"; +int const defaultTimeout = 30000; + +GitPlugin::GitPlugin() + : mViewInteraction(new details::ViewInteraction(this)) + , mTempDir(tempFolderName) +{ + qReal::SettingsManager::instance()->setValue("gitTempDir", mTempDir); + setPathToClient(pathToGit()); + + connect(this, SIGNAL(operationIsFinished(QVariant&)), SLOT(doAfterOperationIsFinished(QVariant&))); +} + +GitPlugin::~GitPlugin() +{ +} + +// QReal plugin interface +QString GitPlugin::pathToGit() const +{ + return qReal::SettingsManager::value("pathToGitClient", "").toString(); +} + +qReal::Customizer *GitPlugin::customizationInterface() +{ + return NULL; +} + +void GitPlugin::updateSettings() +{ + setPathToClient(pathToGit()); +} + +QList GitPlugin::actions() +{ + return mViewInteraction->actions(); +} + +void GitPlugin::init(qReal::PluginConfigurator const &configurator) +{ + ExternalClientPluginBase::init(configurator); + mViewInteraction->init(configurator); +} + +QPair GitPlugin::preferencesPage() +{ + return mViewInteraction->preferencesPage(); +} + +bool GitPlugin::onFileAdded(QString const &filePath, QString const &workingDir) +{ + Q_UNUSED(workingDir) + return doAdd(filePath, workingDir); +} + +bool GitPlugin::onFileRemoved(QString const &filePath, QString const &workingDir) +{ + Q_UNUSED(workingDir) + return doRemove(filePath); +} + +bool GitPlugin::onFileChanged(QString const &filePath, QString const &workingDir) +{ + // Subversion detects modifications itself + Q_UNUSED(filePath) + Q_UNUSED(workingDir) + return true; +} + +void GitPlugin::beginWorkingCopyDownloading(QString const &repoAddress + , QString const &targetProject + , int revisionNumber, bool quiet) +{ + doInit(tempFolder(), quiet); +} + +void GitPlugin::beginWorkingCopyUpdating(QString const &targetProject) +{ + startPush(tempFolder(), targetProject); +} + +void GitPlugin::beginChangesSubmitting(QString const &description, QString const &targetProject) +{ + //doAdd(QString(), QString()); + startCommit(tempFolder(), description, targetProject); +} + +bool GitPlugin::reinitWorkingCopy(QString const &targetProject) +{ + return doClean(); +} + +QString GitPlugin::information(QString const &targetProject) +{ + return "d"; + //return info(tempFolder(), true, targetProject); +} + +int GitPlugin::revisionNumber(QString const &targetProject) +{ + return 4; + //return currentRevision(tempFolder(), false, targetProject); +} + +QString GitPlugin::remoteRepositoryUrl(QString const &targetProject) +{ + return "r"; + //return repoUrl(tempFolder(), false, targetProject); +} + +bool GitPlugin::isMyWorkingCopy(QString const &directory) +{ + //If svn info worked well then it is our dir + QStringList infoArgs; + infoArgs << "status" << (directory.isEmpty() ? tempFolder() : directory); + return invokeOperation(infoArgs, false, directory, false, false, QString(), QString(), false); +} + +int GitPlugin::timeout() const +{ + return qReal::SettingsManager::value("gitClientTimeout", defaultTimeout).toInt(); +} + +QString GitPlugin::tempFolder() const +{ + return qReal::SettingsManager::value("gitTempDir", mTempDir).toString(); +} + +void GitPlugin::doInit(QString const &targetFolder, bool quiet) +{ + QStringList arguments; + arguments << "init"; + invokeOperation(arguments, true, QString(), false, true, QString(), QString(), true); +} + +void GitPlugin::startClone(QString const &from + , QString const &targetFolder) +{ + QString cloneDist = targetFolder.isEmpty() ? tempFolder() : targetFolder; + QStringList arguments; + arguments << "clone" << from; + + Tag tagStruct("clone"); + QVariant tagVariant; + tagVariant.setValue(tagStruct); + invokeOperationAsync(arguments, tagVariant, false, QString(), QString(), false); +} + +void GitPlugin::startCommit(QString const &message, QString const &from + , QString const &sourceProject) +{ + //QString targetDir = from.isEmpty() ? tempFolder() : from; + bool flag = doUserEmailConfig() && doUserNameConfig(); + + QStringList arguments; + arguments << "commit" << "-m" << message; + + Tag tagStruct("commit"); + QVariant tagVariant; + tagVariant.setValue(tagStruct); + invokeOperationAsync(arguments, tagVariant, true, QString(), sourceProject); +} + +void GitPlugin::doRemote(QString const &remote, QString const &adress, QString const &targetFolder) +{ + QString targetDir = targetFolder.isEmpty() ? tempFolder() : targetFolder; + QStringList arguments; + arguments << "remote" << "add" << remote << adress; + + bool const result = invokeOperation(arguments, false, targetDir, false, false, QString(), QString(), true); + addComplete(result); + operationComplete("add", result); +} + +void GitPlugin::startPush(QString const &remote + , QString const &sourceProject + ,QString const &targetFolder) +{ + QString targetDir = targetFolder.isEmpty() ? tempFolder() : targetFolder; + QStringList arguments; + + arguments << "push" << "--repo" << "https://" + getUsername() + ":" + getPassword() + "@github.com/" + getUsername() + "/" + remote + ".git"; + + Tag tagStruct("push"); + QVariant tagVariant; + tagVariant.setValue(tagStruct); + invokeOperationAsync(arguments, tagVariant, true, targetDir, sourceProject); +} + + +void GitPlugin::startPull(const QString &remote, QString const &targetFolder) +{ + QString targetDir = targetFolder.isEmpty() ? tempFolder() : targetFolder; + QStringList arguments; + + arguments << "pull" << remote; + + Tag tagStruct("pull"); + QVariant tagVariant; + tagVariant.setValue(tagStruct); + invokeOperationAsync(arguments, tagVariant, false, QString(), QString(), false); +} + +void GitPlugin::startReset(QString const &hash, QString const &targetFolder) +{ + QString targetDir = targetFolder.isEmpty() ? tempFolder() : targetFolder; + QStringList arguments; + // TODO: Add different variants + arguments << "reset" << hash; + + Tag tagStruct("reset"); + QVariant tagVariant; + tagVariant.setValue(tagStruct); + invokeOperationAsync(arguments, tagVariant, true, targetDir, QString(), true, true); +} + +bool GitPlugin::doUserNameConfig() +{ + QString const enabledKey = ui::AuthenticationSettingsWidget::enabledSettingsName("git"); + QString const usernameKey = ui::AuthenticationSettingsWidget::usernameSettingsName("git"); + + bool const authenticationEnabled = qReal::SettingsManager::value(enabledKey, false).toBool(); + if (!authenticationEnabled) { + return false; + } + + QString const username = qReal::SettingsManager::value(usernameKey, false).toString(); + if (username.isEmpty()) { + return false; + } + + QStringList arguments; + arguments << "config" << "user.name" << "\"" + username + "\""; + bool const result = invokeOperation(arguments, false, QString(), false, false, QString(), QString(), true); + emit operationComplete("userName", result); + return result; +} + +bool GitPlugin::doUserEmailConfig() +{ + QString const enabledKey = ui::AuthenticationSettingsWidget::enabledSettingsName("git"); + QString const emailKey = ui::AuthenticationSettingsWidget::usernameSettingsName("git"); + + bool const authenticationEnabled = qReal::SettingsManager::value(enabledKey, false).toBool(); + if (!authenticationEnabled) { + return false; + } + + QString const email = qReal::SettingsManager::value(emailKey, false).toString(); + if (email.isEmpty()) { + return false; + } + + QStringList arguments; + arguments << "config" << "user.email" << email; + bool const result = invokeOperation(arguments, false, QString(), false, false, QString(), QString(), true); + emit operationComplete("userEmail", result); + return result; +} + +bool GitPlugin::doAdd(QString const &what, QString const &targetFolder, bool force) +{ + QString targetDir = targetFolder.isEmpty() ? tempFolder() : what; + QStringList arguments; + arguments << "add" << what; + + QString path = what; + path = getFilePath(path); + + bool const result = invokeOperation(arguments, true, path, false, false, QString(), QString(), true); + emit addComplete(result); + emit operationComplete("add", result); + return result; +} + +QString &GitPlugin::getFilePath(QString &adress) +{ + int pos = adress.lastIndexOf("/"); + int len = adress.length(); + return adress.remove(pos, len - pos); +} + +bool GitPlugin::doRemove(QString const &what, bool force) +{ + QStringList arguments; + arguments << "rm" << what; + + QString path = what; + path = getFilePath(path); + + bool const result = invokeOperation(arguments, true, path, false, false, QString(), QString(), true); + emit removeComplete(result); + emit operationComplete("rm", result); + return result; +} + +bool GitPlugin::doClean() +{ + QStringList arguments; + arguments << "clean" << "-xdf"; + bool const result = invokeOperation(arguments, true, QString(), true, true, QString(), QString()); + emit cleanComplete(result); + emit operationComplete("clean", result); + return result; +} + +void GitPlugin::doAfterOperationIsFinished(QVariant &tag) +{ + Tag tagStruct = tag.value(); + if (tagStruct.operation == "init"){ + onInitComplete(true); + } else if (tagStruct.operation == "commit"){ + onCommitComplete(true); + } else if (tagStruct.operation == "clone"){ + onCloneComplete(true); + } else if (tagStruct.operation == "remote"){ + onRemoteComplete(true); + } else if (tagStruct.operation == "push"){ + onPushComplete(true); + } else if (tagStruct.operation == "pull"){ + onPullComplete(true); + } else if (tagStruct.operation == "reset"){ + onResetComplete(true); + } +} + +QString GitPlugin::getUsername() +{ + QString const usernameKey = ui::AuthenticationSettingsWidget::usernameSettingsName("git"); + QString const username = qReal::SettingsManager::value(usernameKey, false).toString(); + return username; +} + +QString GitPlugin::getPassword() +{ + QString const passwordKey = ui::AuthenticationSettingsWidget::passwordSettingsName("git"); + QString const password = qReal::SettingsManager::value(passwordKey, false).toString(); + return password; +} + +void GitPlugin::onInitComplete(bool const result) +{ + processWorkingCopy(); + emit initComplete(result); + emit operationComplete("init", result); +} + +void GitPlugin::onCommitComplete(bool const result) +{ + processWorkingCopy(); + emit commitComplete(result); + emit operationComplete("commit", result); + emit changesSubmitted(result); +} + +void GitPlugin::onCloneComplete(bool const result) +{ + processWorkingCopy(); + emit cloneComplete(result); + emit operationComplete("clone", result); +} + +void GitPlugin::onRemoteComplete(bool const result) +{ + processWorkingCopy(); + emit remoteComplete(result); + emit operationComplete("remote", result); +} + +void GitPlugin::onPushComplete(bool const result) +{ + processWorkingCopy(); + emit pushComplete(result); + emit operationComplete("push", result); +} + +void GitPlugin::onPullComplete(bool const result) +{ + processWorkingCopy(); + emit pullComplete(result); + emit operationComplete("pull", result); +} + +void GitPlugin::onResetComplete(const bool result) +{ + processWorkingCopy(); + emit resetComplete(result); + emit operationComplete("reset", result); +} diff --git a/plugins/gitClient/gitPlugin.h b/plugins/gitClient/gitPlugin.h new file mode 100644 index 0000000000..4db81df689 --- /dev/null +++ b/plugins/gitClient/gitPlugin.h @@ -0,0 +1,110 @@ +#pragma once + +#include "../../qrutils/versioningUtils/externalClientPluginBase.h" +#include "../../qrgui/toolPluginInterface/customizer.h" +#include "viewInteraction.h" + +namespace versioning +{ + +class GitPlugin : public qReal::versioning::ExternalClientPluginBase +{ + Q_OBJECT + Q_INTERFACES(qReal::ToolPluginInterface) + Q_PLUGIN_METADATA(IID "qReal.versioning.git") +public: + GitPlugin(); + + virtual ~GitPlugin(); + + QString pathToGit() const; + + // QReal plugin interface + virtual qReal::Customizer* customizationInterface(); + virtual void updateSettings(); + virtual QList actions(); + virtual void init(qReal::PluginConfigurator const &configurator); + virtual QPair preferencesPage(); + + // Working copy inspection + virtual bool onFileAdded(QString const &filePath, QString const &workingDir); + virtual bool onFileRemoved(QString const &filePath, QString const &workingDir); + virtual bool onFileChanged(QString const &filePath, QString const &workingDir); + + // Brief VCS interface + virtual void beginWorkingCopyDownloading(QString const &repoAddress + , QString const &targetProject + , int revisionNumber = -1 + , bool quiet = false); + virtual void beginWorkingCopyUpdating(QString const &targetProject = QString()); + virtual void beginChangesSubmitting(const QString &description, QString const &targetProject = QString()); + virtual bool reinitWorkingCopy(QString const &targetProject = QString()); + virtual QString information(QString const &targetProject = QString()); + virtual int revisionNumber(QString const &targetProject = QString()); + virtual QString remoteRepositoryUrl(QString const &targetProject = QString()); + virtual bool isMyWorkingCopy(QString const &directory = QString()); + +public slots: + void doInit(QString const &targetFolder = QString(), bool quiet = false); + void startClone(QString const &from = QString() + , QString const &targetFolder = QString()); + void startCommit(QString const &message, QString const &from = QString() + , QString const &sourceProject = QString()); + void doRemote(QString const &remote, QString const &adress, QString const &targerFolder = QString()); + void startPush(QString const &remote, QString const &sourceProject = QString() + , QString const &targetFolder = QString()); + void startPull(QString const &remote, QString const &targetFolder = QString()); + void startReset(QString const &hash = QString(), QString const &targetFolder = QString()); + bool doAdd(QString const &what, QString const &targetFolder, bool force = true); + bool doRemove(QString const &what, bool force = true); + bool doClean(); + bool doUserNameConfig(); + bool doUserEmailConfig(); + /* + QString repoUrl(QString const &target = QString(), bool const reportErrors = false + , QString const &sourceProject = QString()); + int currentRevision(QString const &target = QString(), bool const reportErrors = false + , QString const &sourceProject = QString());*/ + + void doAfterOperationIsFinished(QVariant &tag); +signals: + void workingCopyDownloaded(const bool success, QString const &targetProject); + void workingCopyUpdated(const bool success); + void changesSubmitted(const bool success); + + void initComplete(bool const success); + void cloneComplete(bool const success); + void commitComplete(bool const success); + void remoteComplete(bool const success); + void pushComplete(bool const success); + void pullComplete(bool const success); + void resetComplete(bool const success); + void cleanComplete(bool const success); + void addComplete(bool const success); + void removeComplete(bool const success); + void operationComplete(QString const &name, bool const success); +protected: + // External client overloads + virtual int timeout() const; + virtual QString tempFolder() const; +private: + /*QString infoToRepoUrl(QString &repoInfo); + int infoToRevision(QString const &repoInfo);*/ + + void onInitComplete(bool const result); + void onCloneComplete(bool const result); + void onRemoteComplete(bool const result); + void onCommitComplete(bool const result); + void onPushComplete(bool const result); + void onPullComplete(bool const result); + void onResetComplete(bool const result); + + QString &getFilePath(QString &adress); + QString getUsername(); + QString getPassword(); + + details::ViewInteraction *mViewInteraction; + QString mTempDir; + +}; +} diff --git a/plugins/gitClient/gui/cloneDialog.cpp b/plugins/gitClient/gui/cloneDialog.cpp new file mode 100644 index 0000000000..ac033268cf --- /dev/null +++ b/plugins/gitClient/gui/cloneDialog.cpp @@ -0,0 +1,56 @@ +#include +#include + +#include "cloneDialog.h" +#include "../../../qrkernel/settingsManager.h" + +using namespace versioning::ui; + +CloneDialog::CloneDialog(QWidget *parent) + : QDialog(parent) +{ + mUrlLabel = new QLabel(tr("Clone from: ")); + mUrlComboBox = createComboBox(qReal::SettingsManager::value("cloneAdress", "").toString()); + QPushButton *ok = new QPushButton(tr("OK"), this); + QPushButton *cancel = new QPushButton(tr("Cancel"), this); + + QHBoxLayout *buttonsLayout = new QHBoxLayout; + buttonsLayout->addStretch(); + buttonsLayout->addWidget(ok); + buttonsLayout->addWidget(cancel); + + connect(ok, SIGNAL(clicked()), this, SLOT(accept())); + connect(cancel, SIGNAL(clicked()), this, SLOT(reject())); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(mUrlLabel, 0, 0); + mainLayout->addWidget(mUrlComboBox, 0, 1, 1, 2); + mainLayout->addLayout(buttonsLayout,2, 0, 1, 3); + setLayout(mainLayout); + + setWindowTitle(tr("Push options")); + setFixedSize(500,100); +} + +QPushButton *CloneDialog::createButton(const QString &text, const char *member) +{ + QPushButton *button = new QPushButton(text); + connect(button, SIGNAL(clicked()), this, member); + return button; +} + +QComboBox *CloneDialog::createComboBox(const QString &text) +{ + QComboBox *comboBox = new QComboBox; + comboBox->setEditable(true); + comboBox->addItem(text); + comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + return comboBox; +} + +QString CloneDialog::url() const +{ + return mUrlComboBox->currentText(); +} + + diff --git a/plugins/gitClient/gui/cloneDialog.h b/plugins/gitClient/gui/cloneDialog.h new file mode 100644 index 0000000000..580ad3b310 --- /dev/null +++ b/plugins/gitClient/gui/cloneDialog.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace versioning +{ +namespace ui +{ + +class CloneDialog : public QDialog +{ + Q_OBJECT + +public: + CloneDialog(QWidget *parent = 0); + QString url() const; + +private: + QComboBox *mUrlComboBox; + QLabel *mUrlLabel; + QDir mCurrentDir; + + QPushButton *createButton(const QString &text, const char *member); + QComboBox *createComboBox(const QString &text = QString()); +}; + +} +} diff --git a/plugins/gitClient/gui/commitDialog.cpp b/plugins/gitClient/gui/commitDialog.cpp new file mode 100644 index 0000000000..4ca87b2a77 --- /dev/null +++ b/plugins/gitClient/gui/commitDialog.cpp @@ -0,0 +1,35 @@ +#include + +#include "commitDialog.h" + +using namespace versioning::ui; + +CommitDialog::CommitDialog(QWidget *parent) : QDialog(parent) +{ + mEnterMessageLabel = new QLabel(tr("Enter message here:")); + mOkButton = new QPushButton(tr("Ok"), this); + mCancel = new QPushButton(tr("Cancel"), this); + mMessageTextEdit = new QTextEdit(this); + + QHBoxLayout *buttonsLayout = new QHBoxLayout; + buttonsLayout->addStretch(); + buttonsLayout->addWidget(mOkButton); + buttonsLayout->addWidget(mCancel); + + QObject::connect(mOkButton, SIGNAL(clicked()), this, SLOT(accept())); + QObject::connect(mCancel, SIGNAL(clicked()), this, SLOT(reject())); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(mMessageTextEdit, 0, 0); + mainLayout->addLayout(buttonsLayout, 1, 0); + setLayout(mainLayout); + + setWindowTitle(tr("Enter commit message")); + setFixedSize(400,300); +} + +QString CommitDialog::message() const +{ + return mMessageTextEdit->toPlainText(); +} + diff --git a/plugins/gitClient/gui/commitDialog.h b/plugins/gitClient/gui/commitDialog.h new file mode 100644 index 0000000000..c3adccb0b4 --- /dev/null +++ b/plugins/gitClient/gui/commitDialog.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include +#include +#include + +namespace versioning +{ +namespace ui +{ + +class CommitDialog : public QDialog +{ + Q_OBJECT + +public: + explicit CommitDialog(QWidget *parent = 0); + QString message() const; + +private: + QLabel *mEnterMessageLabel; + QTextEdit *mMessageTextEdit; + QPushButton *mOkButton; + QPushButton *mCancel; +}; + +} +} diff --git a/plugins/gitClient/gui/pullDialog.cpp b/plugins/gitClient/gui/pullDialog.cpp new file mode 100644 index 0000000000..2f7cb92366 --- /dev/null +++ b/plugins/gitClient/gui/pullDialog.cpp @@ -0,0 +1,56 @@ +#include +#include + +#include "pullDialog.h" +#include "../../../qrkernel/settingsManager.h" + +using namespace versioning::ui; + +PullDialog::PullDialog(QWidget *parent) + : QDialog(parent) +{ + mUrlLabel = new QLabel(tr("Choose origin: ")); + mUrlComboBox = createComboBox(qReal::SettingsManager::value("remote", "").toString()); + QPushButton *ok = new QPushButton(tr("OK"), this); + QPushButton *cancel = new QPushButton(tr("Cancel"), this); + + QHBoxLayout *buttonsLayout = new QHBoxLayout; + buttonsLayout->addStretch(); + buttonsLayout->addWidget(ok); + buttonsLayout->addWidget(cancel); + + connect(ok, SIGNAL(clicked()), this, SLOT(accept())); + connect(cancel, SIGNAL(clicked()), this, SLOT(reject())); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(mUrlLabel, 0, 0); + mainLayout->addWidget(mUrlComboBox, 0, 1, 1, 2); + mainLayout->addLayout(buttonsLayout,2, 0, 1, 3); + setLayout(mainLayout); + + setWindowTitle(tr("Pull options")); + setFixedSize(500,100); +} + +QPushButton *PullDialog::createButton(const QString &text, const char *member) +{ + QPushButton *button = new QPushButton(text); + connect(button, SIGNAL(clicked()), this, member); + return button; +} + +QComboBox *PullDialog::createComboBox(const QString &text) +{ + QComboBox *comboBox = new QComboBox; + comboBox->setEditable(true); + comboBox->addItem(text); + comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + return comboBox; +} + +QString PullDialog::url() const +{ + return mUrlComboBox->currentText(); +} + + diff --git a/plugins/gitClient/gui/pullDialog.h b/plugins/gitClient/gui/pullDialog.h new file mode 100644 index 0000000000..396d1d462b --- /dev/null +++ b/plugins/gitClient/gui/pullDialog.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace versioning +{ +namespace ui +{ + +class PullDialog : public QDialog +{ + Q_OBJECT + +public: + PullDialog(QWidget *parent = 0); + QString url() const; + +private: + QComboBox *mUrlComboBox; + QLabel *mUrlLabel; + QDir mCurrentDir; + + QPushButton *createButton(const QString &text, const char *member); + QComboBox *createComboBox(const QString &text = QString()); +}; + +} +} diff --git a/plugins/gitClient/gui/pushDialog.cpp b/plugins/gitClient/gui/pushDialog.cpp new file mode 100644 index 0000000000..c9d7c0e5cb --- /dev/null +++ b/plugins/gitClient/gui/pushDialog.cpp @@ -0,0 +1,55 @@ +#include +#include + +#include "pushDialog.h" +#include "../../../qrkernel/settingsManager.h" + +using namespace versioning::ui; + +PushDialog::PushDialog(QWidget *parent) + : QDialog(parent) +{ + mUrlLabel = new QLabel(tr("Choose origin: ")); + mUrlComboBox = createComboBox(qReal::SettingsManager::value("", "").toString()); + QPushButton *ok = new QPushButton(tr("OK"), this); + QPushButton *cancel = new QPushButton(tr("Cancel"), this); + + QHBoxLayout *buttonsLayout = new QHBoxLayout; + buttonsLayout->addStretch(); + buttonsLayout->addWidget(ok); + buttonsLayout->addWidget(cancel); + + connect(ok, SIGNAL(clicked()), this, SLOT(accept())); + connect(cancel, SIGNAL(clicked()), this, SLOT(reject())); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(mUrlLabel, 0, 0); + mainLayout->addWidget(mUrlComboBox, 0, 1, 1, 2); + mainLayout->addLayout(buttonsLayout,2, 0, 1, 3); + setLayout(mainLayout); + + setWindowTitle(tr("Push options")); + setFixedSize(500,100); +} + +QPushButton *PushDialog::createButton(const QString &text, const char *member) +{ + QPushButton *button = new QPushButton(text); + connect(button, SIGNAL(clicked()), this, member); + return button; +} + +QComboBox *PushDialog::createComboBox(const QString &text) +{ + QComboBox *comboBox = new QComboBox; + comboBox->setEditable(true); + comboBox->addItem(text); + comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + return comboBox; +} + +QString PushDialog::url() const +{ + return mUrlComboBox->currentText(); +} + diff --git a/plugins/gitClient/gui/pushDialog.h b/plugins/gitClient/gui/pushDialog.h new file mode 100644 index 0000000000..c5f75f6cf9 --- /dev/null +++ b/plugins/gitClient/gui/pushDialog.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace versioning +{ +namespace ui +{ + +class PushDialog : public QDialog +{ + Q_OBJECT + +public: + PushDialog(QWidget *parent = 0); + QString url() const; + +private: + QComboBox *mUrlComboBox; + QLabel *mUrlLabel; + QDir mCurrentDir; + + QPushButton *createButton(const QString &text, const char *member); + QComboBox *createComboBox(const QString &text = QString()); +}; + +} +} diff --git a/plugins/gitClient/gui/remoteDialog.cpp b/plugins/gitClient/gui/remoteDialog.cpp new file mode 100644 index 0000000000..6c5fc00886 --- /dev/null +++ b/plugins/gitClient/gui/remoteDialog.cpp @@ -0,0 +1,65 @@ +#include +#include + +#include "remoteDialog.h" +#include "../../../qrkernel/settingsManager.h" + +using namespace versioning::ui; + +RemoteDialog::RemoteDialog(QWidget *parent) + : QDialog(parent) +{ + mUrlLabel = new QLabel(tr("Name: ")); + mPathLabel = new QLabel(tr("Adress: ")); + mPathComboBox = createComboBox(qReal::SettingsManager::value("remoteName", "").toString()); + mUrlComboBox = createComboBox(qReal::SettingsManager::value("remoreAdress", "").toString()); + QPushButton *ok = new QPushButton(tr("OK"), this); + QPushButton *cancel = new QPushButton(tr("Cancel"), this); + + QHBoxLayout *buttonsLayout = new QHBoxLayout; + buttonsLayout->addStretch(); + buttonsLayout->addWidget(ok); + buttonsLayout->addWidget(cancel); + + connect(ok, SIGNAL(clicked()), this, SLOT(accept())); + connect(cancel, SIGNAL(clicked()), this, SLOT(reject())); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(mUrlLabel, 0, 0); + mainLayout->addWidget(mUrlComboBox, 0, 1, 1, 2); + mainLayout->addWidget(mPathLabel, 1, 0); + mainLayout->addWidget(mPathComboBox, 1, 1); + mainLayout->addLayout(buttonsLayout,2, 0, 1, 3); + setLayout(mainLayout); + + setWindowTitle(tr("New remote")); + setFixedSize(500,100); +} + +QPushButton *RemoteDialog::createButton(const QString &text, const char *member) +{ + QPushButton *button = new QPushButton(text); + connect(button, SIGNAL(clicked()), this, member); + return button; +} + +QComboBox *RemoteDialog::createComboBox(const QString &text) +{ + QComboBox *comboBox = new QComboBox; + comboBox->setEditable(true); + comboBox->addItem(text); + comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + return comboBox; +} + + +QString RemoteDialog::target() const +{ + return mPathComboBox->currentText(); +} + +QString RemoteDialog::url() const +{ + return mUrlComboBox->currentText(); +} + diff --git a/plugins/gitClient/gui/remoteDialog.h b/plugins/gitClient/gui/remoteDialog.h new file mode 100644 index 0000000000..9031448907 --- /dev/null +++ b/plugins/gitClient/gui/remoteDialog.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace versioning +{ +namespace ui +{ + +class RemoteDialog : public QDialog +{ + Q_OBJECT + +public: + RemoteDialog(QWidget *parent = 0); + QString url() const; + QString target() const; + +private: + QComboBox *mUrlComboBox; + QComboBox *mPathComboBox; + QLabel *mUrlLabel; + QLabel *mPathLabel; + QDir mCurrentDir; + + QPushButton *createButton(const QString &text, const char *member); + QComboBox *createComboBox(const QString &text = QString()); +}; + +} +} diff --git a/plugins/gitClient/gui/resetDialog.cpp b/plugins/gitClient/gui/resetDialog.cpp new file mode 100644 index 0000000000..018c99eeb1 --- /dev/null +++ b/plugins/gitClient/gui/resetDialog.cpp @@ -0,0 +1,56 @@ +#include +#include + +#include "resetDialog.h" +#include "../../../qrkernel/settingsManager.h" + +using namespace versioning::ui; + +ResetDialog::ResetDialog(QWidget *parent) + : QDialog(parent) +{ + mUrlLabel = new QLabel(tr("Enter hash of commit: ")); + mUrlComboBox = createComboBox(qReal::SettingsManager::value("hashCommit", "").toString()); + QPushButton *ok = new QPushButton(tr("OK"), this); + QPushButton *cancel = new QPushButton(tr("Cancel"), this); + + QHBoxLayout *buttonsLayout = new QHBoxLayout; + buttonsLayout->addStretch(); + buttonsLayout->addWidget(ok); + buttonsLayout->addWidget(cancel); + + connect(ok, SIGNAL(clicked()), this, SLOT(accept())); + connect(cancel, SIGNAL(clicked()), this, SLOT(reject())); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(mUrlLabel, 0, 0); + mainLayout->addWidget(mUrlComboBox, 0, 1, 1, 2); + mainLayout->addLayout(buttonsLayout,2, 0, 1, 3); + setLayout(mainLayout); + + setWindowTitle(tr("Reset options")); + setFixedSize(500,100); +} + +QPushButton *ResetDialog::createButton(const QString &text, const char *member) +{ + QPushButton *button = new QPushButton(text); + connect(button, SIGNAL(clicked()), this, member); + return button; +} + +QComboBox *ResetDialog::createComboBox(const QString &text) +{ + QComboBox *comboBox = new QComboBox; + comboBox->setEditable(true); + comboBox->addItem(text); + comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + return comboBox; +} + +QString ResetDialog::url() const +{ + return mUrlComboBox->currentText(); +} + + diff --git a/plugins/gitClient/gui/resetDialog.h b/plugins/gitClient/gui/resetDialog.h new file mode 100644 index 0000000000..13edf61cb5 --- /dev/null +++ b/plugins/gitClient/gui/resetDialog.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace versioning +{ +namespace ui +{ + +class ResetDialog : public QDialog +{ + Q_OBJECT + +public: + ResetDialog(QWidget *parent = 0); + QString url() const; + +private: + QComboBox *mUrlComboBox; + QLabel *mUrlLabel; + QDir mCurrentDir; + + QPushButton *createButton(const QString &text, const char *member); + QComboBox *createComboBox(const QString &text = QString()); +}; + +} +} diff --git a/plugins/gitClient/gui/versioningPage.cpp b/plugins/gitClient/gui/versioningPage.cpp new file mode 100644 index 0000000000..72314eebf3 --- /dev/null +++ b/plugins/gitClient/gui/versioningPage.cpp @@ -0,0 +1,75 @@ +#include + +#include "versioningPage.h" +#include "ui_versioningPage.h" +#include "../../../qrkernel/settingsManager.h" + +using namespace versioning::ui; + +PreferencesVersioningPage::PreferencesVersioningPage(QWidget *parent) + : PreferencesPage(parent) + , mUi(new Ui::PreferencesVersioningPage) +{ + mIcon = QIcon(":/icons/preferences/versioning.png"); + mUi->setupUi(this); + + mAuthenticationSettings = new AuthenticationSettingsWidget("git"); + // The last widget in layout must remain spacer + mUi->verticalLayout->insertWidget(mUi->verticalLayout->count() - 1, mAuthenticationSettings); + + /*mEmailLabel = new QLabel(tr("Email: ")); + mEmailComboBox = createComboBox(qReal::SettingsManager::value("", "").toString()); + mUi->verticalLayout->insertWidget(mUi->verticalLayout->count() - 1, mEmailLabel); + mUi->verticalLayout->insertWidget(mUi->verticalLayout->count() - 1, mEmailComboBox); + restoreSettings(); + + connect(mAuthenticationSettings->)*/ +} + +PreferencesVersioningPage::~PreferencesVersioningPage() +{ + delete mUi; +} + +void PreferencesVersioningPage::changeEvent(QEvent *e) +{ + switch (e->type()) { + case QEvent::LanguageChange: + mUi->retranslateUi(this); + mAuthenticationSettings->retranslate(); + break; + default: + break; + } +} + +void PreferencesVersioningPage::save() +{ + qReal::SettingsManager::setValue("pathToGitClient", mUi->pathToGitClientLineEdit->text()); + qReal::SettingsManager::setValue("gitClientTimeout", mUi->gitTimeoutSpinBox->value()); + mAuthenticationSettings->save(); +} + +void PreferencesVersioningPage::restoreSettings() +{ + mAuthenticationSettings->reinit(); + mUi->pathToGitClientLineEdit->setText(qReal::SettingsManager::value("pathToGitClient", "").toString()); + mUi->gitTimeoutSpinBox->setValue(qReal::SettingsManager::value("gitClientTimeout", 30000).toInt()); +} + +void PreferencesVersioningPage::on_browseGitClientButton_clicked() +{ + QString const path = QFileDialog::getOpenFileName(this, tr("Open File"), QString(), "svn*"); + if (!path.isNull()) { + mUi->pathToGitClientLineEdit->setText(path); + } +} + +QComboBox *PreferencesVersioningPage::createComboBox(const QString &text) +{ + QComboBox *comboBox = new QComboBox; + comboBox->setEditable(true); + comboBox->addItem(text); + comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + return comboBox; +} diff --git a/plugins/gitClient/gui/versioningPage.h b/plugins/gitClient/gui/versioningPage.h new file mode 100644 index 0000000000..f1894c3640 --- /dev/null +++ b/plugins/gitClient/gui/versioningPage.h @@ -0,0 +1,46 @@ +#pragma once + +#include "../../../qrgui/dialogs/preferencesPages/preferencesPage.h" +#include "../../../qrutils/versioningUtils/authenticationSettingsWidget.h" +#include "../../../qrutils/versioningUtils/networkSettingsWidget.h" +#include +#include + +namespace Ui { + class PreferencesVersioningPage; +} + +namespace versioning +{ +namespace ui +{ + +class PreferencesVersioningPage : public PreferencesPage +{ + Q_OBJECT + +public: + explicit PreferencesVersioningPage(QWidget *parent = 0); + virtual ~PreferencesVersioningPage(); + + virtual void save(); + virtual void restoreSettings(); + +protected: + virtual void changeEvent(QEvent *e); + +private slots: + void on_browseGitClientButton_clicked(); + +private: + QComboBox *createComboBox(const QString &text = QString()); + + Ui::PreferencesVersioningPage *mUi; + AuthenticationSettingsWidget *mAuthenticationSettings; + /*QComboBox *mEmailComboBox; + QLabel *mEmailLabel;*/ + +}; + +} +} diff --git a/plugins/gitClient/gui/versioningPage.ui b/plugins/gitClient/gui/versioningPage.ui new file mode 100644 index 0000000000..e4c990e856 --- /dev/null +++ b/plugins/gitClient/gui/versioningPage.ui @@ -0,0 +1,96 @@ + + + PreferencesVersioningPage + + + + 0 + 0 + 400 + 300 + + + + SVN Preferences + + + + + + Git Preferences + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Path to client + + + + + + + + + + Client timeout + + + + + + + enter time span value in milliseconds + + + true + + + -1 + + + 2000000000 + + + 100 + + + + + + + Browse... + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + diff --git a/plugins/gitClient/tags.h b/plugins/gitClient/tags.h new file mode 100644 index 0000000000..06b45a32b9 --- /dev/null +++ b/plugins/gitClient/tags.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include + +namespace versioning +{ +struct Tag +{ + Tag() + { + } + + Tag(QString const &oper, QString const &strTag = QString(), bool bTag = false) + : operation(oper) + , stringTag(strTag) + , boolTag(bTag) + { + } + + QString operation; + QString stringTag; + bool boolTag; +}; +} + +Q_DECLARE_METATYPE(versioning::Tag) diff --git a/plugins/gitClient/viewInteraction.cpp b/plugins/gitClient/viewInteraction.cpp new file mode 100644 index 0000000000..9b90e16038 --- /dev/null +++ b/plugins/gitClient/viewInteraction.cpp @@ -0,0 +1,223 @@ +#include "viewInteraction.h" +#include "../../qrkernel/settingsManager.h" +#include "../../qrutils/versioningUtils/versionSelector.h" +#include "gitPlugin.h" + + +using namespace versioning::details; +using namespace versioning::ui; + +ViewInteraction::ViewInteraction(GitPlugin *pluginInstance) + : mPlugin(pluginInstance) + , mPreferencesPage(new PreferencesVersioningPage()) +{ + initActions(); + connect(mPlugin, SIGNAL(initComplete(bool)), this, SLOT(onInitComplete(bool))); + connect(mPlugin, SIGNAL(cloneComplete(bool)), this, SLOT(onCloneComplete(bool))); + connect(mPlugin, SIGNAL(remoteComplete(bool)), this, SLOT(onRemoteComplete(bool))); + connect(mPlugin, SIGNAL(commitComplete(bool)), this, SLOT(onCommitComplete(bool))); + connect(mPlugin, SIGNAL(pushComplete(bool)), this, SLOT(onPushComplete(bool))); + connect(mPlugin, SIGNAL(pullComplete(bool)), this, SLOT(onPullComplete(bool))); + connect(mPlugin, SIGNAL(resetComplete(bool)), this, SLOT(onResetComplete(bool))); + +} + +void ViewInteraction::initActions() +{ + // TODO: Add menu enabling/disabling when current project changed + + QMenu *gitMenu = new QMenu(tr("Git")); + + QAction *initAction = gitMenu->addAction(tr("Init")); + connect(initAction, SIGNAL(triggered()), this, SLOT(initClicked())); + + QAction *cloneAction = gitMenu->addAction(tr("Clone...")); + connect(cloneAction, SIGNAL(triggered()), this, SLOT(cloneClicked())); + + QAction *remoteAction = gitMenu->addAction(tr("Remote...")); + connect(remoteAction, SIGNAL(triggered()), this, SLOT(remoteClicked())); + + QAction *commitAction = gitMenu->addAction(tr("Commit...")); + connect(commitAction, SIGNAL(triggered()), this, SLOT(commitClicked())); + + QAction *pushAction = gitMenu->addAction(tr("Push...")); + connect(pushAction, SIGNAL(triggered()), this, SLOT(pushClicked())); + + QAction *pullAction = gitMenu->addAction(tr("Pull...")); + connect(pullAction, SIGNAL(triggered()), this, SLOT(pullClicked())); + + QAction *resetAction = gitMenu->addAction(tr("Reset...")); + connect(resetAction, SIGNAL(triggered()), this, SLOT(resetClicked())); + + QAction *cleanAction = gitMenu->addAction(tr("Clean")); + connect(cleanAction, SIGNAL(triggered()), this, SLOT(cleanClicked())); + + mMenu << qReal::ActionInfo(gitMenu, "tools"); +} + +QList ViewInteraction::actions() const +{ + return mMenu; +} + +QPair ViewInteraction::preferencesPage() const +{ + return QPair("Git", mPreferencesPage); +} + +void ViewInteraction::init(const qReal::PluginConfigurator &configurator) +{ + mMainWindowIface = &(configurator.mainWindowInterpretersInterface()); + mProjectManager = &(configurator.projectManager()); + mRepoApi = &(configurator.repoControlInterface()); +} + +void ViewInteraction::initClicked() +{ + mPlugin->doInit(); +} + +void ViewInteraction::cloneClicked() +{ + ui::CloneDialog *dialog = new ui::CloneDialog(mMainWindowIface->windowWidget()); + if (QDialog::Accepted != dialog->exec()) { + return; + } + + mPlugin->startClone(dialog->url()); +} + +void ViewInteraction::remoteClicked() +{ + ui::RemoteDialog *dialog = new ui::RemoteDialog(mMainWindowIface->windowWidget()); + if (QDialog::Accepted != dialog->exec()) { + return; + } + + mPlugin->doRemote(dialog->url(), dialog->target()); +} + +void ViewInteraction::commitClicked() +{ + ui::CommitDialog *dialog = new ui::CommitDialog(mMainWindowIface->windowWidget()); + if (QDialog::Accepted != dialog->exec()) { + return; + } + QString message = dialog->message(); + if (message.isEmpty()) { + message = ""; + } + + mPlugin->startCommit(message); +} + +void ViewInteraction::pushClicked() +{ + ui::PushDialog *dialog = new ui::PushDialog(mMainWindowIface->windowWidget()); + if (QDialog::Accepted != dialog->exec()) { + return; + } + //QString const target = dialog->target(); + QString const remote = dialog->url(); + + //qReal::SettingsManager::setValue("pushTarget", target); + qReal::SettingsManager::setValue("remote", remote); + + mPlugin->startPush(remote); +} + +void ViewInteraction::pullClicked() +{ + ui::PullDialog *dialog = new ui::PullDialog(mMainWindowIface->windowWidget()); + if (QDialog::Accepted != dialog->exec()) { + return; + } + + //qReal::SettingsManager::setValue("pushUrl", dialog->url); + + mPlugin->startPull(dialog->url()); +} + +void ViewInteraction::resetClicked() +{ + ui::ResetDialog *dialog = new ResetDialog(mMainWindowIface->windowWidget()); + if (QDialog::Accepted != dialog->exec()) { + return; + } + + mPlugin->startReset(dialog->url()); +} + +void ViewInteraction::cleanClicked() +{ + if (mPlugin->doClean()) { + showMessage(tr("Clean successfully.")); + } +} + +void ViewInteraction::showMessage(const QString &message) +{ + mMainWindowIface->errorReporter()->addInformation(message); +} + +void ViewInteraction::onInitComplete(const bool success) +{ + if (success){ + //mProjectManager->openExisting(targetProject); + showMessage(tr("Init successfully.")); + } +} + +void ViewInteraction::onCloneComplete(const bool success) +{ + if (success){ + showMessage(tr("Clone successfully.")); + } +} + +void ViewInteraction::onCommitComplete(const bool success) +{ + if (success) { + showMessage(tr("Commited successfully.")); + reopenWithoutSavings(); + } +} + +void ViewInteraction::onRemoteComplete(const bool success) +{ + if (success){ + showMessage(tr("Remote successfully.")); + reopenWithoutSavings(); + } +} + +void ViewInteraction::onPushComplete(const bool success) +{ + if (success) { + showMessage(tr("Pushed successfully.")); + reopenWithoutSavings(); + } +} + +void ViewInteraction::onPullComplete(const bool success) +{ + if (success) { + showMessage(tr("Pulled successfully.")); + reopenWithoutSavings(); + } +} + +void ViewInteraction::onResetComplete(const bool success) +{ + if (success) { + showMessage(tr("Reseted successfully.")); + reopenWithoutSavings(); + } +} + +void ViewInteraction::reopenWithoutSavings() +{ + QString const currentProject = mRepoApi->workingFile(); + mProjectManager->close(); + mProjectManager->openExisting(currentProject); +} diff --git a/plugins/gitClient/viewInteraction.h b/plugins/gitClient/viewInteraction.h new file mode 100644 index 0000000000..9e2bfd03a9 --- /dev/null +++ b/plugins/gitClient/viewInteraction.h @@ -0,0 +1,66 @@ +#pragma once + +#include + +#include "../../qrgui/toolPluginInterface/toolPluginInterface.h" +#include "../../qrgui/toolPluginInterface/pluginConfigurator.h" +#include "gui/pushDialog.h" +#include "gui/pullDialog.h" +#include "gui/commitDialog.h" +#include "gui/versioningPage.h" +#include "gui/cloneDialog.h" +#include "gui/remoteDialog.h" +#include "gui/resetDialog.h" + +namespace versioning +{ + +class GitPlugin; + +namespace details +{ + +class ViewInteraction : public QObject +{ + Q_OBJECT + +public: + explicit ViewInteraction(GitPlugin *pluginInstance); + + QList actions() const; + QPair preferencesPage() const; + void init(qReal::PluginConfigurator const &configurator); + +public slots: + void initClicked(); + void cloneClicked(); + void commitClicked(); + void remoteClicked(); + void pushClicked(); + void pullClicked(); + void resetClicked(); + void cleanClicked(); + +private slots: + void onInitComplete(bool const success); + void onCloneComplete(bool const success); + void onCommitComplete(bool const success); + void onRemoteComplete(bool const success); + void onPushComplete(bool const success); + void onPullComplete(bool const success); + void onResetComplete(bool const success); + +private: + void initActions(); + void showMessage(QString const &message); + void reopenWithoutSavings(); + + QList mMenu; + GitPlugin *mPlugin; + qReal::gui::MainWindowInterpretersInterface *mMainWindowIface; + qReal::ProjectManagementInterface *mProjectManager; + qrRepo::RepoControlInterface *mRepoApi; + ui::PreferencesVersioningPage *mPreferencesPage; +}; +} +} diff --git a/plugins/plugins.pro b/plugins/plugins.pro index c44732e73f..b9c9a0e737 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -15,7 +15,8 @@ SUBDIRS = \ # requirements/requirements.pro \ # robots/robots.pro \ # sbt/sbt.pro \ - subversionClient/subversionClient.pro \ + subversionClient/subversionClient.pro \ + gitClient/gitClient.pro \ # testEditor/testEditor.pro \ # testInvocation/testInvocation.pro \ # ubiq/ubiq.pro \ diff --git a/plugins/subversionClient/subversionClient.pro b/plugins/subversionClient/subversionClient.pro index 8483b393db..d8baa8cf83 100644 --- a/plugins/subversionClient/subversionClient.pro +++ b/plugins/subversionClient/subversionClient.pro @@ -19,7 +19,7 @@ HEADERS = \ gui/commitDialog.h \ gui/versioningPage.h \ ../../qrgui/dialogs/preferencesPages/preferencesPage.h \ - tags.h + tags.h SOURCES = \ subversionPlugin.cpp \ diff --git a/plugins/subversionClient/subversionPlugin.cpp b/plugins/subversionClient/subversionPlugin.cpp index caa581eb37..4f4336371c 100644 --- a/plugins/subversionClient/subversionPlugin.cpp +++ b/plugins/subversionClient/subversionPlugin.cpp @@ -160,9 +160,7 @@ void SubversionPlugin::startUpdate(QString const &to arguments << "update" << targetDir; arguments << authenticationArgs(); - QString emptyString = ""; - QString const &emptyStringAdress = emptyString; - Tag tagStruct("update", emptyStringAdress, false); + Tag tagStruct("update"); QVariant tagVariant; tagVariant.setValue(tagStruct); invokeOperationAsync(arguments, tagVariant, true, to, sourceProject); @@ -176,9 +174,7 @@ void SubversionPlugin::startCommit(QString const &message, QString const &from arguments << "commit" << targetDir << "-m" << message; arguments << authenticationArgs(); - QString emptyString = ""; - QString const &emptyStringAdress = emptyString; - Tag tagStruct("commit", emptyStringAdress, false); + Tag tagStruct("commit"); QVariant tagVariant; tagVariant.setValue(tagStruct); invokeOperationAsync(arguments, tagVariant, true, from, sourceProject); @@ -204,9 +200,7 @@ void SubversionPlugin::startRevert(QString const &what // TODO: Add different variants arguments << "revert" << "-R" << targetDir; - QString emptyString = ""; - QString const &emptyStringAdress = emptyString; - Tag tagStruct("revert", emptyStringAdress, false); + Tag tagStruct("revert"); QVariant tagVariant; tagVariant.setValue(tagStruct); invokeOperationAsync(arguments, tagVariant, true, targetDir, sourceProject, true, true); diff --git a/plugins/subversionClient/subversionPlugin.h b/plugins/subversionClient/subversionPlugin.h index b656292fda..6655ce3473 100644 --- a/plugins/subversionClient/subversionPlugin.h +++ b/plugins/subversionClient/subversionPlugin.h @@ -84,7 +84,6 @@ public slots: void removeComplete(bool const success); void operationComplete(QString const &name, bool const success); - protected: // External client overloads virtual int timeout() const; @@ -105,6 +104,5 @@ public slots: details::ViewInteraction *mViewInteraction; QString mTempDir; }; - } diff --git a/plugins/subversionClient/tags.h b/plugins/subversionClient/tags.h index 731d0c85c8..06b45a32b9 100644 --- a/plugins/subversionClient/tags.h +++ b/plugins/subversionClient/tags.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include namespace versioning { @@ -11,7 +11,7 @@ struct Tag { } - Tag(QString const &oper, QString const &strTag, bool bTag) + Tag(QString const &oper, QString const &strTag = QString(), bool bTag = false) : operation(oper) , stringTag(strTag) , boolTag(bTag) diff --git a/qrrepo/private/serializer.cpp b/qrrepo/private/serializer.cpp index c0200a9b02..3100fe1c5c 100644 --- a/qrrepo/private/serializer.cpp +++ b/qrrepo/private/serializer.cpp @@ -168,6 +168,10 @@ void Serializer::prepareWorkingCopy(const QString &targetFolder, QString const & if (QFileInfo(workingFile).exists()) { FolderCompressor().decompressFolder(workingFile, targetFolder); } + else { + QDir qDir; + qDir.mkdir(targetFolder); + } } void Serializer::processWorkingCopy(const QString &workingCopyPath, QString const &targetProject) @@ -434,6 +438,9 @@ bool Serializer::removeUnsaved(const QString &path) } bool result = true; foreach (QFileInfo const &fileInfo, dir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)) { + if (fileInfo.fileName().startsWith('.')) { + continue; + } if (fileInfo.isDir()) { bool const invocationResult = mSavedDirectories.contains(fileInfo.filePath()) diff --git a/qrutils/invocationUtils/longOperation.cpp b/qrutils/invocationUtils/longOperation.cpp index 07dd072f6e..dac745f7c6 100644 --- a/qrutils/invocationUtils/longOperation.cpp +++ b/qrutils/invocationUtils/longOperation.cpp @@ -84,7 +84,7 @@ void LongOperation::stopTimer() void LongOperation::startInvocation(QThread::Priority priority) { connect(mThread, SIGNAL(finished()), this, SLOT(onThreadFinished())); - connect(mThread, SIGNAL(terminated()), this, SLOT(onThreadTerminated())); + //connect(mThread, SIGNAL(terminated()), this, SLOT(onThreadTerminated())); mTimer = new QTimer; mTimer->connect(mTimer, SIGNAL(timeout()), mThread, SLOT(terminate())); diff --git a/qrutils/versioningUtils/authenticationSettingsWidget.cpp b/qrutils/versioningUtils/authenticationSettingsWidget.cpp index 11a0e322b4..63ae5b5843 100644 --- a/qrutils/versioningUtils/authenticationSettingsWidget.cpp +++ b/qrutils/versioningUtils/authenticationSettingsWidget.cpp @@ -41,6 +41,7 @@ void AuthenticationSettingsWidget::reinit() mUi->enabledCheckBox->setChecked(qReal::SettingsManager::value(enabledSettingsName(), false).toBool()); mUi->userEditor->setText(qReal::SettingsManager::value(usernameSettingsName()).toString()); mUi->passwordEditor->setText(qReal::SettingsManager::value(passwordSettingsName()).toString()); + mUi->emailEditor->setText(qReal::SettingsManager::value(emailSettingsName()).toString()); onEnableChecked(); } @@ -50,14 +51,14 @@ void AuthenticationSettingsWidget::save() qReal::SettingsManager::setValue(enabledSettingsName(), mUi->enabledCheckBox->isChecked()); qReal::SettingsManager::setValue(usernameSettingsName(), mUi->userEditor->text()); qReal::SettingsManager::setValue(passwordSettingsName(), mUi->passwordEditor->text()); + qReal::SettingsManager::setValue(emailSettingsName(), mUi->emailEditor->text()); } void AuthenticationSettingsWidget::onEnableChecked() { - //mUi->userEditor->setEnabled(mUi->enabledCheckBox->isChecked()); - mUi->userEditor->setEnabled(mUi->enabledCheckBox->isChecked()); mUi->passwordEditor->setEnabled(mUi->enabledCheckBox->isChecked()); + mUi->emailEditor->setEnabled(mUi->enabledCheckBox->isChecked()); } void AuthenticationSettingsWidget::setSettingsPrefix(const QString &prefix) @@ -80,6 +81,11 @@ QString AuthenticationSettingsWidget::passwordSettingsName(const QString &prefix return prefix + "Password"; } +QString AuthenticationSettingsWidget::emailSettingsName(const QString &prefix) +{ + return prefix + "Email"; +} + QString AuthenticationSettingsWidget::enabledSettingsName() const { return enabledSettingsName(mSettingsPrefix); @@ -94,3 +100,8 @@ QString AuthenticationSettingsWidget::passwordSettingsName() const { return passwordSettingsName(mSettingsPrefix); } + +QString AuthenticationSettingsWidget::emailSettingsName() const +{ + return emailSettingsName(mSettingsPrefix); +} diff --git a/qrutils/versioningUtils/authenticationSettingsWidget.h b/qrutils/versioningUtils/authenticationSettingsWidget.h index 9da687c5d5..ebfbf7ec0c 100644 --- a/qrutils/versioningUtils/authenticationSettingsWidget.h +++ b/qrutils/versioningUtils/authenticationSettingsWidget.h @@ -55,6 +55,8 @@ class QRUTILS_EXPORT AuthenticationSettingsWidget : public QWidget /// @param prefix Prefix of required key static QString passwordSettingsName(QString const &prefix); + static QString emailSettingsName(QString const &prefix); + private slots: void onEnableChecked(); @@ -62,6 +64,7 @@ private slots: QString enabledSettingsName() const; QString usernameSettingsName() const; QString passwordSettingsName() const; + QString emailSettingsName() const; Ui::AuthenticationSettingsWidget *mUi; QString mSettingsPrefix; diff --git a/qrutils/versioningUtils/authenticationSettingsWidget.ui b/qrutils/versioningUtils/authenticationSettingsWidget.ui index bceba2c29c..45ad8d7a0f 100644 --- a/qrutils/versioningUtils/authenticationSettingsWidget.ui +++ b/qrutils/versioningUtils/authenticationSettingsWidget.ui @@ -7,14 +7,23 @@ 0 0 400 - 108 + 152 Authentication settings - + + 0 + + + 0 + + + 0 + + 0 @@ -33,6 +42,13 @@ QFrame::Raised + + + + QLineEdit::Password + + + @@ -40,6 +56,9 @@ + + + @@ -47,16 +66,16 @@ - - - - QLineEdit::Password + + + + + + + Email: - - - diff --git a/qrutils/versioningUtils/externalClientPluginBase.cpp b/qrutils/versioningUtils/externalClientPluginBase.cpp index 1a7a0866e7..fbd2edeada 100644 --- a/qrutils/versioningUtils/externalClientPluginBase.cpp +++ b/qrutils/versioningUtils/externalClientPluginBase.cpp @@ -66,8 +66,7 @@ bool ExternalClientPluginBase::invokeOperation(const QStringList &args return result; } -invocation::LongOperation* ExternalClientPluginBase::invokeOperationAsync( - QStringList const &args +invocation::LongOperation* ExternalClientPluginBase::invokeOperationAsync(QStringList const &args , QVariant tag , bool needPreparation , QString const &workingDir @@ -112,7 +111,7 @@ QString ExternalClientPluginBase::standartOutput() const } bool ExternalClientPluginBase::startAndWait(const QStringList &args - , bool reportErrors, const QString &workingDir + , bool reportErrors, QString const &workingDir , const bool checkWorkingCopy) { QString const workingCopyPath = workingDir.isEmpty() ? tempFolder() : workingDir; @@ -122,7 +121,7 @@ bool ExternalClientPluginBase::startAndWait(const QStringList &args } return false; } - if (!startProcess(args, reportErrors)) { + if (!startProcess(args, workingCopyPath, reportErrors)) { return false; } if (!waitForClient(reportErrors)) { @@ -142,12 +141,13 @@ void ExternalClientPluginBase::onOperationComplete(invocation::LongOperation *op emit operationIsFinished(tag); } -bool ExternalClientPluginBase::startProcess(const QStringList &args, bool reportErrors) +bool ExternalClientPluginBase::startProcess(QStringList const &args, QString const &workingDir, bool reportErrors) { if (!checkClientPath(reportErrors)) { return false; } mClientProcess = new QProcess; + mClientProcess->setWorkingDirectory(workingDir); mClientProcess->start(mPathToClient, args); if (!mClientProcess->waitForStarted()) { if (reportErrors) { diff --git a/qrutils/versioningUtils/externalClientPluginBase.h b/qrutils/versioningUtils/externalClientPluginBase.h index 2bc3f9074f..9c43b5856d 100644 --- a/qrutils/versioningUtils/externalClientPluginBase.h +++ b/qrutils/versioningUtils/externalClientPluginBase.h @@ -40,7 +40,7 @@ class QRUTILS_EXPORT ExternalClientPluginBase : public VersioningPluginInterface /// Starts process which executable`s path specified by setPathToClient() method in separate thread. /// @param args Startup arguments /// @param needPreparation Specifies if working copy must be fetchced from current project - /// @param callback A callback that will be called when operation complete with result specification. + /// @param tag !!!!! A callback that will be called when operation complete with result specification. /// @param workingDir A path to working directory. If empty, tempFolder() used /// @param sourceProject A path to source project. If empty, working one used /// @param checkWorkingDir Specifies if before operation will be checked if specified directory is under version control @@ -102,7 +102,6 @@ protected slots: /// Signal for notification plagins about end of operation void operationIsFinished(QVariant &tag); - private slots: void onOperationComplete(invocation::LongOperation *operation); @@ -110,7 +109,7 @@ private slots: bool startAndWait(const QStringList &args, bool reportErrors , QString const &workingDir, bool const checkWorkingCopy); - bool startProcess(QStringList const &args, bool reportErrors = true); + bool startProcess(QStringList const &args, QString const &workingDir = QString(), bool reportErrors = true); bool checkClientPath(bool reportErrors = true); bool processErrors(bool reportErrors = true); bool waitForClient(bool reportErrors = true);