auto_tagger 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -1
- data/CHANGELOG +26 -2
- data/Gemfile +4 -4
- data/Gemfile.lock +60 -0
- data/README.md +90 -36
- data/Rakefile +1 -26
- data/VERSION +1 -1
- data/auto_tagger.gemspec +24 -14
- data/bin/autotag +14 -29
- data/features/autotag.feature +43 -2
- data/features/deployment.feature +4 -0
- data/features/step_definitions/autotag_steps.rb +27 -22
- data/features/step_definitions/deployment_steps.rb +41 -33
- data/features/support/env.rb +45 -2
- data/features/support/step_helpers.rb +36 -12
- data/features/templates/deploy.erb +1 -1
- data/lib/auto_tagger/base.rb +150 -19
- data/lib/auto_tagger/capistrano_helper.rb +38 -17
- data/lib/auto_tagger/command_line.rb +65 -0
- data/lib/auto_tagger/commander.rb +22 -11
- data/lib/auto_tagger/configuration.rb +88 -0
- data/lib/auto_tagger/deprecator.rb +11 -0
- data/lib/auto_tagger/git/ref.rb +34 -0
- data/lib/auto_tagger/git/ref_set.rb +35 -0
- data/lib/auto_tagger/git/repo.rb +76 -0
- data/lib/auto_tagger/options.rb +170 -0
- data/lib/auto_tagger/recipes.rb +67 -27
- data/lib/auto_tagger.rb +9 -4
- data/spec/auto_tagger/base_spec.rb +236 -52
- data/spec/auto_tagger/capistrano_helper_spec.rb +82 -112
- data/spec/auto_tagger/command_line_spec.rb +110 -0
- data/spec/auto_tagger/commander_spec.rb +33 -7
- data/spec/auto_tagger/configuration_spec.rb +275 -0
- data/spec/auto_tagger/git/ref_set_spec.rb +61 -0
- data/spec/auto_tagger/git/ref_spec.rb +46 -0
- data/spec/auto_tagger/git/repo_spec.rb +108 -0
- data/spec/auto_tagger/options_spec.rb +157 -0
- data/spec/spec_helper.rb +1 -6
- metadata +32 -15
- data/geminstaller.yml +0 -7
- data/lib/auto_tagger/repository.rb +0 -43
- data/lib/auto_tagger/stage_manager.rb +0 -23
- data/lib/auto_tagger/tag.rb +0 -43
- data/spec/auto_tagger/repository_spec.rb +0 -72
- data/spec/auto_tagger/stage_manager_spec.rb +0 -34
- data/spec/auto_tagger/tag_spec.rb +0 -66
@@ -1,19 +1,30 @@
|
|
1
1
|
module AutoTagger
|
2
2
|
class Commander
|
3
|
-
class << self
|
4
|
-
def execute(path, cmd)
|
5
|
-
`#{command_in_context(path, cmd)}`
|
6
|
-
end
|
7
3
|
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
def initialize(path, verbose)
|
5
|
+
@path = path
|
6
|
+
@verbose = verbose
|
7
|
+
end
|
8
|
+
|
9
|
+
def print(cmd)
|
10
|
+
puts command_in_context(cmd)
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
+
def read(cmd)
|
14
|
+
puts command_in_context(cmd) if @verbose
|
15
|
+
`#{command_in_context(cmd)}`
|
16
|
+
end
|
13
17
|
|
14
|
-
|
15
|
-
|
16
|
-
|
18
|
+
def execute(cmd)
|
19
|
+
puts command_in_context(cmd) if @verbose
|
20
|
+
system command_in_context(cmd)
|
17
21
|
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def command_in_context(cmd)
|
26
|
+
"cd #{@path} && #{cmd}"
|
27
|
+
end
|
28
|
+
|
18
29
|
end
|
19
30
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module AutoTagger
|
2
|
+
|
3
|
+
class Configuration
|
4
|
+
|
5
|
+
class InvalidRefPath < StandardError
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
@options = options
|
10
|
+
end
|
11
|
+
|
12
|
+
def working_directory
|
13
|
+
File.expand_path(@options[:path] || Dir.pwd)
|
14
|
+
end
|
15
|
+
|
16
|
+
def opts_file
|
17
|
+
file = @options[:opts_file] || ".auto_tagger"
|
18
|
+
File.expand_path File.join(working_directory, file)
|
19
|
+
end
|
20
|
+
|
21
|
+
def file_settings
|
22
|
+
return {} unless File.exists?(opts_file)
|
23
|
+
args = File.read(opts_file).to_s.split("\n").map { |line| line.strip }
|
24
|
+
args.reject! { |line| line == "" }
|
25
|
+
AutoTagger::Options.from_file(args)
|
26
|
+
end
|
27
|
+
|
28
|
+
def settings
|
29
|
+
file_settings.merge(@options)
|
30
|
+
end
|
31
|
+
|
32
|
+
def stages
|
33
|
+
stages = settings[:stages] || []
|
34
|
+
stages = stages.to_s.split(",").map { |stage| stage.strip } if stages.is_a?(String)
|
35
|
+
stages.reject { |stage| stage.to_s == "" }
|
36
|
+
end
|
37
|
+
|
38
|
+
def stage
|
39
|
+
settings[:stage] || stages.last
|
40
|
+
end
|
41
|
+
|
42
|
+
def date_separator
|
43
|
+
settings[:date_separator] ||= ""
|
44
|
+
end
|
45
|
+
|
46
|
+
def dry_run?
|
47
|
+
settings.fetch(:dry_run, false)
|
48
|
+
end
|
49
|
+
|
50
|
+
def verbose?
|
51
|
+
settings.fetch(:verbose, false)
|
52
|
+
end
|
53
|
+
|
54
|
+
def offline?
|
55
|
+
settings.fetch(:offline, false)
|
56
|
+
end
|
57
|
+
|
58
|
+
def fetch_refs?
|
59
|
+
!offline? && settings.fetch(:fetch_refs, true)
|
60
|
+
end
|
61
|
+
|
62
|
+
def push_refs?
|
63
|
+
!offline? && settings.fetch(:push_refs, true)
|
64
|
+
end
|
65
|
+
|
66
|
+
def executable
|
67
|
+
settings[:executable] || "git"
|
68
|
+
end
|
69
|
+
|
70
|
+
def refs_to_keep
|
71
|
+
(settings[:refs_to_keep] || 1).to_i
|
72
|
+
end
|
73
|
+
|
74
|
+
def remote
|
75
|
+
settings[:remote] || "origin"
|
76
|
+
end
|
77
|
+
|
78
|
+
def ref_path
|
79
|
+
path = settings[:ref_path] || "tags"
|
80
|
+
if ["heads", "remotes"].include?(path)
|
81
|
+
raise InvalidRefPath, "#{path} is a reserved word in git. Please use something else."
|
82
|
+
end
|
83
|
+
path
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module AutoTagger
|
2
|
+
module Git
|
3
|
+
class Ref
|
4
|
+
attr_reader :sha, :name
|
5
|
+
|
6
|
+
# name is refs/autotags/2009292827
|
7
|
+
def initialize(repo, sha, name)
|
8
|
+
@repo, @sha, @name = repo, sha, name
|
9
|
+
end
|
10
|
+
|
11
|
+
def ==(other)
|
12
|
+
other.is_a?(self.class) && other.sha == sha && other.name == name
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"%s %s" % [sha, name]
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete_locally
|
20
|
+
@repo.exec "update-ref -d #{name}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def delete_on_remote(remote = "origin")
|
24
|
+
@repo.exec "push #{remote} :#{name}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def save
|
28
|
+
@repo.exec "update-ref #{name} #{sha}"
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module AutoTagger
|
2
|
+
module Git
|
3
|
+
class RefSet
|
4
|
+
|
5
|
+
def initialize(repo)
|
6
|
+
@repo = repo
|
7
|
+
end
|
8
|
+
|
9
|
+
def all
|
10
|
+
@repo.read("show-ref").split(/\n/).map do |line|
|
11
|
+
sha, name = line.split
|
12
|
+
Ref.new(@repo, sha, name)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# name = refs/autotags/2009857463
|
17
|
+
# returns a ref
|
18
|
+
# should un-cache the refs in refset, or never memoize
|
19
|
+
def create(sha, name)
|
20
|
+
Ref.new(@repo, sha, name).save
|
21
|
+
end
|
22
|
+
|
23
|
+
# pattern = refs/autotags/*
|
24
|
+
def push(pattern, remote = "origin")
|
25
|
+
@repo.exec "push #{remote} #{pattern}:#{pattern}"
|
26
|
+
end
|
27
|
+
|
28
|
+
# pattern = refs/auto_tags/*
|
29
|
+
def fetch(pattern, remote = "origin")
|
30
|
+
@repo.exec "fetch #{remote} #{pattern}:#{pattern}"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module AutoTagger
|
2
|
+
module Git
|
3
|
+
|
4
|
+
# A class that represents a git repo
|
5
|
+
#
|
6
|
+
# repo.refs.create name, sha
|
7
|
+
# repo.refs.all
|
8
|
+
# repo.refs.push origin, pattern
|
9
|
+
# repo.refs.fetch origin, pattern
|
10
|
+
#
|
11
|
+
class Repo
|
12
|
+
|
13
|
+
class NoPathProvidedError < StandardError
|
14
|
+
end
|
15
|
+
|
16
|
+
class NoSuchPathError < StandardError
|
17
|
+
end
|
18
|
+
|
19
|
+
class InvalidGitRepositoryError < StandardError
|
20
|
+
end
|
21
|
+
|
22
|
+
class GitCommandFailedError < StandardError
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(given_path, options = {})
|
26
|
+
@given_path = given_path
|
27
|
+
@execute_commands = options.fetch(:execute_commands, true)
|
28
|
+
@verbose = options[:verbose]
|
29
|
+
@executable = options[:executable] || "git"
|
30
|
+
end
|
31
|
+
|
32
|
+
def path
|
33
|
+
return @path if @path
|
34
|
+
raise NoPathProvidedError if @given_path.to_s.strip == ""
|
35
|
+
raise NoSuchPathError if !File.exists?(@given_path)
|
36
|
+
raise InvalidGitRepositoryError if !File.exists?(File.join(@given_path, ".git"))
|
37
|
+
@path = @given_path
|
38
|
+
end
|
39
|
+
|
40
|
+
def refs
|
41
|
+
RefSet.new(self)
|
42
|
+
end
|
43
|
+
|
44
|
+
def ==(other)
|
45
|
+
other.is_a?(AutoTagger::Git::Repo) && other.path == path
|
46
|
+
end
|
47
|
+
|
48
|
+
def latest_commit_sha
|
49
|
+
read("rev-parse HEAD").strip
|
50
|
+
end
|
51
|
+
|
52
|
+
def read(cmd)
|
53
|
+
commander.read(git_command(cmd))
|
54
|
+
end
|
55
|
+
|
56
|
+
def exec(cmd)
|
57
|
+
if @execute_commands
|
58
|
+
commander.execute(git_command(cmd)) || raise(GitCommandFailedError)
|
59
|
+
else
|
60
|
+
commander.print(git_command(cmd))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def git_command(cmd)
|
67
|
+
"%s %s" % [@executable, cmd]
|
68
|
+
end
|
69
|
+
|
70
|
+
def commander
|
71
|
+
AutoTagger::Commander.new(path, @verbose)
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
module AutoTagger
|
2
|
+
class Options
|
3
|
+
|
4
|
+
def self.from_command_line(args)
|
5
|
+
options = {}
|
6
|
+
args.extend(::OptionParser::Arguable)
|
7
|
+
args.options do |opts|
|
8
|
+
opts.banner = [
|
9
|
+
"",
|
10
|
+
" USAGE: autotag command [stage] [options]",
|
11
|
+
"",
|
12
|
+
" Examples:",
|
13
|
+
"",
|
14
|
+
" autotag help",
|
15
|
+
" autotag version",
|
16
|
+
" autotag create demo",
|
17
|
+
" autotag create demo .",
|
18
|
+
" autotag create demo ../",
|
19
|
+
" autotag create ci /data/myrepo",
|
20
|
+
" autotag create ci /data/myrepo --fetch-refs=false --push-refs=false",
|
21
|
+
" autotag create ci /data/myrepo --offline",
|
22
|
+
" autotag create ci /data/myrepo --dry-run",
|
23
|
+
"",
|
24
|
+
" autotag list demo",
|
25
|
+
"",
|
26
|
+
" autotag cleanup demo --refs-to-keep=2",
|
27
|
+
" autotag cleanup demo --refs-to-keep=2",
|
28
|
+
" autotag delete_locally demo",
|
29
|
+
" autotag delete_on_remote demo",
|
30
|
+
"",
|
31
|
+
"",
|
32
|
+
].join("\n")
|
33
|
+
|
34
|
+
common_options(opts, options)
|
35
|
+
|
36
|
+
opts.on("--opts-file OPTS_FILE",
|
37
|
+
"full path to the opts file",
|
38
|
+
"Defaults to working directory's .auto_tagger file",
|
39
|
+
"Example: /usr/local/.auto_tagger") do |o|
|
40
|
+
options[:opts_file] = o
|
41
|
+
end
|
42
|
+
|
43
|
+
opts.on_tail("-h", "--help", "-?", "You're looking at it.") do
|
44
|
+
options[:show_help] = true
|
45
|
+
options[:command] = :help
|
46
|
+
end
|
47
|
+
|
48
|
+
opts.on_tail("--version", "-v", "Show version") do
|
49
|
+
options[:show_version] = true
|
50
|
+
options[:command] = :version
|
51
|
+
end
|
52
|
+
|
53
|
+
end.parse!
|
54
|
+
|
55
|
+
case args.first.to_s.downcase
|
56
|
+
when "config"
|
57
|
+
options[:command] = :config
|
58
|
+
when "version"
|
59
|
+
options[:show_version] = true
|
60
|
+
options[:command] = :version
|
61
|
+
when * ["help", ""]
|
62
|
+
options[:show_help] = true
|
63
|
+
options[:help_text] = args.options.help
|
64
|
+
options[:command] = :help
|
65
|
+
when "cleanup"
|
66
|
+
options[:command] = :cleanup
|
67
|
+
options[:stage] = args[1]
|
68
|
+
when "delete_locally"
|
69
|
+
options[:command] = :delete_locally
|
70
|
+
options[:stage] = args[1]
|
71
|
+
when "delete_on_remote"
|
72
|
+
options[:command] = :delete_on_remote
|
73
|
+
options[:stage] = args[1]
|
74
|
+
when "list"
|
75
|
+
options[:command] = :list
|
76
|
+
options[:stage] = args[1]
|
77
|
+
when "create"
|
78
|
+
options[:command] = :create
|
79
|
+
options[:stage] = args[1]
|
80
|
+
options[:path] = args[2]
|
81
|
+
else
|
82
|
+
if options[:command].nil?
|
83
|
+
options[:command] = :create # allow
|
84
|
+
options[:deprecated] = true
|
85
|
+
options[:stage] = args[0]
|
86
|
+
options[:path] = args[1]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
options
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.from_file(args)
|
94
|
+
options = {}
|
95
|
+
args.extend(::OptionParser::Arguable)
|
96
|
+
args.options do |opts|
|
97
|
+
common_options(opts, options)
|
98
|
+
end.parse!
|
99
|
+
options
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def self.common_options(opts, options)
|
105
|
+
|
106
|
+
opts.on("--date-separator SEPARATOR",
|
107
|
+
"Sets the separator of the date part of the ref",
|
108
|
+
"Defaults to ''") do |o|
|
109
|
+
options[:date_separator] = o
|
110
|
+
end
|
111
|
+
|
112
|
+
opts.on("--fetch-refs FETCH_REFS", TrueClass,
|
113
|
+
"Whether or not to fetch tags before creating the tag",
|
114
|
+
"Defaults to true") do |o|
|
115
|
+
options[:fetch_refs] = o
|
116
|
+
end
|
117
|
+
|
118
|
+
opts.on("--push-refs PUSH_REFS", TrueClass,
|
119
|
+
"Whether or not to push tags after creating the tag",
|
120
|
+
"Defaults to true") do |o|
|
121
|
+
options[:push_refs] = o
|
122
|
+
end
|
123
|
+
|
124
|
+
opts.on("--remote REMOTE",
|
125
|
+
"specify the git remote",
|
126
|
+
"Defaults to origin") do |o|
|
127
|
+
options[:remote] = o
|
128
|
+
end
|
129
|
+
|
130
|
+
opts.on("--ref-path REF_PATH",
|
131
|
+
"specify the ref-path",
|
132
|
+
"Defaults to auto_tags") do |o|
|
133
|
+
options[:ref_path] = o
|
134
|
+
end
|
135
|
+
|
136
|
+
opts.on("--stages STAGES",
|
137
|
+
"specify a comma-separated list of stages") do |o|
|
138
|
+
options[:stages] = o
|
139
|
+
end
|
140
|
+
|
141
|
+
opts.on("--offline [OFFLINE]", FalseClass,
|
142
|
+
"Same as --fetch-refs=false and --push-refs=false") do |o|
|
143
|
+
options[:offline] = o
|
144
|
+
end
|
145
|
+
|
146
|
+
opts.on("--dry-run [DRYRUN]", TrueClass,
|
147
|
+
"doesn't execute anything, but logs what it would run") do |o|
|
148
|
+
options[:dry_run] = o.nil? || (o == true)
|
149
|
+
end
|
150
|
+
|
151
|
+
opts.on("--verbose [VERBOSE]", TrueClass,
|
152
|
+
"logs all commands") do |o|
|
153
|
+
options[:verbose] = o
|
154
|
+
end
|
155
|
+
|
156
|
+
opts.on("--refs-to-keep REFS_TO_KEEP",
|
157
|
+
"logs all commands") do |o|
|
158
|
+
options[:refs_to_keep] = (o ? o.to_i : nil)
|
159
|
+
end
|
160
|
+
|
161
|
+
opts.on("--executable EXECUTABLE",
|
162
|
+
"the full path to the git executable",
|
163
|
+
"Defaults to git (and assumes git is your path)",
|
164
|
+
"Example: /usr/local/bin/git") do |o|
|
165
|
+
options[:git] = o
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
end
|
data/lib/auto_tagger/recipes.rb
CHANGED
@@ -1,54 +1,94 @@
|
|
1
1
|
require File.expand_path(File.join(File.dirname(__FILE__), "..", "auto_tagger"))
|
2
2
|
|
3
3
|
Capistrano::Configuration.instance(:must_exist).load do
|
4
|
-
|
4
|
+
|
5
|
+
namespace :auto_tagger do
|
6
|
+
|
7
|
+
def auto_tagger_capistrano_helper
|
8
|
+
AutoTagger::CapistranoHelper.new(variables)
|
9
|
+
end
|
10
|
+
|
11
|
+
def auto_tagger
|
12
|
+
auto_tagger_capistrano_helper.auto_tagger
|
13
|
+
end
|
14
|
+
|
15
|
+
def log_auto_tagger(message)
|
16
|
+
logger.info "AUTO TAGGER: #{message}"
|
17
|
+
end
|
18
|
+
|
5
19
|
desc %Q{
|
6
20
|
Sets the branch to the latest tag from the previous stage.
|
7
|
-
Use -Shead=true to set the branch to master,
|
21
|
+
Use -Shead=true to set the branch to master,
|
22
|
+
-Stag=<tag> or -Sref=<ref> to specify the tag explicitly.
|
8
23
|
}
|
9
24
|
task :set_branch do
|
10
|
-
if
|
11
|
-
set :branch,
|
12
|
-
|
25
|
+
if ref = auto_tagger_capistrano_helper.ref
|
26
|
+
set :branch, ref
|
27
|
+
log_auto_tagger "setting branch to #{ref}"
|
13
28
|
else
|
14
|
-
|
29
|
+
log_auto_tagger "skipping auto-assignment of branch. Branch will remain the default.}"
|
15
30
|
end
|
16
31
|
end
|
17
32
|
|
18
|
-
desc %Q{
|
19
|
-
task :
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
33
|
+
desc %Q{Creates a tag using the stage variable}
|
34
|
+
task :create_ref, :roles => :app do
|
35
|
+
if variables[:stage]
|
36
|
+
ref = auto_tagger.create_ref(real_revision)
|
37
|
+
log_auto_tagger "created tag #{ref.name} from #{ref.sha}"
|
38
|
+
else
|
39
|
+
ref = auto_tagger.create_ref
|
40
|
+
log_auto_tagger "created tag #{ref.name}"
|
24
41
|
end
|
25
42
|
end
|
26
43
|
|
27
|
-
desc %Q{
|
28
|
-
task :
|
29
|
-
|
44
|
+
desc %Q{DEPRECATED: Prints the most current tags from all stages}
|
45
|
+
task :print_latest_refs, :roles => :app do
|
46
|
+
log_auto_tagger "release tag history is:"
|
47
|
+
auto_tagger.release_tag_entries.each { |entry| logger.info entry }
|
48
|
+
end
|
49
|
+
|
50
|
+
desc %Q{DEPRECATED: Reads the text file with the latest tag from the shared directory}
|
51
|
+
task :read_ref_from_shared, :roles => :app do
|
52
|
+
log_auto_tagger "latest tag deployed to this environment was:"
|
30
53
|
run "cat #{shared_path}/released_git_tag.txt"
|
31
54
|
end
|
32
55
|
|
33
|
-
desc %Q{Writes the tag name to a file in the shared directory}
|
34
|
-
task :
|
56
|
+
desc %Q{DEPRECATED: Writes the tag name to a file in the shared directory}
|
57
|
+
task :write_ref_to_shared, :roles => :app do
|
35
58
|
if exists?(:branch)
|
36
|
-
|
59
|
+
log_auto_tagger "writing tag to shared text file on remote server"
|
37
60
|
run "echo '#{branch}' > #{shared_path}/released_git_tag.txt"
|
38
61
|
else
|
39
|
-
|
62
|
+
log_auto_tagger "no branch available. Text file was not written to server"
|
40
63
|
end
|
41
64
|
end
|
65
|
+
end
|
66
|
+
|
67
|
+
namespace :release_tagger do
|
68
|
+
desc %Q{DEPRECATED: use auto_tagger:set_branch }
|
69
|
+
task :set_branch do
|
70
|
+
auto_tagger.set_branch
|
71
|
+
end
|
42
72
|
|
43
|
-
desc %Q{
|
73
|
+
desc %Q{DEPRECATED: use auto_tagger:create_ref}
|
44
74
|
task :create_tag, :roles => :app do
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
75
|
+
auto_tagger.create_ref
|
76
|
+
end
|
77
|
+
|
78
|
+
desc %Q{DEPRECATED: use auto_tagger:print_latest_tags}
|
79
|
+
task :print_latest_refs, :roles => :app do
|
80
|
+
auto_tagger.print_latest_tags
|
81
|
+
end
|
82
|
+
|
83
|
+
desc %Q{DEPRECATED: use auto_tagger:read_ref_from_shared}
|
84
|
+
task :read_tag_from_shared, :roles => :app do
|
85
|
+
auto_tagger.read_ref_from_shared
|
86
|
+
end
|
87
|
+
|
88
|
+
desc %Q{DEPRECATED: use auto_tagger:write_ref_to_shared}
|
89
|
+
task :write_tag_to_shared, :roles => :app do
|
90
|
+
auto_tagger.write_ref_to_shared
|
52
91
|
end
|
53
92
|
end
|
93
|
+
|
54
94
|
end
|
data/lib/auto_tagger.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
+
require 'optparse'
|
1
2
|
[
|
2
|
-
'
|
3
|
-
'
|
4
|
-
'
|
3
|
+
'deprecator',
|
4
|
+
'git/ref',
|
5
|
+
'git/ref_set',
|
6
|
+
'git/repo',
|
5
7
|
'base',
|
6
|
-
'
|
8
|
+
'command_line',
|
9
|
+
'commander',
|
10
|
+
'configuration',
|
11
|
+
'options',
|
7
12
|
'capistrano_helper'
|
8
13
|
].each do |file|
|
9
14
|
require File.expand_path(File.join(File.dirname(__FILE__), "auto_tagger", file))
|