106: def latest
107: Puppet.debug "portupgrade.latest() - Latest check called on #{@resource[:name]}"
108:
109:
110:
111: cmdline = ["-v", @resource[:name]]
112:
113: begin
114: output = portversion(*cmdline)
115: rescue Puppet::ExecutionFailure
116: raise Puppet::Error.new(output)
117: end
118:
119:
120: if output =~ /^\S+-([^-\s]+)\s+(\S)\s+(.*)/
121:
122:
123: installedversion = $1
124: comparison = $2
125: otherdata = $3
126:
127:
128:
129: case comparison
130: when "=", ">"
131: Puppet.debug "portupgrade.latest() - Installed package is latest (#{installedversion})"
132: return installedversion
133: when "<"
134:
135:
136: if otherdata =~ /\(port has (\S+)\)/
137: newversion = $1
138: Puppet.debug "portupgrade.latest() - Installed version needs updating to (#{newversion})"
139: return newversion
140: else
141: Puppet.debug "portupgrade.latest() - Unable to determine new version from (#{otherdata})"
142: return installedversion
143: end
144: when "?", "!", "#"
145: Puppet.debug "portupgrade.latest() - Comparison Error reported from portversion (#{output})"
146: return installedversion
147: else
148: Puppet.debug "portupgrade.latest() - Unknown code from portversion output (#{output})"
149: return installedversion
150: end
151:
152: else
153:
154:
155:
156: if output =~ /^\*\* No matching package /
157: raise Puppet::ExecutionFailure, "Could not find package #{@resource[:name]}"
158: else
159:
160: raise Puppet::ExecutionFailure, "Unexpected output from portversion: #{output}"
161: end
162:
163:
164: return nil
165: end
166:
167:
168:
169: raise Puppet::Error, "portversion.latest() - fatal error with portversion: #{output}"
170: return nil
171:
172: end