-
Notifications
You must be signed in to change notification settings - Fork 44
/
Rakefile
211 lines (181 loc) · 6.94 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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
# frozen_string_literal: true
# Copyright (c) [2022] SUSE LLC
#
# All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of version 2 of the GNU General Public License as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, contact SUSE LLC.
#
# To contact SUSE LLC about this file by physical or electronic mail, you may
# find current contact information at www.suse.com.
require "shellwords"
require "fileutils"
require "yast/rake"
# Infers the gem name from the source code
#
# It searches for a gemspec to deduct the name.
#
# @param directory [String] sources directory
# @return [String,nil]
def gem_name_from(directory)
gemspec = Dir.glob(File.join(directory, "*.gemspec")).first
return nil unless gemspec
gemspec_file = File.basename(gemspec)
gemspec_file[/(.+)\.gemspec/, 1]
end
# Infers the package name from the source code
#
# @param directory [String] source directory
# @return [String,nil]
def package_name_from(directory)
gem = gem_name_from(directory)
return nil if gem.nil?
"rubygem-#{gem}"
end
# Finds the gems in the source directory
#
# @param directory [String] source directory
# @return [<String>]
def find_gem(directory)
name = gem_name_from(directory)
Dir.glob(File.join(directory, "#{name}-*.gem"))
end
def live_iso?
mount_out = `mount`
# live medium uses overlay FS or device mapper for the root
mount_out.match?(/^\w+ on \/ type overlay/) || mount_out.match?(/^\/dev\/mapper\/live-rw on \/ /)
end
def package_translations
# build the translations tarball
#
# NOTE: the following code was inspired by the
# packaging_rake_tasks/lib/tasks/tarball.rake file
#
# set the file time stamps according to the latest commit
mtime = `git show -s --format=%ci`.chomp
# For the reproducible output:
# - use the GNU format (the default POSIX format contains some time stamps)
# - sort the files (in a locale independent way)
# - set the owner and group to "root"
# - set the fixed modification time
sh("LC_ALL=C tar -c -j -f #{Shellwords.escape(package_dir)}/po.tar.bz2 --format=gnu --sort=name " \
"--owner=root --group=root --mtime=#{Shellwords.escape(mtime)} po/*.po")
end
def package_agama_yast_spec(gem_filename)
# "/foo/agama/service/agama-yast-10.devel201.gem" -> "10.devel201"
version = gem_filename.sub(/\.gem$/, "").sub(/.*-/, "")
spec_text = File.read("agama-yast.spec.in")
spec_text.gsub!("@VERSION@", version)
File.write(File.join(package_dir, "agama-yast.spec"), spec_text)
end
Yast::Tasks.configuration do |conf|
conf.obs_api = "https://api.opensuse.org"
conf.obs_project = ENV["OBS_PROJECT"] || "systemsmanagement:Agama:Devel"
conf.package_dir = File.join(Rake.original_dir, "package")
conf.obs_target = "openSUSE_Tumbleweed"
package_name = package_name_from(Rake.original_dir)
conf.package_name = package_name if package_name
end
desc "Create a new version tag, the new version is <current major> + 1 or pass the version as a parameter"
task :tag, [:version] do |t, args|
args.with_defaults = { :version => nil }
if args[:version]
new_version = args[:version]
else
new_version = `git describe --tags --match "v[0-9]*"`.match(/^v(\d+)/)[1].to_i + 1
end
system("git tag -s -m 'Version #{new_version}' v#{new_version}") || exit(1)
puts "Created version tag: v#{new_version}"
puts "To push the tag to the server run: git push origin v#{new_version}"
end
# Removes the "package" task to redefine it later.
Rake::Task["package"].clear
# Disables the osc:build
if ENV["SKIP_OSC_BUILD"] == "1"
Rake::Task["osc:build"].clear
# ensure the package sources are still built
task :"osc:build" => :package
end
# TODO: redefine :tarball instead of :package
desc "Prepare sources for rpm build. Invoke from service/"
task package: [] do
Dir.chdir(Rake.original_dir) do |dir|
old_gems = Dir.glob(File.join(package_dir, "*.gem"))
FileUtils.rm(old_gems) unless old_gems.empty?
name = gem_name_from(dir)
sh "gem build #{name}.gemspec"
gem = find_gem(dir).first
gem2rpm = File.join(package_dir, "gem2rpm.yml")
sh "gem2rpm --local --config #{gem2rpm} --template opensuse #{gem} > package/#{package_name}.spec"
FileUtils.mv(gem, package_dir)
package_agama_yast_spec(gem)
package_translations
end
end
SERVICES_DIR = "/usr/share/dbus-1/agama-services"
# support for patching by the yupdate script,
# only when running in the inst-sys or live medium
if ENV["YUPDATE_FORCE"] == "1" || File.exist?("/.packages.initrd") || live_iso?
Rake::Task["install"].clear
task :install do
destdir = ENV["DESTDIR"] || "/"
if ENV["YUPDATE_SKIP_BACKEND"] != "1"
puts "Installing the DBus service..."
Dir.chdir("service") do
sh "gem build agama.gemspec"
sh "gem install --local --force --no-format-exec --no-doc --build-root #{destdir.shellescape} agama-*.gem"
# update the DBus configuration files
FileUtils.mkdir_p(SERVICES_DIR)
sh "cp share/org.opensuse.Agama*.service #{SERVICES_DIR}"
sh "cp share/dbus.conf /usr/share/dbus-1/agama.conf"
# update the systemd service file
source_file = "share/agama.service"
target_file = "/usr/lib/systemd/system/agama.service"
unless FileUtils.identical?(source_file, target_file)
FileUtils.cp(source_file, target_file)
sh "systemctl daemon-reload"
end
end
end
if ENV["YUPDATE_SKIP_FRONTEND"] != "1"
puts "Installing the Web frontend..."
Dir.chdir("web") do
node_env = ENV["NODE_ENV"] || "production"
sh "NODE_ENV=#{node_env.shellescape} make install"
# clean up the extra files when switching the development/production mode
if node_env == "production"
# remove the uncompressed and development files
FileUtils.rm_f(Dir.glob("/usr/share/cockpit/agama/index.{css,html,js}"))
FileUtils.rm_f(Dir.glob("/usr/share/cockpit/agama/*.map"))
else
# remove the compressed files
FileUtils.rm_f(Dir.glob("/usr/share/cockpit/agama/*.gz"))
end
end
end
if ENV["YUPDATE_SKIP_PRODUCTS"] != "1"
files = Dir.glob("products.d/*.y{a}ml")
files.each do |f|
# the sources contain several products, update only the existing files
oldfile = File.join("/usr/share/agama/", f)
if File.exist?(oldfile)
target = File.join(destdir, "/usr/share/agama/", f)
FileUtils.mkdir_p(File.dirname(target))
FileUtils.cp(f, target)
else
# if there is a new product file it needs to be copied manually
puts "Skipping product file: #{f}"
end
end
end
end
end