1
/**************************************************************************
3
** This file is part of Qt Creator
5
** Copyright (c) 2010 Hugues Delorme
7
** Contact: Nokia Corporation (qt-info@nokia.com)
10
** GNU Lesser General Public License Usage
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.
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.
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.
28
** If you have questions regarding the use of this file, please contact
29
** Nokia at qt-info@nokia.com.
31
**************************************************************************/
33
#include "bazaarclient.h"
34
#include "constants.h"
36
#include <vcsbase/vcsbaseclientsettings.h>
37
#include <vcsbase/vcsbaseplugin.h>
38
#include <vcsbase/vcsbaseeditor.h>
39
#include <vcsbase/vcsbaseeditorparameterwidget.h>
41
#include <utils/qtcassert.h>
43
#include <QtCore/QDir>
44
#include <QtCore/QFileInfo>
45
#include <QtCore/QTextStream>
46
#include <QtCore/QtDebug>
51
BazaarClient::BazaarClient(BazaarSettings *settings) :
52
VCSBase::VCSBaseClient(settings)
56
BazaarSettings *BazaarClient::settings() const
58
return dynamic_cast<BazaarSettings *>(VCSBase::VCSBaseClient::settings());
61
bool BazaarClient::synchronousSetUserId()
64
args << QLatin1String("whoami")
66
.arg(settings()->stringValue(BazaarSettings::userNameKey))
67
.arg(settings()->stringValue(BazaarSettings::userEmailKey));
69
return vcsFullySynchronousExec(QDir::currentPath(), args, &stdOut);
72
BranchInfo BazaarClient::synchronousBranchQuery(const QString &repositoryRoot) const
74
QFile branchConfFile(repositoryRoot + QDir::separator() +
75
QLatin1String(Constants::BAZAARREPO) +
76
QLatin1String("/branch/branch.conf"));
77
if (!branchConfFile.open(QIODevice::ReadOnly))
78
return BranchInfo(QString(), false);
80
QTextStream ts(&branchConfFile);
81
QString branchLocation;
82
QString isBranchBound;
83
const QRegExp branchLocationRx("bound_location\\s*=\\s*(.+)$");
84
const QRegExp isBranchBoundRx("bound\\s*=\\s*(.+)$");
85
while (!ts.atEnd() && (branchLocation.isEmpty() || isBranchBound.isEmpty())) {
86
const QString line = ts.readLine();
87
if (branchLocationRx.indexIn(line) != -1)
88
branchLocation = branchLocationRx.cap(1);
89
else if (isBranchBoundRx.indexIn(line) != -1)
90
isBranchBound = isBranchBoundRx.cap(1);
92
if (isBranchBound.simplified().toLower() == QLatin1String("true"))
93
return BranchInfo(branchLocation, true);
94
return BranchInfo(repositoryRoot, false);
97
void BazaarClient::commit(const QString &repositoryRoot, const QStringList &files,
98
const QString &commitMessageFile, const QStringList &extraOptions)
100
VCSBaseClient::commit(repositoryRoot, files, commitMessageFile,
101
QStringList(extraOptions) << QLatin1String("-F") << commitMessageFile);
104
void BazaarClient::annotate(const QString &workingDir, const QString &file,
105
const QString revision, int lineNumber,
106
const QStringList &extraOptions)
108
VCSBaseClient::annotate(workingDir, file, revision, lineNumber,
109
QStringList(extraOptions) << QLatin1String("--long"));
112
QString BazaarClient::findTopLevelForFile(const QFileInfo &file) const
114
const QString repositoryCheckFile =
115
QLatin1String(Constants::BAZAARREPO) + QLatin1String("/branch-format");
116
return file.isDir() ?
117
VCSBase::VCSBasePlugin::findRepositoryForDirectory(file.absoluteFilePath(),
118
repositoryCheckFile) :
119
VCSBase::VCSBasePlugin::findRepositoryForDirectory(file.absolutePath(),
120
repositoryCheckFile);
123
void BazaarClient::view(const QString &source, const QString &id, const QStringList &extraOptions)
125
QStringList args(QLatin1String("log"));
126
args << QLatin1String("-p") << QLatin1String("-v") << extraOptions;
127
VCSBaseClient::view(source, id, args);
130
QString BazaarClient::vcsEditorKind(VCSCommand cmd) const
133
case AnnotateCommand:
134
return QLatin1String(Constants::ANNOTATELOG);
136
return QLatin1String(Constants::DIFFLOG);
138
return QLatin1String(Constants::FILELOG);
144
QStringList BazaarClient::revisionSpec(const QString &revision) const
147
if (!revision.isEmpty())
148
args << QLatin1String("-r") << revision;
152
BazaarClient::StatusItem BazaarClient::parseStatusLine(const QString &line) const
155
if (!line.isEmpty()) {
156
const QChar flagVersion = line[0];
157
if (flagVersion == QLatin1Char('+'))
158
item.flags = QLatin1String("Versioned");
159
else if (flagVersion == QLatin1Char('-'))
160
item.flags = QLatin1String("Unversioned");
161
else if (flagVersion == QLatin1Char('R'))
162
item.flags = QLatin1String("Renamed");
163
else if (flagVersion == QLatin1Char('?'))
164
item.flags = QLatin1String("Unknown");
165
else if (flagVersion == QLatin1Char('X'))
166
item.flags = QLatin1String("Nonexistent");
167
else if (flagVersion == QLatin1Char('C'))
168
item.flags = QLatin1String("Conflict");
169
else if (flagVersion == QLatin1Char('P'))
170
item.flags = QLatin1String("PendingMerge");
172
const int lineLength = line.length();
173
if (lineLength >= 2) {
174
const QChar flagContents = line[1];
175
if (flagContents == QLatin1Char('N'))
176
item.flags = QLatin1String("Created");
177
else if (flagContents == QLatin1Char('D'))
178
item.flags = QLatin1String("Deleted");
179
else if (flagContents == QLatin1Char('K'))
180
item.flags = QLatin1String("KindChanged");
181
else if (flagContents == QLatin1Char('M'))
182
item.flags = QLatin1String("Modified");
184
if (lineLength >= 3) {
185
const QChar flagExec = line[2];
186
if (flagExec == QLatin1Char('*'))
187
item.flags = QLatin1String("ExecuteBitChanged");
189
// The status string should be similar to "xxx file_with_changes"
190
// so just should take the file name part and store it
191
item.file = line.mid(4);
196
// Collect all parameters required for a diff or log to be able to associate
197
// them with an editor and re-run the command with parameters.
198
struct BazaarCommandParameters
200
BazaarCommandParameters(const QString &workDir,
201
const QStringList &inFiles,
202
const QStringList &options) :
203
workingDir(workDir), files(inFiles), extraOptions(options)
209
QStringList extraOptions;
212
// Parameter widget controlling whitespace diff mode, associated with a parameter
213
class BazaarDiffParameterWidget : public VCSBase::VCSBaseEditorParameterWidget
217
BazaarDiffParameterWidget(BazaarClient *client,
218
const BazaarCommandParameters &p, QWidget *parent = 0) :
219
VCSBase::VCSBaseEditorParameterWidget(parent), m_client(client), m_params(p)
221
mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore whitespace")),
222
client->settings()->boolPointer(BazaarSettings::diffIgnoreWhiteSpaceKey));
223
mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore blank lines")),
224
client->settings()->boolPointer(BazaarSettings::diffIgnoreBlankLinesKey));
227
QStringList arguments() const
230
// Bazaar wants "--diff-options=-w -B.."
231
const QStringList formatArguments = VCSBaseEditorParameterWidget::arguments();
232
if (!formatArguments.isEmpty()) {
233
const QString a = QLatin1String("--diff-options=")
234
+ formatArguments.join(QString(QLatin1Char(' ')));
240
void executeCommand()
242
m_client->diff(m_params.workingDir, m_params.files, m_params.extraOptions);
246
BazaarClient *m_client;
247
const BazaarCommandParameters m_params;
250
VCSBase::VCSBaseEditorParameterWidget *BazaarClient::createDiffEditor(
251
const QString &workingDir, const QStringList &files, const QStringList &extraOptions)
253
const BazaarCommandParameters parameters(workingDir, files, extraOptions);
254
return new BazaarDiffParameterWidget(this, parameters);
257
class BazaarLogParameterWidget : public VCSBase::VCSBaseEditorParameterWidget
261
BazaarLogParameterWidget(BazaarClient *client,
262
const BazaarCommandParameters &p, QWidget *parent = 0) :
263
VCSBase::VCSBaseEditorParameterWidget(parent), m_client(client), m_params(p)
265
mapSetting(addToggleButton(QLatin1String("--verbose"), tr("Verbose"),
266
tr("Show files changed in each revision")),
267
m_client->settings()->boolPointer(BazaarSettings::logVerboseKey));
268
mapSetting(addToggleButton(QLatin1String("--forward"), tr("Forward"),
269
tr("Show from oldest to newest")),
270
m_client->settings()->boolPointer(BazaarSettings::logForwardKey));
271
mapSetting(addToggleButton(QLatin1String("--include-merges"), tr("Include merges"),
272
tr("Show merged revisions")),
273
m_client->settings()->boolPointer(BazaarSettings::logIncludeMergesKey));
275
QList<ComboBoxItem> logChoices;
276
logChoices << ComboBoxItem(tr("Detailed"), QLatin1String("long"))
277
<< ComboBoxItem(tr("Moderately short"), QLatin1String("short"))
278
<< ComboBoxItem(tr("One line"), QLatin1String("line"))
279
<< ComboBoxItem(tr("GNU ChangeLog"), QLatin1String("gnu-changelog"));
280
mapSetting(addComboBox(QLatin1String("--log-format"), logChoices),
281
m_client->settings()->stringPointer(BazaarSettings::logFormatKey));
284
void executeCommand()
286
m_client->log(m_params.workingDir, m_params.files, m_params.extraOptions);
290
BazaarClient *m_client;
291
const BazaarCommandParameters m_params;
294
VCSBase::VCSBaseEditorParameterWidget *BazaarClient::createLogEditor(
295
const QString &workingDir, const QStringList &files, const QStringList &extraOptions)
297
const BazaarCommandParameters parameters(workingDir, files, extraOptions);
298
return new BazaarLogParameterWidget(this, parameters);
301
} //namespace Internal
302
} // namespace Bazaar
304
#include "bazaarclient.moc"