/************************************************************************** ** ** Copyright (C) 2015 Hugues Delorme ** Contact: http://www.qt.io/licensing ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms and ** conditions see http://www.qt.io/terms-conditions. For further information ** use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ****************************************************************************/ #include "bazaarplugin.h" #include "constants.h" #include "bazaarclient.h" #include "bazaarcontrol.h" #include "optionspage.h" #include "bazaarcommitwidget.h" #include "bazaareditor.h" #include "pullorpushdialog.h" #include "uncommitdialog.h" #include "commiteditor.h" #include "clonewizard.h" #include "ui_revertdialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef WITH_TESTS #include #endif using namespace Core; using namespace Utils; using namespace VcsBase; namespace Bazaar { namespace Internal { // Submit editor parameters const char COMMIT_ID[] = "Bazaar Commit Log Editor"; const char COMMIT_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("VCS", "Bazaar Commit Log Editor"); const char COMMITMIMETYPE[] = "text/vnd.qtcreator.bazaar.commit"; // Menu items // File menu actions const char ADD[] = "Bazaar.AddSingleFile"; const char DELETE[] = "Bazaar.DeleteSingleFile"; const char ANNOTATE[] = "Bazaar.Annotate"; const char DIFF[] = "Bazaar.DiffSingleFile"; const char LOG[] = "Bazaar.LogSingleFile"; const char REVERT[] = "Bazaar.RevertSingleFile"; const char STATUS[] = "Bazaar.Status"; // Directory menu Actions const char DIFFMULTI[] = "Bazaar.Action.DiffMulti"; const char REVERTMULTI[] = "Bazaar.Action.RevertALL"; const char STATUSMULTI[] = "Bazaar.Action.StatusMulti"; const char LOGMULTI[] = "Bazaar.Action.Logmulti"; // Repository menu actions const char PULL[] = "Bazaar.Action.Pull"; const char PUSH[] = "Bazaar.Action.Push"; const char UPDATE[] = "Bazaar.Action.Update"; const char COMMIT[] = "Bazaar.Action.Commit"; const char UNCOMMIT[] = "Bazaar.Action.UnCommit"; const char CREATE_REPOSITORY[] = "Bazaar.Action.CreateRepository"; // Submit editor actions const char DIFFEDITOR[] = "Bazaar.Action.Editor.Diff"; const VcsBaseEditorParameters editorParameters[] = { { LogOutput, // type Constants::FILELOG_ID, // id Constants::FILELOG_DISPLAY_NAME, // display name Constants::LOGAPP}, // mime type { AnnotateOutput, Constants::ANNOTATELOG_ID, Constants::ANNOTATELOG_DISPLAY_NAME, Constants::ANNOTATEAPP}, { DiffOutput, Constants::DIFFLOG_ID, Constants::DIFFLOG_DISPLAY_NAME, Constants::DIFFAPP} }; const VcsBaseSubmitEditorParameters submitEditorParameters = { COMMITMIMETYPE, COMMIT_ID, COMMIT_DISPLAY_NAME, VcsBaseSubmitEditorParameters::DiffFiles }; BazaarPlugin *BazaarPlugin::m_instance = 0; BazaarPlugin::BazaarPlugin() : m_client(0), m_commandLocator(0), m_addAction(0), m_deleteAction(0), m_menuAction(0), m_submitActionTriggered(false) { m_instance = this; } BazaarPlugin::~BazaarPlugin() { delete m_client; m_client = 0; m_instance = 0; } bool BazaarPlugin::initialize(const QStringList &arguments, QString *errorMessage) { Q_UNUSED(arguments); Q_UNUSED(errorMessage); Context context(Constants::BAZAAR_CONTEXT); m_client = new BazaarClient(&m_bazaarSettings); initializeVcs(new BazaarControl(m_client), context); addAutoReleasedObject(new OptionsPage); m_bazaarSettings.readSettings(ICore::settings()); connect(m_client, SIGNAL(changed(QVariant)), versionControl(), SLOT(changed(QVariant))); static const char *describeSlot = SLOT(view(QString,QString)); const int editorCount = sizeof(editorParameters) / sizeof(VcsBaseEditorParameters); const auto widgetCreator = []() { return new BazaarEditorWidget; }; for (int i = 0; i < editorCount; i++) addAutoReleasedObject(new VcsEditorFactory(editorParameters + i, widgetCreator, m_client, describeSlot)); addAutoReleasedObject(new VcsSubmitEditorFactory(&submitEditorParameters, []() { return new CommitEditor(&submitEditorParameters); })); auto cloneWizardFactory = new BaseCheckoutWizardFactory; cloneWizardFactory->setId(QLatin1String(VcsBase::Constants::VCS_ID_BAZAAR)); cloneWizardFactory->setIcon(QIcon(QLatin1String(":/bazaar/images/bazaar.png"))); cloneWizardFactory->setDescription(tr("Clones a Bazaar branch and tries to load the contained project.")); cloneWizardFactory->setDisplayName(tr("Bazaar Clone (Or Branch)")); cloneWizardFactory->setWizardCreator([this] (const FileName &path, QWidget *parent) { return new CloneWizard(path, parent); }); addAutoReleasedObject(cloneWizardFactory); const QString prefix = QLatin1String("bzr"); m_commandLocator = new CommandLocator("Bazaar", prefix, prefix); addAutoReleasedObject(m_commandLocator); createMenu(context); createSubmitEditorActions(); return true; } BazaarPlugin *BazaarPlugin::instance() { return m_instance; } BazaarClient *BazaarPlugin::client() const { return m_client; } const BazaarSettings &BazaarPlugin::settings() const { return m_bazaarSettings; } void BazaarPlugin::setSettings(const BazaarSettings &settings) { if (settings != m_bazaarSettings) { const bool userIdChanged = !m_bazaarSettings.sameUserId(settings); m_bazaarSettings = settings; if (userIdChanged) client()->synchronousSetUserId(); static_cast(versionControl())->emitConfigurationChanged(); } } void BazaarPlugin::createMenu(const Context &context) { // Create menu item for Bazaar m_bazaarContainer = ActionManager::createMenu("Bazaar.BazaarMenu"); QMenu *menu = m_bazaarContainer->menu(); menu->setTitle(tr("Bazaar")); createFileActions(context); m_bazaarContainer->addSeparator(context); createDirectoryActions(context); m_bazaarContainer->addSeparator(context); createRepositoryActions(context); m_bazaarContainer->addSeparator(context); // Request the Tools menu and add the Bazaar menu to it ActionContainer *toolsMenu = ActionManager::actionContainer(Core::Constants::M_TOOLS); toolsMenu->addMenu(m_bazaarContainer); m_menuAction = m_bazaarContainer->menu()->menuAction(); } void BazaarPlugin::createFileActions(const Context &context) { Core::Command *command; m_annotateFile = new ParameterAction(tr("Annotate Current File"), tr("Annotate \"%1\""), ParameterAction::EnabledWithParameter, this); command = ActionManager::registerAction(m_annotateFile, ANNOTATE, context); command->setAttribute(Core::Command::CA_UpdateText); connect(m_annotateFile, SIGNAL(triggered()), this, SLOT(annotateCurrentFile())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); m_diffFile = new ParameterAction(tr("Diff Current File"), tr("Diff \"%1\""), ParameterAction::EnabledWithParameter, this); command = ActionManager::registerAction(m_diffFile, DIFF, context); command->setAttribute(Core::Command::CA_UpdateText); command->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Meta+Z,Meta+D") : tr("ALT+Z,Alt+D"))); connect(m_diffFile, SIGNAL(triggered()), this, SLOT(diffCurrentFile())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); m_logFile = new ParameterAction(tr("Log Current File"), tr("Log \"%1\""), ParameterAction::EnabledWithParameter, this); command = ActionManager::registerAction(m_logFile, LOG, context); command->setAttribute(Core::Command::CA_UpdateText); command->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Meta+Z,Meta+L") : tr("ALT+Z,Alt+L"))); connect(m_logFile, SIGNAL(triggered()), this, SLOT(logCurrentFile())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); m_statusFile = new ParameterAction(tr("Status Current File"), tr("Status \"%1\""), ParameterAction::EnabledWithParameter, this); command = ActionManager::registerAction(m_statusFile, STATUS, context); command->setAttribute(Core::Command::CA_UpdateText); command->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Meta+Z,Meta+S") : tr("ALT+Z,Alt+S"))); connect(m_statusFile, SIGNAL(triggered()), this, SLOT(statusCurrentFile())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); m_bazaarContainer->addSeparator(context); m_addAction = new ParameterAction(tr("Add"), tr("Add \"%1\""), ParameterAction::EnabledWithParameter, this); command = ActionManager::registerAction(m_addAction, ADD, context); command->setAttribute(Core::Command::CA_UpdateText); connect(m_addAction, SIGNAL(triggered()), this, SLOT(addCurrentFile())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); m_deleteAction = new ParameterAction(tr("Delete..."), tr("Delete \"%1\"..."), ParameterAction::EnabledWithParameter, this); command = ActionManager::registerAction(m_deleteAction, DELETE, context); command->setAttribute(Core::Command::CA_UpdateText); connect(m_deleteAction, SIGNAL(triggered()), this, SLOT(promptToDeleteCurrentFile())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); m_revertFile = new ParameterAction(tr("Revert Current File..."), tr("Revert \"%1\"..."), ParameterAction::EnabledWithParameter, this); command = ActionManager::registerAction(m_revertFile, REVERT, context); command->setAttribute(Core::Command::CA_UpdateText); connect(m_revertFile, SIGNAL(triggered()), this, SLOT(revertCurrentFile())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); } void BazaarPlugin::addCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); m_client->synchronousAdd(state.currentFileTopLevel(), state.relativeCurrentFile()); } void BazaarPlugin::annotateCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); m_client->annotate(state.currentFileTopLevel(), state.relativeCurrentFile()); } void BazaarPlugin::diffCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); m_client->diff(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile())); } void BazaarPlugin::logCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); m_client->log(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), QStringList(), true); } void BazaarPlugin::revertCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); QDialog dialog(ICore::dialogParent()); Ui::RevertDialog revertUi; revertUi.setupUi(&dialog); if (dialog.exec() != QDialog::Accepted) return; m_client->revertFile(state.currentFileTopLevel(), state.relativeCurrentFile(), revertUi.revisionLineEdit->text()); } void BazaarPlugin::statusCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); m_client->status(state.currentFileTopLevel(), state.relativeCurrentFile()); } void BazaarPlugin::createDirectoryActions(const Context &context) { QAction *action; Core::Command *command; action = new QAction(tr("Diff"), this); m_repositoryActionList.append(action); command = ActionManager::registerAction(action, DIFFMULTI, context); connect(action, SIGNAL(triggered()), this, SLOT(diffRepository())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); action = new QAction(tr("Log"), this); m_repositoryActionList.append(action); command = ActionManager::registerAction(action, LOGMULTI, context); connect(action, SIGNAL(triggered()), this, SLOT(logRepository())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); action = new QAction(tr("Revert..."), this); m_repositoryActionList.append(action); command = ActionManager::registerAction(action, REVERTMULTI, context); connect(action, SIGNAL(triggered()), this, SLOT(revertAll())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); action = new QAction(tr("Status"), this); m_repositoryActionList.append(action); command = ActionManager::registerAction(action, STATUSMULTI, context); connect(action, SIGNAL(triggered()), this, SLOT(statusMulti())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); } void BazaarPlugin::diffRepository() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); m_client->diff(state.topLevel()); } void BazaarPlugin::logRepository() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); QStringList extraOptions; extraOptions += QLatin1String("--limit=") + QString::number(settings().intValue(BazaarSettings::logCountKey)); m_client->log(state.topLevel(), QStringList(), extraOptions); } void BazaarPlugin::revertAll() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); QDialog dialog(ICore::dialogParent()); Ui::RevertDialog revertUi; revertUi.setupUi(&dialog); if (dialog.exec() != QDialog::Accepted) return; m_client->revertAll(state.topLevel(), revertUi.revisionLineEdit->text()); } void BazaarPlugin::statusMulti() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); m_client->status(state.topLevel()); } void BazaarPlugin::createRepositoryActions(const Context &context) { QAction *action = 0; Core::Command *command = 0; action = new QAction(tr("Pull..."), this); m_repositoryActionList.append(action); command = ActionManager::registerAction(action, PULL, context); connect(action, SIGNAL(triggered()), this, SLOT(pull())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); action = new QAction(tr("Push..."), this); m_repositoryActionList.append(action); command = ActionManager::registerAction(action, PUSH, context); connect(action, SIGNAL(triggered()), this, SLOT(push())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); action = new QAction(tr("Update..."), this); m_repositoryActionList.append(action); command = ActionManager::registerAction(action, UPDATE, context); connect(action, SIGNAL(triggered()), this, SLOT(update())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); action = new QAction(tr("Commit..."), this); m_repositoryActionList.append(action); command = ActionManager::registerAction(action, COMMIT, context); command->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Meta+Z,Meta+C") : tr("ALT+Z,Alt+C"))); connect(action, SIGNAL(triggered()), this, SLOT(commit())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); action = new QAction(tr("Uncommit..."), this); m_repositoryActionList.append(action); command = ActionManager::registerAction(action, UNCOMMIT, context); connect(action, SIGNAL(triggered()), this, SLOT(uncommit())); m_bazaarContainer->addAction(command); m_commandLocator->appendCommand(command); QAction *createRepositoryAction = new QAction(tr("Create Repository..."), this); command = ActionManager::registerAction(createRepositoryAction, CREATE_REPOSITORY, context); connect(createRepositoryAction, SIGNAL(triggered()), this, SLOT(createRepository())); m_bazaarContainer->addAction(command); } void BazaarPlugin::pull() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); PullOrPushDialog dialog(PullOrPushDialog::PullMode, ICore::dialogParent()); if (dialog.exec() != QDialog::Accepted) return; QStringList extraOptions; if (dialog.isRememberOptionEnabled()) extraOptions += QLatin1String("--remember"); if (dialog.isOverwriteOptionEnabled()) extraOptions += QLatin1String("--overwrite"); if (dialog.isLocalOptionEnabled()) extraOptions += QLatin1String("--local"); if (!dialog.revision().isEmpty()) extraOptions << QLatin1String("-r") << dialog.revision(); m_client->synchronousPull(state.topLevel(), dialog.branchLocation(), extraOptions); } void BazaarPlugin::push() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); PullOrPushDialog dialog(PullOrPushDialog::PushMode, ICore::dialogParent()); if (dialog.exec() != QDialog::Accepted) return; QStringList extraOptions; if (dialog.isRememberOptionEnabled()) extraOptions += QLatin1String("--remember"); if (dialog.isOverwriteOptionEnabled()) extraOptions += QLatin1String("--overwrite"); if (dialog.isUseExistingDirectoryOptionEnabled()) extraOptions += QLatin1String("--use-existing-dir"); if (dialog.isCreatePrefixOptionEnabled()) extraOptions += QLatin1String("--create-prefix"); if (!dialog.revision().isEmpty()) extraOptions << QLatin1String("-r") << dialog.revision(); m_client->synchronousPush(state.topLevel(), dialog.branchLocation(), extraOptions); } void BazaarPlugin::update() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); QDialog dialog(ICore::dialogParent()); Ui::RevertDialog revertUi; revertUi.setupUi(&dialog); dialog.setWindowTitle(tr("Update")); if (dialog.exec() != QDialog::Accepted) return; m_client->update(state.topLevel(), revertUi.revisionLineEdit->text()); } void BazaarPlugin::createSubmitEditorActions() { Context context(COMMIT_ID); Core::Command *command; m_editorCommit = new QAction(VcsBaseSubmitEditor::submitIcon(), tr("Commit"), this); command = ActionManager::registerAction(m_editorCommit, COMMIT, context); command->setAttribute(Core::Command::CA_UpdateText); connect(m_editorCommit, SIGNAL(triggered()), this, SLOT(commitFromEditor())); m_editorDiff = new QAction(VcsBaseSubmitEditor::diffIcon(), tr("Diff &Selected Files"), this); command = ActionManager::registerAction(m_editorDiff, DIFFEDITOR, context); m_editorUndo = new QAction(tr("&Undo"), this); command = ActionManager::registerAction(m_editorUndo, Core::Constants::UNDO, context); m_editorRedo = new QAction(tr("&Redo"), this); command = ActionManager::registerAction(m_editorRedo, Core::Constants::REDO, context); } void BazaarPlugin::commit() { if (raiseSubmitEditor()) return; const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); m_submitRepository = state.topLevel(); connect(m_client, SIGNAL(parsedStatus(QList)), this, SLOT(showCommitWidget(QList))); // The "--short" option allows to easily parse status output m_client->emitParsedStatus(m_submitRepository, QStringList(QLatin1String("--short"))); } void BazaarPlugin::showCommitWidget(const QList &status) { //Once we receive our data release the connection so it can be reused elsewhere disconnect(m_client, SIGNAL(parsedStatus(QList)), this, SLOT(showCommitWidget(QList))); if (status.isEmpty()) { VcsOutputWindow::appendError(tr("There are no changes to commit.")); return; } // Start new temp file TempFileSaver saver; // Keep the file alive, else it removes self and forgets its name saver.setAutoRemove(false); if (!saver.finalize()) { VcsOutputWindow::appendError(saver.errorString()); return; } IEditor *editor = EditorManager::openEditor(saver.fileName(), COMMIT_ID); if (!editor) { VcsOutputWindow::appendError(tr("Unable to create an editor for the commit.")); return; } CommitEditor *commitEditor = qobject_cast(editor); if (!commitEditor) { VcsOutputWindow::appendError(tr("Unable to create a commit editor.")); return; } setSubmitEditor(commitEditor); commitEditor->registerActions(m_editorUndo, m_editorRedo, m_editorCommit, m_editorDiff); connect(commitEditor, SIGNAL(diffSelectedFiles(QStringList)), this, SLOT(diffFromEditorSelected(QStringList))); commitEditor->setCheckScriptWorkingDirectory(m_submitRepository); const QString msg = tr("Commit changes for \"%1\"."). arg(QDir::toNativeSeparators(m_submitRepository)); commitEditor->document()->setDisplayName(msg); const BranchInfo branch = m_client->synchronousBranchQuery(m_submitRepository); commitEditor->setFields(m_submitRepository, branch, m_bazaarSettings.stringValue(BazaarSettings::userNameKey), m_bazaarSettings.stringValue(BazaarSettings::userEmailKey), status); } void BazaarPlugin::diffFromEditorSelected(const QStringList &files) { m_client->diff(m_submitRepository, files); } #ifdef WITH_TESTS void BazaarPlugin::testDiffFileResolving_data() { QTest::addColumn("header"); QTest::addColumn("fileName"); QTest::newRow("New") << QByteArray( "=== added file 'src/plugins/bazaar/bazaareditor.cpp'\n" "--- src/plugins/bazaar/bazaareditor.cpp\t1970-01-01 00:00:00 +0000\n" "+++ src/plugins/bazaar/bazaareditor.cpp\t2013-01-20 21:39:47 +0000\n" "@@ -0,0 +1,121 @@\n\n") << QByteArray("src/plugins/bazaar/bazaareditor.cpp"); QTest::newRow("Deleted") << QByteArray( "=== removed file 'src/plugins/bazaar/bazaareditor.cpp'\n" "--- src/plugins/bazaar/bazaareditor.cpp\t2013-01-20 21:39:47 +0000\n" "+++ src/plugins/bazaar/bazaareditor.cpp\t1970-01-01 00:00:00 +0000\n" "@@ -1,121 +0,0 @@\n\n") << QByteArray("src/plugins/bazaar/bazaareditor.cpp"); QTest::newRow("Modified") << QByteArray( "=== modified file 'src/plugins/bazaar/bazaareditor.cpp'\n" "--- src/plugins/bazaar/bazaareditor.cpp\t2010-08-27 14:12:44 +0000\n" "+++ src/plugins/bazaar/bazaareditor.cpp\t2011-02-28 21:24:19 +0000\n" "@@ -727,6 +727,9 @@\n\n") << QByteArray("src/plugins/bazaar/bazaareditor.cpp"); } void BazaarPlugin::testDiffFileResolving() { VcsBaseEditorWidget::testDiffFileResolving(editorParameters[2].id); } void BazaarPlugin::testLogResolving() { QByteArray data( "------------------------------------------------------------\n" "revno: 6572 [merge]\n" "committer: Patch Queue Manager \n" "branch nick: +trunk\n" "timestamp: Mon 2012-12-10 10:18:33 +0000\n" "message:\n" " (vila) Fix LC_ALL=C test failures related to utf8 stderr encoding (Vincent\n" " Ladeuil)\n" "------------------------------------------------------------\n" "revno: 6571 [merge]\n" "committer: Patch Queue Manager \n" "branch nick: +trunk\n" "timestamp: Thu 2012-10-25 11:13:27 +0000\n" "message:\n" " (gz) Set approved revision and vote \"Approve\" when using lp-propose\n" " --approve (Jonathan Lange)\n" ); VcsBaseEditorWidget::testLogResolving(editorParameters[0].id, data, "6572", "6571"); } #endif void BazaarPlugin::commitFromEditor() { // Close the submit editor m_submitActionTriggered = true; QTC_ASSERT(submitEditor(), return); EditorManager::closeDocument(submitEditor()->document()); } void BazaarPlugin::uncommit() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); UnCommitDialog dialog(ICore::dialogParent()); if (dialog.exec() == QDialog::Accepted) m_client->synchronousUncommit(state.topLevel(), dialog.revision(), dialog.extraOptions()); } bool BazaarPlugin::submitEditorAboutToClose() { CommitEditor *commitEditor = qobject_cast(submitEditor()); QTC_ASSERT(commitEditor, return true); IDocument *editorDocument = commitEditor->document(); QTC_ASSERT(editorDocument, return true); bool dummyPrompt = false; const VcsBaseSubmitEditor::PromptSubmitResult response = commitEditor->promptSubmit(tr("Close Commit Editor"), tr("Do you want to commit the changes?"), tr("Message check failed. Do you want to proceed?"), &dummyPrompt, !m_submitActionTriggered); m_submitActionTriggered = false; switch (response) { case VcsBaseSubmitEditor::SubmitCanceled: return false; case VcsBaseSubmitEditor::SubmitDiscarded: return true; default: break; } QStringList files = commitEditor->checkedFiles(); if (!files.empty()) { //save the commit message if (!DocumentManager::saveDocument(editorDocument)) return false; //rewrite entries of the form 'file => newfile' to 'newfile' because //this would mess the commit command for (QStringList::iterator iFile = files.begin(); iFile != files.end(); ++iFile) { const QStringList parts = iFile->split(QLatin1String(" => "), QString::SkipEmptyParts); if (!parts.isEmpty()) *iFile = parts.last(); } BazaarCommitWidget *commitWidget = commitEditor->commitWidget(); QStringList extraOptions; // Author if (!commitWidget->committer().isEmpty()) extraOptions.append(QLatin1String("--author=") + commitWidget->committer()); // Fixed bugs foreach (const QString &fix, commitWidget->fixedBugs()) { if (!fix.isEmpty()) extraOptions << QLatin1String("--fixes") << fix; } // Whether local commit or not if (commitWidget->isLocalOptionEnabled()) extraOptions += QLatin1String("--local"); m_client->commit(m_submitRepository, files, editorDocument->filePath(), extraOptions); } return true; } void BazaarPlugin::updateActions(VcsBase::VcsBasePlugin::ActionState as) { if (!enableMenuAction(as, m_menuAction)) { m_commandLocator->setEnabled(false); return; } const QString filename = currentState().currentFileName(); const bool repoEnabled = currentState().hasTopLevel(); m_commandLocator->setEnabled(repoEnabled); m_annotateFile->setParameter(filename); m_diffFile->setParameter(filename); m_logFile->setParameter(filename); m_addAction->setParameter(filename); m_deleteAction->setParameter(filename); m_revertFile->setParameter(filename); m_statusFile->setParameter(filename); foreach (QAction *repoAction, m_repositoryActionList) repoAction->setEnabled(repoEnabled); } } // namespace Internal } // namespace Bazaar