# frozen_string_literal: true module Gitem class CLI def initialize(argv) @argv = argv.dup @options = { output: nil, port: 8000, generate: true, open: false, base_path: nil } end def run command = @argv.shift || "serve" case command when "generate", "g" then run_generate when "serve", "s" then run_serve when "help", "-h", "--help" then print_help when "version", "-v", "--version" then puts "gitem #{VERSION}" else warn "Unknown command: #{command}" print_help exit 1 end rescue Rugged::Error, Rugged::RepositoryError => e warn "Git error: #{e.message}" exit 1 rescue Error => e warn "Error: #{e.message}" exit 1 end private def run_generate parse_generate_options! validate_repo! Generator.new(@options[:repo_path], @options[:output], @options[:base_path]).export! end def run_serve parse_serve_options! validate_repo! generator = Generator.new(@options[:repo_path], @options[:output], @options[:base_path]) generator.export! if @options[:generate] server = Server.new(generator.output_dir, @options[:port]) open_browser(server.url) if @options[:open] server.start end def parse_generate_options! OptionParser.new do |opts| opts.banner = "Usage: gitem generate [REPO_PATH] [options]" opts.on("-o", "--output DIR", "Output directory") { |v| @options[:output] = v } opts.on("-b", "--base-path PATH", "Base path for hosting (e.g., /xlgmokha/gitem)") { |v| @options[:base_path] = v } opts.on("-h", "--help", "Show help") { puts opts; exit } end.parse!(@argv) @options[:repo_path] = @argv.shift || "." end def parse_serve_options! OptionParser.new do |opts| opts.banner = "Usage: gitem serve [REPO_PATH] [options]" opts.on("-o", "--output DIR", "Output directory") { |v| @options[:output] = v } opts.on("-p", "--port PORT", Integer, "Port (default: 8000)") { |v| @options[:port] = v } opts.on("-b", "--base-path PATH", "Base path for hosting (e.g., /xlgmokha/gitem)") { |v| @options[:base_path] = v } opts.on("--[no-]generate", "Generate before serving") { |v| @options[:generate] = v } opts.on("--open", "Open browser") { @options[:open] = true } opts.on("-h", "--help", "Show help") { puts opts; exit } end.parse!(@argv) @options[:repo_path] = @argv.shift || "." end def validate_repo! path = @options[:repo_path] return if File.exist?(File.join(path, ".git")) || File.exist?(File.join(path, "HEAD")) raise Error, "'#{path}' is not a valid git repository" end def open_browser(url) cmd = case RbConfig::CONFIG["host_os"] when /darwin/i then "open" when /linux/i then "xdg-open" when /mswin|mingw|cygwin/i then "start" end system("#{cmd} #{url} > /dev/null 2>&1 &") if cmd end def print_help puts <<~HELP Usage: gitem [options] Commands: serve, s Generate and serve (default) generate, g Generate JSON files only help Show help version Show version Run 'gitem --help' for options. HELP end end end