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

0001 /*
0002     SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "svninfojob.h"
0008 
0009 #include "svninfojob_p.h"
0010 
0011 #include <QMutexLocker>
0012 
0013 #include <KLocalizedString>
0014 
0015 #include "kdevsvncpp/client.hpp"
0016 #include "kdevsvncpp/info.hpp"
0017 
0018 SvnInternalInfoJob::SvnInternalInfoJob( SvnJobBase* parent )
0019     : SvnInternalJobBase( parent )
0020 {
0021 }
0022 
0023 void SvnInternalInfoJob::run(ThreadWeaver::JobPointer /*self*/, ThreadWeaver::Thread* /*thread*/)
0024 {
0025     initBeforeRun();
0026     svn::Client cli(m_ctxt);
0027     try
0028     {
0029         QByteArray ba = location().toString( QUrl::PreferLocalFile | QUrl::StripTrailingSlash ).toUtf8();
0030         svn::InfoVector v = cli.info( ba.data() );
0031         svn::Info i = v.at(0);
0032         SvnInfoHolder h;
0033         h.name = QString::fromUtf8( i.path().path().c_str() );
0034         h.url = QUrl::fromUserInput( QString::fromUtf8( i.url() ) );
0035         h.rev = qlonglong( i.revision() );
0036         h.kind = i.kind();
0037         h.repoUrl = QUrl::fromUserInput( QString::fromUtf8( i.repos() ) );
0038         h.repouuid = QString::fromUtf8( i.uuid() );
0039         h.lastChangedRev = qlonglong( i.lastChangedRevision() );
0040         h.lastChangedDate = QDateTime::fromSecsSinceEpoch(i.lastChangedDate(), Qt::LocalTime);
0041         h.lastChangedAuthor = QString::fromUtf8( i.lastChangedAuthor() );
0042         h.scheduled = i.schedule();
0043         h.copyFromUrl = QUrl::fromUserInput( QString::fromUtf8( i.copyFromUrl() ) );
0044         h.copyFromRevision = qlonglong( i.copyFromRevision() );
0045         h.textTime = QDateTime::fromSecsSinceEpoch(i.textTime(), Qt::LocalTime);
0046         h.propertyTime = QDateTime::fromSecsSinceEpoch(i.propertyTime(), Qt::LocalTime);
0047         h.oldFileConflict = QString::fromUtf8( i.oldConflictFile() );
0048         h.newFileConflict = QString::fromUtf8( i.newConflictFile() );
0049         h.workingCopyFileConflict = QString::fromUtf8( i.workingConflictFile() );
0050         h.propertyRejectFile = QString::fromUtf8( i.propertyRejectFile() );
0051 
0052         emit gotInfo( h );
0053     }catch( const svn::ClientException& ce )
0054     {
0055         qCDebug(PLUGIN_SVN) << "Exception while getting info for file: "
0056                 << m_location
0057                 << QString::fromUtf8( ce.message() );
0058         setErrorMessage( QString::fromUtf8( ce.message() ) );
0059         m_success = false;
0060     }
0061 }
0062 
0063 void SvnInternalInfoJob::setLocation( const QUrl &url )
0064 {
0065     QMutexLocker l( &m_mutex );
0066     m_location = url;
0067 }
0068 
0069 QUrl SvnInternalInfoJob::location() const
0070 {
0071     QMutexLocker l( &m_mutex );
0072     return m_location;
0073 }
0074 
0075 SvnInfoJob::SvnInfoJob( KDevSvnPlugin* parent )
0076     : SvnJobBaseImpl( parent, KDevelop::OutputJob::Silent ), m_provideInfo( SvnInfoJob::AllInfo )
0077 {
0078     setType( KDevelop::VcsJob::Add );
0079     connect( m_job.data(), &SvnInternalInfoJob::gotInfo,
0080              this, &SvnInfoJob::setInfo, Qt::QueuedConnection );
0081     setObjectName(i18n("Subversion Info"));
0082 }
0083 
0084 QVariant SvnInfoJob::fetchResults()
0085 {
0086     if( m_provideInfo == RepoUrlOnly )
0087     {
0088         return QVariant(m_info.url);
0089     }else if( m_provideInfo == RevisionOnly )
0090     {
0091         KDevelop::VcsRevision rev;
0092         svn::Revision svnRev( m_info.rev );
0093         switch( m_provideRevisionType )
0094         {
0095             case KDevelop::VcsRevision::Date:
0096                 rev.setRevisionValue( QVariant( QDateTime::fromSecsSinceEpoch(svnRev.date(), Qt::LocalTime) ),
0097                                       KDevelop::VcsRevision::Date );
0098                 break;
0099             default:
0100                 rev.setRevisionValue( QVariant( qlonglong( svnRev.revnum() ) ),
0101                                       KDevelop::VcsRevision::GlobalNumber );
0102                 break;
0103         }
0104         return QVariant::fromValue<KDevelop::VcsRevision>(rev);
0105     }
0106     return QVariant::fromValue<SvnInfoHolder>(m_info);
0107 }
0108 
0109 void SvnInfoJob::start()
0110 {
0111     if (!m_job->location().isValid()) {
0112         internalJobFailed();
0113         setErrorText( i18n( "Not enough information to execute info job" ) );
0114     } else {
0115         startInternalJob();
0116     }
0117 }
0118 
0119 void SvnInfoJob::setLocation( const QUrl &url )
0120 {
0121     if( status() == KDevelop::VcsJob::JobNotStarted )
0122         m_job->setLocation( url );
0123 }
0124 
0125 void SvnInfoJob::setProvideInformation( ProvideInformationType type )
0126 {
0127     m_provideInfo = type;
0128 }
0129 
0130 void SvnInfoJob::setProvideRevisionType( KDevelop::VcsRevision::RevisionType t )
0131 {
0132     m_provideRevisionType = t;
0133 }
0134 
0135 void SvnInfoJob::setInfo( const SvnInfoHolder& info )
0136 {
0137     m_info = info;
0138     emit resultsReady( this );
0139 }
0140 
0141 #include "moc_svninfojob.cpp"
0142 #include "moc_svninfojob_p.cpp"