teapot 2.2.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.travis.yml +15 -18
- data/Gemfile +0 -11
- data/README.md +1 -0
- data/bin/teapot +32 -30
- data/lib/teapot/command.rb +19 -26
- data/lib/teapot/command/build.rb +7 -20
- data/lib/teapot/command/clean.rb +4 -4
- data/lib/teapot/command/clone.rb +5 -7
- data/lib/teapot/command/create.rb +12 -15
- data/lib/teapot/command/fetch.rb +21 -17
- data/lib/teapot/command/list.rb +32 -30
- data/lib/teapot/{identity_set.rb → command/selection.rb} +27 -54
- data/lib/teapot/command/status.rb +15 -25
- data/lib/teapot/command/visualize.rb +7 -9
- data/lib/teapot/configuration.rb +19 -8
- data/lib/teapot/context.rb +10 -133
- data/lib/teapot/loader.rb +13 -5
- data/lib/teapot/select.rb +148 -0
- data/lib/teapot/target.rb +22 -24
- data/lib/teapot/version.rb +1 -1
- data/spec/spec_helper.rb +1 -25
- data/spec/teapot/command/clone_spec.rb +1 -1
- data/spec/teapot/context_spec.rb +21 -3
- data/spec/teapot/context_spec/teapot.rb +9 -5
- data/spec/teapot/target_spec.rb +1 -10
- data/teapot.gemspec +11 -16
- metadata +57 -31
- data/spec/teapot/identity_set_spec.rb +0 -94
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 505d95b6a2ff7e5926b1bc5133feacbd1b2fd34de76098a3679b92d04564fabb
|
4
|
+
data.tar.gz: ed41d5bb91594b0b3eae63c8fd1e87674b565f6d233212550c7467c8144934cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c6c628f2a7ca144025d8730b9dd26fe7e80c57d656098e7a376271967ca567d40168b5a46f24248338a5983591fd030309e936f1a306f34736626381173b9a5
|
7
|
+
data.tar.gz: 2eeb2992f80ed8f17d95821ea15299feab6193c134cb019d0fe9bb0e412b4987c09d774f17dc2c375546cded1e89c3b000271f77cc531c71534c5535aa501efb
|
data/.travis.yml
CHANGED
@@ -1,27 +1,24 @@
|
|
1
|
-
# Setup the environment:
|
2
1
|
language: ruby
|
3
|
-
|
4
|
-
dist: trusty
|
2
|
+
dist: xenial
|
5
3
|
cache: bundler
|
6
4
|
|
7
|
-
|
5
|
+
before_script:
|
8
6
|
# For testing purposes:
|
9
7
|
- git config --global user.email "samuel@oriontransfer.net"
|
10
8
|
- git config --global user.name "Samuel Williams"
|
11
9
|
|
12
|
-
rvm:
|
13
|
-
- 2.1
|
14
|
-
- 2.2
|
15
|
-
- 2.3
|
16
|
-
- 2.4
|
17
|
-
- jruby-head
|
18
|
-
- ruby-head
|
19
|
-
|
20
|
-
# Setup the compilers:
|
21
10
|
matrix:
|
22
|
-
|
23
|
-
- rvm:
|
24
|
-
- rvm:
|
11
|
+
include:
|
12
|
+
- rvm: 2.3
|
13
|
+
- rvm: 2.4
|
14
|
+
- rvm: 2.5
|
15
|
+
- rvm: 2.6
|
16
|
+
- rvm: 2.6
|
17
|
+
os: osx
|
18
|
+
before_install: brew install pkgconfig zlib curl openssl libssh2 libgit2
|
19
|
+
# env: RUGGED_USE_SYSTEM_LIBRARIES=y
|
20
|
+
- rvm: 2.6
|
21
|
+
env: COVERAGE=BriefSummary,Coveralls
|
25
22
|
|
26
23
|
addons:
|
27
24
|
apt:
|
@@ -32,5 +29,5 @@ addons:
|
|
32
29
|
- clang-4.0
|
33
30
|
- libc++-dev
|
34
31
|
- libc++abi-dev
|
35
|
-
env:
|
36
|
-
|
32
|
+
# env:
|
33
|
+
# - CC=clang-4.0 CXX=clang++-4.0
|
data/Gemfile
CHANGED
@@ -2,14 +2,3 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in teapot.gemspec
|
4
4
|
gemspec
|
5
|
-
|
6
|
-
group :development do
|
7
|
-
gem 'pry'
|
8
|
-
gem 'pry-coolline'
|
9
|
-
gem 'pry-byebug', platform: :mri
|
10
|
-
end
|
11
|
-
|
12
|
-
group :test do
|
13
|
-
gem 'simplecov'
|
14
|
-
gem 'coveralls', require: false
|
15
|
-
end
|
data/README.md
CHANGED
@@ -10,6 +10,7 @@ Teapot is a decentralised build tool for managing complex cross-platform project
|
|
10
10
|
[](http://travis-ci.org/kurocha/teapot)
|
11
11
|
[](https://codeclimate.com/github/kurocha/teapot)
|
12
12
|
[](https://coveralls.io/r/kurocha/teapot)
|
13
|
+
[](https://gitter.im/kurocha/community)
|
13
14
|
|
14
15
|
## Installation
|
15
16
|
|
data/bin/teapot
CHANGED
@@ -20,40 +20,42 @@
|
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
21
|
# THE SOFTWARE.
|
22
22
|
|
23
|
-
|
23
|
+
require_relative '../lib/teapot/command'
|
24
24
|
|
25
|
-
|
25
|
+
if command = Teapot::Command.parse(ARGV)
|
26
|
+
logger = command.logger
|
26
27
|
|
27
|
-
begin
|
28
|
-
|
29
|
-
rescue Teapot::IncompatibleTeapotError => error
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
28
|
+
begin
|
29
|
+
command.invoke
|
30
|
+
rescue Teapot::IncompatibleTeapotError => error
|
31
|
+
logger.error(command, error) do
|
32
|
+
"Supported minimum version #{Teapot::MINIMUM_LOADER_VERSION.dump} to #{Teapot::LOADER_VERSION.dump}."
|
33
|
+
end
|
34
|
+
|
35
|
+
exit 1
|
36
|
+
rescue Build::Dependency::UnresolvedDependencyError => error
|
37
|
+
logger.error(command, error) do |buffer|
|
38
|
+
buffer.puts "Unresolved dependencies:"
|
36
39
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
40
|
+
error.chain.unresolved.each do |name, parent|
|
41
|
+
buffer.puts "#{parent} depends on #{name.inspect}"
|
42
|
+
|
43
|
+
conflicts = error.chain.conflicts[name]
|
44
|
+
|
45
|
+
if conflicts
|
46
|
+
conflicts.each do |conflict|
|
47
|
+
buffer.puts " - provided by #{conflict.name}"
|
48
|
+
end
|
49
|
+
end
|
45
50
|
end
|
51
|
+
|
52
|
+
buffer.puts "Cannot continue due to unresolved dependencies!".color(:red)
|
46
53
|
end
|
54
|
+
|
55
|
+
exit 2
|
56
|
+
rescue StandardError => error
|
57
|
+
logger.error(command, error)
|
58
|
+
|
59
|
+
exit 3
|
47
60
|
end
|
48
|
-
|
49
|
-
$stderr.puts "Cannot continue due to unresolved dependencies!".color(:red)
|
50
|
-
|
51
|
-
exit 2
|
52
|
-
rescue StandardError => error
|
53
|
-
$stderr.puts error.message.color(:red)
|
54
|
-
|
55
|
-
# Could be nice to have some improved error reporting.
|
56
|
-
$stderr.puts error.backtrace
|
57
|
-
|
58
|
-
exit 3
|
59
61
|
end
|
data/lib/teapot/command.rb
CHANGED
@@ -33,12 +33,9 @@ require_relative 'context'
|
|
33
33
|
require_relative 'configuration'
|
34
34
|
require_relative 'version'
|
35
35
|
|
36
|
-
require 'uri'
|
37
|
-
require 'rainbow'
|
38
|
-
require 'rainbow/ext/string'
|
39
36
|
require 'fileutils'
|
40
37
|
|
41
|
-
require '
|
38
|
+
require 'console'
|
42
39
|
|
43
40
|
module Teapot
|
44
41
|
module Command
|
@@ -57,16 +54,16 @@ module Teapot
|
|
57
54
|
option '-v/--version', "Print out the application version."
|
58
55
|
end
|
59
56
|
|
60
|
-
nested
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
57
|
+
nested :command, {
|
58
|
+
"create" => Create,
|
59
|
+
"clone" => Clone,
|
60
|
+
"fetch" => Fetch,
|
61
|
+
"list" => List,
|
62
|
+
"status" => Status,
|
63
|
+
"build" => Build,
|
64
|
+
"visualize" => Visualize,
|
65
|
+
"clean" => Clean,
|
66
|
+
}, default: 'build'
|
70
67
|
|
71
68
|
def root
|
72
69
|
::Build::Files::Path.expand(@options[:root] || Dir.getwd)
|
@@ -81,15 +78,13 @@ module Teapot
|
|
81
78
|
end
|
82
79
|
|
83
80
|
def logger
|
84
|
-
@logger ||= Logger.new(
|
85
|
-
logger.formatter = ::Build::CompactFormatter.new(verbose: verbose?)
|
86
|
-
|
81
|
+
@logger ||= Console::Logger.new(Console.logger, verbose: self.verbose?).tap do |logger|
|
87
82
|
if verbose?
|
88
|
-
logger.
|
83
|
+
logger.debug!
|
89
84
|
elsif quiet?
|
90
|
-
logger.
|
85
|
+
logger.warn!
|
91
86
|
else
|
92
|
-
logger.
|
87
|
+
logger.info!
|
93
88
|
end
|
94
89
|
end
|
95
90
|
end
|
@@ -102,15 +97,13 @@ module Teapot
|
|
102
97
|
Context.new(root, configuration: configuration)
|
103
98
|
end
|
104
99
|
|
105
|
-
def invoke
|
100
|
+
def invoke
|
106
101
|
if @options[:version]
|
107
102
|
puts "teapot v#{Teapot::VERSION}"
|
108
|
-
elsif @options[:help]
|
109
|
-
print_usage(
|
103
|
+
elsif @options[:help]
|
104
|
+
print_usage(output: $stdout)
|
110
105
|
else
|
111
|
-
|
112
|
-
@command.invoke(self)
|
113
|
-
end
|
106
|
+
@command.invoke
|
114
107
|
end
|
115
108
|
end
|
116
109
|
end
|
data/lib/teapot/command/build.rb
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
-
|
21
|
+
require_relative 'selection'
|
22
22
|
|
23
23
|
require 'build/controller'
|
24
24
|
|
@@ -27,19 +27,18 @@ module Teapot
|
|
27
27
|
class BuildFailedError < StandardError
|
28
28
|
end
|
29
29
|
|
30
|
-
class Build <
|
30
|
+
class Build < Selection
|
31
31
|
self.description = "Build the specified target."
|
32
32
|
|
33
33
|
options do
|
34
34
|
option '-j/-l/--limit <n>', "Limit the build to <n> concurrent processes.", type: Integer
|
35
|
-
option '--only', "Only build direct dependencies."
|
36
35
|
option '-c/--continuous', "Run the build graph continually (experimental)."
|
37
36
|
end
|
38
37
|
|
39
38
|
many :targets, "Build these targets, or use them to help the dependency resolution process."
|
40
39
|
split :argv, "Arguments passed to child process(es) of build if any."
|
41
40
|
|
42
|
-
def invoke
|
41
|
+
def invoke
|
43
42
|
context = parent.context
|
44
43
|
|
45
44
|
# The targets to build:
|
@@ -50,23 +49,11 @@ module Teapot
|
|
50
49
|
end
|
51
50
|
|
52
51
|
chain = selection.chain
|
53
|
-
|
54
|
-
ordered = chain.ordered
|
55
|
-
|
56
|
-
if @options[:only]
|
57
|
-
ordered = selection.direct_targets(ordered)
|
58
|
-
end
|
52
|
+
environment = context.configuration.environment
|
59
53
|
|
60
54
|
controller = ::Build::Controller.new(logger: parent.logger, limit: @options[:limit]) do |controller|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
if target.build
|
65
|
-
environment = target.environment(selection.configuration, chain)
|
66
|
-
|
67
|
-
controller.add_target(target, environment.flatten, self.argv)
|
68
|
-
end
|
69
|
-
end
|
55
|
+
|
56
|
+
controller.add_chain(chain, self.argv, environment)
|
70
57
|
end
|
71
58
|
|
72
59
|
walker = nil
|
@@ -91,7 +78,7 @@ module Teapot
|
|
91
78
|
end
|
92
79
|
end
|
93
80
|
|
94
|
-
return chain
|
81
|
+
return chain
|
95
82
|
end
|
96
83
|
|
97
84
|
def show_dependencies(walker)
|
data/lib/teapot/command/clean.rb
CHANGED
@@ -25,15 +25,15 @@ module Teapot
|
|
25
25
|
class Clean < Samovar::Command
|
26
26
|
self.description = "Delete everything in the teapot directory."
|
27
27
|
|
28
|
-
def invoke
|
28
|
+
def invoke
|
29
29
|
context = parent.context
|
30
30
|
logger = parent.logger
|
31
31
|
configuration = context.configuration
|
32
32
|
|
33
|
-
logger.info "Removing #{configuration.
|
34
|
-
FileUtils.rm_rf configuration.
|
33
|
+
logger.info "Removing #{configuration.build_path}..."
|
34
|
+
FileUtils.rm_rf configuration.build_path
|
35
35
|
|
36
|
-
logger.info "Removing #{configuration.packages_path}..."
|
36
|
+
logger.info "Removing #{configuration.packages_path}..."
|
37
37
|
FileUtils.rm_rf configuration.packages_path
|
38
38
|
end
|
39
39
|
end
|
data/lib/teapot/command/clone.rb
CHANGED
@@ -31,11 +31,9 @@ module Teapot
|
|
31
31
|
class Clone < Samovar::Command
|
32
32
|
self.description = "Clone a remote repository and fetch all dependencies."
|
33
33
|
|
34
|
-
one :source, "The source repository to clone."
|
34
|
+
one :source, "The source repository to clone.", required: true
|
35
35
|
|
36
|
-
def invoke
|
37
|
-
raise ArgumentError, "source is required" unless @source
|
38
|
-
|
36
|
+
def invoke
|
39
37
|
logger = parent.logger
|
40
38
|
|
41
39
|
name = File.basename(::Build::URI[@source].path, ".git")
|
@@ -47,11 +45,11 @@ module Teapot
|
|
47
45
|
raise ArgumentError.new("#{root} already exists!")
|
48
46
|
end
|
49
47
|
|
50
|
-
logger.info "Cloning #{@source} to #{root}..."
|
51
|
-
|
48
|
+
logger.info "Cloning #{@source} to #{root}..."
|
49
|
+
_repository = Rugged::Repository.clone_at(@source, root.to_s, credentials: self.method(:credentials))
|
52
50
|
|
53
51
|
# Fetch the initial packages:
|
54
|
-
Fetch[].invoke
|
52
|
+
Fetch[parent: nested].invoke
|
55
53
|
end
|
56
54
|
|
57
55
|
def credentials(url, username, types)
|
@@ -29,17 +29,14 @@ module Teapot
|
|
29
29
|
class Create < Samovar::Command
|
30
30
|
self.description = "Create a new teapot package using the specified repository."
|
31
31
|
|
32
|
-
one :
|
33
|
-
one :source, "The source repository to use for fetching packages, e.g. https://github.com/kurocha."
|
34
|
-
many :packages, "Any
|
32
|
+
one :name, "The name of the new project in title-case, e.g. 'My Project'.", required: true
|
33
|
+
one :source, "The source repository to use for fetching packages, e.g. https://github.com/kurocha.", required: true
|
34
|
+
many :packages, "Any packages you'd like to include in the project.", default: ["generate-project"]
|
35
35
|
|
36
|
-
def invoke
|
37
|
-
raise ArgumentError, "project_name is required" unless @project_name
|
38
|
-
raise ArgumentError, "source is required" unless @source
|
39
|
-
|
36
|
+
def invoke
|
40
37
|
logger = parent.logger
|
41
38
|
|
42
|
-
nested = parent['--root', parent.options[:root] ||
|
39
|
+
nested = parent['--root', parent.options[:root] || name.gsub(/\s+/, '-').downcase]
|
43
40
|
root = nested.root
|
44
41
|
|
45
42
|
if root.exist?
|
@@ -51,11 +48,11 @@ module Teapot
|
|
51
48
|
|
52
49
|
repository = Rugged::Repository.init_at(root.to_s)
|
53
50
|
|
54
|
-
logger.info "Creating project named #{
|
55
|
-
generate_project(root, @
|
51
|
+
logger.info "Creating project named #{name} at path #{root}..."
|
52
|
+
generate_project(root, @name, @source, @packages)
|
56
53
|
|
57
54
|
# Fetch the initial packages:
|
58
|
-
Fetch[].invoke
|
55
|
+
Fetch[parent: nested].invoke
|
59
56
|
|
60
57
|
context = nested.context
|
61
58
|
selection = context.select
|
@@ -63,10 +60,10 @@ module Teapot
|
|
63
60
|
|
64
61
|
if target_names.any?
|
65
62
|
# Generate the initial project files:
|
66
|
-
Build[*target_names].invoke
|
63
|
+
Build[*target_names, parent: nested].invoke
|
67
64
|
|
68
65
|
# Fetch any additional packages:
|
69
|
-
Fetch[].invoke
|
66
|
+
Fetch[parent: nested].invoke
|
70
67
|
end
|
71
68
|
|
72
69
|
# Stage all files:
|
@@ -82,8 +79,8 @@ module Teapot
|
|
82
79
|
)
|
83
80
|
end
|
84
81
|
|
85
|
-
def generate_project(root,
|
86
|
-
name = ::Build::Name.new(
|
82
|
+
def generate_project(root, name, source, packages)
|
83
|
+
name = ::Build::Name.new(name)
|
87
84
|
|
88
85
|
# Otherwise the initial commit will try to include teapot/
|
89
86
|
File.open(root + ".gitignore", "w") do |output|
|
data/lib/teapot/command/fetch.rb
CHANGED
@@ -18,8 +18,7 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
require_relative 'selection'
|
23
22
|
require 'rugged'
|
24
23
|
|
25
24
|
module Teapot
|
@@ -48,19 +47,21 @@ module Teapot
|
|
48
47
|
|
49
48
|
many :packages, "Only update the specified packages, or all packages if none specified."
|
50
49
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
50
|
+
def context
|
51
|
+
parent.context
|
52
|
+
end
|
53
|
+
|
54
|
+
def invoke
|
56
55
|
selection = context.select
|
57
56
|
|
58
57
|
packages = selection.configuration.packages
|
59
58
|
|
60
|
-
if
|
61
|
-
packages = packages.slice(
|
59
|
+
if specified_packages = self.packages
|
60
|
+
packages = packages.slice(specified_packages)
|
62
61
|
end
|
63
62
|
|
63
|
+
logger = parent.logger
|
64
|
+
|
64
65
|
# If no additional packages were resolved, we have reached a fixed point:
|
65
66
|
while packages.any?
|
66
67
|
packages.each do |package|
|
@@ -78,12 +79,15 @@ module Teapot
|
|
78
79
|
end
|
79
80
|
|
80
81
|
if selection.unresolved.count > 0
|
81
|
-
logger.error
|
82
|
-
|
83
|
-
|
82
|
+
logger.error(self) do |buffer|
|
83
|
+
buffer.puts "Could not fetch all packages!"
|
84
|
+
|
85
|
+
selection.unresolved.each do |package|
|
86
|
+
buffer.puts "\t#{package}"
|
87
|
+
end
|
84
88
|
end
|
85
89
|
else
|
86
|
-
logger.info "Completed fetch successfully."
|
90
|
+
logger.info "Completed fetch successfully."
|
87
91
|
end
|
88
92
|
end
|
89
93
|
|
@@ -99,7 +103,7 @@ module Teapot
|
|
99
103
|
end
|
100
104
|
|
101
105
|
def link_local_package(context, configuration, package, logger)
|
102
|
-
logger.info "Linking local #{package}..."
|
106
|
+
logger.info "Linking local #{package}..." #.color(:cyan)
|
103
107
|
|
104
108
|
local_path = context.root + package.options[:local]
|
105
109
|
|
@@ -120,7 +124,7 @@ module Teapot
|
|
120
124
|
end
|
121
125
|
|
122
126
|
def clone_or_pull_package(context, configuration, package, package_lock, logger)
|
123
|
-
logger.info "Processing #{package}..."
|
127
|
+
logger.info "Processing #{package}..." #.color(:cyan)
|
124
128
|
|
125
129
|
# Where we are going to put the package:
|
126
130
|
destination_path = package.path
|
@@ -141,7 +145,7 @@ module Teapot
|
|
141
145
|
end
|
142
146
|
|
143
147
|
if destination_path.exist?
|
144
|
-
logger.info "Updating package at path #{destination_path}..."
|
148
|
+
logger.info "Updating package at path #{destination_path}..." #.color(:cyan)
|
145
149
|
|
146
150
|
repository = Rugged::Repository.new(destination_path.to_s)
|
147
151
|
|
@@ -166,7 +170,7 @@ module Teapot
|
|
166
170
|
# Reset it to the requested commit if required:
|
167
171
|
repository.reset(commit_id, :hard)
|
168
172
|
else
|
169
|
-
logger.info "Cloning package at path #{destination_path}..."
|
173
|
+
logger.info "Cloning package at path #{destination_path}..." #.color(:cyan)
|
170
174
|
|
171
175
|
external_url = package.external_url(context.root)
|
172
176
|
|