Beispiel #1
0
        /// <summary>
        ///  Old school parser for those file not yet sourced directly from the cache.
        /// Expects pattern {PackageId}.{Version}.{Extension}
        /// Issue with extension parser if pre-release tag is present where two part extendsions are incorrectly split.
        /// e.g. MyApp.1.0.0-beta.tar.gz  => .tar forms part of pre-release tag and not extension
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="packageId"></param>
        /// <param name="version"></param>
        /// <param name="extension"></param>
        /// <returns></returns>
        static bool TryParseUnsafeFileName(string fileName, out string packageId, out IVersion version, out string extension)
        {
            packageId = null;
            version   = null;
            extension = null;
            const string packageIdPattern       = @"(?<packageId>(\w+([_.-]\w+)*?))";
            const string semanticVersionPattern = @"(?<semanticVersion>(\d+(\.\d+){0,3}"      // Major Minor Patch
                                                  + @"(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?)"   // Pre-release identifiers
                                                  + @"(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?)"; // Build Metadata
            const string extensionPattern = @"(?<extension>(\.([a-zA-Z0-9])+)+)";             //Extension (wont catch two part extensions like .tar.gz if there is a pre-release tag)

            var match = Regex.Match(fileName, $@"^{packageIdPattern}\.{semanticVersionPattern}{extensionPattern}$", RegexOptions.IgnoreCase);

            var packageIdMatch = match.Groups["packageId"];
            var versionMatch   = match.Groups["semanticVersion"];
            var extensionMatch = match.Groups["extension"];

            if (!packageIdMatch.Success || !versionMatch.Success || !extensionMatch.Success)
            {
                return(false);
            }

            if (!VersionFactory.TryCreateSemanticVersion(versionMatch.Value, out version, true))
            {
                return(false);
            }

            packageId = packageIdMatch.Value;
            extension = extensionMatch.Value;

            return(true);
        }
Beispiel #2
0
        static bool FileNameMatchesPattern(string packageId, IVersion version, string path)
        {
            var name = Path.GetFileNameWithoutExtension(path);

            // When matching by pattern, we will always have a version token. Packages without versions would be matched early on by the version-less path resolver
            // when doing an exact match.
            return(name.Length > packageId.Length &&
                   (VersionFactory.TryCreateSemanticVersion(name.Substring(packageId.Length + 1))?.Equals(version) ?? false));
        }
Beispiel #3
0
        static bool IsValidV3Json(JObject json)
        {
            // Use SemVer instead of NuGetVersion, the service index should always be
            // in strict SemVer format
            JToken versionToken;

            if (json.TryGetValue("version", out versionToken) &&
                versionToken.Type == JTokenType.String)
            {
                if (VersionFactory.TryCreateSemanticVersion((string)versionToken, out var version) && version.Major == 3)
                {
                    return(true);
                }
            }
            return(false);
        }