using System.Diagnostics; using System.Reflection; using System.Text; using ArcaneLibs; using ArcaneLibs.Extensions; using Rhea; using Rhea.Nar; // new NarWriter().GetHeader().ToArray().HexDump(64); foreach (var fieldInfo in typeof(NarConsts).GetFields()) { // Console.WriteLine(fieldInfo); var rawBytes = (byte[])fieldInfo.GetValue(null)!; var sizeBytes = rawBytes[..8]; var dataBytes = rawBytes[8..]; Console.WriteLine( $$""" public static readonly byte[] {{fieldInfo.Name}} = new byte[] { {{string.Join(", ", sizeBytes.Select(x => x.ToString()))}}, // {{dataBytes.Trim((byte)0).ToArray().Length}} bytes {{string.Join(", ", dataBytes.Select(x => x.ToString()))}}, // "{{Encoding.UTF8.GetString(dataBytes)}}"u8 + padding {{string.Join(", ", rawBytes.Select(x => x.ToString()))}} }; """ ); } int maxVerifySize = 8_192_000; // return; // while (true) // foreach (var srcPath in (string[])[ // "/etc/nix/nix.conf", // FileUtils.GetBinDir() + "/Rhea.runtimeconfig.json", // "/etc/nix", // ".", // "/nix/store/06d2xkrl3h1pbyg3m1whz1mvhafqgsqq-source", // "/nix/store/0l93s9x3z2s9p4r58jls0xiyk64hwkxz-source", // "/nix/store/2g4sa9xcir93nckzib9iq1ky6ly6azgw-7j1q60m17gf95k3s0gk2qvjqygnp1q36-source" // ]) // foreach (var srcPath in (string[])["/nix/store/7j1q60m17gf95k3s0gk2qvjqygnp1q36-source"]) Parallel.ForEach(FileUtils.EnumerateDirectory("/nix/store") // .Where(x => x is not DirectoryInfo) .Select(x => x.FullName), new() { MaxDegreeOfParallelism = 12 }, srcPath => // foreach (var srcPath in FileUtils.EnumerateDirectory("/nix/store").Select(x=>x.FullName)) { var sw = Stopwatch.StartNew(); TimeSpan oldTime, newTime; var log = ""; log += ($"\n - {srcPath}:"); bool tooLarge = false; // Console.WriteLine($"Original {srcPath}:"); var origBuf = new List(); var nixProcess = Process.Start(new ProcessStartInfo("nix", ["nar", "dump-path", srcPath]) { RedirectStandardOutput = true }); int b; byte[] oldBuf = new byte[16384]; while ((b = nixProcess.StandardOutput.BaseStream.Read(oldBuf)) != 0) { if (!tooLarge) { if (origBuf.Count < maxVerifySize) origBuf.AddRange(oldBuf[..b]); else tooLarge = true; } // Console.WriteLine(b + " @ " + sw.Elapsed + " -> " + Util.BytesToString(origBuf.Count)); // Thread.Sleep(1); } // origBuf.ToArray().HexDump(64); oldTime = sw.GetElapsedAndRestart(); // Console.WriteLine($"\nNew {srcPath}:"); List tbuf = []; // List buf = []; foreach (var chunk in new NarWriter().GetNarStreamContents(srcPath)) { // Console.WriteLine($"ret Chunk({chunk.Length})"); if (!tooLarge) { if (tbuf.Count < maxVerifySize) tbuf.AddRange(chunk); else tooLarge = true; } // buf.AddRange(chunk); // while (buf.Count > 64) // { // byte[] data = buf[..64].ToArray(); // buf = buf[64..]; // data.HexDump(64); // } } // buf.ToArray().HexDump(64); newTime = sw.GetElapsedAndRestart(); log += ($"\nOld time: {oldTime}, new time: {newTime}"); if (!tooLarge) { log += ("\nIs equal: " + origBuf.SequenceEqual(tbuf)); if (!origBuf.SequenceEqual(tbuf)) { // File.WriteAllBytes("a", origBuf.ToArray().AsHexString().AsBytes().ToArray()); // File.WriteAllBytes("b", tbuf.ToArray().AsHexString().AsBytes().ToArray()); var origStdout = Console.Out; using (var fs = File.OpenWrite("a")) { using var fsw = new StreamWriter(fs); Console.SetOut(fsw); origBuf.HexDump(width: 16, colorize: false); Console.SetOut(origStdout); } using (var fs = File.OpenWrite("b")) { using var fsw = new StreamWriter(fs); Console.SetOut(fsw); tbuf.HexDump(width: 16, colorize: false); Console.SetOut(origStdout); } Console.WriteLine(log); Environment.Exit(0); } } else log += "\nToo large to check consistency"; Console.WriteLine(log); } ); return; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi builder.Services.AddOpenApi(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.MapOpenApi(); } app.UseAuthorization(); app.MapControllers(); // app.Run();