gembuild 1.0.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.
@@ -0,0 +1,167 @@
1
+ # encoding: utf-8
2
+
3
+ # Gembuild: create Arch Linux PKGBUILDs for ruby gems.
4
+ # Copyright (C) 2015 Mario Finelli <mario@finel.li>
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ require 'English'
20
+
21
+ module Gembuild
22
+ # This class is mostly responsible for creating new AUR packages: checking
23
+ # out, adding files and committing to git.
24
+ #
25
+ # @!attribute [r] config
26
+ # @return [Hash] the response from Gembuild.configure
27
+ # @!attribute [r] full_path
28
+ # @return [String] the full local path to the project
29
+ # @!attribute [r] gemname
30
+ # @return [String] the name of the gem
31
+ # @!attribute [r] pkgdir
32
+ # @return [String] where repositories are checked out
33
+ # @!attribute [r] pkgname
34
+ # @return [String] the AUR package
35
+ class Project
36
+ attr_reader :config, :full_path, :gemname, :pkgdir, :pkgname
37
+
38
+ # A standard gitignore for new projects that only allows the following
39
+ # whitelisted files: itself, the PKGBUILD and the .SRCINFO.
40
+ GITIGNORE = "*\n!.gitignore\n!PKGBUILD\n!.SRCINFO\n"
41
+
42
+ # Return a new project instance.
43
+ #
44
+ # @param gemname [String] The ruby gem for which to create a project.
45
+ # @return [Gembuild::Project] the new project instance
46
+ def initialize(gemname)
47
+ @pkgname = "ruby-#{gemname}"
48
+ @gemname = gemname
49
+
50
+ @config = Gembuild.configure
51
+ @pkgdir = @config[:pkgdir]
52
+ @full_path = File.join(@pkgdir, @pkgname)
53
+ end
54
+
55
+ # Git clone the project if it hasn't already been checked out. If it has
56
+ # then pull master to ensure the most recent update.
57
+ #
58
+ # @return [void]
59
+ def clone_and_update!
60
+ if File.directory?(full_path)
61
+ `cd #{full_path} && git checkout master && git pull origin master`
62
+ else
63
+ `git clone ssh://aur@aur4.archlinux.org/#{pkgname}.git #{full_path}`
64
+ end
65
+ end
66
+
67
+ # Write a standard gitignore file if none exists.
68
+ #
69
+ # @return [void]
70
+ def write_gitignore!
71
+ ignore_path = File.join(full_path, '.gitignore')
72
+
73
+ File.write(ignore_path, GITIGNORE) unless File.exist?(ignore_path)
74
+ end
75
+
76
+ # Ensure that the git user and email address are correct for the
77
+ # repository.
78
+ #
79
+ # @param name [String] The user name to send to git.
80
+ # @param email [String] The user email to send to git.
81
+ # @return [void]
82
+ def configure_git!(name, email)
83
+ `cd #{full_path} && git config user.name "#{name}"`
84
+ `cd #{full_path} && git config user.email "#{email}"`
85
+ end
86
+
87
+ # Read into memory the PKGBUILD in the project's directory or an empty
88
+ # string if none exists.
89
+ #
90
+ # @return [String] the existing pkgbuild or an empty string
91
+ def load_existing_pkgbuild
92
+ pkgbuild_path = File.join(full_path, 'PKGBUILD')
93
+
94
+ if File.file?(pkgbuild_path)
95
+ File.read(pkgbuild_path)
96
+ else
97
+ ''
98
+ end
99
+ end
100
+
101
+ # Update the package metadata with mksrcinfo and then stage all changes
102
+ # with git.
103
+ #
104
+ # @return [void]
105
+ def stage_changes!
106
+ `cd #{full_path} && mksrcinfo && git add .`
107
+ end
108
+
109
+ # Determine the commit message depending upon whether it's the initial
110
+ # commit or we're bumping the release.
111
+ #
112
+ # @param version [String] The version of the package to include in the
113
+ # commit message.
114
+ # @return [String] the appropriate commit message
115
+ def commit_message(version)
116
+ `cd #{full_path} && git rev-parse HEAD &> /dev/null`
117
+
118
+ if !$CHILD_STATUS.success?
119
+ 'Initial commit'
120
+ else
121
+ "Bump version to #{version}"
122
+ end
123
+ end
124
+
125
+ # Commit the currently staged changeset.
126
+ #
127
+ # @param message [String] The requested commit message.
128
+ # @return [void]
129
+ def commit_changes!(message)
130
+ `cd #{full_path} && git commit -m "#{message}"`
131
+ end
132
+
133
+ # Get the gembuild configuration and ensure that the pkgdir exists
134
+ # creating it if necessary.
135
+ #
136
+ # @return [void]
137
+ def ensure_pkgdir!
138
+ FileUtils.mkdir_p(pkgdir) unless File.directory?(pkgdir)
139
+ end
140
+
141
+ # Ensure that the project directory has been created and is up-to-date.
142
+ #
143
+ # @return [void]
144
+ def prepare_working_directory!
145
+ ensure_pkgdir!
146
+ clone_and_update!
147
+ write_gitignore!
148
+ configure_git!(config[:name], config[:email])
149
+ end
150
+
151
+ # Make sure that the working directory is created and up to date, and that
152
+ # git is configured for the project. Then create an updated PKGBUILD based
153
+ # on the most recent version of the gem and write it out. Generate the
154
+ # updated metadata using `mksrcinfo` and then commit all changes to git.
155
+ #
156
+ # @return [void]
157
+ def clone_and_commit!
158
+ prepare_working_directory!
159
+
160
+ pkgbuild = Gembuild::Pkgbuild.create(gemname, load_existing_pkgbuild)
161
+ pkgbuild.write(full_path)
162
+
163
+ stage_changes!
164
+ commit_changes!(commit_message(pkgbuild.pkgver))
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ # Gembuild: create Arch Linux PKGBUILDs for ruby gems.
4
+ # Copyright (C) 2015 Mario Finelli <mario@finel.li>
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ # Create Arch Linux PKGBUILDs for ruby gems.
20
+ module Gembuild
21
+ # Current version of Gembuild.
22
+ VERSION = '1.0.0'
23
+ end
metadata ADDED
@@ -0,0 +1,301 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gembuild
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Mario Finelli
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-01-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mechanize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: coveralls
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mutant-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: redcarpet
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-rspec
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rubycritic
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: ruby-lint
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: simplecov
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: vcr
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: webmock
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: yard
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ description: Generate PKGBUILDs for ruby gems.
252
+ email:
253
+ - mario@finel.li
254
+ executables:
255
+ - gembuild
256
+ extensions: []
257
+ extra_rdoc_files: []
258
+ files:
259
+ - ".gitignore"
260
+ - ".rspec"
261
+ - ".travis.yml"
262
+ - CHANGELOG.md
263
+ - Gemfile
264
+ - LICENSE
265
+ - README.md
266
+ - Rakefile
267
+ - bin/gembuild
268
+ - gembuild.gemspec
269
+ - lib/gembuild.rb
270
+ - lib/gembuild/aur_scraper.rb
271
+ - lib/gembuild/exceptions.rb
272
+ - lib/gembuild/gem_scraper.rb
273
+ - lib/gembuild/pkgbuild.erb
274
+ - lib/gembuild/pkgbuild.rb
275
+ - lib/gembuild/project.rb
276
+ - lib/gembuild/version.rb
277
+ homepage: https://github.com/mfinelli/gembuild
278
+ licenses:
279
+ - GPL-3.0+
280
+ metadata: {}
281
+ post_install_message:
282
+ rdoc_options: []
283
+ require_paths:
284
+ - lib
285
+ required_ruby_version: !ruby/object:Gem::Requirement
286
+ requirements:
287
+ - - ">="
288
+ - !ruby/object:Gem::Version
289
+ version: '0'
290
+ required_rubygems_version: !ruby/object:Gem::Requirement
291
+ requirements:
292
+ - - ">="
293
+ - !ruby/object:Gem::Version
294
+ version: '0'
295
+ requirements: []
296
+ rubyforge_project:
297
+ rubygems_version: 2.5.1
298
+ signing_key:
299
+ specification_version: 4
300
+ summary: Generate PKGBUILDs for ruby gems.
301
+ test_files: []