# # # patch "src/GuitoneCore.cpp" # from [57ade5ff937fd43b41271f3dab4d772fad2479b6] # to [c3115fc07f0c4a4e3e7f84e5d72696ccd56c1cfc] # # patch "src/GuitoneDriver.cpp" # from [02ee4e0942c688ab35015d80b4701737cb75cae7] # to [fef38ed25b79ea194c484c3db5f638890190e3c8] # # patch "src/GuitoneDriver.h" # from [6df86d7464f8c7c9cfd971b4e7bcefc34b41d27f] # to [d962e050f1f766c04a0be38f979065ab04b25d02] # # patch "src/view/dialogs/DatabaseDialogManager.cpp" # from [0682dfa8ded86ab14e4b0ec82ba796ef516b2c60] # to [50d0234cf912337c66da72417d7cd58800b7ae7a] # # patch "src/view/dialogs/DatabaseDialogManager.h" # from [4a760e7161b0fa7d80f42cd072697d68b9fc7ab6] # to [7c24a49461e0f47d414908ac65b09be7dc2fa7f3] # # patch "src/view/dialogs/DialogManager.cpp" # from [109413ef4db839312f5084c1bc5e0b2cdd4093b1] # to [58059d4c4ef2f7239658f222ea27b84e21503c4d] # # patch "src/view/dialogs/DialogManager.h" # from [0a0c6eab2209d8a96f277d922231e469a0521aa2] # to [3f25089e05b51517e2e1c8794c6de6e50cb6deb8] # # patch "src/view/dialogs/WorkspaceDialogManager.cpp" # from [abfaee7978ee13a369f98693b2087e940b01755d] # to [70609e0d36f20ad141e2ee391bbae33ff1aa4666] # # patch "src/view/dialogs/WorkspaceDialogManager.h" # from [83005973338a03cde630f2dea7a4115d21bb20a6] # to [a92db4014ab749520a8eba4cc733c052aaeac9c3] # ============================================================ --- src/GuitoneCore.cpp 57ade5ff937fd43b41271f3dab4d772fad2479b6 +++ src/GuitoneCore.cpp c3115fc07f0c4a4e3e7f84e5d72696ccd56c1cfc @@ -35,7 +35,7 @@ GuitoneCore::GuitoneCore(int & argc, cha #ifndef Q_WS_MACX updateDialog = 0; #else -// CocoaUtil::initialize(); + CocoaUtil::initialize(); #endif // check for updates immediatly on launch @@ -108,7 +108,7 @@ void GuitoneCore::checkForApplicationUpd void GuitoneCore::checkForApplicationUpdates(bool silent) { #ifdef Q_WS_MACX - //CocoaUtil::checkForUpdates(silent); + CocoaUtil::checkForUpdates(silent); #else if (!updateDialog) { ============================================================ --- src/GuitoneDriver.cpp 02ee4e0942c688ab35015d80b4701737cb75cae7 +++ src/GuitoneDriver.cpp fef38ed25b79ea194c484c3db5f638890190e3c8 @@ -20,10 +20,150 @@ #include "GuitoneDriver.h" +#include "DatabaseDialogManager.h" +#include "WorkspaceDialogManager.h" + GuitoneDriver::GuitoneDriver(int & argc, char** argv) - : GuitoneCore(argc, argv, QApplication::Tty) -{} + : GuitoneCore(argc, argv, QApplication::GuiClient), dialogManager(0) +{ + connect( + this, SIGNAL(monotoneBinaryPathSet()), + this, SLOT(processCommands()), + Qt::QueuedConnection + ); +} GuitoneDriver::~GuitoneDriver() -{} +{ + if (dialogManager) delete dialogManager; +} +void GuitoneDriver::processCommands() +{ + QStringList args = arguments(); + // we're not interested in the program's name and "exec" + args.removeFirst(); + args.removeFirst(); + + if (args.size() < 2) + { + error("wrong number of arguments"); + return; + } + + QString path = args.takeFirst(); + + if (path == "-") + { + dialogManager = new DialogManager(NULL, true); + } + else + { + QFileInfo fileInfo(path); + if (!fileInfo.exists()) + { + error("non-existant path"); + return; + } + path = fileInfo.absoluteFilePath(); + + if (fileInfo.isDir()) + { + dialogManager = new WorkspaceDialogManager(NULL, true); + try + { + path = MonotoneManager::normalizeWorkspacePath(path); + APP->manager()->getThreadForWorkspace(path); + } + catch (GuitoneException e) + { + error(e); + return; + } + qobject_cast(dialogManager)->init(path); + } + else if (fileInfo.isFile()) + { + dialogManager = new DatabaseDialogManager(NULL, true); + try + { + APP->manager()->getThreadForDatabase(path); + } + catch (GuitoneException e) + { + error(e); + return; + } + qobject_cast(dialogManager)->init(path); + } + else + { + error("file is neither a file nor a directory"); + return; + } + } + + QString reqMethod = args.takeFirst(); + + const QMetaObject * obj = dialogManager->metaObject(); + QMetaMethod method; + bool found = false; + + for (int i=0; imethodCount(); i++) + { + method = obj->method(i); + QByteArray sig(method.signature()); + sig = sig.left(sig.indexOf('(')); + if (sig == reqMethod.toLatin1()) + { + found = true; + break; + } + } + + if (!found) + { + error("method signature not found"); + return; + } + + QList methodArgs = method.parameterTypes(); + + if (methodArgs.size() != args.size()) + { + error("argument count doesn't match"); + return; + } + + if (args.size() > 10) + { + error("cannot handle more than 10 function arguments"); + return; + } + + QGenericArgument genArgs[10]; + for (int i=0; i(arg.toLatin1().data()) + class GuitoneDriver : public GuitoneCore { Q_OBJECT public: GuitoneDriver(int &, char**); ~GuitoneDriver(); + +private slots: + void processCommands(); + +private: + void error(const QString &); + + DialogManager * dialogManager; }; #endif ============================================================ --- src/view/dialogs/DatabaseDialogManager.cpp 0682dfa8ded86ab14e4b0ec82ba796ef516b2c60 +++ src/view/dialogs/DatabaseDialogManager.cpp 50d0234cf912337c66da72417d7cd58800b7ae7a @@ -21,10 +21,11 @@ #include "DatabaseDialogManager.h" #include "vocab.h" -DatabaseDialogManager::DatabaseDialogManager(QWidget * parent) - : DialogManager(parent), changesetBrowser(0), checkoutRevision(0), - fileDiff(0), fileHistory(0), generateKeypair(0), keyManagement(0), - revisionDiff(0), revisionManifest(0), selectRevision(0) {} +DatabaseDialogManager::DatabaseDialogManager(QWidget * parent, bool blockDialogs) + : DialogManager(parent, blockDialogs), changesetBrowser(0), + checkoutRevision(0), fileDiff(0), fileHistory(0), generateKeypair(0), + keyManagement(0), revisionDiff(0), revisionManifest(0), selectRevision(0) +{} DatabaseDialogManager::~DatabaseDialogManager() { ============================================================ --- src/view/dialogs/DatabaseDialogManager.h 4a760e7161b0fa7d80f42cd072697d68b9fc7ab6 +++ src/view/dialogs/DatabaseDialogManager.h 7c24a49461e0f47d414908ac65b09be7dc2fa7f3 @@ -36,7 +36,7 @@ public: { Q_OBJECT public: - DatabaseDialogManager(QWidget *); + DatabaseDialogManager(QWidget *, bool blockDialogs = false); ~DatabaseDialogManager(); void init(const DatabaseFile &); ============================================================ --- src/view/dialogs/DialogManager.cpp 109413ef4db839312f5084c1bc5e0b2cdd4093b1 +++ src/view/dialogs/DialogManager.cpp 58059d4c4ef2f7239658f222ea27b84e21503c4d @@ -21,8 +21,9 @@ #include "DialogManager.h" #include "vocab.h" -DialogManager::DialogManager(QWidget * parentWidget) : QObject(parentWidget), - about(0), preferences(0) {} +DialogManager::DialogManager(QWidget * parentWidget, bool blockDialogs) + : QObject(parentWidget), about(0), preferences(0), blockDialogs(blockDialogs) +{} DialogManager::~DialogManager() { @@ -61,6 +62,14 @@ void DialogManager::showDialog(Dialog * void DialogManager::showDialog(Dialog * dlg) { + if (blockDialogs) + { + int retValue = dlg->exec(); + dialogFinished(dlg); + Q_UNUSED(retValue); + return; + } + if (!openDialogs.contains(dlg)) { connect( @@ -75,9 +84,18 @@ void DialogManager::showDialog(Dialog * dlg->show(); } -void DialogManager::dialogFinished() +void DialogManager::dialogFinished(Dialog * dlg) { - Dialog * dlg = qobject_cast(sender()); + if (dlg == 0) + { + dlg = qobject_cast(sender()); + } + I(dlg); + + // TODO emit whatever data need to be returned here + if (blockDialogs) + return; + I(openDialogs.contains(dlg)); disconnect( ============================================================ --- src/view/dialogs/DialogManager.h 0a0c6eab2209d8a96f277d922231e469a0521aa2 +++ src/view/dialogs/DialogManager.h 3f25089e05b51517e2e1c8794c6de6e50cb6deb8 @@ -23,6 +23,7 @@ #include "About.h" #include "Preferences.h" +#include "vocab.h" #include @@ -30,12 +31,13 @@ public: { Q_OBJECT public: - DialogManager(QWidget *); + DialogManager(QWidget *, bool blockDialogs = false); ~DialogManager(); public slots: void showAbout(); void showPreferences(); +void fooBar() { D("test"); } virtual void closeAllDialogs(); @@ -50,9 +52,10 @@ private: void cleanup(); QStack openDialogs; + bool blockDialogs; private slots: - void dialogFinished(); + void dialogFinished(Dialog * dlg = 0); }; #endif ============================================================ --- src/view/dialogs/WorkspaceDialogManager.cpp abfaee7978ee13a369f98693b2087e940b01755d +++ src/view/dialogs/WorkspaceDialogManager.cpp 70609e0d36f20ad141e2ee391bbae33ff1aa4666 @@ -22,8 +22,8 @@ #include "MonotoneUtil.h" #include "GuitoneCore.h" -WorkspaceDialogManager::WorkspaceDialogManager(QWidget * parent) - : DatabaseDialogManager(parent), commitRevision(0), +WorkspaceDialogManager::WorkspaceDialogManager(QWidget * parent, bool blockDialogs) + : DatabaseDialogManager(parent, blockDialogs), commitRevision(0), unaccountedRenames(0), updateWorkspace(0) {} WorkspaceDialogManager::~WorkspaceDialogManager() ============================================================ --- src/view/dialogs/WorkspaceDialogManager.h 83005973338a03cde630f2dea7a4115d21bb20a6 +++ src/view/dialogs/WorkspaceDialogManager.h a92db4014ab749520a8eba4cc733c052aaeac9c3 @@ -33,7 +33,7 @@ public: { Q_OBJECT public: - WorkspaceDialogManager(QWidget *); + WorkspaceDialogManager(QWidget *, bool blockDialogs = false); ~WorkspaceDialogManager(); void init(const WorkspacePath &);