Patch libzip to return timestamps in the Unix epoch

We're not even using those timestamps, but doing the conversion to
local time takes a lot of time. For instance, this patch speeds up
'nix flake metadata nixpkgs` from 0.542s to 0.094s.
This commit is contained in:
Eelco Dolstra 2022-10-10 17:23:24 +02:00
parent 0286edb588
commit 1483c56582
3 changed files with 21 additions and 11 deletions

View file

@ -115,6 +115,7 @@
(libzip.overrideDerivation (old: {
# Temporary workaround for https://github.com/NixOS/nixpkgs/pull/178755
cmakeFlags = old.cmakeFlags or [] ++ [ "-DBUILD_REGRESS=0" ];
patches = [ ./libzip-unix-time.patch ];
}))
boost
lowdown-nix

19
libzip-unix-time.patch Normal file
View file

@ -0,0 +1,19 @@
commit 26e8c76ca84999fa5c0e46a9fc3aa7de80be2e9c
Author: Eelco Dolstra <edolstra@gmail.com>
Date: Mon Oct 10 17:12:47 2022 +0200
Return time_t in the Unix epoch
diff --git a/lib/zip_dirent.c b/lib/zip_dirent.c
index 7fd2f7ce..5c050b4c 100644
--- a/lib/zip_dirent.c
+++ b/lib/zip_dirent.c
@@ -1018,7 +1018,7 @@ _zip_d2u_time(zip_uint16_t dtime, zip_uint16_t ddate) {
tm.tm_min = (dtime >> 5) & 63;
tm.tm_sec = (dtime << 1) & 62;
- return mktime(&tm);
+ return timegm(&tm);
}

View file

@ -35,7 +35,7 @@ struct ZipInputAccessor : InputAccessor
: zipPath(_zipPath)
{
int error;
zipFile = zip_open(zipPath.c_str(), 0, &error);
zipFile = zip_open(zipPath.c_str(), ZIP_RDONLY, &error);
if (!zipFile) {
char errorMsg[1024];
zip_error_to_str(errorMsg, sizeof errorMsg, error, errno);
@ -68,16 +68,6 @@ struct ZipInputAccessor : InputAccessor
if (!slash) continue;
members.emplace(slash, sb);
}
#if 0
/* Sigh, libzip returns a local time, so convert to Unix
time. */
if (lastModified) {
struct tm tm;
localtime_r(&lastModified, &tm);
lastModified = timegm(&tm);
}
#endif
}
~ZipInputAccessor()