86 lines
2 KiB
Ruby
Executable file
86 lines
2 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
# frozen_string_literal: true
|
|
|
|
require 'fileutils'
|
|
require 'find'
|
|
require 'thor'
|
|
require 'colorize'
|
|
|
|
EXCLUDE_LIST = ['.git', 'node_modules'].freeze
|
|
SKEL_DIR = ENV['HOME'] + '/src/Glenux.Teaching/teaching-boilerplate'
|
|
|
|
if ! File.directory? SKEL_DIR
|
|
warn "ERROR: missing #{SKEL_DIR}"
|
|
exit 1
|
|
end
|
|
|
|
# TeachingCli
|
|
class TeachingCli < Thor
|
|
desc 'create PROJECT', 'Create PROJECT directory'
|
|
def create(target)
|
|
# Create dir
|
|
if target.empty?
|
|
warn 'Target not specified'
|
|
exit 1
|
|
end
|
|
|
|
puts "Creating project #{target}"
|
|
FileUtils.mkdir_p target
|
|
|
|
# Create structure
|
|
Find.find(SKEL_DIR) do |path|
|
|
if EXCLUDE_LIST.include? File.basename(path)
|
|
Find.prune
|
|
next
|
|
end
|
|
next unless File.directory?(path)
|
|
|
|
shortpath = path.gsub(SKEL_DIR, '').gsub(%r{^/}, '')
|
|
next if shortpath.empty?
|
|
|
|
targetpath = File.join(target, shortpath)
|
|
print "Creating directory #{shortpath}… "
|
|
FileUtils.mkdir_p targetpath
|
|
puts 'ok'.green
|
|
end
|
|
|
|
# Create files if possible
|
|
Find.find(SKEL_DIR) do |path|
|
|
if EXCLUDE_LIST.include? File.basename(path)
|
|
Find.prune
|
|
next
|
|
end
|
|
|
|
next if File.directory?(path)
|
|
|
|
shortpath = path.gsub(SKEL_DIR, '').gsub(%r{^/}, '')
|
|
next if shortpath.empty?
|
|
|
|
targetpath = File.join(target, shortpath)
|
|
print "Creating file #{shortpath}… "
|
|
|
|
# File does not exist => install it
|
|
unless File.exist? targetpath
|
|
FileUtils.cp path, targetpath
|
|
puts 'ok (installed)'.green
|
|
next
|
|
end
|
|
|
|
# File exist & different
|
|
unless system 'cmp', '--quiet', path, targetpath
|
|
if File.exist? targetpath + '.new'
|
|
puts 'error (pease solve previous conflict)'.red
|
|
else
|
|
puts 'warning (conflict when creating file)'.yellow
|
|
FileUtils.cp path, targetpath + '.new'
|
|
end
|
|
next
|
|
end
|
|
|
|
puts 'ok (identical)'.green
|
|
FileUtils.cp path, targetpath
|
|
end
|
|
end
|
|
end
|
|
|
|
TeachingCli.start(ARGV)
|