forked from nanoc/nanoc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRakefile
120 lines (102 loc) · 3.17 KB
/
Rakefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# frozen_string_literal: true
require 'rubocop/rake_task'
RuboCop::RakeTask.new(:rubocop)
def sub_sh(dir, cmd)
Bundler.with_clean_env do
Dir.chdir(dir) do
puts "======= entering ./#{dir}/"
puts
sh(cmd)
puts
puts "======= exiting ./#{dir}/"
end
end
end
packages = %w[
nanoc
nanoc-core
nanoc-cli
nanoc-checking
nanoc-deploying
nanoc-external
nanoc-live
nanoc-spec
guard-nanoc
]
def name_sets(packages)
packages
.partition { |name| %w[nanoc nanoc-core nanoc-cli].include?(name) }
.map(&:sort)
end
packages.each do |package|
namespace(package.tr('-', '_')) do
task(:test) { sub_sh(package, 'bundle exec rake test') }
task(:rubocop) { sub_sh(package, 'bundle exec rake rubocop') }
end
end
task test: packages.map { |p| p.tr('-', '_') + ':test' }
task gem: packages.map { |p| p.tr('-', '_') + ':gem' }
task :needs_release do
tags = `git tags`.lines.map(&:chomp).map { |t| t.match?(/\A\d/) ? 'nanoc-v' + t : t }
tags_by_base_name = tags.group_by { |t| t[/\A.*(?=-v\d)/] }.select { |(base_name, _tags)| base_name }
versions_by_base_name = tags_by_base_name.transform_values { |list| list.map { |nv| nv.match(/\A.*-v(\d.*)/) }.compact.map { |m| Gem::Version.new(m[1]) } }
last_version_by_base_name = versions_by_base_name.transform_values(&:max)
name_length = name_sets(packages).flatten.map(&:size).max
name_sets(packages).each_with_index do |names, idx|
puts if idx.positive?
names.each do |name|
last_version = last_version_by_base_name[name]
if last_version
dir = name
tag = name == 'nanoc' ? last_version.to_s : name + '-v' + last_version.to_s
diff = `git diff --stat #{tag} #{dir}`
needs_release = diff.match?(/\d+ files changed/)
text = needs_release ? 'needs release' : 'up to date'
color = needs_release ? "\e[33m" : "\e[32m"
else
text = 'needs initial release'
color = "\e[31m"
end
puts(
format(
"%-#{name_length}s \e[1m%s%s\e[0m",
name,
color,
text,
),
)
end
end
end
task :summary do
versions = {}
dependencies = {}
packages.each do |name|
gemspec = Bundler.rubygems.find_name(name).first
dependencies[name] =
gemspec
.dependencies
.select { |d| d.name.match?(/nanoc/) }
versions[name] = gemspec.version
end
puts '━━━ VERSIONS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'
puts
name_length = versions.keys.map(&:size).max
name_sets(packages).each_with_index do |names, idx|
puts if idx.positive?
names.each do |name|
puts(format(" %#{name_length}s %s", name, versions[name]))
end
end
puts
puts '━━━ DEPENDENCIES ━━━━━━━━━━━━━━━━━━━━━━━━━━━━'
puts
name_sets(packages).flatten.each do |name|
puts(format(' %-s %s', name, '╌' * (40 - name.length)))
dependencies[name].sort_by(&:name).each do |dependency|
puts(format(" %-#{name_length}s %s", dependency.name, dependency.requirement))
end
puts
end
end
task default: %i[test rubocop]