summary refs log tree commit diff
path: root/Rhea
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-08-14 11:32:13 +0200
committerRory& <root@rory.gay>2026-08-14 11:32:13 +0200
commitcc7897a79a945626ea6d0c19e8a6b32cbf547d1d (patch)
treec8a92f52fae7b2ec06b78a04d73928ff727f383c /Rhea
parentWorking directories (diff)
downloadRhea-cc7897a79a945626ea6d0c19e8a6b32cbf547d1d.tar.xz
Fix some consistency issues, some documentation
Diffstat (limited to 'Rhea')
-rw-r--r--Rhea/Program.cs171
1 files changed, 133 insertions, 38 deletions
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