/// <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); }
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)); }
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); }