File indexing completed on 2024-04-28 04:37:47

0001 /*
0002     SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "vcsrevision.h"
0008 
0009 #include <QString>
0010 #include <QStringList>
0011 #include <QMap>
0012 #include <QDateTime>
0013 #include <QLocale>
0014 
0015 
0016 namespace KDevelop
0017 {
0018 
0019 VcsRevision VcsRevision::createSpecialRevision( KDevelop::VcsRevision::RevisionSpecialType _type )
0020 {
0021     VcsRevision rev;
0022     rev.setRevisionValue( QVariant::fromValue<KDevelop::VcsRevision::RevisionSpecialType>( _type ), VcsRevision::Special );
0023     return rev;
0024 }
0025 
0026 class VcsRevisionPrivate : public QSharedData
0027 {
0028     public:
0029         QVariant value;
0030         VcsRevision::RevisionType type;
0031         QMap<QString,QVariant> internalValues;
0032 };
0033 
0034 VcsRevision::VcsRevision()
0035     : d(new VcsRevisionPrivate)
0036 {
0037     d->type = VcsRevision::Invalid;
0038 }
0039 
0040 VcsRevision::VcsRevision( const VcsRevision& rhs )
0041     : d(rhs.d)
0042 {
0043 }
0044 
0045 VcsRevision::~VcsRevision() = default;
0046 
0047 VcsRevision& VcsRevision::operator=( const VcsRevision& rhs)
0048 {
0049     d = rhs.d;
0050     return *this;
0051 }
0052 
0053 void VcsRevision::setRevisionValue( const QVariant& rev, VcsRevision::RevisionType type )
0054 {
0055     d->value = rev;
0056     d->type = type;
0057 }
0058 
0059 VcsRevision::RevisionType VcsRevision::revisionType() const
0060 {
0061     return d->type;
0062 }
0063 
0064 VcsRevision::RevisionSpecialType VcsRevision::specialType() const
0065 {
0066     Q_ASSERT(d->type==Special);
0067     return d->value.value<RevisionSpecialType>();
0068 }
0069 
0070 QVariant VcsRevision::revisionValue() const
0071 {
0072     return d->value;
0073 }
0074 
0075 QStringList VcsRevision::keys() const
0076 {
0077     return d->internalValues.keys();
0078 }
0079 
0080 QVariant VcsRevision::value(const QString& key) const
0081 {
0082     const auto valueIt = d->internalValues.constFind(key);
0083     if (valueIt != d->internalValues.constEnd()) {
0084         return *valueIt;
0085     }
0086     return QVariant();
0087 }
0088 
0089 void VcsRevision::setValue( const QString& key, const QVariant& value )
0090 {
0091     d->internalValues[key] = value;
0092 }
0093 
0094 void VcsRevision::setType( RevisionType t)
0095 {
0096     d->type = t;
0097 }
0098 
0099 void VcsRevision::setSpecialType( RevisionSpecialType t)
0100 {
0101     d->value = QVariant(t);
0102 }
0103 
0104 void VcsRevision::setValue( const QVariant& v )
0105 {
0106     d->value = v;
0107 }
0108 
0109 bool VcsRevision::operator==( const KDevelop::VcsRevision& rhs ) const
0110 {
0111     return ( d->type == rhs.d->type && d->value == rhs.d->value && d->internalValues == rhs.d->internalValues );
0112 }
0113 
0114 QString VcsRevision::prettyValue() const
0115 {
0116     switch( revisionType() )
0117     {
0118         case GlobalNumber:
0119         case FileNumber:
0120             return (revisionValue().type() == QVariant::String ? revisionValue().toString() : QString::number(revisionValue().toLongLong()));
0121         case Special:
0122             switch( revisionValue().value<KDevelop::VcsRevision::RevisionSpecialType>(  ) )
0123             {
0124                 case VcsRevision::Head:
0125                     return QStringLiteral("Head");
0126                 case VcsRevision::Base:
0127                     return QStringLiteral("Base");
0128                 case VcsRevision::Working:
0129                     return QStringLiteral("Working");
0130                 case VcsRevision::Previous:
0131                     return QStringLiteral("Previous");
0132                 case VcsRevision::Start:
0133                     return QStringLiteral("Start");
0134                 default:
0135                     return QStringLiteral("User");
0136             }
0137         case Date:
0138             return  QLocale().toString(revisionValue().toDateTime(), QLocale::ShortFormat);
0139         default:
0140             return revisionValue().toString();
0141     }
0142 }
0143 
0144 }
0145 
0146 uint KDevelop::qHash( const KDevelop::VcsRevision& rev)
0147 {
0148     const auto revisionValue = rev.revisionValue();
0149     switch (rev.revisionType()) {
0150         case VcsRevision::GlobalNumber:
0151         case VcsRevision::FileNumber:
0152             return (revisionValue.type() == QVariant::String ? ::qHash(revisionValue.toString()) :
0153                     ::qHash(revisionValue.toULongLong()));
0154         case VcsRevision::Special:
0155             return ::qHash(static_cast<int>(revisionValue.value<KDevelop::VcsRevision::RevisionSpecialType>()));
0156         case VcsRevision::Date:
0157             return ::qHash(revisionValue.toDateTime());
0158         default:
0159             return ::qHash(revisionValue.toString());
0160     }
0161 }
0162