ravenous.dev/tools/updaterepos.lua

#!/usr/bin/env lua
local lfs = require "lfs"

local repos = {}
local remotes = {}

local function repo(remote)
	local name = remote:match "[^/]*/*$" -- last path component
	repos[name] = true
	remotes[remote] = true
end

local repolist = assert(loadfile("repolist.lua", "bt", {repo = repo}))
repolist()

lfs.mkdir "generated"
lfs.mkdir "generated/repos"

for dir in lfs.dir "generated/repos" do
	if not repos[dir] and dir ~= "." and dir ~= ".." then
		os.execute(("rm -rf generated/repos/%q"):format(dir))
	end
end

assert(lfs.chdir "generated/repos")

for remote in pairs(remotes) do
	local name = remote:match "[^/]*/*$" -- last path component
	assert(name ~= "", "this shouldn't be empty")
	if lfs.attributes(name) then
		assert(lfs.chdir(name))
		assert(os.execute "git pull --ff-only")
		assert(lfs.chdir "..")
	else
		assert(os.execute(("git clone %q %q"):format(remote, name)))
	end
end