diff options
| author | eroux <elie.roux@telecom-bretagne.eu> | 2010-03-01 11:21:17 +0100 | 
|---|---|---|
| committer | eroux <elie.roux@telecom-bretagne.eu> | 2010-03-01 11:21:17 +0100 | 
| commit | bb568ecaa472c40c9276068c99dbcbb10d84c281 (patch) | |
| tree | 7c4898e3199ef77766209275082f935e49e8b6c0 | |
| parent | ddc33bbbb9240422c28bb2ed917ed4f397d0521a (diff) | |
| download | luaotfload-bb568ecaa472c40c9276068c99dbcbb10d84c281.tar.gz | |
Changing the checksum system to a timestamp system
 - the status is now externalized in another file name (in the same
   directory), so that it's not loaded when just asking for a font
 - the status is now filename->last-modification-timestamp so that we
   don't have to checksum the files (much faster)
| -rw-r--r-- | mkluatexfontdb.lua | 18 | ||||
| -rw-r--r-- | otfl-font-nms.lua | 36 | 
2 files changed, 35 insertions, 19 deletions
| diff --git a/mkluatexfontdb.lua b/mkluatexfontdb.lua index f05f668..7481252 100644 --- a/mkluatexfontdb.lua +++ b/mkluatexfontdb.lua @@ -146,6 +146,13 @@ end  process_cmdline()  do_run_fc_cache(run_fc_cache) +-- the status table is containing correspondances between absolute path and last modification +-- timestamp, it's uses to save time during update, by not reparsing unchanged fonts. +local status = {} +local status_file = mkluatexfontdb.directory .. '/' .. "otfl-names-status.lua" +if lfs.isfile(status_file) then +    status = dofile(status_file) +end  local function generate(force)      log("generating font names database.") @@ -166,12 +173,17 @@ local function generate(force)      end      fh:close()      local fontnames -    fontnames = dofile(kpse.find_file(names.basename)) -    fontnames = names.update   (fontnames, force) -    log("%s fonts in %s families saved in the database", +    if kpse.find_file(names.basename) then +        fontnames = dofile(kpse.find_file(names.basename)) +    else +        fontnames = {} +    end +    fontnames = names.update(fontnames, force, status) +    log("%s fonts in %s families in the database",          #fontnames.mappings, #table.keys(fontnames.families))      io.savedata(savepath, table.serialize(fontnames, true))      log("saved font names database in %s\n", savepath) +    io.savedata(status_file, table.serialize(status, true))  end  generate(force_reload) diff --git a/otfl-font-nms.lua b/otfl-font-nms.lua index 65d7f59..e9b0d4e 100644 --- a/otfl-font-nms.lua +++ b/otfl-font-nms.lua @@ -92,23 +92,24 @@ function fontloader.fullinfo(...)      return t  end -local function load_font(filename, fontnames, texmf) +local function load_font(filename, fontnames, texmf, status)      local database  = fontnames      local mappings  = database.mappings  or { }      local families  = database.families  or { }      local checksums = database.checksums or { }      if filename then -        if trace_loading then -            logs.report("loading font: %s", filename) -        end -        local checksum = file.checksum(filename) -        if checksums[checksum] and checksums[checksum] == filename then +        local db_lastmodif = status[filename] +        local true_lastmodif = lfs.attributes(filename, "modification") +        if db_lastmodif and db_lastmodif == true_lastmodif then              if trace_loading then                  logs.report("font already indexed: %s", filename)              end              return fontnames          end -        checksums[checksum] = filename +        if trace_loading then +            logs.report("loading font: %s", filename) +        end +        status[filename] = true_lastmodif          local info = fontloader.info(filename)          if info then              if type(info) == "table" and #info > 1 then @@ -197,7 +198,7 @@ fonts.path_normalize = path_normalize  --       in this script)  -- - texmf is a boolean saying if we are scanning a texmf directory (always  --       true in this script) -local function scan_dir(dirname, fontnames, recursive, texmf) +local function scan_dir(dirname, fontnames, recursive, texmf, status)      local list, found = { }, { }      local nbfound = 0      for _,ext in ipairs { "otf", "ttf", "ttc", "dfont" } do @@ -225,14 +226,14 @@ local function scan_dir(dirname, fontnames, recursive, texmf)      end      for _,fnt in ipairs(list) do          fnt = path_normalize(fnt) -        fontnames = load_font(fnt, fontnames, texmf) +        fontnames = load_font(fnt, fontnames, texmf, status)      end      return fontnames  end  -- The function that scans all fonts in the texmf tree, through kpathsea  -- variables OPENTYPEFONTS and TTFONTS of texmf.cnf -local function scan_texmf_tree(fontnames) +local function scan_texmf_tree(fontnames, status)      if trace_progress then          if expandpath("$OSFONTDIR"):is_empty() then              logs.report("scanning TEXMF fonts:") @@ -252,7 +253,7 @@ local function scan_texmf_tree(fontnames)              if not explored_dirs[d] then                  count = count + 1                  progress(count, #fontdirs) -                fontnames = scan_dir(d, fontnames, false, true) +                fontnames = scan_dir(d, fontnames, false, true, status)                  explored_dirs[d] = true              end          end @@ -278,7 +279,7 @@ end  -- only if OSFONTDIR is empty (which is the case under most Unix by default).  -- If OSFONTDIR is non-empty, this means that the system fonts it contains have  -- already been scanned, and thus we don't scan them again. -local function scan_os_fonts(fontnames) +local function scan_os_fonts(fontnames, status)      if expandpath("$OSFONTDIR"):is_empty() then           if trace_progress then              logs.report("scanning OS fonts:") @@ -296,7 +297,7 @@ local function scan_os_fonts(fontnames)          for _,fnt in ipairs(list) do              count = count + 1              progress(count, #list) -            fontnames = load_font(fnt, fontnames, false) +            fontnames = load_font(fnt, fontnames, false, status)          end      end      return fontnames @@ -312,7 +313,10 @@ local function fontnames_init()  end  -- The main function, scans everything -local function update(fontnames,force) +-- - fontnames is the final table to return +-- - force is whether we rebuild it from scratch or not +-- - status is a table containing the current status of the database  +local function update(fontnames, force, status)      if force then          fontnames = fontnames_init()      else @@ -324,8 +328,8 @@ local function update(fontnames,force)              end          end      end -    fontnames = scan_texmf_tree(fontnames) -    fontnames = scan_os_fonts  (fontnames) +    fontnames = scan_texmf_tree(fontnames, status) +    fontnames = scan_os_fonts  (fontnames, status)      return fontnames  end | 
