diff options
Diffstat (limited to '')
-rw-r--r-- | eatit-cfg.lua | 46 | ||||
-rw-r--r-- | eatit.lua | 153 |
2 files changed, 135 insertions, 64 deletions
diff --git a/eatit-cfg.lua b/eatit-cfg.lua index 750e33a..1b28bfc 100644 --- a/eatit-cfg.lua +++ b/eatit-cfg.lua @@ -18,10 +18,36 @@ GNU General Public License for more details. -- after being called with dofile() plugins = { -- the plugins you want to load - { 'https://git.squi.bid/eat-it', -- required, specifies the git repo - file = 'eatit.lua', -- required, specifies the desired file - dir = 'scripts', -- optional, sets the dest dir - branch = 'master', -- optional, sets the desired branch + { 'squibid/eat-it', -- required, specifies the git repo + -- optional, sets repo link (see advanced example for more info on how to + -- use this) + url = 'https://git.squi.bid/eat-it', + + -- required, specifies the desired file from the git repo + file = 'eatit.lua', + + -- optional, sets the destination of the requested file + dir = 'scripts', + + -- optional, sets the desired branch of the git repo + branch = 'master', + + -- optional, stop the plugin from being updated + pin = false, + }, + + -- advanced example + { 'gh:po5/thumbfast', -- expands to https://github.com/po5/thumbfast + file = { -- multiple files all going to the same place + 'thumbfast.lua', + 'osc.lua' + }, + branch = 'ancient', + --[[ + no need to specify dir as it defaults to ~~/scripts + no need to specify url as it is extrapolated from name + name expansion can be configured in the opts section + ]] }, } @@ -35,6 +61,16 @@ opts = { }, dl = { -- options for dealing with the git repos dir = '/tmp/mpv-eatit', - powerwash = false, -- if true the dl dir gets deleted after mpv closes + powerwash = false, -- if true the download dir gets deleted after mpv closes + }, + nameexp = { + pre = 'https://', + map = { + -- shortcut = link + gl = 'gitlab.com', + cb = 'codeberg.org', + sr = 'sr.ht', + gh = 'github.com' + } } } @@ -53,6 +53,35 @@ local function run(cmd) return y end +local function cp(a, b) + local i = io.open(a, 'r') + if not i then return 1 end + local o = io.open(b, 'w') + if not o then return 2 end + o:write(i:read('*a')) + o:close() + i:close() +end + +local function getsrc(id) + local src + if string.find(id, ":") then src = id:match("^[a-z]+[^:]") end + local name = id:match([[[^:]*$]]) + if name then + local pre = opts.nameexp.pre or "https://" + local map = opts.nameexp.map or { + gl = 'gitlab.com', + cb = 'codeberg.org', + sr = 'sr.ht', + gh = 'github.com' + } + return { + link = (pre..map[src]) or false, + repo = name + } + end +end + local function openlog() if opts.logging.log then -- log if asked to -- get our logfile's full path @@ -66,7 +95,7 @@ end local function logwrite(string) if opts.logging.log then - io.write(os.date(opts.logging.logdate) .. ' ' .. string .. '\n') + io.write(os.date(opts.logging.logdate)..' '..string..'\n') end end @@ -77,100 +106,106 @@ local function closelog() end -- get the requested git repos -local function clonegit(plugdir, i) - logwrite('downloading ' .. plugins[i][1]) +local function clonegit(plugdir, url, branch) + logwrite('downloading '..url) -- clone the repo - -- BUG: logwriting the git command doens't actually log the output - run('git -C ' .. opts.dl.dir .. ' clone ' .. plugins[i][1]) - run('git -C ' .. plugdir .. ' checkout -q ' .. plugins[i]['branch']) + -- BUG: logwriting the git command doesn't actually log the output + run('git -C '..opts.dl.dir..' clone '..url..' '..plugdir) + run('git -C '..plugdir..' checkout -q '..branch) end -- check for updates local function checkupdates(plugdir) - local localhash = run('git -C ' .. plugdir .. ' log -1 --format=format:"%H"') - local remotehash = run('git -C ' .. plugdir .. ' rev-parse $(git -C ' .. - plugdir .. ' branch -r) | tail -1') + local localhash = run('git -C '..plugdir..' log -1 --format=format:"%H"') + local remotehash = run('git -C '..plugdir..' rev-parse $(git -C '.. + plugdir..' branch -r) | tail -1') if localhash ~= remotehash then return true else return false end end -- start install -local function startinstall() - -- let the user know that we are starting install - logwrite('Starting Download...') - mp.osd_message('Downloading plugins!') - - -- start iterating through plugins - for i = 1, tablelength(plugins) do - -- check if the user has defined a file for the current plugin - if not plugins[i]['file'] then - logwrite('WARNING! Git repo "' .. plugins[i][1] .. - '" doesn\'t have a specified file. Skipping download') - - -- FIXME: this results in the last plugin being downloaded & copied twice - i = i + 1 -- if not we go to the next plugin - end +local function startinstall(i) + local src = getsrc(plugins[i][1]) + local plugin = { -- plugin table spec + id = plugins[i][1] or false, + url = plugins[i]['url'] or (src['link'].."/"..src['repo']), + file = plugins[i]['file'] or false, + dir = plugins[i]['dir'] or 'scripts', + pin = plugins[i]['pin'] or false, + branch = plugins[i]['branch'] or false, + } + + -- check if the user has defined a file for the current plugin + if not plugin['file'] then + logwrite('WARNING! File not configured for '..plugin[1]) + goto continue + end + -- skip install of pinned files + if plugin['pin'] == true then goto continue end - -- if no destdir defined we set it to the root of the mpv config dir - if not plugins[i]['dir'] then - plugins[i]['dir'] = '~~/' - end + -- get the plugins tmp download dir + local plugdir = opts.dl.dir..'/'..testforslash(src['repo']):gsub('.git', '') - -- get the plugins tmp download dir - local plugdir = opts.dl.dir .. '/' .. - string.match(plugins[i][1], '/([^/]+)$'):gsub('.git', '') + -- if no specified branch we use the default + plugin['branch'] = plugin['branch'] or testforslash( + run('git -C '..plugdir..' symbolic-ref refs/remotes/origin/HEAD') + ) - -- if no specified branch we use the default - if not plugins[i]['branch'] then - plugins[i]['branch'] = testforslash( - run('git -C ' .. plugdir .. ' symbolic-ref refs/remotes/origin/HEAD') - ) - end + -- check for multiple files + if type(plugin['file']) == 'string' then + plugin['file'] = {} + table.insert(plugin['file'], plugins[i]['file']) + end + -- get the requested file(s) + for j = 1, #plugin['file'] or 1 do -- get the file's dir - local pluginfile = opts.dl.dir .. '/' .. - string.match(plugins[i][1], '/([^/]+)$'):gsub('.git', '') .. - '/' .. plugins[i]['file'] + local pluginfile = plugdir..'/'..plugin['file'][j] -- get the dest dir - local destfile = mp.command_native({'expand-path', '~~/'}) .. - '/' .. plugins[i]['dir'] .. - '/' .. testforslash(plugins[i]['file']) + local destfile = mp.command_native({'expand-path', '~~/'}).. + '/'..plugin['dir']..'/'..testforslash(plugin['file'][j]) - if fileexists(plugdir .. '/') then + if fileexists(plugdir..'/') then -- if we need to update, update if checkupdates(plugdir) then - logwrite(plugins[i]['file'] .. ' is updating.') + logwrite(plugin['file'][j]..' is updating.') -- make sure we are on the main branch - run('git -C ' .. plugdir .. ' checkout -q ' .. plugins[i]['branch']) - run('git -C ' .. plugdir .. ' pull') -- get the latest commits + run('git -C '..plugdir..' checkout -q '..plugin['branch']) + run('git -C '..plugdir..' pull') -- get the latest commits else - logwrite(plugins[i]['file'] .. ' is up to date!') + logwrite(plugin['file'][j]..' is up to date!') end else - clonegit(plugdir, i) + clonegit(plugdir, plugin['url'], plugin['branch']) end -- copy the file contents over to the desired location - local infile = io.open(pluginfile, 'r') - local outfile = io.open(destfile, 'w') - outfile:write(infile:read('*a')) - outfile:close() - infile:close() + cp(pluginfile, destfile) end + ::continue:: end local function initupdate() openlog() - logwrite('# of plugins defined in table: ' .. tablelength(plugins)) - os.execute('mkdir -p ' .. opts.dl.dir) -- make download dir - startinstall() + logwrite('# of plugins defined in table: '..tablelength(plugins)) + os.execute('mkdir -p '..opts.dl.dir) -- make download dir + + -- start the install process + logwrite('Starting Download...') + mp.osd_message('Downloading plugins!') + + -- start iterating through plugins + for i = 1, tablelength(plugins) do + local f = coroutine.create(function() startinstall(i) end) + coroutine.resume(f) + end -- closing/removing everything if opts.dl.powerwash == true then - logwrite('powerwashing the tmp dir "' .. opts.dl.dir .. '"') - os.execute('rm -rf ' .. opts.dl.dir) + logwrite('powerwashing the tmp dir "'..opts.dl.dir..'"') + os.execute('rm -rf '..opts.dl.dir) end closelog() |