aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--eatit-cfg.lua46
-rw-r--r--eatit.lua153
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'
+ }
}
}
diff --git a/eatit.lua b/eatit.lua
index efc1f0a..b18e56d 100644
--- a/eatit.lua
+++ b/eatit.lua
@@ -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()