alpacabuildtool 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +48 -0
- data/.rubocop.yml +12 -0
- data/.semver +6 -0
- data/.travis.yml +10 -0
- data/CHANGELOG +18 -0
- data/Gemfile +7 -0
- data/LICENSE +22 -0
- data/README.md +235 -0
- data/README.rdoc +39 -0
- data/Rakefile +74 -0
- data/alpacabuildtool.gemspec +34 -0
- data/alpacabuildtool.rdoc +5 -0
- data/alpacabuildtool.todo +9 -0
- data/bin/alpaca +142 -0
- data/features/alpaca.feature +8 -0
- data/features/step_definitions/alpaca_steps.rb +13 -0
- data/features/step_definitions/visual_studio_solutions_steps.rb +47 -0
- data/features/support/env.rb +10 -0
- data/features/visual_studio_solutions.feature +43 -0
- data/lib/alpacabuildtool.rb +4 -0
- data/lib/alpacabuildtool/application.rb +195 -0
- data/lib/alpacabuildtool/configuration.rb +209 -0
- data/lib/alpacabuildtool/data/.alpaca.conf +148 -0
- data/lib/alpacabuildtool/data/doom.flf +826 -0
- data/lib/alpacabuildtool/data/logo.jpg +0 -0
- data/lib/alpacabuildtool/entities/nuspec.rb +107 -0
- data/lib/alpacabuildtool/entities/project.rb +54 -0
- data/lib/alpacabuildtool/entities/solution.rb +104 -0
- data/lib/alpacabuildtool/entities/xml.rb +41 -0
- data/lib/alpacabuildtool/entities/xml_node.rb +75 -0
- data/lib/alpacabuildtool/log/font.rb +92 -0
- data/lib/alpacabuildtool/log/log.rb +15 -0
- data/lib/alpacabuildtool/log/rainbowify_formatter.rb +70 -0
- data/lib/alpacabuildtool/log/rainbowify_logger.rb +47 -0
- data/lib/alpacabuildtool/managers/build_manager.rb +32 -0
- data/lib/alpacabuildtool/managers/package_manager.rb +136 -0
- data/lib/alpacabuildtool/managers/report_manager.rb +33 -0
- data/lib/alpacabuildtool/managers/test_manager.rb +35 -0
- data/lib/alpacabuildtool/os.rb +29 -0
- data/lib/alpacabuildtool/package_types/project_package.rb +44 -0
- data/lib/alpacabuildtool/package_types/tool_package.rb +53 -0
- data/lib/alpacabuildtool/tools/git.rb +22 -0
- data/lib/alpacabuildtool/tools/msbuild.rb +29 -0
- data/lib/alpacabuildtool/tools/nuget.rb +49 -0
- data/lib/alpacabuildtool/tools/nunit.rb +28 -0
- data/lib/alpacabuildtool/tools/nunit_orange.rb +18 -0
- data/lib/alpacabuildtool/tools/open_cover.rb +29 -0
- data/lib/alpacabuildtool/tools/report_generator.rb +25 -0
- data/lib/alpacabuildtool/tools/tool.rb +84 -0
- data/lib/alpacabuildtool/tools/wrapper.rb +66 -0
- data/lib/alpacabuildtool/versioning/version.rb +163 -0
- data/lib/alpacabuildtool/versioning/versioning.rb +84 -0
- data/spec/lib/alpacabuildtool/configuration_spec.rb +201 -0
- data/spec/lib/alpacabuildtool/entities/xml_spec.rb +39 -0
- data/spec/lib/alpacabuildtool/versioning/version_spec.rb +86 -0
- data/spec/lib/alpacabuildtool/versioning/versioning_spec.rb +194 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/support/coverage.rb +26 -0
- data/test_data/sln1/.alpaca.conf +11 -0
- data/test_data/sln1/.semver +6 -0
- data/test_data/sln1/TestSolution.sln +22 -0
- data/test_data/sln1/TestSolution/App.config +6 -0
- data/test_data/sln1/TestSolution/Program.cs +16 -0
- data/test_data/sln1/TestSolution/Properties/AssemblyInfo.cs +36 -0
- data/test_data/sln1/TestSolution/TestSolution.csproj +59 -0
- data/test_data/sln2/.alpaca.conf +8 -0
- data/test_data/sln2/.semver +6 -0
- data/test_data/sln2/ProjectName/ProjectName.csproj +54 -0
- data/test_data/sln2/ProjectName/Properties/AssemblyInfo.cs +36 -0
- data/test_data/sln2/ProjectName/SomeFolderInProject/SomeClass.cs +16 -0
- data/test_data/sln2/ProjectName2/ProjectName2.csproj +58 -0
- data/test_data/sln2/ProjectName2/Properties/AssemblyInfo.cs +37 -0
- data/test_data/sln2/SolutionName.sln +34 -0
- data/test_data/sln2/Unit.Tests/Properties/AssemblyInfo.cs +36 -0
- data/test_data/sln2/Unit.Tests/SomeClassTests.cs +21 -0
- data/test_data/sln2/Unit.Tests/Unit.Tests.csproj +65 -0
- data/test_data/sln2/Unit.Tests/packages.config +4 -0
- data/test_data/sln3/TestSolution.nobuild.sln +22 -0
- data/test_data/sln3/TestSolution/App.config +6 -0
- data/test_data/sln3/TestSolution/Program.cs +16 -0
- data/test_data/sln3/TestSolution/Properties/AssemblyInfo.cs +36 -0
- data/test_data/sln3/TestSolution/TestSolution.nobuild.csproj +59 -0
- metadata +309 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'alpacabuildtool/versioning/versioning'
|
4
|
+
version = ((AlpacaBuildTool::Versioning.find).to_s '%M.%m.%p%s').gsub('-', '.')
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'alpacabuildtool'
|
8
|
+
s.version = version
|
9
|
+
s.author = 'Vasyl Purchel'
|
10
|
+
s.email = 'vasyl.purchel@gmail.com'
|
11
|
+
s.homepage = 'https://github.com/vasyl-purchel/alpaca'
|
12
|
+
s.license = 'MIT'
|
13
|
+
s.platform = Gem::Platform::RUBY
|
14
|
+
s.summary = 'yet another build tool for Visual Studio solutions'
|
15
|
+
s.files = `git ls-files -z`.split("\x0")
|
16
|
+
s.test_files = s.files.grep(/^(test|spec|features|test_data)/)
|
17
|
+
s.require_paths << 'lib'
|
18
|
+
s.has_rdoc = true
|
19
|
+
s.extra_rdoc_files = ['README.rdoc', 'alpacabuildtool.rdoc']
|
20
|
+
s.rdoc_options << '--title' << 'AlpacaBuildTool'
|
21
|
+
s.rdoc_options << '--main' << 'README.rdoc' << '-ri'
|
22
|
+
s.bindir = 'bin'
|
23
|
+
s.executables << 'alpaca'
|
24
|
+
s.add_development_dependency('rake')
|
25
|
+
s.add_development_dependency('rdoc')
|
26
|
+
s.add_development_dependency('cucumber', '~> 2.0.0')
|
27
|
+
s.add_development_dependency('rspec', '~> 3.2.0')
|
28
|
+
s.add_development_dependency('fakefs')
|
29
|
+
s.add_development_dependency('rubocop', '~> 0.30.1')
|
30
|
+
s.add_development_dependency('bundler', '~> 1.6')
|
31
|
+
s.add_development_dependency('simplecov', '~> 0.7')
|
32
|
+
s.add_runtime_dependency('gli', '2.13.0')
|
33
|
+
s.add_runtime_dependency('rainbow')
|
34
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
tasks:
|
2
|
+
☐ decouple from tools (configure test_tool with formatter type, parameters
|
3
|
+
and so on from configs instead of NUnit class)
|
4
|
+
☐ add nunit tests categories (not types like unit, service, ...
|
5
|
+
but MetaTestsAttribute, CoreTestsAttribute...)
|
6
|
+
☐ add service tests running:
|
7
|
+
☐ eval 'service_tests_script' to update service configuration
|
8
|
+
☐ run 'exe' in child process
|
9
|
+
☐ run 'service' type project tests
|
data/bin/alpaca
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gli'
|
3
|
+
require 'alpacabuildtool'
|
4
|
+
|
5
|
+
module AlpacaBuildTool
|
6
|
+
##
|
7
|
+
# The *GliWrapper* module provides command line interface by using GLI::App
|
8
|
+
module GliWrapper
|
9
|
+
include GLI::App
|
10
|
+
extend self
|
11
|
+
|
12
|
+
program_desc 'is a build tool for Visual Studio solutions'
|
13
|
+
subcommand_option_handling :normal
|
14
|
+
arguments :strict
|
15
|
+
gem_path = File.join(File.expand_path(File.dirname(__FILE__)), '..')
|
16
|
+
version Versioning.parse(File.join(gem_path, '.semver')).to_s
|
17
|
+
|
18
|
+
on_error do |exception|
|
19
|
+
puts exception.backtrace if ENV['DEV'] == 'true'
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
desc 'Solutions search pattern'
|
24
|
+
default_value '**/*.sln'
|
25
|
+
flag [:p, :pattern]
|
26
|
+
|
27
|
+
desc 'Compile solution[s]'
|
28
|
+
long_desc 'Compiling each solution founded from pattern in global options'
|
29
|
+
command :compile do |command|
|
30
|
+
command.desc 'Build solution in Debug mode'
|
31
|
+
command.switch :d, :debug
|
32
|
+
|
33
|
+
command.desc 'Update project versions'
|
34
|
+
command.switch :u, :update
|
35
|
+
|
36
|
+
command.action do |global, options, _|
|
37
|
+
Application.new.compile(global[:p],
|
38
|
+
debug: options[:d] || false,
|
39
|
+
update_version: options[:u] || false)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
desc 'Test solution[s]'
|
44
|
+
long_desc 'Testing each solution founded from pattern in global options'
|
45
|
+
command :test do |command|
|
46
|
+
command.desc 'Test solution in Debug mode'
|
47
|
+
command.switch :d, :debug, negatable: false
|
48
|
+
|
49
|
+
command.desc 'Run tests with coverage'
|
50
|
+
command.switch [:c, :coverage]
|
51
|
+
|
52
|
+
command.desc 'Test type'
|
53
|
+
command.default_value 'all'
|
54
|
+
command.flag :t, :type
|
55
|
+
|
56
|
+
command.action do |global, options, _|
|
57
|
+
Application.new.test(global[:p],
|
58
|
+
debug: options[:d] || false,
|
59
|
+
coverage: options[:c] || false,
|
60
|
+
type: options[:t])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc 'Generate reports for solution[s]'
|
65
|
+
long_desc 'Generate reports for all founded results for solutions'
|
66
|
+
command :report do |command|
|
67
|
+
command.desc 'Report category'
|
68
|
+
command.default_value 'all'
|
69
|
+
command.flag :t, :type
|
70
|
+
|
71
|
+
command.action do |global, options, _|
|
72
|
+
Application.new.report(global[:p], type: options[:t])
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
desc 'Create packages for solution[s]'
|
77
|
+
long_desc 'Create new packages for solutions'
|
78
|
+
command :pack do |command|
|
79
|
+
command.desc 'Pack package in Debug mode'
|
80
|
+
command.switch :d, :debug, negatable: false, default_value: false
|
81
|
+
|
82
|
+
command.desc 'Push package after it created if it contains changes'
|
83
|
+
command.switch :p, :push, default_value: false
|
84
|
+
|
85
|
+
command.desc 'Force push package after it created'
|
86
|
+
command.switch :f, :force, default_value: false
|
87
|
+
|
88
|
+
command.action do |global, options, _|
|
89
|
+
Application.new.package(global[:p], options)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
desc 'Release packages for solution[s]'
|
94
|
+
long_desc 'Update package to release version and push it'
|
95
|
+
command :release do |command|
|
96
|
+
command.desc 'Push to the source after released'
|
97
|
+
command.switch :p, :push, default_value: true
|
98
|
+
|
99
|
+
command.desc 'Force push package after it created'
|
100
|
+
command.switch :f, :force, default_value: false
|
101
|
+
|
102
|
+
command.action do |global, options, _|
|
103
|
+
Application.new.release(global[:p], options)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
desc 'Update solution[s] versions'
|
108
|
+
long_desc 'Update version for each solution'
|
109
|
+
command :update do |command|
|
110
|
+
command.desc 'Version dimension to be updated(patch, minor..)'
|
111
|
+
command.default_value 'patch'
|
112
|
+
command.flag :d, :dimension
|
113
|
+
|
114
|
+
command.action do |global, options, _|
|
115
|
+
Application.new.update(global[:p], options)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
desc 'Configure alpaca to your needs'
|
120
|
+
long_desc 'Save configuration into local/global conf files
|
121
|
+
for further usage'
|
122
|
+
command :configure do |command|
|
123
|
+
command.desc 'configure solution[s] from global pattern'
|
124
|
+
command.arg_name 'node1.node2.property=value', :multiple
|
125
|
+
command.command :local do |subcommand|
|
126
|
+
subcommand.action do |global, _, arguments|
|
127
|
+
Application.new.configure_local(global[:p], arguments)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
command.desc 'configure alpaca in user wide sence'
|
132
|
+
command.arg_name 'node1.node2.property=value', :multiple
|
133
|
+
command.command :global do |subcommand|
|
134
|
+
subcommand.action do |_, _, arguments|
|
135
|
+
Application.new.configure_global(arguments)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
exit AlpacaBuildTool::GliWrapper.run(ARGV)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
When(/^I run "(.*?)"$/) do |command_line|
|
2
|
+
call = "#{prefix}#{command_line}"
|
3
|
+
@call_result = `#{call}`
|
4
|
+
end
|
5
|
+
|
6
|
+
When(/I get help for "(.*)"/) do |app_name|
|
7
|
+
@app_name = app_name
|
8
|
+
step %(I run "#{@app_name} help")
|
9
|
+
end
|
10
|
+
|
11
|
+
Then(/the exit status should be (.*)/) do |status|
|
12
|
+
expect($CHILD_STATUS.to_i).to eq status.to_i
|
13
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
Then(/^alpaca build file (.*?)$/) do |project_file|
|
2
|
+
proj = File.basename(project_file, '.*')
|
3
|
+
build_project = /#{proj} -> (.*?)\\#{project_file}/
|
4
|
+
expect(@call_result.match(build_project)).to_not be nil
|
5
|
+
end
|
6
|
+
|
7
|
+
Then(/^alpaca do not build file (.*?)$/) do |project_file|
|
8
|
+
proj = File.basename(project_file, '.*')
|
9
|
+
build_project = /#{proj} -> (.*?)\\#{project_file}/
|
10
|
+
expect(@call_result.match(build_project)).to be nil
|
11
|
+
end
|
12
|
+
|
13
|
+
Then(/^alpaca restore nuget packages for (.*?)$/) do |solution_file|
|
14
|
+
solution_dir = File.dirname(File.expand_path(solution_file))
|
15
|
+
nuget_call = /Nuget.exe restore #{File.expand_path(solution_file)}/
|
16
|
+
expect(@call_result.match(nuget_call)).to_not be nil
|
17
|
+
expect(Dir.glob(solution_dir + '/packages/*').count).to be > 0
|
18
|
+
end
|
19
|
+
|
20
|
+
Then(/^solution has failing unit test$/) do
|
21
|
+
# nothing to do here as there is failing unit test in solution 2
|
22
|
+
# step is used only as a marker in reports
|
23
|
+
end
|
24
|
+
|
25
|
+
Then(/^alpaca generate unit test results (.*?)$/) do |results_file|
|
26
|
+
expect(File.exist?(results_file)).to be true
|
27
|
+
end
|
28
|
+
|
29
|
+
Then(/^alpaca generate test coverage summary (.*?)$/) do |summary_file|
|
30
|
+
expect(File.exist?(summary_file)).to be true
|
31
|
+
end
|
32
|
+
|
33
|
+
Then(/^alpaca generate unit tests report (.*?)$/) do |report_file|
|
34
|
+
expect(File.exist?(report_file)).to be true
|
35
|
+
end
|
36
|
+
|
37
|
+
Then(/^alpaca generate coverage report (.*?)$/) do |index_file|
|
38
|
+
expect(File.exist?(index_file)).to be true
|
39
|
+
end
|
40
|
+
|
41
|
+
Then(/^alpaca creates (.*?)$/) do |package_file|
|
42
|
+
expect(File.exist?(package_file)).to be true
|
43
|
+
end
|
44
|
+
|
45
|
+
AfterStep('@teardown_changes') do
|
46
|
+
`git stash save --keep-index --include-untracked`
|
47
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
@windows
|
2
|
+
Feature: Alpaca can work with Visual Studio solutions
|
3
|
+
In order to work with visual studio solutions I need to be sure
|
4
|
+
that alpaca can be used as a build tool for them
|
5
|
+
|
6
|
+
Scenario: Alpaca compile solution
|
7
|
+
When I run "alpaca compile"
|
8
|
+
And alpaca build file TestSolution.exe
|
9
|
+
And alpaca do not build file TestSolution.nobuild.exe
|
10
|
+
And alpaca restore nuget packages for test_data/sln2/SolutionName.sln
|
11
|
+
And alpaca build file ProjectName.dll
|
12
|
+
And alpaca build file ProjectName2.dll
|
13
|
+
And the exit status should be 0
|
14
|
+
|
15
|
+
Scenario: Alpaca test solution
|
16
|
+
When I run "alpaca test"
|
17
|
+
And solution has failing unit test
|
18
|
+
Then the exit status should be 256
|
19
|
+
|
20
|
+
Scenario: Alpaca test with coverage solution
|
21
|
+
When I run "alpaca test -c"
|
22
|
+
Then alpaca generate unit test results test_data/sln2/.tests/UnitTestsResult.xml
|
23
|
+
And alpaca generate test coverage summary test_data/sln2/.tests/coverage.xml
|
24
|
+
And the exit status should be 0
|
25
|
+
|
26
|
+
Scenario: Alpaca report tests results
|
27
|
+
When I run "alpaca report"
|
28
|
+
Then alpaca generate unit tests report test_data/sln2/.tests/UnitTestsResult.html
|
29
|
+
Then alpaca generate coverage report test_data/sln2/.tests/index.htm
|
30
|
+
|
31
|
+
Scenario: Alpaca pack solution
|
32
|
+
When I run "alpaca pack"
|
33
|
+
Then alpaca creates test_data/sln1/.output/TestData.FirstSolution.0.0.1-alpha.nupkg
|
34
|
+
Then alpaca creates test_data/sln1/.output/TestData.FirstSolution.0.0.1-alpha.symbols.nupkg
|
35
|
+
And alpaca creates test_data/sln2/.output/TestData.SecondSolution.2.0.11.nupkg
|
36
|
+
And alpaca creates test_data/sln2/.output/TestData.SecondSolution.2.0.11.symbols.nupkg
|
37
|
+
And the exit status should be 0
|
38
|
+
|
39
|
+
@teardown_changes
|
40
|
+
Scenario: Alpaca release package
|
41
|
+
When I run "alpaca -p '**/TestSolution.sln' release --no-push"
|
42
|
+
Then alpaca creates test_data/sln1/.output/TestData.FirstSolution.0.0.1.nupkg
|
43
|
+
And the exit status should be 0
|
@@ -0,0 +1,195 @@
|
|
1
|
+
require 'alpacabuildtool/log/log'
|
2
|
+
require 'alpacabuildtool/entities/solution'
|
3
|
+
require 'alpacabuildtool/managers/build_manager'
|
4
|
+
require 'alpacabuildtool/managers/package_manager'
|
5
|
+
require 'alpacabuildtool/managers/test_manager'
|
6
|
+
require 'alpacabuildtool/managers/report_manager'
|
7
|
+
|
8
|
+
module AlpacaBuildTool
|
9
|
+
##
|
10
|
+
# Application is a main entry point for CLI
|
11
|
+
class Application
|
12
|
+
include Log
|
13
|
+
|
14
|
+
##
|
15
|
+
# Compiles solution [s]
|
16
|
+
#
|
17
|
+
# +pattern+:: pattern for solutions search
|
18
|
+
# +options+:: hash with compilation options
|
19
|
+
# <tt>options[:debug] = true</tt> is to compile solution in debug mode<br>
|
20
|
+
# <tt>options[:update_version] = true</tt> is to update project versions
|
21
|
+
# before compiling
|
22
|
+
#
|
23
|
+
# app.compile('**/*.sln', debug: true, update_version: true)
|
24
|
+
# # => building found solutions in debug mode
|
25
|
+
# # with updating project versions
|
26
|
+
def compile(pattern, options)
|
27
|
+
log.header 'Compile'
|
28
|
+
each_solution(pattern) do |solution|
|
29
|
+
build_manager = BuildManager.new(solution)
|
30
|
+
build_manager.build(options[:debug], options[:update_version])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Run tests for solution [s]
|
36
|
+
#
|
37
|
+
# +pattern+:: pattern for solutions search
|
38
|
+
# +options+:: hash with testing options
|
39
|
+
# <tt>options[:debug] = true</tt> is to run tests in debug mode<br>
|
40
|
+
# <tt>options[:coverage] = true</tt> is to run coverage<br>
|
41
|
+
# <tt>options[:type] = 'all'</tt> is to run 'all' test types
|
42
|
+
# ('all', 'unit', 'service')
|
43
|
+
#
|
44
|
+
# app.test('**/*.sln', coverage: true, type: 'unit')
|
45
|
+
# # => running unit tests with coverage
|
46
|
+
def test(pattern, options)
|
47
|
+
log.header 'Test'
|
48
|
+
each_solution(pattern) do |solution|
|
49
|
+
test_projects = solution.specific_projects(options[:type])
|
50
|
+
next log.info 'no tests discovered' if test_projects.empty?
|
51
|
+
test_manager = TestManager.new(solution)
|
52
|
+
test_manager.test(test_projects, options[:coverage], options[:debug])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Convert test results into reports for solution [s]
|
58
|
+
#
|
59
|
+
# +pattern+:: pattern for solutions search
|
60
|
+
# +options+:: hash with reporting options
|
61
|
+
# <tt>options[:type] = 'all'</tt> is to convert 'all' results into reports
|
62
|
+
# ('all', 'tests', 'coverage')
|
63
|
+
#
|
64
|
+
# app.report('**/*.sln', type: 'coverage')
|
65
|
+
# # => converting coverage results into html reports
|
66
|
+
def report(pattern, options)
|
67
|
+
log.header 'Report'
|
68
|
+
each_solution(pattern) do |solution|
|
69
|
+
report_manager = ReportManager.new(solution)
|
70
|
+
report_manager.convert(options[:type])
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
##
|
75
|
+
# Create packages for solution [s]
|
76
|
+
#
|
77
|
+
# +pattern+:: pattern for solutions search
|
78
|
+
# +options+:: hash with packaging options
|
79
|
+
# <tt>options[:debug] = true</tt> is to create packages from debug mode<br\>
|
80
|
+
# <tt>options[:push] = true</tt> is to push packages after they are created
|
81
|
+
# <br\>
|
82
|
+
# <tt>options[:force] = true</tt> is to create/push packages even if it has
|
83
|
+
# no changes
|
84
|
+
#
|
85
|
+
# app.package('**/*.sln')
|
86
|
+
# # => creating only packages with changes in release mode without
|
87
|
+
# # pushing them
|
88
|
+
def package(pattern, options)
|
89
|
+
log.header 'Package'
|
90
|
+
each_solution(pattern) do |solution|
|
91
|
+
version = solution.package_version
|
92
|
+
package_manager = PackageManager.new(solution)
|
93
|
+
(solution.configuration['packages'] || []).each do |package|
|
94
|
+
package_manager.create_package(package, version, options)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
##
|
100
|
+
# Release packages for solution [s]
|
101
|
+
#
|
102
|
+
# Updates .semver file to get release version if it is not release yet
|
103
|
+
# Rebuilds solution and create release package
|
104
|
+
# Changes are checked from last release package
|
105
|
+
#
|
106
|
+
# +pattern+:: pattern for solutions search
|
107
|
+
# +options+:: hash with releasing options
|
108
|
+
# <tt>options[:push] = true</tt> is to push packages after they are created
|
109
|
+
# <br>
|
110
|
+
# <tt>options[:force] = true</tt> is to create/push packages even if it has
|
111
|
+
# no changes
|
112
|
+
#
|
113
|
+
# app.release('**/*.sln')
|
114
|
+
# # => creating only packages with changes without pushing them
|
115
|
+
def release(pattern, options)
|
116
|
+
log.header 'Release'
|
117
|
+
each_solution(pattern) do |solution|
|
118
|
+
semver = Versioning.find(solution.dir)
|
119
|
+
semver.release if semver.prerelease?
|
120
|
+
Versioning.save semver
|
121
|
+
end
|
122
|
+
compile(pattern, debug: false, update_version: true)
|
123
|
+
test(pattern, {})
|
124
|
+
options[:debug] = false
|
125
|
+
package(pattern, options)
|
126
|
+
end
|
127
|
+
|
128
|
+
##
|
129
|
+
# Update .semver files for solution [s]
|
130
|
+
#
|
131
|
+
# +pattern+:: pattern for solutions search
|
132
|
+
# +options+:: hash with releasing options
|
133
|
+
# <tt>options['dimension'] = :patch</tt> is to update version patch
|
134
|
+
# (major, minor, patch, prerelease)
|
135
|
+
#
|
136
|
+
# app.update('**/*.sln', 'dimension' => :minor)
|
137
|
+
# # => increase minor version in .semver by 1
|
138
|
+
def update(pattern, options)
|
139
|
+
log.header 'Update'
|
140
|
+
each_solution(pattern) do |solution|
|
141
|
+
semver = Versioning.find(solution.dir)
|
142
|
+
semver.increase(options['dimension'].to_sym)
|
143
|
+
Versioning.save semver
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
##
|
148
|
+
# Update/create *~/.alpaca.conf*
|
149
|
+
#
|
150
|
+
# +properties+:: array of properties to store in global configuration
|
151
|
+
# in format node1.node2.property=value
|
152
|
+
#
|
153
|
+
# app.configure_global(['hello.world=yay'])
|
154
|
+
# # => produce yaml text in ~/.alpaca.conf:
|
155
|
+
# # hello:
|
156
|
+
# # world: yay
|
157
|
+
def configure_global(properties)
|
158
|
+
log.header 'Configure'
|
159
|
+
Configuration.set(properties)
|
160
|
+
end
|
161
|
+
|
162
|
+
##
|
163
|
+
# Update/create *local configuration*
|
164
|
+
#
|
165
|
+
# +pattern+:: pattern for solutions search
|
166
|
+
# +properties+:: array of properties to store in global configuration
|
167
|
+
# in format node1.node2.property=value
|
168
|
+
#
|
169
|
+
# app.configure_local('**/*.sln', ['hello.world=yay'])
|
170
|
+
# # => produce yaml text in .alpaca.conf for each solution:
|
171
|
+
# # hello:
|
172
|
+
# # world: yay
|
173
|
+
def configure_local(pattern, properties)
|
174
|
+
log.header 'Configure'
|
175
|
+
Solutions.each(pattern) do |solution|
|
176
|
+
log.puts "saving configuration for #{solution.name}"
|
177
|
+
Configuration.new(solution).set(properties)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
private
|
182
|
+
|
183
|
+
def each_solution(pattern)
|
184
|
+
Dir.glob(pattern).each do |file|
|
185
|
+
next unless File.file?(file) && file.end_with?('.sln')
|
186
|
+
solution = Solution.new(file)
|
187
|
+
log.puts solution
|
188
|
+
next log.info 'no build solution' if solution.no_build?
|
189
|
+
Dir.chdir(solution.dir) do
|
190
|
+
yield solution
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|