Skip to content
Snippets Groups Projects
subversionplugin.cpp 39.7 KiB
Newer Older
con's avatar
con committed
/***************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
con's avatar
con committed
**
** Contact:  Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
con's avatar
con committed
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
con's avatar
con committed
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file.  Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/
hjk's avatar
hjk committed

con's avatar
con committed
#include "subversionplugin.h"

#include "settingspage.h"
#include "subversioneditor.h"

#include "subversionoutputwindow.h"
#include "subversionsubmiteditor.h"
#include "changenumberdialog.h"
#include "subversionconstants.h"
#include "subversioncontrol.h"

#include <vcsbase/basevcseditorfactory.h>
#include <vcsbase/vcsbaseeditor.h>
#include <vcsbase/basevcssubmiteditorfactory.h>
#include <utils/synchronousprocess.h>

#include <coreplugin/icore.h>
#include <coreplugin/coreconstants.h>
#include <coreplugin/filemanager.h>
#include <coreplugin/messagemanager.h>
#include <coreplugin/mimedatabase.h>
#include <coreplugin/uniqueidmanager.h>
#include <coreplugin/actionmanager/actionmanager.h>
con's avatar
con committed
#include <coreplugin/editormanager/editormanager.h>
#include <projectexplorer/ProjectExplorerInterfaces>
hjk's avatar
hjk committed
#include <utils/qtcassert.h>
con's avatar
con committed

#include <QtCore/qplugin.h>
#include <QtCore/QDebug>
#include <QtCore/QTextCodec>
#include <QtCore/QFileInfo>
#include <QtCore/QTemporaryFile>
#include <QtCore/QDir>
#include <QtGui/QAction>
#include <QtGui/QMenu>
#include <QtGui/QMessageBox>
#include <QtGui/QMainWindow>
#include <QtGui/QFileDialog>

using namespace Subversion::Internal;

// Timeout for normal output commands
enum { subversionShortTimeOut = 10000 };
// Timeout for submit, update
enum { subversionLongTimeOut = 120000 };

// #pragma mark -- SubversionPlugin

const char * const SubversionPlugin::SUBVERSION_MENU    = "Subversion.Menu";
const char * const SubversionPlugin::ADD                = "Subversion.Add";
const char * const SubversionPlugin::DELETE_FILE        = "Subversion.Delete";
const char * const SubversionPlugin::REVERT             = "Subversion.Revert";
const char * const SubversionPlugin::SEPARATOR0         = "Subversion.Separator0";
const char * const SubversionPlugin::DIFF_PROJECT       = "Subversion.DiffAll";
const char * const SubversionPlugin::DIFF_CURRENT       = "Subversion.DiffCurrent";
const char * const SubversionPlugin::SEPARATOR1         = "Subversion.Separator1";
const char * const SubversionPlugin::COMMIT_ALL         = "Subversion.CommitAll";
const char * const SubversionPlugin::COMMIT_CURRENT     = "Subversion.CommitCurrent";
const char * const SubversionPlugin::SEPARATOR2         = "Subversion.Separator2";
const char * const SubversionPlugin::FILELOG_CURRENT    = "Subversion.FilelogCurrent";
const char * const SubversionPlugin::ANNOTATE_CURRENT   = "Subversion.AnnotateCurrent";
const char * const SubversionPlugin::SEPARATOR3         = "Subversion.Separator3";
const char * const SubversionPlugin::STATUS             = "Subversion.Status";
const char * const SubversionPlugin::UPDATE             = "Subversion.Update";

static const VCSBase::VCSBaseEditorParameters editorParameters[] = {
{
    VCSBase::RegularCommandOutput,
    "Subversion Command Log Editor",
    Core::Constants::C_GLOBAL,
    "application/vnd.nokia.text.scs_svn_commandlog",
    "scslog"},
{   VCSBase::LogOutput,
    "Subversion File Log Editor",
    Core::Constants::C_GLOBAL,
    "application/vnd.nokia.text.scs_svn_filelog",
    "scsfilelog"},
{    VCSBase::AnnotateOutput,
    "Subversion Annotation Editor",
    Core::Constants::C_GLOBAL,
    "application/vnd.nokia.text.scs_svn_annotation",
    "scsannotate"},
{   VCSBase::DiffOutput,
    "Subversion Diff Editor",
    Core::Constants::C_GLOBAL,
    "text/x-patch","diff"}
};

// Utility to find a parameter set by type
static inline const VCSBase::VCSBaseEditorParameters *findType(int ie)
{
    const VCSBase::EditorContentType et = static_cast<VCSBase::EditorContentType>(ie);
    return  VCSBase::VCSBaseEditor::findType(editorParameters, sizeof(editorParameters)/sizeof(VCSBase::VCSBaseEditorParameters), et);
}

static inline QString debugCodec(const QTextCodec *c)
{
    return c ? QString::fromAscii(c->name()) : QString::fromAscii("Null codec");
}

inline Core::IEditor* locateEditor(const Core::ICore *core, const char *property, const QString &entry)
{
    foreach (Core::IEditor *ed, core->editorManager()->openedEditors())
        if (ed->property(property).toString() == entry)
            return ed;
    return 0;
}

// Parse "svn status" output for added/modified/deleted files
// "M<7blanks>file"
typedef QList<SubversionSubmitEditor::StatusFilePair> StatusList;

StatusList parseStatusOutput(const QString &output)
{
    StatusList changeSet;
    const QString newLine = QString(QLatin1Char('\n'));
    const QStringList list = output.split(newLine, QString::SkipEmptyParts);
    foreach (const QString &l, list) {
        const QString line =l.trimmed();
        if (line.size() > 8) {
            const QChar state = line.at(0);
            if (state == QLatin1Char('A') || state == QLatin1Char('D') || state == QLatin1Char('M')) {
                const QString fileName = line.mid(7);
                changeSet.push_back(SubversionSubmitEditor::StatusFilePair(QString(state), fileName));
            }

        }
    }
    return changeSet;
}

con's avatar
con committed
// ------------- SubversionPlugin
Core::ICore *SubversionPlugin::m_coreInstance = 0;
SubversionPlugin *SubversionPlugin::m_subversionPluginInstance = 0;

SubversionPlugin::SubversionPlugin() :
    m_svnDotDirectory(QLatin1String(".svn")),
    m_versionControl(0),
    m_coreListener(0),
    m_settingsPage(0),
    m_changeTmpFile(0),
    m_submitEditorFactory(0),
    m_subversionOutputWindow(0),
    m_projectExplorer(0),
    m_addAction(0),
    m_deleteAction(0),
    m_revertAction(0),
    m_diffProjectAction(0),
    m_diffCurrentAction(0),
    m_commitAllAction(0),
    m_commitCurrentAction(0),
    m_filelogCurrentAction(0),
    m_annotateCurrentAction(0),
    m_statusAction(0),
    m_updateProjectAction(0),
    m_submitCurrentLogAction(0),
    m_submitDiffAction(0),
    m_submitUndoAction(0),
    m_submitRedoAction(0)
{
}

SubversionPlugin::~SubversionPlugin()
{
    if (m_versionControl) {
        removeObject(m_versionControl);
        delete m_versionControl;
Loading
Loading full blame...