Compare commits

...

4 commits

View file

@ -7,45 +7,58 @@ require 'find'
require 'thor' require 'thor'
require 'table_print' require 'table_print'
require 'tty-spinner' require 'tty-spinner'
require 'colorize'
class ListRepos < Thor class ListRepos < Thor
desc 'list [SELECTOR]', 'List repositories' desc 'list [SELECTOR]', 'List repositories'
method_option :root, type: :string, aliases: '-r' method_option :root, type: :string, aliases: '-r'
def list(selector_str="") def initialize(*args)
String.disable_colorization = true unless ENV['NO_COLOR'].nil?
super
end
def list(selector_str='')
trap 'SIGINT' do
system 'tput cnorm' # show cursor (fix)
exit! 130
end
basedir = options['root'] || '.' basedir = options['root'] || '.'
projects = [] projects = []
spinner = TTY::Spinner.new( spinner = TTY::Spinner.new(
hide_cursor: true, hide_cursor: true,
clear: true clear: true
) )
selector = self.class.build_selector(selector_str) selector = self.class.build_selector(selector_str)
selector_str2 = selector.map { |k, v| "#{k}=#{v}" }.join(' ') selector_str2 = selector.map { |k, v| "#{k}=#{v.to_s.colorize(:yellow)}" }.join(' AND ')
puts "selector = #{selector_str2}" puts "SELECTOR: #{selector_str2}"
## COLLECT ## COLLECT
spinner.auto_spin spinner.auto_spin
system 'tput civis' # hide cursor (fix)
Find.find(basedir) do |path| Find.find(basedir) do |path|
next unless path =~ %r{.*/.git/config$} next unless path =~ %r{.*/.git/config$}
project_root = File.dirname(File.dirname(path)) project_root = File.dirname(File.dirname(path)).gsub(%r{^#{basedir}/}, '')
lines = File.readlines(path) lines = File.readlines(path)
projects << { projects << {
path: project_root, path: project_root,
github: lines.select { |line| line =~ /github\.com/ }.any?, github: lines.select { |line| line =~ /github\.com/ }.any?,
gitlab: lines.select { |line| line =~ /gitlab\.com/ }.any?, gitlab: lines.select { |line| line =~ /gitlab\.com/ }.any?,
bitbucket: lines.select { |line| line =~ /bitbucket\.com/ }.any?, bitbucket: lines.select { |line| line =~ /bitbucket\.(com|org)/ }.any?,
gitea_glenux: lines.select { |line| line =~ /code\.(dinlas\.)?apps\.glenux\.net/ }.any?, gitea: lines.select { |line| line =~ /code\.(dinlas\.)?apps\.glenux\.net/ }.any?,
mr: self.class.mr_enabled?(project_root, lines)
} }
end end
spinner.stop spinner.stop
system 'tput cnorm' # show cursor (fix)
puts ''
## REDUCE ## REDUCE
projects_selected = projects.select do |vals| projects_selected = projects.select do |vals|
res = true res = true
selector.each do |k,v| selector.each do |k, v|
res &&= (vals[k] == v) res &&= (vals[k] == v)
end end
res res
@ -55,7 +68,14 @@ class ListRepos < Thor
# require 'pp' # require 'pp'
# pp projects_selected # pp projects_selected
tp.set :max_width, 100 tp.set :max_width, 100
tp projects_selected, :path, :github, :gitlab, :bitbucket, :gitea_glenux
columns = [:path] + ([:github, :gitlab, :bitbucket, :gitea, :mr] - selector.keys)
tp projects_selected, *columns
end
def self.mr_enabled?(project_root, _lines)
system "cd #{project_root} && mr status >/dev/null 2>&1"
$?.success?
end end
def self.build_selector(str) def self.build_selector(str)