slack-utils 0.6.2 → 0.7

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.
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  # Copyright 2010,2011 Vincent Batts, Vienna, VA
2
4
  # All rights reserved.
3
5
  #
@@ -19,12 +21,12 @@
19
21
  # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
20
22
 
21
23
  module Slackware
22
- class PackageBundle < Package
24
+ class PackageBundle < Package
23
25
  attr_accessor :archive
24
26
 
25
- def initialize(name = nil)
26
- super
27
- end
27
+ def initialize(name = nil)
28
+ super
29
+ end
28
30
 
29
31
  def parse(name)
30
32
  super(name)
@@ -37,49 +39,50 @@ module Slackware
37
39
  end
38
40
  end
39
41
 
40
- def get_file_list
42
+ def get_file_list
41
43
  pkg = "%s/%s.%s" % [self.path, self.fullname, self.archive]
42
44
  return nil unless File.exist?(pkg)
43
45
 
44
- e_flag = ""
45
- if pkg =~ /txz$/
46
- e_flag = "J"
47
- elsif pkg =~ /tgz$/
48
- e_flag = "z"
49
- elsif pkg =~ /tbz$/
50
- e_flag = "j"
51
- end
52
- IO.popen("tar #{e_flag}wtf #{pkg}") {|f|
53
- f.readlines.map {|l| l.chomp }
54
- }
55
- end
46
+ e_flag = ""
47
+ if pkg =~ /txz$/
48
+ e_flag = "J"
49
+ elsif pkg =~ /tgz$/
50
+ e_flag = "z"
51
+ elsif pkg =~ /tbz$/
52
+ e_flag = "j"
53
+ end
54
+ IO.popen("tar #{e_flag}wtf #{pkg}") {|f|
55
+ f.readlines.map {|l| l.chomp }
56
+ }
57
+ end
56
58
 
57
- def read_file(file)
59
+ def read_file(file)
58
60
  pkg = "%s/%s.%s" % [self.path, self.fullname, self.archive]
59
61
  return nil unless File.exist?(pkg)
60
62
 
61
- e_flag = ""
62
- if pkg =~ /txz$/
63
- e_flag = "J"
64
- elsif pkg =~ /tgz$/
65
- e_flag = "z"
66
- elsif pkg =~ /tbz$/
67
- e_flag = "j"
68
- end
69
- IO.popen("tar #{e_flag}xOf #{pkg} #{file}") {|f| f.read }
70
- end
63
+ e_flag = ""
64
+ if pkg =~ /txz$/
65
+ e_flag = "J"
66
+ elsif pkg =~ /tgz$/
67
+ e_flag = "z"
68
+ elsif pkg =~ /tbz$/
69
+ e_flag = "j"
70
+ end
71
+ IO.popen("tar #{e_flag}xOf #{pkg} #{file}") {|f| f.read }
72
+ end
71
73
 
72
- def inspect
73
- "#<%s:0x%x name=%s version=%s arch=%s build=%s tag=%s archive=%s>" % [
74
- self.class.name,
75
- self.object_id,
76
- self.name.inspect,
77
- self.version.inspect,
78
- self.arch.inspect,
79
- self.build,
80
- self.tag.inspect,
74
+ def inspect
75
+ "#<%s:0x%x name=%s version=%s arch=%s build=%s tag=%s archive=%s>" % [
76
+ self.class.name,
77
+ self.object_id,
78
+ self.name.inspect,
79
+ self.version.inspect,
80
+ self.arch.inspect,
81
+ self.build,
82
+ self.tag.inspect,
81
83
  self.archive.inspect
82
- ]
83
- end
84
- end
84
+ ]
85
+ end
86
+ end
85
87
  end
88
+ # vim : set sw=2 sts=2 et :
@@ -0,0 +1,57 @@
1
+ # Copyright 2010,2011,2012 Vincent Batts, Vienna, VA
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use of this source, with or without modification, is
5
+ # permitted provided that the following conditions are met:
6
+ #
7
+ # 1. Redistributions of this source must retain the above copyright
8
+ # notice, this list of conditions and the following disclaimer.
9
+ #
10
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
11
+ # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
12
+ # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
13
+ # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
14
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
15
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
16
+ # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
17
+ # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
18
+ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
19
+ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
20
+
21
+ module Slackware
22
+ module Paths
23
+ INSTALLED_PACKAGES = "/var/log/packages"
24
+ REMOVED_PACKAGES = "/var/log/removed_packages"
25
+ INSTALLED_SCRIPTS = "/var/log/scripts"
26
+ REMOVED_SCRIPTS = "/var/log/removed_scripts"
27
+ VERSION_FILE = "/etc/slackware-version"
28
+
29
+ # A helper to return the ROOT directory of the system in question.
30
+ # Like pkgtools, if the environment has "ROOT" set, use it, otherwise "/"
31
+ def self::root_dir()
32
+ return ENV["ROOT"] ? ENV["ROOT"] : "/"
33
+ end
34
+
35
+ def self::installed_packages(*args)
36
+ return File.join(root_dir, INSTALLED_PACKAGES, args)
37
+ end
38
+
39
+ def self::removed_packages(*args)
40
+ return File.join(root_dir, REMOVED_PACKAGES, args)
41
+ end
42
+
43
+ def self::installed_scripts(*args)
44
+ return File.join(root_dir, INSTALLED_SCRIPTS, args)
45
+ end
46
+
47
+ def self::removed_scripts(*args)
48
+ return File.join(root_dir, REMOVED_SCRIPTS, args)
49
+ end
50
+
51
+ def self::slackware_version()
52
+ return File.join(root_dir, VERSION_FILE)
53
+ end
54
+ end # module Paths
55
+ end # module Slackware
56
+
57
+ # vim : set sw=2 sts=2 et :
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  # Copyright 2010,2011 Vincent Batts, Vienna, VA
2
4
  # All rights reserved.
3
5
  #
@@ -19,144 +21,147 @@
19
21
  # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
20
22
 
21
23
  require 'slackware/package'
24
+ require 'slackware/log'
22
25
  require 'slackware/changelog'
23
26
  require 'slackware/system'
27
+
24
28
  require 'net/http'
25
29
  require 'net/ftp'
26
30
  require 'rbconfig'
27
31
 
28
32
  module Slackware
29
33
 
30
- # Stub
31
- class Repo
32
- RE_PACKAGE_NAME = Regexp.new(/^PACKAGE NAME:\s+(.*)\.t[gbx]z\s*/)
33
- RE_PACKAGE_LOCATION = Regexp.new(/^PACKAGE LOCATION:\s+(.*)$/)
34
- RE_COMPRESSED_SIZE = Regexp.new(/^PACKAGE SIZE \(compressed\):\s+(.*)$/)
35
- RE_UNCOMPRESSED_SIZE = Regexp.new(/^PACKAGE SIZE \(uncompressed\):\s+(.*)$/)
36
-
37
- attr_accessor :proto, :mirror, :path, :version, :arch, :changelog, :packages
38
-
39
- def initialize(repo = nil)
40
- @packages = nil
41
- if (repo.nil?)
42
- self.proto = "ftp://"
43
- self.mirror = "ftp.osuosl.org"
44
- self.path = "/pub/slackware/"
45
- self.version = begin
46
- v = Slackware::System.version
47
- if v =~ /(\d+)\.(\d+)\.\d+/
48
- v = $1 + "." + $2
49
- end
50
- v
51
- end
52
- self.arch = begin
53
- a = RbConfig::CONFIG["arch"]
54
- if a =~ /x86_64/
55
- a = "64"
56
- else
57
- a = ""
58
- end
59
- a
60
- end
61
- else
62
- ## TODO do some hot parsing of 'repo'
63
- end
64
- end
65
-
66
- def fetch(file = nil)
67
- #if file.nil?
68
- #url = URI.parse(self.proto + self.mirror + self.path)
69
- #else
70
- #url = URI.parse(self.proto + self.mirror + self.path + file)
71
- #end
72
- if self.proto =~ /ftp/
73
- ftp = Net::FTP.open(self.mirror)
74
- ftp.login
75
- ftp.chdir(self.path + "slackware" + self.arch + "-" + self.version)
76
- if (file.nil?)
77
- data = ftp.list('*')
78
- else
79
- data = ftp.get(file, nil)
80
- end
81
- ftp.close
82
- return data
83
- elsif self.proto =~ /http/
84
- # XXX this is not working yet
85
- req = Net::HTTP::Get.new(url.path)
86
- res = Net::HTTP.start(url.host, url.port) {|http| http.request(req) }
87
- return res
88
- elsif self.proto =~ /file/
89
- if (file.nil?)
90
- return Dir.glob(self.path + "slackware" + self.arch + "-" + self.version + "/*")
91
- else
92
- return File.read(self.path + "slackware" + self.arch + "-" + self.version + "/" + file)
93
- end
94
- else
95
- return nil
96
- end
97
- end
98
-
99
- # Pkg count that _should_ be removed
100
- # pkgs = Slackware::System.installed_packages
101
- # sr = Slackware::Repo.new
102
- # sr.version = "current"
103
- # c = get_changelog
104
- #(pkgs.map {|p| p.fullname } & c[:removed].map {|p| p.fullname }).count
105
- def get_changelog
106
- if (@changelog.nil?)
107
- changelog = {}
108
- changelog_data = fetch("ChangeLog.txt")
109
- return changelog
110
- else
111
- return @changelog
112
- end
113
- end
114
-
115
- def set_changelog
116
- @changelog = get_changelog
117
- return nil
118
- end
119
-
120
- def get_packages
121
- if (@packages.nil?)
122
- pkgs = []
123
- fetch("PACKAGES.TXT").split(/\n\n/).each {|p_block|
124
- p_block = p_block.split(/\n/).reject {|cell| cell if cell == "" }
125
- if (p_block.shift =~ RE_PACKAGE_NAME)
126
- pkg = Slackware::Package.parse($1)
127
-
128
- p_block.shift =~ RE_PACKAGE_LOCATION
129
- pkg.package_location = $1
130
-
131
- p_block.shift =~ RE_COMPRESSED_SIZE
132
- pkg.compressed_size = $1
133
-
134
- p_block.shift =~ RE_UNCOMPRESSED_SIZE
135
- pkg.uncompressed_size = $1
136
-
137
- # This is the empty PACKAGE DESCRIPTON: tag
138
- p_block.shift
139
-
140
- pkg.package_description = p_block.map {|cell|
141
- cell.sub(/^#{pkg.name}:\s*/, '')
142
- }
143
-
144
- pkgs << pkg
145
- end
146
- }
147
- return pkgs
148
- else
149
- return @packages
150
- end
151
- end
152
-
153
- def set_packages
154
- @packages = get_packages
155
- return @packages.count
156
- end
157
-
158
- end
34
+ # Stub
35
+ class Repo
36
+ RE_PACKAGE_NAME = /^PACKAGE NAME:\s+(.*)\.t[gbx]z\s*/
37
+ RE_PACKAGE_LOCATION = /^PACKAGE LOCATION:\s+(.*)$/
38
+ RE_COMPRESSED_SIZE = /^PACKAGE SIZE \(compressed\):\s+(.*)$/
39
+ RE_UNCOMPRESSED_SIZE = /^PACKAGE SIZE \(uncompressed\):\s+(.*)$/
40
+
41
+ attr_accessor :proto, :mirror, :path, :version, :arch, :changelog, :packages
42
+
43
+ def initialize(repo = nil)
44
+ @packages = nil
45
+ if (repo.nil?)
46
+ self.proto = "ftp://"
47
+ self.mirror = "ftp.osuosl.org"
48
+ self.path = "/pub/slackware/"
49
+ self.version = begin
50
+ v = Slackware::System.version
51
+ if v =~ /(\d+)\.(\d+)\.\d+/
52
+ v = $1 + "." + $2
53
+ end
54
+ v
55
+ end
56
+ self.arch = begin
57
+ a = RbConfig::CONFIG["arch"]
58
+ if a =~ /x86_64/
59
+ a = "64"
60
+ else
61
+ a = ""
62
+ end
63
+ a
64
+ end
65
+ else
66
+ ## TODO do some hot parsing of 'repo'
67
+ end
68
+ end
69
+
70
+ def fetch(file = nil)
71
+ #if file.nil?
72
+ #url = URI.parse(self.proto + self.mirror + self.path)
73
+ #else
74
+ #url = URI.parse(self.proto + self.mirror + self.path + file)
75
+ #end
76
+ if self.proto =~ /ftp/
77
+ ftp = Net::FTP.open(self.mirror)
78
+ ftp.login
79
+ ftp.chdir(self.path + "slackware" + self.arch + "-" + self.version)
80
+ if (file.nil?)
81
+ data = ftp.list('*')
82
+ else
83
+ data = ftp.get(file, nil)
84
+ end
85
+ ftp.close
86
+ return data
87
+ elsif self.proto =~ /http/
88
+ # XXX this is not working yet
89
+ req = Net::HTTP::Get.new(url.path)
90
+ res = Net::HTTP.start(url.host, url.port) {|http| http.request(req) }
91
+ return res
92
+ elsif self.proto =~ /file/
93
+ if (file.nil?)
94
+ return Dir.glob(self.path + "slackware" + self.arch + "-" + self.version + "/*")
95
+ else
96
+ return File.read(self.path + "slackware" + self.arch + "-" + self.version + "/" + file)
97
+ end
98
+ else
99
+ return nil
100
+ end
101
+ end
102
+
103
+ # Pkg count that _should_ be removed
104
+ # pkgs = Slackware::System.installed_packages
105
+ # sr = Slackware::Repo.new
106
+ # sr.version = "current"
107
+ # c = get_changelog
108
+ #(pkgs.map {|p| p.fullname } & c[:removed].map {|p| p.fullname }).count
109
+ def get_changelog
110
+ if (@changelog.nil?)
111
+ changelog = {}
112
+ changelog_data = fetch("ChangeLog.txt")
113
+ return changelog
114
+ else
115
+ return @changelog
116
+ end
117
+ end
118
+
119
+ def set_changelog
120
+ @changelog = get_changelog
121
+ return nil
122
+ end
123
+
124
+ def get_packages
125
+ if (@packages.nil?)
126
+ pkgs = []
127
+ fetch("PACKAGES.TXT").split(/\n\n/).each {|p_block|
128
+ p_block = p_block.split(/\n/).reject {|cell| cell if cell == "" }
129
+ if (p_block.shift =~ RE_PACKAGE_NAME)
130
+ pkg = Slackware::Package.parse($1)
131
+
132
+ p_block.shift =~ RE_PACKAGE_LOCATION
133
+ pkg.package_location = $1
134
+
135
+ p_block.shift =~ RE_COMPRESSED_SIZE
136
+ pkg.compressed_size = $1
137
+
138
+ p_block.shift =~ RE_UNCOMPRESSED_SIZE
139
+ pkg.uncompressed_size = $1
140
+
141
+ # This is the empty PACKAGE DESCRIPTON: tag
142
+ p_block.shift
143
+
144
+ pkg.package_description = p_block.map {|cell|
145
+ cell.sub(/^#{pkg.name}:\s*/, '')
146
+ }
147
+
148
+ pkgs << pkg
149
+ end
150
+ }
151
+ return pkgs
152
+ else
153
+ return @packages
154
+ end
155
+ end
156
+
157
+ def set_packages
158
+ @packages = get_packages
159
+ return @packages.count
160
+ end
161
+
162
+ end
159
163
 
160
164
 
161
165
  end
162
166
 
167
+ # vim : set sw=2 sts=2 et :
@@ -1,4 +1,6 @@
1
- # Copyright 2010,2011 Vincent Batts, Vienna, VA
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2010,2011,2012 Vincent Batts, Vienna, VA
2
4
  # All rights reserved.
3
5
  #
4
6
  # Redistribution and use of this source, with or without modification, is
@@ -19,161 +21,185 @@
19
21
  # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
20
22
 
21
23
  require 'slackware/version'
24
+ require 'slackware/paths'
22
25
  require 'slackware/package'
26
+ require 'slackware/log'
23
27
 
24
28
  module Slackware
25
- DIR_INSTALLED_PACKAGES = "/var/log/packages"
26
- DIR_REMOVED_PACKAGES = "/var/log/removed_packages"
27
- DIR_INSTALLED_SCRIPTS = "/var/log/scripts"
28
- DIR_REMOVED_SCRIPTS = "/var/log/removed_scripts"
29
- RE_REMOVED_NAMES = /^(.*)-upgraded-(\d{4}-\d{2}-\d{2}),(\d{2}:\d{2}:\d{2})$/
30
- RE_BUILD_TAG = /^([[:digit:]]+)([[:alpha:]]+)$/
31
-
32
- class System
33
- def self::installed_packages
34
- return Dir.glob(DIR_INSTALLED_PACKAGES + "/*").sort.map {|p| Slackware::Package.parse(p) }
35
- end
36
-
37
- def self::removed_packages
38
- return Dir.glob(DIR_REMOVED_PACKAGES + "/*").sort.map {|p| Slackware::Package.parse(p) }
39
- end
40
-
41
- def self::installed_scripts
42
- return Dir.glob(DIR_INSTALLED_SCRIPTS + "/*").sort.map {|s| Script.parse(s) }
43
- end
44
-
45
- def self::removed_scripts
46
- return Dir.glob(DIR_REMOVED_SCRIPTS + "/*").sort.map {|s| Script.parse(s) }
47
- end
48
-
49
- def self::tags_used
50
- pkgs = installed_packages
51
- set = []
52
- pkgs.map {|p| p.tag }.uniq.each {|tag|
53
- m_set = {}
54
- m_set[:tag] = tag
55
- m_set[:count] = pkgs.map {|p| p if p.tag == tag }.compact.count
56
- set << m_set
57
- }
58
- return set
59
- end
60
-
61
- def self::with_tag(tag)
62
- return installed_packages.map {|pkg| pkg if pkg.tag == tag }.compact
63
- end
64
-
65
- def self::arch_used
66
- return installed_packages.map {|p| p.arch }.uniq.compact
67
- end
68
-
69
- def self::with_arch(arch)
70
- return installed_packages.map {|pkg| pkg if pkg.arch == arch }.compact
71
- end
72
-
73
- def self::find_installed(name)
74
- d = Dir.new(DIR_INSTALLED_PACKAGES)
75
- return d.map {|p| Package.parse(p) if p.include?(name) }.compact
76
- end
77
-
78
- def self::find_removed(name)
79
- d = Dir.new(DIR_REMOVED_PACKAGES)
80
- return d.map {|p| Package.parse(p) if p.include?(name) }.compact
81
- end
82
-
83
- def self::upgrades(pkg)
84
- if (m = find_removed(pkg).map {|p| p if (p.name == pkg) }.compact )
85
- return m
86
- else
87
- return nil
88
- end
89
- end
90
-
91
- # Return an Array of packages, that were installed after provided +time+
92
- def self::installed_after(time)
93
- arr = []
94
- di = Dir.new(DIR_INSTALLED_PACKAGES)
95
- di.each {|p|
96
- if (File.mtime(DIR_INSTALLED_PACKAGES + "/" + p) >= time)
97
- pkg = Package.parse(p)
98
- pkg.get_time
99
- arr << pkg
100
- end
101
- }
102
- return arr
103
- end
104
-
105
- # Return an Array of packages, that were installed before provided +time+
106
- def self::installed_before(time)
107
- arr = []
108
- di = Dir.new(DIR_INSTALLED_PACKAGES)
109
- di.each {|p|
110
- if (File.mtime(DIR_INSTALLED_PACKAGES + "/" + p) <= time)
111
- pkg = Package.parse(p)
112
- pkg.get_time
113
- arr << pkg
114
- end
115
- }
116
- return arr
117
- end
118
-
119
- # Return an Array of packages, that were removed after provided +time+
120
- def self::removed_after(time)
121
- arr = []
122
- dr = Dir.new(DIR_REMOVED_PACKAGES)
123
- dr.each {|p|
124
- if (DIR_INSTALLED_PACKAGES + "/" + p =~ RE_REMOVED_NAMES)
125
- if (Time.strptime($2 + ' ' + $3, fmt='%F %H:%M:%S') >= time)
126
- arr << Package.parse(p)
127
- end
128
- end
129
- }
130
- return arr
131
- end
132
-
133
- # Return an Array of packages, that were removed before provided +time+
134
- def self::removed_before(time)
135
- arr = []
136
- dr = Dir.new(DIR_REMOVED_PACKAGES)
137
- dr.each {|p|
138
- if (DIR_INSTALLED_PACKAGES + "/" + p =~ RE_REMOVED_NAMES)
139
- if (Time.strptime($2 + ' ' + $3, fmt='%F %H:%M:%S') <= time)
140
- arr << Package.parse(p)
141
- end
142
- end
143
- }
144
- return arr
145
- end
146
-
147
- # Check whether a given Slackware::Package has been upgraded before
148
- def self::is_upgraded?(pkg)
149
- if (find_removed(pkg).map {|p| p.name if p.upgrade_time }.include?(pkg) )
150
- return true
151
- else
152
- return false
153
- end
154
- end
155
-
156
- # Search installation of Slackware::Package's for what owns the questioned file
157
- def self::owns_file(file)
158
- pkgs = installed_packages
159
- found_files = []
160
- file = file.sub(/^\//, "") # clean off the leading '/'
161
- re = Regexp::new(/#{file}/)
162
- pkgs.each {|pkg|
163
- if (found = pkg.get_owned_files.map {|f| f if f =~ re}.compact)
164
- found.each {|f|
165
- found_files << [pkg, f]
166
- }
167
- end
168
- }
169
- return found_files
170
- end
171
-
172
- # Return the version of Slackware Linux currently installed
173
- def self::version
174
- SLACKWARE_VERSION
175
- end
176
- end
29
+
30
+ RE_REMOVED_NAMES = /^(.*)-upgraded-(\d{4}-\d{2}-\d{2}),(\d{2}:\d{2}:\d{2})$/
31
+ RE_BUILD_TAG = /^([[:digit:]]+)([[:alpha:]]+)$/
32
+
33
+ FMT_UPGRADE_TIME = "%F %H:%M:%S"
34
+
35
+ class System
36
+
37
+ # A debug log helper
38
+ def self::debug(msg)
39
+ Slackware::Log.instance.debug(self.name) { msg }
40
+ end
41
+
42
+ def self::installed_packages
43
+ path = Paths::installed_packages("*")
44
+ return Dir.glob(path).sort.map {|p| Package.parse(p) }
45
+ end
46
+
47
+ def self::removed_packages
48
+ path = Paths::removed_packages("*")
49
+ return Dir.glob(path).sort.map {|p| Package.parse(p) }
50
+ end
51
+
52
+ def self::installed_scripts
53
+ path = Paths::installed_scripts("*")
54
+ return Dir.glob(path).sort.map {|s| Script.parse(s) }
55
+ end
56
+
57
+ def self::removed_scripts
58
+ path = Paths::removed_scripts("*")
59
+ return Dir.glob(path).sort.map {|s| Script.parse(s) }
60
+ end
61
+
62
+ def self::tags_used
63
+ pkgs = installed_packages()
64
+ set = []
65
+ pkgs.map {|p| p.tag }.uniq.each {|tag|
66
+ m_set = {}
67
+ m_set[:tag] = tag
68
+ m_set[:count] = pkgs.select {|p| p.tag == tag }.count
69
+ set << m_set
70
+ }
71
+ return set
72
+ end
73
+
74
+ def self::with_tag(tag)
75
+ return installed_packages().select {|pkg| pkg.tag == tag }
76
+ end
77
+
78
+ def self::arch_used
79
+ return installed_packages().map {|p| p.arch }.uniq
80
+ end
81
+
82
+ def self::with_arch(arch)
83
+ return installed_packages().select {|pkg| pkg.arch == arch }
84
+ end
85
+
86
+ def self::find_installed(name)
87
+ d = Dir.new(Paths::installed_packages())
88
+ return d.select {|p| p.include?(name) }.map {|p| Package.parse(p) }
89
+ end
90
+
91
+ def self::find_removed(name)
92
+ d = Dir.new(Paths::removed_packages())
93
+ return d.select {|p| p.include?(name) }.map {|p| Package.parse(p) }
94
+ end
95
+
96
+ # Returns a list of the upgrades for a particular package name
97
+ # Example:
98
+ # Slackware::System.upgrades("xz")
99
+ # => [#<Slackware::Package:0x981e6c name="xz" version="5.0.0" arch="x86_64" build=1 tag="">,
100
+ # #<Slackware::Package:0x97e04c name="xz" version="4.999.9beta" arch="x86_64" build=1 tag="">]
101
+ # Slackware::System.upgrades("fart")
102
+ # => []
103
+ def self::upgrades(pkg)
104
+ find_removed(pkg).select {|p| (p.name == pkg) }
105
+ end
106
+
107
+ # Return an Array of packages, that were installed after provided +time+
108
+ # ("installed" meaning the file's mtime)
109
+ def self::installed_after(time)
110
+ arr = []
111
+ Dir.new(Paths::installed_packages()).each {|p|
112
+ if (File.mtime(Paths::installed_packages(p)) >= time)
113
+ pkg = Package.parse(p)
114
+ pkg.get_time
115
+ arr << pkg
116
+ end
117
+ }
118
+ return arr
119
+ end
120
+
121
+ # Return an Array of packages, that were installed before provided +time+
122
+ # ("installed" meaning the file's mtime)
123
+ def self::installed_before(time)
124
+ arr = []
125
+ Dir.new(Paths::installed_packages()).each {|p|
126
+ if (File.mtime(Paths::installed_packages(p)) <= time)
127
+ pkg = Package.parse(p)
128
+ pkg.get_time
129
+ arr << pkg
130
+ end
131
+ }
132
+ return arr
133
+ end
134
+
135
+ # Return an Array of packages, that were removed after provided +time+
136
+ def self::removed_after(time)
137
+ arr = []
138
+ Dir.new(Paths::removed_packages()).each {|p|
139
+ if (Paths::installed_packages(p) =~ RE_REMOVED_NAMES)
140
+ if (Time.strptime($2 + ' ' + $3, fmt=FMT_UPGRADE_TIME) >= time)
141
+ arr << Package.parse(p)
142
+ end
143
+ end
144
+ }
145
+ return arr
146
+ end
147
+
148
+ # Return an Array of packages, that were removed before provided +time+
149
+ def self::removed_before(time)
150
+ arr = []
151
+ Dir.new(Paths::removed_packages()).each {|p|
152
+ if (Paths::installed_packages(p) =~ RE_REMOVED_NAMES)
153
+ if (Time.strptime($2 + ' ' + $3, fmt=FMT_UPGRADE_TIME) <= time)
154
+ arr << Package.parse(p)
155
+ end
156
+ end
157
+ }
158
+ return arr
159
+ end
160
+
161
+ # Check whether a given Slackware::Package has been upgraded before
162
+ def self::is_upgraded?(pkg)
163
+ if (find_removed(pkg).map {|p| p.name if p.upgrade_time }.include?(pkg) )
164
+ return true
165
+ else
166
+ return false
167
+ end
168
+ end
169
+
170
+ # Search installation of Slackware::Package's for what owns the questioned file
171
+ # Returns an Array, of matching pairs. The pairs are [Slackware::Package, <matching file>]
172
+ def self::owns_file(file)
173
+ pkgs = installed_packages()
174
+ debug('owns_file(): pkgs.count => %d' % pkgs.count)
175
+ found_files = []
176
+ file = file.sub(/^\//, "") # clean off the leading '/'
177
+ re = /#{file}/
178
+ debug('owns_file(): file Regexp => %s' % re.inspect)
179
+ pkgs.each {|pkg|
180
+ pkg.get_owned_files().select {|f|
181
+ begin
182
+ f =~ re
183
+ rescue ArgumentError => ex
184
+ Log.instance.debug(self.name) {
185
+ "encoding mismatch: " + f
186
+ }
187
+ false # this needs to return false, for the .select
188
+ end
189
+ }.each do |f|
190
+ found_files << [pkg, f]
191
+ end
192
+ }
193
+ return found_files
194
+ end
195
+
196
+ # Return the version of Slackware Linux currently installed
197
+ def self::version
198
+ debug(SLACKWARE_VERSION)
199
+ SLACKWARE_VERSION
200
+ end
201
+ end
177
202
 
178
203
  end
179
204
 
205
+ # vim: set sw=2 sts=2 et: