OSDN Git Service

f13973ff368d6906f66e3e849b2968de2a129e8d
[qt-creator-jp/qt-creator-jp.git] / src / plugins / git / gitclient.h
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
6 **
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
8 **
9 **
10 ** GNU Lesser General Public License Usage
11 **
12 ** This file may be used under the terms of the GNU Lesser General Public
13 ** License version 2.1 as published by the Free Software Foundation and
14 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
15 ** Please review the following information to ensure the GNU Lesser General
16 ** Public License version 2.1 requirements will be met:
17 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 **
19 ** In addition, as a special exception, Nokia gives you certain additional
20 ** rights. These rights are described in the Nokia Qt LGPL Exception
21 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 **
23 ** Other Usage
24 **
25 ** Alternatively, this file may be used in accordance with the terms and
26 ** conditions contained in a signed written agreement between you and Nokia.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at info@qt.nokia.com.
30 **
31 **************************************************************************/
32
33 #ifndef GITCLIENT_H
34 #define GITCLIENT_H
35
36 #include "gitsettings.h"
37
38 #include <coreplugin/editormanager/ieditor.h>
39 #include <vcsbase/command.h>
40
41 #include <QtCore/QObject>
42 #include <QtCore/QString>
43 #include <QtCore/QStringList>
44 #include <QtGui/QWidget>
45
46 QT_BEGIN_NAMESPACE
47 class QCheckBox;
48 class QErrorMessage;
49 class QSignalMapper;
50 class QDebug;
51 class QProcessEnvironment;
52 QT_END_NAMESPACE
53
54 namespace Core {
55     class ICore;
56 }
57
58 namespace VCSBase {
59     class VCSBaseEditorWidget;
60 }
61
62 namespace Utils {
63     struct SynchronousProcessResponse;
64 }
65
66 namespace Git {
67 namespace Internal {
68
69 class GitPlugin;
70 class GitOutputWindow;
71 class CommitData;
72 struct GitSubmitEditorPanelData;
73 class Stash;
74
75 class GitClient : public QObject
76 {
77     Q_OBJECT
78
79 public:
80     static const char *stashNamePrefix;
81
82     explicit GitClient(GitSettings *settings);
83     ~GitClient();
84
85     QString gitBinaryPath(bool *ok = 0, QString *errorMessage = 0) const;
86     unsigned gitVersion(bool silent, QString *errorMessage = 0) const;
87     QString gitVersionString(bool silent, QString *errorMessage = 0) const;
88
89     static QString findRepositoryForDirectory(const QString &dir);
90
91     void diff(const QString &workingDirectory, const QStringList &diffArgs, const QString &fileName);
92     void diff(const QString &workingDirectory, const QStringList &diffArgs,
93               const QStringList &unstagedFileNames, const QStringList &stagedFileNames= QStringList());
94     void diffBranch(const QString &workingDirectory,
95                     const QStringList &diffArgs,
96                     const QString &branchName);
97
98     void status(const QString &workingDirectory);
99     void graphLog(const QString &workingDirectory) { graphLog(workingDirectory, QString()); }
100     void graphLog(const QString &workingDirectory, const QString &branch);
101     void log(const QString &workingDirectory, const QStringList &fileNames = QStringList(),
102              bool enableAnnotationContextMenu = false);
103     void blame(const QString &workingDirectory, const QStringList &args, const QString &fileName,
104                const QString &revision = QString(), int lineNumber = -1);
105     void checkout(const QString &workingDirectory, const QString &file);
106     void checkoutBranch(const QString &workingDirectory, const QString &branch);
107     void hardReset(const QString &workingDirectory, const QString &commit = QString());
108     void addFile(const QString &workingDirectory, const QString &fileName);
109     bool synchronousAdd(const QString &workingDirectory,
110                         // Warning: Works only from 1.6.1 onwards
111                         bool intendToAdd,
112                         const QStringList &files);
113     bool synchronousDelete(const QString &workingDirectory,
114                            bool force,
115                            const QStringList &files);
116     bool synchronousMove(const QString &workingDirectory,
117                          const QString &from,
118                          const QString &to);
119     bool synchronousReset(const QString &workingDirectory,
120                           const QStringList &files = QStringList(),
121                           QString *errorMessage = 0);
122     bool synchronousCleanList(const QString &workingDirectory, QStringList *files, QString *errorMessage);
123     bool synchronousApplyPatch(const QString &workingDirectory, const QString &file, QString *errorMessage);
124     bool synchronousInit(const QString &workingDirectory);
125     bool synchronousCheckoutFiles(const QString &workingDirectory,
126                                   QStringList files = QStringList(),
127                                   QString revision = QString(), QString *errorMessage = 0,
128                                   bool revertStaging = true);
129     // Checkout branch
130     bool synchronousCheckoutBranch(const QString &workingDirectory, const QString &branch, QString *errorMessage = 0);
131
132     // Do a stash and return identier.
133     enum { StashPromptDescription = 0x1, StashImmediateRestore = 0x2, StashIgnoreUnchanged = 0x4 };
134     QString synchronousStash(const QString &workingDirectory,
135                              const QString &messageKeyword = QString(),
136                              unsigned flags = 0, bool *unchanged = 0);
137
138     bool executeSynchronousStash(const QString &workingDirectory,
139                                  const QString &message = QString(),
140                                  QString *errorMessage = 0);
141     bool synchronousStashRestore(const QString &workingDirectory,
142                                  const QString &stash,
143                                  const QString &branch = QString(),
144                                  QString *errorMessage = 0);
145     bool synchronousStashRemove(const QString &workingDirectory,
146                                 const QString &stash = QString(),
147                                 QString *errorMessage = 0);
148     bool synchronousBranchCmd(const QString &workingDirectory, QStringList branchArgs,
149                               QString *output, QString *errorMessage);
150     bool synchronousRemoteCmd(const QString &workingDirectory, QStringList remoteArgs,
151                               QString *output, QString *errorMessage);
152     bool synchronousShow(const QString &workingDirectory, const QString &id,
153                               QString *output, QString *errorMessage);
154     bool synchronousParentRevisions(const QString &workingDirectory,
155                                     const QStringList &files /* = QStringList() */,
156                                     const QString &revision,
157                                     QStringList *parents,
158                                     QString *errorMessage);
159     bool synchronousShortDescription(const QString &workingDirectory, const QString &revision,
160                                      QString *description, QString *errorMessage);
161     bool synchronousShortDescription(const QString &workingDirectory, const QString &revision,
162                                      const QString &format, QString *description, QString *errorMessage);
163     bool synchronousShortDescriptions(const QString &workingDirectory, const QStringList &revisions,
164                                       QStringList *descriptions, QString *errorMessage);
165     bool synchronousTopRevision(const QString &workingDirectory, QString *revision = 0,
166                                 QString *branch = 0, QString *errorMessage = 0);
167
168     bool cloneRepository(const QString &directory, const QByteArray &url);
169     QString vcsGetRepositoryURL(const QString &directory);
170     bool synchronousFetch(const QString &workingDirectory, const QString &remote);
171     bool synchronousPull(const QString &workingDirectory);
172     bool synchronousPush(const QString &workingDirectory);
173
174     // git svn support (asynchronous).
175     void synchronousSubversionFetch(const QString &workingDirectory);
176     void subversionLog(const QString &workingDirectory);
177
178     void stashPop(const QString &workingDirectory);
179     void revert(const QStringList &files, bool revertStaging);
180     void branchList(const QString &workingDirectory);
181     void stashList(const QString &workingDirectory);
182     bool synchronousStashList(const QString &workingDirectory,
183                               QList<Stash> *stashes,
184                               QString *errorMessage = 0);
185     // Resolve a stash name from message (for IVersionControl's names).
186     bool stashNameFromMessage(const QString &workingDirectory,
187                               const QString &messge, QString *name,
188                               QString *errorMessage = 0);
189
190     QString readConfig(const QString &workingDirectory, const QStringList &configVar);
191
192     QString readConfigValue(const QString &workingDirectory, const QString &configVar);
193
194     enum StashResult { StashUnchanged, StashCanceled, StashFailed,
195                        Stashed, NotStashed /* User did not want it */ };
196     StashResult ensureStash(const QString &workingDirectory, QString *errorMessage);
197     StashResult ensureStash(const QString &workingDirectory);
198
199     bool getCommitData(const QString &workingDirectory, bool amend,
200                        QString *commitTemplate, CommitData *commitData,
201                        QString *errorMessage);
202
203     bool addAndCommit(const QString &workingDirectory,
204                       const GitSubmitEditorPanelData &data,
205                       const QString &amendSHA1,
206                       const QString &messageFile,
207                       const QStringList &checkedFiles,
208                       const QStringList &origCommitFiles,
209                       const QStringList &origDeletedFiles);
210
211     enum StatusResult { StatusChanged, StatusUnchanged, StatusFailed };
212     StatusResult gitStatus(const QString &workingDirectory,
213                            bool untracked = false,
214                            QString *output = 0,
215                            QString *errorMessage = 0,
216                            bool *onBranch = 0);
217
218     void launchGitK(const QString &workingDirectory);
219     QStringList synchronousRepositoryBranches(const QString &repositoryURL);
220
221     GitSettings *settings() const;
222
223     QProcessEnvironment processEnvironment() const;
224
225     static QString msgNoChangedFiles();
226
227     static const char *noColorOption;
228     static const char *decorateOption;
229
230 public slots:
231     void show(const QString &source, const QString &id, const QStringList &args = QStringList());
232     void saveSettings();
233
234 private slots:
235     void slotBlameRevisionRequested(const QString &source, QString change, int lineNumber);
236
237 private:
238     VCSBase::VCSBaseEditorWidget *findExistingVCSEditor(const char *registerDynamicProperty,
239                                                   const QString &dynamicPropertyValue) const;
240     VCSBase::VCSBaseEditorWidget *createVCSEditor(const QString &kind,
241                                             QString title,
242                                             const QString &source,
243                                             bool setSourceCodec,
244                                             const char *registerDynamicProperty,
245                                             const QString &dynamicPropertyValue,
246                                             QWidget *configWidget) const;
247
248     VCSBase::Command *createCommand(const QString &workingDirectory,
249                              VCSBase::VCSBaseEditorWidget* editor = 0,
250                              bool useOutputToWindow = false,
251                              int editorLineNumber = -1);
252
253     VCSBase::Command *executeGit(const QString &workingDirectory,
254                            const QStringList &arguments,
255                            VCSBase::VCSBaseEditorWidget* editor = 0,
256                            bool useOutputToWindow = false,
257                            VCSBase::Command::TerminationReportMode tm = VCSBase::Command::NoReport,
258                            int editorLineNumber = -1,
259                            bool unixTerminalDisabled = false);
260
261     // Fully synchronous git execution (QProcess-based).
262     bool fullySynchronousGit(const QString &workingDirectory,
263                         const QStringList &arguments,
264                         QByteArray* outputText,
265                         QByteArray* errorText,
266                         bool logCommandToWindow = true) const;
267
268     // Synchronous git execution using Utils::SynchronousProcess, with
269     // log windows updating (using VCSBasePlugin::runVCS with flags).
270     inline Utils::SynchronousProcessResponse
271             synchronousGit(const QString &workingDirectory, const QStringList &arguments,
272                            unsigned flags = 0, QTextCodec *outputCodec = 0);
273
274     // determine version as '(major << 16) + (minor << 8) + patch' or 0.
275     unsigned synchronousGitVersion(bool silent, QString *errorMessage = 0) const;
276
277     enum RevertResult { RevertOk, RevertUnchanged, RevertCanceled, RevertFailed };
278     RevertResult revertI(QStringList files,
279                          bool *isDirectory,
280                          QString *errorMessage,
281                          bool revertStaging);
282     void connectRepositoryChanged(const QString & repository, VCSBase::Command *cmd);
283     bool synchronousPull(const QString &workingDirectory, bool rebase);
284     void syncAbortPullRebase(const QString &workingDir);
285     bool tryLauchingGitK(const QProcessEnvironment &env,
286                          const QString &workingDirectory,
287                          const QString &gitBinDirectory,
288                          bool silent);
289
290     mutable QString m_gitVersionForBinary;
291     mutable unsigned m_cachedGitVersion;
292
293     const QString m_msgWait;
294     Core::ICore *m_core;
295     QSignalMapper *m_repositoryChangedSignalMapper;
296     GitSettings *m_settings;
297 };
298
299 } // namespace Internal
300 } // namespace Git
301
302 #endif // GITCLIENT_H