File indexing completed on 2024-05-19 12:22:53
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