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,101 @@
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/package/feature'
21
+
22
+ module Packo; class Package
23
+
24
+ class Flavor
25
+ def self.parse (text)
26
+ data = []
27
+
28
+ text.split(/\s+/).each {|part|
29
+ data << Feature.parse(part)
30
+ }
31
+
32
+ Flavor.new(data)
33
+ end
34
+
35
+ def initialize (values={})
36
+ @values = {}
37
+
38
+ if values.is_a?(Array)
39
+ values.dup.each {|feature|
40
+ @values[feature.name] = feature
41
+ }
42
+ elsif values.is_a?(Hash)
43
+ values.dup.each {|name, value|
44
+ @values[name.to_sym] = Feature.new(name, value || false)
45
+ }
46
+ end
47
+ end
48
+
49
+ def each
50
+ @values.dup.each_value {|feature|
51
+ yield feature
52
+ }
53
+ end
54
+
55
+ def empty?
56
+ @values.empty?
57
+ end
58
+
59
+ def set (name, value)
60
+ @values[name.to_sym] = Feature.new(name, value)
61
+ end
62
+
63
+ def get (name)
64
+ @values[name.to_sym] ||= Feature.new(name, false)
65
+ end
66
+
67
+ def delete (name)
68
+ @values.delete(name.to_sym)
69
+ end
70
+
71
+ def has? (name)
72
+ @values.key? name.to_sym
73
+ end
74
+
75
+ def to_hash
76
+ Hash[*@values.map {|(name, element)|
77
+ [name, element.value]
78
+ }]
79
+ end
80
+
81
+ def to_a
82
+ @values.map {|(name, element)|
83
+ element
84
+ }
85
+ end
86
+
87
+ def to_s (type=:normal)
88
+ values = @values.map {|(name, value)|
89
+ next unless name != :binary && value.enabled?
90
+
91
+ name.to_s
92
+ }.compact
93
+
94
+ case type
95
+ when :normal; values.join(' ')
96
+ when :package; values.join('.')
97
+ end
98
+ end
99
+ end
100
+
101
+ end; end
@@ -0,0 +1,60 @@
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 'digest/sha1'
21
+
22
+ require 'packo/package/tags/expression'
23
+
24
+ module Packo; class Package
25
+
26
+ class Tags < Array
27
+ def self.parse (value)
28
+ Tags.new(value.is_a?(Array) ? value : Tags.new(value.to_s.split(%r{/|\s+})))
29
+ end
30
+
31
+ def initialize (*tags)
32
+ tags.flatten.compact.each {|tag|
33
+ self << tag.to_s.strip.downcase
34
+ }
35
+
36
+ reject! {|tag|
37
+ tag.empty?
38
+ }
39
+ end
40
+
41
+ def == (tags)
42
+ self.to_a.sort == Tags.parse(tags).to_a.sort
43
+ end
44
+
45
+ def hashed
46
+ Digest::SHA1.hexdigest(self.sort.join('/'))
47
+ end
48
+
49
+ def hash
50
+ self.sort.join('/').hash
51
+ end
52
+
53
+ def to_s (minimized=false)
54
+ minimized ?
55
+ self.sort.map {|t| t[0]}.join :
56
+ self.join('/')
57
+ end
58
+ end
59
+
60
+ end; end
@@ -0,0 +1,130 @@
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/package/tags/expression/name'
21
+ require 'packo/package/tags/expression/logic'
22
+ require 'packo/package/tags/expression/group'
23
+
24
+ require 'stringio'
25
+
26
+ module Packo; class Package; class Tags < Array
27
+
28
+ class Expression
29
+ def self.parse (text)
30
+ base = Group.new
31
+ name = nil
32
+ stack = [base]
33
+ logic = nil
34
+
35
+ text.to_s.each_char.to_a.each_with_index {|char, index|
36
+ begin
37
+ if char == ')' && stack.length == 1
38
+ raise SyntaxError.new('Closing an unopened parenthesis')
39
+ end
40
+
41
+ if char.match(/\s|\(|\)/) || (!logic && ['|', '&', '!'].member?(char))
42
+ if logic || (name && name.match(/(and|or|not)/i))
43
+ stack.last << Logic.new(logic || name)
44
+ logic = nil
45
+ name = nil
46
+ elsif name
47
+ stack.last << Name.new(name)
48
+ name = nil
49
+ end
50
+ end
51
+
52
+ if name || logic
53
+ name << char if name
54
+ logic << char if logic
55
+ else
56
+ case char
57
+ when '('; stack.push Group.new
58
+ when ')'; stack[-2] << stack.pop
59
+ when '|'; logic = '|'
60
+ when '&'; logic = '&'
61
+ when '!'; stack.last << Logic.new('!')
62
+ else; name = char if !char.match(/\s/)
63
+ end
64
+ end
65
+ rescue SyntaxError => e
66
+ raise "#{e.message} near `#{text[index - 4, 8]}` at character #{index}"
67
+ end
68
+ }
69
+
70
+ if stack.length != 1
71
+ raise SyntaxError.new('Not all parenthesis are closed')
72
+ end
73
+
74
+ if logic
75
+ raise SyntaxError.new('The expression cannot end with a logic operator')
76
+ end
77
+
78
+ base << Name.new(name) if name
79
+
80
+ Expression.new(base)
81
+ end
82
+
83
+ attr_reader :base
84
+
85
+ def initialize (base=Group.new)
86
+ @base = base
87
+ end
88
+
89
+ def evaluate (package)
90
+ _evaluate(@base, package.is_a?(Array) ? package : package.tags.to_a)
91
+ end
92
+
93
+ private
94
+
95
+ def _evaluate (group, tags)
96
+ values = []
97
+
98
+ group.each {|thing|
99
+ case thing
100
+ when Logic; values << thing
101
+ when Group; values << _evaluate(thing, tags)
102
+ when Name; values << tags.member?(thing)
103
+ end
104
+ }
105
+
106
+ at = 0
107
+ while at < values.length
108
+ if values[at].is_a?(Logic) && values[at].type == :not
109
+ values.delete_at(at)
110
+ values[at] = !values[at]
111
+ end
112
+
113
+ at += 1
114
+ end
115
+
116
+ while values.length > 1
117
+ if values.first.is_a?(Logic) && values.first.type == :not
118
+ values.shift
119
+ values.first = !values.first
120
+ else
121
+ a, logic, b = values.shift(3)
122
+ values.unshift(logic.evaluate(a, b))
123
+ end
124
+ end
125
+
126
+ return values.pop
127
+ end
128
+ end
129
+
130
+ end; end; end
@@ -0,0 +1,28 @@
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; class Package; class Tags < Array; class Expression
21
+
22
+ class Group < Array
23
+ def inspect
24
+ '(' + self.map {|e| e.inspect}.join(' ') + ')'
25
+ end
26
+ end
27
+
28
+ end; end; end; end
@@ -0,0 +1,48 @@
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; class Package; class Tags < Array; class Expression
21
+
22
+ class Logic
23
+ attr_reader :type
24
+
25
+ def initialize (what)
26
+ @type = case what
27
+ when '!', /not/i then :not
28
+ when '&&', /and/i then :and
29
+ when '||', /or/i then :or
30
+ end
31
+
32
+ raise SyntaxError.new('Invalid logical operator') unless @type
33
+ end
34
+
35
+ def evaluate (a, b=nil)
36
+ case @type
37
+ when :not; !a
38
+ when :and; !!(a && b)
39
+ when :or; !!(a || b)
40
+ end
41
+ end
42
+
43
+ def inspect
44
+ self.type.to_s.upcase
45
+ end
46
+ end
47
+
48
+ end; end; end; end
@@ -0,0 +1,28 @@
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; class Package; class Tags < Array; class Expression
21
+
22
+ class Name < String
23
+ def inspect
24
+ self.to_s.downcase
25
+ end
26
+ end
27
+
28
+ end; end; end; end
@@ -0,0 +1,174 @@
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
21
+
22
+ class Profile
23
+ def self.path (path)
24
+ return unless File.directory?(path)
25
+
26
+ Profile.new(
27
+ config: "#{path}/config",
28
+ tags: "#{path}/tags",
29
+ packages: "#{path}/packages",
30
+ modules: "#{path}/modules",
31
+ mask: "#{path}/mask",
32
+ unmask: "#{path}/unmask",
33
+ )
34
+ end
35
+
36
+ attr_reader :paths
37
+
38
+ def initialize (paths={})
39
+ @paths = paths
40
+
41
+ if !@paths.is_a?(Hash)
42
+ @paths = @paths.to_hash rescue {}
43
+ end
44
+
45
+ @paths.delete_if {|_, path|
46
+ !File.file?(path) || !File.readable?(path)
47
+ }
48
+
49
+ @paths.dup.each {|name, path|
50
+ @paths[name] = Pathname.new(path)
51
+ }
52
+ end
53
+
54
+ def method_missing (id, *args)
55
+ id = id.to_s.sub(/[=?]$/, '').to_sym
56
+
57
+ if args.length == 0
58
+ return @paths[id]
59
+ else
60
+ if respond_to? "#{id}="
61
+ send "#{id}=", *args
62
+ else
63
+ @paths[id] = Pathname.new(args.first)
64
+ end
65
+ end
66
+ end
67
+
68
+ def apply! (environment, package=nil)
69
+ mod = ::Module.new
70
+
71
+ begin
72
+ suppress_warnings {
73
+ mod.module_eval File.read(config)
74
+ } if File.readable?(config.to_s)
75
+ rescue Exception => e
76
+ Packo.debug e
77
+ end
78
+
79
+ if package
80
+ if File.directory?(modules.to_s)
81
+ Dir.glob("#{modules}/*").each {|script|
82
+ package.instance_exec(package, File.read(script)) if File.readable?(script)
83
+ }
84
+ end
85
+
86
+ if File.readable?(tags.to_s)
87
+ file = File.read(tags)
88
+ tags = {}
89
+ values = file.split(/^\s*\[.*?\]\s*$/); values.shift
90
+
91
+ file.scan(/^\s*\[(.*?)\]\s*$/).flatten.each_with_index {|name, index|
92
+ tags[name] = values[index]
93
+ }
94
+
95
+ tags.each {|expr, value|
96
+ next unless Packo::Package::Tags::Expression.parse(expr).evaluate(package) rescue false
97
+
98
+ begin
99
+ suppress_warnings {
100
+ mod.module_eval value
101
+ }
102
+ rescue Exception => e
103
+ Packo.debug e
104
+ end
105
+ }
106
+ end
107
+
108
+ if File.readable?(packages.to_s)
109
+ file = File.read(packages)
110
+ packages = {}
111
+ values = file.split(/^\s*\[.*?\]\s*$/); values.shift
112
+
113
+ file.scan(/^\s*\[(.*?)\]\s*$/).flatten.each_with_index {|name, index|
114
+ packages[name] = values[index]
115
+ }
116
+
117
+ packages.each {|name, value|
118
+ next unless Packo::Package::Dependency.parse(name).in?(package) rescue false
119
+
120
+ begin
121
+ suppress_warnings {
122
+ mod.module_eval value
123
+ }
124
+ rescue Exception => e
125
+ Packo.debug e
126
+ end
127
+ }
128
+ end
129
+
130
+ if File.readable?(mask.to_s)
131
+ File.read(mask).lines.each {|line|
132
+ line.strip!
133
+
134
+ if line.start_with?('[') && line.end_with?(']')
135
+ if Packo::Package::Tags::Expression.parse(line[1, line.length - 2]).evaluate(package)
136
+ package.mask!
137
+ end
138
+ else
139
+ if Packo::Package::Dependency.parse(line).in?(package)
140
+ package.mask!
141
+ end
142
+ end
143
+ }
144
+ end
145
+
146
+ if File.readable?(unmask.to_s)
147
+ File.read(unmask).lines.each {|line|
148
+ line.strip!
149
+
150
+ if line.start_with?('[') && line.end_with?(']')
151
+ if Packo::Package::Tags::Expression.parse(line[1, line.length - 2]).evaluate(package)
152
+ package.unmask!
153
+ end
154
+ else
155
+ if Packo::Package::Dependency.parse(line).in?(package)
156
+ package.unmask!
157
+ end
158
+ end
159
+ }
160
+ end
161
+
162
+ end
163
+
164
+ mod.constants.each {|const|
165
+ environment[const] = mod.const_get const
166
+ }
167
+ end
168
+
169
+ def hash
170
+ @paths.hash
171
+ end
172
+ end
173
+
174
+ end