Newer
Older
/**************************************************************************
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Nokia Corporation (qt-info@nokia.com)
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
** 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 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** If you are unsure which license is appropriate for your use, please
**************************************************************************/
#include "subversionplugin.h"
#include "settingspage.h"
#include "subversioneditor.h"
#include "subversionsubmiteditor.h"
#include "subversionconstants.h"
#include "subversioncontrol.h"
#include "checkoutwizard.h"
#include <vcsbase/basevcseditorfactory.h>
#include <vcsbase/vcsbaseeditor.h>
#include <vcsbase/basevcssubmiteditorfactory.h>
#include <vcsbase/vcsbaseoutputwindow.h>
#include <utils/parameteraction.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>
#include <projectexplorer/projectexplorer.h>
#include <QtCore/QDir>
#include <QtCore/QTextCodec>
#include <QtCore/QtPlugin>
#include <QtGui/QFileDialog>
#include <QtGui/QMainWindow>
#include <QtGui/QInputDialog>
#include <limits.h>
using namespace Subversion::Internal;
// Timeout for normal output commands
enum { subversionShortTimeOut = 10000 };
// Timeout for submit, update
enum { subversionLongTimeOut = 120000 };
static const char * const CMD_ID_SUBVERSION_MENU = "Subversion.Menu";
static const char * const CMD_ID_ADD = "Subversion.Add";
static const char * const CMD_ID_DELETE_FILE = "Subversion.Delete";
static const char * const CMD_ID_REVERT = "Subversion.Revert";
static const char * const CMD_ID_SEPARATOR0 = "Subversion.Separator0";
static const char * const CMD_ID_DIFF_PROJECT = "Subversion.DiffAll";
static const char * const CMD_ID_DIFF_CURRENT = "Subversion.DiffCurrent";
static const char * const CMD_ID_SEPARATOR1 = "Subversion.Separator1";
static const char * const CMD_ID_COMMIT_ALL = "Subversion.CommitAll";
static const char * const CMD_ID_COMMIT_CURRENT = "Subversion.CommitCurrent";
static const char * const CMD_ID_SEPARATOR2 = "Subversion.Separator2";
static const char * const CMD_ID_FILELOG_CURRENT = "Subversion.FilelogCurrent";
static const char * const CMD_ID_ANNOTATE_CURRENT = "Subversion.AnnotateCurrent";
static const char * const CMD_ID_SEPARATOR3 = "Subversion.Separator3";
static const char * const CMD_ID_STATUS = "Subversion.Status";
static const char * const CMD_ID_UPDATE = "Subversion.Update";
static const char * const CMD_ID_DESCRIBE = "Subversion.Describe";
static const char *nonInteractiveOptionC = "--non-interactive";
static const VCSBase::VCSBaseEditorParameters editorParameters[] = {
{
VCSBase::RegularCommandOutput,
"Subversion Command Log Editor", // kind
"Subversion Command Log Editor", // context
"application/vnd.nokia.text.scs_svn_commandlog",
"scslog"},
{ VCSBase::LogOutput,
"Subversion File Log Editor", // kind
"Subversion File Log Editor", // context
"application/vnd.nokia.text.scs_svn_filelog",
"scsfilelog"},
{ VCSBase::AnnotateOutput,
"Subversion Annotation Editor", // kind
"Subversion Annotation Editor", // context
"application/vnd.nokia.text.scs_svn_annotation",
"scsannotate"},
{ VCSBase::DiffOutput,
"Subversion Diff Editor", // kind
"Subversion Diff Editor", // context
"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");
}
Core::IEditor* locateEditor(const char *property, const QString &entry)
foreach (Core::IEditor *ed, Core::EditorManager::instance()->openedEditors())
if (ed->property(property).toString() == entry)
return ed;
return 0;
}

Friedemann Kleint
committed
// 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); // Column 8 starting from svn 1.6
changeSet.push_back(SubversionSubmitEditor::StatusFilePair(QString(state), fileName.trimmed()));

Friedemann Kleint
committed
}
}
}
return changeSet;
}
// Return a list of names for the internal svn directories
static inline QStringList svnDirectories()
{
QStringList rc(QLatin1String(".svn"));
#ifdef Q_OS_WIN
// Option on Windows systems to avoid hassle with some IDEs
rc.push_back(QLatin1String("_svn"));
#endif
return rc;
}
// ------------- SubversionPlugin
SubversionPlugin *SubversionPlugin::m_subversionPluginInstance = 0;
SubversionPlugin::SubversionPlugin() :
m_svnDirectories(svnDirectories()),
m_versionControl(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),
m_submitActionTriggered(false)
Loading
Loading full blame...