Hi Ludo, > Sorry for the delay! No problem! I have very little time anyway. > Nice work! It’s great that libarchive doesn’t need to actually extract > the zip file to operate on it. > > Overall I think the approach of factorizing archive-timestamp-resetting > in one place and using it everywhere (‘ant-build-system’ and all) is the > right thing to do. > > However, I’m not sure whether we should introduce a new program for this > purpose. I believe ‘strip-nondeterminism’¹ (in Perl) by fellow > Reproducible Builds hackers also addresses this problem, so it may be > wiser to use it. I also think so. If there is already another program that does the job we should probably use it. > But really, since (guix build utils) already implements a significant > subset of ‘strip-nondeterminism’, it would be even better if could avoid > to shell out to a C or Perl program. > > I played a bit with this idea and, as an example, the attached file > allows you to traverse the list of entries in a zip file (it uses > ‘guile-bytestructures’). Specifically, you can get the list of file > names in a zip file by running: > > (call-with-input-file "something.zip" > (lambda (port) > (fold-entries cons '() port))) > > Resetting timestamps should be just as simple. > > How about taking this route? I also thought about taking this route. There are some problems with it though: - As Julien pointed out, the archive contents need to be uncompressed. This makes the problem much more complex and keeps us from writing a partial ZIP parser that replaces the timestamps in place. - While it would be quite elegant to just implement the parser in Scheme it would be redundant. After all we are developing a package manager so we should use it. This approach would be more attractive if there would be a Guile library for this. The best solution would be creating a proper library for handling archives when going with Scheme. - Maintaining a ZIP parser in Guix is a burden we should not take. - We need to care about a lot of details (ZIP64, probably more exotic extensions). I would be fine with writing an own parser in Scheme but I would like to point out that in every other place in Guix we are using external tools for handling archives (AFAIK). I am not quite sure which version would be the best, so I am open for other opinions on this. Maybe you could rephrase your position taking the compression problem into consideration. Tim.