[RFC] Better font filetype and metadata file detection for xfs initscript

Mike A. Harris mharris at redhat.com
Thu Oct 9 03:17:49 UTC 2003


The attached diff attempts to do the following improvements 
to the xfs initscript for performance and correctness:

The individual fixes are:

- Consider all .ttf, .ttc, .otf, .otc file extensions of any 
  combination of upper and/or lowercase in a font directory to be 
  a truetype or opentype font which ttmkfdir should handle.  
  Previously, only .ttf and .ttc fonts were handled.  This is a
  correctness fix.

- When determining wether or not mkfontdir and ttmkfdir need to 
  be called, ignore any fonts.cache files that might be present, 
  as they're metadata files, not fonts.  This is both a 
  correctness and performance fix, as any non-font metadata files 
  found that aren't explicitly ignored, but are newer than 
  fonts.dir will unnecessarily trigger regeneration of fonts.dir

- When determining wether a directory contains non-truetype 
  fonts, ignore all ttf/ttc/otf/otc font types, not just ttf.

- If any fonts.dir files were recreated, it now calls fc-cache 
  afterward if fc-cache exists, in order to update all fontconfig 
  fonts.cache-* files

I've studied the regular expressions carefully and think that
they cleanly implement the above, however there could be a glitch
in there, so I'd like to get other people to review this change
before officially committing it to the next build of XFree86, as
a bad regex could result in rather serious font subsystem
breakage, so the more eyes who review this the better.

If you review the change and think it to be correct, please
respond with an "ACK" email to fedora-devel-list, along with 
any comments and/or suggestions for futher improvements.


On a separate note from the above, there is one possible flaw 
that was in the original initscript as well as my above proposal, 
however I want this issue treated/considered separately from the 
above, so please comment on each issue separately.  The following 
line:

if [ "$(ls |grep -iv '\(fonts\.\(scale\|alias\|cache.*\)$\|.+\(\.[ot]t[cf]\|dir\)$\)')" != "" ]; then

In both the original initscript, and this updated one, the test 
doesn't take into account wether or not the directory may contain 
subdirectories for whatever reason.  If the dir does contain 
subdirs, the subdir name will pass the grep test, and cause 
mkfontdir to be executed even if no font files are updated.

I'm thinking of changing this ls|grep test to be something 
similar to the following, which explicitly tests for files only 
and ignores dirs:

if [ "$(find . -type f -maxdepth=0 -not -regex '.*fonts\.\(scale\|alias\|cache.*\)$' -and -not -iregex '.+\(\.[ot]t[cf]\|dir\)$' != "" ]; then

It's ugly, but I believe it may do what we're looking for nicely.  
Comments appreciated.





-- 
Mike A. Harris     ftp://people.redhat.com/mharris
OS Systems Engineer - XFree86 maintainer - Red Hat
-------------- next part --------------
--- xfs.init.old	2003-09-18 19:15:34.000000000 -0400
+++ xfs.init	2003-10-08 23:08:35.000000000 -0400
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 #
 # xfs:       Starts the X Font Server
 #
@@ -29,28 +29,32 @@
       if [ -d "$d" ]; then
          cd $d
          # Check if we need to rerun mkfontdir
-         NEEDED=no
+         REGEN_FONTS_DIR=no
          if ! [ -e fonts.dir ]; then
-            NEEDED=yes
-         elif [ "$(find . -type f -cnewer fonts.dir 2>/dev/null)" != "" ];then
-            NEEDED=yes
+            REGEN_FONTS_DIR=yes
+         elif [ "$(find . -type f -cnewer fonts.dir -not -name "fonts.cache*" 2>/dev/null)" != "" ];then
+            REGEN_FONTS_DIR=yes
          fi
-         if [ "$NEEDED" = "yes" ]; then
+         if [ "$REGEN_FONTS_DIR" = "yes" ]; then
             rm -f fonts.dir &>/dev/null
-            if ls | grep -i "\.tt[cf]$" &>/dev/null; then
-               # TrueType fonts found...
+            if ls | grep -i "\.[ot]t[cf]$" &>/dev/null; then
+               # TrueType or Opentype fonts found...
                ttmkfdir -d . -o fonts.scale
                mkfontdir . &>/dev/null
                [ -e fonts.dir ] && chmod 644 fonts.scale fonts.dir
             fi
-            if [ "$(ls |egrep -iv '\.tt[cf]$|^fonts\.|^encodings\.')" != "" ]; then
-               # This directory contains fonts that are not TrueType...
+            if [ "$(ls |grep -iv '\(fonts\.\(scale\|alias\|cache.*\)$\|.+\(\.[ot]t[cf]\|dir\)$\)')" != "" ]; then
+               # This directory contains fonts that are not TrueType or Opentype...
                mkfontdir . &>/dev/null
                [ -e fonts.dir ] && chmod 644 fonts.dir
             fi
          fi
       fi
    done
+   # Recreating fonts.dir files above may result in stale fonts.cache-1
+   # files since the directory mtimes change, so we run fc-cache to
+   # update any necessary fonts.cache files.
+   [ "$REGEN_FONTS_DIR" = "yes" -a -x /usr/bin/fc-cache ] && /usr/bin/fc-cache
    popd &> /dev/null
 }
 


More information about the fedora-devel-list mailing list