OSDN Git Service

b6aef5f2da8e1906509b2f536c3055126a33efcf
[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 (qt-info@nokia.com)
8 **
9 ** No Commercial Usage
10 **
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 **
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights.  These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
31 **
32 **************************************************************************/
33
34 #ifndef GITCLIENT_H
35 #define GITCLIENT_H
36
37 #include "gitsettings.h"
38 #include "gitcommand.h"
39
40 #include <coreplugin/editormanager/ieditor.h>
41
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 GitCommand;
72 struct CommitData;
73 struct GitSubmitEditorPanelData;
74 class Stash;
75
76 class GitClient : public QObject
77 {
78     Q_OBJECT
79
80 public:
81     static const char *stashNamePrefix;
82
83     explicit GitClient(GitPlugin *plugin);
84     ~GitClient();
85
86     static QString findRepositoryForDirectory(const QString &dir);
87
88     void diff(const QString &workingDirectory, const QStringList &diffArgs, const QString &fileName);
89     void diff(const QString &workingDirectory, const QStringList &diffArgs,
90               const QStringList &unstagedFileNames, const QStringList &stagedFileNames= QStringList());
91     void diffBranch(const QString &workingDirectory,
92                     const QStringList &diffArgs,
93                     const QString &branchName);
94
95     void status(const QString &workingDirectory);
96     void graphLog(const QString &workingDirectory) { graphLog(workingDirectory, QString()); }
97     void graphLog(const QString &workingDirectory, const QString &branch);
98     void log(const QString &workingDirectory, const QStringList &fileNames,
99              bool enableAnnotationContextMenu = false);
100     void blame(const QString &workingDirectory, const QStringList &args, const QString &fileName,
101                const QString &revision = QString(), int lineNumber = -1);
102     void checkout(const QString &workingDirectory, const QString &file);
103     void checkoutBranch(const QString &workingDirectory, const QString &branch);
104     void hardReset(const QString &workingDirectory, const QString &commit = QString());
105     void addFile(const QString &workingDirectory, const QString &fileName);
106     bool synchronousAdd(const QString &workingDirectory,
107                         // Warning: Works only from 1.6.1 onwards
108                         bool intendToAdd,
109                         const QStringList &files);
110     bool synchronousDelete(const QString &workingDirectory,
111                            bool force,
112                            const QStringList &files);
113     bool synchronousMove(const QString &workingDirectory,
114                          const QString &from,
115                          const QString &to);
116     bool synchronousReset(const QString &workingDirectory,
117                           const QStringList &files = QStringList(),
118                           QString *errorMessage = 0);
119     bool synchronousCleanList(const QString &workingDirectory, QStringList *files, QString *errorMessage);
120     bool synchronousApplyPatch(const QString &workingDirectory, const QString &file, QString *errorMessage);
121     bool synchronousInit(const QString &workingDirectory);
122     bool synchronousCheckoutFiles(const QString &workingDirectory,
123                                   QStringList files = QStringList(),
124                                   QString revision = QString(), QString *errorMessage = 0,
125                                   bool revertStaging = true);
126     // Checkout branch
127     bool synchronousCheckoutBranch(const QString &workingDirectory, const QString &branch, QString *errorMessage = 0);
128
129     // Do a stash and return identier.
130     enum { StashPromptDescription = 0x1, StashImmediateRestore = 0x2, StashIgnoreUnchanged = 0x4 };
131     QString synchronousStash(const QString &workingDirectory,
132                              const QString &messageKeyword = QString(),
133                              unsigned flags = 0, bool *unchanged = 0);
134
135     bool executeSynchronousStash(const QString &workingDirectory,
136                                  const QString &message = QString(),
137                                  QString *errorMessage = 0);
138     bool synchronousStashRestore(const QString &workingDirectory,
139                                  const QString &stash,
140                                  const QString &branch = QString(),
141                                  QString *errorMessage = 0);
142     bool synchronousStashRemove(const QString &workingDirectory,
143                                 const QString &stash = QString(),
144                                 QString *errorMessage = 0);
145     bool synchronousBranchCmd(const QString &workingDirectory, QStringList branchArgs,
146                               QString *output, QString *errorMessage);
147     bool synchronousShow(const QString &workingDirectory, const QString &id,
148                               QString *output, QString *errorMessage);
149     bool synchronousParentRevisions(const QString &workingDirectory,
150                                     const QStringList &files /* = QStringList() */,
151                                     const QString &revision,
152                                     QStringList *parents,
153                                     QString *errorMessage);
154     bool synchronousShortDescription(const QString &workingDirectory, const QString &revision,
155                                      QString *description, QString *errorMessage);
156     bool synchronousShortDescription(const QString &workingDirectory, const QString &revision,
157                                      const QString &format, QString *description, QString *errorMessage);
158     bool synchronousShortDescriptions(const QString &workingDirectory, const QStringList &revisions,
159                                       QStringList *descriptions, QString *errorMessage);
160     bool synchronousTopRevision(const QString &workingDirectory, QString *revision = 0,
161                                 QString *branch = 0, QString *errorMessage = 0);
162     // determine version as '(major << 16) + (minor << 8) + patch' or 0
163     // with some smart caching.
164     unsigned gitVersion(bool silent, QString *errorMessage = 0);
165     QString gitVersionString(bool silent, QString *errorMessage = 0);
166
167     bool cloneRepository(const QString &directory, const QByteArray &url);
168     QString vcsGetRepositoryURL(const QString &directory);
169     bool synchronousFetch(const QString &workingDirectory);
170     bool synchronousPull(const QString &workingDirectory);
171     bool synchronousPush(const QString &workingDirectory);
172
173     // git svn support (asynchronous).
174     void synchronousSubversionFetch(const QString &workingDirectory);
175     void subversionLog(const QString &workingDirectory);
176
177     void stashPop(const QString &workingDirectory);
178     void revert(const QStringList &files, bool revertStaging);
179     void branchList(const QString &workingDirectory);
180     void stashList(const QString &workingDirectory);
181     bool synchronousStashList(const QString &workingDirectory,
182                               QList<Stash> *stashes,
183                               QString *errorMessage = 0);
184     // Resolve a stash name from message (for IVersionControl's names).
185     bool stashNameFromMessage(const QString &workingDirectory,
186                               const QString &messge, QString *name,
187                               QString *errorMessage = 0);
188
189     QString readConfig(const QString &workingDirectory, const QStringList &configVar);
190
191     QString readConfigValue(const QString &workingDirectory, const QString &configVar);
192
193     enum StashResult { StashUnchanged, StashCanceled, StashFailed,
194                        Stashed, NotStashed /* User did not want it */ };
195     StashResult ensureStash(const QString &workingDirectory, QString *errorMessage);
196     StashResult ensureStash(const QString &workingDirectory);
197
198     bool getCommitData(const QString &workingDirectory, bool amend,
199                        QString *commitTemplate, CommitData *commitData,
200                        QString *errorMessage);
201
202     bool addAndCommit(const QString &workingDirectory,
203                       const GitSubmitEditorPanelData &data,
204                       const QString &amendSHA1,
205                       const QString &messageFile,
206                       const QStringList &checkedFiles,
207                       const QStringList &origCommitFiles,
208                       const QStringList &origDeletedFiles);
209
210     enum StatusResult { StatusChanged, StatusUnchanged, StatusFailed };
211     StatusResult gitStatus(const QString &workingDirectory,
212                            bool untracked = false,
213                            QString *output = 0,
214                            QString *errorMessage = 0,
215                            bool *onBranch = 0);
216
217     void launchGitK(const QString &workingDirectory);
218     QStringList synchronousRepositoryBranches(const QString &repositoryURL);
219
220     GitSettings  settings() const;
221     void setSettings(const GitSettings &s);
222
223     QString binary() const; // Executable + basic arguments
224     QProcessEnvironment processEnvironment() const;
225     static QString fakeWinHome(const QProcessEnvironment &e);
226
227     static QString msgNoChangedFiles();
228
229     static const char *noColorOption;
230
231 public slots:
232     void show(const QString &source, const QString &id, const QStringList &args = QStringList());
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     GitCommand *createCommand(const QString &workingDirectory,
249                              VCSBase::VCSBaseEditorWidget* editor = 0,
250                              bool outputToWindow = false,
251                              int editorLineNumber = -1);
252
253     GitCommand *executeGit(const QString &workingDirectory,
254                            const QStringList &arguments,
255                            VCSBase::VCSBaseEditorWidget* editor = 0,
256                            bool outputToWindow = false,
257                            GitCommand::TerminationReportMode tm = GitCommand::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);
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);
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, GitCommand *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     const QString m_msgWait;
291     GitPlugin     *m_plugin;
292     Core::ICore   *m_core;
293     GitSettings   m_settings;
294     QString m_binaryPath;
295     QSignalMapper *m_repositoryChangedSignalMapper;
296     unsigned      m_cachedGitVersion;
297     bool          m_hasCachedGitVersion;
298 };
299
300 class BaseGitArgumentsWidget : public QWidget {
301     Q_OBJECT
302
303 public:
304     BaseGitArgumentsWidget(GitSettings *settings,
305                            GitClient *client, const QString &directory,
306                            const QStringList &args);
307
308     virtual QStringList arguments() const = 0;
309     virtual void redoCommand() = 0;
310
311 protected slots:
312     virtual void testForArgumentsChanged() = 0;
313
314 protected:
315     GitClient *m_client;
316
317     const QString m_workingDirectory;
318     QStringList m_diffArgs;
319     GitSettings *m_settings;
320 };
321
322 } // namespace Internal
323 } // namespace Git
324
325 #endif // GITCLIENT_H