File indexing completed on 2024-05-05 04:41:00

0001 /*
0002     SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "svncheckoutjob.h"
0008 #include "svncheckoutjob_p.h"
0009 
0010 #include <QFileInfo>
0011 #include <QMutexLocker>
0012 
0013 #include <KIO/Global>
0014 #include <KLocalizedString>
0015 
0016 #include "kdevsvncpp/client.hpp"
0017 #include "kdevsvncpp/path.hpp"
0018 
0019 #include <vcs/vcslocation.h>
0020 #include <util/path.h>
0021 
0022 SvnInternalCheckoutJob::SvnInternalCheckoutJob( SvnJobBase* parent )
0023     : SvnInternalJobBase( parent )
0024 {
0025 }
0026 
0027 bool SvnInternalCheckoutJob::isValid() const
0028 {
0029     QMutexLocker l( &m_mutex );
0030     return m_sourceRepository.isValid() && m_destinationDirectory.isLocalFile() && QFileInfo::exists(KIO::upUrl(m_destinationDirectory).toLocalFile());
0031 }
0032 
0033 void SvnInternalCheckoutJob::run(ThreadWeaver::JobPointer /*self*/, ThreadWeaver::Thread* /*thread*/)
0034 {
0035     initBeforeRun();
0036 
0037     svn::Client cli(m_ctxt);
0038     try {
0039         bool recurse = ( recursion() == KDevelop::IBasicVersionControl::Recursive );
0040         QUrl desturl = QUrl( source().repositoryServer() ).adjusted(QUrl::StripTrailingSlash | QUrl::NormalizePathSegments  );
0041         const QByteArray srcba = desturl.url().toUtf8();
0042         KDevelop::Path destdir(KDevelop::Path(destination()).parent(), destination().fileName());
0043         QByteArray destba = destdir.toLocalFile().toUtf8();
0044         qCDebug(PLUGIN_SVN) << srcba << destba << recurse;
0045         cli.checkout( srcba.data(), svn::Path( destba.data() ), svn::Revision::HEAD, recurse );
0046     } catch( const svn::ClientException& ce ) {
0047         qCDebug(PLUGIN_SVN) << "Exception while checking out: " << source().repositoryServer() << ce.message();
0048         setErrorMessage( QString::fromUtf8( ce.message() ) );
0049         m_success = false;
0050     }
0051 }
0052 
0053 
0054 void SvnInternalCheckoutJob::setMapping( const KDevelop::VcsLocation & sourceRepository, const QUrl & destinationDirectory, KDevelop::IBasicVersionControl::RecursionMode recursion )
0055 {
0056     QMutexLocker l( &m_mutex );
0057     m_sourceRepository = sourceRepository;
0058     m_destinationDirectory = destinationDirectory;
0059     m_recursion = recursion;
0060 }
0061 
0062 KDevelop::VcsLocation SvnInternalCheckoutJob::source() const
0063 {
0064     QMutexLocker l( &m_mutex );
0065     return m_sourceRepository;
0066 }
0067 
0068 KDevelop::IBasicVersionControl::RecursionMode SvnInternalCheckoutJob::recursion() const
0069 {
0070     QMutexLocker l( &m_mutex );
0071     return m_recursion;
0072 }
0073 
0074 QUrl SvnInternalCheckoutJob::destination() const
0075 {
0076     QMutexLocker l( &m_mutex );
0077     return m_destinationDirectory;
0078 }
0079 
0080 SvnCheckoutJob::SvnCheckoutJob( KDevSvnPlugin* parent )
0081     : SvnJobBaseImpl( parent, KDevelop::OutputJob::Silent )
0082 {
0083     setType( KDevelop::VcsJob::Import );
0084     setObjectName(i18n("Subversion Checkout"));
0085 }
0086 
0087 QVariant SvnCheckoutJob::fetchResults()
0088 {
0089     return QVariant();
0090 }
0091 
0092 void SvnCheckoutJob::start()
0093 {
0094     if (!m_job->isValid() ) {
0095         internalJobFailed();
0096         setErrorText( i18n( "Not enough information to checkout" ) );
0097     } else {
0098         qCDebug(PLUGIN_SVN) << "checking out: " << m_job->source().repositoryServer();
0099         startInternalJob();
0100     }
0101 }
0102 
0103 void SvnCheckoutJob::setMapping( const KDevelop::VcsLocation & sourceRepository, const QUrl & destinationDirectory, KDevelop::IBasicVersionControl::RecursionMode recursion )
0104 {
0105     if( status() == KDevelop::VcsJob::JobNotStarted ) {
0106         m_job->setMapping(sourceRepository, destinationDirectory, recursion);
0107     }
0108 }
0109 
0110 #include "moc_svncheckoutjob_p.cpp"
0111 #include "moc_svncheckoutjob.cpp"