| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| |
|
| | using Newtonsoft.Json; |
| | using Newtonsoft.Json.Linq; |
| |
|
| | if (args.Length < 3 || args.Length > 4) |
| | { |
| | Console.WriteLine("Arguments: <clone-directory> <target-directory> <excluded-services> [<new/updated file list>]"); |
| | return 1; |
| | } |
| |
|
| | var cloneDirectory = args[0]; |
| | var targetDirectory = args[1]; |
| | var excludedServicesFile = args[2]; |
| | var newOrUpdatedFile = args.Length == 3 ? null : args[3]; |
| |
|
| | var excludedServices = JsonConvert.DeserializeObject<List<string>>(File.ReadAllText(excludedServicesFile)); |
| | var cloneDirectoryFiles = Directory.GetFiles(cloneDirectory, "*.json").Select(Path.GetFileName).OrderBy(x => x, StringComparer.Ordinal); |
| | var targetDirectoryFiles = Directory.GetFiles(targetDirectory, "*.json").Select(Path.GetFileName).OrderBy(x => x, StringComparer.Ordinal); |
| | var newOrUpdated = new List<string>(); |
| |
|
| | |
| | |
| | |
| | foreach (string relativeClonedFile in cloneDirectoryFiles) |
| | { |
| | |
| | if (relativeClonedFile == "index.json") |
| | { |
| | continue; |
| | } |
| | string service = Path.GetFileNameWithoutExtension(relativeClonedFile); |
| |
|
| | string clonedFile = Path.Combine(cloneDirectory, relativeClonedFile); |
| | string targetFile = Path.Combine(targetDirectory, relativeClonedFile); |
| |
|
| | |
| | if (excludedServices.Contains(service)) |
| | { |
| | Console.WriteLine(service + ": excluded from generation."); |
| | continue; |
| | } |
| |
|
| | |
| | if (!targetDirectoryFiles.Contains(relativeClonedFile)) |
| | { |
| | Console.WriteLine(service + ": New."); |
| | CopyFile(overwrite: false); |
| | continue; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | JObject newDiscovery = JObject.Parse(File.ReadAllText(clonedFile)); |
| | JObject oldDiscovery = JObject.Parse(File.ReadAllText(targetFile)); |
| | if (JsonEqual(oldDiscovery, newDiscovery)) |
| | { |
| | Console.WriteLine(service + ": Unchanged."); |
| | continue; |
| | } |
| |
|
| | newDiscovery.Remove("revision"); |
| | newDiscovery.Remove("etag"); |
| | oldDiscovery.Remove("revision"); |
| | oldDiscovery.Remove("etag"); |
| | if (JsonEqual(oldDiscovery, newDiscovery)) |
| | { |
| | Console.WriteLine(service + ": Unchanged except revision/etag."); |
| | continue; |
| | } |
| | |
| | Console.WriteLine(service + ": Updated."); |
| | CopyFile(overwrite: true); |
| |
|
| | void CopyFile(bool overwrite) |
| | { |
| | File.Copy(clonedFile, targetFile, overwrite); |
| | if (File.Exists($"{clonedFile}.original")) |
| | { |
| | File.Copy($"{clonedFile}.original", $"{targetFile}.original", overwrite); |
| | } |
| | newOrUpdated.Add(targetFile); |
| | } |
| | } |
| |
|
| | |
| | |
| | foreach (string obsoleteFile in targetDirectoryFiles.Except(cloneDirectoryFiles)) |
| | { |
| | Console.WriteLine(Path.GetFileNameWithoutExtension(obsoleteFile) + " is obsolete; deleting"); |
| | File.Delete(Path.Combine(targetDirectory, obsoleteFile)); |
| | } |
| |
|
| | |
| | if (newOrUpdatedFile is not null) |
| | { |
| | File.WriteAllLines(newOrUpdatedFile, newOrUpdated.Select(x => x.Replace('\\', '/'))); |
| | } |
| |
|
| | return 0; |
| |
|
| | |
| | |
| | static bool JsonEqual(JObject x, JObject y) => x.ToString() == y.ToString(); |
| |
|