diff --git a/Rhea/Program.cs b/Rhea/Program.cs
index 5d3f242..a50de4d 100644
--- a/Rhea/Program.cs
+++ b/Rhea/Program.cs
@@ -1,10 +1,142 @@
using System.Diagnostics;
+using System.Reflection;
+using System.Text;
using ArcaneLibs;
using ArcaneLibs.Extensions;
-using ArcaneLibs.Extensions.Streams;
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<byte>();
+ 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<byte> tbuf = [];
+ // List<byte> 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.
@@ -27,41 +159,4 @@ app.UseAuthorization();
app.MapControllers();
-new NarWriter().GetHeader().ToArray().HexDump(64);
-
-
-foreach (var srcPath in (string[])["/etc/nix/nix.conf", FileUtils.GetBinDir() + "/Rhea.runtimeconfig.json", "/etc/nix"])
-{
- Console.WriteLine($"Original {srcPath}:");
-
- var pe = new ProcessStartInfo("nix", ["nar", "dump-path", srcPath])
- {
- RedirectStandardOutput = true
- };
- var origBuf = new List<byte>();
- var pr = Process.Start(pe);
- int b;
- while ((b = pr.StandardOutput.BaseStream.ReadByte()) != -1) origBuf.Add((byte)b);
- origBuf.ToArray().HexDump(64);
-
- Console.WriteLine($"\nNew {srcPath}:");
- List<byte> tbuf = [];
- List<byte> buf = [];
- foreach (var chunk in new NarWriter().GetNarStreamContents(srcPath))
- {
- tbuf.AddRange(chunk);
- buf.AddRange(chunk);
- while (buf.Count > 64)
- {
- byte[] data = buf[..64].ToArray();
- buf = buf[64..];
- data.HexDump(64);
- }
- }
-
- buf.ToArray().HexDump(64);
-
- Console.WriteLine("Is equal: " + origBuf.SequenceEqual(tbuf));
-}
-
// app.Run();
\ No newline at end of file
|