[PATCH] Please make the output of cache files reproducible

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Whilst working on the Reproducible Builds[0] effort, we noticed that
fontconfig — in its usual usage — generates un-reproducible cache files.

This is due to it using the timestamps of each directory in the
"checksum" member of the _FcCache struct. This is so that it can identify
which cache files remain valid and/or require regeneration.

Whilst we could zero-out the checksum, we would actually need it still
function correctly. Therefore, I've attached a patch that adds an option
to list all the configured font directories; that way, distributions,
etc. can modify the mtimes of these files in advance

For example, I'm about to propose the following to Debian's fontconfig
"postinst" script:

  if [ -n "$SOURCE_DATE_EPOCH" ]; then
    fc-cache -s --list-dirs | \
      xargs -I{} find {} -type d -follow -newermt "@$SOURCE_DATE_EPOCH" -print0 2>/dev/null | \
      xargs -0r touch --date="@$SOURCE_DATE_EPOCH"
  fi

… and then we make the usual calls to, for example:

  $ fc-cache -s -f -v


(This work was sponsored by Tails[1].)


 [0] https://reproducible-builds.org/
 [1] https://tails.boum.org/


Regards,

-- 
      ,''`.
     : :'  :     Chris Lamb
     `. `'`      lamby@xxxxxxxxxx / chris-lamb.co.uk
       `-
diff -urNad fontconfig-2.11.0.orig/fc-cache/fc-cache.1 fontconfig-2.11.0/fc-cache/fc-cache.1
--- fontconfig-2.11.0.orig/fc-cache/fc-cache.1	2017-05-26 16:30:36.585878534 +0100
+++ fontconfig-2.11.0/fc-cache/fc-cache.1	2017-05-26 18:12:58.022734653 +0100
@@ -4,7 +4,7 @@
 fc-cache \- build font information cache files
 .SH SYNOPSIS
 .sp
-\fBfc-cache\fR [ \fB-frsvVh\fR ]  [ \fB--force\fR ]  [ \fB--really-force\fR ]  [ \fB--system-only\fR ]  [ \fB--verbose\fR ]  [ \fB--version\fR ]  [ \fB--help\fR ]  [ \fB\fIdir\fB\fR\fI...\fR ] 
+\fBfc-cache\fR [ \fB-frsvVh\fR ]  [ \fB--force\fR ]  [ \fB--really-force\fR ]  [ \fB--system-only\fR ]  [ \fB--list-dirs\fR ]  [ \fB--verbose\fR ]  [ \fB--version\fR ]  [ \fB--help\fR ]  [ \fB\fIdir\fB\fR\fI...\fR ] 
 .SH "DESCRIPTION"
 .PP
 \fBfc-cache\fR scans the font directories on
@@ -39,6 +39,9 @@
 Only scan system-wide directories, omitting the places
 located in the user's home directory.
 .TP
+\fB-l\fR
+Only list directories, don't regenerate anything.
+.TP
 \fB-v\fR
 Display status information while busy.
 .TP
diff -urNad fontconfig-2.11.0.orig/fc-cache/fc-cache.c fontconfig-2.11.0/fc-cache/fc-cache.c
--- fontconfig-2.11.0.orig/fc-cache/fc-cache.c	2017-05-26 16:30:36.585878534 +0100
+++ fontconfig-2.11.0/fc-cache/fc-cache.c	2017-05-26 18:13:33.810917986 +0100
@@ -69,6 +69,7 @@
     {"really-force", 0, 0, 'r'},
     {"sysroot", 0, 0, 'y'},
     {"system-only", 0, 0, 's'},
+    {"list-dirs", 0, 0, 'l'},
     {"version", 0, 0, 'V'},
     {"verbose", 0, 0, 'v'},
     {"help", 0, 0, 'h'},
@@ -86,10 +87,10 @@
 {
     FILE *file = error ? stderr : stdout;
 #if HAVE_GETOPT_LONG
-    fprintf (file, "usage: %s [-frsvVh] [-y SYSROOT] [--force|--really-force] [--sysroot=SYSROOT] [--system-only] [--verbose] [--version] [--help] [dirs]\n",
+    fprintf (file, "usage: %s [-frsvVh] [-y SYSROOT] [--force|--really-force] [--sysroot=SYSROOT] [--system-only] [--list-dirs] [--verbose] [--version] [--help] [dirs]\n",
 	     program);
 #else
-    fprintf (file, "usage: %s [-frsvVh] [-y SYSROOT] [dirs]\n",
+    fprintf (file, "usage: %s [-frslvVh] [-y SYSROOT] [dirs]\n",
 	     program);
 #endif
     fprintf (file, "Build font information caches in [dirs]\n"
@@ -100,6 +101,7 @@
     fprintf (file, "  -r, --really-force       erase all existing caches, then rescan\n");
     fprintf (file, "  -s, --system-only        scan system-wide directories only\n");
     fprintf (file, "  -y, --sysroot=SYSROOT    prepend SYSROOT to all paths for scanning\n");
+    fprintf (file, "  -l, --list-dirs          list directories only\n");
     fprintf (file, "  -v, --verbose            display status information while busy\n");
     fprintf (file, "  -V, --version            display font config version and exit\n");
     fprintf (file, "  -h, --help               display this help and exit\n");
@@ -108,6 +110,7 @@
     fprintf (file, "  -r,   (really force) erase all existing caches, then rescan\n");
     fprintf (file, "  -s         (system)  scan system-wide directories only\n");
     fprintf (file, "  -y SYSROOT (sysroot) prepend SYSROOT to all paths for scanning\n");
+    fprintf (file, "  -l         (list-dirs) list directories only\n");
     fprintf (file, "  -v         (verbose) display status information while busy\n");
     fprintf (file, "  -V         (version) display font config version and exit\n");
     fprintf (file, "  -h         (help)    display this help and exit\n");
@@ -277,18 +280,20 @@
     FcBool	force = FcFalse;
     FcBool	really_force = FcFalse;
     FcBool	systemOnly = FcFalse;
+    FcBool	listDirs = FcFalse;
     FcConfig	*config;
     FcChar8     *sysroot = NULL;
+    FcChar8     *dir;
     int		i;
     int		changed;
-    int		ret;
+    int		ret = 0;
 #if HAVE_GETOPT_LONG || HAVE_GETOPT
     int		c;
 
 #if HAVE_GETOPT_LONG
-    while ((c = getopt_long (argc, argv, "frsy:Vvh", longopts, NULL)) != -1)
+    while ((c = getopt_long (argc, argv, "frsly:Vvh", longopts, NULL)) != -1)
 #else
-    while ((c = getopt (argc, argv, "frsy:Vvh")) != -1)
+    while ((c = getopt (argc, argv, "frsly:Vvh")) != -1)
 #endif
     {
 	switch (c) {
@@ -304,6 +309,9 @@
 	case 'y':
 	    sysroot = FcStrCopy ((const FcChar8 *)optarg);
 	    break;
+	case 'l':
+	    listDirs = FcTrue;
+	    break;
 	case 'V':
 	    fprintf (stderr, "fontconfig version %d.%d.%d\n", 
 		     FC_MAJOR, FC_MINOR, FC_REVISION);
@@ -365,6 +373,13 @@
     else
 	list = FcConfigGetConfigDirs (config);
 
+    if (listDirs)
+    {
+	while ((dir = FcStrListNext (list)))
+	    printf ("%s\n", dir);
+	goto done;
+    }
+
     if ((processed_dirs = FcStrSetCreate()) == NULL) {
 	fprintf(stderr, "Cannot malloc\n");
 	return 1;
@@ -388,6 +403,7 @@
 
     cleanCacheDirectories (config, verbose);
 
+done:
     FcConfigDestroy (config);
     FcFini ();
     /* 
diff -urNad fontconfig-2.11.0.orig/fc-cache/fc-cache.sgml fontconfig-2.11.0/fc-cache/fc-cache.sgml
--- fontconfig-2.11.0.orig/fc-cache/fc-cache.sgml	2017-05-26 16:30:36.585878534 +0100
+++ fontconfig-2.11.0/fc-cache/fc-cache.sgml	2017-05-26 18:10:26.789976370 +0100
@@ -67,6 +67,7 @@
       <arg><option>--force</option></arg>
       <arg><option>--really-force</option></arg>
       <arg><option>--system-only</option></arg>
+      <arg><option>--list-dirs</option></arg>
       <arg><option>--verbose</option></arg>
       <arg><option>--version</option></arg>
       <arg><option>--help</option></arg>
@@ -129,6 +130,14 @@
         </listitem>
       </varlistentry>
       <varlistentry>
+        <term><option>-l</option>
+          <option>--list-dirs</option>
+        </term>
+        <listitem>
+	  <para>Only list directories, don't regenerate anything.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
         <term><option>-v</option>
           <option>--verbose</option>
         </term>
_______________________________________________
Fontconfig mailing list
Fontconfig@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/fontconfig

[Index of Archives]     [Fedora Fonts]     [Fedora Users]     [Fedora Cloud]     [Kernel]     [Fedora Packaging]     [Fedora Desktop]     [PAM]     [Gimp Graphics Editor]     [Yosemite News]

  Powered by Linux