qrpm 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/example.yml +30 -0
- data/exe/qrpm +13 -9
- data/lib/qrpm/parser.rb +31 -2
- data/lib/qrpm/rpm.rb +18 -13
- data/lib/qrpm/template.erb +2 -0
- data/lib/qrpm/template.yml +1 -0
- data/lib/qrpm/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 884bb9257c9679db9a55e792de02fe716fc777e8903b1ed003fed768bba51129
|
4
|
+
data.tar.gz: eebed25d75b50ae9f738afebadec366ae22307245be691449cce0ca48f3bab6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a12688142eb50b64dbf59324d299f192421675279af2574be1fee9d6df5aba3b0272f9a4196d05dee64165be6ffc19f2769c7954a363e6c705b6b17849be5d93
|
7
|
+
data.tar.gz: bad940c0c5af97d5fa5ec5c809266765b0d3ecd5925a50c726544ea2cc15d7ba434926ba6c6e1b00918c002cfbcf2dd26f1409e93fa01b7bbfb7ffbfe0cac321
|
data/example.yml
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# QRPM configuration file. See https://github.com/clrgit/qrpm
|
2
|
+
|
3
|
+
name: $pg_name-url_encode
|
4
|
+
summary: Adds the url_encode extension to postgres
|
5
|
+
description: RPM wrapper for the postgres url_encode extension (https://github.com/okbob/url_encode)
|
6
|
+
version: $(cd url_encode; git tag | tail -1 | sed 's/^v//')
|
7
|
+
|
8
|
+
requires:
|
9
|
+
- $pg_name-server
|
10
|
+
- $pg_name-libs
|
11
|
+
|
12
|
+
pg_name: $(rpm -q -qf '%{NAME}\n' -f $(readlink -f $(which pg_config)))
|
13
|
+
pg_version: $(pg_config --version | sed 's/^[^0-9]* \([0-9]\+\).*$/\1/')
|
14
|
+
pg_libdir: $(pg_config --libdir)
|
15
|
+
pg_extdir: $(pg_config --share)/extension
|
16
|
+
|
17
|
+
init:
|
18
|
+
- git submodule init
|
19
|
+
- git submodule update
|
20
|
+
|
21
|
+
make:
|
22
|
+
- cd url_encode; make
|
23
|
+
|
24
|
+
$pg_libdir:
|
25
|
+
- url_encode/src/url_encode.so
|
26
|
+
|
27
|
+
$pg_extdir:
|
28
|
+
- url_encode/url_encode.control
|
29
|
+
- url_encode/sql/url_encode--1.2.sql
|
30
|
+
|
data/exe/qrpm
CHANGED
@@ -12,6 +12,7 @@ require 'indented_io'
|
|
12
12
|
# TODO
|
13
13
|
# o Fix BuildRoot (contains absolute path)
|
14
14
|
# o Enable escape of $
|
15
|
+
# o Separate standard variable from user-variables in dump
|
15
16
|
|
16
17
|
begin
|
17
18
|
SPEC = %(
|
@@ -44,14 +45,16 @@ begin
|
|
44
45
|
files
|
45
46
|
|
46
47
|
-C,directory=EDIR
|
47
|
-
Change to directory before doing anything else
|
48
|
+
Change to directory before doing anything else. Output files are still
|
49
|
+
created in the current directory, though
|
48
50
|
|
49
51
|
-d,dump
|
50
|
-
Dump internal data and exit
|
52
|
+
Dump internal data and exit. For debug
|
51
53
|
)
|
52
54
|
|
53
|
-
opts, args = ShellOpts.process(SPEC, ARGV)
|
55
|
+
opts, args = ShellOpts.process(SPEC, ARGV, verbose: true)
|
54
56
|
|
57
|
+
currdir = Dir.getwd
|
55
58
|
Dir.chdir(opts.directory) if opts.directory?
|
56
59
|
|
57
60
|
if opts.template?
|
@@ -60,7 +63,8 @@ begin
|
|
60
63
|
exit
|
61
64
|
end
|
62
65
|
|
63
|
-
# Collect var=val settings
|
66
|
+
# Collect var=val settings into the dict hash and sets the configuration file
|
67
|
+
# if present
|
64
68
|
dict = {}
|
65
69
|
while arg = args.extract(0..1)
|
66
70
|
if arg =~ /^(.*?)=(.*)$/
|
@@ -73,12 +77,9 @@ begin
|
|
73
77
|
args.empty? or args.expect(0) # Generates an illegal-number-of-arguments error
|
74
78
|
|
75
79
|
# Check configuration file
|
76
|
-
file ||= QRPM_CONFIG_FILE
|
80
|
+
file ||= Qrpm::QRPM_CONFIG_FILE
|
77
81
|
::File.exist?(file) or raise "Can't find '#{file}'"
|
78
82
|
|
79
|
-
# Check if repository is clean
|
80
|
-
opts.force? || `git status --porcelain 2>/dev/null` == "" or raise "Repository is dirty"
|
81
|
-
|
82
83
|
# Load the qrpm configuration file
|
83
84
|
yaml = YAML.load(IO.read(file).sub(/^__END__\s*$/m, ""))
|
84
85
|
|
@@ -90,8 +91,11 @@ begin
|
|
90
91
|
exit
|
91
92
|
end
|
92
93
|
|
94
|
+
# Check if repository is clean
|
95
|
+
opts.force? || `git status --porcelain 2>/dev/null` == "" or raise "Repository is dirty"
|
96
|
+
|
93
97
|
target = (opts.spec? ? :spec : (opts.source? ? :srpm : :rpm))
|
94
|
-
rpm.build(target: target, file: opts.spec)
|
98
|
+
rpm.build(target: target, file: opts.spec, verbose: opts.verbose?, destdir: currdir)
|
95
99
|
|
96
100
|
rescue RuntimeError => ex
|
97
101
|
ShellOpts.error ex.message
|
data/lib/qrpm/parser.rb
CHANGED
@@ -32,9 +32,15 @@ module Qrpm
|
|
32
32
|
fields.key?(f) or raise "Missing mandatory variable: #{f}"
|
33
33
|
}
|
34
34
|
|
35
|
+
# Get full name of user
|
36
|
+
fullname = Etc.getpwnam(ENV['USER'])&.gecos
|
37
|
+
if fullname.nil? || fullname == ""
|
38
|
+
fullname = ENV['USER']
|
39
|
+
end
|
40
|
+
|
35
41
|
# Defaults for description and packager fields
|
36
42
|
fields["description"] ||= fields["summary"]
|
37
|
-
fields["packager"] ||=
|
43
|
+
fields["packager"] ||= fullname
|
38
44
|
fields["release"] ||= "0"
|
39
45
|
fields["license"] ||= "GPL"
|
40
46
|
|
@@ -42,6 +48,10 @@ module Qrpm
|
|
42
48
|
# of the variables
|
43
49
|
expand_fields
|
44
50
|
|
51
|
+
# Expand variables in directory entries. The algorithm is simpler than in
|
52
|
+
# #expand_fields because no further variable defitinitions can happend
|
53
|
+
expand_dirs
|
54
|
+
|
45
55
|
# Replace symbolic directory names
|
46
56
|
@dirs = dirs.map { |dir, files|
|
47
57
|
if DIRS.key?(dir)
|
@@ -106,6 +116,25 @@ module Qrpm
|
|
106
116
|
"logdir" => "/var/log"
|
107
117
|
}
|
108
118
|
|
119
|
+
# TODO TODO TODO
|
120
|
+
|
121
|
+
# Expand shell expansions ($(shell command))
|
122
|
+
#
|
123
|
+
def expand_shell_commands(object)
|
124
|
+
case object
|
125
|
+
when Array; object.map { |e| expand_shell_commands(e) }
|
126
|
+
when Hash; object.map { |k,v| [k, expand_shell_commands(v)] }.to_h
|
127
|
+
when String;
|
128
|
+
puts object.scan(/\$\(([^\)]+)\)/)
|
129
|
+
object.scan(/\$\(([^\)]+)\)/)
|
130
|
+
|
131
|
+
when Integer, Float, true, false, nil; object
|
132
|
+
else
|
133
|
+
raise "Illegal object: #{object}"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
|
109
138
|
# Returns array of variables in the object. Variables can be either '$name' or
|
110
139
|
# '${name}'. The variables are returned in left-to-right order
|
111
140
|
#
|
@@ -122,7 +151,7 @@ module Qrpm
|
|
122
151
|
|
123
152
|
# Expand variables in the given string
|
124
153
|
#
|
125
|
-
# The method takes
|
154
|
+
# The method takes care to substite left-to-rigth to avoid a variable expansion
|
126
155
|
# to infer with the name of an immediately preceding variable. Eg. $a$b; if $b
|
127
156
|
# is resolved to 'c' then a search would otherwise be made for a variable named
|
128
157
|
# '$ac'
|
data/lib/qrpm/rpm.rb
CHANGED
@@ -11,8 +11,9 @@ module Qrpm
|
|
11
11
|
# license License (defaults to GPL)
|
12
12
|
# summary Short one-line description of package
|
13
13
|
# description Description
|
14
|
-
# packager Name of the packager (defaults to the
|
15
|
-
# environment variable
|
14
|
+
# packager Name of the packager (defaults to the name of the current
|
15
|
+
# user or the value of the $USER environment variable if not
|
16
|
+
# found)
|
16
17
|
# require Array of required packages
|
17
18
|
# make Controls the build process:
|
18
19
|
# null Search the top-level directory for configure or
|
@@ -42,17 +43,21 @@ module Qrpm
|
|
42
43
|
def files() @files ||= nodes.select(&:file?) end
|
43
44
|
def links() @lines ||= nodes.select(&:link?) end
|
44
45
|
|
45
|
-
def
|
46
|
-
def has_make?() ::File.exist? "make" end
|
46
|
+
def verbose?() @verbose end
|
47
47
|
|
48
|
-
def initialize(fields, nodes, template: TEMPLATE)
|
48
|
+
def initialize(fields, nodes, template: TEMPLATE, verbose: false)
|
49
49
|
@fields, @nodes = fields, nodes
|
50
50
|
@template = template
|
51
|
+
@verbose = verbose
|
52
|
+
@verb = verbose ? "" : "&>/dev/null"
|
51
53
|
end
|
52
54
|
|
53
|
-
def
|
55
|
+
def has_configure?() ::File.exist? "configure" end
|
56
|
+
def has_make?() ::File.exist? "make" end
|
57
|
+
|
58
|
+
def build(target: :rpm, file: nil, verbose: false, destdir: ".")
|
59
|
+
verb = verbose ? "" : "&>/dev/null"
|
54
60
|
Dir.mktmpdir { |rootdir|
|
55
|
-
rootdir = "/home/clr/prj/qrpm/tmp"
|
56
61
|
FileUtils.rm_rf(rootdir)
|
57
62
|
FileUtils.mkdir_p(rootdir)
|
58
63
|
|
@@ -73,7 +78,7 @@ module Qrpm
|
|
73
78
|
FileUtils.cp_r(".", tarroot, preserve: true)
|
74
79
|
|
75
80
|
# Roll tarball and put it in the SOURCES directory
|
76
|
-
system "tar zcf #{tar_path} -C #{rootdir}/tmp #{name}" or raise "Can't roll tarball"
|
81
|
+
system "tar zcf #{tar_path} -C #{rootdir}/tmp #{name} #{verb}" or raise "Can't roll tarball"
|
77
82
|
|
78
83
|
# Remove temporary tar dir
|
79
84
|
FileUtils.rm_rf tarroot
|
@@ -84,15 +89,15 @@ module Qrpm
|
|
84
89
|
|
85
90
|
# Emit spec or build RPM
|
86
91
|
if target == :spec
|
87
|
-
IO.write(spec_file, @spec)
|
92
|
+
IO.write("#{destdir}/#{spec_file}", @spec)
|
88
93
|
else
|
89
94
|
IO.write(spec_path, @spec)
|
90
|
-
system "rpmbuild -v -ba --define \"_topdir #{rootdir}\" #{rootdir}/SPECS/#{name}.spec" or
|
91
|
-
raise "Failed building RPM file"
|
95
|
+
system "rpmbuild -v -ba --define \"_topdir #{rootdir}\" #{rootdir}/SPECS/#{name}.spec #{verb}" or
|
96
|
+
raise "Failed building RPM file. Re-run with -v option to see errors"
|
92
97
|
if target == :srpm
|
93
|
-
system "cp #{rootdir}/SRPMS/*
|
98
|
+
system "cp #{rootdir}/SRPMS/* #{destdir}" or raise "Failed copying SRPM file"
|
94
99
|
elsif target == :rpm
|
95
|
-
system "cp #{rootdir}/RPMS/*/#{name}-[0-9]*
|
100
|
+
system "cp #{rootdir}/RPMS/*/#{name}-[0-9]* #{destdir}" or raise "Failed copying RPM file"
|
96
101
|
else
|
97
102
|
raise ArgumentError, "Not a valid value for :target - #{target.inspect}"
|
98
103
|
end
|
data/lib/qrpm/template.erb
CHANGED
@@ -41,6 +41,7 @@ make
|
|
41
41
|
<% end -%>
|
42
42
|
|
43
43
|
%install
|
44
|
+
<% if !nodes.empty? -%>
|
44
45
|
mkdir -p <%= nodes.map { |f| "%{buildroot}#{f.directory}" }.uniq.join(" ") %>
|
45
46
|
<% for file in files -%>
|
46
47
|
cp <%= file.file %> %{buildroot}<%= file.path %>
|
@@ -48,6 +49,7 @@ cp <%= file.file %> %{buildroot}<%= file.path %>
|
|
48
49
|
<% for link in links -%>
|
49
50
|
touch %{buildroot}<%= link.path %>
|
50
51
|
<% end -%>
|
52
|
+
<% end -%>
|
51
53
|
|
52
54
|
%files
|
53
55
|
<% for file in files -%>
|
data/lib/qrpm/template.yml
CHANGED
data/lib/qrpm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qrpm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Claus Rasmussen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shellopts
|
@@ -55,6 +55,7 @@ files:
|
|
55
55
|
- bin/setup
|
56
56
|
- clean
|
57
57
|
- cmd
|
58
|
+
- example.yml
|
58
59
|
- example/bin/a_file
|
59
60
|
- example/bin/another_file
|
60
61
|
- example/qrpm.yml
|