rake-deveiate 0.15.0 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.md +36 -0
- data/lib/rake/deveiate.rb +60 -3
- data/lib/rake/deveiate/extensions.rb +119 -0
- data/lib/rake/deveiate/gemspec.rb +4 -0
- data/lib/rake/deveiate/generate.rb +12 -0
- data/lib/rake/deveiate/git-refinements.rb +28 -0
- data/lib/rake/deveiate/git.rb +524 -0
- data/lib/rake/deveiate/hg.rb +45 -95
- metadata +32 -15
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15de23bdc94b63e1920bf2204867e308c43bb2dca45180adda2bda900bc4999c
|
4
|
+
data.tar.gz: f2e0237372b484d97e74e4c37bc9f73bc31c5970d12e270f7854eadb20e56bfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f30928f9d73561ec1d761539a19c3841d7e197663757113a4b8e67222a5e8df2ec7a56cd6aad1670e05bde1c448e944efe61cdd137eff4715f370d5c707458ef
|
7
|
+
data.tar.gz: 5ddc4f21e660442837a4029e538b840b0c58c9373e4eac0f833398b784835651845fd4b4a7db009e65e2fdd38134510204d55fbdd7ccc62d17ed30e23d875e5f
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/History.md
CHANGED
@@ -1,6 +1,42 @@
|
|
1
1
|
# Release History for rake-deveiate
|
2
2
|
|
3
3
|
---
|
4
|
+
|
5
|
+
## v0.17.0 [2020-12-28] Michael Granger <ged@FaerieMUD.org>
|
6
|
+
|
7
|
+
Improvements:
|
8
|
+
|
9
|
+
- Allow multi-level extension directory structure.
|
10
|
+
|
11
|
+
|
12
|
+
## v0.16.2 [2020-11-23] Michael Granger <ged@FaerieMUD.org>
|
13
|
+
|
14
|
+
Bugfixes:
|
15
|
+
|
16
|
+
- Include another missing file.
|
17
|
+
|
18
|
+
|
19
|
+
## v0.16.1 [2020-11-23] Michael Granger <ged@FaerieMUD.org>
|
20
|
+
|
21
|
+
Bugfixes:
|
22
|
+
|
23
|
+
- Include missing `git` tasklib.
|
24
|
+
|
25
|
+
|
26
|
+
## v0.16.0 [2020-11-23] Michael Granger <ged@FaerieMUD.org>
|
27
|
+
|
28
|
+
Improvements:
|
29
|
+
|
30
|
+
- Add support for projects managed with Git.
|
31
|
+
|
32
|
+
|
33
|
+
## v0.15.1 [2020-10-29] Michael Granger <ged@FaerieMUD.org>
|
34
|
+
|
35
|
+
Bugfixes:
|
36
|
+
|
37
|
+
- Add the extension tasks file to the gem.
|
38
|
+
|
39
|
+
|
4
40
|
## v0.15.0 [2020-10-29] Michael Granger <ged@FaerieMUD.org>
|
5
41
|
|
6
42
|
Improvements:
|
data/lib/rake/deveiate.rb
CHANGED
@@ -35,7 +35,7 @@ class Rake::DevEiate < Rake::TaskLib
|
|
35
35
|
VERSION_PATTERN = /VERSION\s*=\s*(?<quote>['"])(?<version>\d+(\.\d+){2}.*)\k<quote>/
|
36
36
|
|
37
37
|
# The version of this library
|
38
|
-
VERSION = '0.
|
38
|
+
VERSION = '0.17.0'
|
39
39
|
|
40
40
|
# The server to release to by default
|
41
41
|
DEFAULT_GEMSERVER = 'https://rubygems.org/'
|
@@ -46,6 +46,9 @@ class Rake::DevEiate < Rake::TaskLib
|
|
46
46
|
# The version to use if one cannot be read from the source
|
47
47
|
DEFAULT_VERSION = '0.1.0'
|
48
48
|
|
49
|
+
# The prefix to use for release version tags by default
|
50
|
+
DEFAULT_RELEASE_TAG_PREFIX = 'v'
|
51
|
+
|
49
52
|
# Words in the package/gem name that should not be included in deriving paths,
|
50
53
|
# file names, etc.
|
51
54
|
PACKAGE_IGNORE_WORDS = %w[ruby]
|
@@ -158,6 +161,7 @@ class Rake::DevEiate < Rake::TaskLib
|
|
158
161
|
@licenses = [ DEFAULT_LICENSE ]
|
159
162
|
@version_from = env( :version_from, as_pathname: true ) ||
|
160
163
|
LIB_DIR + "%s.rb" % [ version_file_from(name) ]
|
164
|
+
@release_tag_prefix = DEFAULT_RELEASE_TAG_PREFIX
|
161
165
|
|
162
166
|
@docs_dir = DOCS_DIR.dup
|
163
167
|
|
@@ -289,6 +293,10 @@ class Rake::DevEiate < Rake::TaskLib
|
|
289
293
|
# The version of Ruby required by this gem, in Gem version format.
|
290
294
|
attr_accessor :required_ruby_version
|
291
295
|
|
296
|
+
##
|
297
|
+
# The prefix to use for version tags
|
298
|
+
attr_accessor :release_tag_prefix
|
299
|
+
|
292
300
|
|
293
301
|
#
|
294
302
|
# Task definition
|
@@ -372,6 +380,11 @@ class Rake::DevEiate < Rake::TaskLib
|
|
372
380
|
self.install_dependencies
|
373
381
|
end
|
374
382
|
|
383
|
+
desc "Turn on maintainer mode: build with extra warnings and debugging"
|
384
|
+
task :maint do
|
385
|
+
ENV['MAINTAINER_MODE'] = 'yes'
|
386
|
+
end
|
387
|
+
|
375
388
|
end
|
376
389
|
|
377
390
|
|
@@ -532,6 +545,24 @@ class Rake::DevEiate < Rake::TaskLib
|
|
532
545
|
end
|
533
546
|
|
534
547
|
|
548
|
+
### Return a Regexp that matches the project's convention for versions.
|
549
|
+
def release_tag_pattern
|
550
|
+
prefix = self.release_tag_prefix
|
551
|
+
return /#{prefix}\d+(\.\d+)+/
|
552
|
+
end
|
553
|
+
|
554
|
+
|
555
|
+
### Fetch the list of the versions of releases that have entries in the history
|
556
|
+
### file.
|
557
|
+
def get_history_file_versions
|
558
|
+
tag_pattern = self.release_tag_pattern
|
559
|
+
|
560
|
+
return IO.readlines( self.history_file ).grep( tag_pattern ).map do |line|
|
561
|
+
line[ /^(?:h\d\.|#+|=+)\s+(#{tag_pattern})\s+/, 1 ]
|
562
|
+
end.compact
|
563
|
+
end
|
564
|
+
|
565
|
+
|
535
566
|
### Returns +true+ if the manifest file exists and is readable.
|
536
567
|
def has_manifest?
|
537
568
|
return self.manifest_file.readable?
|
@@ -665,6 +696,7 @@ class Rake::DevEiate < Rake::TaskLib
|
|
665
696
|
|
666
697
|
### Install the gems listed in the gem dependencies file.
|
667
698
|
def install_dependencies
|
699
|
+
self.prompt.say "Installing dependencies"
|
668
700
|
ruby '-S', 'gem', 'i', '-Ng'
|
669
701
|
end
|
670
702
|
|
@@ -744,9 +776,9 @@ class Rake::DevEiate < Rake::TaskLib
|
|
744
776
|
self.prompt.say( "Summary: " )
|
745
777
|
self.prompt.say( summary, color: :bold )
|
746
778
|
self.prompt.say( "Description:" )
|
747
|
-
self.prompt.say( description, color: :bold )
|
779
|
+
self.prompt.say( " " + description, color: :bold )
|
748
780
|
self.prompt.say( "Homepage:" )
|
749
|
-
self.prompt.say( homepage, color: :bold )
|
781
|
+
self.prompt.say( " " + homepage, color: :bold )
|
750
782
|
self.prompt.say( "\n" )
|
751
783
|
end
|
752
784
|
|
@@ -824,4 +856,29 @@ class Rake::DevEiate < Rake::TaskLib
|
|
824
856
|
join( '/' )
|
825
857
|
end
|
826
858
|
|
859
|
+
|
860
|
+
### Delete the files in the given +filelist+ after confirming with the user.
|
861
|
+
def delete_extra_files( *filelist )
|
862
|
+
description = humanize_file_list( filelist, ' ' )
|
863
|
+
self.prompt.say "Files to delete:"
|
864
|
+
self.prompt.say( description )
|
865
|
+
|
866
|
+
if self.prompt.yes?( "Really delete them?" ) {|q| q.default(false) }
|
867
|
+
filelist.each do |f|
|
868
|
+
rm_rf( f, verbose: true )
|
869
|
+
end
|
870
|
+
end
|
871
|
+
end
|
872
|
+
|
873
|
+
|
874
|
+
### Returns a human-scannable file list by joining and truncating the list if it's too long.
|
875
|
+
def humanize_file_list( list, indent=FILE_INDENT )
|
876
|
+
listtext = list[0..5].join( "\n#{indent}" )
|
877
|
+
if list.length > 5
|
878
|
+
listtext << " (and %d other/s)" % [ list.length - 5 ]
|
879
|
+
end
|
880
|
+
|
881
|
+
return listtext
|
882
|
+
end
|
883
|
+
|
827
884
|
end # class Rake::DevEiate
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'pathname'
|
5
|
+
require 'rake'
|
6
|
+
|
7
|
+
require 'rake/deveiate' unless defined?( Rake::DevEiate )
|
8
|
+
|
9
|
+
|
10
|
+
# Extension compilation and maintenance tasks
|
11
|
+
module Rake::DevEiate::Extension
|
12
|
+
extend Rake::DSL
|
13
|
+
|
14
|
+
# The glob pattern to use when looking for extension config scripts (relative to
|
15
|
+
# EXT_DIR).
|
16
|
+
EXTENSION_GLOB_PATTERN = '**/extconf.rb'
|
17
|
+
|
18
|
+
|
19
|
+
### Set some defaults when the task lib is set up.
|
20
|
+
def setup( _name, **options )
|
21
|
+
super if defined?( super )
|
22
|
+
|
23
|
+
self.extensions.include( Rake::DevEiate::EXT_DIR + EXTENSION_GLOB_PATTERN )
|
24
|
+
@disable_rake_compiler = false
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
##
|
29
|
+
# Set to +true+ to indicate that this project provides its own
|
30
|
+
# extension-management tasks.
|
31
|
+
attr_accessor :disable_rake_compiler
|
32
|
+
|
33
|
+
|
34
|
+
### Predicate for the #disable_rake_compiler attribute.
|
35
|
+
def disable_rake_compiler?
|
36
|
+
return self.disable_rake_compiler ? true :false
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
### Returns +true+ if there appear to be extensions as part of the current
|
41
|
+
### project.
|
42
|
+
def extensions_present?
|
43
|
+
return !self.extensions.empty?
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
### Define extension tasks
|
48
|
+
def define_tasks
|
49
|
+
super if defined?( super )
|
50
|
+
|
51
|
+
if self.extensions_present?
|
52
|
+
if self.has_rakecompiler_dependency?
|
53
|
+
self.define_extension_tasks
|
54
|
+
elsif !self.disable_rake_compiler?
|
55
|
+
warn <<~END_WARNING
|
56
|
+
|
57
|
+
You appear to have one or more extensions, but rake-compiler
|
58
|
+
is not a dependency. You should either add it to gem.deps.rb
|
59
|
+
or set `disable_rake_compiler` on the project to disable this
|
60
|
+
warning.
|
61
|
+
|
62
|
+
END_WARNING
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
task( :extensions_debug, &method(:do_extensions_debug) )
|
67
|
+
task :debug => :extensions_debug
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
### Set up the tasks to build extensions.
|
72
|
+
def define_extension_tasks
|
73
|
+
ENV['RUBY_CC_VERSION'] ||= RUBY_VERSION[ /(\d+\.\d+)/ ]
|
74
|
+
|
75
|
+
require 'rake/extensiontask'
|
76
|
+
self.extensions.each do |extconf|
|
77
|
+
Rake::ExtensionTask.new( extconf.pathmap('%{ext,}d') )
|
78
|
+
end
|
79
|
+
|
80
|
+
task :spec => :compile
|
81
|
+
|
82
|
+
task :maint do
|
83
|
+
ENV['V'] = 1
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
### Returns +true+ if the projects dependencies include `rake-compiler`.
|
89
|
+
def has_rakecompiler_dependency?
|
90
|
+
return self.dependencies.any? do |dep|
|
91
|
+
dep.name == 'rake-compiler'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
### Task function -- output debugging for extension tasks.
|
97
|
+
def do_extensions_debug( task, args )
|
98
|
+
self.prompt.say( "Extension config scripts:", color: :bright_green )
|
99
|
+
|
100
|
+
if self.extensions.empty?
|
101
|
+
self.prompt.say "None."
|
102
|
+
else
|
103
|
+
self.extensions.uniq.each do |path|
|
104
|
+
self.prompt.say "- %s" % [ path ]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
if self.has_rakecompiler_dependency?
|
109
|
+
self.prompt.say "\n"
|
110
|
+
self.prompt.say "✔ has rake-compiler dependency"
|
111
|
+
end
|
112
|
+
|
113
|
+
self.prompt.say( "\n" )
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
end # module Rake::DevEiate::Extensions
|
118
|
+
|
119
|
+
|
@@ -204,6 +204,10 @@ module Rake::DevEiate::Gemspec
|
|
204
204
|
bt_uri = source_uri.dup
|
205
205
|
bt_uri.host = 'todo.sr.ht'
|
206
206
|
metadata['bug_tracker_uri'] = bt_uri.to_s
|
207
|
+
when /\.gitlab\.com/
|
208
|
+
bt_uri = source_uri.dup
|
209
|
+
bt_uri.path += '-/issues'
|
210
|
+
metadata['bug_tracker_uri'] = bt_uri.to_s
|
207
211
|
else
|
208
212
|
self.trace "No idea what bug tracker URIs for %s look like!" % [ source_uri.host ]
|
209
213
|
end
|
@@ -54,11 +54,23 @@ module Rake::DevEiate::Generate
|
|
54
54
|
|
55
55
|
# Abstract named tasks; mostly for invoking programmatically
|
56
56
|
namespace :generate do
|
57
|
+
|
58
|
+
desc "Generate a Rakefile"
|
57
59
|
task :rakefile => self.rakefile
|
60
|
+
|
61
|
+
desc "Generate a %s file" % [ self.readme_file ]
|
58
62
|
task :readme => self.readme_file
|
63
|
+
|
64
|
+
desc "Generate a %s file" % [ self.history_file ]
|
59
65
|
task :history_file => self.history_file
|
66
|
+
|
67
|
+
desc "Generate a %s file" % [ self.manifest_file ]
|
60
68
|
task :manifest => self.manifest_file
|
69
|
+
|
70
|
+
desc "Generate a %s file" % [ RUBY_VERSION_FILE ]
|
61
71
|
task :ruby_version_file => RUBY_VERSION_FILE
|
72
|
+
|
73
|
+
desc "Generate a %s file" % [ GEMSET_FILE ]
|
62
74
|
task :gemset_file => GEMSET_FILE
|
63
75
|
end
|
64
76
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'git'
|
5
|
+
|
6
|
+
require 'rake/deveiate' unless defined?( Rake::DevEiate )
|
7
|
+
|
8
|
+
|
9
|
+
# Monkeypatches to allow command options the `git` gem doesn't allow.
|
10
|
+
#
|
11
|
+
# Refs:
|
12
|
+
# - https://github.com/ruby-git/ruby-git/issues/394
|
13
|
+
module Rake::DevEiate::GitRefinements
|
14
|
+
|
15
|
+
refine Git::Base do
|
16
|
+
def cmd( cmd )
|
17
|
+
self.lib.cmd( cmd )
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
refine Git::Lib do
|
22
|
+
def cmd( cmd )
|
23
|
+
command( cmd )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end # module GitRefinements
|
28
|
+
|
@@ -0,0 +1,524 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'tempfile'
|
5
|
+
require 'shellwords'
|
6
|
+
require 'git'
|
7
|
+
require 'tty/editor'
|
8
|
+
|
9
|
+
require 'rake/deveiate' unless defined?( Rake::DevEiate )
|
10
|
+
require 'rake/deveiate/git-refinements'
|
11
|
+
|
12
|
+
using Rake::DevEiate::GitRefinements
|
13
|
+
|
14
|
+
|
15
|
+
# Git version-control tasks
|
16
|
+
module Rake::DevEiate::Git
|
17
|
+
|
18
|
+
# The name of the file to edit for the commit message
|
19
|
+
COMMIT_MSG_FILE = Pathname( 'commit-msg.txt' )
|
20
|
+
|
21
|
+
# The name of the ignore file
|
22
|
+
IGNORE_FILE = Rake::DevEiate::PROJECT_DIR + '.gitignore'
|
23
|
+
|
24
|
+
# Colors for presenting file statuses
|
25
|
+
STATUS_COLORS = {
|
26
|
+
'M' => [:blue], # modified
|
27
|
+
'A' => [:bold, :green], # added
|
28
|
+
'R' => [:bold, :black], # removed
|
29
|
+
'C' => [:white], # clean
|
30
|
+
'!' => [:bold, :white, :on_red], # missing
|
31
|
+
'?' => [:yellow], # not tracked
|
32
|
+
'I' => [:dim, :white], # ignored
|
33
|
+
}
|
34
|
+
|
35
|
+
# File indentation
|
36
|
+
FILE_INDENT = " • "
|
37
|
+
|
38
|
+
|
39
|
+
### Define version-control tasks
|
40
|
+
def define_tasks
|
41
|
+
super if defined?( super )
|
42
|
+
|
43
|
+
return unless self.is_git_working_copy?
|
44
|
+
|
45
|
+
# :TODO: Should be refactored up with the same code in the hg lib.
|
46
|
+
file COMMIT_MSG_FILE.to_s do |task|
|
47
|
+
commit_log = Pathname( task.name )
|
48
|
+
|
49
|
+
edit_git_commit_log( commit_log )
|
50
|
+
unless commit_log.size?
|
51
|
+
self.prompt.error "Empty commit message; aborting."
|
52
|
+
commit_log.unlink if commit_log.exist?
|
53
|
+
abort
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
CLEAN.include( COMMIT_MSG_FILE.to_s )
|
58
|
+
|
59
|
+
namespace :git do
|
60
|
+
|
61
|
+
desc "Prepare for a new release"
|
62
|
+
task( :prerelease, &method(:do_git_prerelease) )
|
63
|
+
|
64
|
+
desc "Check for new files and offer to add/ignore/delete them."
|
65
|
+
task( :newfiles, &method(:do_git_newfiles) )
|
66
|
+
task :add => :newfiles
|
67
|
+
|
68
|
+
desc "Pull and update from the default repo"
|
69
|
+
task( :pull, &method(:do_git_pull) )
|
70
|
+
|
71
|
+
desc "Pull and update without confirmation"
|
72
|
+
task( :pull_without_confirmation, &method(:do_git_pull_without_confirmation) )
|
73
|
+
|
74
|
+
desc "Update to tip"
|
75
|
+
task( :update, &method(:do_git_update) )
|
76
|
+
|
77
|
+
desc "Clobber all changes (git up -C)"
|
78
|
+
task( :update_and_clobber, &method(:do_git_update_and_clobber) )
|
79
|
+
|
80
|
+
desc "Git-specific pre-checkin hook"
|
81
|
+
task :precheckin => [ :pull, :newfiles, :check_for_changes ]
|
82
|
+
|
83
|
+
desc "Check the current code in if tests pass"
|
84
|
+
task( :checkin => COMMIT_MSG_FILE.to_s, &method(:do_git_checkin) )
|
85
|
+
|
86
|
+
desc "Git-specific pre-release hook"
|
87
|
+
task :prerelease => 'git:check_history'
|
88
|
+
|
89
|
+
desc "Git-specific post-release hook"
|
90
|
+
task( :postrelease, &method(:do_git_postrelease) )
|
91
|
+
|
92
|
+
desc "Push to the default origin repo (if there is one)"
|
93
|
+
task( :push, &method(:do_git_push) )
|
94
|
+
|
95
|
+
desc "Push to the default repo without confirmation"
|
96
|
+
task :push_without_confirmation do |task, args|
|
97
|
+
self.git.push
|
98
|
+
end
|
99
|
+
|
100
|
+
desc "Check the history file to ensure it contains an entry for each release tag"
|
101
|
+
task( :check_history, &method(:do_git_check_history) )
|
102
|
+
|
103
|
+
desc "Generate and edit a new version entry in the history file"
|
104
|
+
task( :update_history, &method(:do_git_update_history) )
|
105
|
+
|
106
|
+
task( :check_for_changes, &method(:do_git_check_for_changes) )
|
107
|
+
task( :debug, &method(:do_git_debug) )
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
# Hook some generic tasks to the mercurial-specific ones
|
112
|
+
task :checkin => 'git:checkin'
|
113
|
+
task :precheckin => 'git:precheckin'
|
114
|
+
|
115
|
+
task :prerelease => 'git:prerelease'
|
116
|
+
task :postrelease => 'git:postrelease'
|
117
|
+
|
118
|
+
desc "Update the history file with the changes since the last version tag."
|
119
|
+
task :update_history => 'git:update_history'
|
120
|
+
|
121
|
+
task :debug => 'git:debug'
|
122
|
+
rescue ::Exception => err
|
123
|
+
$stderr.puts "%s while defining Git tasks: %s" % [ err.class.name, err.message ]
|
124
|
+
raise
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
### Returns +true+ if the current directory looks like a Git working copy.
|
129
|
+
def is_git_working_copy?
|
130
|
+
return File.directory?( '.git' )
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
### The body of the git:prerelease task.
|
135
|
+
def do_git_prerelease( task, args )
|
136
|
+
uncommitted_files = self.git.status( n: true )
|
137
|
+
unless uncommitted_files.empty?
|
138
|
+
self.show_git_file_statuses( uncommitted_files )
|
139
|
+
|
140
|
+
fail unless self.prompt.yes?( "Release anyway?" ) do |q|
|
141
|
+
q.default( false )
|
142
|
+
end
|
143
|
+
|
144
|
+
self.prompt.warn "Okay, releasing with uncommitted versions."
|
145
|
+
end
|
146
|
+
|
147
|
+
pkg_version_tag = self.current_git_version_tag
|
148
|
+
rev = self.git.identity.id
|
149
|
+
|
150
|
+
# Look for a tag for the current release version, and if it exists abort
|
151
|
+
if self.git.tags.find {|tag| tag.name == pkg_version_tag }
|
152
|
+
self.prompt.error "Version #{self.version} already has a tag."
|
153
|
+
fail
|
154
|
+
end
|
155
|
+
|
156
|
+
# Tag the current rev
|
157
|
+
self.prompt.ok "Tagging rev %s as %s" % [ rev, pkg_version_tag ]
|
158
|
+
self.git.tag( pkg_version_tag, rev: rev )
|
159
|
+
|
160
|
+
# Sign the tag
|
161
|
+
if self.git.extension_enabled?( :gpg )
|
162
|
+
if self.prompt.yes?( "Sign %s?" % [pkg_version_tag] )
|
163
|
+
self.git.sign( pkg_version_tag, message: "Signing %s" % [pkg_version_tag] )
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
### The body of the git:postrelease task.
|
170
|
+
def do_git_postrelease( task, args )
|
171
|
+
if self.git.status( 'checksum', unknown: true ).any?
|
172
|
+
self.prompt.say "Adding release artifacts..."
|
173
|
+
self.git.add( 'checksum' )
|
174
|
+
self.git.commit( 'checksum', message: "Adding release checksum." )
|
175
|
+
end
|
176
|
+
|
177
|
+
if self.prompt.yes?( "Move released changesets to public phase?" )
|
178
|
+
self.prompt.say "Publicising changesets..."
|
179
|
+
self.git.phase( public: true )
|
180
|
+
end
|
181
|
+
|
182
|
+
if self.git.extension_enabled?( :topic )
|
183
|
+
current_topic = self.git.topic
|
184
|
+
if current_topic && self.prompt.yes?( "Clear the current topic (%s)?" %[current_topic] )
|
185
|
+
self.git.topic( clear: true )
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
Rake::Task['git:push'].invoke
|
190
|
+
end
|
191
|
+
|
192
|
+
|
193
|
+
### The body of the git:newfiles task.
|
194
|
+
def do_git_newfiles( task, args )
|
195
|
+
self.prompt.say "Checking for new files..."
|
196
|
+
status = self.git.status
|
197
|
+
|
198
|
+
files_to_add = status.changed.keys
|
199
|
+
files_to_ignore = []
|
200
|
+
files_to_delete = []
|
201
|
+
|
202
|
+
status.untracked.each do |path, status_file|
|
203
|
+
description = " %s: untracked" % [ path ]
|
204
|
+
action = self.prompt.select( description ) do |menu|
|
205
|
+
menu.choice "add", :a
|
206
|
+
menu.choice "ignore", :i
|
207
|
+
menu.choice "skip", :s
|
208
|
+
menu.choice "delete", :d
|
209
|
+
end
|
210
|
+
|
211
|
+
case action
|
212
|
+
when :a
|
213
|
+
files_to_add << path
|
214
|
+
when :i
|
215
|
+
files_to_ignore << path
|
216
|
+
when :d
|
217
|
+
files_to_delete << path
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
unless files_to_add.empty?
|
222
|
+
$stderr.puts "Adding: %p" % [ files_to_add ]
|
223
|
+
self.git.add( files_to_add )
|
224
|
+
end
|
225
|
+
|
226
|
+
unless files_to_ignore.empty?
|
227
|
+
git_ignore_files( *files_to_ignore )
|
228
|
+
end
|
229
|
+
|
230
|
+
unless files_to_delete.empty?
|
231
|
+
delete_extra_files( *files_to_delete )
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
|
236
|
+
### The body of the git:pull task.
|
237
|
+
def do_git_pull( task, args )
|
238
|
+
origin = self.git.remote
|
239
|
+
|
240
|
+
if ( origin_url = origin.url )
|
241
|
+
if self.prompt.yes?( "Pull and update from '#{origin_url}'?" )
|
242
|
+
self.prompt.say "Fetching..."
|
243
|
+
self.git.fetch( 'origin', prune: true )
|
244
|
+
self.prompt.say "Pulling..."
|
245
|
+
self.git.pull( 'origin', self.git.current_branch )
|
246
|
+
end
|
247
|
+
else
|
248
|
+
trace "Skipping pull: No 'origin' remote."
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
|
253
|
+
### The body of the git:pull_without_confirmation task.
|
254
|
+
def do_git_pull_without_confirmation( task, args )
|
255
|
+
self.git.pull
|
256
|
+
end
|
257
|
+
|
258
|
+
|
259
|
+
### The body of the git:update task.
|
260
|
+
def do_git_update( task, args )
|
261
|
+
self.git.pull_update
|
262
|
+
end
|
263
|
+
|
264
|
+
|
265
|
+
### The body of the git:update_and_clobber task.
|
266
|
+
def do_git_update_and_clobber( task, args )
|
267
|
+
self.git.update( clean: true )
|
268
|
+
end
|
269
|
+
|
270
|
+
|
271
|
+
### The body of the checkin task.
|
272
|
+
def do_git_checkin( task, args )
|
273
|
+
commit_msg = COMMIT_MSG_FILE.read.strip
|
274
|
+
|
275
|
+
self.prompt.say( "---", color: :cyan )
|
276
|
+
self.prompt.say( commit_msg )
|
277
|
+
self.prompt.say( "---", color: :cyan )
|
278
|
+
|
279
|
+
if self.prompt.yes?( "Continue with checkin?" )
|
280
|
+
self.git.commit( COMMIT_MSG_FILE.read )
|
281
|
+
rm_f COMMIT_MSG_FILE
|
282
|
+
else
|
283
|
+
abort
|
284
|
+
end
|
285
|
+
Rake::Task[ 'git:push' ].invoke
|
286
|
+
end
|
287
|
+
|
288
|
+
|
289
|
+
### The body of the push task.
|
290
|
+
def do_git_push( task, args )
|
291
|
+
git = self.git
|
292
|
+
origin = git.remote
|
293
|
+
|
294
|
+
if (origin_url = origin.url)
|
295
|
+
if self.prompt.yes?( "Push to '#{origin_url}'?" ) {|q| q.default(false) }
|
296
|
+
unless git.is_remote_branch?( git.current_branch )
|
297
|
+
if self.prompt.yes?( "Create tracking branch?" ) {|q| q.default(true) }
|
298
|
+
tracking_branch = "origin/%s" % [ git.current_branch ]
|
299
|
+
git.cmd( 'branch', ['-u', tracking_branch] )
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
git.push( 'origin', git.current_branch )
|
304
|
+
self.prompt.ok "Done."
|
305
|
+
else
|
306
|
+
abort
|
307
|
+
end
|
308
|
+
else
|
309
|
+
trace "Skipping push: No 'default' path."
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
|
314
|
+
### Check the history file against the list of release tags in the working copy
|
315
|
+
### and ensure there's an entry for each tag.
|
316
|
+
def do_git_check_history( task, args )
|
317
|
+
unless self.history_file.readable?
|
318
|
+
self.prompt.error "History file is missing or unreadable."
|
319
|
+
abort
|
320
|
+
end
|
321
|
+
|
322
|
+
self.prompt.say "Checking history..."
|
323
|
+
missing_tags = self.get_git_unhistoried_version_tags
|
324
|
+
|
325
|
+
unless missing_tags.empty?
|
326
|
+
self.prompt.error "%s needs updating; missing entries for tags: %s" %
|
327
|
+
[ self.history_file, missing_tags.join(', ') ]
|
328
|
+
abort
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
|
333
|
+
### Check the status of the repo and ensure there are outstanding changes. If there
|
334
|
+
### are no changes, abort.
|
335
|
+
def do_git_check_for_changes( task, args )
|
336
|
+
# :FIXME: Figure out a better way to do this.
|
337
|
+
unless self.git.status.any?( &:type )
|
338
|
+
self.prompt.error "Working copy is clean."
|
339
|
+
abort
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
|
344
|
+
### Generate a new history file entry for the current version.
|
345
|
+
def do_git_update_history( task, args ) # Needs refactoring
|
346
|
+
unless self.history_file.readable?
|
347
|
+
self.prompt.error "History file is missing or unreadable."
|
348
|
+
abort
|
349
|
+
end
|
350
|
+
|
351
|
+
version_tag = self.current_git_version_tag
|
352
|
+
previous_tag = self.previous_git_version_tag
|
353
|
+
self.prompt.say "Updating history for %s..." % [ version_tag ]
|
354
|
+
|
355
|
+
if self.get_history_file_versions.include?( version_tag )
|
356
|
+
self.trace "History file already includes a section for %s" % [ version_tag ]
|
357
|
+
abort
|
358
|
+
end
|
359
|
+
|
360
|
+
header, rest = self.history_file.read( encoding: 'utf-8' ).
|
361
|
+
split( /(?<=^---)/m, 2 )
|
362
|
+
|
363
|
+
self.trace "Rest is: %p" % [ rest ]
|
364
|
+
if !rest || rest.empty?
|
365
|
+
self.prompt.warn "History file needs a header with a `---` marker to support updating."
|
366
|
+
self.prompt.say "Adding an auto-generated one."
|
367
|
+
rest = header
|
368
|
+
header = self.load_and_render_template( 'History.erb', self.history_file )
|
369
|
+
end
|
370
|
+
|
371
|
+
header_char = self.header_char_for( self.history_file )
|
372
|
+
ext = self.history_file.extname
|
373
|
+
log_entries = if previous_tag
|
374
|
+
self.git.log( rev: "#{previous_tag}~-2::" )
|
375
|
+
else
|
376
|
+
self.git.log
|
377
|
+
end
|
378
|
+
|
379
|
+
Tempfile.create( ['History', ext], encoding: 'utf-8' ) do |tmp_copy|
|
380
|
+
tmp_copy.print( header )
|
381
|
+
tmp_copy.puts
|
382
|
+
|
383
|
+
tmp_copy.puts "%s %s [%s] %s" % [
|
384
|
+
header_char * 2,
|
385
|
+
version_tag,
|
386
|
+
Date.today.strftime( '%Y-%m-%d' ),
|
387
|
+
self.authors.first,
|
388
|
+
]
|
389
|
+
|
390
|
+
tmp_copy.puts
|
391
|
+
log_entries.each do |entry|
|
392
|
+
tmp_copy.puts "- %s" % [ entry.message ]
|
393
|
+
end
|
394
|
+
tmp_copy.puts
|
395
|
+
tmp_copy.puts
|
396
|
+
|
397
|
+
tmp_copy.print( rest )
|
398
|
+
tmp_copy.close
|
399
|
+
|
400
|
+
TTY::Editor.open( tmp_copy.path )
|
401
|
+
|
402
|
+
if File.size?( tmp_copy.path )
|
403
|
+
cp( tmp_copy.path, self.history_file )
|
404
|
+
else
|
405
|
+
self.prompt.error "Empty file: aborting."
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
end
|
410
|
+
|
411
|
+
|
412
|
+
### Show debugging information.
|
413
|
+
def do_git_debug( task, args )
|
414
|
+
self.prompt.say( "Git Info", color: :bright_green )
|
415
|
+
|
416
|
+
if self.is_git_working_copy?
|
417
|
+
self.prompt.say( "Release tag prefix: " )
|
418
|
+
self.prompt.say( self.release_tag_prefix, color: :bold )
|
419
|
+
|
420
|
+
self.prompt.say( "Version tags:" )
|
421
|
+
self.get_git_version_tag_names.each do |tag|
|
422
|
+
self.prompt.say( '- ' )
|
423
|
+
self.prompt.say( tag, color: :bold )
|
424
|
+
end
|
425
|
+
|
426
|
+
self.prompt.say( "History file versions:" )
|
427
|
+
self.get_history_file_versions.each do |tag|
|
428
|
+
self.prompt.say( '- ' )
|
429
|
+
self.prompt.say( tag, color: :bold )
|
430
|
+
end
|
431
|
+
|
432
|
+
self.prompt.say( "Unhistoried version tags:" )
|
433
|
+
self.get_git_unhistoried_version_tags.each do |tag|
|
434
|
+
self.prompt.say( '- ' )
|
435
|
+
self.prompt.say( tag, color: :bold )
|
436
|
+
end
|
437
|
+
else
|
438
|
+
self.prompt.say( "Doesn't appear to be a Git repository." )
|
439
|
+
end
|
440
|
+
|
441
|
+
self.prompt.say( "\n" )
|
442
|
+
end
|
443
|
+
|
444
|
+
#
|
445
|
+
# utility methods
|
446
|
+
#
|
447
|
+
|
448
|
+
### Return a Git::Repo for the directory rake was invoked in, creating it if
|
449
|
+
### necessary.
|
450
|
+
def git
|
451
|
+
@git ||= Git.open( Rake::DevEiate::PROJECT_DIR )
|
452
|
+
end
|
453
|
+
|
454
|
+
|
455
|
+
### Given a +status_hash+ like that returned by Git::Repo.status, return a
|
456
|
+
### string description of the files and their status.
|
457
|
+
def show_git_file_statuses( statuses )
|
458
|
+
lines = statuses.map do |entry|
|
459
|
+
status_color = STATUS_COLORS[ entry.status ]
|
460
|
+
" %s: %s" % [
|
461
|
+
self.pastel.white( entry.path.to_s ),
|
462
|
+
self.pastel.decorate( entry.status_description, *status_color ),
|
463
|
+
]
|
464
|
+
end
|
465
|
+
|
466
|
+
self.prompt.say( self.pastel.headline "Uncommitted files:" )
|
467
|
+
self.prompt.say( lines.join("\n") )
|
468
|
+
end
|
469
|
+
|
470
|
+
|
471
|
+
### Fetch the name of the current version's tag.
|
472
|
+
def current_git_version_tag
|
473
|
+
return [ self.release_tag_prefix, self.version ].join
|
474
|
+
end
|
475
|
+
|
476
|
+
|
477
|
+
### Fetch the name of the tag for the previous version.
|
478
|
+
def previous_git_version_tag
|
479
|
+
return self.get_git_version_tag_names.first
|
480
|
+
end
|
481
|
+
|
482
|
+
|
483
|
+
### Fetch the list of names of tags that match the versioning scheme of this
|
484
|
+
### project.
|
485
|
+
def get_git_version_tag_names
|
486
|
+
tag_pattern = self.release_tag_pattern
|
487
|
+
return self.git.tags.map( &:name ).grep( tag_pattern )
|
488
|
+
end
|
489
|
+
|
490
|
+
|
491
|
+
### Read the list of tags and return any that don't have a corresponding section
|
492
|
+
### in the history file.
|
493
|
+
def get_git_unhistoried_version_tags( include_current_version: true )
|
494
|
+
release_tags = self.get_git_version_tag_names
|
495
|
+
release_tags.unshift( self.current_git_version_tag ) if include_current_version
|
496
|
+
|
497
|
+
self.get_history_file_versions.each do |tag|
|
498
|
+
release_tags.delete( tag )
|
499
|
+
end
|
500
|
+
|
501
|
+
return release_tags
|
502
|
+
end
|
503
|
+
|
504
|
+
|
505
|
+
### Generate a commit log and invoke the user's editor on it.
|
506
|
+
def edit_git_commit_log( logfile )
|
507
|
+
diff = self.git.diff
|
508
|
+
|
509
|
+
TTY::Editor.open( logfile, text: diff )
|
510
|
+
end
|
511
|
+
|
512
|
+
|
513
|
+
### Add the list of +pathnames+ to the .gitignore list.
|
514
|
+
def git_ignore_files( *pathnames )
|
515
|
+
self.trace "Ignoring %d files." % [ pathnames.length ]
|
516
|
+
|
517
|
+
IGNORE_FILE.open( File::CREAT|File::WRONLY|File::APPEND, 0644 ) do |fh|
|
518
|
+
fh.puts( pathnames )
|
519
|
+
end
|
520
|
+
end
|
521
|
+
|
522
|
+
end # module Rake::DevEiate::Git
|
523
|
+
|
524
|
+
|
data/lib/rake/deveiate/hg.rb
CHANGED
@@ -9,7 +9,7 @@ require 'tty/editor'
|
|
9
9
|
require 'rake/deveiate' unless defined?( Rake::DevEiate )
|
10
10
|
|
11
11
|
|
12
|
-
#
|
12
|
+
# Mercurial version-control tasks
|
13
13
|
module Rake::DevEiate::Hg
|
14
14
|
|
15
15
|
# The name of the file to edit for the commit message
|
@@ -18,9 +18,6 @@ module Rake::DevEiate::Hg
|
|
18
18
|
# The name of the ignore file
|
19
19
|
IGNORE_FILE = Rake::DevEiate::PROJECT_DIR + '.hgignore'
|
20
20
|
|
21
|
-
# The prefix to use for release version tags by default
|
22
|
-
DEFAULT_RELEASE_TAG_PREFIX = 'v'
|
23
|
-
|
24
21
|
# Colors for presenting file statuses
|
25
22
|
STATUS_COLORS = {
|
26
23
|
'M' => [:blue], # modified
|
@@ -36,29 +33,16 @@ module Rake::DevEiate::Hg
|
|
36
33
|
FILE_INDENT = " • "
|
37
34
|
|
38
35
|
|
39
|
-
### Set up defaults
|
40
|
-
def setup( _name, **options )
|
41
|
-
super if defined?( super )
|
42
|
-
|
43
|
-
@release_tag_prefix = options[:release_tag_prefix] || DEFAULT_RELEASE_TAG_PREFIX
|
44
|
-
end
|
45
|
-
|
46
|
-
|
47
|
-
##
|
48
|
-
# The prefix to use for version tags
|
49
|
-
attr_accessor :release_tag_prefix
|
50
|
-
|
51
|
-
|
52
36
|
### Define version-control tasks
|
53
37
|
def define_tasks
|
54
38
|
super if defined?( super )
|
55
39
|
|
56
|
-
return unless
|
40
|
+
return unless self.is_hg_working_copy?
|
57
41
|
|
58
42
|
file COMMIT_MSG_FILE.to_s do |task|
|
59
43
|
commit_log = Pathname( task.name )
|
60
44
|
|
61
|
-
|
45
|
+
hg_edit_commit_log( commit_log )
|
62
46
|
unless commit_log.size?
|
63
47
|
self.prompt.error "Empty commit message; aborting."
|
64
48
|
commit_log.unlink if commit_log.exist?
|
@@ -137,11 +121,17 @@ module Rake::DevEiate::Hg
|
|
137
121
|
end
|
138
122
|
|
139
123
|
|
124
|
+
### Returns +true+ if the current directory looks like a Mercurial working copy.
|
125
|
+
def is_hg_working_copy?
|
126
|
+
return File.directory?( '.hg' )
|
127
|
+
end
|
128
|
+
|
129
|
+
|
140
130
|
### The body of the hg:prerelease task.
|
141
131
|
def do_hg_prerelease( task, args )
|
142
132
|
uncommitted_files = self.hg.status( n: true )
|
143
133
|
unless uncommitted_files.empty?
|
144
|
-
self.
|
134
|
+
self.show_hg_file_statuses( uncommitted_files )
|
145
135
|
|
146
136
|
fail unless self.prompt.yes?( "Release anyway?" ) do |q|
|
147
137
|
q.default( false )
|
@@ -150,7 +140,7 @@ module Rake::DevEiate::Hg
|
|
150
140
|
self.prompt.warn "Okay, releasing with uncommitted versions."
|
151
141
|
end
|
152
142
|
|
153
|
-
pkg_version_tag = self.
|
143
|
+
pkg_version_tag = self.current_hg_version_tag
|
154
144
|
rev = self.hg.identity.id
|
155
145
|
|
156
146
|
# Look for a tag for the current release version, and if it exists abort
|
@@ -316,7 +306,7 @@ module Rake::DevEiate::Hg
|
|
316
306
|
end
|
317
307
|
|
318
308
|
self.prompt.say "Checking history..."
|
319
|
-
missing_tags = self.
|
309
|
+
missing_tags = self.get_hg_unhistoried_version_tags
|
320
310
|
|
321
311
|
unless missing_tags.empty?
|
322
312
|
self.prompt.error "%s needs updating; missing entries for tags: %s" %
|
@@ -343,8 +333,8 @@ module Rake::DevEiate::Hg
|
|
343
333
|
abort
|
344
334
|
end
|
345
335
|
|
346
|
-
version_tag = self.
|
347
|
-
previous_tag = self.
|
336
|
+
version_tag = self.current_hg_version_tag
|
337
|
+
previous_tag = self.previous_hg_version_tag
|
348
338
|
self.prompt.say "Updating history for %s..." % [ version_tag ]
|
349
339
|
|
350
340
|
if self.get_history_file_versions.include?( version_tag )
|
@@ -408,27 +398,31 @@ module Rake::DevEiate::Hg
|
|
408
398
|
def do_hg_debug( task, args )
|
409
399
|
self.prompt.say( "Hg Info", color: :bright_green )
|
410
400
|
|
411
|
-
self.
|
412
|
-
|
413
|
-
|
414
|
-
|
401
|
+
if self.is_hg_working_copy?
|
402
|
+
self.prompt.say( "Mercurial version: " )
|
403
|
+
self.prompt.say( Hglib.version, color: :bold )
|
404
|
+
self.prompt.say( "Release tag prefix: " )
|
405
|
+
self.prompt.say( self.release_tag_prefix, color: :bold )
|
415
406
|
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
407
|
+
self.prompt.say( "Version tags:" )
|
408
|
+
self.get_hg_version_tag_names.each do |tag|
|
409
|
+
self.prompt.say( '- ' )
|
410
|
+
self.prompt.say( tag, color: :bold )
|
411
|
+
end
|
421
412
|
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
413
|
+
self.prompt.say( "History file versions:" )
|
414
|
+
self.get_history_file_versions.each do |tag|
|
415
|
+
self.prompt.say( '- ' )
|
416
|
+
self.prompt.say( tag, color: :bold )
|
417
|
+
end
|
427
418
|
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
419
|
+
self.prompt.say( "Unhistoried version tags:" )
|
420
|
+
self.get_hg_unhistoried_version_tags.each do |tag|
|
421
|
+
self.prompt.say( '- ' )
|
422
|
+
self.prompt.say( tag, color: :bold )
|
423
|
+
end
|
424
|
+
else
|
425
|
+
self.prompt.say( "Doesn't appear to be a Mercurial repository." )
|
432
426
|
end
|
433
427
|
|
434
428
|
self.prompt.say( "\n" )
|
@@ -447,7 +441,7 @@ module Rake::DevEiate::Hg
|
|
447
441
|
|
448
442
|
### Given a +status_hash+ like that returned by Hglib::Repo.status, return a
|
449
443
|
### string description of the files and their status.
|
450
|
-
def
|
444
|
+
def show_hg_file_statuses( statuses )
|
451
445
|
lines = statuses.map do |entry|
|
452
446
|
status_color = STATUS_COLORS[ entry.status ]
|
453
447
|
" %s: %s" % [
|
@@ -462,48 +456,30 @@ module Rake::DevEiate::Hg
|
|
462
456
|
|
463
457
|
|
464
458
|
### Fetch the name of the current version's tag.
|
465
|
-
def
|
459
|
+
def current_hg_version_tag
|
466
460
|
return [ self.release_tag_prefix, self.version ].join
|
467
461
|
end
|
468
462
|
|
469
463
|
|
470
464
|
### Fetch the name of the tag for the previous version.
|
471
|
-
def
|
472
|
-
return self.
|
473
|
-
end
|
474
|
-
|
475
|
-
|
476
|
-
### Return a Regexp that matches the project's convention for versions.
|
477
|
-
def release_tag_pattern
|
478
|
-
prefix = self.release_tag_prefix
|
479
|
-
return /#{prefix}\d+(\.\d+)+/
|
465
|
+
def previous_hg_version_tag
|
466
|
+
return self.get_hg_version_tag_names.first
|
480
467
|
end
|
481
468
|
|
482
469
|
|
483
470
|
### Fetch the list of names of tags that match the versioning scheme of this
|
484
471
|
### project.
|
485
|
-
def
|
472
|
+
def get_hg_version_tag_names
|
486
473
|
tag_pattern = self.release_tag_pattern
|
487
474
|
return self.hg.tags.map( &:name ).grep( tag_pattern )
|
488
475
|
end
|
489
476
|
|
490
477
|
|
491
|
-
### Fetch the list of the versions of releases that have entries in the history
|
492
|
-
### file.
|
493
|
-
def get_history_file_versions
|
494
|
-
tag_pattern = self.release_tag_pattern
|
495
|
-
|
496
|
-
return IO.readlines( self.history_file ).grep( tag_pattern ).map do |line|
|
497
|
-
line[ /^(?:h\d\.|#+|=+)\s+(#{tag_pattern})\s+/, 1 ]
|
498
|
-
end.compact
|
499
|
-
end
|
500
|
-
|
501
|
-
|
502
478
|
### Read the list of tags and return any that don't have a corresponding section
|
503
479
|
### in the history file.
|
504
|
-
def
|
505
|
-
release_tags = self.
|
506
|
-
release_tags.unshift( self.
|
480
|
+
def get_hg_unhistoried_version_tags( include_current_version: true )
|
481
|
+
release_tags = self.get_hg_version_tag_names
|
482
|
+
release_tags.unshift( self.current_hg_version_tag ) if include_current_version
|
507
483
|
|
508
484
|
self.get_history_file_versions.each do |tag|
|
509
485
|
release_tags.delete( tag )
|
@@ -514,7 +490,7 @@ module Rake::DevEiate::Hg
|
|
514
490
|
|
515
491
|
|
516
492
|
### Generate a commit log and invoke the user's editor on it.
|
517
|
-
def
|
493
|
+
def hg_edit_commit_log( logfile )
|
518
494
|
diff = self.hg.diff
|
519
495
|
|
520
496
|
TTY::Editor.open( logfile, text: diff )
|
@@ -533,32 +509,6 @@ module Rake::DevEiate::Hg
|
|
533
509
|
end
|
534
510
|
end
|
535
511
|
|
536
|
-
|
537
|
-
### Delete the files in the given +filelist+ after confirming with the user.
|
538
|
-
def delete_extra_files( *filelist )
|
539
|
-
description = humanize_file_list( filelist, ' ' )
|
540
|
-
self.prompt.say "Files to delete:"
|
541
|
-
self.prompt.say( description )
|
542
|
-
|
543
|
-
if self.prompt.yes?( "Really delete them?" ) {|q| q.default(false) }
|
544
|
-
filelist.each do |f|
|
545
|
-
rm_rf( f, verbose: true )
|
546
|
-
end
|
547
|
-
end
|
548
|
-
end
|
549
|
-
|
550
|
-
|
551
|
-
### Returns a human-scannable file list by joining and truncating the list if it's too long.
|
552
|
-
def humanize_file_list( list, indent=FILE_INDENT )
|
553
|
-
listtext = list[0..5].join( "\n#{indent}" )
|
554
|
-
if list.length > 5
|
555
|
-
listtext << " (and %d other/s)" % [ list.length - 5 ]
|
556
|
-
end
|
557
|
-
|
558
|
-
return listtext
|
559
|
-
end
|
560
|
-
|
561
|
-
|
562
512
|
end # module Rake::DevEiate::Hg
|
563
513
|
|
564
514
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rake-deveiate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
@@ -10,9 +10,9 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
MIID+
|
14
|
-
|
15
|
-
|
13
|
+
MIID+DCCAmCgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
|
14
|
+
REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMDEyMjQyMDU1MjlaFw0yMTEyMjQyMDU1
|
15
|
+
MjlaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
|
16
16
|
hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
|
17
17
|
L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
|
18
18
|
M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
|
@@ -23,17 +23,17 @@ cert_chain:
|
|
23
23
|
ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
|
24
24
|
N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
|
25
25
|
VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
26
|
+
9w0BAQsFAAOCAYEAMYegZanJi8zq7QKPT7wqXefX4C88I5JWeBHR3PvvWK0CwyMV
|
27
|
+
peyiu5I13w/lYX+HUZjE4qsSpJMJFXWl4WZCOo+AMprOcf0PxfuJpxCej5D4tavf
|
28
|
+
vRfhahSw7XJrcZih/3J+/UgoH7R05MJ+8LTcy3HGrB3a0vTafjm8OY7Xpa0LJDoN
|
29
|
+
JDqxK321VIHyTibbKeA1hWSE6ljlQDvFbTqiCj3Ulp1jTv3TOlvRl8fqcfhxUJI0
|
30
|
+
+5Q82jJODjEN+GaWs0V+NlrbU94cXwS2PH5dXogftB5YYA5Ex8A0ikZ73xns4Hdo
|
31
|
+
XxdLdd92F5ovxA23j/rKe/IDwqr6FpDkU3nPXH/Qp0TVGv9zZnVJc/Z6ChkuWj8z
|
32
|
+
pW7JAyyiiHZgKKDReDrA2LA7Zs3o/7KA6UtUH0FHf8LYhcK+pfHk6RtjRe65ffw+
|
33
|
+
MCh97sQ/Z/MOusb5+QddBmB+k8EicXyGNl4b5L4XpL7fIQu+Y96TB3JEJlShxFD9
|
34
|
+
k9FjI4d9EP54gS/4
|
35
35
|
-----END CERTIFICATE-----
|
36
|
-
date: 2020-
|
36
|
+
date: 2020-12-28 00:00:00.000000000 Z
|
37
37
|
dependencies:
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: rake
|
@@ -167,6 +167,20 @@ dependencies:
|
|
167
167
|
- - "~>"
|
168
168
|
- !ruby/object:Gem::Version
|
169
169
|
version: '0.7'
|
170
|
+
- !ruby/object:Gem::Dependency
|
171
|
+
name: git
|
172
|
+
requirement: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
174
|
+
- - "~>"
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '1.7'
|
177
|
+
type: :runtime
|
178
|
+
prerelease: false
|
179
|
+
version_requirements: !ruby/object:Gem::Requirement
|
180
|
+
requirements:
|
181
|
+
- - "~>"
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: '1.7'
|
170
184
|
- !ruby/object:Gem::Dependency
|
171
185
|
name: rdoc-generator-fivefish
|
172
186
|
requirement: !ruby/object:Gem::Requirement
|
@@ -200,10 +214,13 @@ files:
|
|
200
214
|
- lib/rake/deveiate.rb
|
201
215
|
- lib/rake/deveiate/checks.rb
|
202
216
|
- lib/rake/deveiate/docs.rb
|
217
|
+
- lib/rake/deveiate/extensions.rb
|
203
218
|
- lib/rake/deveiate/fixup.rb
|
204
219
|
- lib/rake/deveiate/gem_dep_finder.rb
|
205
220
|
- lib/rake/deveiate/gemspec.rb
|
206
221
|
- lib/rake/deveiate/generate.rb
|
222
|
+
- lib/rake/deveiate/git-refinements.rb
|
223
|
+
- lib/rake/deveiate/git.rb
|
207
224
|
- lib/rake/deveiate/hg.rb
|
208
225
|
- lib/rake/deveiate/packaging.rb
|
209
226
|
- lib/rake/deveiate/releases.rb
|
@@ -232,7 +249,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
232
249
|
- !ruby/object:Gem::Version
|
233
250
|
version: '0'
|
234
251
|
requirements: []
|
235
|
-
rubygems_version: 3.
|
252
|
+
rubygems_version: 3.2.3
|
236
253
|
signing_key:
|
237
254
|
specification_version: 4
|
238
255
|
summary: This is a collection of Rake tasks I use for development.
|
metadata.gz.sig
CHANGED
Binary file
|