autoversion 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.rspec +2 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +30 -0
- data/LICENSE +21 -0
- data/README.md +125 -0
- data/Rakefile +6 -0
- data/Versionfile +32 -0
- data/autoversion.gemspec +23 -0
- data/bin/autoversion +3 -0
- data/lib/autoversion.rb +9 -0
- data/lib/autoversion/.gitkeep +0 -0
- data/lib/autoversion/cli.rb +64 -0
- data/lib/autoversion/dsl.rb +88 -0
- data/lib/autoversion/gitter.rb +63 -0
- data/lib/autoversion/semver.rb +25 -0
- data/lib/autoversion/version.rb +3 -0
- data/lib/autoversion/versioner.rb +68 -0
- data/spec/cli_spec.rb +99 -0
- data/spec/dsl_spec.rb +67 -0
- data/spec/fixtures/bare_repo.tar +0 -0
- data/spec/fixtures/versionfiles.rb +15 -0
- data/spec/gitter_spec.rb +60 -0
- data/spec/semver_spec.rb +0 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/versioner_spec.rb +62 -0
- metadata +136 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7e19cd24caedde612005e57c536d6d23a3cf27c4
|
4
|
+
data.tar.gz: 4abca7955e686be2d91b0946f33af46b050880aa
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5af8dcd3a141bcf64ebe09e715771b1b0a860e2d2f87f53193c41585efd28b69f7995c9d68ee46bf2eb9e96a1d298a5edad3515a2aa3f48d92807fe0c87eae5c
|
7
|
+
data.tar.gz: 762b5bc91b6f378dabbc364e58737e7a434b2ad6113b859f7ae003114266b1a939be479ca7d6308c621830269522734a724f72bc88680e8a5cb2eed1df35edc2
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
autoversion (0.3.2)
|
5
|
+
git (= 1.2.5)
|
6
|
+
semantic (= 1.1.0)
|
7
|
+
thor (= 0.17.0)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
diff-lcs (1.2.1)
|
13
|
+
git (1.2.5)
|
14
|
+
rspec (2.13.0)
|
15
|
+
rspec-core (~> 2.13.0)
|
16
|
+
rspec-expectations (~> 2.13.0)
|
17
|
+
rspec-mocks (~> 2.13.0)
|
18
|
+
rspec-core (2.13.1)
|
19
|
+
rspec-expectations (2.13.0)
|
20
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
21
|
+
rspec-mocks (2.13.0)
|
22
|
+
semantic (1.1.0)
|
23
|
+
thor (0.17.0)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
autoversion!
|
30
|
+
rspec (= 2.13.0)
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2012 Jonathan Pettersson
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
Autoversion
|
2
|
+
===========
|
3
|
+
|
4
|
+
Autoversion is a command line tool that can automate [semantic versioning](http://semver.org) in your application. It
|
5
|
+
integrates nicely with git to give you automatic & atomic commits of version increments. It also supports hooks that can be run before and after a new version has been comitted.
|
6
|
+
|
7
|
+
Autoversion is not finished, but it's used enough to be public. Consider it an experiment.<br />
|
8
|
+
And yes, Autoversion uses Autoversion for versioning ;)
|
9
|
+
|
10
|
+
Basics
|
11
|
+
---------
|
12
|
+
|
13
|
+
**Read current version**
|
14
|
+
```Bash
|
15
|
+
$ autoversion
|
16
|
+
```
|
17
|
+
|
18
|
+
**Increment versions**
|
19
|
+
```Bash
|
20
|
+
$ autoversion major
|
21
|
+
$ autoversion minor
|
22
|
+
$ autoversion patch
|
23
|
+
$ autoversion build 'named-version'
|
24
|
+
```
|
25
|
+
|
26
|
+
The Versionfile
|
27
|
+
--------------------
|
28
|
+
|
29
|
+
The Versionfile is a ruby script which is used by Autoversion to read and write version.
|
30
|
+
|
31
|
+
**Example**
|
32
|
+
|
33
|
+
```Ruby
|
34
|
+
|
35
|
+
# This block should return a valid Semantic object. Typically it will read a file and parse it.
|
36
|
+
read_version do
|
37
|
+
# Return a valid Semantic object
|
38
|
+
end
|
39
|
+
|
40
|
+
# This block should take a Semantic object and persist it. Usually this means rewriting some version file.
|
41
|
+
write_version do |semver|
|
42
|
+
# Write a Semantic object
|
43
|
+
end
|
44
|
+
|
45
|
+
after :version do
|
46
|
+
# Run some command after any versioning action
|
47
|
+
# Example: Export a .crx file, copy & name it for Blackberry
|
48
|
+
end
|
49
|
+
|
50
|
+
after :patch do
|
51
|
+
# Run some command after patch
|
52
|
+
end
|
53
|
+
|
54
|
+
after :minor do
|
55
|
+
# Run some command after minor
|
56
|
+
end
|
57
|
+
|
58
|
+
after :major do
|
59
|
+
# Run some command after release
|
60
|
+
# Example: Copy lib/ files from Exo.js to exojs-gem
|
61
|
+
end
|
62
|
+
|
63
|
+
```
|
64
|
+
|
65
|
+
Versionfile Examples
|
66
|
+
----------------------------
|
67
|
+
|
68
|
+
**A ruby gem**
|
69
|
+
|
70
|
+
```Ruby
|
71
|
+
automate_git
|
72
|
+
|
73
|
+
read_version do
|
74
|
+
contents = File.read File.join(Dir.pwd, "lib/autoversion/version.rb")
|
75
|
+
instance_eval(contents)
|
76
|
+
Autoversion::VERSION
|
77
|
+
end
|
78
|
+
|
79
|
+
write_version do |currentVersion, nextVersion|
|
80
|
+
contents = File.read File.join(Dir.pwd, "lib/autoversion/version.rb")
|
81
|
+
contents = contents.sub(currentVersion.to_s, nextVersion.to_s)
|
82
|
+
|
83
|
+
File.open(File.join(Dir.pwd, "lib/autoversion/version.rb"), 'w') do |file|
|
84
|
+
file.write contents
|
85
|
+
end
|
86
|
+
end
|
87
|
+
```
|
88
|
+
|
89
|
+
**A Chrome Extension**
|
90
|
+
|
91
|
+
```Ruby
|
92
|
+
require 'json'
|
93
|
+
require 'crxmake'
|
94
|
+
|
95
|
+
automate_git :actions => [:commit]
|
96
|
+
|
97
|
+
read_version do
|
98
|
+
doc = JSON.load File.read('./app/source/manifest.json')
|
99
|
+
doc['version']
|
100
|
+
end
|
101
|
+
|
102
|
+
write_version do |currentVersion, nextVersion|
|
103
|
+
doc = JSON.load File.read './app/source/manifest.json'
|
104
|
+
doc['version'] = nextVersion.to_s
|
105
|
+
File.open('./app/source/manifest.json', 'w') {|f| f.write JSON.pretty_generate(doc) }
|
106
|
+
end
|
107
|
+
|
108
|
+
after :version do |currentVersion|
|
109
|
+
CrxMake.make(
|
110
|
+
:ex_dir => "./app/build",
|
111
|
+
:pkey => "./app/build.pem",
|
112
|
+
:crx_output => "./app/releases/#{currentVersion.to_s}.crx",
|
113
|
+
:verbose => true,
|
114
|
+
:ignorefile => /\.swp/,
|
115
|
+
:ignoredir => /\.(?:svn|git|cvs)/
|
116
|
+
)
|
117
|
+
end
|
118
|
+
```
|
119
|
+
|
120
|
+
**An npm module**
|
121
|
+
|
122
|
+
```Ruby
|
123
|
+
```
|
124
|
+
|
125
|
+
|
data/Rakefile
ADDED
data/Versionfile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
automate_git
|
2
|
+
|
3
|
+
read_version do
|
4
|
+
contents = File.read File.join(Dir.pwd, "lib/autoversion/version.rb")
|
5
|
+
instance_eval(contents)
|
6
|
+
Autoversion::VERSION
|
7
|
+
end
|
8
|
+
|
9
|
+
write_version do |currentVersion, nextVersion|
|
10
|
+
contents = File.read File.join(Dir.pwd, "lib/autoversion/version.rb")
|
11
|
+
contents = contents.sub(currentVersion.to_s, nextVersion.to_s)
|
12
|
+
|
13
|
+
File.open(File.join(Dir.pwd, "lib/autoversion/version.rb"), 'w') do |file|
|
14
|
+
file.write contents
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
before :version do |currentVersion, nextVersion|
|
19
|
+
puts "Before version #{currentVersion} => #{nextVersion}"
|
20
|
+
end
|
21
|
+
|
22
|
+
after :version do |currentVersion|
|
23
|
+
puts "After version #{currentVersion}"
|
24
|
+
end
|
25
|
+
|
26
|
+
before :patch do |currentVersion, nextVersion|
|
27
|
+
puts "Before patch #{currentVersion} => #{nextVersion}"
|
28
|
+
end
|
29
|
+
|
30
|
+
after :patch do |currentVersion|
|
31
|
+
puts "After patch #{currentVersion}"
|
32
|
+
end
|
data/autoversion.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "autoversion/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'autoversion'
|
7
|
+
s.version = Autoversion::VERSION
|
8
|
+
s.date = '2013-03-27'
|
9
|
+
s.summary = "Automate your Semantic Versioning with git and hooks"
|
10
|
+
s.description = "Yeah"
|
11
|
+
s.authors = ["Jonathan Pettersson"]
|
12
|
+
s.email = 'jonathan@spacetofu.com'
|
13
|
+
s.files = `git ls-files`.split("\n")
|
14
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
+
s.homepage = 'https://github.com/jpettersson/autoversion'
|
16
|
+
s.executables << 'autoversion'
|
17
|
+
s.license = 'MIT'
|
18
|
+
|
19
|
+
s.add_development_dependency "rspec", "2.13.0"
|
20
|
+
s.add_runtime_dependency "thor", "0.17.0"
|
21
|
+
s.add_runtime_dependency "git", "1.2.5"
|
22
|
+
s.add_runtime_dependency "semantic", "1.1.0"
|
23
|
+
end
|
data/bin/autoversion
ADDED
data/lib/autoversion.rb
ADDED
File without changes
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "thor"
|
2
|
+
|
3
|
+
module Autoversion
|
4
|
+
class CLI < Thor
|
5
|
+
include Thor::Actions
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_accessor :version_file_contents
|
9
|
+
attr_accessor :pwd
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(*args)
|
13
|
+
super *args
|
14
|
+
version_file_contents = CLI::version_file_contents || File.read(File.join(Dir.pwd, "Versionfile"))
|
15
|
+
@versioner = Autoversion::Versioner.new version_file_contents, CLI::pwd
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'read_version', 'Read the Semantic Version of the current project'
|
19
|
+
def read_version
|
20
|
+
say @versioner.current_version.to_s, :cyan
|
21
|
+
end
|
22
|
+
|
23
|
+
desc 'patch', "Increment a patch version"
|
24
|
+
method_option :simulate, :type => :boolean, :aliases => "-s"
|
25
|
+
method_option :force, :type => :boolean, :aliases => '-f'
|
26
|
+
def patch
|
27
|
+
increment_version :patch, options[:simulate], options[:force]
|
28
|
+
end
|
29
|
+
|
30
|
+
desc 'minor', 'Increment a minor version'
|
31
|
+
method_option :simulate, :type => :boolean, :aliases => "-s"
|
32
|
+
method_option :force, :type => :boolean, :aliases => '-f'
|
33
|
+
def minor
|
34
|
+
increment_version :minor, options[:simulate], options[:force]
|
35
|
+
end
|
36
|
+
|
37
|
+
desc 'major', 'Increment a major version'
|
38
|
+
method_option :simulate, :type => :boolean, :aliases => "-s"
|
39
|
+
method_option :force, :type => :boolean, :aliases => '-f'
|
40
|
+
def major
|
41
|
+
increment_version :major, options[:simulate], options[:force]
|
42
|
+
end
|
43
|
+
|
44
|
+
#TODO: Accept arg
|
45
|
+
desc 'build', 'Create a build version'
|
46
|
+
def special
|
47
|
+
create_build_version
|
48
|
+
end
|
49
|
+
|
50
|
+
no_tasks do
|
51
|
+
def increment_version type, simulate=false, force=false
|
52
|
+
if force or yes? "Do you want to increment #{type.to_s} to #{@versioner.next_version(type)}? (y/N)"
|
53
|
+
outcome = simulate ? "would change" : "changed"
|
54
|
+
@versioner.increment! type, simulate
|
55
|
+
say "Version #{outcome} to #{@versioner.current_version}", simulate ? :cyan : :green
|
56
|
+
else
|
57
|
+
say "No changes were made."
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
default_task :read_version
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Autoversion
|
2
|
+
class DSL
|
3
|
+
|
4
|
+
class MissingReadBlock < Exception
|
5
|
+
end
|
6
|
+
|
7
|
+
class InvalidGitConfig < Exception
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :read_blk
|
11
|
+
attr_accessor :write_blk
|
12
|
+
attr_accessor :listeners
|
13
|
+
attr_accessor :config
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@read_blk = nil
|
17
|
+
@write_blk = nil
|
18
|
+
@listeners = []
|
19
|
+
@config = {
|
20
|
+
:git => {
|
21
|
+
:actions => [],
|
22
|
+
:prefix => '',
|
23
|
+
:stable_branch => 'master'
|
24
|
+
}
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate!
|
29
|
+
# A read_version block is required
|
30
|
+
raise MissingReadBlock unless @read_blk
|
31
|
+
raise InvalidGitConfig if @config[:git][:actions].include?(:tag) && !@config[:git][:actions].include?(:commit)
|
32
|
+
end
|
33
|
+
|
34
|
+
def automate_git *args
|
35
|
+
if args.length == 0
|
36
|
+
@config[:git][:actions] = [:commit, :tag]
|
37
|
+
else
|
38
|
+
args[0].each do |arg|
|
39
|
+
if [:actions, :stable_branch, :prefix].include?(arg[0])
|
40
|
+
@config[:git][arg[0]] = arg[1]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Register a block that will be used to read the
|
47
|
+
# version number from the current project.
|
48
|
+
def read_version &blk
|
49
|
+
@read_blk = blk
|
50
|
+
end
|
51
|
+
|
52
|
+
# Register a block that will be used to write the
|
53
|
+
# version number to the current project.
|
54
|
+
def write_version &blk
|
55
|
+
@write_blk = blk
|
56
|
+
end
|
57
|
+
|
58
|
+
# Register a block that will be executed after
|
59
|
+
# a certain event has fired.
|
60
|
+
def after event, &blk
|
61
|
+
@listeners.push({
|
62
|
+
:type => :after,
|
63
|
+
:event => event,
|
64
|
+
:blk => blk
|
65
|
+
})
|
66
|
+
end
|
67
|
+
|
68
|
+
# Register a block that will be executed before
|
69
|
+
# a certain event has fired.
|
70
|
+
def before event, &blk
|
71
|
+
@listeners.push({
|
72
|
+
:type => :before,
|
73
|
+
:event => event,
|
74
|
+
:blk => blk
|
75
|
+
})
|
76
|
+
end
|
77
|
+
|
78
|
+
class << self
|
79
|
+
def evaluate(script)
|
80
|
+
obj = self.new
|
81
|
+
obj.instance_eval(script)
|
82
|
+
obj.validate!
|
83
|
+
|
84
|
+
return obj.read_blk, obj.write_blk, obj.listeners, obj.config
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'git'
|
2
|
+
|
3
|
+
module Autoversion
|
4
|
+
class Gitter
|
5
|
+
|
6
|
+
class DirtyStaging < Exception
|
7
|
+
end
|
8
|
+
|
9
|
+
class NotOnStableBranch < Exception
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize path, config
|
13
|
+
@path = path
|
14
|
+
@config = config
|
15
|
+
@repo = Git.open(path)
|
16
|
+
end
|
17
|
+
|
18
|
+
def ensure_cleanliness!
|
19
|
+
if @config[:actions].include?(:commit)
|
20
|
+
raise DirtyStaging unless dir_is_clean?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def dir_is_clean?
|
25
|
+
# sum = @repo.status.untracked.length + @repo.status.added.length + @repo.status.changed.length + @repo.status.deleted.length
|
26
|
+
# if sum > 0
|
27
|
+
# puts "untracked: #{@repo.status.untracked}"
|
28
|
+
# puts "added: #{@repo.status.added}"
|
29
|
+
# puts "changed: #{@repo.status.changed}"
|
30
|
+
# puts "deleted: #{@repo.status.deleted}"
|
31
|
+
# end
|
32
|
+
|
33
|
+
# sum == 0
|
34
|
+
|
35
|
+
# Disabled for now. ruby-git doesn't seem to read the .gitignore files, so the untracked count is completely useless.
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_stable_branch?
|
40
|
+
@repo.current_branch == @config[:stable_branch].to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
def commit! versionType, currentVersion
|
44
|
+
return false unless @config[:actions].include?(:commit)
|
45
|
+
raise NotOnStableBranch if versionType == :major && !on_stable_branch?
|
46
|
+
|
47
|
+
write_commit currentVersion
|
48
|
+
write_tag currentVersion if @config[:actions].include?(:tag)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def write_commit version
|
54
|
+
@repo.add '.'
|
55
|
+
@repo.commit "#{@config[:prefix]}#{version}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def write_tag version
|
59
|
+
@repo.add_tag "#{@config[:prefix]}#{version}"
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'semantic'
|
2
|
+
|
3
|
+
module Autoversion
|
4
|
+
class SemVer < ::Semantic::Version
|
5
|
+
|
6
|
+
def increment type
|
7
|
+
version = to_a
|
8
|
+
found = false
|
9
|
+
[:major, :minor, :patch].each_with_index do |seg, i|
|
10
|
+
if found
|
11
|
+
version[i] = 0
|
12
|
+
end
|
13
|
+
|
14
|
+
if seg == type
|
15
|
+
old = instance_variable_get("@#{seg}")
|
16
|
+
version[i] = old+1
|
17
|
+
found = true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
SemVer.new version.reject{|v| v.nil? }.join '.'
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Autoversion
|
2
|
+
class Versioner
|
3
|
+
|
4
|
+
class UnableToReadVersion < Exception
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize versionfileContents, pwd=nil
|
8
|
+
# Eval the Versionfile within the DSL
|
9
|
+
@read_blk, @write_blk, @listeners, @config = Autoversion::DSL.evaluate versionfileContents
|
10
|
+
|
11
|
+
raise UnableToReadVersion unless @read_blk
|
12
|
+
|
13
|
+
# Fetch current version
|
14
|
+
@current = read_version if @read_blk
|
15
|
+
|
16
|
+
@gitter = ::Autoversion::Gitter.new(pwd || Dir.pwd, @config[:git])
|
17
|
+
end
|
18
|
+
|
19
|
+
def current_version
|
20
|
+
@current
|
21
|
+
end
|
22
|
+
|
23
|
+
def next_version type
|
24
|
+
@current.increment(type)
|
25
|
+
end
|
26
|
+
|
27
|
+
def increment! type, simulate=false
|
28
|
+
@gitter.ensure_cleanliness!
|
29
|
+
|
30
|
+
nextVersion = @current.increment(type)
|
31
|
+
|
32
|
+
process_before type, @current, nextVersion
|
33
|
+
unless simulate
|
34
|
+
write_version @current, nextVersion
|
35
|
+
@current = nextVersion
|
36
|
+
@gitter.commit! type, @current.to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
process_after type, @current
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def read_version
|
45
|
+
Autoversion::SemVer.new @read_blk.call
|
46
|
+
end
|
47
|
+
|
48
|
+
def write_version currentVersion, nextVersion
|
49
|
+
@write_blk.call currentVersion, nextVersion
|
50
|
+
end
|
51
|
+
|
52
|
+
def process_before event, currentVersion, nextVersion
|
53
|
+
notify_listeners :before, event, currentVersion, nextVersion
|
54
|
+
notify_listeners :before, :version, currentVersion, nextVersion
|
55
|
+
end
|
56
|
+
|
57
|
+
def process_after event, currentVersion
|
58
|
+
notify_listeners :after, event, currentVersion
|
59
|
+
notify_listeners :after, :version, currentVersion
|
60
|
+
end
|
61
|
+
|
62
|
+
def notify_listeners type, event, *args
|
63
|
+
@listeners.select{|l| l[:type] == type && l[:event] == event }.each do |listener|
|
64
|
+
listener[:blk].call *args
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'git'
|
3
|
+
|
4
|
+
describe Autoversion::CLI do
|
5
|
+
|
6
|
+
BASE_VERSIONFILE = <<-eos
|
7
|
+
read_version do
|
8
|
+
File.read File.join(File.dirname(__FILE__), 'spec', 'tmp', 'cli', 'version.txt')
|
9
|
+
end
|
10
|
+
|
11
|
+
write_version do |currentVersion, nextVersion|
|
12
|
+
File.open(File.join(File.dirname(__FILE__), 'spec', 'tmp', 'cli', 'version.txt'), 'w') do |file|
|
13
|
+
file.write currentVersion.to_s
|
14
|
+
end
|
15
|
+
end
|
16
|
+
eos
|
17
|
+
|
18
|
+
# Borrowing capture_io from minitest until I have
|
19
|
+
# time to move over to minitest fully.
|
20
|
+
def capture_io
|
21
|
+
require 'stringio'
|
22
|
+
|
23
|
+
captured_stdout, captured_stderr = StringIO.new, StringIO.new
|
24
|
+
|
25
|
+
Mutex.new.synchronize do
|
26
|
+
orig_stdout, orig_stderr = $stdout, $stderr
|
27
|
+
$stdout, $stderr = captured_stdout, captured_stderr
|
28
|
+
|
29
|
+
begin
|
30
|
+
yield
|
31
|
+
ensure
|
32
|
+
$stdout = orig_stdout
|
33
|
+
$stderr = orig_stderr
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
return captured_stdout.string, captured_stderr.string
|
38
|
+
end
|
39
|
+
|
40
|
+
before(:each) do
|
41
|
+
@path = File.join(File.dirname(__FILE__), 'tmp', 'cli')
|
42
|
+
|
43
|
+
if File.directory? @path
|
44
|
+
FileUtils.rm_rf @path
|
45
|
+
end
|
46
|
+
|
47
|
+
system("mkdir #{@path}")
|
48
|
+
system("tar -xf spec/fixtures/bare_repo.tar --strip 1 -C #{@path}")
|
49
|
+
|
50
|
+
system("echo '0.0.1' > #{@path}/version.txt")
|
51
|
+
system("cd #{@path} && git add .")
|
52
|
+
system("cd #{@path} && git commit -m 'first'")
|
53
|
+
|
54
|
+
@repo = Git.open(@path)
|
55
|
+
|
56
|
+
::Autoversion::CLI.pwd = @path
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should be able to read a version" do
|
60
|
+
::Autoversion::CLI.version_file_contents = BASE_VERSIONFILE
|
61
|
+
|
62
|
+
out = capture_io{ Autoversion::CLI.start %w{} }.join ''
|
63
|
+
out.should == "\e[36m0.0.1\e[0m\n"
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should be able to write versions" do
|
67
|
+
::Autoversion::CLI.version_file_contents = BASE_VERSIONFILE
|
68
|
+
|
69
|
+
out = capture_io{ Autoversion::CLI.start %w{patch -f} }.join ''
|
70
|
+
out.should == "\e[32mVersion changed to 0.0.2\e[0m\n"
|
71
|
+
|
72
|
+
out = capture_io{ Autoversion::CLI.start %w{minor -f} }.join ''
|
73
|
+
out.should == "\e[32mVersion changed to 0.1.0\e[0m\n"
|
74
|
+
|
75
|
+
out = capture_io{ Autoversion::CLI.start %w{major -f} }.join ''
|
76
|
+
out.should == "\e[32mVersion changed to 1.0.0\e[0m\n"
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should be able to write, commit and tag patch" do
|
80
|
+
::Autoversion::CLI.version_file_contents = "automate_git\n\n" + BASE_VERSIONFILE
|
81
|
+
|
82
|
+
out = capture_io{ Autoversion::CLI.start %w{patch -f} }.join ''
|
83
|
+
out.should == "\e[32mVersion changed to 0.0.2\e[0m\n"
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should be able to write, commit and tag minor" do
|
87
|
+
::Autoversion::CLI.version_file_contents = "automate_git\n\n" + BASE_VERSIONFILE
|
88
|
+
|
89
|
+
out = capture_io{ Autoversion::CLI.start %w{minor -f} }.join ''
|
90
|
+
out.should == "\e[32mVersion changed to 0.1.0\e[0m\n"
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should be able to write, commit and tag major" do
|
94
|
+
::Autoversion::CLI.version_file_contents = "automate_git\n\n" + BASE_VERSIONFILE
|
95
|
+
|
96
|
+
out = capture_io{ Autoversion::CLI.start %w{major -f} }.join ''
|
97
|
+
out.should == "\e[32mVersion changed to 1.0.0\e[0m\n"
|
98
|
+
end
|
99
|
+
end
|
data/spec/dsl_spec.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Autoversion::DSL do
|
4
|
+
|
5
|
+
it "should raise MissingReadBlock unless read_version has defined block" do
|
6
|
+
expect {
|
7
|
+
@read_blk, @write_blk, @listeners, @config = Autoversion::DSL.evaluate ""
|
8
|
+
}.to raise_error(Autoversion::DSL::MissingReadBlock)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should return an empty git config if not defined" do
|
12
|
+
@read_blk, @write_blk, @listeners, @config = Autoversion::DSL.evaluate <<-eof
|
13
|
+
read_version do
|
14
|
+
|
15
|
+
end
|
16
|
+
eof
|
17
|
+
|
18
|
+
@config[:git][:actions].include?(:commit).should == false
|
19
|
+
@config[:git][:actions].include?(:tag).should == false
|
20
|
+
@config[:git][:prefix].should == ''
|
21
|
+
@config[:git][:stable_branch].should == 'master'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return a default git config when defined" do
|
25
|
+
@read_blk, @write_blk, @listeners, @config = Autoversion::DSL.evaluate <<-eof
|
26
|
+
read_version do
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
automate_git
|
31
|
+
eof
|
32
|
+
|
33
|
+
@config[:git][:actions].include?(:commit).should == true
|
34
|
+
@config[:git][:actions].include?(:tag).should == true
|
35
|
+
@config[:git][:prefix].should == ''
|
36
|
+
@config[:git][:stable_branch].should == 'master'
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
it "should correctly parse git config" do
|
41
|
+
@read_blk, @write_blk, @listeners, @config = Autoversion::DSL.evaluate <<-eof
|
42
|
+
read_version do
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
automate_git :actions => [:commit], :prefix => 'v', :stable_branch => 'dev'
|
47
|
+
eof
|
48
|
+
|
49
|
+
@config[:git][:actions].include?(:commit).should == true
|
50
|
+
@config[:git][:actions].include?(:tag).should == false
|
51
|
+
@config[:git][:prefix].should == 'v'
|
52
|
+
@config[:git][:stable_branch].should == 'dev'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should raise InvalidGitConfig when invalid" do
|
56
|
+
expect {
|
57
|
+
@read_blk, @write_blk, @listeners, @config = Autoversion::DSL.evaluate <<-eof
|
58
|
+
read_version do
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
automate_git :actions => [:tag]
|
63
|
+
eof
|
64
|
+
}.to raise_error(Autoversion::DSL::InvalidGitConfig)
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
Binary file
|
data/spec/gitter_spec.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'git'
|
3
|
+
|
4
|
+
describe Autoversion::Gitter do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@gitter_path = File.join(File.dirname(__FILE__), 'tmp', 'gitter')
|
8
|
+
|
9
|
+
if File.directory? @gitter_path
|
10
|
+
FileUtils.rm_rf @gitter_path
|
11
|
+
end
|
12
|
+
|
13
|
+
system("mkdir #{@gitter_path}")
|
14
|
+
system("tar -xf spec/fixtures/bare_repo.tar --strip 1 -C #{@gitter_path}")
|
15
|
+
|
16
|
+
system("echo 'test' > #{@gitter_path}/test.txt")
|
17
|
+
system("cd #{@gitter_path} && git add .")
|
18
|
+
system("cd #{@gitter_path} && git commit -m 'test'")
|
19
|
+
|
20
|
+
@gitter_repo = Git.open(@gitter_path)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should detect stable branch' do
|
24
|
+
@gitter = ::Autoversion::Gitter.new(@gitter_path, {
|
25
|
+
:stable_branch => 'master'})
|
26
|
+
|
27
|
+
@gitter_repo.branch('feature1').checkout
|
28
|
+
@gitter_repo.branch('feature2').checkout
|
29
|
+
@gitter.on_stable_branch?.should eq(false)
|
30
|
+
|
31
|
+
@gitter_repo.branch('master').checkout
|
32
|
+
@gitter.on_stable_branch?.should eq(true)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should be able to commit and tag a new version' do
|
36
|
+
@gitter = ::Autoversion::Gitter.new(@gitter_path, {
|
37
|
+
:actions => [:commit, :tag],
|
38
|
+
:stable_branch => 'master'})
|
39
|
+
|
40
|
+
#Fake version file
|
41
|
+
system("touch #{@gitter_path}/version.rb")
|
42
|
+
|
43
|
+
@gitter.commit! :major, 'v1.2.3'
|
44
|
+
|
45
|
+
@gitter_repo.log.first.message.should == "v1.2.3"
|
46
|
+
@gitter_repo.tags.first.name.should == "v1.2.3"
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should should detect cleanliness' do
|
50
|
+
@gitter = ::Autoversion::Gitter.new(@gitter_path, {
|
51
|
+
:stable_branch => 'master'})
|
52
|
+
|
53
|
+
@gitter.dir_is_clean?.should eq(true)
|
54
|
+
|
55
|
+
# Disabled for now since ruby-git does not read .gitignore files
|
56
|
+
#system("touch #{@gitter_path}/test2.txt")
|
57
|
+
#@gitter.dir_is_clean?.should eq(false)
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
data/spec/semver_spec.rb
ADDED
File without changes
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
require_relative '../lib/autoversion'
|
5
|
+
require_relative 'fixtures/versionfiles.rb'
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
# some (optional) config here
|
9
|
+
config.after(:all) do
|
10
|
+
FileUtils.rm_rf File.join(File.dirname(__FILE__), 'tmp', 'gitter')
|
11
|
+
FileUtils.rm_rf File.join(File.dirname(__FILE__), 'tmp', 'cli')
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Autoversion::Versioner do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@versioner = Autoversion::Versioner.new Versionfiles::VALID_BASIC
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be able to read the current version" do
|
10
|
+
expect(
|
11
|
+
@versioner.current_version.to_s
|
12
|
+
).to eq('1.2.3')
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be able to increment a major version" do
|
16
|
+
@versioner.increment! :major
|
17
|
+
|
18
|
+
expect(
|
19
|
+
@versioner.current_version.to_s
|
20
|
+
).to eq('2.0.0')
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be able to increment a minor version" do
|
24
|
+
@versioner.increment! :minor
|
25
|
+
|
26
|
+
expect(
|
27
|
+
@versioner.current_version.to_s
|
28
|
+
).to eq('1.3.0')
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should be able to increment a patch version" do
|
32
|
+
@versioner.increment! :patch
|
33
|
+
|
34
|
+
expect(
|
35
|
+
@versioner.current_version.to_s
|
36
|
+
).to eq('1.2.4')
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should not increment a major if simulate" do
|
40
|
+
@versioner.increment! :major, true
|
41
|
+
|
42
|
+
expect(
|
43
|
+
@versioner.current_version.to_s
|
44
|
+
).to eq('1.2.3')
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should not increment a minor if simulate" do
|
48
|
+
@versioner.increment! :minor, true
|
49
|
+
|
50
|
+
expect(
|
51
|
+
@versioner.current_version.to_s
|
52
|
+
).to eq('1.2.3')
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should not increment a patch if simulate" do
|
56
|
+
@versioner.increment! :patch, true
|
57
|
+
|
58
|
+
expect(
|
59
|
+
@versioner.current_version.to_s
|
60
|
+
).to eq('1.2.3')
|
61
|
+
end
|
62
|
+
end
|
metadata
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: autoversion
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jonathan Pettersson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-03-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.13.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.13.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: thor
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.17.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.17.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: git
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.2.5
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.2.5
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: semantic
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.1.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.1.0
|
69
|
+
description: Yeah
|
70
|
+
email: jonathan@spacetofu.com
|
71
|
+
executables:
|
72
|
+
- autoversion
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- .gitignore
|
77
|
+
- .rspec
|
78
|
+
- Gemfile
|
79
|
+
- Gemfile.lock
|
80
|
+
- LICENSE
|
81
|
+
- README.md
|
82
|
+
- Rakefile
|
83
|
+
- Versionfile
|
84
|
+
- autoversion.gemspec
|
85
|
+
- bin/autoversion
|
86
|
+
- lib/autoversion.rb
|
87
|
+
- lib/autoversion/.gitkeep
|
88
|
+
- lib/autoversion/cli.rb
|
89
|
+
- lib/autoversion/dsl.rb
|
90
|
+
- lib/autoversion/gitter.rb
|
91
|
+
- lib/autoversion/semver.rb
|
92
|
+
- lib/autoversion/version.rb
|
93
|
+
- lib/autoversion/versioner.rb
|
94
|
+
- spec/cli_spec.rb
|
95
|
+
- spec/dsl_spec.rb
|
96
|
+
- spec/fixtures/bare_repo.tar
|
97
|
+
- spec/fixtures/versionfiles.rb
|
98
|
+
- spec/gitter_spec.rb
|
99
|
+
- spec/semver_spec.rb
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
- spec/tmp/.gitkeep
|
102
|
+
- spec/versioner_spec.rb
|
103
|
+
homepage: https://github.com/jpettersson/autoversion
|
104
|
+
licenses:
|
105
|
+
- MIT
|
106
|
+
metadata: {}
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options: []
|
109
|
+
require_paths:
|
110
|
+
- lib
|
111
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - '>='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - '>='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
requirements: []
|
122
|
+
rubyforge_project:
|
123
|
+
rubygems_version: 2.0.0
|
124
|
+
signing_key:
|
125
|
+
specification_version: 4
|
126
|
+
summary: Automate your Semantic Versioning with git and hooks
|
127
|
+
test_files:
|
128
|
+
- spec/cli_spec.rb
|
129
|
+
- spec/dsl_spec.rb
|
130
|
+
- spec/fixtures/bare_repo.tar
|
131
|
+
- spec/fixtures/versionfiles.rb
|
132
|
+
- spec/gitter_spec.rb
|
133
|
+
- spec/semver_spec.rb
|
134
|
+
- spec/spec_helper.rb
|
135
|
+
- spec/tmp/.gitkeep
|
136
|
+
- spec/versioner_spec.rb
|