forked from qt-creator/qt-creator
VCS[Perforce/SVN/CVS]: Add "Annotate" to single file logs.
...over change numbers. Add missing "Log project/repository" actions and log count limits. Task-number: QTCREATORBUG-503
This commit is contained in:
@@ -54,6 +54,7 @@ CVSEditor::CVSEditor(const VCSBase::VCSBaseEditorParameters *type,
|
||||
{
|
||||
QTC_ASSERT(m_revisionAnnotationPattern.isValid(), return);
|
||||
QTC_ASSERT(m_revisionLogPattern.isValid(), return);
|
||||
setAnnotateRevisionTextFormat(tr("Annotate revision \"%1\""));
|
||||
}
|
||||
|
||||
QSet<QString> CVSEditor::annotationChanges() const
|
||||
@@ -149,11 +150,10 @@ QString CVSEditor::fileNameFromDiffSpecification(const QTextBlock &inBlock) cons
|
||||
return QString();
|
||||
}
|
||||
|
||||
QStringList CVSEditor::annotationPreviousVersions(const QString &revision, QString *actionTextFormat) const
|
||||
QStringList CVSEditor::annotationPreviousVersions(const QString &revision) const
|
||||
{
|
||||
if (isFirstRevision(revision))
|
||||
return QStringList();
|
||||
*actionTextFormat = tr("Annotate revision \"%1\"");
|
||||
return QStringList(previousRevision(revision));
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ private:
|
||||
virtual VCSBase::DiffHighlighter *createDiffHighlighter() const;
|
||||
virtual VCSBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const;
|
||||
virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileName) const;
|
||||
virtual QStringList annotationPreviousVersions(const QString &revision, QString *actionTextFormat) const;
|
||||
virtual QStringList annotationPreviousVersions(const QString &revision) const;
|
||||
|
||||
const QRegExp m_revisionAnnotationPattern;
|
||||
const QRegExp m_revisionLogPattern;
|
||||
|
||||
@@ -95,6 +95,9 @@ static const char * const CMD_ID_ANNOTATE_CURRENT = "CVS.AnnotateCurrent";
|
||||
static const char * const CMD_ID_SEPARATOR3 = "CVS.Separator3";
|
||||
static const char * const CMD_ID_STATUS = "CVS.Status";
|
||||
static const char * const CMD_ID_UPDATE = "CVS.Update";
|
||||
static const char * const CMD_ID_PROJECTLOG = "CVS.ProjectLog";
|
||||
static const char * const CMD_ID_REPOSITORYLOG = "CVS.RepositoryLog";
|
||||
static const char * const CMD_ID_SEPARATOR4 = "CVS.Separator4";
|
||||
|
||||
static const VCSBase::VCSBaseEditorParameters editorParameters[] = {
|
||||
{
|
||||
@@ -149,6 +152,8 @@ CVSPlugin::CVSPlugin() :
|
||||
m_revertAction(0),
|
||||
m_diffProjectAction(0),
|
||||
m_diffCurrentAction(0),
|
||||
m_logProjectAction(0),
|
||||
m_logRepositoryAction(0),
|
||||
m_commitAllAction(0),
|
||||
m_commitCurrentAction(0),
|
||||
m_filelogCurrentAction(0),
|
||||
@@ -325,12 +330,24 @@ bool CVSPlugin::initialize(const QStringList & /*arguments */, QString *errorMes
|
||||
connect(m_statusProjectAction, SIGNAL(triggered()), this, SLOT(projectStatus()));
|
||||
cvsMenu->addAction(command);
|
||||
|
||||
m_logProjectAction = new Utils::ParameterAction(tr("Log Project"), tr("Log Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
|
||||
command = ami->registerAction(m_logProjectAction, CMD_ID_PROJECTLOG, globalcontext);
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
connect(m_logProjectAction, SIGNAL(triggered()), this, SLOT(logProject()));
|
||||
cvsMenu->addAction(command);
|
||||
|
||||
m_updateProjectAction = new Utils::ParameterAction(tr("Update Project"), tr("Update Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
|
||||
command = ami->registerAction(m_updateProjectAction, CMD_ID_UPDATE, globalcontext);
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
connect(m_updateProjectAction, SIGNAL(triggered()), this, SLOT(updateProject()));
|
||||
cvsMenu->addAction(command);
|
||||
|
||||
cvsMenu->addAction(createSeparator(this, ami, CMD_ID_SEPARATOR4, globalcontext));
|
||||
m_logRepositoryAction = new QAction(tr("Repository Log"), this);
|
||||
command = ami->registerAction(m_logRepositoryAction, CMD_ID_REPOSITORYLOG, globalcontext);
|
||||
connect(m_logRepositoryAction, SIGNAL(triggered()), this, SLOT(logRepository()));
|
||||
cvsMenu->addAction(command);
|
||||
|
||||
// Actions of the submit editor
|
||||
QList<int> cvscommitcontext;
|
||||
cvscommitcontext << Core::UniqueIDManager::instance()->uniqueIdentifier(Constants::CVSCOMMITEDITOR);
|
||||
@@ -475,6 +492,8 @@ void CVSPlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
|
||||
if (!VCSBase::VCSBasePlugin::enableMenuAction(as, m_menuAction))
|
||||
return;
|
||||
|
||||
m_logRepositoryAction->setEnabled(currentState().hasTopLevel());
|
||||
|
||||
const QString currentFileName = currentState().currentFileName();
|
||||
m_addAction->setParameter(currentFileName);
|
||||
m_deleteAction->setParameter(currentFileName);
|
||||
@@ -488,6 +507,7 @@ void CVSPlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
|
||||
m_diffProjectAction->setParameter(currentProjectName);
|
||||
m_statusProjectAction->setParameter(currentProjectName);
|
||||
m_updateProjectAction->setParameter(currentProjectName);
|
||||
m_logProjectAction->setParameter(currentProjectName);
|
||||
|
||||
m_commitAllAction->setEnabled(currentState().hasTopLevel());
|
||||
}
|
||||
@@ -641,10 +661,26 @@ void CVSPlugin::filelogCurrentFile()
|
||||
{
|
||||
const VCSBase::VCSBasePluginState state = currentState();
|
||||
QTC_ASSERT(state.hasFile(), return)
|
||||
filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()));
|
||||
filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), true);
|
||||
}
|
||||
|
||||
void CVSPlugin::filelog(const QString &workingDir, const QStringList &files)
|
||||
void CVSPlugin::logProject()
|
||||
{
|
||||
const VCSBase::VCSBasePluginState state = currentState();
|
||||
QTC_ASSERT(state.hasProject(), return)
|
||||
filelog(state.currentProjectTopLevel(), state.relativeCurrentProject());
|
||||
}
|
||||
|
||||
void CVSPlugin::logRepository()
|
||||
{
|
||||
const VCSBase::VCSBasePluginState state = currentState();
|
||||
QTC_ASSERT(state.hasTopLevel(), return)
|
||||
filelog(state.topLevel());
|
||||
}
|
||||
|
||||
void CVSPlugin::filelog(const QString &workingDir,
|
||||
const QStringList &files,
|
||||
bool enableAnnotationContextMenu)
|
||||
{
|
||||
QTextCodec *codec = VCSBase::VCSBaseEditor::getCodec(workingDir, files);
|
||||
// no need for temp file
|
||||
@@ -659,7 +695,6 @@ void CVSPlugin::filelog(const QString &workingDir, const QStringList &files)
|
||||
|
||||
// Re-use an existing view if possible to support
|
||||
// the common usage pattern of continuously changing and diffing a file
|
||||
|
||||
if (Core::IEditor *editor = locateEditor("logFileName", id)) {
|
||||
editor->createNew(response.stdOut);
|
||||
Core::EditorManager::instance()->activateEditor(editor);
|
||||
@@ -667,6 +702,8 @@ void CVSPlugin::filelog(const QString &workingDir, const QStringList &files)
|
||||
const QString title = QString::fromLatin1("cvs log %1").arg(id);
|
||||
Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::LogOutput, source, codec);
|
||||
newEditor->setProperty("logFileName", id);
|
||||
if (enableAnnotationContextMenu)
|
||||
VCSBase::VCSBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -726,8 +763,6 @@ void CVSPlugin::annotate(const QString &workingDir, const QString &file,
|
||||
const QString title = QString::fromLatin1("cvs annotate %1").arg(id);
|
||||
Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::AnnotateOutput, source, codec);
|
||||
newEditor->setProperty("annotateFileName", id);
|
||||
connect(newEditor, SIGNAL(annotatePreviousRequested(QString,QString,int)),
|
||||
this, SLOT(annotateVersion(QString,QString,int)));
|
||||
VCSBase::VCSBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
|
||||
}
|
||||
}
|
||||
@@ -992,6 +1027,8 @@ Core::IEditor * CVSPlugin::showOutputInEditor(const QString& title, const QStrin
|
||||
qDebug() << "CVSPlugin::showOutputInEditor" << title << kind << "source=" << source << "Size= " << output.size() << " Type=" << editorType << debugCodec(codec);
|
||||
QString s = title;
|
||||
Core::IEditor *editor = Core::EditorManager::instance()->openEditorWithContents(kind, &s, output.toLocal8Bit());
|
||||
connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
|
||||
this, SLOT(annotateVersion(QString,QString,int)));
|
||||
CVSEditor *e = qobject_cast<CVSEditor*>(editor->widget());
|
||||
if (!e)
|
||||
return 0;
|
||||
|
||||
@@ -113,6 +113,8 @@ private slots:
|
||||
void updateProject();
|
||||
void submitCurrentLog();
|
||||
void diffCommitFiles(const QStringList &);
|
||||
void logProject();
|
||||
void logRepository();
|
||||
|
||||
protected:
|
||||
virtual void updateActions(VCSBase::VCSBasePlugin::ActionState);
|
||||
@@ -135,7 +137,9 @@ private:
|
||||
bool describe(const QString &source, const QString &changeNr, QString *errorMessage);
|
||||
bool describe(const QString &toplevel, const QString &source, const QString &changeNr, QString *errorMessage);
|
||||
bool describe(const QString &repository, QList<CVS_LogEntry> entries, QString *errorMessage);
|
||||
void filelog(const QString &workingDir, const QStringList &files = QStringList());
|
||||
void filelog(const QString &workingDir,
|
||||
const QStringList &files = QStringList(),
|
||||
bool enableAnnotationContextMenu = false);
|
||||
bool managesDirectory(const QDir &directory) const;
|
||||
QString findTopLevelForDirectoryI(const QString &directory) const;
|
||||
void startCommit(const QString &workingDir, const QStringList &files = QStringList());
|
||||
@@ -152,6 +156,8 @@ private:
|
||||
Utils::ParameterAction *m_revertAction;
|
||||
Utils::ParameterAction *m_diffProjectAction;
|
||||
Utils::ParameterAction *m_diffCurrentAction;
|
||||
Utils::ParameterAction *m_logProjectAction;
|
||||
QAction *m_logRepositoryAction;
|
||||
QAction *m_commitAllAction;
|
||||
Utils::ParameterAction *m_commitCurrentAction;
|
||||
Utils::ParameterAction *m_filelogCurrentAction;
|
||||
|
||||
@@ -62,6 +62,7 @@ PerforceEditor::PerforceEditor(const VCSBase::VCSBaseEditorParameters *type,
|
||||
m_plugin(PerforcePlugin::perforcePluginInstance())
|
||||
{
|
||||
QTC_ASSERT(m_changeNumberPattern.isValid(), /**/);
|
||||
setAnnotateRevisionTextFormat(tr("Annotate change list \"%1\""));
|
||||
if (Perforce::Constants::debug)
|
||||
qDebug() << "PerforceEditor::PerforceEditor" << type->type << type->kind;
|
||||
}
|
||||
@@ -154,13 +155,12 @@ QString PerforceEditor::fileNameFromDiffSpecification(const QTextBlock &inBlock)
|
||||
return QString();
|
||||
}
|
||||
|
||||
QStringList PerforceEditor::annotationPreviousVersions(const QString &v, QString *actionTextFormat) const
|
||||
QStringList PerforceEditor::annotationPreviousVersions(const QString &v) const
|
||||
{
|
||||
bool ok;
|
||||
const int changeList = v.toInt(&ok);
|
||||
if (!ok || changeList < 2)
|
||||
return QStringList();
|
||||
*actionTextFormat = tr("Annotate change list \"%1\"");
|
||||
return QStringList(QString::number(changeList - 1));
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ private:
|
||||
virtual VCSBase::DiffHighlighter *createDiffHighlighter() const;
|
||||
virtual VCSBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const;
|
||||
virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileName) const;
|
||||
virtual QStringList annotationPreviousVersions(const QString &v, QString *actionTextFormat) const;
|
||||
virtual QStringList annotationPreviousVersions(const QString &v) const;
|
||||
|
||||
const QRegExp m_changeNumberPattern;
|
||||
PerforcePlugin *m_plugin;
|
||||
|
||||
@@ -133,6 +133,8 @@ static const char * const CMD_ID_EDIT = "Perforce.Edit";
|
||||
static const char * const CMD_ID_ADD = "Perforce.Add";
|
||||
static const char * const CMD_ID_DELETE_FILE = "Perforce.Delete";
|
||||
static const char * const CMD_ID_OPENED = "Perforce.Opened";
|
||||
static const char * const CMD_ID_PROJECTLOG = "Perforce.ProjectLog";
|
||||
static const char * const CMD_ID_REPOSITORYLOG = "Perforce.RepositoryLog";
|
||||
static const char * const CMD_ID_REVERT = "Perforce.Revert";
|
||||
static const char * const CMD_ID_DIFF_CURRENT = "Perforce.DiffCurrent";
|
||||
static const char * const CMD_ID_DIFF_PROJECT = "Perforce.DiffProject";
|
||||
@@ -152,6 +154,7 @@ static const char * const CMD_ID_UPDATEALL = "Perforce.UpdateAll";
|
||||
static const char * const CMD_ID_SEPARATOR1 = "Perforce.Separator1";
|
||||
static const char * const CMD_ID_SEPARATOR2 = "Perforce.Separator2";
|
||||
static const char * const CMD_ID_SEPARATOR3 = "Perforce.Separator3";
|
||||
static const char * const CMD_ID_SEPARATOR4 = "Perforce.Separator4";
|
||||
|
||||
////
|
||||
// PerforcePlugin
|
||||
@@ -188,6 +191,8 @@ PerforcePlugin::PerforcePlugin() :
|
||||
m_annotateAction(0),
|
||||
m_filelogCurrentAction(0),
|
||||
m_filelogAction(0),
|
||||
m_logProjectAction(0),
|
||||
m_logRepositoryAction(0),
|
||||
m_submitCurrentLogAction(0),
|
||||
m_updateAllAction(0),
|
||||
m_submitActionTriggered(false),
|
||||
@@ -318,6 +323,12 @@ bool PerforcePlugin::initialize(const QStringList & /* arguments */, QString * e
|
||||
connect(m_openedAction, SIGNAL(triggered()), this, SLOT(printOpenedFileList()));
|
||||
mperforce->addAction(command);
|
||||
|
||||
m_logProjectAction = new Utils::ParameterAction(tr("Log Project Log"), tr("Log Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
|
||||
command = am->registerAction(m_logProjectAction, CMD_ID_PROJECTLOG, globalcontext);
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
connect(m_logProjectAction, SIGNAL(triggered()), this, SLOT(logProject()));
|
||||
mperforce->addAction(command);
|
||||
|
||||
m_submitProjectAction = new Utils::ParameterAction(tr("Submit Project"), tr("Submit Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
|
||||
command = am->registerAction(m_submitProjectAction, CMD_ID_SUBMIT, globalcontext);
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
@@ -385,6 +396,16 @@ bool PerforcePlugin::initialize(const QStringList & /* arguments */, QString * e
|
||||
connect(m_filelogAction, SIGNAL(triggered()), this, SLOT(filelog()));
|
||||
mperforce->addAction(command);
|
||||
|
||||
tmpaction = new QAction(this);
|
||||
tmpaction->setSeparator(true);
|
||||
command = am->registerAction(tmpaction, QLatin1String(CMD_ID_SEPARATOR4), globalcontext);
|
||||
mperforce->addAction(command);
|
||||
|
||||
m_logRepositoryAction = new QAction(tr("Repository Log"), this);
|
||||
command = am->registerAction(m_logRepositoryAction, CMD_ID_REPOSITORYLOG, globalcontext);
|
||||
connect(m_logRepositoryAction, SIGNAL(triggered()), this, SLOT(logRepository()));
|
||||
mperforce->addAction(command);
|
||||
|
||||
m_updateAllAction = new QAction(tr("Update All"), this);
|
||||
command = am->registerAction(m_updateAllAction, CMD_ID_UPDATEALL, globalcontext);
|
||||
connect(m_updateAllAction, SIGNAL(triggered()), this, SLOT(updateAll()));
|
||||
@@ -715,8 +736,6 @@ void PerforcePlugin::annotate(const QString &workingDir,
|
||||
Core::IEditor *ed = showOutputInEditor(tr("p4 annotate %1").arg(id),
|
||||
result.stdOut, VCSBase::AnnotateOutput,
|
||||
source, codec);
|
||||
connect(ed, SIGNAL(annotatePreviousRequested(QString,QString,int)),
|
||||
this, SLOT(annotateVersion(QString,QString,int)));
|
||||
VCSBase::VCSBaseEditor::gotoLineOfEditor(ed, lineNumber);
|
||||
}
|
||||
}
|
||||
@@ -725,7 +744,7 @@ void PerforcePlugin::filelogCurrentFile()
|
||||
{
|
||||
const VCSBase::VCSBasePluginState state = currentState();
|
||||
QTC_ASSERT(state.hasFile(), return)
|
||||
filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()));
|
||||
filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), true);
|
||||
}
|
||||
|
||||
void PerforcePlugin::filelog()
|
||||
@@ -737,21 +756,40 @@ void PerforcePlugin::filelog()
|
||||
}
|
||||
}
|
||||
|
||||
void PerforcePlugin::filelog(const QString &workingDir, const QStringList &fileNames)
|
||||
void PerforcePlugin::logProject()
|
||||
{
|
||||
const VCSBase::VCSBasePluginState state = currentState();
|
||||
QTC_ASSERT(state.hasProject(), return)
|
||||
filelog(state.currentProjectTopLevel(), perforceRelativeFileArguments(state.relativeCurrentProject()));
|
||||
}
|
||||
|
||||
void PerforcePlugin::logRepository()
|
||||
{
|
||||
const VCSBase::VCSBasePluginState state = currentState();
|
||||
QTC_ASSERT(state.hasTopLevel(), return)
|
||||
filelog(state.topLevel(), perforceRelativeFileArguments(QStringList()));
|
||||
}
|
||||
|
||||
void PerforcePlugin::filelog(const QString &workingDir, const QStringList &fileNames,
|
||||
bool enableAnnotationContextMenu)
|
||||
{
|
||||
const QString id = VCSBase::VCSBaseEditor::getTitleId(workingDir, fileNames);
|
||||
QTextCodec *codec = VCSBase::VCSBaseEditor::getCodec(workingDir, fileNames);
|
||||
QStringList args;
|
||||
args << QLatin1String("filelog") << QLatin1String("-li");
|
||||
if (m_settings.logCount() > 0)
|
||||
args << QLatin1String("-m") << QString::number(m_settings.logCount());
|
||||
args.append(fileNames);
|
||||
const PerforceResponse result = runP4Cmd(workingDir, args,
|
||||
CommandToWindow|StdErrToWindow|ErrorToWindow,
|
||||
QStringList(), QByteArray(), codec);
|
||||
if (!result.error)
|
||||
showOutputInEditor(tr("p4 filelog %1").arg(id), result.stdOut,
|
||||
VCSBase::LogOutput,
|
||||
VCSBase::VCSBaseEditor::getSource(workingDir, fileNames),
|
||||
codec);
|
||||
if (!result.error) {
|
||||
const QString source = VCSBase::VCSBaseEditor::getSource(workingDir, fileNames);
|
||||
Core::IEditor *editor = showOutputInEditor(tr("p4 filelog %1").arg(id), result.stdOut,
|
||||
VCSBase::LogOutput, source, codec);
|
||||
if (enableAnnotationContextMenu)
|
||||
VCSBase::VCSBaseEditor::getVcsBaseEditor(editor)->setFileLogAnnotateEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
void PerforcePlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
|
||||
@@ -759,6 +797,8 @@ void PerforcePlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
|
||||
if (!VCSBase::VCSBasePlugin::enableMenuAction(as, m_menuAction))
|
||||
return;
|
||||
|
||||
m_logRepositoryAction->setEnabled(currentState().hasTopLevel());
|
||||
|
||||
const QString fileName = currentState().currentFileName();
|
||||
m_editAction->setParameter(fileName);
|
||||
m_addAction->setParameter(fileName);
|
||||
@@ -769,6 +809,7 @@ void PerforcePlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
|
||||
m_filelogCurrentAction->setParameter(fileName);
|
||||
|
||||
const QString projectName = currentState().currentProjectName();
|
||||
m_logProjectAction->setParameter(projectName);
|
||||
m_updateProjectAction->setParameter(projectName);
|
||||
m_diffProjectAction->setParameter(projectName);
|
||||
m_submitProjectAction->setParameter(projectName);
|
||||
@@ -1110,6 +1151,8 @@ Core::IEditor * PerforcePlugin::showOutputInEditor(const QString& title, const Q
|
||||
qDebug() << "PerforcePlugin::showOutputInEditor" << title << kind << "Size= " << output.size() << " Type=" << editorType << debugCodec(codec);
|
||||
QString s = title;
|
||||
Core::IEditor *editor = Core::EditorManager::instance()->openEditorWithContents(kind, &s, output);
|
||||
connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
|
||||
this, SLOT(annotateVersion(QString,QString,int)));
|
||||
PerforceEditor *e = qobject_cast<PerforceEditor*>(editor->widget());
|
||||
if (!e)
|
||||
return 0;
|
||||
|
||||
@@ -123,6 +123,8 @@ private slots:
|
||||
void annotateVersion(const QString &file, const QString &revision, int lineNumber);
|
||||
void filelogCurrentFile();
|
||||
void filelog();
|
||||
void logProject();
|
||||
void logRepository();
|
||||
|
||||
void submitCurrentLog();
|
||||
void printPendingChanges();
|
||||
@@ -177,7 +179,8 @@ private:
|
||||
QString clientFilePath(const QString &serverFilePath);
|
||||
void annotate(const QString &workingDir, const QString &fileName,
|
||||
const QString &changeList = QString(), int lineNumber = -1);
|
||||
void filelog(const QString &workingDir, const QStringList &fileNames);
|
||||
void filelog(const QString &workingDir, const QStringList &fileNames = QStringList(),
|
||||
bool enableAnnotationContextMenu = false);
|
||||
void cleanCommitMessageFile();
|
||||
bool isCommitEditorOpen() const;
|
||||
QSharedPointer<QTemporaryFile> createTemporaryArgumentFile(const QStringList &extraArgs) const;
|
||||
@@ -208,6 +211,8 @@ private:
|
||||
QAction *m_annotateAction;
|
||||
Utils::ParameterAction *m_filelogCurrentAction;
|
||||
QAction *m_filelogAction;
|
||||
Utils::ParameterAction *m_logProjectAction;
|
||||
QAction *m_logRepositoryAction;
|
||||
QAction *m_submitCurrentLogAction;
|
||||
QAction *m_updateAllAction;
|
||||
bool m_submitActionTriggered;
|
||||
|
||||
@@ -47,8 +47,9 @@ static const char *clientKeyC = "Client";
|
||||
static const char *userKeyC = "User";
|
||||
static const char *promptToSubmitKeyC = "PromptForSubmit";
|
||||
static const char *timeOutKeyC = "TimeOut";
|
||||
static const char *logCountKeyC = "LogCount";
|
||||
|
||||
enum { defaultTimeOutS = 30 };
|
||||
enum { defaultTimeOutS = 30, defaultLogCount = 1000 };
|
||||
|
||||
static QString defaultCommand()
|
||||
{
|
||||
@@ -64,6 +65,7 @@ namespace Perforce {
|
||||
namespace Internal {
|
||||
|
||||
Settings::Settings() :
|
||||
logCount(defaultLogCount),
|
||||
defaultEnv(true),
|
||||
timeOutS(defaultTimeOutS),
|
||||
promptToSubmit(true)
|
||||
@@ -73,6 +75,7 @@ Settings::Settings() :
|
||||
bool Settings::equals(const Settings &rhs) const
|
||||
{
|
||||
return defaultEnv == rhs.defaultEnv
|
||||
&& logCount == rhs.logCount
|
||||
&& p4Command == rhs.p4Command && p4Port == rhs.p4Port
|
||||
&& p4Client == rhs.p4Client && p4User == rhs.p4User
|
||||
&& timeOutS == rhs.timeOutS && promptToSubmit == rhs.promptToSubmit;
|
||||
@@ -111,6 +114,7 @@ void PerforceSettings::fromSettings(QSettings *settings)
|
||||
m_settings.p4User = settings->value(QLatin1String(userKeyC), QString()).toString();
|
||||
m_settings.timeOutS = settings->value(QLatin1String(timeOutKeyC), defaultTimeOutS).toInt();
|
||||
m_settings.promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool();
|
||||
m_settings.logCount = settings->value(QLatin1String(logCountKeyC), int(defaultLogCount)).toInt();
|
||||
settings->endGroup();
|
||||
}
|
||||
|
||||
@@ -124,6 +128,7 @@ void PerforceSettings::toSettings(QSettings *settings) const
|
||||
settings->setValue(QLatin1String(userKeyC), m_settings.p4User);
|
||||
settings->setValue(QLatin1String(timeOutKeyC), m_settings.timeOutS);
|
||||
settings->setValue(QLatin1String(promptToSubmitKeyC), m_settings.promptToSubmit);
|
||||
settings->setValue(QLatin1String(logCountKeyC), m_settings.logCount);
|
||||
settings->endGroup();
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ struct Settings {
|
||||
QString p4Client;
|
||||
QString p4User;
|
||||
QString errorString;
|
||||
int logCount;
|
||||
bool defaultEnv;
|
||||
int timeOutS;
|
||||
bool promptToSubmit;
|
||||
@@ -97,6 +98,8 @@ public:
|
||||
inline int timeOutMS() const { return m_settings.timeOutS * 1000; }
|
||||
inline int longTimeOutMS() const { return m_settings.timeOutS * 10000; }
|
||||
|
||||
inline int logCount() const { return m_settings.logCount; }
|
||||
|
||||
QString topLevel() const;
|
||||
QString topLevelSymLinkTarget() const;
|
||||
|
||||
|
||||
@@ -82,6 +82,7 @@ Settings SettingsPageWidget::settings() const
|
||||
settings.p4User = m_ui.userLineEdit->text();
|
||||
settings.p4Client= m_ui.clientLineEdit->text();
|
||||
settings.timeOutS = m_ui.timeOutSpinBox->value();
|
||||
settings.logCount = m_ui.logCountSpinBox->value();
|
||||
settings.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked();
|
||||
return settings;
|
||||
}
|
||||
@@ -93,6 +94,7 @@ void SettingsPageWidget::setSettings(const PerforceSettings &s)
|
||||
m_ui.portLineEdit->setText(s.p4Port());
|
||||
m_ui.clientLineEdit->setText(s.p4Client());
|
||||
m_ui.userLineEdit->setText(s.p4User());
|
||||
m_ui.logCountSpinBox->setValue(s.logCount());
|
||||
m_ui.timeOutSpinBox->setValue(s.timeOutS());
|
||||
m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit());
|
||||
}
|
||||
|
||||
@@ -90,21 +90,17 @@
|
||||
<string>Miscellaneous</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="promptToSubmitCheckBox">
|
||||
<property name="text">
|
||||
<string>Prompt on submit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="timeOutLabel">
|
||||
<property name="text">
|
||||
<string>Timeout:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<item row="1" column="1">
|
||||
<widget class="QSpinBox" name="timeOutSpinBox">
|
||||
<property name="suffix">
|
||||
<string>s</string>
|
||||
@@ -117,6 +113,27 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="promptToSubmitCheckBox">
|
||||
<property name="text">
|
||||
<string>Prompt on submit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="logCountLabel">
|
||||
<property name="text">
|
||||
<string>Log count:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSpinBox" name="logCountSpinBox">
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -63,6 +63,7 @@ SubversionSettings SettingsPageWidget::settings() const
|
||||
rc.useAuthentication = false;
|
||||
rc.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked();
|
||||
rc.spaceIgnorantAnnotation = m_ui.spaceIgnorantAnnotationCheckBox->isChecked();
|
||||
rc.logCount = m_ui.logCountSpinBox->value();
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -75,6 +76,7 @@ void SettingsPageWidget::setSettings(const SubversionSettings &s)
|
||||
m_ui.timeOutSpinBox->setValue(s.timeOutS);
|
||||
m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit);
|
||||
m_ui.spaceIgnorantAnnotationCheckBox->setChecked(s.spaceIgnorantAnnotation);
|
||||
m_ui.logCountSpinBox->setValue(s.logCount);
|
||||
}
|
||||
|
||||
QString SettingsPageWidget::searchKeywords() const
|
||||
|
||||
@@ -2,14 +2,6 @@
|
||||
<ui version="4.0">
|
||||
<class>Subversion::Internal::SettingsPage</class>
|
||||
<widget class="QWidget" name="Subversion::Internal::SettingsPage">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>496</width>
|
||||
<height>295</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="generalGroupBox">
|
||||
@@ -72,21 +64,17 @@
|
||||
<string>Miscellaneous</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="promptToSubmitCheckBox">
|
||||
<property name="text">
|
||||
<string>Prompt on submit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="timeOutLabel">
|
||||
<property name="text">
|
||||
<string>Timeout:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<item row="1" column="1">
|
||||
<widget class="QSpinBox" name="timeOutSpinBox">
|
||||
<property name="suffix">
|
||||
<string>s</string>
|
||||
@@ -100,12 +88,33 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="promptToSubmitCheckBox">
|
||||
<property name="text">
|
||||
<string>Prompt on submit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="spaceIgnorantAnnotationCheckBox">
|
||||
<property name="text">
|
||||
<string>Ignore whitespace changes in annotation</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="logCountLabel">
|
||||
<property name="text">
|
||||
<string>Log count:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSpinBox" name="logCountSpinBox">
|
||||
<property name="maximum">
|
||||
<number>10000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -51,6 +51,7 @@ SubversionEditor::SubversionEditor(const VCSBase::VCSBaseEditorParameters *type,
|
||||
{
|
||||
QTC_ASSERT(m_changeNumberPattern.isValid(), return);
|
||||
QTC_ASSERT(m_revisionNumberPattern.isValid(), return);
|
||||
setAnnotateRevisionTextFormat(tr("Annotate revision \"%1\""));
|
||||
}
|
||||
|
||||
QSet<QString> SubversionEditor::annotationChanges() const
|
||||
@@ -138,12 +139,11 @@ QString SubversionEditor::fileNameFromDiffSpecification(const QTextBlock &inBloc
|
||||
return QString();
|
||||
}
|
||||
|
||||
QStringList SubversionEditor::annotationPreviousVersions(const QString &v, QString *actionTextFormat) const
|
||||
QStringList SubversionEditor::annotationPreviousVersions(const QString &v) const
|
||||
{
|
||||
bool ok;
|
||||
const int revision = v.toInt(&ok);
|
||||
if (!ok || revision < 2)
|
||||
return QStringList();
|
||||
*actionTextFormat = tr("Annotate revision \"%1\"");
|
||||
return QStringList(QString::number(revision - 1));
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ private:
|
||||
virtual VCSBase::DiffHighlighter *createDiffHighlighter() const;
|
||||
virtual VCSBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const;
|
||||
virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileName) const;
|
||||
virtual QStringList annotationPreviousVersions(const QString &, QString *actionTextFormat) const;
|
||||
virtual QStringList annotationPreviousVersions(const QString &) const;
|
||||
|
||||
const QRegExp m_changeNumberPattern;
|
||||
const QRegExp m_revisionNumberPattern;
|
||||
|
||||
@@ -85,7 +85,10 @@ 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_SEPARATOR4 = "Subversion.Separator4";
|
||||
static const char * const CMD_ID_STATUS = "Subversion.Status";
|
||||
static const char * const CMD_ID_PROJECTLOG = "Subversion.ProjectLog";
|
||||
static const char * const CMD_ID_REPOSITORYLOG = "Subversion.RepositoryLog";
|
||||
static const char * const CMD_ID_UPDATE = "Subversion.Update";
|
||||
static const char * const CMD_ID_DESCRIBE = "Subversion.Describe";
|
||||
|
||||
@@ -179,6 +182,8 @@ SubversionPlugin::SubversionPlugin() :
|
||||
m_revertAction(0),
|
||||
m_diffProjectAction(0),
|
||||
m_diffCurrentAction(0),
|
||||
m_logProjectAction(0),
|
||||
m_logRepositoryAction(0),
|
||||
m_commitAllAction(0),
|
||||
m_commitCurrentAction(0),
|
||||
m_filelogCurrentAction(0),
|
||||
@@ -361,12 +366,24 @@ bool SubversionPlugin::initialize(const QStringList & /*arguments */, QString *e
|
||||
connect(m_statusProjectAction, SIGNAL(triggered()), this, SLOT(projectStatus()));
|
||||
subversionMenu->addAction(command);
|
||||
|
||||
m_logProjectAction = new Utils::ParameterAction(tr("Log Project Log"), tr("Log Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
|
||||
command = ami->registerAction(m_logProjectAction, CMD_ID_PROJECTLOG, globalcontext);
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
connect(m_logProjectAction, SIGNAL(triggered()), this, SLOT(logProject()));
|
||||
subversionMenu->addAction(command);
|
||||
|
||||
m_updateProjectAction = new Utils::ParameterAction(tr("Update Project"), tr("Update Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
|
||||
command = ami->registerAction(m_updateProjectAction, CMD_ID_UPDATE, globalcontext);
|
||||
connect(m_updateProjectAction, SIGNAL(triggered()), this, SLOT(updateProject()));
|
||||
command->setAttribute(Core::Command::CA_UpdateText);
|
||||
subversionMenu->addAction(command);
|
||||
|
||||
subversionMenu->addAction(createSeparator(this, ami, CMD_ID_SEPARATOR4, globalcontext));
|
||||
m_logRepositoryAction = new QAction(tr("Repository Log"), this);
|
||||
command = ami->registerAction(m_logRepositoryAction, CMD_ID_REPOSITORYLOG, globalcontext);
|
||||
connect(m_logRepositoryAction, SIGNAL(triggered()), this, SLOT(logRepository()));
|
||||
subversionMenu->addAction(command);
|
||||
|
||||
// Actions of the submit editor
|
||||
QList<int> svncommitcontext;
|
||||
svncommitcontext << Core::UniqueIDManager::instance()->uniqueIdentifier(Constants::SUBVERSIONCOMMITEDITOR);
|
||||
@@ -504,10 +521,13 @@ void SubversionPlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
|
||||
if (!VCSBase::VCSBasePlugin::enableMenuAction(as, m_menuAction))
|
||||
return;
|
||||
|
||||
m_logRepositoryAction->setEnabled(currentState().hasTopLevel());
|
||||
|
||||
const QString projectName = currentState().currentProjectName();
|
||||
m_diffProjectAction->setParameter(projectName);
|
||||
m_statusProjectAction->setParameter(projectName);
|
||||
m_updateProjectAction->setParameter(projectName);
|
||||
m_logProjectAction->setParameter(projectName);
|
||||
|
||||
const bool repoEnabled = currentState().hasTopLevel();
|
||||
m_commitAllAction->setEnabled(repoEnabled);
|
||||
@@ -662,14 +682,32 @@ void SubversionPlugin::filelogCurrentFile()
|
||||
{
|
||||
const VCSBase::VCSBasePluginState state = currentState();
|
||||
QTC_ASSERT(state.hasFile(), return)
|
||||
filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()));
|
||||
filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), true);
|
||||
}
|
||||
|
||||
void SubversionPlugin::filelog(const QString &workingDir, const QStringList &files)
|
||||
void SubversionPlugin::logProject()
|
||||
{
|
||||
const VCSBase::VCSBasePluginState state = currentState();
|
||||
QTC_ASSERT(state.hasProject(), return)
|
||||
filelog(state.currentProjectTopLevel(), state.relativeCurrentProject());
|
||||
}
|
||||
|
||||
void SubversionPlugin::logRepository()
|
||||
{
|
||||
const VCSBase::VCSBasePluginState state = currentState();
|
||||
QTC_ASSERT(state.hasTopLevel(), return)
|
||||
filelog(state.topLevel());
|
||||
}
|
||||
|
||||
void SubversionPlugin::filelog(const QString &workingDir,
|
||||
const QStringList &files,
|
||||
bool enableAnnotationContextMenu)
|
||||
{
|
||||
QTextCodec *codec = VCSBase::VCSBaseEditor::getCodec(workingDir, files);
|
||||
// no need for temp file
|
||||
QStringList args(QLatin1String("log"));
|
||||
if (m_settings.logCount > 0)
|
||||
args << QLatin1String("-l") << QString::number(m_settings.logCount);
|
||||
foreach(const QString &file, files)
|
||||
args.append(QDir::toNativeSeparators(file));
|
||||
|
||||
@@ -689,6 +727,8 @@ void SubversionPlugin::filelog(const QString &workingDir, const QStringList &fil
|
||||
const QString source = VCSBase::VCSBaseEditor::getSource(workingDir, files);
|
||||
Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::LogOutput, source, codec);
|
||||
newEditor->setProperty("logFileName", id);
|
||||
if (enableAnnotationContextMenu)
|
||||
VCSBase::VCSBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -753,8 +793,6 @@ void SubversionPlugin::annotate(const QString &workingDir, const QString &file,
|
||||
} else {
|
||||
const QString title = QString::fromLatin1("svn annotate %1").arg(id);
|
||||
Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::AnnotateOutput, source, codec);
|
||||
connect(newEditor, SIGNAL(annotatePreviousRequested(QString,QString,int)),
|
||||
this, SLOT(annotateVersion(QString,QString,int)));
|
||||
newEditor->setProperty("annotateFileName", id);
|
||||
VCSBase::VCSBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
|
||||
}
|
||||
@@ -939,6 +977,8 @@ Core::IEditor * SubversionPlugin::showOutputInEditor(const QString& title, const
|
||||
qDebug() << "SubversionPlugin::showOutputInEditor" << title << kind << "Size= " << output.size() << " Type=" << editorType << debugCodec(codec);
|
||||
QString s = title;
|
||||
Core::IEditor *editor = Core::EditorManager::instance()->openEditorWithContents(kind, &s, output);
|
||||
connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
|
||||
this, SLOT(annotateVersion(QString,QString,int)));
|
||||
SubversionEditor *e = qobject_cast<SubversionEditor*>(editor->widget());
|
||||
if (!e)
|
||||
return 0;
|
||||
|
||||
@@ -111,7 +111,8 @@ private slots:
|
||||
void updateProject();
|
||||
void submitCurrentLog();
|
||||
void diffCommitFiles(const QStringList &);
|
||||
|
||||
void logProject();
|
||||
void logRepository();
|
||||
|
||||
protected:
|
||||
virtual void updateActions(VCSBase::VCSBasePlugin::ActionState);
|
||||
@@ -127,7 +128,9 @@ private:
|
||||
bool showStdOutInOutputWindow, QTextCodec *outputCodec = 0);
|
||||
void annotate(const QString &workingDir, const QString &file,
|
||||
const QString &revision = QString(), int lineNumber = -1);
|
||||
void filelog(const QString &workingDir, const QStringList &file = QStringList());
|
||||
void filelog(const QString &workingDir,
|
||||
const QStringList &file = QStringList(),
|
||||
bool enableAnnotationContextMenu = false);
|
||||
bool managesDirectory(const QDir &directory) const;
|
||||
QString findTopLevelForDirectoryI(const QString &directory) const;
|
||||
void startCommit(const QString &workingDir, const QStringList &files = QStringList());
|
||||
@@ -146,6 +149,8 @@ private:
|
||||
Utils::ParameterAction *m_revertAction;
|
||||
Utils::ParameterAction *m_diffProjectAction;
|
||||
Utils::ParameterAction *m_diffCurrentAction;
|
||||
Utils::ParameterAction *m_logProjectAction;
|
||||
QAction *m_logRepositoryAction;
|
||||
QAction *m_commitAllAction;
|
||||
Utils::ParameterAction *m_commitCurrentAction;
|
||||
Utils::ParameterAction *m_filelogCurrentAction;
|
||||
|
||||
@@ -43,8 +43,9 @@ static const char *passwordOptionC = "--password";
|
||||
static const char *promptToSubmitKeyC = "PromptForSubmit";
|
||||
static const char *timeOutKeyC = "TimeOut";
|
||||
static const char *spaceIgnorantAnnotationKeyC = "SpaceIgnorantAnnotation";
|
||||
static const char *logCountKeyC = "LogCount";
|
||||
|
||||
enum { defaultTimeOutS = 30 };
|
||||
enum { defaultTimeOutS = 30, defaultLogCount = 1000 };
|
||||
|
||||
static QString defaultCommand()
|
||||
{
|
||||
@@ -61,6 +62,7 @@ using namespace Subversion::Internal;
|
||||
SubversionSettings::SubversionSettings() :
|
||||
svnCommand(defaultCommand()),
|
||||
useAuthentication(false),
|
||||
logCount(defaultLogCount),
|
||||
timeOutS(defaultTimeOutS),
|
||||
promptToSubmit(true),
|
||||
spaceIgnorantAnnotation(true)
|
||||
@@ -77,6 +79,7 @@ void SubversionSettings::fromSettings(QSettings *settings)
|
||||
timeOutS = settings->value(QLatin1String(timeOutKeyC), defaultTimeOutS).toInt();
|
||||
promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool();
|
||||
spaceIgnorantAnnotation = settings->value(QLatin1String(spaceIgnorantAnnotationKeyC), true).toBool();
|
||||
logCount = settings->value(QLatin1String(logCountKeyC), int(defaultLogCount)).toInt();
|
||||
settings->endGroup();
|
||||
}
|
||||
|
||||
@@ -90,6 +93,7 @@ void SubversionSettings::toSettings(QSettings *settings) const
|
||||
settings->setValue(QLatin1String(promptToSubmitKeyC), promptToSubmit);
|
||||
settings->setValue(QLatin1String(timeOutKeyC), timeOutS);
|
||||
settings->setValue(QLatin1String(spaceIgnorantAnnotationKeyC), spaceIgnorantAnnotation);
|
||||
settings->setValue(QLatin1String(logCountKeyC), logCount);
|
||||
settings->endGroup();
|
||||
}
|
||||
|
||||
@@ -99,6 +103,7 @@ bool SubversionSettings::equals(const SubversionSettings &s) const
|
||||
&& useAuthentication == s.useAuthentication
|
||||
&& user == s.user
|
||||
&& password == s.password
|
||||
&& logCount == s.logCount
|
||||
&& timeOutS == s.timeOutS
|
||||
&& promptToSubmit == s.promptToSubmit
|
||||
&& spaceIgnorantAnnotation == s.spaceIgnorantAnnotation;
|
||||
|
||||
@@ -62,6 +62,7 @@ struct SubversionSettings
|
||||
bool useAuthentication;
|
||||
QString user;
|
||||
QString password;
|
||||
int logCount;
|
||||
int timeOutS;
|
||||
bool promptToSubmit;
|
||||
bool spaceIgnorantAnnotation;
|
||||
|
||||
@@ -85,7 +85,7 @@ public:
|
||||
|
||||
signals:
|
||||
void describeRequested(const QString &source, const QString &change);
|
||||
void annotatePreviousRequested(const QString &source, const QString &change, int line);
|
||||
void annotateRevisionRequested(const QString &source, const QString &change, int line);
|
||||
|
||||
private:
|
||||
const char *m_kind;
|
||||
@@ -147,11 +147,10 @@ VCSBaseDiffEditorEditable::~VCSBaseDiffEditorEditable()
|
||||
|
||||
struct VCSBaseEditorPrivate
|
||||
{
|
||||
VCSBaseEditorPrivate(const VCSBaseEditorParameters *type, QObject *parent);
|
||||
VCSBaseEditorPrivate(const VCSBaseEditorParameters *type);
|
||||
|
||||
const VCSBaseEditorParameters *m_parameters;
|
||||
|
||||
QAction *m_describeAction;
|
||||
QString m_currentChange;
|
||||
QString m_source;
|
||||
QString m_diffBaseDirectory;
|
||||
@@ -159,25 +158,27 @@ struct VCSBaseEditorPrivate
|
||||
QRegExp m_diffFilePattern;
|
||||
QList<int> m_diffSections; // line number where this section starts
|
||||
int m_cursorLine;
|
||||
QString m_annotateRevisionTextFormat;
|
||||
bool m_fileLogAnnotateEnabled;
|
||||
};
|
||||
|
||||
VCSBaseEditorPrivate::VCSBaseEditorPrivate(const VCSBaseEditorParameters *type, QObject *parent) :
|
||||
m_parameters(type),
|
||||
m_describeAction(new QAction(parent)),
|
||||
m_cursorLine(-1)
|
||||
VCSBaseEditorPrivate::VCSBaseEditorPrivate(const VCSBaseEditorParameters *type) :
|
||||
m_parameters(type),
|
||||
m_cursorLine(-1),
|
||||
m_annotateRevisionTextFormat(VCSBaseEditor::tr("Annotate \"%1\"")),
|
||||
m_fileLogAnnotateEnabled(false)
|
||||
{
|
||||
}
|
||||
|
||||
// ------------ VCSBaseEditor
|
||||
VCSBaseEditor::VCSBaseEditor(const VCSBaseEditorParameters *type, QWidget *parent)
|
||||
: BaseTextEditor(parent),
|
||||
d(new VCSBaseEditorPrivate(type, this))
|
||||
d(new VCSBaseEditorPrivate(type))
|
||||
{
|
||||
if (VCSBase::Constants::Internal::debug)
|
||||
qDebug() << "VCSBaseEditor::VCSBaseEditor" << type->type << type->kind;
|
||||
|
||||
setReadOnly(true);
|
||||
connect(d->m_describeAction, SIGNAL(triggered()), this, SLOT(describe()));
|
||||
viewport()->setMouseTracking(true);
|
||||
setBaseTextDocument(new Internal::VCSBaseTextDocument);
|
||||
setMimeType(QLatin1String(d->m_parameters->mimeType));
|
||||
@@ -218,6 +219,26 @@ void VCSBaseEditor::setSource(const QString &source)
|
||||
d->m_source = source;
|
||||
}
|
||||
|
||||
QString VCSBaseEditor::annotateRevisionTextFormat() const
|
||||
{
|
||||
return d->m_annotateRevisionTextFormat;
|
||||
}
|
||||
|
||||
void VCSBaseEditor::setAnnotateRevisionTextFormat(const QString &f)
|
||||
{
|
||||
d->m_annotateRevisionTextFormat = f;
|
||||
}
|
||||
|
||||
bool VCSBaseEditor::isFileLogAnnotateEnabled() const
|
||||
{
|
||||
return d->m_fileLogAnnotateEnabled;
|
||||
}
|
||||
|
||||
void VCSBaseEditor::setFileLogAnnotateEnabled(bool e)
|
||||
{
|
||||
d->m_fileLogAnnotateEnabled = e;
|
||||
}
|
||||
|
||||
QString VCSBaseEditor::diffBaseDirectory() const
|
||||
{
|
||||
return d->m_diffBaseDirectory;
|
||||
@@ -267,8 +288,8 @@ TextEditor::BaseTextEditorEditable *VCSBaseEditor::createEditableInterface()
|
||||
// Pass on signals.
|
||||
connect(this, SIGNAL(describeRequested(QString,QString)),
|
||||
editable, SIGNAL(describeRequested(QString,QString)));
|
||||
connect(this, SIGNAL(annotatePreviousRequested(QString,QString,int)),
|
||||
editable, SIGNAL(annotatePreviousRequested(QString,QString,int)));
|
||||
connect(this, SIGNAL(annotateRevisionRequested(QString,QString,int)),
|
||||
editable, SIGNAL(annotateRevisionRequested(QString,QString,int)));
|
||||
return editable;
|
||||
}
|
||||
|
||||
@@ -345,6 +366,21 @@ void VCSBaseEditor::slotDiffCursorPositionChanged()
|
||||
}
|
||||
}
|
||||
|
||||
QAction *VCSBaseEditor::createDescribeAction(const QString &change)
|
||||
{
|
||||
QAction *a = new QAction(tr("Describe change %1").arg(change), 0);
|
||||
connect(a, SIGNAL(triggered()), this, SLOT(describe()));
|
||||
return a;
|
||||
}
|
||||
|
||||
QAction *VCSBaseEditor::createAnnotateAction(const QString &change)
|
||||
{
|
||||
QAction *a = new QAction(d->m_annotateRevisionTextFormat.arg(change), 0);
|
||||
a->setData(change);
|
||||
connect(a, SIGNAL(triggered()), this, SLOT(slotAnnotateRevision()));
|
||||
return a;
|
||||
}
|
||||
|
||||
void VCSBaseEditor::contextMenuEvent(QContextMenuEvent *e)
|
||||
{
|
||||
QMenu *menu = createStandardContextMenu();
|
||||
@@ -352,25 +388,28 @@ void VCSBaseEditor::contextMenuEvent(QContextMenuEvent *e)
|
||||
if (d->m_parameters->type == LogOutput || d->m_parameters->type == AnnotateOutput) {
|
||||
d->m_currentChange = changeUnderCursor(cursorForPosition(e->pos()));
|
||||
if (!d->m_currentChange.isEmpty()) {
|
||||
d->m_describeAction->setText(tr("Describe change %1").arg(d->m_currentChange));
|
||||
menu->addSeparator();
|
||||
menu->addAction(d->m_describeAction);
|
||||
// Offer to annotate previous changes
|
||||
if (contentType() == AnnotateOutput) {
|
||||
QString actionTextFormat;
|
||||
const QStringList previousVersions = annotationPreviousVersions(d->m_currentChange, &actionTextFormat);
|
||||
if (!previousVersions.isEmpty()) {
|
||||
if (actionTextFormat.isEmpty())
|
||||
actionTextFormat = tr("Annotate \"%1\"");
|
||||
switch (d->m_parameters->type) {
|
||||
case LogOutput: // Describe current / Annotate file of current
|
||||
menu->addSeparator();
|
||||
menu->addAction(createDescribeAction(d->m_currentChange));
|
||||
if (d->m_fileLogAnnotateEnabled)
|
||||
menu->addAction(createAnnotateAction(d->m_currentChange));
|
||||
break;
|
||||
case AnnotateOutput: { // Describe current / annotate previous
|
||||
menu->addSeparator();
|
||||
foreach(const QString &pv, previousVersions) {
|
||||
QAction *a = menu->addAction(actionTextFormat.arg(pv));
|
||||
a->setData(pv);
|
||||
connect(a, SIGNAL(triggered()), this, SLOT(slotAnnotatePrevious()));
|
||||
}
|
||||
menu->addAction(createDescribeAction(d->m_currentChange));
|
||||
const QStringList previousVersions = annotationPreviousVersions(d->m_currentChange);
|
||||
if (!previousVersions.isEmpty()) {
|
||||
menu->addSeparator();
|
||||
foreach(const QString &pv, previousVersions)
|
||||
menu->addAction(createAnnotateAction(pv));
|
||||
} // has previous versions
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
} // switch type
|
||||
} // has current change
|
||||
}
|
||||
menu->exec(e->globalPos());
|
||||
delete menu;
|
||||
@@ -763,14 +802,14 @@ QString VCSBaseEditor::findDiffFile(const QString &f, Core::IVersionControl *con
|
||||
return QString();
|
||||
}
|
||||
|
||||
void VCSBaseEditor::slotAnnotatePrevious()
|
||||
void VCSBaseEditor::slotAnnotateRevision()
|
||||
{
|
||||
if (const QAction *a = qobject_cast<const QAction *>(sender()))
|
||||
emit annotatePreviousRequested(source(), a->data().toString(),
|
||||
emit annotateRevisionRequested(source(), a->data().toString(),
|
||||
editableInterface()->currentLine());
|
||||
}
|
||||
|
||||
QStringList VCSBaseEditor::annotationPreviousVersions(const QString &, QString *) const
|
||||
QStringList VCSBaseEditor::annotationPreviousVersions(const QString &) const
|
||||
{
|
||||
return QStringList();
|
||||
}
|
||||
|
||||
@@ -52,15 +52,16 @@ struct VCSBaseEditorPrivate;
|
||||
class DiffHighlighter;
|
||||
class BaseAnnotationHighlighter;
|
||||
|
||||
// Contents of a VCSBaseEditor
|
||||
// Contents of a VCSBaseEditor and its interaction.
|
||||
enum EditorContentType {
|
||||
// No special handling.
|
||||
RegularCommandOutput,
|
||||
// Log of a file under revision control. Provide 'click on change'
|
||||
// description.
|
||||
// description and 'Annotate' if is the log of a single file.
|
||||
LogOutput,
|
||||
// <change description>: file line
|
||||
// Color per change number and provide 'click on change' description.
|
||||
// Context menu offers "Annotate previous version".
|
||||
AnnotateOutput,
|
||||
// Diff output. Might includes describe output, which consists of a
|
||||
// header and diffs. Interaction is 'double click in hunk' which
|
||||
@@ -89,6 +90,8 @@ class VCSBASE_EXPORT VCSBaseEditor : public TextEditor::BaseTextEditor
|
||||
Q_PROPERTY(QString source READ source WRITE setSource)
|
||||
Q_PROPERTY(QString diffBaseDirectory READ diffBaseDirectory WRITE setDiffBaseDirectory)
|
||||
Q_PROPERTY(QTextCodec *codec READ codec WRITE setCodec)
|
||||
Q_PROPERTY(QString annotateRevisionTextFormat READ annotateRevisionTextFormat WRITE setAnnotateRevisionTextFormat)
|
||||
Q_PROPERTY(bool isFileLogAnnotateEnabled READ isFileLogAnnotateEnabled WRITE setFileLogAnnotateEnabled)
|
||||
Q_OBJECT
|
||||
protected:
|
||||
// Initialization requires calling init() (which in turns calls
|
||||
@@ -103,6 +106,15 @@ public:
|
||||
QString source() const;
|
||||
void setSource(const QString &source);
|
||||
|
||||
// Format for "Annotate" revision menu entries. Should contain '%1" placeholder
|
||||
QString annotateRevisionTextFormat() const;
|
||||
void setAnnotateRevisionTextFormat(const QString &);
|
||||
|
||||
// Enable "Annotate" context menu in file log view
|
||||
// (set to true if the source is a single file and the VCS implements it)
|
||||
bool isFileLogAnnotateEnabled() const;
|
||||
void setFileLogAnnotateEnabled(bool e);
|
||||
|
||||
QTextCodec *codec() const;
|
||||
void setCodec(QTextCodec *);
|
||||
|
||||
@@ -144,15 +156,16 @@ public:
|
||||
static QString getSource(const QString &workingDirectory, const QString &fileName);
|
||||
static QString getSource(const QString &workingDirectory, const QStringList &fileNames);
|
||||
// Convenience functions to determine an title/id to identify the editor
|
||||
// from the arguments (','-joined arguments or directory).
|
||||
// from the arguments (','-joined arguments or directory) + revision.
|
||||
static QString getTitleId(const QString &workingDirectory,
|
||||
const QStringList &fileNames,
|
||||
const QString &revision = QString());
|
||||
signals:
|
||||
// These signals also exist in the opaque editable (IEditor) that is
|
||||
// handled by the editor manager for convenience.
|
||||
// handled by the editor manager for convenience. They are emitted
|
||||
// for LogOutput/AnnotateOutput content types.
|
||||
void describeRequested(const QString &source, const QString &change);
|
||||
void annotatePreviousRequested(const QString &source, const QString &change, int lineNumber);
|
||||
void annotateRevisionRequested(const QString &source, const QString &change, int lineNumber);
|
||||
|
||||
public slots:
|
||||
// Convenience slot to set data read from stdout, will use the
|
||||
@@ -177,7 +190,7 @@ private slots:
|
||||
void slotPopulateDiffBrowser();
|
||||
void slotDiffBrowse(int);
|
||||
void slotDiffCursorPositionChanged();
|
||||
void slotAnnotatePrevious();
|
||||
void slotAnnotateRevision();
|
||||
|
||||
protected:
|
||||
/* A helper that can be used to locate a file in a diff in case it
|
||||
@@ -198,11 +211,12 @@ private:
|
||||
// (text cursor at position above change hunk)
|
||||
virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileSpec) const = 0;
|
||||
// Implement to return the previous version[s] of an annotation change
|
||||
// for "Annotate previous version" and a format for the action text containing %1
|
||||
// for the revision
|
||||
virtual QStringList annotationPreviousVersions(const QString &revision, QString *actionTextFormat) const;
|
||||
// for "Annotate previous version"
|
||||
virtual QStringList annotationPreviousVersions(const QString &revision) const;
|
||||
|
||||
void jumpToChangeFromDiff(QTextCursor cursor);
|
||||
QAction *createDescribeAction(const QString &change);
|
||||
QAction *createAnnotateAction(const QString &change);
|
||||
|
||||
VCSBaseEditorPrivate *d;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user