teapot 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTIzOGRjMDQzOGJmOTZmZmE0ODQ0NWU4MzA2YTNiMTJhYWU0YWI4Yg==
4
+ OTU3OWI1OTkxZTUxMGJjY2FhMmVmZTMyNDQ5OGUxNDcwMDcyNjk1Nw==
5
5
  data.tar.gz: !binary |-
6
- NTc4YWMzMjdjNjE4M2I0MWUxMmQxYjBhN2NlMmZiMTgwY2NkYThkNQ==
6
+ ZWVmYzY1OGZjZjkxYzhmNTliOGY1ZjFmZDNiMjBlNTU0OTE4YjkxNw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NTMxYzQ2Mzg3ODAzOTNiYjBhMDkzOTllOGM1NGE3YjUyNDczMzhkNGNlZWIz
10
- MDJhMzUyMDlmNWFhOGM1YzQ3YzBjMDNmNDlhYzVkYjdlNjliOWQ4MzFlZTM5
11
- MDY0M2UwMmQzNDI5MmNkOWE0MWZiMjhlNTJiZTE3MTE3ZTkyMjE=
9
+ YjNmMzFkNGM1NmM2ZGY2ZDE4MDVlNzBlMGZjODExMzU5YzdlNWM3MzEwNjVm
10
+ MmNlZTc0ZDY3MWU0ZDhhYzc4ZTA2NTFmNjU5NjU3ZTdlZTQ5YjkwM2VlZjU0
11
+ YmNkOTM2ZDQ3MWU1NjJjM2I5ZDI0MGYzZDEzMmUyYjE5MWI3MzI=
12
12
  data.tar.gz: !binary |-
13
- OTIxOTIzNWVmZWVhZjMxZDU3OWZlYjk3NzZmOTgwNWE4YzkyYzUyOGNjMGNi
14
- ZDIxNWFkYTAwYzQ1ZWZlYzdmY2I2MzU2M2RlMGU4ZDM2OGRhNmNkMWNjM2Rm
15
- ODlkYzFiOWJhYjE4ZTEwOTliYTQwOTRhNjE3NDRlMzY0NjI5Mzg=
13
+ Y2M1NmI5NTY1Y2ZmYmEyMTlhMjRhYTBkY2Q3OGI4YmRkMzdjYmJmYzUxZjMz
14
+ OTVmOTZjY2JhMmQ1ODQ5ODE0NTM3NmVmY2YzNjc3YzZmZDI2MmE3MzUxYmIx
15
+ OWVlMzU1ZTk5MWI5ZDFlMDMwZTBjOGQzOWI4NjUzZDEzMDQwMGU=
data/README.md CHANGED
@@ -8,6 +8,7 @@ Teapot is a decentralised build tool for managing complex cross-platform project
8
8
  - The build subsystem provides a simple set of canonical operations for building libraries and executables to minimise configuration overhead.
9
9
 
10
10
  [![Build Status](https://secure.travis-ci.org/ioquatix/teapot.png)](http://travis-ci.org/ioquatix/teapot)
11
+ [![Code Climate](https://codeclimate.com/github/ioquatix/teapot.png)](https://codeclimate.com/github/ioquatix/teapot)
11
12
 
12
13
  ## Installation
13
14
 
data/bin/teapot CHANGED
@@ -28,15 +28,20 @@ require 'teapot/controller/fetch'
28
28
  require 'teapot/controller/generate'
29
29
  require 'teapot/controller/list'
30
30
  require 'teapot/controller/run'
31
+ require 'teapot/repository'
31
32
 
32
33
  require 'time'
33
34
  require 'trollop'
34
35
 
35
36
  OPTIONS = Trollop::options do
37
+ version "teapot v#{Teapot::VERSION}"
38
+
36
39
  opt :only, "Only compiled direct dependencies."
37
40
  opt :in, "Work in the given directory.", :type => :string
38
41
  opt :unlock, "Don't use package lockfile when fetching."
39
42
 
43
+ opt :force, "Force the operation if it would otherwise be be stopped due to a warning."
44
+
40
45
  opt :configuration, "Specify a specific build configuration.", :type => :string
41
46
  end
42
47
 
@@ -82,16 +87,14 @@ module Application
82
87
  # Make the path:
83
88
  root.mkpath
84
89
 
85
- Dir.chdir(root) do
86
- Teapot::Commands.run("git", "init")
87
- end
90
+ Teapot::Repository.new(root).init!
88
91
 
89
92
  make_controller(root).create(project_name, source, packages)
90
93
  end
91
94
 
92
95
  def self.generate(arguments = ARGV)
93
96
  generator_name = arguments.shift
94
- make_controller.generate(generator_name, arguments)
97
+ make_controller.generate(generator_name, arguments, OPTIONS[:force])
95
98
  end
96
99
  end
97
100
 
@@ -25,7 +25,7 @@ module Teapot
25
25
  module Linker
26
26
  class UnsupportedPlatform < StandardError
27
27
  end
28
-
28
+
29
29
  def self.link_static(environment, library_file, objects)
30
30
  if RUBY_PLATFORM =~ /darwin/
31
31
  Commands.run(
@@ -33,6 +33,8 @@ module Teapot
33
33
  "-static", "-o", library_file, objects,
34
34
  )
35
35
  elsif RUBY_PLATFORM =~ /linux/
36
+ FileUtils.rm_rf library_file
37
+
36
38
  Commands.run(
37
39
  environment[:ar] || 'ar',
38
40
  environment[:arflags] || "-cru",
@@ -22,6 +22,7 @@ require 'set'
22
22
  require 'rainbow'
23
23
  require 'shellwords'
24
24
  require 'facter'
25
+ require 'rexec/task'
25
26
 
26
27
  module Teapot
27
28
  module Commands
@@ -50,23 +51,25 @@ module Teapot
50
51
  Shellwords.split(arg || "")
51
52
  end
52
53
 
53
- def self.run(*args)
54
+ def self.run(*args, &block)
55
+ options = Hash === args.last ? args.pop : {}
56
+ options[:passthrough] ||= :all
57
+
54
58
  args = args.flatten.collect &:to_s
55
59
 
56
- # Ensure we aren't invoking the shell
57
- args[0] = [args[0], args[0]]
60
+ puts args.join(' ').color(:blue) + " in #{options[:chdir] || Dir.getwd}"
58
61
 
59
- puts args.join(' ').color(:blue)
62
+ task = RExec::Task.open(args, options, &block)
60
63
 
61
- if system(*args)
64
+ if task.wait == 0
62
65
  true
63
66
  else
64
67
  raise CommandError.new("Non-zero exit status: #{args.join(' ')}!")
65
68
  end
66
69
  end
67
70
 
68
- def self.run!(*args)
69
- run(*args)
71
+ def self.run!(*args, &block)
72
+ run(*args, &block)
70
73
  rescue CommandError
71
74
  false
72
75
  end
@@ -35,6 +35,10 @@ module Teapot
35
35
 
36
36
  output.puts "required_version #{VERSION.dump}", ''
37
37
 
38
+ output.puts "\# Build Targets", ''
39
+
40
+ output.puts "\# Configurations", ''
41
+
38
42
  output.puts "define_configuration #{name.target.dump} do |configuration|"
39
43
 
40
44
  output.puts "\tconfiguration[:source] = #{source.dump}", ''
@@ -43,7 +47,7 @@ module Teapot
43
47
  output.puts "\tconfiguration.import! #{name.dump}"
44
48
  end
45
49
 
46
- output.puts "end"
50
+ output.puts "end", ''
47
51
  end
48
52
 
49
53
  # Fetch all packages:
@@ -57,7 +61,7 @@ module Teapot
57
61
 
58
62
  def generate_project(project_name)
59
63
  if context.generators.key? 'project'
60
- generate('project', [project_name])
64
+ generate('project', [project_name], true)
61
65
  end
62
66
  end
63
67
  end
@@ -19,6 +19,7 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  require 'teapot/controller'
22
+ require 'teapot/repository'
22
23
 
23
24
  module Teapot
24
25
  class Controller
@@ -108,51 +109,25 @@ module Teapot
108
109
  branch = package_lock[:branch]
109
110
  end
110
111
 
112
+ commit = package_lock ? package_lock[:commit] : nil
113
+
111
114
  unless destination_path.exist?
112
115
  log "Cloning package at path #{destination_path} ...".color(:cyan)
113
116
 
114
117
  begin
115
- destination_path.mkpath
116
-
117
118
  external_url = package.external_url(context.root)
118
119
 
119
- Commands.run("git", "clone", external_url, destination_path, "--branch", branch)
120
-
121
- Dir.chdir(destination_path) do
122
- # Checkout the specific version if it was given:
123
- if package_lock
124
- Commands.run("git", "reset", "--hard", package_lock[:commit])
125
- end
126
-
127
- Commands.run("git", "submodule", "update", "--init", "--recursive")
128
- end
120
+ Repository.new(destination_path).clone!(external_url, branch, commit)
129
121
  rescue
130
- log "Removing incomplete package at path #{destination_path}...".color(:red)
131
-
132
- # Clean up if the git checkout process is interrupted:
133
- destination_path.rmtree
134
-
122
+ log "Failed to clone #{external_url}...".color(:red)
123
+
135
124
  raise
136
125
  end
137
126
  else
138
127
  log "Updating package at path #{destination_path} ...".color(:cyan)
139
128
 
140
- Dir.chdir(destination_path) do
141
- Commands.run("git", "fetch", "origin")
142
-
143
- Commands.run("git", "checkout", branch)
144
-
145
- # Pull any changes, if you might get the error from above:
146
- # Your branch is behind 'origin/0.1' by 1 commit, and can be fast-forwarded.
147
- Commands.run("git", "pull")
148
-
149
- # Checkout the specific version if it was given:
150
- if package_lock
151
- Commands.run("git", "reset", "--hard", package_lock[:commit])
152
- end
153
-
154
- Commands.run("git", "submodule", "update", "--init", "--recursive")
155
- end
129
+ commit = package_lock ? package_lock[:commit] : nil
130
+ Repository.new(destination_path).update(branch, commit)
156
131
  end
157
132
 
158
133
  # Lock the package, unless it was already locked:
@@ -22,9 +22,16 @@ require 'teapot/controller'
22
22
 
23
23
  module Teapot
24
24
  class Controller
25
- def generate(name, arguments)
25
+ def generate(name, arguments, force = false)
26
26
  context.configuration.load_all
27
27
 
28
+ unless force
29
+ # Check dirty status of local repository:
30
+ if Repository.new(@root).status.size != 0
31
+ abort "You have unstaged changes/unadded files. Please stash/commit them before running the generator.".color(:red)
32
+ end
33
+ end
34
+
28
35
  generator = context.generators[name]
29
36
 
30
37
  unless generator
@@ -97,17 +97,34 @@ module Teapot
97
97
  end
98
98
  end
99
99
 
100
+ def is_binary(path)
101
+ if path.exist?
102
+ return path.read(1024).bytes.find{|byte| byte >= 0 and byte <= 6}
103
+ else
104
+ return false
105
+ end
106
+ end
107
+
108
+ def copy_binary(source_path, destination_path)
109
+ destination_path.dirname.mkpath
110
+ FileUtils.cp source_path, destination_path
111
+ end
112
+
100
113
  def copy(source, destination, substitutions = nil)
101
114
  source_path = Pathname(path) + source
115
+ destination_path = Pathname(context.root) + destination
102
116
 
103
117
  if source_path.directory?
104
- destination_path = Pathname(context.root) + destination
105
-
106
118
  source_path.children(false).each do |child_path|
107
119
  copy(source_path + child_path, destination_path + substitute(child_path.to_s, substitutions), substitutions)
108
120
  end
109
121
  else
110
- merge(source_path, destination, substitutions)
122
+ if is_binary(source_path) or is_binary(destination)
123
+ destination_path = Pathname(context.root) + destination
124
+ copy_binary(source_path, destination_path)
125
+ else
126
+ merge(source_path, destination, substitutions)
127
+ end
111
128
  end
112
129
  end
113
130
  end
@@ -37,5 +37,9 @@ module Teapot
37
37
  def macro(prefix = [])
38
38
  (Array(prefix) + [@text]).collect{|name| name.upcase.gsub(/\s+/, '_')}.join('_')
39
39
  end
40
+
41
+ def header_guard(path)
42
+ macro(path) + '_H'
43
+ end
40
44
  end
41
45
  end
@@ -0,0 +1,106 @@
1
+ # Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'teapot/commands'
22
+
23
+ module Teapot
24
+ module Git
25
+ class Repository
26
+ def initialize(root, options = {})
27
+ @root = root
28
+ @options = options
29
+ end
30
+
31
+ def init!
32
+ run!("init", @root)
33
+ end
34
+
35
+ def clone!(remote_url, branch = nil, commit = nil)
36
+ branch_args = branch ? ["--branch", branch] : []
37
+
38
+ @root.mkpath
39
+
40
+ run!("clone", remote_url, @root, *branch_args)
41
+
42
+ if commit
43
+ run("reset", "--hard", commit)
44
+ end
45
+
46
+ run("submodule", "update", "--init", "--recursive")
47
+ rescue
48
+ #@root.rmtree
49
+
50
+ raise
51
+ end
52
+
53
+ def update(branch, commit = nil)
54
+ run("fetch", "origin")
55
+ run("checkout", branch)
56
+
57
+ # Pull any changes, if you might get the error from above:
58
+ # Your branch is behind 'origin/0.1' by 1 commit, and can be fast-forwarded.
59
+ run("pull")
60
+
61
+ # Checkout the specific version if it was given:
62
+ if commit
63
+ run("reset", "--hard", commit)
64
+ end
65
+
66
+ run("submodule", "update", "--init", "--recursive")
67
+ end
68
+
69
+ def add(files)
70
+ if files == :all
71
+ run("add", "--all")
72
+ else
73
+ run("add", *files)
74
+ end
75
+ end
76
+
77
+ def commit(message)
78
+ run("commit", "-m", message)
79
+ end
80
+
81
+ def status
82
+ Commands.run("git", "status", "--porcelain", :passthrough => [:in, :err]) do |task|
83
+ if task.wait == 0
84
+ return task.output.readlines.collect{|line| line.chomp.split(/\s+/, 2)}
85
+ end
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ def run(*args)
92
+ Commands.run("git", *args, :chdir => @root)
93
+ end
94
+
95
+ def run!(*args)
96
+ Commands.run("git", *args)
97
+ end
98
+ end
99
+ end
100
+
101
+ module Repository
102
+ def self.new(*args)
103
+ Git::Repository.new(*args)
104
+ end
105
+ end
106
+ end
@@ -52,8 +52,8 @@ module Teapot
52
52
  end
53
53
 
54
54
  class Substitutions
55
- def initialize
56
- @ordered = []
55
+ def initialize(ordered = [])
56
+ @ordered = ordered
57
57
  end
58
58
 
59
59
  def []= keyword, value
@@ -69,6 +69,10 @@ module Teapot
69
69
  @ordered << substition
70
70
  end
71
71
 
72
+ def + other
73
+ Substitutions.new(@ordered + other.ordered)
74
+ end
75
+
72
76
  attr :ordered
73
77
 
74
78
  def call(text)
@@ -198,5 +202,22 @@ module Teapot
198
202
  return text
199
203
  end
200
204
  end
205
+
206
+ # Create a set of substitutions from the given context which includes a set of useful defaults.
207
+ def self.for_context(context)
208
+ substitutions = self.new
209
+
210
+ # The user's current name:
211
+ substitutions['AUTHOR_NAME'] = `git config --global user.name`.chomp
212
+
213
+ substitutions['PROJECT_NAME'] = context.project.name
214
+ substitutions['LICENSE'] = context.project.license
215
+
216
+ current_date = Time.new
217
+ substitutions['DATE'] = current_date.strftime("%-d/%-m/%Y")
218
+ substitutions['YEAR'] = current_date.strftime("%Y")
219
+
220
+ return substitutions
221
+ end
201
222
  end
202
223
  end
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Teapot
22
- VERSION = "0.9.0"
22
+ VERSION = "0.9.1"
23
23
  end
@@ -14,7 +14,7 @@ Gem::Specification.new do |gem|
14
14
  the infusions ecosystem of packages and platform tooling.
15
15
  EOF
16
16
  gem.summary = %q{Teapot is a tool for managing complex cross-platform builds.}
17
- gem.homepage = ""
17
+ gem.homepage = "http://www.kyusu.org"
18
18
 
19
19
  gem.files = `git ls-files`.split($/)
20
20
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teapot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-15 00:00:00.000000000 Z
11
+ date: 2013-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rainbow
@@ -124,6 +124,7 @@ files:
124
124
  - lib/teapot/name.rb
125
125
  - lib/teapot/package.rb
126
126
  - lib/teapot/project.rb
127
+ - lib/teapot/repository.rb
127
128
  - lib/teapot/substitutions.rb
128
129
  - lib/teapot/target.rb
129
130
  - lib/teapot/version.rb
@@ -133,7 +134,7 @@ files:
133
134
  - test/test_environment.rb
134
135
  - test/test_substitutions.rb
135
136
  - test/test_teapot.rb
136
- homepage: ''
137
+ homepage: http://www.kyusu.org
137
138
  licenses: []
138
139
  metadata: {}
139
140
  post_install_message: