File indexing completed on 2024-04-28 04:38:51
0001 /* 0002 SPDX-FileCopyrightText: 2014 Sven Brauch <svenbrauch@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #include "gitplugincheckinrepositoryjob.h" 0008 #include "debug.h" 0009 0010 #include <KTextEditor/Document> 0011 0012 #include <QTextCodec> 0013 #include <QDir> 0014 0015 GitPluginCheckInRepositoryJob::GitPluginCheckInRepositoryJob(KTextEditor::Document* document, 0016 const QString& rootDirectory) 0017 : CheckInRepositoryJob(document) 0018 , m_hashjob(nullptr) 0019 , m_findjob(nullptr) 0020 , m_rootDirectory(rootDirectory) 0021 {} 0022 0023 void GitPluginCheckInRepositoryJob::start() 0024 { 0025 const QTextCodec* codec = QTextCodec::codecForName(document()->encoding().toLatin1()); 0026 0027 const QDir workingDirectory(m_rootDirectory); 0028 if ( !workingDirectory.exists() ) { 0029 emit finished(false); 0030 return; 0031 } 0032 0033 m_findjob = new QProcess(this); 0034 m_findjob->setWorkingDirectory(m_rootDirectory); 0035 0036 m_hashjob = new QProcess(this); 0037 m_hashjob->setWorkingDirectory(m_rootDirectory); 0038 m_hashjob->setStandardOutputProcess(m_findjob); 0039 0040 connect(m_findjob, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &GitPluginCheckInRepositoryJob::repositoryQueryFinished); 0041 connect(m_hashjob, &QProcess::errorOccurred, this, &GitPluginCheckInRepositoryJob::processFailed); 0042 connect(m_findjob, &QProcess::errorOccurred, this, &GitPluginCheckInRepositoryJob::processFailed); 0043 0044 m_hashjob->start(QStringLiteral("git"), QStringList{QStringLiteral("hash-object"), QStringLiteral("--stdin")}); 0045 m_findjob->start(QStringLiteral("git"), QStringList{QStringLiteral("cat-file"), QStringLiteral("--batch-check")}); 0046 0047 for ( int i = 0; i < document()->lines(); i++ ) { 0048 m_hashjob->write(codec->fromUnicode(document()->line(i))); 0049 if ( i != document()->lines() - 1 ) { 0050 m_hashjob->write("\n"); 0051 } 0052 } 0053 m_hashjob->closeWriteChannel(); 0054 0055 } 0056 0057 GitPluginCheckInRepositoryJob::~GitPluginCheckInRepositoryJob() 0058 { 0059 if ( m_findjob && m_findjob->state() == QProcess::Running ) { 0060 m_findjob->kill(); 0061 } 0062 if ( m_hashjob && m_hashjob->state() == QProcess::Running ) { 0063 m_hashjob->kill(); 0064 } 0065 } 0066 0067 void GitPluginCheckInRepositoryJob::processFailed(QProcess::ProcessError err) 0068 { 0069 qCDebug(PLUGIN_GIT) << "calling git failed with error:" << err; 0070 emit finished(false); 0071 } 0072 0073 void GitPluginCheckInRepositoryJob::repositoryQueryFinished(int) 0074 { 0075 const QByteArray output = m_findjob->readAllStandardOutput(); 0076 bool requestSucceeded = output.contains(" blob "); 0077 emit finished(requestSucceeded); 0078 } 0079 0080 #include "moc_gitplugincheckinrepositoryjob.cpp"