1# -*- ruby -*-
2
3require "open-uri"
4require_relative "helper"
5
6package = "pgroonga"
7package_label = "PGroonga"
8rsync_base_path = "packages@packages.groonga.org:public"
9
10def latest_groonga_version
11  @latest_groonga_version ||= Helper.detect_latest_groonga_version
12end
13
14def export_source(base_name)
15  sh("git archive --prefix=#{base_name}/ --format=tar HEAD | " +
16     "tar xf -")
17  sh("(cd vendor/xxHash && " +
18     "git archive --prefix=#{base_name}/vendor/xxHash/ --format=tar HEAD) | " +
19     "tar xf -")
20end
21
22version = Helper.detect_version(package)
23
24archive_base_name = "#{package}-#{version}"
25suffix = ENV["SUFFIX"]
26if suffix
27  archive_base_name << suffix
28end
29archive_name = "#{archive_base_name}.tar.gz"
30windows_archive_name = "#{archive_base_name}.zip"
31
32dist_files = `git ls-files`.split("\n").reject do |file|
33  file.start_with?("packages/")
34end
35
36file archive_name => dist_files do
37  export_source(archive_base_name)
38  sh("tar", "czf", archive_name, archive_base_name)
39  rm_r(archive_base_name)
40end
41
42file windows_archive_name => dist_files do
43  export_source(archive_base_name)
44  groonga_base_name = "groonga-#{latest_groonga_version}"
45  groonga_suffix = ENV["GROONGA_SUFFIX"]
46  if groonga_suffix
47    groonga_base_name << groonga_suffix
48    groonga_archive_name = "#{groonga_base_name}.zip"
49    sh("curl",
50       "-O",
51       "https://packages.groonga.org/tmp/#{groonga_archive_name}")
52  else
53    groonga_archive_name = "#{groonga_base_name}.zip"
54    sh("curl",
55       "-O",
56       "https://packages.groonga.org/source/groonga/#{groonga_archive_name}")
57  end
58  rm_rf(groonga_base_name)
59  sh("unzip", groonga_archive_name)
60  rm(groonga_archive_name)
61  mkdir_p("#{archive_base_name}/vendor")
62  mv(groonga_base_name, "#{archive_base_name}/vendor/groonga")
63  rm_f(windows_archive_name)
64  sh("zip", "-r", windows_archive_name, archive_base_name)
65  rm_r(archive_base_name)
66end
67
68desc "Create release package"
69task :dist => [archive_name, windows_archive_name]
70
71desc "Tag #{version}"
72task :tag do
73  sh("git", "tag",
74     "-a", version,
75     "-m", "#{package_label} #{version} has been released!!!")
76  sh("git", "push", "--tags")
77end
78
79namespace :version do
80  desc "Update version"
81  task :update do
82    new_version = Helper.env_value("NEW_VERSION")
83
84    Dir.glob("*.control") do |control_path|
85      package_name = File.basename(control_path, ".*")
86      content = File.read(control_path)
87      content = content.gsub(/^default_version = '.+?'/,
88                             "default_version = '#{new_version}'")
89      File.open(control_path, "w") do |control_file|
90        control_file.print(content)
91      end
92      sh("git", "add", control_path)
93
94      upgrade_sql_name = "#{package_name}--#{version}--#{new_version}.sql"
95      upgrade_sql_path = File.join("data", upgrade_sql_name)
96      File.open(upgrade_sql_path, "w") do |upgrade_sql|
97        upgrade_sql.puts("-- Upgrade SQL")
98      end
99      sh("git", "add", upgrade_sql_path)
100    end
101  end
102end
103
104packages_dir = "packages"
105
106namespace :package do
107  package_names = [
108    "pgroonga",
109    "postgresql-10-pgroonga",
110    "postgresql-10-pgdg-pgroonga",
111    "postgresql-11-pgroonga",
112    "postgresql-12-pgroonga",
113    "postgresql-12-pgdg-pgroonga",
114    "postgresql-13-pgroonga",
115    "postgresql-13-pgdg-pgroonga",
116    "postgresql-14-pgdg-pgroonga",
117  ]
118
119  namespace :source do
120    rsync_path = "#{rsync_base_path}/source/#{package}"
121    source_dir = "#{packages_dir}/source"
122
123    directory source_dir
124
125    desc "Clean sources"
126    task :clean do
127      rm_rf(source_dir)
128    end
129
130    desc "Upload sources"
131    task :upload => [archive_name, windows_archive_name, source_dir] do
132      groonga_repository = ENV["GROONGA_REPOSITORY"]
133      if groonga_repository.nil?
134        raise "Specify GROONGA_REPOSITORY environment variable"
135      end
136      gpg_uid = File.read(File.join(groonga_repository, "gpg_uid_rsa4096")).strip
137
138      prepare_archive = lambda do |archive, latest_archive|
139        cp(archive, source_dir)
140        cd(source_dir) do
141          ln_sf(archive, latest_archive)
142          sh("gpg",
143             "--local-user", gpg_uid,
144             "--armor",
145             "--detach-sign",
146             archive)
147          ln_sf("#{archive}.asc", "#{latest_archive}.asc")
148        end
149      end
150
151      prepare_archive.call(archive_name, "#{package}-latest.tar.gz")
152      prepare_archive.call(windows_archive_name, "#{package}-latest.zip")
153      sh("rsync", "-avz", "--progress", "#{source_dir}/", rsync_path)
154    end
155
156    namespace :snapshot do
157      desc "Upload snapshot sources"
158      task :upload => [archive_name, windows_archive_name] do
159        sh("scp", archive_name, "#{rsync_base_path}/tmp")
160        sh("scp", windows_archive_name, "#{rsync_base_path}/tmp")
161      end
162    end
163  end
164
165  desc "Release sources"
166  source_tasks = [
167    "package:source:clean",
168    "package:source:upload",
169  ]
170  task :source => source_tasks
171
172  desc "Release APT packages"
173  task :apt do
174    package_names.each do |package_name|
175      cd("packages/#{package_name}") do
176        ruby("-S", "rake", "apt")
177      end
178    end
179  end
180
181  desc "Release Ubuntu packages"
182  task :ubuntu do
183    package_names.each do |package_name|
184      cd("packages/#{package_name}") do
185        ruby("-S", "rake", "ubuntu", "--trace")
186      end
187    end
188  end
189
190  desc "Release Yum packages"
191  task :yum do
192    package_names.each do |package_name|
193      cd("packages/#{package_name}") do
194        ruby("-S", "rake", "yum")
195      end
196    end
197  end
198
199  namespace :version do
200    desc "Update versions"
201    task :update do
202      package_names.each do |package_name|
203        cd("packages/#{package_name}") do
204          ruby("-S", "rake", "version:update")
205        end
206      end
207      spec_in = nil
208      package_names.reverse_each do |package_name|
209        spec_in = Dir.glob("packages/#{package_name}/yum/*.spec.in").first
210        break if spec_in
211      end
212      cp(spec_in, "packages/yum/postgresql-pgroonga.spec.in")
213    end
214  end
215end
216