#!/usr/bin/env /Library/Frameworks/Mono.framework/Commands/csharp // arguments are: using System.IO; using System.Security.Cryptography; using System.Text; using System.Xml; var args = Environment.GetCommandLineArgs (); var expectedArgumentCount = 4; if (args.Length != expectedArgumentCount + 2 /* 2 default arguments (executable + script) + 'expectedArgumentCount' arguments we're interested in */) { // first arg is "/Library/Frameworks/Mono.framework/Versions/4.8.0/lib/mono/4.5/csharp.exe" // second arg the script itself // then comes the ones we care about Console.WriteLine ($"Need {expectedArgumentCount} arguments, got {args.Length - 2}"); Environment.Exit (1); return; } var platform = args [2]; var outputPath = args [3]; var inputDirectory = args [4]; var version = args [5]; string upgradeGuid; switch (platform) { case "iOS": upgradeGuid = "e17c20f4-e9a6-445a-915a-dac336097012"; break; case "tvOS": upgradeGuid = "951a188f-e59a-4db1-bc42-b3ca47edb4c6"; break; case "watchOS": upgradeGuid = "b365f5c9-6bbf-4c66-957a-8868576b4ddc"; break; case "macOS": upgradeGuid = "b64a436b-db46-4467-953c-bdcfc592d4da"; break; default: Console.Error.WriteLine ($"Need to generate an upgradeGuid for {platform}"); break; } List components = new List (); Func GetHash = (string inputString) => { using (var algorithm = SHA256.Create ()) return algorithm.ComputeHash (Encoding.UTF8.GetBytes (inputString)); }; Func GetHashString = (string inputString) => { var sb = new StringBuilder ("S", 65); foreach (byte b in GetHash (inputString)) sb.Append (b.ToString ("X2")); Console.WriteLine ($"{inputString} => {sb.ToString ()}"); return sb.ToString (); }; Func GetId = (string path) => { var top_dir = inputDirectory; if (string.IsNullOrEmpty (path)) return path; if (path.Length > top_dir.Length + 1) { path = path.Substring (top_dir.Length + 1); } return GetHashString (path); }; Action process = new Action ((TextWriter writer, string indent, string directory) => { var entries = Directory.GetFileSystemEntries (directory); foreach (var entry in entries) { var name = Path.GetFileName (entry); var id = GetId (entry); if (Directory.Exists (entry)) { writer.WriteLine ($"{indent} "); process (writer, indent + " ", entry); writer.WriteLine ($"{indent} "); } else { components.Add (id); writer.WriteLine ($"{indent} "); writer.WriteLine ($"{indent} "); writer.WriteLine ($"{indent} "); } } }); using (TextWriter writer = new StreamWriter (outputPath)) { writer.WriteLine ($""); writer.WriteLine ($""); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); process (writer, " ", inputDirectory); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); foreach (var component in components) writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($" "); writer.WriteLine ($""); } Environment.Exit (0);