1 /*
2     SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "svncheckoutjob.h"
8 #include "svncheckoutjob_p.h"
9 
10 #include <QFileInfo>
11 #include <QMutexLocker>
12 
13 #include <KIO/Global>
14 #include <KLocalizedString>
15 
16 #include "kdevsvncpp/client.hpp"
17 #include "kdevsvncpp/path.hpp"
18 
19 #include <vcs/vcslocation.h>
20 #include <util/path.h>
21 
SvnInternalCheckoutJob(SvnJobBase * parent)22 SvnInternalCheckoutJob::SvnInternalCheckoutJob( SvnJobBase* parent )
23     : SvnInternalJobBase( parent )
24 {
25 }
26 
isValid() const27 bool SvnInternalCheckoutJob::isValid() const
28 {
29     QMutexLocker l( &m_mutex );
30     return m_sourceRepository.isValid() && m_destinationDirectory.isLocalFile() && QFileInfo::exists(KIO::upUrl(m_destinationDirectory).toLocalFile());
31 }
32 
run(ThreadWeaver::JobPointer,ThreadWeaver::Thread *)33 void SvnInternalCheckoutJob::run(ThreadWeaver::JobPointer /*self*/, ThreadWeaver::Thread* /*thread*/)
34 {
35     initBeforeRun();
36 
37     svn::Client cli(m_ctxt);
38     try {
39         bool recurse = ( recursion() == KDevelop::IBasicVersionControl::Recursive );
40         QUrl desturl = QUrl( source().repositoryServer() ).adjusted(QUrl::StripTrailingSlash | QUrl::NormalizePathSegments  );
41         const QByteArray srcba = desturl.url().toUtf8();
42         KDevelop::Path destdir(KDevelop::Path(destination()).parent(), destination().fileName());
43         QByteArray destba = destdir.toLocalFile().toUtf8();
44         qCDebug(PLUGIN_SVN) << srcba << destba << recurse;
45         cli.checkout( srcba.data(), svn::Path( destba.data() ), svn::Revision::HEAD, recurse );
46     } catch( const svn::ClientException& ce ) {
47         qCDebug(PLUGIN_SVN) << "Exception while checking out: " << source().repositoryServer() << ce.message();
48         setErrorMessage( QString::fromUtf8( ce.message() ) );
49         m_success = false;
50     }
51 }
52 
53 
setMapping(const KDevelop::VcsLocation & sourceRepository,const QUrl & destinationDirectory,KDevelop::IBasicVersionControl::RecursionMode recursion)54 void SvnInternalCheckoutJob::setMapping( const KDevelop::VcsLocation & sourceRepository, const QUrl & destinationDirectory, KDevelop::IBasicVersionControl::RecursionMode recursion )
55 {
56     QMutexLocker l( &m_mutex );
57     m_sourceRepository = sourceRepository;
58     m_destinationDirectory = destinationDirectory;
59     m_recursion = recursion;
60 }
61 
source() const62 KDevelop::VcsLocation SvnInternalCheckoutJob::source() const
63 {
64     QMutexLocker l( &m_mutex );
65     return m_sourceRepository;
66 }
67 
recursion() const68 KDevelop::IBasicVersionControl::RecursionMode SvnInternalCheckoutJob::recursion() const
69 {
70     QMutexLocker l( &m_mutex );
71     return m_recursion;
72 }
73 
destination() const74 QUrl SvnInternalCheckoutJob::destination() const
75 {
76     QMutexLocker l( &m_mutex );
77     return m_destinationDirectory;
78 }
79 
SvnCheckoutJob(KDevSvnPlugin * parent)80 SvnCheckoutJob::SvnCheckoutJob( KDevSvnPlugin* parent )
81     : SvnJobBaseImpl( parent, KDevelop::OutputJob::Silent )
82 {
83     setType( KDevelop::VcsJob::Import );
84     setObjectName(i18n("Subversion Checkout"));
85 }
86 
fetchResults()87 QVariant SvnCheckoutJob::fetchResults()
88 {
89     return QVariant();
90 }
91 
start()92 void SvnCheckoutJob::start()
93 {
94     if (!m_job->isValid() ) {
95         internalJobFailed();
96         setErrorText( i18n( "Not enough information to checkout" ) );
97     } else {
98         qCDebug(PLUGIN_SVN) << "checking out: " << m_job->source().repositoryServer();
99         startInternalJob();
100     }
101 }
102 
setMapping(const KDevelop::VcsLocation & sourceRepository,const QUrl & destinationDirectory,KDevelop::IBasicVersionControl::RecursionMode recursion)103 void SvnCheckoutJob::setMapping( const KDevelop::VcsLocation & sourceRepository, const QUrl & destinationDirectory, KDevelop::IBasicVersionControl::RecursionMode recursion )
104 {
105     if( status() == KDevelop::VcsJob::JobNotStarted ) {
106         m_job->setMapping(sourceRepository, destinationDirectory, recursion);
107     }
108 }
109