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