perforceplugin.h 7.88 KB
Newer Older
1
/**************************************************************************
con's avatar
con committed
2 3 4
**
** This file is part of Qt Creator
**
5
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
con's avatar
con committed
6
**
7
** Contact: Nokia Corporation (qt-info@nokia.com)
con's avatar
con committed
8
**
9
** Commercial Usage
10
**
11 12 13 14
** 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.
15
**
16
** GNU Lesser General Public License Usage
17
**
18 19 20 21 22 23
** 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.
24
**
25
** If you are unsure which license is appropriate for your use, please
hjk's avatar
hjk committed
26
** contact the sales department at http://qt.nokia.com/contact.
con's avatar
con committed
27
**
28
**************************************************************************/
hjk's avatar
hjk committed
29

con's avatar
con committed
30 31 32 33 34 35 36
#ifndef PERFORCEPLUGIN_H
#define PERFORCEPLUGIN_H

#include "perforcesettings.h"

#include <coreplugin/editormanager/ieditorfactory.h>
#include <coreplugin/iversioncontrol.h>
37
#include <vcsbase/vcsbaseplugin.h>
con's avatar
con committed
38 39 40 41

#include <QtCore/QObject>
#include <QtCore/QProcess>
#include <QtCore/QStringList>
42 43
#include <QtCore/QSharedPointer>
#include <QtCore/QHash>
con's avatar
con committed
44 45 46 47 48

QT_BEGIN_NAMESPACE
class QFile;
class QAction;
class QTextCodec;
49
class QTemporaryFile;
con's avatar
con committed
50 51
QT_END_NAMESPACE

52 53
namespace Utils {
    class ParameterAction;
con's avatar
con committed
54 55 56 57
}

namespace Perforce {
namespace Internal {
hjk's avatar
hjk committed
58

con's avatar
con committed
59 60 61 62
class PerforceVersionControl;

struct PerforceResponse
{
63 64
    PerforceResponse();

con's avatar
con committed
65
    bool error;
66
    int exitCode;
con's avatar
con committed
67 68 69 70 71
    QString stdOut;
    QString stdErr;
    QString message;
};

72
class PerforcePlugin : public VCSBase::VCSBasePlugin
con's avatar
con committed
73 74 75 76 77 78 79 80 81 82
{
    Q_OBJECT

public:
    PerforcePlugin();
    ~PerforcePlugin();

    bool initialize(const QStringList &arguments, QString *error_message);
    void extensionsInitialized();

83 84 85 86 87
    bool managesDirectory(const QString &directory);
    QString findTopLevelForDirectory(const QString &directory);
    bool vcsOpen(const QString &workingDir, const QString &fileName);
    bool vcsAdd(const QString &workingDir, const QString &fileName);
    bool vcsDelete(const QString &workingDir, const QString &filename);
con's avatar
con committed
88

89
    void p4Diff(const QString &workingDir, const QStringList &files);
con's avatar
con committed
90 91 92

    Core::IEditor *openPerforceSubmitEditor(const QString &fileName, const QStringList &depotFileNames);

hjk's avatar
hjk committed
93
    static PerforcePlugin *perforcePluginInstance();
con's avatar
con committed
94

95
    const PerforceSettings& settings() const;
Friedemann Kleint's avatar
Friedemann Kleint committed
96
    void setSettings(const Settings &s);
con's avatar
con committed
97 98 99 100 101 102 103

    // Map a perforce name "//xx" to its real name in the file system
    QString fileNameFromPerforceName(const QString& perforceName, QString *errorMessage) const;

public slots:
    void describe(const QString &source, const QString &n);

Adriaan de Groot's avatar
Adriaan de Groot committed
104
private slots:
con's avatar
con committed
105 106 107 108 109 110 111
    void openCurrentFile();
    void addCurrentFile();
    void deleteCurrentFile();
    void revertCurrentFile();
    void printOpenedFileList();
    void diffCurrentFile();
    void diffCurrentProject();
112
    void updateCurrentProject();
113 114
    void revertCurrentProject();
    void revertUnchangedCurrentProject();
115
    void updateAll();
con's avatar
con committed
116
    void diffAllOpened();
117
    void startSubmitProject();
con's avatar
con committed
118 119 120 121 122 123 124 125
    void describeChange();
    void annotateCurrentFile();
    void annotate();
    void filelogCurrentFile();
    void filelog();

    void submitCurrentLog();
    void printPendingChanges();
126 127 128
    void slotSubmitDiff(const QStringList &files);
    void slotTopLevelFound(const QString &);
    void slotTopLevelFailed(const QString &);
con's avatar
con committed
129

130 131 132 133
protected:
    virtual void updateActions(VCSBase::VCSBasePlugin::ActionState);
    virtual bool submitEditorAboutToClose(VCSBase::VCSBaseSubmitEditor *submitEditor);

134

con's avatar
con committed
135
private:
136
    typedef QHash<QString, bool> ManagedDirectoryCache;
con's avatar
con committed
137 138 139 140

    Core::IEditor *showOutputInEditor(const QString& title, const QString output,
                                      int editorType,
                                      QTextCodec *codec = 0);
141

142 143 144 145 146 147 148
    // Flags for runP4Cmd.
    enum RunFlags { CommandToWindow = 0x1, StdOutToWindow = 0x2,
                    StdErrToWindow = 0x4, ErrorToWindow = 0x8,
                    OverrideDiffEnvironment = 0x10,
                    // Run completely synchronously, no signals emitted
                    RunFullySynchronous = 0x20,
                    IgnoreExitCode = 0x40,
Friedemann Kleint's avatar
Friedemann Kleint committed
149 150
                    ShowBusyCursor = 0x80,
                    LongTimeOut = 0x100
151
                   };
152

con's avatar
con committed
153 154
    // args are passed as command line arguments
    // extra args via a tempfile and the option -x "temp-filename"
155 156 157
    PerforceResponse runP4Cmd(const QString &workingDir,
                              const QStringList &args,
                              unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow,
con's avatar
con committed
158
                              const QStringList &extraArgs = QStringList(),
159
                              const QByteArray &stdInput = QByteArray(),
con's avatar
con committed
160 161
                              QTextCodec *outputCodec = 0) const;

162 163 164 165 166 167 168 169 170 171 172
    inline PerforceResponse synchronousProcess(const QString &workingDir,
                                               const QStringList &args,
                                               unsigned flags,
                                               const QByteArray &stdInput,
                                               QTextCodec *outputCodec) const;

    inline PerforceResponse fullySynchronousProcess(const QString &workingDir,
                                                    const QStringList &args,
                                                    unsigned flags,
                                                    const QByteArray &stdInput,
                                                    QTextCodec *outputCodec) const;
con's avatar
con committed
173 174

    QString clientFilePath(const QString &serverFilePath);
175 176
    void annotate(const QString &workingDir, const QString &fileName);
    void filelog(const QString &workingDir, const QStringList &fileNames);
177 178
    void cleanCommitMessageFile();
    bool isCommitEditorOpen() const;
179 180 181
    QSharedPointer<QTemporaryFile> createTemporaryArgumentFile(const QStringList &extraArgs) const;
    void getTopLevel();
    QString pendingChangesData();
182

183 184 185
    void updateCheckout(const QString &workingDir = QString(),
                        const QStringList &dirs = QStringList());
    bool revertProject(const QString &workingDir, const QStringList &args, bool unchangedOnly);
con's avatar
con committed
186

187
    inline PerforceVersionControl *perforceVersionControl() const;
con's avatar
con committed
188

189 190 191
    Utils::ParameterAction *m_editAction;
    Utils::ParameterAction *m_addAction;
    Utils::ParameterAction *m_deleteAction;
con's avatar
con committed
192
    QAction *m_openedAction;
193 194
    Utils::ParameterAction *m_revertFileAction;
    Utils::ParameterAction *m_diffFileAction;
195 196
    Utils::ParameterAction *m_diffProjectAction;
    Utils::ParameterAction *m_updateProjectAction;
197 198
    Utils::ParameterAction *m_revertProjectAction;
    Utils::ParameterAction *m_revertUnchangedAction;
con's avatar
con committed
199
    QAction *m_diffAllAction;
200
    Utils::ParameterAction *m_submitProjectAction;
con's avatar
con committed
201 202
    QAction *m_pendingAction;
    QAction *m_describeAction;
203
    Utils::ParameterAction *m_annotateCurrentAction;
con's avatar
con committed
204
    QAction *m_annotateAction;
205
    Utils::ParameterAction *m_filelogCurrentAction;
con's avatar
con committed
206 207
    QAction *m_filelogAction;
    QAction *m_submitCurrentLogAction;
208
    QAction *m_updateAllAction;
209
    bool m_submitActionTriggered;
con's avatar
con committed
210
    QAction *m_diffSelectedFiles;
211
    QString m_commitMessageFileName;
212 213
    QString m_commitWorkingDirectory;
    mutable QString m_tempFilePattern;
con's avatar
con committed
214 215
    QAction *m_undoAction;
    QAction *m_redoAction;
216
    QAction *m_menuAction;
con's avatar
con committed
217 218 219 220

    static PerforcePlugin *m_perforcePluginInstance;

    PerforceSettings m_settings;
221
    ManagedDirectoryCache m_managedDirectoryCache;
con's avatar
con committed
222 223 224 225 226 227
};

} // namespace Perforce
} // namespace Internal

#endif // PERFORCEPLUGIN_H