htauth 1.0.3 → 1.1.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.
Files changed (52) hide show
  1. checksums.yaml +15 -0
  2. data/CONTRIBUTING.md +46 -0
  3. data/HISTORY.md +36 -0
  4. data/Manifest.txt +45 -0
  5. data/{README → README.md} +21 -22
  6. data/Rakefile +17 -0
  7. data/bin/htpasswd-ruby +5 -5
  8. data/lib/htauth/algorithm.rb +1 -8
  9. data/lib/htauth/crypt.rb +1 -1
  10. data/lib/htauth/digest.rb +5 -2
  11. data/lib/htauth/digest_entry.rb +5 -4
  12. data/lib/htauth/digest_file.rb +1 -1
  13. data/lib/htauth/errors.rb +10 -0
  14. data/lib/htauth/file.rb +1 -1
  15. data/lib/htauth/md5.rb +2 -0
  16. data/lib/htauth/passwd.rb +10 -4
  17. data/lib/htauth/passwd_entry.rb +2 -1
  18. data/lib/htauth/passwd_file.rb +64 -63
  19. data/lib/htauth/plaintext.rb +12 -11
  20. data/lib/htauth/version.rb +8 -9
  21. data/lib/htauth.rb +14 -4
  22. data/spec/crypt_spec.rb +10 -12
  23. data/spec/digest_entry_spec.rb +20 -21
  24. data/spec/digest_file_spec.rb +11 -12
  25. data/spec/digest_spec.rb +23 -23
  26. data/spec/md5_spec.rb +2 -2
  27. data/spec/passwd_entry_spec.rb +47 -48
  28. data/spec/passwd_file_spec.rb +12 -13
  29. data/spec/passwd_spec.rb +37 -38
  30. data/spec/plaintext_spec.rb +4 -7
  31. data/spec/sha1_spec.rb +3 -5
  32. data/spec/spec_helper.rb +8 -4
  33. data/spec/test.add.digest +3 -0
  34. data/spec/test.add.passwd +3 -0
  35. data/spec/test.delete.digest +1 -0
  36. data/spec/test.delete.passwd +1 -0
  37. data/spec/test.original.digest +2 -0
  38. data/spec/test.original.passwd +2 -0
  39. data/spec/test.update.digest +2 -0
  40. data/spec/test.update.passwd +2 -0
  41. data/tasks/default.rake +276 -0
  42. data/tasks/this.rb +214 -0
  43. metadata +131 -75
  44. data/HISTORY +0 -26
  45. data/gemspec.rb +0 -43
  46. data/tasks/announce.rake +0 -38
  47. data/tasks/config.rb +0 -98
  48. data/tasks/distribution.rake +0 -46
  49. data/tasks/documentation.rake +0 -31
  50. data/tasks/rspec.rake +0 -29
  51. data/tasks/rubyforge.rake +0 -59
  52. data/tasks/utils.rb +0 -80
data/spec/passwd_spec.rb CHANGED
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__),"spec_helper.rb")
1
+ require 'spec_helper'
2
2
  require 'htauth/passwd'
3
3
  require 'tempfile'
4
4
 
@@ -41,8 +41,8 @@ describe HTAuth::Passwd do
41
41
  begin
42
42
  @htauth.run([ "-h" ])
43
43
  rescue SystemExit => se
44
- se.status.should == 1
45
- @stdout.string.should =~ /passwordfile username/m
44
+ se.status.must_equal 1
45
+ @stdout.string.must_match( /passwordfile username/m )
46
46
  end
47
47
  end
48
48
 
@@ -50,8 +50,8 @@ describe HTAuth::Passwd do
50
50
  begin
51
51
  @htauth.run([ "--version" ])
52
52
  rescue SystemExit => se
53
- se.status.should == 1
54
- @stdout.string.should =~ /version #{HTAuth::VERSION}/
53
+ se.status.must_equal 1
54
+ @stdout.string.must_match( /version #{HTAuth::VERSION}/)
55
55
  end
56
56
  end
57
57
 
@@ -62,11 +62,11 @@ describe HTAuth::Passwd do
62
62
  @stdin.rewind
63
63
  @htauth.run([ "-m", "-c", @new_file, "alice" ])
64
64
  rescue SystemExit => se
65
- se.status.should == 0
65
+ se.status.must_equal 0
66
66
  l = IO.readlines(@new_file)
67
67
  fields = l.first.split(':')
68
- fields.first.should == "alice"
69
- fields.last.should =~ /^\$apr1\$/
68
+ fields.first.must_equal "alice"
69
+ fields.last.must_match( /^\$apr1\$/ )
70
70
  end
71
71
  end
72
72
 
@@ -78,27 +78,26 @@ describe HTAuth::Passwd do
78
78
  @stdin.rewind
79
79
  @htauth.run([ "-c", @tf.path, "bob"])
80
80
  rescue SystemExit => se
81
- se.status.should == 0
81
+ se.status.must_equal 0
82
82
  after_lines = IO.readlines(@tf.path)
83
- after_lines.size.should == 1
84
- before_lines.size.should == 2
83
+ after_lines.size.must_equal 1
84
+ before_lines.size.must_equal 2
85
85
  end
86
86
  end
87
87
 
88
88
  it "adds an entry to an existing file and force SHA" do
89
- before_lines = IO.readlines(@tf.path)
90
89
  begin
91
90
  @stdin.puts "c secret"
92
91
  @stdin.puts "c secret"
93
92
  @stdin.rewind
94
93
  @htauth.run([ "-s", @tf.path, "charlie" ])
95
94
  rescue SystemExit => se
96
- se.status.should == 0
95
+ se.status.must_equal 0
97
96
  after_lines = IO.readlines(@tf.path)
98
- after_lines.should have(3).lines
97
+ after_lines.size.must_equal 3
99
98
  al = after_lines.last.split(':')
100
- al.first.should == "charlie"
101
- al.last.should =~ /\{SHA\}/
99
+ al.first.must_equal "charlie"
100
+ al.last.must_match( /\{SHA\}/ )
102
101
  end
103
102
  end
104
103
 
@@ -109,8 +108,8 @@ describe HTAuth::Passwd do
109
108
  @stdin.rewind
110
109
  @htauth.run(["-c", "-p", @tf.path, "bradley"])
111
110
  rescue SystemExit => se
112
- se.status.should == 0
113
- IO.read(@tf.path).strip.should == "bradley:a bad password"
111
+ se.status.must_equal 0
112
+ IO.read(@tf.path).strip.must_equal "bradley:a bad password"
114
113
  end
115
114
  end
116
115
 
@@ -118,8 +117,8 @@ describe HTAuth::Passwd do
118
117
  begin
119
118
  @htauth.run(["-c", "-p", "-b", @tf.path, "bradley", "a bad password"])
120
119
  rescue SystemExit => se
121
- se.status.should == 0
122
- IO.read(@tf.path).strip.should == "bradley:a bad password"
120
+ se.status.must_equal 0
121
+ IO.read(@tf.path).strip.must_equal "bradley:a bad password"
123
122
  end
124
123
  end
125
124
 
@@ -131,16 +130,16 @@ describe HTAuth::Passwd do
131
130
  @stdin.rewind
132
131
  @htauth.run([ "-d", @tf.path, "alice" ])
133
132
  rescue SystemExit => se
134
- @stderr.string.should == ""
135
- se.status.should == 0
133
+ @stderr.string.must_equal ""
134
+ se.status.must_equal 0
136
135
  after_lines = IO.readlines(@tf.path)
137
- after_lines.size.should == before_lines.size
136
+ after_lines.size.must_equal before_lines.size
138
137
 
139
138
  a_b = before_lines.first.split(":")
140
139
  a_a = after_lines.first.split(":")
141
140
 
142
- a_b.first.should == a_a.first
143
- a_b.last.should_not == a_a.last
141
+ a_b.first.must_equal a_a.first
142
+ a_b.last.wont_equal a_a.last
144
143
  end
145
144
  end
146
145
 
@@ -148,9 +147,9 @@ describe HTAuth::Passwd do
148
147
  begin
149
148
  @htauth.run([ "-D", @tf.path, "bob" ])
150
149
  rescue SystemExit => se
151
- @stderr.string.should == ""
152
- se.status.should == 0
153
- IO.read(@tf.path).should == IO.read(PASSWD_DELETE_TEST_FILE)
150
+ @stderr.string.must_equal ""
151
+ se.status.must_equal 0
152
+ IO.read(@tf.path).must_equal IO.read(PASSWD_DELETE_TEST_FILE)
154
153
  end
155
154
  end
156
155
 
@@ -158,8 +157,8 @@ describe HTAuth::Passwd do
158
157
  begin
159
158
  @htauth.run(["-n", "-p", "-b", "bradley", "a bad password"])
160
159
  rescue SystemExit => se
161
- se.status.should == 0
162
- @stdout.string.strip.should == "bradley:a bad password"
160
+ se.status.must_equal 0
161
+ @stdout.string.strip.must_equal "bradley:a bad password"
163
162
  end
164
163
  end
165
164
 
@@ -170,8 +169,8 @@ describe HTAuth::Passwd do
170
169
  @stdin.rewind
171
170
  @htauth.run([ "-c", "/etc/you-cannot-create-me", "alice"])
172
171
  rescue SystemExit => se
173
- @stderr.string.should =~ %r{Password file failure \(/etc/you-cannot-create-me\)}m
174
- se.status.should == 1
172
+ @stderr.string.must_match( %r{Password file failure \(/etc/you-cannot-create-me\)}m )
173
+ se.status.must_equal 1
175
174
  end
176
175
  end
177
176
 
@@ -182,8 +181,8 @@ describe HTAuth::Passwd do
182
181
  @stdin.rewind
183
182
  @htauth.run([ @tf.path, "alice"])
184
183
  rescue SystemExit => se
185
- @stderr.string.should =~ /They don't match, sorry./m
186
- se.status.should == 1
184
+ @stderr.string.must_match( /They don't match, sorry./m )
185
+ se.status.must_equal 1
187
186
  end
188
187
  end
189
188
 
@@ -191,8 +190,8 @@ describe HTAuth::Passwd do
191
190
  begin
192
191
  @htauth.run(["--blah"])
193
192
  rescue SystemExit => se
194
- @stderr.string.should =~ /ERROR:/m
195
- se.status.should == 1
193
+ @stderr.string.must_match( /ERROR:/m )
194
+ se.status.must_equal 1
196
195
  end
197
196
  end
198
197
 
@@ -200,8 +199,8 @@ describe HTAuth::Passwd do
200
199
  begin
201
200
  @htauth.run(["-c", "-n"])
202
201
  rescue SystemExit => se
203
- @stderr.string.should =~ /ERROR:/m
204
- se.status.should == 1
202
+ @stderr.string.must_match( /ERROR:/m )
203
+ se.status.must_equal 1
205
204
  end
206
205
  end
207
206
  end
@@ -1,18 +1,15 @@
1
-
2
-
3
- require File.join(File.dirname(__FILE__),"spec_helper.rb")
4
-
5
- require 'htauth/sha1'
1
+ require 'spec_helper'
2
+ require 'htauth/plaintext'
6
3
 
7
4
  describe HTAuth::Plaintext do
8
5
  it "has a prefix" do
9
- HTAuth::Plaintext.new.prefix.should == ""
6
+ HTAuth::Plaintext.new.prefix.must_equal ""
10
7
  end
11
8
 
12
9
  it "encrypts the same way that apache does" do
13
10
  apache_result = "a secret"
14
11
  pt = HTAuth::Plaintext.new
15
- pt.encode("a secret").should == apache_result
12
+ pt.encode("a secret").must_equal apache_result
16
13
  end
17
14
  end
18
15
 
data/spec/sha1_spec.rb CHANGED
@@ -1,17 +1,15 @@
1
-
2
- require File.join(File.dirname(__FILE__),"spec_helper.rb")
3
-
1
+ require 'spec_helper'
4
2
  require 'htauth/sha1'
5
3
 
6
4
  describe HTAuth::Sha1 do
7
5
  it "has a prefix" do
8
- HTAuth::Sha1.new.prefix.should == "{SHA}"
6
+ HTAuth::Sha1.new.prefix.must_equal "{SHA}"
9
7
  end
10
8
 
11
9
  it "encrypts the same way that apache does" do
12
10
  apache_result = "{SHA}ZrnlrvmM7ZCOV3FAvM7la89NKbk="
13
11
  sha1 = HTAuth::Sha1.new
14
- sha1.encode("a secret").should == apache_result
12
+ sha1.encode("a secret").must_equal apache_result
15
13
  end
16
14
  end
17
15
 
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,12 @@
1
- require 'rubygems'
2
- require 'spec'
1
+ if RUBY_VERSION >= '1.9.2' then
2
+ require 'simplecov'
3
+ puts "Using coverage!"
4
+ SimpleCov.start if ENV['COVERAGE']
5
+ end
3
6
 
4
- $: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib"))
5
- require 'htauth'
7
+ gem 'minitest'
8
+ require 'minitest/autorun'
9
+ require 'minitest/pride'
6
10
 
7
11
  PASSWD_ORIGINAL_TEST_FILE = File.join(File.dirname(__FILE__), "test.original.passwd")
8
12
  PASSWD_ADD_TEST_FILE = File.join(File.dirname(__FILE__), "test.add.passwd")
@@ -0,0 +1,3 @@
1
+ bob:htauth:fcbeab6821d2ab3b00934c958db0fd1e
2
+ alice:htauth:2f361db93147d84831eb34f19d05bfbb
3
+ charlie:htauth-new:1ec9da72c45d9140949f338dc537c089
@@ -0,0 +1,3 @@
1
+ alice:$apr1$DghnA...$CsPcgerfsI/Ryy0AOAJtb0
2
+ bob:SFUkhjaJc18KA
3
+ charlie:{SHA}Cqrkk2no+ly0vYClUp49OJQahSE=
@@ -0,0 +1 @@
1
+ bob:htauth:fcbeab6821d2ab3b00934c958db0fd1e
@@ -0,0 +1 @@
1
+ alice:$apr1$DghnA...$CsPcgerfsI/Ryy0AOAJtb0
@@ -0,0 +1,2 @@
1
+ bob:htauth:fcbeab6821d2ab3b00934c958db0fd1e
2
+ alice:htauth:2f361db93147d84831eb34f19d05bfbb
@@ -0,0 +1,2 @@
1
+ alice:$apr1$DghnA...$CsPcgerfsI/Ryy0AOAJtb0
2
+ bob:SFUkhjaJc18KA
@@ -0,0 +1,2 @@
1
+ bob:htauth:fcbeab6821d2ab3b00934c958db0fd1e
2
+ alice:htauth:c32a4df25c6ecf75f3eaeb96771520de
@@ -0,0 +1,2 @@
1
+ alice:{SHA}GnoUUjgrLF07/6L9lW2BcaDXxB0=
2
+ bob:SFUkhjaJc18KA
@@ -0,0 +1,276 @@
1
+ # vim: syntax=ruby
2
+ require 'rake/clean'
3
+ require 'digest'
4
+ #------------------------------------------------------------------------------
5
+ # If you want to Develop on this project just run 'rake develop' and you'll
6
+ # have all you need to get going. If you want to use bundler for development,
7
+ # then run 'rake develop:using_bundler'
8
+ #------------------------------------------------------------------------------
9
+ namespace :develop do
10
+
11
+ # Install all the development and runtime dependencies of this gem using the
12
+ # gemspec.
13
+ task :default do
14
+ require 'rubygems/dependency_installer'
15
+ installer = ::Gem::DependencyInstaller.new
16
+
17
+ This.set_coverage_gem
18
+
19
+ puts "Installing gem depedencies needed for development"
20
+ This.platform_gemspec.dependencies.each do |dep|
21
+ if dep.matching_specs.empty? then
22
+ puts "Installing : #{dep}"
23
+ installer.install dep
24
+ else
25
+ puts "Skipping : #{dep} -> already installed #{dep.matching_specs.first.full_name}"
26
+ end
27
+ end
28
+ puts "\n\nNow run 'rake test'"
29
+ end
30
+
31
+ # Create a Gemfile that just references the gemspec
32
+ file 'Gemfile' => :gemspec do
33
+ File.open( "Gemfile", "w+" ) do |f|
34
+ f.puts "# DO NOT EDIT - This file is automatically generated"
35
+ f.puts "# Make changes to Manifest.txt and/or Rakefile and regenerate"
36
+ f.puts 'source "https://rubygems.org/"'
37
+ f.puts 'gemspec'
38
+ end
39
+ end
40
+
41
+ desc "Create a bundler Gemfile"
42
+ task :using_bundler => 'Gemfile' do
43
+ puts "Now you can 'bundle'"
44
+ end
45
+
46
+ # Gemfiles are build artifacts
47
+ CLOBBER << FileList['Gemfile*']
48
+ end
49
+ desc "Boostrap development"
50
+ task :develop => "develop:default"
51
+
52
+ #------------------------------------------------------------------------------
53
+ # Minitest - standard TestTask
54
+ #------------------------------------------------------------------------------
55
+ begin
56
+ require 'rake/testtask'
57
+ Rake::TestTask.new( :test ) do |t|
58
+ t.ruby_opts = %w[ -w -rubygems ]
59
+ t.libs = %w[ lib spec test ]
60
+ t.pattern = "{test,spec}/**/{test_*,*_spec}.rb"
61
+ end
62
+
63
+ task :test_requirements
64
+ task :test => :test_requirements
65
+ task :default => :test
66
+ rescue LoadError
67
+ This.task_warning( 'test' )
68
+ end
69
+
70
+ #------------------------------------------------------------------------------
71
+ # RDoc - standard rdoc rake task, although we must make sure to use a more
72
+ # recent version of rdoc since it is the one that has 'tomdoc' markup
73
+ #------------------------------------------------------------------------------
74
+ begin
75
+ gem 'rdoc' # otherwise we get the wrong task from stdlib
76
+ require 'rdoc/task'
77
+ RDoc::Task.new do |t|
78
+ t.markup = 'tomdoc'
79
+ t.rdoc_dir = 'doc'
80
+ t.main = 'README.md'
81
+ t.title = "#{This.name} #{This.version}"
82
+ t.rdoc_files.include( FileList['*.{rdoc,md,txt}'], FileList['ext/**/*.c'],
83
+ FileList['lib/**/*.rb'] )
84
+ end
85
+ rescue StandardError, LoadError
86
+ This.task_warning( 'rdoc' )
87
+ end
88
+
89
+ #------------------------------------------------------------------------------
90
+ # Coverage - optional code coverage, rcov for 1.8 and simplecov for 1.9, so
91
+ # for the moment only rcov is listed.
92
+ #------------------------------------------------------------------------------
93
+ if RUBY_VERSION < "1.9.0"
94
+ begin
95
+ require 'rcov/rcovtask'
96
+ Rcov::RcovTask.new( 'coverage' ) do |t|
97
+ t.libs << 'spec'
98
+ t.pattern = 'spec/**/*_spec.rb'
99
+ t.verbose = true
100
+ t.rcov_opts << "-x ^/" # remove all the global files
101
+ t.rcov_opts << "--sort coverage" # so we see the worst files at the top
102
+ end
103
+ rescue LoadError
104
+ This.task_warning( 'rcov' )
105
+ end
106
+ else
107
+ begin
108
+ require 'simplecov'
109
+ desc 'Run tests with code coverage'
110
+ task :coverage do
111
+ ENV['COVERAGE'] = 'true'
112
+ Rake::Task[:test].execute
113
+ end
114
+ CLOBBER << FileList["coverage"]
115
+ rescue LoadError
116
+ This.task_warning( 'simplecov' )
117
+ end
118
+ end
119
+
120
+ #------------------------------------------------------------------------------
121
+ # Manifest - We want an explicit list of thos files that are to be packaged in
122
+ # the gem. Most of this is from Hoe.
123
+ #------------------------------------------------------------------------------
124
+ namespace 'manifest' do
125
+ desc "Check the manifest"
126
+ task :check => :clean do
127
+ files = FileList["**/*", ".*"].exclude( This.exclude_from_manifest ).to_a.sort
128
+ files = files.select{ |f| File.file?( f ) }
129
+
130
+ tmp = "Manifest.tmp"
131
+ File.open( tmp, 'w' ) do |f|
132
+ f.puts files.join("\n")
133
+ end
134
+
135
+ begin
136
+ sh "diff -du Manifest.txt #{tmp}"
137
+ ensure
138
+ rm tmp
139
+ end
140
+ puts "Manifest looks good"
141
+ end
142
+
143
+ desc "Generate the manifest"
144
+ task :generate => :clean do
145
+ files = %x[ git ls-files ].split("\n").sort
146
+ files.reject! { |f| f =~ This.exclude_from_manifest }
147
+ File.open( "Manifest.txt", "w" ) do |f|
148
+ f.puts files.join("\n")
149
+ end
150
+ end
151
+ end
152
+
153
+ #------------------------------------------------------------------------------
154
+ # Fixme - look for fixmes and report them
155
+ #------------------------------------------------------------------------------
156
+ namespace :fixme do
157
+ task :default => 'manifest:check' do
158
+ This.manifest.each do |file|
159
+ next if file == __FILE__
160
+ next unless file =~ %r/(txt|rb|md|rdoc|css|html|xml|css)\Z/
161
+ puts "FIXME: Rename #{file}" if file =~ /fixme/i
162
+ IO.readlines( file ).each_with_index do |line, idx|
163
+ prefix = "FIXME: #{file}:#{idx+1}".ljust(42)
164
+ puts "#{prefix} => #{line.strip}" if line =~ /fixme/i
165
+ end
166
+ end
167
+ end
168
+
169
+ def fixme_project_root
170
+ This.project_path( '../fixme' )
171
+ end
172
+
173
+ def fixme_project_path( subtree )
174
+ fixme_project_root.join( subtree )
175
+ end
176
+
177
+ def local_fixme_files
178
+ This.manifest.select { |p| p =~ %r|^tasks/| }
179
+ end
180
+
181
+ def outdated_fixme_files
182
+ local_fixme_files.reject do |local|
183
+ upstream = fixme_project_path( local )
184
+ Digest::SHA256.file( local ) == Digest::SHA256.file( upstream )
185
+ end
186
+ end
187
+
188
+ def fixme_up_to_date?
189
+ outdated_fixme_files.empty?
190
+ end
191
+
192
+ desc "See if the fixme tools are outdated"
193
+ task :outdated => :release_check do
194
+ if fixme_up_to_date? then
195
+ puts "Fixme files are up to date."
196
+ else
197
+ outdated_fixme_files.each do |f|
198
+ puts "#{f} is outdated"
199
+ end
200
+ end
201
+ end
202
+
203
+ desc "Update outdated fixme files"
204
+ task :update => :release_check do
205
+ if fixme_up_to_date? then
206
+ puts "Fixme files are already up to date."
207
+ else
208
+ puts "Updating fixme files:"
209
+ outdated_fixme_files.each do |local|
210
+ upstream = fixme_project_path( local )
211
+ puts " * #{local}"
212
+ FileUtils.cp( upstream, local )
213
+ end
214
+ puts "Use your git commands as appropriate."
215
+ end
216
+ end
217
+ end
218
+ desc "Look for fixmes and report them"
219
+ task :fixme => "fixme:default"
220
+
221
+ #------------------------------------------------------------------------------
222
+ # Gem Specification
223
+ #------------------------------------------------------------------------------
224
+ # Really this is only here to support those who use bundler
225
+ desc "Build the #{This.name}.gemspec file"
226
+ task :gemspec do
227
+ File.open( This.gemspec_file, "wb+" ) do |f|
228
+ f.puts "# DO NOT EDIT - This file is automatically generated"
229
+ f.puts "# Make changes to Manifest.txt and/or Rakefile and regenerate"
230
+ f.write This.platform_gemspec.to_ruby
231
+ end
232
+ end
233
+
234
+ # the gemspec is also a dev artifact and should not be kept around.
235
+ CLOBBER << This.gemspec_file.to_s
236
+
237
+ # .rbc files from ruby 2.0
238
+ CLOBBER << FileList["**/*.rbc"]
239
+
240
+ # The standard gem packaging task, everyone has it.
241
+ require 'rubygems/package_task'
242
+ ::Gem::PackageTask.new( This.platform_gemspec ) do
243
+ # nothing
244
+ end
245
+
246
+ #------------------------------------------------------------------------------
247
+ # Release - the steps we go through to do a final release, this is pulled from
248
+ # a compbination of mojombo's rakegem, hoe and hoe-git
249
+ #
250
+ # 1) make sure we are on the master branch
251
+ # 2) make sure there are no uncommitted items
252
+ # 3) check the manifest and make sure all looks good
253
+ # 4) build the gem
254
+ # 5) do an empty commit to have the commit message of the version
255
+ # 6) tag that commit as the version
256
+ # 7) push master
257
+ # 8) push the tag
258
+ # 7) pus the gem
259
+ #------------------------------------------------------------------------------
260
+ task :release_check do
261
+ unless `git branch` =~ /^\* master$/
262
+ abort "You must be on the master branch to release!"
263
+ end
264
+ unless `git status` =~ /^nothing to commit/m
265
+ abort "Nope, sorry, you have unfinished business"
266
+ end
267
+ end
268
+
269
+ desc "Create tag v#{This.version}, build and push #{This.platform_gemspec.full_name} to rubygems.org"
270
+ task :release => [ :release_check, 'manifest:check', :gem ] do
271
+ sh "git commit --allow-empty -a -m 'Release #{This.version}'"
272
+ sh "git tag -a -m 'v#{This.version}' v#{This.version}"
273
+ sh "git push origin master"
274
+ sh "git push origin v#{This.version}"
275
+ sh "gem push pkg/#{This.platform_gemspec.full_name}.gem"
276
+ end