docmachine-utils/src/main.cr

141 lines
4.1 KiB
Crystal

require "option_parser"
require "digest/sha256"
require "colorize"
options = {} of Symbol => String
parser = OptionParser.new do |opts|
opts.banner = "Usage: script.cr [options]"
opts.on("-d", "--data-dir DIR", "Content directory") do |dir|
options[:data_dir] = dir
end
opts.on("-a", "--action ACTION", "Action (watch, build, shell, etc.)") do |action|
options[:action] = action
end
opts.on("-t", "--tty", "Enable TTY mode (needed for shell)") do |tty|
options[:tty] = tty
end
opts.on("-v", "--verbose", "Enable verbosity") do |verbose|
options[:verbose] = verbose.to_s
end
opts.on("-h", "--help", "Show this help") do
puts opts
exit
end
end
parser.parse(ARGV)
basedir = options[:data_dir]? ? options[:data_dir] : Dir.current
basehash = Digest::SHA256.hexdigest(basedir)[0..6]
action = options[:action]? ? options[:action] : "watch"
verbosity = options[:verbose]? ? options[:verbose] : 0
docker_image = "glenux/docmachine:latest"
docker_opts = [] of String
if options[:help]?
puts "Usage: script.cr [options]"
puts ""
puts "-d, --data-dir DIR Content directory"
puts "-a, --action ACTION Action (watch, build, shell, etc.)"
puts "-t, --tty Enable TTY mode (needed for shell)"
puts "-v, --verbose Enable verbosity"
puts "-h, --help Show this help"
exit
end
puts "basedir = #{basedir}"
puts "docker_image = #{docker_image}"
puts "action = #{action}"
docker_name = "docmachine-#{basehash}"
docker_cid = %x{docker ps -f "name=#{docker_name}" -q}.strip
uid = %x{id -u}.strip
gid = %x{id -g}.strip
puts "uid: #{uid}"
puts "cid: #{gid}"
puts "docker_name: #{docker_name}"
puts "docker_cid: #{docker_cid}"
if !docker_cid.empty?
Process.run("docker", ["kill", docker_name])
end
docker_opts << "run"
docker_opts << "-i"
# add tty support
docker_opts << "-t" if options[:tty]?
# add container name
docker_opts.concat ["--name", docker_name]
docker_opts << "--rm"
docker_opts << "--shm-size=1gb"
docker_opts.concat ["-e", "EXT_UID=#{uid}"]
docker_opts.concat ["-e", "EXT_GID=#{gid}"]
docker_opts.concat ["-v", "#{basedir}/docs:/app/docs"]
docker_opts.concat ["-v", "#{basedir}/slides:/app/slides"]
docker_opts.concat ["-v", "#{basedir}/images:/app/images"]
docker_opts.concat ["-v", "#{basedir}/_build:/app/_build"]
## Detect Marp SCSS
if File.exists?("#{basedir}/.marp/theme.scss")
docker_opt_marp_theme = ["-v", "#{basedir}/.marp:/app/.marp"]
docker_opts.concat docker_opt_marp_theme
puts "Theme: detected Marp files. Adding option to command line (#{docker_opt_marp_theme})"
else
puts "Theme: no theme detected. Using default files"
end
## Detect Mkdocs configuration - old format (full)
if File.exists?("#{basedir}/mkdocs.yml")
puts "Mkdocs: detected mkdocs.yml file. Please rename to mkdocs-patch.yml"
exit 1
end
## Detect Mkdocs configuration - new format (patch)
if File.exists?("#{basedir}/mkdocs-patch.yml")
docker_opt_mkdocs_config = ["-v", "#{basedir}/mkdocs-patch.yml:/app/mkdocs-patch.yml"]
docker_opts.concat docker_opt_mkdocs_config
puts "Mkdocs: detected mkdocs-patch.yml file. Adding option to command line (#{docker_opt_mkdocs_config})"
else
puts "Mkdocs: no mkdocs-patch.yml detected. Using default files"
end
## Detect slides
if Dir.exists?("#{basedir}/slides")
docker_opt_marp_port = ["-p", "5200:5200"]
docker_opts.concat docker_opt_marp_port
puts "Slides: detected slides directory. Adding option to command line (#{docker_opt_marp_port})"
else
puts "Slides: no slides directory detected."
end
## Detect docs
if Dir.exists?("#{basedir}/docs")
docker_opt_marp_port = ["-p", "5100:5100"]
docker_opts.concat docker_opt_marp_port
puts "Slides: detected docs directory. Adding option to command line (#{docker_opt_marp_port})"
else
puts "Slides: no slides docs detected."
end
docker_opts << docker_image
docker_opts << action
puts docker_opts.inspect.colorize(:yellow)
process = Process.new("docker", docker_opts, output: STDOUT, error: STDERR)
Signal::INT.trap do
STDERR.puts "Received CTRL-C"
process.signal(Signal::KILL)
Process.run("docker", ["kill", docker_name])
end
process.wait