Files
eat-it/eatit.lua
Squibid 7665d8f32a add liscence to top of files
this is due to the fact that the liscense likely won't be with the
files on the user's computer
2023-07-02 21:02:13 -04:00

145 lines
4.1 KiB
Lua

--[[
Eat It - a Mpv plugin manager
Copyright © 2023 squibid
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
]]
local mp = require('mp')
dofile(mp.command_native({'expand-path', '~~/eatit-cfg.lua'}))
local function tablelength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end
local function fileexists(name)
local f = io.open(name, 'r')
if f ~= nil then io.close(f) return true else return false end
end
local function logwrite(string)
if opts.logging.log then
io.write(os.date(opts.logging.logdate) .. ' ' .. string .. '\n')
end
end
local function clonegit(pluginlink)
logwrite('downloading ' .. pluginlink)
-- construct the git cmd
local cmd = 'git -C ' .. opts.dl.dir .. ' clone ' .. pluginlink
-- run the command and get the result for logging
local run = io.popen(cmd)
-- BUG: logwriting the git command doens't actually log the output
-- (commented out for now)
-- logwrite(run:read('*a'))
run:close()
end
local function checkupdates(i, pluginfile, pluginlink)
local plugdir = opts.dl.dir .. '/' ..
string.match(pluginlink, '/([^/]+)$')
local localhashcmd = 'cd ' .. plugdir ..
'; git log -1 --format=format:"%H"'
local remotehashcmd = 'cd ' .. plugdir ..
'; git log -n 1 $(git branch -r | head -1 | cut -d " " -f 3)' ..
' | head -1 | cut -d " " -f 2'
local a = io.popen(localhashcmd)
local localhash = string.gsub(a:read("*a"), '[\n\r]', '')
a:close()
a = io.popen(remotehashcmd)
local remotehash = string.gsub(a:read("*a"), '[\n\r]', '')
a:close()
if localhash ~= remotehash then
logwrite(plugins[i]['file'] .. ' is updating.')
clonegit(pluginlink)
else
logwrite(plugins[i]['file'] .. ' is up to date!')
end
end
local function startinstall()
logwrite('Starting Download...')
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
-- 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 file's dir
local pluginfile = opts.dl.dir .. '/' ..
string.match(plugins[i][1], '/([^/]+)$') ..
'/' .. plugins[i]['file']
-- get the dest dir
local destfile = mp.command_native({'expand-path', '~~/'}) ..
'/' .. plugins[i]['dir'] ..
'/' .. plugins[i]['file']
if fileexists(pluginfile) then
checkupdates(i, pluginfile, plugins[i][1])
else
clonegit(plugins[i][1])
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()
end
end
local function init()
if opts.logging.log then -- log if asked to
-- get our logfile's full path
local fn = mp.command_native({'expand-path', opts.logging.logfile})
os.remove(fn) -- remove logfile so that we start fresh
f = io.open(fn, 'a') -- open file buffer
io.output(f) -- set it as default
end
logwrite('# of plugins defined in table: ' .. tablelength(plugins))
os.execute('mkdir -p ' .. opts.dl.dir) -- make download dir
startinstall()
-- closing/removing everything
if opts.dl.powerwash == true then
logwrite('powerwashing the tmp dir (' .. opts.dl.dir .. ')')
os.execute('rm -rf ' .. opts.dl.dir)
end
if opts.logging.log then
io.close(f)
end
end
mp.add_key_binding('U', 'UpdatePlugins', init)