thor-scmversion 0.0.1
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.
- data/.gitignore +21 -0
- data/Gemfile +3 -0
- data/LICENSE +13 -0
- data/README.md +46 -0
- data/Rakefile +11 -0
- data/Thorfile +6 -0
- data/features/bump.feature +69 -0
- data/features/fixtures/Thorfile +7 -0
- data/features/step_definitions/bump_steps.rb +76 -0
- data/features/support/env.rb +70 -0
- data/lib/thor-scmversion.rb +53 -0
- data/lib/thor-scmversion/git_version.rb +21 -0
- data/lib/thor-scmversion/p4_version.rb +80 -0
- data/lib/thor-scmversion/scm_version.rb +71 -0
- data/lib/thor-scmversion/shell_utils.rb +36 -0
- data/lib/thor-scmversion/version.rb +3 -0
- data/spec/lib/scm_version_spec.rb +27 -0
- data/spec/spec_helper.rb +62 -0
- data/thor-scmversion.gemspec +27 -0
- metadata +176 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright (c) 2012, Riot Games, Inc.
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Thor SCMVersion
|
2
|
+
|
3
|
+
Thor tasks to manage a VERSION file based on SCM tags, for use in continuous delivery
|
4
|
+
pipelines.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'thor-scmversion'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install thor-scmversion
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
And then get a list of your thor tasks
|
23
|
+
|
24
|
+
$ thor list
|
25
|
+
|
26
|
+
version
|
27
|
+
-------
|
28
|
+
thor version:bump TYPE # Bump version number
|
29
|
+
|
30
|
+
Type can be major, minor, or patch.
|
31
|
+
|
32
|
+
## Contributing
|
33
|
+
|
34
|
+
1. Fork it
|
35
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
36
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
37
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
38
|
+
5. Create new Pull Request
|
39
|
+
|
40
|
+
## Contributors
|
41
|
+
|
42
|
+
* Michael Ivey <ivey@gweezlebur.com>
|
43
|
+
* Kyle Allan <kallan@riotgames.com>
|
44
|
+
* Josiah Kiehl <josiah@skirmisher.net>
|
45
|
+
* Based on code developed by Jamie Winsor <jamie@vialstudios.com>
|
46
|
+
* Originally derived from some Bundler internals by Yehuda Katz
|
data/Rakefile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
require 'cucumber'
|
5
|
+
require 'cucumber/rake/task'
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new(:spec)
|
8
|
+
|
9
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
10
|
+
t.cucumber_opts = "--format pretty --tags ~wip"
|
11
|
+
end
|
data/Thorfile
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
Feature: Bump
|
2
|
+
As a user
|
3
|
+
I want to be able to bump the version of a project's with a simple command
|
4
|
+
So that I don't have to do it manually
|
5
|
+
|
6
|
+
Scenario: Bumping a patch version in Git
|
7
|
+
Given I have a git project of version '1.0.0'
|
8
|
+
When I run `bundle exec thor version:bump patch` from the temp directory
|
9
|
+
Then the version should be '1.0.1'
|
10
|
+
And the origin version should be '1.0.1'
|
11
|
+
|
12
|
+
Scenario: Bumping a minor version in Git
|
13
|
+
Given I have a git project of version '1.0.0'
|
14
|
+
When I run `bundle exec thor version:bump minor` from the temp directory
|
15
|
+
Then the version should be '1.1.0'
|
16
|
+
And the origin version should be '1.1.0'
|
17
|
+
|
18
|
+
Scenario: Bumping a major version in Git
|
19
|
+
Given I have a git project of version '1.0.0'
|
20
|
+
When I run `bundle exec thor version:bump major` from the temp directory
|
21
|
+
Then the version should be '2.0.0'
|
22
|
+
And the origin version should be '2.0.0'
|
23
|
+
|
24
|
+
Scenario: Bumping a minor version in Git should reset the patch version
|
25
|
+
Given I have a git project of version '1.1.5'
|
26
|
+
When I run `bundle exec thor version:bump minor` from the temp directory
|
27
|
+
Then the version should be '1.2.0'
|
28
|
+
And the origin version should be '1.2.0'
|
29
|
+
|
30
|
+
Scenario: Bumping a major version in Git should reset the patch and minor versions
|
31
|
+
Given I have a git project of version '1.1.5'
|
32
|
+
When I run `bundle exec thor version:bump major` from the temp directory
|
33
|
+
Then the version should be '2.0.0'
|
34
|
+
And the origin version should be '2.0.0'
|
35
|
+
|
36
|
+
@p4 @wip
|
37
|
+
Scenario: Bumping a patch version in Perforce
|
38
|
+
Given I have a Perforce project of version '1.0.0'
|
39
|
+
When I run `bundle exec thor version:bump patch` from the Perforce project directory
|
40
|
+
Then the version should be '1.0.1' in the Perforce project directory
|
41
|
+
And the p4 server version should be '1.0.1'
|
42
|
+
|
43
|
+
@p4
|
44
|
+
Scenario: Bumping a minor version in Perforce
|
45
|
+
Given I have a Perforce project of version '1.0.0'
|
46
|
+
When I run `bundle exec thor version:bump minor` from the Perforce project directory
|
47
|
+
Then the version should be '1.1.0' in the Perforce project directory
|
48
|
+
And the p4 server version should be '1.1.0'
|
49
|
+
|
50
|
+
@p4
|
51
|
+
Scenario: Bumping a major version in Perforce
|
52
|
+
Given I have a Perforce project of version '1.0.0'
|
53
|
+
When I run `bundle exec thor version:bump major` from the Perforce project directory
|
54
|
+
Then the version should be '2.0.0' in the Perforce project directory
|
55
|
+
And the p4 server version should be '2.0.0'
|
56
|
+
|
57
|
+
@p4
|
58
|
+
Scenario: Bumping a minor version in Perforce should reset the patch version
|
59
|
+
Given I have a Perforce project of version '1.1.5'
|
60
|
+
When I run `bundle exec thor version:bump minor` from the Perforce project directory
|
61
|
+
Then the version should be '1.2.0' in the Perforce project directory
|
62
|
+
And the p4 server version should be '1.2.0'
|
63
|
+
|
64
|
+
@p4
|
65
|
+
Scenario: Bumping a major version in Perforce should reset the patch and minor versions
|
66
|
+
Given I have a Perforce project of version '1.1.5'
|
67
|
+
When I run `bundle exec thor version:bump major` from the Perforce project directory
|
68
|
+
Then the version should be '2.0.0' in the Perforce project directory
|
69
|
+
And the p4 server version should be '2.0.0'
|
@@ -0,0 +1,76 @@
|
|
1
|
+
Given /^I have a git project of version '(.*)'$/ do |version|
|
2
|
+
Dir.chdir(origin_dir) do
|
3
|
+
`git init`
|
4
|
+
end
|
5
|
+
Dir.chdir(project_dir) do
|
6
|
+
`git init`
|
7
|
+
`touch README`
|
8
|
+
`git add README`
|
9
|
+
`git commit -m "initial commit"`
|
10
|
+
`git tag -a -m "Version #{version}" #{version}`
|
11
|
+
`git remote add origin file://#{origin_dir}`
|
12
|
+
setup_directory
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
Then /^the version should be '(.*)'$/ do |version|
|
17
|
+
Dir.chdir(project_dir) {
|
18
|
+
ThorSCMVersion.versioner.from_path.to_s.should == version
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
Then /^the version should be '(.+)' in the Perforce project directory$/ do |version|
|
23
|
+
Dir.chdir(perforce_project_dir) {
|
24
|
+
ThorSCMVersion.versioner.from_path.to_s.should == version
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
Then /^the origin version should be '(.*)'$/ do |version|
|
29
|
+
Dir.chdir(origin_dir) {
|
30
|
+
ThorSCMVersion.versioner.from_path.to_s.should == version
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
When /^I run `(.*)` from the temp directory$/ do |run|
|
35
|
+
Dir.chdir(project_dir) {
|
36
|
+
`#{run}`
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
When /^I run `(.*)` from the Perforce project directory$/ do |run|
|
41
|
+
Dir.chdir(perforce_project_dir) {
|
42
|
+
`#{run}`
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
Given /^I have a Perforce project of version '(.*)'$/ do |version|
|
47
|
+
ENV['P4PORT'] = 'p4server.example.com:1666'
|
48
|
+
ENV['P4USER'] = 'tester'
|
49
|
+
ENV['P4PASSWD'] = 'tester'
|
50
|
+
ENV['P4CHARSET'] = ''
|
51
|
+
ENV['P4CLIENT'] = 'testers_workspace'
|
52
|
+
Dir.chdir(perforce_project_dir) do
|
53
|
+
ThorSCMVersion::Perforce.connection do
|
54
|
+
`p4 sync -f`
|
55
|
+
end
|
56
|
+
File.chmod(0666,"VERSION")
|
57
|
+
File.open('VERSION', 'w') do |f|
|
58
|
+
f.write(version)
|
59
|
+
end
|
60
|
+
setup_directory
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
Then /^the p4 server version should be '(.*)'$/ do |version|
|
65
|
+
ENV['P4PORT'] = 'p4server.example.com:1666'
|
66
|
+
ENV['P4USER'] = 'tester'
|
67
|
+
ENV['P4PASSWD'] = 'tester'
|
68
|
+
ENV['P4CHARSET'] = ''
|
69
|
+
ENV['P4CLIENT'] = 'testers_workspace'
|
70
|
+
Dir.chdir(perforce_project_dir) do
|
71
|
+
ThorSCMVersion::Perforce.connection do
|
72
|
+
`p4 print #{File.join(perforce_project_dir,'VERSION')}`
|
73
|
+
#p4.run_print(File.join(perforce_project_dir,'VERSION'))[1].should == version
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'aruba/cucumber'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
$:.push "#{File.dirname(__FILE__)}/../../lib/"
|
5
|
+
require 'rspec'
|
6
|
+
require 'thor-scmversion'
|
7
|
+
|
8
|
+
def project_dir
|
9
|
+
@tmpdir ||= Dir.mktmpdir
|
10
|
+
end
|
11
|
+
|
12
|
+
def perforce_project_dir
|
13
|
+
dir = "/temp/p4sandbox/artifact"
|
14
|
+
FileUtils.mkdir_p dir
|
15
|
+
dir
|
16
|
+
end
|
17
|
+
|
18
|
+
def origin_dir
|
19
|
+
@origindir ||= Dir.mktmpdir
|
20
|
+
end
|
21
|
+
|
22
|
+
def fixtures_dir
|
23
|
+
File.join(File.dirname(__FILE__), "..", "fixtures")
|
24
|
+
end
|
25
|
+
|
26
|
+
def app_root
|
27
|
+
File.join(File.dirname(__FILE__), '..', '..')
|
28
|
+
end
|
29
|
+
|
30
|
+
def setup_directory
|
31
|
+
File.open('Gemfile', 'w') do |f|
|
32
|
+
f.write "gem 'thor-scmversion', path: '#{app_root}'"
|
33
|
+
end
|
34
|
+
`bundle`
|
35
|
+
Dir.entries(fixtures_dir).each do |entry|
|
36
|
+
FileUtils.cp_r(File.join(fixtures_dir, entry), '.')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
After do |scenario|
|
41
|
+
FileUtils.rm_rf(project_dir)
|
42
|
+
FileUtils.rm_rf(origin_dir)
|
43
|
+
end
|
44
|
+
|
45
|
+
After('@p4') do |scenario|
|
46
|
+
ENV['P4PORT'] = 'p4server.example.com:1666'
|
47
|
+
ENV['P4USER'] = 'tester'
|
48
|
+
ENV['P4PASSWD'] = 'tester'
|
49
|
+
ENV['P4CHARSET'] = ''
|
50
|
+
ENV['P4CLIENT'] = 'testers_workspace'
|
51
|
+
Dir.chdir(perforce_project_dir) do
|
52
|
+
ThorSCMVersion::Perforce.connection do
|
53
|
+
#p4.run_sync("-f")
|
54
|
+
`p4 sync -f`
|
55
|
+
description = "Bump version to #{to_s}."
|
56
|
+
`p4 edit -c default #{File.join(perforce_project_dir, "VERSION")}`
|
57
|
+
File.open(File.join(perforce_project_dir, "VERSION"), 'w') { |f| f.write '1.0.0' }
|
58
|
+
`p4 submit -d \"#{description}\"`
|
59
|
+
#new_changelist = p4.fetch_change
|
60
|
+
#new_changelist._Description = "Reseting version to 1.0.0 for next test."
|
61
|
+
#saved_changelist = p4.save_change(new_changelist)
|
62
|
+
#changelist_number = saved_changelist[0].match(/(\d+)/).to_s.strip
|
63
|
+
#p4.run_edit("-c", changelist_number, File.join(perforce_project_dir, "VERSION"))
|
64
|
+
|
65
|
+
#File.open(File.join(perforce_project_dir, "VERSION"), 'w') { |f| f.write '1.0.0' }
|
66
|
+
#changelist = p4.fetch_change changelist_number
|
67
|
+
#p4.run_submit changelist
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'thor-scmversion/scm_version'
|
3
|
+
require 'thor-scmversion/git_version'
|
4
|
+
require 'thor-scmversion/p4_version'
|
5
|
+
require 'thor-scmversion/shell_utils'
|
6
|
+
|
7
|
+
module ThorSCMVersion
|
8
|
+
class Tasks < Thor
|
9
|
+
namespace "version"
|
10
|
+
|
11
|
+
desc "bump TYPE", "Bump version number (type is major, minor or patch)"
|
12
|
+
def bump(type)
|
13
|
+
current_version.bump! type
|
14
|
+
begin
|
15
|
+
current_version.tag
|
16
|
+
write_version
|
17
|
+
say "Tagged: #{current_version}", :green
|
18
|
+
rescue => e
|
19
|
+
say "Tagging #{current_version} failed due to error", :red
|
20
|
+
say e, :red
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "current", "Show current SCM tagged version"
|
26
|
+
def current
|
27
|
+
say current_version.to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
def current_version
|
32
|
+
@current_version ||= ThorSCMVersion.versioner.from_path
|
33
|
+
end
|
34
|
+
|
35
|
+
def write_version
|
36
|
+
ver = current_version.to_s
|
37
|
+
version_files.each do |ver_file|
|
38
|
+
File.open(ver_file, 'w+') do |f|
|
39
|
+
f.write ver
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
ver
|
44
|
+
end
|
45
|
+
|
46
|
+
eval "def source_root ; Pathname.new File.dirname(__FILE__) ; end"
|
47
|
+
def version_files
|
48
|
+
[
|
49
|
+
source_root.join('VERSION')
|
50
|
+
]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'open4'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
module ThorSCMVersion
|
5
|
+
class GitVersion < ScmVersion
|
6
|
+
class << self
|
7
|
+
def all_from_path(path)
|
8
|
+
Dir.chdir(path) do
|
9
|
+
tags = Open3.popen3("git tag") { |stdin, stdout, stderr| stdout.read }.split(/\n/)
|
10
|
+
version_tags = tags.select { |tag| tag.match(ScmVersion::VERSION_FORMAT) }
|
11
|
+
version_tags.collect { |tag| new(*tag.split('.')) }.sort.reverse
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def tag
|
17
|
+
ShellUtils.sh "git tag -a -m \"Version #{self}\" #{self}"
|
18
|
+
ShellUtils.sh "git push --tags || true"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module ThorSCMVersion
|
2
|
+
class MissingP4ConfigException < StandardError
|
3
|
+
def initialize(config_option)
|
4
|
+
@config_option = config_option
|
5
|
+
end
|
6
|
+
|
7
|
+
def message
|
8
|
+
"#{@config_option} is not set in your environment."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Perforce
|
13
|
+
class << self
|
14
|
+
def check_environment
|
15
|
+
["P4PORT","P4USER", "P4PASSWD", "P4CLIENT"].each {|config|
|
16
|
+
raise MissingP4ConfigException.new(config) if ENV[config].nil? or ENV[config].empty?
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def set
|
21
|
+
ShellUtils.sh "p4 set"
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse_and_set_p4_set
|
25
|
+
p4_set = set
|
26
|
+
parsed_p4_config = p4_set.split("\n").inject({}) do |p4_config, line|
|
27
|
+
key, value = line.split('=')
|
28
|
+
value = value.gsub(/\(.*/, '').strip unless value.nil?
|
29
|
+
p4_config[key] = value
|
30
|
+
p4_config
|
31
|
+
end
|
32
|
+
|
33
|
+
parsed_p4_config.each {|key,value| ENV[key] = value}
|
34
|
+
end
|
35
|
+
|
36
|
+
def connection
|
37
|
+
parse_and_set_p4_set
|
38
|
+
check_environment
|
39
|
+
#p4.connect
|
40
|
+
#p4.run_login
|
41
|
+
ShellUtils.sh "echo #{ENV["P4PASSWD"]} | p4 login"
|
42
|
+
yield
|
43
|
+
ensure
|
44
|
+
#p4.run_logout
|
45
|
+
ShellUtils.sh "p4 logout"
|
46
|
+
#p4.disconnect
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class P4Version < ScmVersion
|
52
|
+
class << self
|
53
|
+
def all_from_path(path)
|
54
|
+
file_path = File.expand_path(File.join(path, 'VERSION'))
|
55
|
+
version = new(*File.read(file_path).strip.split("."))
|
56
|
+
version.version_file_path = file_path
|
57
|
+
[version]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
attr_accessor :version_file_path
|
62
|
+
|
63
|
+
def tag
|
64
|
+
description = "Bump version to #{to_s}."
|
65
|
+
`p4 edit -c default "#{self.version_file_path}"`
|
66
|
+
File.open(self.version_file_path, 'w') { |f| f.write to_s }
|
67
|
+
`p4 submit -d "#{description}"`
|
68
|
+
#Perforce.connection do
|
69
|
+
#new_changelist = p4.fetch_change
|
70
|
+
#new_changelist._Description = "Bump version to #{to_s}."
|
71
|
+
#saved_changelist = p4.save_change(new_changelist)
|
72
|
+
#changelist_number = saved_changelist[0].match(/(\d+)/).to_s.strip
|
73
|
+
#puts changelist_number
|
74
|
+
#p4.run_edit("-c", changelist_number, self.version_file_path)
|
75
|
+
#changelist = p4.fetch_change changelist_number
|
76
|
+
#p4.run_submit changelist
|
77
|
+
#end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module ThorSCMVersion
|
2
|
+
|
3
|
+
class << self
|
4
|
+
def versioner
|
5
|
+
if(File.directory?(".git"))
|
6
|
+
return GitVersion
|
7
|
+
else
|
8
|
+
return P4Version
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class ScmVersion
|
14
|
+
include Comparable
|
15
|
+
|
16
|
+
VERSION_FORMAT = /^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)$/
|
17
|
+
class << self
|
18
|
+
def from_path(path = '.')
|
19
|
+
all_from_path(path).first || new(0,0,1)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
attr_accessor :major
|
23
|
+
attr_accessor :minor
|
24
|
+
attr_accessor :patch
|
25
|
+
|
26
|
+
def initialize(major=0, minor=0, patch=0)
|
27
|
+
@major = major.to_i
|
28
|
+
@minor = minor.to_i
|
29
|
+
@patch = patch.to_i
|
30
|
+
end
|
31
|
+
|
32
|
+
def bump!(type)
|
33
|
+
case type.to_sym
|
34
|
+
when :major
|
35
|
+
self.major += 1
|
36
|
+
self.minor = 0
|
37
|
+
self.patch = 0
|
38
|
+
when :minor
|
39
|
+
self.minor += 1
|
40
|
+
self.patch = 0
|
41
|
+
when :patch
|
42
|
+
self.patch += 1
|
43
|
+
else
|
44
|
+
raise "Invalid release type: #{type}. Valid types are: major, minor, or patch"
|
45
|
+
end
|
46
|
+
raise "Version: #{self.to_s} is less than or equal to the existing version." if self <= self.class.from_path
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
def tag
|
51
|
+
raise NotImplementedError
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
"#{major}.#{minor}.#{patch}"
|
56
|
+
end
|
57
|
+
alias_method :version, :to_s
|
58
|
+
|
59
|
+
def <=>(other)
|
60
|
+
return unless other.is_a?(self.class)
|
61
|
+
return 0 if self.version == other.version
|
62
|
+
|
63
|
+
[:major, :minor, :patch].each do |segment|
|
64
|
+
next if self.send(segment) == other.send(segment)
|
65
|
+
return 1 if self.send(segment) > other.send(segment)
|
66
|
+
return -1 if self.send(segment) < other.send(segment)
|
67
|
+
end
|
68
|
+
return 0
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ThorSCMVersion
|
2
|
+
class ShellUtils
|
3
|
+
class << self
|
4
|
+
def secure_password
|
5
|
+
password = String.new
|
6
|
+
|
7
|
+
while password.length < 20
|
8
|
+
password << ::OpenSSL::Random.random_bytes(1).gsub(/\W/, '')
|
9
|
+
end
|
10
|
+
password
|
11
|
+
end
|
12
|
+
|
13
|
+
def sh(cmd, dir = '.', &block)
|
14
|
+
out, code = sh_with_excode(cmd, dir, &block)
|
15
|
+
code == 0 ? out : raise(out.empty? ? "Running `#{cmd}` failed. Run this command directly for more detailed output." : out)
|
16
|
+
end
|
17
|
+
|
18
|
+
def sh_with_excode(cmd, dir = '.', &block)
|
19
|
+
cmd << " 2>&1"
|
20
|
+
output = ""
|
21
|
+
status = nil
|
22
|
+
Dir.chdir(dir) {
|
23
|
+
stdin, stdout, stderr, wait_thr = Open3::popen3(cmd)
|
24
|
+
|
25
|
+
status = wait_thr.value
|
26
|
+
output = stdout.readlines.join
|
27
|
+
|
28
|
+
if status.to_i == 0
|
29
|
+
block.call(output) if block
|
30
|
+
end
|
31
|
+
}
|
32
|
+
[ output, status ]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module ThorSCMVersion
|
4
|
+
describe GitVersion do
|
5
|
+
it 'should take major minor and patch segments on initialization' do
|
6
|
+
-> { described_class.new('1', '2', '3') }.should_not raise_error
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe Perforce do
|
11
|
+
it 'should set good' do
|
12
|
+
described_class.stub(:set) { <<-here }
|
13
|
+
P4CHARSET=utf8\nP4CLIENT=kallan_mac (config)
|
14
|
+
P4CONFIG=p4config (config '/Users/kallan/src/kallan_mac/p4config')
|
15
|
+
P4PORT=perflax01:1666 (config)
|
16
|
+
P4USER=kallan
|
17
|
+
here
|
18
|
+
|
19
|
+
described_class.parse_and_set_p4_set
|
20
|
+
|
21
|
+
ENV["P4CHARSET"].should == "utf8"
|
22
|
+
ENV["P4CONFIG"].should == "p4config"
|
23
|
+
ENV["P4PORT"].should == "perflax01:1666"
|
24
|
+
ENV["P4USER"].should == "kallan"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'spork'
|
4
|
+
require 'vcr'
|
5
|
+
|
6
|
+
Spork.prefork do
|
7
|
+
require 'rspec'
|
8
|
+
require 'simplecov'
|
9
|
+
require 'pp'
|
10
|
+
|
11
|
+
APP_ROOT = File.expand_path('../../', __FILE__)
|
12
|
+
|
13
|
+
Dir[File.join(APP_ROOT, "spec/support/**/*.rb")].each {|f| require f}
|
14
|
+
|
15
|
+
VCR.configure do |c|
|
16
|
+
c.cassette_library_dir = File.join(File.dirname(__FILE__), 'fixtures', 'vcr_cassettes')
|
17
|
+
c.hook_into :webmock
|
18
|
+
end
|
19
|
+
|
20
|
+
RSpec.configure do |config|
|
21
|
+
config.mock_with :rspec
|
22
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
23
|
+
config.filter_run :focus => true
|
24
|
+
config.run_all_when_everything_filtered = true
|
25
|
+
|
26
|
+
config.around do |example|
|
27
|
+
# Dynamically create cassettes based on the name of the example
|
28
|
+
# being run. This creates a new cassette for every test.
|
29
|
+
cur = example.metadata
|
30
|
+
identifiers = [example.metadata[:description_args]]
|
31
|
+
while cur = cur[:example_group] do
|
32
|
+
identifiers << cur[:description_args]
|
33
|
+
end
|
34
|
+
|
35
|
+
VCR.use_cassette(identifiers.reverse.join(' ')) do
|
36
|
+
example.run
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
SimpleCov.start do
|
42
|
+
add_filter 'spec/'
|
43
|
+
end
|
44
|
+
|
45
|
+
def capture(stream)
|
46
|
+
begin
|
47
|
+
stream = stream.to_s
|
48
|
+
eval "$#{stream} = StringIO.new"
|
49
|
+
yield
|
50
|
+
result = eval("$#{stream}").string
|
51
|
+
ensure
|
52
|
+
eval("$#{stream} = #{stream.upcase}")
|
53
|
+
end
|
54
|
+
|
55
|
+
result
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
Spork.each_run do
|
61
|
+
require 'thor-scmversion'
|
62
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/thor-scmversion/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Michael Ivey", "Kyle Allan", "Josiah Kiehl"]
|
6
|
+
gem.email = ["ivey@gweezlebur.com", "kallan@riotgames.com", "josiah@skirmisher.net"]
|
7
|
+
gem.description = %q{Thor tasks to manage a VERSION file based on SCM tags}
|
8
|
+
gem.summary = %q{A small set of Thor tasks you can include in your build scripts to manage a VERSION file based on SCM tags. This allows you to keep VERSION out of cource control, allowing your continuous integration system to version each build.}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "thor-scmversion"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = ThorSCMVersion::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency 'open4'
|
19
|
+
gem.add_dependency 'thor'
|
20
|
+
gem.add_development_dependency 'webmock'
|
21
|
+
gem.add_development_dependency 'geminabox'
|
22
|
+
gem.add_development_dependency 'spork'
|
23
|
+
gem.add_development_dependency 'simplecov'
|
24
|
+
gem.add_development_dependency 'vcr'
|
25
|
+
gem.add_development_dependency 'aruba'
|
26
|
+
gem.add_development_dependency 'rspec'
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: thor-scmversion
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michael Ivey
|
9
|
+
- Kyle Allan
|
10
|
+
- Josiah Kiehl
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2012-06-25 00:00:00.000000000Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: open4
|
18
|
+
requirement: &70337182623800 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: *70337182623800
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: thor
|
29
|
+
requirement: &70337182623380 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: *70337182623380
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: webmock
|
40
|
+
requirement: &70337182622960 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
type: :development
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: *70337182622960
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: geminabox
|
51
|
+
requirement: &70337182622540 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
type: :development
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *70337182622540
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: spork
|
62
|
+
requirement: &70337182653080 !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: *70337182653080
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: simplecov
|
73
|
+
requirement: &70337182652660 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: *70337182652660
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: vcr
|
84
|
+
requirement: &70337182652240 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: *70337182652240
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: aruba
|
95
|
+
requirement: &70337182651820 !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
type: :development
|
102
|
+
prerelease: false
|
103
|
+
version_requirements: *70337182651820
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: rspec
|
106
|
+
requirement: &70337182651400 !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
type: :development
|
113
|
+
prerelease: false
|
114
|
+
version_requirements: *70337182651400
|
115
|
+
description: Thor tasks to manage a VERSION file based on SCM tags
|
116
|
+
email:
|
117
|
+
- ivey@gweezlebur.com
|
118
|
+
- kallan@riotgames.com
|
119
|
+
- josiah@skirmisher.net
|
120
|
+
executables: []
|
121
|
+
extensions: []
|
122
|
+
extra_rdoc_files: []
|
123
|
+
files:
|
124
|
+
- .gitignore
|
125
|
+
- Gemfile
|
126
|
+
- LICENSE
|
127
|
+
- README.md
|
128
|
+
- Rakefile
|
129
|
+
- Thorfile
|
130
|
+
- features/bump.feature
|
131
|
+
- features/fixtures/Thorfile
|
132
|
+
- features/step_definitions/bump_steps.rb
|
133
|
+
- features/support/env.rb
|
134
|
+
- lib/thor-scmversion.rb
|
135
|
+
- lib/thor-scmversion/git_version.rb
|
136
|
+
- lib/thor-scmversion/p4_version.rb
|
137
|
+
- lib/thor-scmversion/scm_version.rb
|
138
|
+
- lib/thor-scmversion/shell_utils.rb
|
139
|
+
- lib/thor-scmversion/version.rb
|
140
|
+
- spec/lib/scm_version_spec.rb
|
141
|
+
- spec/spec_helper.rb
|
142
|
+
- thor-scmversion.gemspec
|
143
|
+
homepage: ''
|
144
|
+
licenses: []
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
none: false
|
151
|
+
requirements:
|
152
|
+
- - ! '>='
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
155
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
+
none: false
|
157
|
+
requirements:
|
158
|
+
- - ! '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
requirements: []
|
162
|
+
rubyforge_project:
|
163
|
+
rubygems_version: 1.8.10
|
164
|
+
signing_key:
|
165
|
+
specification_version: 3
|
166
|
+
summary: A small set of Thor tasks you can include in your build scripts to manage
|
167
|
+
a VERSION file based on SCM tags. This allows you to keep VERSION out of cource
|
168
|
+
control, allowing your continuous integration system to version each build.
|
169
|
+
test_files:
|
170
|
+
- features/bump.feature
|
171
|
+
- features/fixtures/Thorfile
|
172
|
+
- features/step_definitions/bump_steps.rb
|
173
|
+
- features/support/env.rb
|
174
|
+
- spec/lib/scm_version_spec.rb
|
175
|
+
- spec/spec_helper.rb
|
176
|
+
has_rdoc:
|