Mojang introduced a new structure for natives, notably for LWJGL. Now instead of using the `natives` structure of the version format, Mojang chose to create a seperate library entry for each platform, which uses the `rules` structure to specify the platform. These new split natives carry the same groupId and artifactId, as the main library, but have an additional classifier, like `natives-linux`. When comparing GradleSpecifiers we don't look at the classifier, so when the launcher sees an artifact called `org.lwjgl:lwjgl:3.3.1` and right after that an artifact called `org.lwjgl:lwjgl:3.3.1:natives-linux`, it will treat it as "already added" and forget it. This change will include the classifier in that comparison.
		
			
				
	
	
		
			152 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
 | 
						|
#include <QString>
 | 
						|
#include <QStringList>
 | 
						|
#include "DefaultVariable.h"
 | 
						|
 | 
						|
struct GradleSpecifier
 | 
						|
{
 | 
						|
    GradleSpecifier()
 | 
						|
    {
 | 
						|
        m_valid = false;
 | 
						|
    }
 | 
						|
    GradleSpecifier(QString value)
 | 
						|
    {
 | 
						|
        operator=(value);
 | 
						|
    }
 | 
						|
    GradleSpecifier & operator =(const QString & value)
 | 
						|
    {
 | 
						|
        /*
 | 
						|
        org.gradle.test.classifiers : service : 1.0 : jdk15 @ jar
 | 
						|
         0 "org.gradle.test.classifiers:service:1.0:jdk15@jar"
 | 
						|
         1 "org.gradle.test.classifiers"
 | 
						|
         2 "service"
 | 
						|
         3 "1.0"
 | 
						|
         4 "jdk15"
 | 
						|
         5 "jar"
 | 
						|
        */
 | 
						|
        QRegExp matcher("([^:@]+):([^:@]+):([^:@]+)" "(?::([^:@]+))?" "(?:@([^:@]+))?");
 | 
						|
        m_valid = matcher.exactMatch(value);
 | 
						|
        if(!m_valid) {
 | 
						|
            m_invalidValue = value;
 | 
						|
            return *this;
 | 
						|
        }
 | 
						|
        auto elements = matcher.capturedTexts();
 | 
						|
        m_groupId = elements[1];
 | 
						|
        m_artifactId = elements[2];
 | 
						|
        m_version = elements[3];
 | 
						|
        m_classifier = elements[4];
 | 
						|
        if(!elements[5].isEmpty())
 | 
						|
        {
 | 
						|
            m_extension = elements[5];
 | 
						|
        }
 | 
						|
        return *this;
 | 
						|
    }
 | 
						|
    QString serialize() const
 | 
						|
    {
 | 
						|
        if(!m_valid) {
 | 
						|
            return m_invalidValue;
 | 
						|
        }
 | 
						|
        QString retval = m_groupId + ":" + m_artifactId + ":" + m_version;
 | 
						|
        if(!m_classifier.isEmpty())
 | 
						|
        {
 | 
						|
            retval += ":" + m_classifier;
 | 
						|
        }
 | 
						|
        if(m_extension.isExplicit())
 | 
						|
        {
 | 
						|
            retval += "@" + m_extension;
 | 
						|
        }
 | 
						|
        return retval;
 | 
						|
    }
 | 
						|
    QString getFileName() const
 | 
						|
    {
 | 
						|
        if(!m_valid) {
 | 
						|
            return QString();
 | 
						|
        }
 | 
						|
        QString filename = m_artifactId + '-' + m_version;
 | 
						|
        if(!m_classifier.isEmpty())
 | 
						|
        {
 | 
						|
            filename += "-" + m_classifier;
 | 
						|
        }
 | 
						|
        filename += "." + m_extension;
 | 
						|
        return filename;
 | 
						|
    }
 | 
						|
    QString toPath(const QString & filenameOverride = QString()) const
 | 
						|
    {
 | 
						|
        if(!m_valid) {
 | 
						|
            return QString();
 | 
						|
        }
 | 
						|
        QString filename;
 | 
						|
        if(filenameOverride.isEmpty())
 | 
						|
        {
 | 
						|
            filename = getFileName();
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            filename = filenameOverride;
 | 
						|
        }
 | 
						|
        QString path = m_groupId;
 | 
						|
        path.replace('.', '/');
 | 
						|
        path += '/' + m_artifactId + '/' + m_version + '/' + filename;
 | 
						|
        return path;
 | 
						|
    }
 | 
						|
    inline bool valid() const
 | 
						|
    {
 | 
						|
        return m_valid;
 | 
						|
    }
 | 
						|
    inline QString version() const
 | 
						|
    {
 | 
						|
        return m_version;
 | 
						|
    }
 | 
						|
    inline QString groupId() const
 | 
						|
    {
 | 
						|
        return m_groupId;
 | 
						|
    }
 | 
						|
    inline QString artifactId() const
 | 
						|
    {
 | 
						|
        return m_artifactId;
 | 
						|
    }
 | 
						|
    inline void setClassifier(const QString & classifier)
 | 
						|
    {
 | 
						|
        m_classifier = classifier;
 | 
						|
    }
 | 
						|
    inline QString classifier() const
 | 
						|
    {
 | 
						|
        return m_classifier;
 | 
						|
    }
 | 
						|
    inline QString extension() const
 | 
						|
    {
 | 
						|
        return m_extension;
 | 
						|
    }
 | 
						|
    inline QString artifactPrefix() const
 | 
						|
    {
 | 
						|
        return m_groupId + ":" + m_artifactId;
 | 
						|
    }
 | 
						|
    bool matchName(const GradleSpecifier & other) const
 | 
						|
    {
 | 
						|
        return other.artifactId() == artifactId() && other.groupId() == groupId() && other.classifier() == classifier();
 | 
						|
    }
 | 
						|
    bool operator==(const GradleSpecifier & other) const
 | 
						|
    {
 | 
						|
        if(m_groupId != other.m_groupId)
 | 
						|
            return false;
 | 
						|
        if(m_artifactId != other.m_artifactId)
 | 
						|
            return false;
 | 
						|
        if(m_version != other.m_version)
 | 
						|
            return false;
 | 
						|
        if(m_classifier != other.m_classifier)
 | 
						|
            return false;
 | 
						|
        if(m_extension != other.m_extension)
 | 
						|
            return false;
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
private:
 | 
						|
    QString m_invalidValue;
 | 
						|
    QString m_groupId;
 | 
						|
    QString m_artifactId;
 | 
						|
    QString m_version;
 | 
						|
    QString m_classifier;
 | 
						|
    DefaultVariable<QString> m_extension = DefaultVariable<QString>("jar");
 | 
						|
    bool m_valid = false;
 | 
						|
};
 |