Skip to content

Instantly share code, notes, and snippets.

@SamSaffron
Created April 12, 2023 01:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SamSaffron/a5b6a942b4083cbd46ae2862c8e32f07 to your computer and use it in GitHub Desktop.
Save SamSaffron/a5b6a942b4083cbd46ae2862c8e32f07 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require "curses"
require "fileutils"
plugin_dir = File.expand_path("~/Source/discourse/plugins")
disabled_plugin_dir = File.expand_path("~/Source/discourse-plugins")
Curses.init_screen
Curses.noecho
Curses.cbreak
Curses.stdscr.keypad = true
Curses.curs_set(0)
begin
selected = 0
while true
Curses.clear
Curses.setpos(0, 0)
Curses.addstr("Discourse Plugin Manager")
Curses.setpos(1, 0)
Curses.addstr("Enabled plugins:")
excluded_plugins =
`cd #{plugin_dir}/../ && git ls-files | grep ^plugins | awk -F '/' '{ print $2 }' | uniq`.split(
"\n"
).map(&:strip)
enabled_plugins =
Dir
.entries(plugin_dir)
.sort
.select do |entry|
plugin_path = File.join(plugin_dir, entry)
!entry.start_with?(".") && File.directory?(plugin_path) &&
!excluded_plugins.include?(entry.to_s)
end
disabled_plugins =
Dir
.entries(disabled_plugin_dir)
.sort
.reject { |entry| entry.start_with?(".") }
enabled_plugins.each_with_index do |plugin, idx|
Curses.setpos(idx + 2, 2)
Curses.attron(Curses::A_REVERSE) if idx == selected
Curses.addstr(plugin)
Curses.attroff(Curses::A_REVERSE) if idx == selected
end
Curses.setpos(enabled_plugins.length + 3, 0)
Curses.addstr("Disabled plugins:")
disabled_plugins.each_with_index do |plugin, idx|
Curses.setpos(idx + enabled_plugins.length + 4, 2)
if idx + enabled_plugins.length + 1 == selected
Curses.attron(Curses::A_REVERSE)
end
Curses.addstr(plugin)
if idx + enabled_plugins.length + 1 == selected
Curses.attroff(Curses::A_REVERSE)
end
end
key = Curses.getch
case key
when Curses::KEY_DOWN
selected =
(selected + 1) % (enabled_plugins.length + disabled_plugins.length + 1)
when Curses::KEY_UP
selected =
(selected - 1) % (enabled_plugins.length + disabled_plugins.length + 1)
when "q"
break
when ?\n.ord
if selected < enabled_plugins.length
plugin_to_disable = enabled_plugins[selected]
FileUtils.mv(
File.join(plugin_dir, plugin_to_disable),
disabled_plugin_dir
)
else
plugin_to_enable =
disabled_plugins[selected - enabled_plugins.length - 1]
FileUtils.mv(
File.join(disabled_plugin_dir, plugin_to_enable),
plugin_dir
)
end
end
end
ensure
Curses.close_screen
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment