class Create
A command to create a new teapot project.
Definitions
def call
Create a new project directory structure with default teapot.rb configuration.
Implementation
def call
logger = parent.logger
nested = parent["--root", parent.options[:root] || name.gsub(/\s+/, "-").downcase]
root = nested.root
if root.exist?
raise ArgumentError.new("#{root} already exists!")
end
# Create and set the project root:
root.create
repository = Rugged::Repository.init_at(root.to_s)
logger.info "Creating project named #{name} at path #{root}..."
generate_project(root, @name, @source, @packages)
# Fetch the initial packages:
Fetch[parent: nested].call
context = nested.context
selection = context.select
target_names = selection.configuration.targets[:create]
if target_names.any?
# Generate the initial project files:
Build[*target_names, parent: nested].call
# Fetch any additional packages:
Fetch[parent: nested].call
end
# Stage all files:
index = repository.index
index.add_all
# Commit the initial project files:
Rugged::Commit.create(repository,
tree: index.write_tree(repository),
message: "Initial project files.",
parents: repository.empty? ? [] : [repository.head.target].compact,
update_ref: "HEAD"
)
end
def generate_project(root, name, source, packages)
Generate the initial project files.
Signature
-
parameter
rootBuild::Files::Path The project root path.
-
parameter
nameString The project name.
-
parameter
sourceString The source repository URL.
-
parameter
packagesArray(String) The packages to include.
Implementation
def generate_project(root, name, source, packages)
name = ::Build::Name.new(name)
# Otherwise the initial commit will try to include teapot/
File.open(root + ".gitignore", "w") do |output|
output.puts "teapot/"
end
# A very basic teapot file to pull in the initial dependencies.
File.open(root + TEAPOT_FILE, "w") do |output|
output.puts "\# Teapot v#{VERSION} configuration generated at #{Time.now.to_s}", ""
output.puts "required_version #{LOADER_VERSION.dump}", ""
output.puts "define_project #{name.target.dump} do |project|"
output.puts "\tproject.title = #{name.text.dump}"
output.puts "end", ""
output.puts "\# Build Targets", ""
output.puts "\# Configurations", ""
output.puts "define_configuration 'development' do |configuration|"
output.puts "\tconfiguration[:source] = #{source.dump}"
output.puts "\tconfiguration.import #{name.target.dump}"
packages.each do |name|
output.puts "\tconfiguration.require #{name.dump}"
end
output.puts "end", ""
output.puts "define_configuration #{name.target.dump} do |configuration|"
output.puts "\tconfiguration.public!"
output.puts "end"
end
end