local dates = require "activity.dates" local git = {} function git.log (dirname, entries, filter) entries = entries or {} if not dirname then error "did not provide repo" end local handle = io.popen(([[git -C %s log --all --format="%%aE;%%cE;%%as"]]):format(dirname)) for line in handle:lines() do local author, committer, year, month, day = line:match"([^;]*);([^;]*);(%d+)%-(%d+)%-(%d+)" local date = {year=tonumber(year), month=tonumber(month), day=tonumber(day)} local entry = {author=author, committer=committer, date=date} if not filter or filter(entry) then table.insert(entries, entry) end end local ok, _ = handle:close() if not ok then io.stderr:write("could not read repo: ", dirname, "\n") end return not ok, entries end function git.lookup (repositories, filter) local lookup = {} local errors = nil local entries = {} for _, dirname in pairs(repositories) do local err, _ = git.log(dirname, entries, filter) errors = errors or err end for _, entry in pairs(entries) do local day = dates.day_of_year(entry.date) local year = entry.date.year lookup[year] = lookup[year] or {} lookup[year][day] = (lookup[year][day] or 0) + 1 end return errors, function (year, day) return (lookup[year] or {})[day] or 0 end end function git.maybe_filter (field, set) if next(set) then return function (entry) return set[entry[field]] end end return nil end return git