module Gtn::ModificationTimes

Module for obtaining modification times of files. It walks the git history to record the last time a file was modified. This is faster than talking to the file system.

Public Class Methods

cached_command() click to toggle source
# File _plugins/gtn/mod.rb, line 52
def self.cached_command
  return command if discover_caches.nil?

  Jekyll.logger.info '[GTN/Time/Mod] Using cached modification times'

  previous_commit = discover_caches.split('-').last.split('.').first
  previous = File.read(discover_caches)

  `git log --first-parent --name-only --pretty='GTN_GTN:%ct' #{previous_commit}..` + previous
end
clean_path(f) click to toggle source
# File _plugins/gtn/mod.rb, line 75
def self.clean_path(f)
  if f =~ %r{^\./}
    f[2..]
  elsif f =~ %r{^/}
    f.gsub(ROOT_PATH, '')
  else
    f
  end
end
command() click to toggle source
# File _plugins/gtn/mod.rb, line 63
def self.command
  `git log --first-parent --name-only --pretty='GTN_GTN:%ct'`
end
commit_count_cache() click to toggle source
# File _plugins/gtn/mod.rb, line 71
def self.commit_count_cache
  @@COMMIT_COUNT_CACHE
end
discover_caches() click to toggle source
# File _plugins/gtn/mod.rb, line 33
def self.discover_caches
  # Really there should only be one, but maybe someone's been silly so
  # we'll just take the first one we find.
  Dir.glob('metadata/git-mod-*.txt').first
end
generate_cache() click to toggle source
# File _plugins/gtn/mod.rb, line 39
def self.generate_cache
  rev = `git rev-list -n 1 main`.strip

  if discover_caches.nil?
    File.write("metadata/git-mod-#{rev}.txt", command)
  else
    prev = discover_caches
    results = cached_command
    File.delete(prev)
    File.write("metadata/git-mod-#{rev}.txt", results)
  end
end
init_cache() click to toggle source
# File _plugins/gtn/mod.rb, line 15
def self.init_cache
  return unless @@TIME_CACHE.nil?

  @@TIME_CACHE = {}
  @@COMMIT_COUNT_CACHE = Hash.new(0)
  Jekyll.logger.info '[GTN/Time/Mod] Filling Time Cache'
  cached_command
    .split('GTN_GTN:')
    .map { |x| x.split("\n\n") }
    .select { |x| x.length > 1 }
    .each do |date, files|
    files.split(/\n/).each do |f|
      @@TIME_CACHE[f] = Time.at(date.to_i) if !@@TIME_CACHE.key? f
      @@COMMIT_COUNT_CACHE[f] += 1
    end
  end
end
obtain_modification_count(f_unk) click to toggle source
# File _plugins/gtn/mod.rb, line 85
def self.obtain_modification_count(f_unk)
  f = clean_path(f_unk)
  init_cache
  if @@COMMIT_COUNT_CACHE.key? f
    @@COMMIT_COUNT_CACHE[f]
  else
    0
  end
end
obtain_time(f_unk) click to toggle source
# File _plugins/gtn/mod.rb, line 95
def self.obtain_time(f_unk)
  f = clean_path(f_unk)
  init_cache
  if @@TIME_CACHE.key? f
    @@TIME_CACHE[f]
  else
    begin
      # Non git file.
      @@TIME_CACHE[f] = File.mtime(f)
      Jekyll.logger.warn "[GTN/Time/Mod] No git cached time available for #{f}, defaulting to checkout"
      @@TIME_CACHE[f]
    rescue StandardError
      Time.at(0)
    end
  end
end
time_cache() click to toggle source
# File _plugins/gtn/mod.rb, line 67
def self.time_cache
  @@TIME_CACHE
end