solaris-patch 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.rdoc +12 -13
- data/Rakefile +7 -7
- data/lib/solaris.rb +0 -2
- data/lib/solaris/exception.rb +0 -2
- data/lib/solaris/patch.rb +15 -17
- data/lib/solaris/patchdiag.rb +50 -32
- data/lib/solaris/patchdiag_entry.rb +24 -20
- data/lib/solaris/util.rb +6 -8
- data/test/test_patch.rb +39 -41
- data/test/test_patchdiag.rb +145 -105
- data/test/test_patchdiag_entry.rb +88 -68
- data/test/test_solaris.rb +1 -3
- data/test/test_util.rb +3 -5
- metadata +22 -21
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b774165f33d7ac5ff6223d37e0931a4d585f8f22
|
4
|
+
data.tar.gz: 218a198a52c6a11cc1ba0c75bf77ae1dca6cfd0f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3d0e51b0fda8d09109d78bc7083d13160d6d1334816e112e79ac598f69eeecaf10c1669167ba87b132be63eed2f6dceae24bca0df1cd24fe2bf6f7b4ee76b1e2
|
7
|
+
data.tar.gz: cb174c16a0d537816bebddf78868a62ca7482dd1808aa3cda8f5193ce783c9ae31e879f0df629c9eeaefebfda5deb765e99059ed070c64ffe4992e498bd0db7f
|
data/README.rdoc
CHANGED
@@ -7,7 +7,7 @@ Copyright:: Copyright (c) Martin Carpenter 2011
|
|
7
7
|
|
8
8
|
== About
|
9
9
|
The solaris-patch gem helps with the manipulation of SunOS and Solaris
|
10
|
-
patches.
|
10
|
+
patches.
|
11
11
|
|
12
12
|
* Read (or write!) patchdiag.xref files.
|
13
13
|
* Find latest version of a patch.
|
@@ -20,30 +20,30 @@ patches.
|
|
20
20
|
=== Download a patch
|
21
21
|
|
22
22
|
require 'solaris/patch'
|
23
|
-
Solaris::Patch.download_patch!(
|
24
|
-
|
23
|
+
Solaris::Patch.download_patch!('123456-78',
|
24
|
+
:to_file => '/tmp/123456-78.zip')
|
25
25
|
|
26
26
|
Alternatively:
|
27
27
|
|
28
|
-
patch = Solaris::Patch.new(
|
29
|
-
patch.download_patch!(
|
28
|
+
patch = Solaris::Patch.new('123456-78')
|
29
|
+
patch.download_patch!(:to_dir => '/tmp')
|
30
30
|
|
31
31
|
=== Download a readme
|
32
32
|
|
33
33
|
require 'solaris/patch'
|
34
|
-
Solaris::Patch.download_readme!(
|
35
|
-
|
34
|
+
Solaris::Patch.download_readme!('123456-78',
|
35
|
+
:to_file => '/tmp/123456-78.txt')
|
36
36
|
|
37
37
|
=== Get the latest version of a patch
|
38
38
|
|
39
39
|
require 'solaris/patch'
|
40
|
-
Solaris::Patchdiag.open(
|
40
|
+
Solaris::Patchdiag.open('/tmp/patchdiag.xref').latest('123456-01')
|
41
41
|
=> "123456|12|..."
|
42
42
|
|
43
43
|
=== Get the latest non-obsolete version of a possibly obsoleted patch
|
44
44
|
|
45
45
|
require 'solaris/patch'
|
46
|
-
Solaris::Patchdiag.open(
|
46
|
+
Solaris::Patchdiag.open('/tmp/patchdiag.xref').successor('123456-01')
|
47
47
|
=> "234567|12|..."
|
48
48
|
|
49
49
|
=== Interrogate patchdiag.xref
|
@@ -51,14 +51,14 @@ Alternatively:
|
|
51
51
|
require 'solaris/patch'
|
52
52
|
|
53
53
|
# slurp in patchdiag.xref
|
54
|
-
patchdiag = Solaris::Patchdiag.new(
|
54
|
+
patchdiag = Solaris::Patchdiag.new('/tmp/patchdiag.xref')
|
55
55
|
|
56
56
|
# all sparc patches
|
57
57
|
patchdiag.select { |p| p.archs.include? 'sparc' }.inspect
|
58
|
-
=> [
|
58
|
+
=> ["123456-78", ...]
|
59
59
|
|
60
60
|
# latest line added to patchdiag.xref
|
61
|
-
most_recent = patchdiag.sort_by(
|
61
|
+
most_recent = patchdiag.sort_by(&:date).last
|
62
62
|
most_recent
|
63
63
|
=> "123456|78|..."
|
64
64
|
|
@@ -74,4 +74,3 @@ Alternatively:
|
|
74
74
|
|
75
75
|
Dates in patchdiag.xref are Mon/dd/yy format. This gem will break in
|
76
76
|
2050 since it assumes year 50 and above is in the 20th century.
|
77
|
-
|
data/Rakefile
CHANGED
@@ -7,12 +7,12 @@ require 'rubygems/package_task'
|
|
7
7
|
desc 'Default task (package)'
|
8
8
|
task :default => [:package]
|
9
9
|
|
10
|
-
Rake::TestTask.new(
|
10
|
+
Rake::TestTask.new('test')
|
11
11
|
|
12
12
|
SPECFILE = 'solaris-patch.gemspec'
|
13
|
-
if File.exist?(
|
14
|
-
spec = eval(
|
15
|
-
Gem::PackageTask.new(
|
13
|
+
if File.exist?(SPECFILE)
|
14
|
+
spec = eval(File.read(SPECFILE))
|
15
|
+
Gem::PackageTask.new(spec).define
|
16
16
|
end
|
17
17
|
|
18
18
|
RDoc::Task.new do |rdoc|
|
@@ -20,8 +20,8 @@ RDoc::Task.new do |rdoc|
|
|
20
20
|
rdoc.title = 'solaris-patch'
|
21
21
|
rdoc.options << '--charset' << 'utf-8'
|
22
22
|
rdoc.options << '--all'
|
23
|
-
rdoc.rdoc_files.include(
|
24
|
-
rdoc.rdoc_files.include(
|
25
|
-
rdoc.rdoc_files.include(
|
23
|
+
rdoc.rdoc_files.include('README.rdoc')
|
24
|
+
rdoc.rdoc_files.include(FileList['lib/**/*'])
|
25
|
+
rdoc.rdoc_files.include(FileList['test/**/*'])
|
26
26
|
end
|
27
27
|
|
data/lib/solaris.rb
CHANGED
data/lib/solaris/exception.rb
CHANGED
data/lib/solaris/patch.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module Solaris
|
3
2
|
|
4
3
|
# Class to represent a patch number.
|
@@ -17,7 +16,7 @@ module Solaris
|
|
17
16
|
:patch => 'https://getupdates.oracle.com/all_unsigned/%s.zip',
|
18
17
|
:readme => 'https://getupdates.oracle.com/readme/README.%s'
|
19
18
|
}
|
20
|
-
|
19
|
+
|
21
20
|
# The major number of the patch (integer), the part before the dash.
|
22
21
|
attr_accessor :major
|
23
22
|
|
@@ -45,7 +44,7 @@ module Solaris
|
|
45
44
|
# TLDR: Patch.new('123456-78')
|
46
45
|
def initialize(major=nil, minor=nil)
|
47
46
|
if major
|
48
|
-
patch_no = major.to_s + (
|
47
|
+
patch_no = major.to_s + (minor ? "-#{minor}" : '')
|
49
48
|
if patch_no =~ /^(\d+)(-(\d+))?$/
|
50
49
|
@major = $1.to_i
|
51
50
|
@minor = $3.to_i if $3
|
@@ -57,18 +56,18 @@ module Solaris
|
|
57
56
|
|
58
57
|
# Download this patch. For the options hash see private method Patch#download!
|
59
58
|
def download_patch!(opts={})
|
60
|
-
download!(
|
59
|
+
download!(:patch, opts)
|
61
60
|
end
|
62
61
|
|
63
62
|
# Download this README. For the options hash see private method Patch#download!
|
64
63
|
def download_readme!(opts={})
|
65
|
-
download!(
|
64
|
+
download!(:readme, opts)
|
66
65
|
end
|
67
66
|
|
68
67
|
# Return a string representation of this patch. If the minor
|
69
68
|
# number has not been set then just return the major number.
|
70
69
|
def to_s
|
71
|
-
minor ? "#{@major}-#{Patch.pad_minor(
|
70
|
+
minor ? "#{@major}-#{Patch.pad_minor(@minor)}" : "#{@major}"
|
72
71
|
end
|
73
72
|
|
74
73
|
# Compare patch versions. (Performs a string compare on the full patch numbers).
|
@@ -79,20 +78,20 @@ module Solaris
|
|
79
78
|
# Download the given patch (this may be a Patch object or a string
|
80
79
|
# like '123456-78'). For the options hash see Patch#download!.
|
81
80
|
def Patch.download_patch!(patch, opts={})
|
82
|
-
patch_to_dl = Patch.new(
|
83
|
-
patch_to_dl.download_patch!(
|
81
|
+
patch_to_dl = Patch.new(patch.to_s)
|
82
|
+
patch_to_dl.download_patch!(opts)
|
84
83
|
end
|
85
84
|
|
86
85
|
# Download the given readme (this may be a Patch object or a string
|
87
86
|
# like '123456-78'). For the options hash see Patch#download!.
|
88
87
|
def Patch.download_readme!(patch, opts={})
|
89
|
-
patch_to_dl = Patch.new(
|
90
|
-
patch_to_dl.download_readme!(
|
88
|
+
patch_to_dl = Patch.new(patch.to_s)
|
89
|
+
patch_to_dl.download_readme!(opts)
|
91
90
|
end
|
92
91
|
|
93
92
|
# Left pad a minor version number with zeros as required.
|
94
93
|
def Patch.pad_minor(minor)
|
95
|
-
"#{minor.to_s.rjust(
|
94
|
+
"#{minor.to_s.rjust(2, '0')}"
|
96
95
|
end
|
97
96
|
|
98
97
|
private
|
@@ -102,15 +101,14 @@ module Solaris
|
|
102
101
|
def download!(type, opts={})
|
103
102
|
raise ArgumentError, "Patch #{self.inspect} requires a major number to download" unless @major
|
104
103
|
raise ArgumentError, "Patch #{self.inspect} requires a minor number to download" unless @minor
|
105
|
-
raise ArgumentError, "Unknown type #{type.inspect}" unless URL[
|
106
|
-
url = URL[
|
104
|
+
raise ArgumentError, "Unknown type #{type.inspect}" unless URL[type]
|
105
|
+
url = URL[type] % self.to_s
|
107
106
|
opts = {
|
108
107
|
:agent => 'Wget/1.10.2', # default user agent, required by Oracle
|
109
|
-
}.merge(
|
110
|
-
Solaris::Util.download!(
|
108
|
+
}.merge(opts)
|
109
|
+
Solaris::Util.download!(url, opts)
|
111
110
|
end
|
112
|
-
|
111
|
+
|
113
112
|
end # Patch
|
114
113
|
|
115
114
|
end # Solaris
|
116
|
-
|
data/lib/solaris/patchdiag.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module Solaris
|
3
2
|
|
4
3
|
# Class to represent the Oracle patchdiag "database" (file).
|
@@ -20,17 +19,30 @@ module Solaris
|
|
20
19
|
# URL of latest patchdiag.xref from Oracle.
|
21
20
|
DEFAULT_XREF_URL = 'https://getupdates.oracle.com/reports/patchdiag.xref'
|
22
21
|
|
22
|
+
# The date of this patchdiag.xref, parsed from the header.
|
23
|
+
attr_writer :date
|
24
|
+
|
25
|
+
# The array of lines that comprise the header, sans trailing newline.
|
26
|
+
attr_accessor :header
|
27
|
+
|
28
|
+
# The array of lines that comprise the footer, sans trailing newline.
|
29
|
+
attr_accessor :footer
|
30
|
+
|
23
31
|
# Create a new patchdiag database object by reading the given
|
24
32
|
# xref file (this may be a filename (string) or a fileish object
|
25
33
|
# (File, StringIO)). If no xref file is given then the default
|
26
34
|
# is read (/var/tmp/patchdiag.xref); this is the cache file used
|
27
35
|
# by Patch Check Advanced (pca).
|
28
36
|
def initialize(xref_file=DEFAULT_XREF_FILE)
|
29
|
-
xref_file = File.new(
|
30
|
-
@
|
31
|
-
|
32
|
-
|
33
|
-
|
37
|
+
xref_file = File.new(xref_file) if xref_file.is_a?(String)
|
38
|
+
@entries, @header, @footer = [], [], []
|
39
|
+
xref_file.each_line do |line|
|
40
|
+
if line =~ /^\d/
|
41
|
+
@entries << PatchdiagEntry.new(line)
|
42
|
+
else
|
43
|
+
(@entries.empty? ? @header : @footer) << line.chomp
|
44
|
+
end
|
45
|
+
end
|
34
46
|
end
|
35
47
|
|
36
48
|
# Download the patchdiag database and return it as a string.
|
@@ -38,14 +50,14 @@ module Solaris
|
|
38
50
|
# to disk unless :to_file or :to_dir are given.
|
39
51
|
# For the options hash argument see Solaris::Util.download!
|
40
52
|
def Patchdiag.download!(opts={})
|
41
|
-
url = opts.delete(
|
42
|
-
Util.download!(
|
53
|
+
url = opts.delete(:url) || DEFAULT_XREF_URL
|
54
|
+
Util.download!(url, opts)
|
43
55
|
end
|
44
56
|
|
45
57
|
# Open the given optional patchdiag xref file and yield to the
|
46
58
|
# optional block.
|
47
59
|
def Patchdiag.open(xref_file=DEFAULT_XREF_FILE, &blk)
|
48
|
-
patchdiag = Patchdiag.new(
|
60
|
+
patchdiag = Patchdiag.new(xref_file)
|
49
61
|
if block_given?
|
50
62
|
yield patchdiag
|
51
63
|
else
|
@@ -55,13 +67,20 @@ module Solaris
|
|
55
67
|
|
56
68
|
# Create and return a deep copy of this object.
|
57
69
|
def clone
|
58
|
-
Marshal.load(
|
70
|
+
Marshal.load(Marshal.dump(self))
|
71
|
+
end
|
72
|
+
|
73
|
+
# Return the date parsed from the patchdiag.xref comment lines.
|
74
|
+
def date
|
75
|
+
## PATCHDIAG TOOL CROSS-REFERENCE FILE AS OF Jan/23/14 ##
|
76
|
+
@date ||= @header.find { |line| line =~ /\s(\w\w\w\/\d\d\/\d\d)\s/ } &&
|
77
|
+
Date.parse($1)
|
59
78
|
end
|
60
79
|
|
61
80
|
# For Enumerator module: yields each Solaris::PatchdiagEntry in
|
62
81
|
# turn.
|
63
82
|
def each(&blk)
|
64
|
-
@
|
83
|
+
@entries.each(&blk)
|
65
84
|
end
|
66
85
|
|
67
86
|
# Returns an array of Solaris::PatchdiagEntry from the
|
@@ -73,16 +92,16 @@ module Solaris
|
|
73
92
|
# major number are returned. Returns an empty array if no such
|
74
93
|
# patches can be found. This method overrides Enumerable#find.
|
75
94
|
def find(patch)
|
76
|
-
patch = Patch.new(
|
95
|
+
patch = Patch.new(patch.to_s)
|
77
96
|
property = patch.minor ? :to_s : :major
|
78
|
-
comparator = patch.send(
|
79
|
-
entries.select { |pde| pde.patch.send(
|
97
|
+
comparator = patch.send(property)
|
98
|
+
@entries.select { |pde| pde.patch.send(property) == comparator }
|
80
99
|
end
|
81
100
|
|
82
101
|
# Strangely Enumerable module does not define Enumerable#last (although
|
83
102
|
# it does define Enumerable#first) so we define last here.
|
84
103
|
def last
|
85
|
-
entries.last
|
104
|
+
@entries.last
|
86
105
|
end
|
87
106
|
|
88
107
|
# Return the Solaris::PatchdiagEntry of the latest version of the
|
@@ -90,24 +109,24 @@ module Solaris
|
|
90
109
|
# Solaris::Patch). Throws Solaris::Patch::NotFound if the patch
|
91
110
|
# cannot be found in patchdiag.xref.
|
92
111
|
def latest(patch)
|
93
|
-
major = Patch.new(
|
94
|
-
find(
|
95
|
-
raise(
|
96
|
-
"Cannot find patch #{patch} in patchdiag.xref"
|
112
|
+
major = Patch.new(patch.to_s).major
|
113
|
+
find(major).max ||
|
114
|
+
raise(Solaris::Patch::NotFound,
|
115
|
+
"Cannot find patch #{patch} in patchdiag.xref")
|
97
116
|
end
|
98
117
|
|
99
118
|
# Returns a (deep) copy of +self+ with the entries sorted, takes an
|
100
119
|
# optional block. This method overrides Enumerable#sort. See also
|
101
120
|
# Solaris::Patchdiag#sort!.
|
102
121
|
def sort(&blk)
|
103
|
-
clone.sort!(
|
122
|
+
clone.sort!(&blk)
|
104
123
|
end
|
105
124
|
|
106
125
|
# Returns +self+ with the entries sorted in place, takes an optional
|
107
126
|
# block. See also Solaris::Patchdiag#sort.
|
108
127
|
def sort!(&blk)
|
109
|
-
# use @
|
110
|
-
@
|
128
|
+
# use @entries since #entries returns a copy
|
129
|
+
@entries.sort!(&blk)
|
111
130
|
self
|
112
131
|
end
|
113
132
|
|
@@ -125,21 +144,21 @@ module Solaris
|
|
125
144
|
# The ancestors parameter is a recursion accumulator and should not
|
126
145
|
# normally be assigned to by callers.
|
127
146
|
def successors(patch, ancestors=[])
|
128
|
-
patch = Patch.new(
|
147
|
+
patch = Patch.new(patch.to_s)
|
129
148
|
raise Solaris::Patch::SuccessorLoop,
|
130
|
-
"Loop detected for patch #{patch} with ancestors #{ancestors.inspect}" if ancestors.include?(
|
149
|
+
"Loop detected for patch #{patch} with ancestors #{ancestors.inspect}" if ancestors.include?(patch)
|
131
150
|
ancestors << patch
|
132
151
|
if ! patch.minor # patch has no minor number
|
133
|
-
successors(
|
134
|
-
elsif ! entry = find(
|
135
|
-
latest_patch = latest(
|
152
|
+
successors(latest(patch).patch, ancestors)
|
153
|
+
elsif ! entry = find(patch).last # explicit patch not found
|
154
|
+
latest_patch = latest(patch).patch
|
136
155
|
raise Solaris::Patch::NotFound,
|
137
156
|
"Patch #{patch} not found and has no later version" if latest_patch.minor <= patch.minor
|
138
|
-
successors(
|
157
|
+
successors(latest_patch, ancestors)
|
139
158
|
else
|
140
159
|
if entry.obsolete?
|
141
160
|
succ = entry.successor
|
142
|
-
successors(
|
161
|
+
successors(succ, ancestors)
|
143
162
|
elsif entry.bad?
|
144
163
|
raise BadSuccessor, "Terminal successor #{patch} is bad/withdrawn"
|
145
164
|
else
|
@@ -151,17 +170,16 @@ module Solaris
|
|
151
170
|
# Return the Solaris::PatchdiagEntry of the latest non-obsolete successor
|
152
171
|
# of this patch. This is a convenience method for #successors.last.
|
153
172
|
def successor(patch)
|
154
|
-
latest(
|
173
|
+
latest(successors(patch).last)
|
155
174
|
end
|
156
175
|
|
157
176
|
# Returns a string representation of the patchdiag.xref. All comments
|
158
177
|
# and blank lines are elided.
|
159
178
|
def to_s
|
160
|
-
entries.join("\n")
|
179
|
+
(@header + @entries + @footer).join("\n") << "\n"
|
161
180
|
end
|
162
181
|
alias to_str to_s
|
163
182
|
|
164
183
|
end # Patchdiag
|
165
184
|
|
166
185
|
end # Solaris
|
167
|
-
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module Solaris
|
3
2
|
|
4
3
|
# Class to represent a line from Sun's patchdiag.xref patch "database".
|
@@ -56,23 +55,27 @@ module Solaris
|
|
56
55
|
# patchdiag.xref).
|
57
56
|
attr_accessor :y2k
|
58
57
|
|
58
|
+
# Number of pipe-delimited fields in a patchdiag line.
|
59
|
+
FIELDS = 11
|
60
|
+
|
59
61
|
def initialize(patchdiag_line)
|
60
|
-
fields = patchdiag_line.split(
|
62
|
+
fields = patchdiag_line.split('|', FIELDS)
|
63
|
+
raise ArgumentError, "Not enough fields in line: #{patchdiag_line}" unless fields.size == FIELDS
|
61
64
|
major, minor, date, @recommended, @security, @obsolete, bad, @os, archs, pkgs, @synopsis = *fields
|
62
|
-
@archs = archs.split(
|
65
|
+
@archs = archs.split(';')
|
63
66
|
if date == ''
|
64
67
|
year, month, day = 1970, 1, 1
|
65
68
|
else
|
66
|
-
month_s, day_s, year_s = *date.split(
|
67
|
-
year = (
|
68
|
-
month = Date::ABBR_MONTHNAMES.index(
|
69
|
+
month_s, day_s, year_s = *date.split('/')
|
70
|
+
year = (year_s.to_i > 50 ? "19#{year_s}" : "20#{year_s}").to_i
|
71
|
+
month = Date::ABBR_MONTHNAMES.index(month_s)
|
69
72
|
day = day_s.to_i
|
70
73
|
end
|
71
74
|
@bad = bad =~ /B/ ? 'B' : ' '
|
72
75
|
@y2k = bad =~ /Y/ ? 'Y' : ' '
|
73
|
-
@date = Date.new(
|
74
|
-
@patch = Patch.new(
|
75
|
-
@pkgs = pkgs.split(
|
76
|
+
@date = Date.new(year, month, day)
|
77
|
+
@patch = Patch.new(major, minor)
|
78
|
+
@pkgs = pkgs.split(';')
|
76
79
|
@synopsis.chomp!
|
77
80
|
end
|
78
81
|
|
@@ -82,12 +85,12 @@ module Solaris
|
|
82
85
|
|
83
86
|
# Download this patch. For options hash see Patch#download!.
|
84
87
|
def download_patch!(opts={}) ;
|
85
|
-
@patch.download_patch!(
|
88
|
+
@patch.download_patch!(opts)
|
86
89
|
end
|
87
90
|
|
88
91
|
# Download the README for this patch. For options hash see Patch#download!.
|
89
92
|
def download_readme!(opts={})
|
90
|
-
@patch.download_readme!(
|
93
|
+
@patch.download_readme!(opts)
|
91
94
|
end
|
92
95
|
|
93
96
|
# Returns this entries major patch number as an integer.
|
@@ -141,7 +144,7 @@ module Solaris
|
|
141
144
|
|
142
145
|
# See if we can find a successor
|
143
146
|
if synopsis =~ /obsolete(d?) by\s*(:?)\s*(\d+(-\d+)?)/i
|
144
|
-
Patch.new(
|
147
|
+
Patch.new($3)
|
145
148
|
else
|
146
149
|
raise Solaris::Patch::InvalidSuccessor,
|
147
150
|
"Failed to parse successor to obsolete patchdiag entry for patch #{patch.inspect}"
|
@@ -151,16 +154,17 @@ module Solaris
|
|
151
154
|
# Output this patchdiag xref entry as a string, in format of Oracle's
|
152
155
|
# database.
|
153
156
|
def to_s
|
154
|
-
[
|
155
|
-
|
157
|
+
[
|
158
|
+
patch.major,
|
159
|
+
Patch.pad_minor(patch.minor),
|
156
160
|
date_s,
|
157
161
|
@recommended,
|
158
162
|
@security,
|
159
163
|
@obsolete,
|
160
|
-
@
|
164
|
+
@y2k + @bad,
|
161
165
|
@os,
|
162
|
-
join_semis(
|
163
|
-
join_semis(
|
166
|
+
join_semis(@archs),
|
167
|
+
join_semis(@pkgs),
|
164
168
|
@synopsis
|
165
169
|
].join('|')
|
166
170
|
end
|
@@ -179,9 +183,10 @@ module Solaris
|
|
179
183
|
|
180
184
|
# Convert the Date object to a date string as found in patchdiag.xref.
|
181
185
|
def date_s
|
182
|
-
[
|
186
|
+
[
|
187
|
+
Date::ABBR_MONTHNAMES[@date.mon], # month eg Jan
|
183
188
|
@date.mday.to_s.rjust(2, '0'), # day of month
|
184
|
-
@date.year % 100 # 2 digit year
|
189
|
+
(@date.year % 100).to_s.rjust(2, '0') # 2 digit year
|
185
190
|
].join('/')
|
186
191
|
end
|
187
192
|
|
@@ -195,4 +200,3 @@ module Solaris
|
|
195
200
|
end # PatchdiagEntry
|
196
201
|
|
197
202
|
end # Solaris
|
198
|
-
|