packo 0.0.1.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. data/bin/packo +78 -0
  2. data/bin/packo-base +24 -0
  3. data/bin/packo-build +24 -0
  4. data/bin/packo-db +24 -0
  5. data/bin/packo-env +24 -0
  6. data/bin/packo-files +24 -0
  7. data/bin/packo-profile +24 -0
  8. data/bin/packo-repository +24 -0
  9. data/bin/packo-select +24 -0
  10. data/lib/packo.rb +186 -0
  11. data/lib/packo/cli.rb +79 -0
  12. data/lib/packo/cli/base.rb +554 -0
  13. data/lib/packo/cli/build.rb +488 -0
  14. data/lib/packo/cli/database.rb +55 -0
  15. data/lib/packo/cli/database/definition.rb +65 -0
  16. data/lib/packo/cli/database/helpers.rb +20 -0
  17. data/lib/packo/cli/environment.rb +45 -0
  18. data/lib/packo/cli/files.rb +153 -0
  19. data/lib/packo/cli/profile.rb +31 -0
  20. data/lib/packo/cli/repository.rb +561 -0
  21. data/lib/packo/cli/repository/binary.rb +74 -0
  22. data/lib/packo/cli/repository/helpers.rb +20 -0
  23. data/lib/packo/cli/repository/repository.rb +48 -0
  24. data/lib/packo/cli/repository/source.rb +91 -0
  25. data/lib/packo/cli/repository/virtual.rb +53 -0
  26. data/lib/packo/cli/select.rb +61 -0
  27. data/lib/packo/do.rb +249 -0
  28. data/lib/packo/environment.rb +269 -0
  29. data/lib/packo/extensions.rb +70 -0
  30. data/lib/packo/flags.rb +64 -0
  31. data/lib/packo/host.rb +121 -0
  32. data/lib/packo/models.rb +171 -0
  33. data/lib/packo/models/installed_package.rb +190 -0
  34. data/lib/packo/models/installed_package/content.rb +50 -0
  35. data/lib/packo/models/installed_package/dependency.rb +39 -0
  36. data/lib/packo/models/repository.rb +209 -0
  37. data/lib/packo/models/repository/binary.rb +32 -0
  38. data/lib/packo/models/repository/binary/mirror.rb +35 -0
  39. data/lib/packo/models/repository/package.rb +73 -0
  40. data/lib/packo/models/repository/package/binary.rb +34 -0
  41. data/lib/packo/models/repository/package/binary/build.rb +36 -0
  42. data/lib/packo/models/repository/package/source.rb +36 -0
  43. data/lib/packo/models/repository/package/source/feature.rb +36 -0
  44. data/lib/packo/models/repository/package/source/flavor.rb +36 -0
  45. data/lib/packo/models/repository/package/virtual.rb +32 -0
  46. data/lib/packo/models/repository/source.rb +30 -0
  47. data/lib/packo/models/repository/virtual.rb +30 -0
  48. data/lib/packo/models/selector.rb +34 -0
  49. data/lib/packo/models/tag.rb +30 -0
  50. data/lib/packo/package.rb +239 -0
  51. data/lib/packo/package/blocker.rb +100 -0
  52. data/lib/packo/package/blockers.rb +40 -0
  53. data/lib/packo/package/dependencies.rb +40 -0
  54. data/lib/packo/package/dependency.rb +100 -0
  55. data/lib/packo/package/feature.rb +55 -0
  56. data/lib/packo/package/features.rb +105 -0
  57. data/lib/packo/package/flavor.rb +101 -0
  58. data/lib/packo/package/tags.rb +60 -0
  59. data/lib/packo/package/tags/expression.rb +130 -0
  60. data/lib/packo/package/tags/expression/group.rb +28 -0
  61. data/lib/packo/package/tags/expression/logic.rb +48 -0
  62. data/lib/packo/package/tags/expression/name.rb +28 -0
  63. data/lib/packo/profile.rb +174 -0
  64. data/lib/packo/rbuild.rb +22 -0
  65. data/lib/packo/rbuild/behaviors.rb +20 -0
  66. data/lib/packo/rbuild/behaviors/default.rb +27 -0
  67. data/lib/packo/rbuild/feature.rb +64 -0
  68. data/lib/packo/rbuild/features.rb +65 -0
  69. data/lib/packo/rbuild/flavor.rb +67 -0
  70. data/lib/packo/rbuild/module.rb +40 -0
  71. data/lib/packo/rbuild/modules.rb +27 -0
  72. data/lib/packo/rbuild/modules/building.rb +24 -0
  73. data/lib/packo/rbuild/modules/building/autotools.rb +315 -0
  74. data/lib/packo/rbuild/modules/building/cmake.rb +38 -0
  75. data/lib/packo/rbuild/modules/building/patch.rb +84 -0
  76. data/lib/packo/rbuild/modules/building/rake.rb +74 -0
  77. data/lib/packo/rbuild/modules/building/strip.rb +41 -0
  78. data/lib/packo/rbuild/modules/misc.rb +26 -0
  79. data/lib/packo/rbuild/modules/misc/fetcher.rb +177 -0
  80. data/lib/packo/rbuild/modules/misc/fetching.rb +22 -0
  81. data/lib/packo/rbuild/modules/misc/fetching/git.rb +57 -0
  82. data/lib/packo/rbuild/modules/misc/fetching/github.rb +31 -0
  83. data/lib/packo/rbuild/modules/misc/fetching/gnu.rb +59 -0
  84. data/lib/packo/rbuild/modules/misc/fetching/mercurial.rb +51 -0
  85. data/lib/packo/rbuild/modules/misc/fetching/sourceforge.rb +47 -0
  86. data/lib/packo/rbuild/modules/misc/fetching/subversion.rb +51 -0
  87. data/lib/packo/rbuild/modules/misc/fetching/wget.rb +57 -0
  88. data/lib/packo/rbuild/modules/misc/unpacker.rb +70 -0
  89. data/lib/packo/rbuild/modules/misc/unpacking.rb +23 -0
  90. data/lib/packo/rbuild/modules/misc/unpacking/lzma.rb +34 -0
  91. data/lib/packo/rbuild/modules/misc/unpacking/tar.rb +35 -0
  92. data/lib/packo/rbuild/modules/misc/unpacking/xz.rb +34 -0
  93. data/lib/packo/rbuild/modules/misc/unpacking/zip.rb +26 -0
  94. data/lib/packo/rbuild/modules/packaging.rb +20 -0
  95. data/lib/packo/rbuild/modules/packaging/pko.rb +78 -0
  96. data/lib/packo/rbuild/package.rb +281 -0
  97. data/lib/packo/rbuild/package/manifest.rb +169 -0
  98. data/lib/packo/rbuild/stages.rb +171 -0
  99. data/lib/packo/rbuild/stages/callbacks.rb +96 -0
  100. data/lib/packo/rbuild/stages/stage.rb +50 -0
  101. data/lib/packo/repository.rb +95 -0
  102. data/lib/packo/repository/binary.rb +116 -0
  103. data/lib/packo/repository/source.rb +77 -0
  104. data/lib/packo/repository/virtual.rb +66 -0
  105. data/lib/packo/system.rb +53 -0
  106. data/lib/packo/version.rb +26 -0
  107. metadata +276 -0
@@ -0,0 +1,38 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
3
+ #
4
+ # This file is part of packo.
5
+ #
6
+ # packo is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # packo 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 Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with packo. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module Packo; module RBuild; module Modules; module Building
21
+
22
+ class CMake < Module
23
+ def initialize (package)
24
+ super(package)
25
+
26
+ package.stages.add :generate, self.method(:generate), before: :configure
27
+ end
28
+
29
+ def finalize
30
+ package.stages.delete :generate, self.method(:generate)
31
+ end
32
+
33
+ def generate
34
+ Packo.sh 'cmake', package.cmake || 'CMakeLists.txt'
35
+ end
36
+ end
37
+
38
+ end; end; end; end
@@ -0,0 +1,84 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
3
+ #
4
+ # This file is part of packo.
5
+ #
6
+ # packo is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # packo 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 Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with packo. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module Packo; module RBuild; module Modules; module Building
21
+
22
+ class Patch < Module
23
+ def self.do (patch, options={})
24
+ return unless patch
25
+
26
+ begin
27
+ if patch.is_a?(FFFS::File) || options[:stream]
28
+ temp = Tempfile.new('patch')
29
+ temp.write patch.to_s
30
+ temp.flush
31
+
32
+ Packo.sh "patch -f -p#{options[:level] || 0} < '#{temp.path}'", silent: options[:silent]
33
+
34
+ temp.close(true)
35
+ else
36
+ Packo.sh "patch -f -p#{options[:level] || 0} < '#{patch}'", silent: options[:silent]
37
+ end
38
+ rescue Exception => e
39
+ Packo.debug e unless options[:silent]
40
+
41
+ return false
42
+ end
43
+
44
+ return true
45
+ end
46
+
47
+ def initialize (package)
48
+ super(package)
49
+
50
+ package.stages.add :patch, self.method(:patch), after: :fetch, priority: -1
51
+
52
+ before :initialize do |package|
53
+ package.define_singleton_method :patch, &Patch.method(:do)
54
+ end
55
+ end
56
+
57
+ def finalize
58
+ package.stages.delete :patch, self.method(:patch)
59
+ end
60
+
61
+ def patch
62
+ package.stages.callbacks(:patch).do(package) {
63
+ package.filesystem.patches.each {|name, file|
64
+ _patch(file)
65
+ }
66
+ }
67
+ end
68
+
69
+ private
70
+
71
+ def _patch (what)
72
+ if what.is_a?(FFFS::Directory)
73
+ what.sort.each {|(name, file)|
74
+ Do.cd(what.name) {
75
+ _patch(file)
76
+ }
77
+ }
78
+ else
79
+ package.patch(what) rescue nil
80
+ end
81
+ end
82
+ end
83
+
84
+ end; end; end; end
@@ -0,0 +1,74 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
3
+ #
4
+ # This file is part of packo.
5
+ #
6
+ # packo is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # packo 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 Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with packo. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module Packo; module RBuild; module Modules; module Building
21
+
22
+ class Rake < Module
23
+ def initialize (package)
24
+ super(package)
25
+
26
+ package.stages.add :compile, self.method(:compile), after: :fetch
27
+ package.stages.add :install, self.method(:install), after: :compile
28
+
29
+ package.before :build do
30
+ package.environment[:RUBYOPT] = ''
31
+ end
32
+
33
+ package.rake = Class.new(Module::Helper) {
34
+ def initialize (package)
35
+ super(package)
36
+ end
37
+
38
+ def do (*args)
39
+ package.environment.sandbox {
40
+ Packo.sh 'rake', *args
41
+ }
42
+ end
43
+
44
+ def install (*args)
45
+ package.environment.sandbox {
46
+ self.do 'install', *args
47
+ }
48
+ end
49
+
50
+ def version (name, slot=nil)
51
+ slot ? @versions[name.to_sym] = slot : @versions[name.to_sym]
52
+ end
53
+ }.new(package)
54
+ end
55
+
56
+ def finalize
57
+ package.stages.delete :compile, self.method(:compile)
58
+ package.stages.delete :install, self.method(:install)
59
+ end
60
+
61
+ def compile
62
+ package.stages.callbacks(:compile).do(@configuration) {
63
+ package.rake.do
64
+ }
65
+ end
66
+
67
+ def install
68
+ package.stages.callbacks(:install).do(@configuration) {
69
+ package.rake.install
70
+ }
71
+ end
72
+ end
73
+
74
+ end; end; end; end
@@ -0,0 +1,41 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
3
+ #
4
+ # This file is part of packo.
5
+ #
6
+ # packo is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # packo 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 Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with packo. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module Packo; module RBuild; module Modules; module Building
21
+
22
+ class Strip < Module
23
+ def initialize (package)
24
+ super(package)
25
+
26
+ package.stages.add :strip, self.method(:strip), before: :pack
27
+ end
28
+
29
+ def strip
30
+ package.stages.callbacks(:strip).do {
31
+ next if package.env[:NO_STRIP]
32
+
33
+ Find.find(package.distdir) {|file|
34
+ Packo.sh 'strip', file, silent: true rescue nil
35
+ }
36
+ }
37
+ end
38
+ end
39
+
40
+ end; end; end; end
41
+
@@ -0,0 +1,26 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
3
+ #
4
+ # This file is part of packo.
5
+ #
6
+ # packo is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # packo 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 Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with packo. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'packo/rbuild/modules/misc/fetcher'
21
+ require 'packo/rbuild/modules/misc/unpacker'
22
+
23
+ # Bleeding edge stuff
24
+ require 'packo/rbuild/modules/misc/fetching/git'
25
+ require 'packo/rbuild/modules/misc/fetching/mercurial'
26
+ require 'packo/rbuild/modules/misc/fetching/subversion'
@@ -0,0 +1,177 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
3
+ #
4
+ # This file is part of packo.
5
+ #
6
+ # packo is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # packo 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 Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with packo. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'uri'
21
+ require 'digest/sha1'
22
+
23
+ module Packo; module RBuild; module Modules; module Misc
24
+
25
+ class Fetcher < Module
26
+ @@wrappers = {}
27
+
28
+ def self.register (name, &block)
29
+ @@wrappers[name.to_sym] = block
30
+ end
31
+
32
+ def self.url (url, package)
33
+ whole, scheme, url = url.to_s.match(%r{^(.+?)://(.+)$}).to_a
34
+
35
+ raise ArgumentError.new('Invalid URI passed') unless whole
36
+
37
+ if ['https', 'http', 'ftp'].member?(scheme)
38
+ "#{scheme}://#{url.interpolate(package)}"
39
+ elsif @@wrappers[scheme.to_sym]
40
+ @@wrappers[scheme.to_sym].call(url, package)
41
+ else
42
+ raise ArgumentError.new('Scheme not supported')
43
+ end
44
+ end
45
+
46
+ def self.fetch (url, to)
47
+ if !System.env[:FETCHER]
48
+ raise RuntimeError.new('Set a FETCHER variable.')
49
+ end
50
+
51
+ Packo.sh System.env[:FETCHER].interpolate(OpenStruct.new(
52
+ source: Fetcher.url(url, self),
53
+ output: to
54
+ )).gsub('%o', to).gsub('%u', Fetcher.url(url, self)), silent: !System.env[:VERBOSE]
55
+ end
56
+
57
+ def self.filename (text)
58
+ return unless text
59
+
60
+ File.basename(text).sub(/\?.*$/, '')
61
+ end
62
+
63
+ def initialize (package)
64
+ super(package)
65
+
66
+ package.stages.add :fetch, self.method(:fetch), after: :beginning
67
+ package.stages.add :digest, self.method(:digest), after: :fetch, strict: true
68
+
69
+ after :initialize do |result, package|
70
+ package.define_singleton_method :fetch, &Fetcher.method(:fetch)
71
+ end
72
+ end
73
+
74
+ def finalize
75
+ package.stages.delete :fetch, self.method(:fetch)
76
+ package.stages.delete :digest, self.method(:digest)
77
+ end
78
+
79
+ def url (text)
80
+ text.interpolate(package)
81
+ end
82
+
83
+ def filename (text)
84
+ Fetcher.filename(url(text))
85
+ end
86
+
87
+ def fetch
88
+ if package.source.is_a?(Hash)
89
+ package.distfiles = {}
90
+
91
+ sources = Hash[package.source.map {|(name, source)|
92
+ next if package.digests[url(source)] && (Do.digest("#{package.fetchdir}/#{package.digests[url(source)].name}") rescue false) == package.digests[url(source)].digest
93
+
94
+ url = Fetcher.url(source, package) or fail "Failed to get the real URL for: #{source}"
95
+
96
+ [name, (
97
+ if url.is_a?(Array) && url.length == 2
98
+ url + [source]
99
+ else
100
+ ([url] + [nil, source]).flatten
101
+ end
102
+ )]
103
+ }.compact]
104
+
105
+ package.stages.callbacks(:fetch).do(sources) {
106
+ sources.each {|name, (source, output, original)|
107
+ package.distfiles[name] = OpenStruct.new(
108
+ path: "#{package.fetchdir}/#{output || filename(source)}",
109
+ url: url(original)
110
+ )
111
+
112
+ package.fetch source, package.distfiles[name].path
113
+ }
114
+
115
+ package.source.each {|name, source|
116
+ next if package.distfiles[name]
117
+
118
+ package.distfiles[name] = OpenStruct.new(
119
+ path: "#{package.fetchdir}/#{package.digests[url(source)].name}",
120
+ url: url(source)
121
+ )
122
+ }
123
+ }
124
+ else
125
+ package.distfiles = []
126
+
127
+ sources = [package.source].flatten.compact.map {|source|
128
+ next if package.digests[url(source)] && (Do.digest("#{package.fetchdir}/#{package.digests[url(source)].name}") rescue false) == package.digests[url(source)].digest
129
+
130
+ url = Fetcher.url(source, package) or fail "Failed to get the real URL for: #{source}"
131
+
132
+ if url.is_a?(Array) && url.length == 2
133
+ url + [source]
134
+ else
135
+ ([url] + [nil, source]).flatten
136
+ end
137
+ }.compact
138
+
139
+ package.stages.callbacks(:fetch).do(sources) {
140
+ sources.each {|(source, output, original)|
141
+ package.distfiles << OpenStruct.new(
142
+ path: "#{package.fetchdir}/#{output || filename(source)}",
143
+ url: url(original)
144
+ )
145
+
146
+ package.fetch source, package.distfiles.last.path
147
+ }
148
+
149
+ [package.source].flatten.compact.select {|source|
150
+ !!package.digests[url(source)]
151
+ }.each {|source|
152
+ package.distfiles << OpenStruct.new(
153
+ path: "#{package.fetchdir}/#{package.digests[url(source)].name}",
154
+ url: url(source)
155
+ )
156
+ }
157
+ }
158
+ end
159
+ end
160
+
161
+ def digest
162
+ package.stages.callbacks(:digest).do(package.distfiles) {
163
+ package.distfiles.each {|name, file|
164
+ file ||= name
165
+
166
+ original = package.digests[file.url].digest or next
167
+ digest = Do.digest(file.path) or next
168
+
169
+ if digest != original
170
+ raise ArgumentError.new("#{File.basename(file.path)} digest is #{digest} but should be #{original}")
171
+ end
172
+ }
173
+ }
174
+ end
175
+ end
176
+
177
+ end; end; end; end