diff --git a/src/plugins/coreplugin/iversioncontrol.cpp b/src/plugins/coreplugin/iversioncontrol.cpp index 5dee9e2d27f..692ee550603 100644 --- a/src/plugins/coreplugin/iversioncontrol.cpp +++ b/src/plugins/coreplugin/iversioncontrol.cpp @@ -161,11 +161,11 @@ IVersionControl::~IVersionControl() delete m_topicCache; } -QStringList IVersionControl::unmanagedFiles(const QString &workingDir, - const QStringList &filePaths) const +QStringList IVersionControl::unmanagedFiles(const QStringList &filePaths) const { - return Utils::filtered(filePaths, [wd = QDir(workingDir), this](const QString &f) { - return !managesFile(wd.path(), wd.relativeFilePath(f)); + return Utils::filtered(filePaths, [this](const QString &f) { + const Utils::FilePath fp = Utils::FilePath::fromString(f); + return !managesFile(fp.parentDir().toString(), fp.fileName()); }); } diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index d5a529e72e3..3b52923f2fa 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -128,11 +128,9 @@ public: /*! * Returns the subset of \a filePaths that is not managed by this version control. * - * \a workingDirectory is assumed to be part of a valid repository (not necessarily its - * top level). The \a filePaths are expected to be absolute paths. + * The \a filePaths are expected to be absolute paths. */ - virtual QStringList unmanagedFiles(const QString &workingDir, - const QStringList &filePaths) const; + virtual QStringList unmanagedFiles(const QStringList &filePaths) const; /*! * Returns true is the VCS is configured to run. diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index 6a56f4dc997..96beaf565f1 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -436,7 +436,7 @@ void VcsManager::promptToAdd(const QString &directory, const QStringList &fileNa if (!vc || !vc->supportsOperation(IVersionControl::AddOperation)) return; - const QStringList unmanagedFiles = vc->unmanagedFiles(directory, fileNames); + const QStringList unmanagedFiles = vc->unmanagedFiles(fileNames); if (unmanagedFiles.isEmpty()) return; diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 2352c81f126..593f16fc4d7 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -840,22 +840,30 @@ bool GitClient::managesFile(const QString &workingDirectory, const QString &file == SynchronousProcessResponse::Finished; } -QStringList GitClient::unmanagedFiles(const QString &workingDirectory, - const QStringList &filePaths) const +QStringList GitClient::unmanagedFiles(const QStringList &filePaths) const { - QStringList args({"ls-files", "-z"}); - QDir wd(workingDirectory); - args << transform(filePaths, [&wd](const QString &fp) { return wd.relativeFilePath(fp); }); - const SynchronousProcessResponse response - = vcsFullySynchronousExec(workingDirectory, args, Core::ShellCommand::NoOutput); - if (response.result != SynchronousProcessResponse::Finished) - return filePaths; - const QStringList managedFilePaths - = transform(response.stdOut().split('\0', Qt::SkipEmptyParts), - [&wd](const QString &fp) { return wd.absoluteFilePath(fp); }); - return filtered(filePaths, [&managedFilePaths](const QString &fp) { - return !managedFilePaths.contains(fp); - }); + QMap filesForDir; + for (const QString &filePath : filePaths) { + const FilePath fp = FilePath::fromString(filePath); + filesForDir[fp.parentDir().toString()] << fp.fileName(); + } + QStringList res; + for (auto it = filesForDir.begin(), end = filesForDir.end(); it != end; ++it) { + QStringList args({"ls-files", "-z"}); + const QDir wd(it.key()); + args << transform(it.value(), [&wd](const QString &fp) { return wd.relativeFilePath(fp); }); + const SynchronousProcessResponse response + = vcsFullySynchronousExec(it.key(), args, Core::ShellCommand::NoOutput); + if (response.result != SynchronousProcessResponse::Finished) + return filePaths; + const QStringList managedFilePaths + = transform(response.stdOut().split('\0', Qt::SkipEmptyParts), + [&wd](const QString &fp) { return wd.absoluteFilePath(fp); }); + res += filtered(it.value(), [&managedFilePaths, &wd](const QString &fp) { + return !managedFilePaths.contains(wd.absoluteFilePath(fp)); + }); + } + return res; } QTextCodec *GitClient::codecFor(GitClient::CodecType codecType, const QString &source) const diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index ce4638d38e7..84ad0cf81ce 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -152,7 +152,7 @@ public: QString findRepositoryForDirectory(const QString &directory) const; QString findGitDirForRepository(const QString &repositoryDir) const; bool managesFile(const QString &workingDirectory, const QString &fileName) const; - QStringList unmanagedFiles(const QString &workingDirectory, const QStringList &filePaths) const; + QStringList unmanagedFiles(const QStringList &filePaths) const; void diffFile(const QString &workingDirectory, const QString &fileName) const; void diffFiles(const QString &workingDirectory, diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 27f132778ba..a4b4e06109f 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -239,7 +239,7 @@ public: bool managesDirectory(const QString &directory, QString *topLevel) const final; bool managesFile(const QString &workingDirectory, const QString &fileName) const final; - QStringList unmanagedFiles(const QString &workingDir, const QStringList &filePaths) const final; + QStringList unmanagedFiles(const QStringList &filePaths) const final; bool isConfigured() const final; bool supportsOperation(Operation operation) const final; @@ -1950,10 +1950,9 @@ bool GitPluginPrivate::managesFile(const QString &workingDirectory, const QStrin return m_gitClient.managesFile(workingDirectory, fileName); } -QStringList GitPluginPrivate::unmanagedFiles(const QString &workingDir, - const QStringList &filePaths) const +QStringList GitPluginPrivate::unmanagedFiles(const QStringList &filePaths) const { - return m_gitClient.unmanagedFiles(workingDir, filePaths); + return m_gitClient.unmanagedFiles(filePaths); } void GitPluginPrivate::vcsAnnotate(const QString &file, int line)