| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| |
|
| | using System.Net; |
| | using System.Xml.Linq; |
| |
|
| | if (args.Length != 1) |
| | { |
| | Console.WriteLine("Argument: <parent-directory>"); |
| | Console.WriteLine("(All project files below this directory, recursively, will be checked."); |
| | return 1; |
| | } |
| |
|
| | bool errors = false; |
| | var client = new HttpClient(); |
| |
|
| | |
| | var packages = Directory.GetFiles(args[0], "*.csproj", SearchOption.AllDirectories).Select(Fetch).ToList(); |
| |
|
| | |
| | foreach (var package in packages) |
| | { |
| | var response = await package.ResponseTask; |
| | switch (response.StatusCode) |
| | { |
| | case HttpStatusCode.OK: |
| | |
| | break; |
| | case HttpStatusCode.NotFound: |
| | |
| | Console.WriteLine(package.ProjectFile.Replace("\\", "/")); |
| | break; |
| | default: |
| | |
| | Console.Error.WriteLine($"Package {package.Id} check failed with status code {response.StatusCode}"); |
| | errors = true; |
| | break; |
| | } |
| | } |
| |
|
| | return errors ? 1 : 0; |
| |
|
| | Package Fetch(string projectFile) |
| | { |
| | var doc = XDocument.Load(projectFile); |
| | string id = Path.GetFileNameWithoutExtension(projectFile); |
| | var version = doc.Root.Element("PropertyGroup").Element("Version").Value; |
| |
|
| | |
| | var bits = version.Split('.'); |
| | if (bits.Length == 4 && bits[3] == "0") |
| | { |
| | version = string.Join(".", bits.Take(3)); |
| | } |
| |
|
| | var url = new Uri($"https://globalcdn.nuget.org/packages/{id.ToLowerInvariant()}.{version}.nupkg"); |
| | var request = new HttpRequestMessage |
| | { |
| | RequestUri = url, |
| | Method = HttpMethod.Head |
| | }; |
| | var responseTask = client.SendAsync(request); |
| | return new Package(projectFile, id, version, responseTask); |
| | } |
| |
|
| | record Package (string ProjectFile, string Id, string Version, Task<HttpResponseMessage> ResponseTask); |