aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/vcsbase
diff options
context:
space:
mode:
authorMarcus Tillmanns <marcus.tillmanns@qt.io>2024-02-08 17:44:24 +0100
committerMarcus Tillmanns <marcus.tillmanns@qt.io>2024-02-12 11:25:06 +0000
commit291a893f5f5dbe0837ed145fb750417ee0f8475f (patch)
tree8736e228bff861cf60901dfd60ffbca023acb319 /src/plugins/vcsbase
parente21b8e0c1d845962b55287f7ff7742ff680383a6 (diff)
VCS: Allow remote vcs operations
Both VcsBaseClient::vcsBinary() and VcsBaseClient::processEnvironment() get an additional parameter "FilePath target" to allow selecting binaries and environment based on where the repository is located. This allows to select e.g. a git binary on a remote device, and the environment of the remote device for each VCS operation. A bunch of file path operations are either fixed or ported to actually use FilePath correctly. Change-Id: I6afc645772fde3dff3ec19c13efe538e5888e952 Reviewed-by: hjk <hjk@qt.io> Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/plugins/vcsbase')
-rw-r--r--src/plugins/vcsbase/vcsbaseclient.cpp63
-rw-r--r--src/plugins/vcsbase/vcsbaseclient.h8
-rw-r--r--src/plugins/vcsbase/vcsbaseeditor.cpp2
-rw-r--r--src/plugins/vcsbase/vcsbaseplugin.cpp2
-rw-r--r--src/plugins/vcsbase/vcscommand.h8
5 files changed, 47 insertions, 36 deletions
diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp
index ea2ddcadc5..81a816c009 100644
--- a/src/plugins/vcsbase/vcsbaseclient.cpp
+++ b/src/plugins/vcsbase/vcsbaseclient.cpp
@@ -61,15 +61,18 @@ VcsBaseClientImpl::VcsBaseClientImpl(VcsBaseSettings *baseSettings)
this, &VcsBaseClientImpl::saveSettings);
}
-FilePath VcsBaseClientImpl::vcsBinary() const
+FilePath VcsBaseClientImpl::vcsBinary(const Utils::FilePath &forDirectory) const
{
+ if (forDirectory.needsDevice())
+ return {};
+
return m_baseSettings->binaryPath();
}
VcsCommand *VcsBaseClientImpl::createCommand(const FilePath &workingDirectory,
VcsBaseEditorWidget *editor) const
{
- auto cmd = createVcsCommand(workingDirectory, processEnvironment());
+ auto cmd = createVcsCommand(workingDirectory, processEnvironment(workingDirectory));
if (editor) {
editor->setCommand(cmd);
connect(cmd, &VcsCommand::done, editor, [editor, cmd] {
@@ -88,24 +91,24 @@ void VcsBaseClientImpl::setupCommand(Utils::Process &process,
const FilePath &workingDirectory,
const QStringList &args) const
{
- process.setEnvironment(processEnvironment());
+ process.setEnvironment(workingDirectory.deviceEnvironment());
process.setWorkingDirectory(workingDirectory);
- process.setCommand({vcsBinary(), args});
+ process.setCommand({vcsBinary(workingDirectory), args});
process.setUseCtrlCStub(true);
}
-void VcsBaseClientImpl::enqueueJob(VcsCommand *cmd, const QStringList &args,
+void VcsBaseClientImpl::enqueueJob(VcsCommand *cmd,
+ const QStringList &args,
+ const Utils::FilePath &forDirectory,
const ExitCodeInterpreter &interpreter) const
{
- cmd->addJob({vcsBinary(), args}, vcsTimeoutS(), {}, interpreter);
+ cmd->addJob({vcsBinary(forDirectory), args}, vcsTimeoutS(), {}, interpreter);
cmd->start();
}
-Environment VcsBaseClientImpl::processEnvironment() const
+Environment VcsBaseClientImpl::processEnvironment(const FilePath &appliedTo) const
{
- Environment environment = Environment::systemEnvironment();
- VcsBase::setProcessEnvironment(&environment);
- return environment;
+ return appliedTo.deviceEnvironment();
}
QStringList VcsBaseClientImpl::splitLines(const QString &s)
@@ -129,14 +132,18 @@ QString VcsBaseClientImpl::stripLastNewline(const QString &in)
CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir,
const QStringList &args, RunFlags flags, int timeoutS, QTextCodec *codec) const
{
- return vcsSynchronousExec(workingDir, {vcsBinary(), args}, flags, timeoutS, codec);
+ return vcsSynchronousExec(workingDir, {vcsBinary(workingDir), args}, flags, timeoutS, codec);
}
CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir,
const CommandLine &cmdLine, RunFlags flags, int timeoutS, QTextCodec *codec) const
{
- return VcsCommand::runBlocking(workingDir, processEnvironment(), cmdLine, flags,
- timeoutS > 0 ? timeoutS : vcsTimeoutS(), codec);
+ return VcsCommand::runBlocking(workingDir,
+ processEnvironment(workingDir),
+ cmdLine,
+ flags,
+ timeoutS > 0 ? timeoutS : vcsTimeoutS(),
+ codec);
}
void VcsBaseClientImpl::resetCachedVcsInfo(const FilePath &workingDir)
@@ -166,7 +173,7 @@ void VcsBaseClientImpl::vcsExecWithHandler(const FilePath &workingDirectory,
VcsCommand *command = createCommand(workingDirectory);
command->addFlags(additionalFlags);
command->setCodec(codec);
- command->addJob({vcsBinary(), arguments}, vcsTimeoutS());
+ command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS());
if (handler) {
const QObject *actualContext = context ? context : this;
connect(command, &VcsCommand::done, actualContext, [command, handler] {
@@ -182,7 +189,7 @@ void VcsBaseClientImpl::vcsExec(const FilePath &workingDirectory,
{
VcsCommand *command = createCommand(workingDirectory);
command->addFlags(additionalFlags);
- command->addJob({vcsBinary(), arguments}, vcsTimeoutS());
+ command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS());
command->start();
}
@@ -192,7 +199,7 @@ void VcsBaseClientImpl::vcsExecWithEditor(const Utils::FilePath &workingDirector
{
VcsCommand *command = createCommand(workingDirectory, editor);
command->setCodec(editor->codec());
- command->addJob({vcsBinary(), arguments}, vcsTimeoutS());
+ command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS());
command->start();
}
@@ -350,7 +357,7 @@ void VcsBaseClient::annotate(const Utils::FilePath &workingDir, const QString &f
VcsCommand *cmd = createCommand(workingDir, editor);
editor->setDefaultLineNumber(lineNumber);
- enqueueJob(cmd, args);
+ enqueueJob(cmd, args, workingDir);
}
void VcsBaseClient::diff(const FilePath &workingDir, const QStringList &files)
@@ -387,7 +394,7 @@ void VcsBaseClient::diff(const FilePath &workingDir, const QStringList &files)
: VcsBaseEditor::getCodec(source);
VcsCommand *command = createCommand(workingDir, editor);
command->setCodec(codec);
- enqueueJob(command, args, exitCodeInterpreter(DiffCommand));
+ enqueueJob(command, args, workingDir, exitCodeInterpreter(DiffCommand));
}
void VcsBaseClient::log(const FilePath &workingDir,
@@ -421,7 +428,7 @@ void VcsBaseClient::log(const FilePath &workingDir,
}
}
- CommandLine args{vcsBinary(), {vcsCmdString}};
+ CommandLine args{vcsBinary(workingDir), {vcsCmdString}};
if (addAuthOptions)
addAuthOptions(args);
if (editorConfig)
@@ -448,7 +455,7 @@ void VcsBaseClient::revertFile(const FilePath &workingDir,
if (cmd->result() == ProcessResult::FinishedWithSuccess)
emit changed(files);
});
- enqueueJob(cmd, args);
+ enqueueJob(cmd, args, workingDir);
}
void VcsBaseClient::revertAll(const FilePath &workingDir,
@@ -464,7 +471,7 @@ void VcsBaseClient::revertAll(const FilePath &workingDir,
if (cmd->result() == ProcessResult::FinishedWithSuccess)
emit changed(files);
});
- enqueueJob(cmd, args);
+ enqueueJob(cmd, args, workingDir);
}
void VcsBaseClient::status(const FilePath &workingDir,
@@ -475,7 +482,7 @@ void VcsBaseClient::status(const FilePath &workingDir,
args << extraOptions << file;
VcsCommand *cmd = createCommand(workingDir);
cmd->addFlags(RunFlags::ShowStdOut);
- enqueueJob(cmd, args);
+ enqueueJob(cmd, args, workingDir);
}
void VcsBaseClient::emitParsedStatus(const FilePath &repository, const QStringList &extraOptions)
@@ -484,7 +491,7 @@ void VcsBaseClient::emitParsedStatus(const FilePath &repository, const QStringLi
args << extraOptions;
VcsCommand *cmd = createCommand(repository);
connect(cmd, &VcsCommand::done, this, [this, cmd] { statusParser(cmd->cleanedStdOut()); });
- enqueueJob(cmd, args);
+ enqueueJob(cmd, args, repository);
}
QString VcsBaseClient::vcsCommandString(VcsCommandTag cmd) const
@@ -525,7 +532,7 @@ void VcsBaseClient::import(const FilePath &repositoryRoot,
{
QStringList args(vcsCommandString(ImportCommand));
args << extraOptions << files;
- enqueueJob(createCommand(repositoryRoot), args);
+ enqueueJob(createCommand(repositoryRoot), args, repositoryRoot);
}
void VcsBaseClient::view(const FilePath &source,
@@ -541,7 +548,7 @@ void VcsBaseClient::view(const FilePath &source,
VcsBaseEditor::getCodec(source), "view", id);
const FilePath workingDirPath = source.isFile() ? source.absolutePath() : source;
- enqueueJob(createCommand(workingDirPath, editor), args);
+ enqueueJob(createCommand(workingDirPath, editor), args, source);
}
void VcsBaseClient::update(const FilePath &repositoryRoot, const QString &revision,
@@ -554,7 +561,7 @@ void VcsBaseClient::update(const FilePath &repositoryRoot, const QString &revisi
if (cmd->result() == ProcessResult::FinishedWithSuccess)
emit changed(repositoryRoot.toString());
});
- enqueueJob(cmd, args);
+ enqueueJob(cmd, args, repositoryRoot);
}
void VcsBaseClient::commit(const FilePath &repositoryRoot,
@@ -576,12 +583,12 @@ void VcsBaseClient::commit(const FilePath &repositoryRoot,
cmd->addFlags(RunFlags::ShowStdOut);
if (!commitMessageFile.isEmpty())
connect(cmd, &VcsCommand::done, [commitMessageFile] { QFile(commitMessageFile).remove(); });
- enqueueJob(cmd, args);
+ enqueueJob(cmd, args, repositoryRoot);
}
QString VcsBaseClient::vcsEditorTitle(const QString &vcsCmd, const QString &sourceId) const
{
- return vcsBinary().baseName() + QLatin1Char(' ') + vcsCmd + QLatin1Char(' ')
+ return vcsBinary({}).baseName() + QLatin1Char(' ') + vcsCmd + QLatin1Char(' ')
+ FilePath::fromString(sourceId).fileName();
}
diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h
index f1db56ebeb..99b818b59b 100644
--- a/src/plugins/vcsbase/vcsbaseclient.h
+++ b/src/plugins/vcsbase/vcsbaseclient.h
@@ -41,7 +41,7 @@ public:
explicit VcsBaseClientImpl(VcsBaseSettings *baseSettings);
~VcsBaseClientImpl() override = default;
- virtual Utils::FilePath vcsBinary() const;
+ virtual Utils::FilePath vcsBinary(const Utils::FilePath &forDirectory) const;
int vcsTimeoutS() const;
static VcsCommand *createVcsCommand(const Utils::FilePath &defaultWorkingDir,
@@ -59,10 +59,12 @@ public:
const Utils::FilePath &workingDirectory,
const QStringList &args) const;
- void enqueueJob(VcsCommand *cmd, const QStringList &args,
+ void enqueueJob(VcsCommand *cmd,
+ const QStringList &args,
+ const Utils::FilePath &forDirectory,
const ExitCodeInterpreter &interpreter = {}) const;
- virtual Utils::Environment processEnvironment() const;
+ virtual Utils::Environment processEnvironment(const Utils::FilePath &appliedTo) const;
// VCS functionality:
virtual void annotate(const Utils::FilePath &workingDir, const QString &file,
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index d365be7156..b10758233a 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -1327,7 +1327,7 @@ bool VcsBaseEditor::gotoLineOfEditor(IEditor *e, int lineNumber)
// ('git diff XX' -> 'XX' , 'git diff XX file' -> 'XX/file').
FilePath VcsBaseEditor::getSource(const FilePath &workingDirectory, const QString &fileName)
{
- return workingDirectory.pathAppended(fileName);
+ return workingDirectory.resolvePath(fileName);
}
FilePath VcsBaseEditor::getSource(const FilePath &workingDirectory, const QStringList &fileNames)
diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp
index ee2ea42813..b506f0ed38 100644
--- a/src/plugins/vcsbase/vcsbaseplugin.cpp
+++ b/src/plugins/vcsbase/vcsbaseplugin.cpp
@@ -374,7 +374,7 @@ FilePath VcsBasePluginState::currentFileDirectory() const
QString VcsBasePluginState::relativeCurrentFile() const
{
QTC_ASSERT(hasFile(), return {});
- return data->m_state.currentFile.relativeChildPath(data->m_state.currentFileTopLevel).toString();
+ return data->m_state.currentFile.relativeChildPath(data->m_state.currentFileTopLevel).path();
}
QString VcsBasePluginState::currentPatchFile() const
diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h
index e9975dcb14..6271139544 100644
--- a/src/plugins/vcsbase/vcscommand.h
+++ b/src/plugins/vcsbase/vcscommand.h
@@ -82,9 +82,11 @@ public:
void setProgressParser(const Core::ProgressParser &parser);
static CommandResult runBlocking(const Utils::FilePath &workingDirectory,
- const Utils::Environment &environmentconst,
- const Utils::CommandLine &command, RunFlags flags,
- int timeoutS, QTextCodec *codec);
+ const Utils::Environment &environment,
+ const Utils::CommandLine &command,
+ RunFlags flags,
+ int timeoutS,
+ QTextCodec *codec);
void cancel();
QString cleanedStdOut() const;