zypper-upgraderepo 1.1.0 → 1.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9e0bb83e66c339eaffe198c509e835a565db6075ab6afedd75eb5816c5176ce
4
- data.tar.gz: 79f79f8f2fc1cdbea708cb5bf02d25b82d4be4ca83630962c02cdc01870b72d9
3
+ metadata.gz: a427fb24de5056e9425117be69b150cd225a9cf649d93f0ee8c5425951021824
4
+ data.tar.gz: a317a3f790c16151bb08a9cdffddd8e813f325adf0f49f5a5aac9760a4b28aee
5
5
  SHA512:
6
- metadata.gz: f4babf4d20fecf1d1306e1411ee28e2026ec1214523f879a99107982b0b62bbce621e61da4fa77f7b9c73799238001bee26978bc47a47a9bdadc92c49b0aa87d
7
- data.tar.gz: 6bf20f0c92d33e58cf1fc088b4130c9ea3704b13b1ec2667cf6a859329573cf9a451b1f78a15cfac245c173ca23aaea1d509398a1006cb6a0df9d2e767f09cfe
6
+ metadata.gz: 256f4cf0b63242db412d27328bdc0599b583e20dfbc194941963d4676f025033defadaeab0bb1f6cf3cbeaf2c0ebe64cdc78e3460c9693ac53454768d810cf91
7
+ data.tar.gz: '0408b1a8169c94fa1115b1f9fda5ce411718cac4d8afeb149dbdb3b5f2a76a89a57c97ebca951a7c440ffc2c96929985e94f60d353fd5302517d9a8f9f2aa141'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- zypper-upgraderepo (1.1.0)
4
+ zypper-upgraderepo (1.2.0)
5
5
  iniparse
6
6
  minitar
7
7
 
@@ -36,4 +36,4 @@ DEPENDENCIES
36
36
  zypper-upgraderepo!
37
37
 
38
38
  BUNDLED WITH
39
- 1.16.2
39
+ 1.17.1
@@ -1,6 +1,10 @@
1
1
  require 'zypper/upgraderepo/repository'
2
+ require 'zypper/upgraderepo/request'
2
3
  require 'zypper/upgraderepo/os_release'
3
4
  require 'zypper/upgraderepo/utils'
5
+ require 'zypper/upgraderepo/view'
6
+ require 'zlib'
7
+ require 'minitar'
4
8
 
5
9
 
6
10
  module Zypper
@@ -11,12 +15,22 @@ module Zypper
11
15
  @os_release = OsRelease.new(options)
12
16
  @repos = RepositoryList.new(options)
13
17
  @print_hint = options.hint
14
- @view_class = Object.const_get options.view.to_s.split(' ').map(&:capitalize).insert(0,'Zypper::Upgraderepo::').push('View').join
18
+ @view_class = Zypper::Upgraderepo::View.const_get options.view.to_s.capitalize
19
+
20
+ @overrides = options.overrides
21
+ @upgrade_options = { alias: options.alias, name: options.name }
22
+
23
+ @backup_path = options.backup_path
15
24
  end
16
25
 
17
26
  def backup
18
- @repos.backup
19
- Messages.ok 'Repository backup executed!'
27
+ filename = File.join(@backup_path, "repos-backup-#{Time.now.to_s.delete(': +-')[0..-5]}.tgz")
28
+
29
+ raise InvalidPermissions, filename unless File.writable? @backup_path
30
+
31
+ Minitar.pack(RepositoryList::REPOSITORY_PATH, Zlib::GzipWriter.new(File.open(filename, 'wb')))
32
+
33
+ Messages.ok "Backup file generated at #{filename.bold.green}"
20
34
  end
21
35
 
22
36
  def check_current
@@ -25,26 +39,23 @@ module Zypper
25
39
 
26
40
  def check_next
27
41
  raise AlreadyUpgraded, 'latest' if @os_release.last?
28
- @repos.upgrade(@os_release.next)
42
+ @repos.each_with_index { |r, i| r.upgrade(@os_release.next, @upgrade_options.merge(url_override: @overrides[i.next])) }
29
43
  check_repos(@os_release.next)
30
44
  end
31
45
 
32
46
  def check_to
33
- @repos.upgrade(@os_release.custom)
47
+ @repos.each_with_index { |r, i| r.upgrade(@os_release.custom, @upgrade_options.merge(url_override: @overrides[i.next])) }
34
48
  check_repos(@os_release.custom)
35
49
  end
36
50
 
37
51
  def upgrade
38
52
  raise AlreadyUpgraded, 'latest' if @os_release.last?
39
- @repos.upgrade(@os_release.next)
40
- @repos.save
41
- Messages.ok 'Repositories upgraded!'
53
+ upgrade_repos(@os_release.next)
42
54
  end
43
55
 
44
56
  def upgrade_to
45
- @repos.upgrade(@os_release.custom)
46
- @repos.save
47
- Messages.ok 'Repositories upgraded!'
57
+ raise AlreadyUpgraded, @os_release.custom if @os_release.current?(@os_release.custom)
58
+ upgrade_repos(@os_release.custom)
48
59
  end
49
60
 
50
61
 
@@ -53,7 +64,8 @@ module Zypper
53
64
  def check_repos(version)
54
65
  @view_class.header(@repos.max_col)
55
66
 
56
- @repos.list.each_with_index do |r, i|
67
+ @repos.each_with_index do |r, i|
68
+
57
69
  @view_class.separator
58
70
 
59
71
  if r.available?
@@ -66,12 +78,36 @@ module Zypper
66
78
  else
67
79
  @view_class.not_found i.next, r, @repos.max_col
68
80
  end
81
+ elsif r.timeout?
82
+ @view_class.timeout i.next, r, @repos.max_col
69
83
  end
70
84
  end
71
85
 
72
86
  @view_class.footer
73
87
  end
74
88
 
89
+ def upgrade_repos(version)
90
+ @view_class.header(@repos.max_col, true)
91
+
92
+ @repos.each_with_index do |repo, i|
93
+
94
+ @view_class.separator
95
+
96
+ repo.upgrade(version, @upgrade_options.merge(url_override: @overrides[i.next]))
97
+
98
+ if repo.upgraded?
99
+ @view_class.upgraded i.next, repo, @repos.max_col
100
+ else
101
+ @view_class.untouched i.next, repo, @repos.max_col
102
+ end
103
+ end
104
+
105
+ @view_class.separator
106
+
107
+ @repos.save
108
+ Messages.ok 'Repositories upgraded!'
109
+ end
110
+
75
111
  end
76
112
 
77
113
  end
@@ -21,7 +21,9 @@ module Zypper
21
21
  options.version = nil
22
22
  options.sort_by = :alias
23
23
  options.view = :table
24
-
24
+ options.only_repo = nil
25
+ options.timeout = 10.0
26
+
25
27
  opt_parser = OptionParser.new do |opt|
26
28
 
27
29
  if ENV['ZYPPER_UPGRADEREPO']
@@ -64,26 +66,37 @@ module Zypper
64
66
  opt.separator ''
65
67
  opt.separator 'Options:'
66
68
 
67
- opt.on('--[no-]only-enabled', 'Include or not the disabled repositories') do |o|
68
- options.only_enabled = o
69
+ opt.on('--only-enabled', 'Include only the enabled repositories') do |o|
70
+ options.only_enabled = true
71
+ end
72
+
73
+ opt.on('--only-repo <NUMBER>[,NUMBER2,...]', 'Include only the repositories specified by NUMBER') do |o|
74
+ options.only_repo = o.split(',').map(&:to_i)
69
75
  end
70
76
 
71
- opt.on('--[no-]name', 'Upgrade or not the name') do |o|
72
- options.name = o
77
+ opt.on('--no-name', 'Don\'t upgrade the name') do |o|
78
+ options.name = false
73
79
  end
74
80
 
75
- opt.on('--[no-]alias', 'Upgrade or not the alias') do |o|
76
- options.alias = o
81
+ opt.on('--no-alias', 'Don\'t upgrade the alias') do |o|
82
+ options.alias = false
77
83
  end
78
84
 
79
- opt.on('--[no-]hint', 'Suggest a new url when the current is not found') do |o|
80
- options.hint = o
85
+ opt.on('--no-hint', 'Don\'t find a working url when the current is invalid') do |o|
86
+ options.hint = false
81
87
  end
82
88
 
83
89
  opt.on('--override-url <NUMBER>,<URL>', Array, 'Overwrite the repository\'s url NUMBER with URL') do |r|
84
- options.overrides[r[0]] = r[1]
90
+ options.overrides[r[0].to_i] = r[1]
91
+ end
92
+
93
+ opt.on('--timeout <SECONDS>', "Adjust the waiting SECONDS used to catch an HTTP Timeout Error (Default: #{options.timeout})") do |o|
94
+ options.timeout = o.to_f
85
95
  end
86
96
 
97
+ opt.separator ''
98
+ opt.separator 'View options:'
99
+
87
100
  opt.on('--sort-by-alias', 'Sort repositories by alias (Default)') do |o|
88
101
  options.sort_by = :alias
89
102
  end
@@ -96,10 +109,11 @@ module Zypper
96
109
  options.sort_by = :priority
97
110
  end
98
111
 
99
- opt.on('--report-view', 'View the data as report') do |o|
112
+ opt.on('--report', 'View the data as report') do |o|
100
113
  options.view = :report
101
114
  end
102
115
 
116
+
103
117
  unless ENV['ZYPPER_UPGRADEREPO']
104
118
  opt.separator ''
105
119
  opt.separator 'Other:'
@@ -116,7 +130,7 @@ module Zypper
116
130
  end
117
131
 
118
132
  end
119
-
133
+
120
134
  if ARGV.empty?
121
135
  puts opt_parser; exit
122
136
  else
@@ -129,7 +143,7 @@ module Zypper
129
143
  end
130
144
 
131
145
 
132
- class CLI
146
+ class CLI
133
147
  def self.start
134
148
  begin
135
149
  options = OptParseMain.parse(ARGV)
@@ -24,7 +24,6 @@ module Zypper
24
24
 
25
25
  if options.version
26
26
  raise InvalidVersion, options.version unless OS_VERSIONS.include?(options.version)
27
- raise AlreadyUpgraded, options.version unless OS_VERSIONS.index(options.version) != @current_idx
28
27
  @custom = options.version
29
28
  end
30
29
  end
@@ -60,6 +59,10 @@ module Zypper
60
59
  def valid?(version)
61
60
  OS_VERSIONS.include? version
62
61
  end
62
+
63
+ def current?(version)
64
+ OS_VERSIONS.index(version) == @current_idx
65
+ end
63
66
  end
64
67
 
65
68
 
@@ -1,24 +1,23 @@
1
1
  require 'iniparse'
2
- require 'net/http'
3
- require 'zlib'
4
- require 'minitar'
5
2
 
6
3
  module Zypper
7
4
  module Upgraderepo
8
5
 
9
6
 
10
7
  class RepositoryList
8
+
9
+ REPOSITORY_PATH = '/etc/zypp/repos.d'
10
+
11
11
  attr_reader :list, :max_col
12
12
 
13
13
  def initialize(options)
14
14
  @alias = options.alias
15
15
  @name = options.name
16
- @overrides = options.overrides
16
+ @only_repo = options.only_repo
17
17
  @list = []
18
- @backup_path = options.backup_path
19
18
 
20
- Dir.glob('/etc/zypp/repos.d/*.repo').each do |i|
21
- r = Repository.new(i)
19
+ Dir.glob(File.join(REPOSITORY_PATH, '*.repo')).each do |i|
20
+ r = RepositoryRequest.new(Repository.new(i), options.timeout)
22
21
  next if options.only_enabled && (!r.enabled?)
23
22
  @list << r
24
23
  end
@@ -28,22 +27,11 @@ module Zypper
28
27
  @list.sort_by! { |x| x.send(options.sort_by) } if options.sort_by != :alias
29
28
  end
30
29
 
31
- def backup
32
- filename = File.join(@backup_path, "repos-backup-#{Time.now.to_s.delete(': +-')[0..-5]}.tgz")
33
- raise InvalidPermissions, filename unless File.writable? @backup_path
34
- Minitar.pack('/etc/zypp/repos.d',
35
- Zlib::GzipWriter.new(File.open(filename, 'wb')))
36
- end
37
-
38
- def upgrade(version)
30
+ def each_with_index
39
31
  @list.each_with_index do |repo, i|
40
- if @overrides.has_key? i.next.to_s
41
- repo.url = @overrides[i.next.to_s]
42
- else
43
- repo.url = repo.url.gsub(/\d\d\.\d/, version)
44
- end
45
- repo.alias = repo.alias.gsub(/\d\d\.\d/, version) if @alias
46
- repo.name = repo.name.gsub(/\d\d\.\d/, version) if @name
32
+ next if @only_repo && !@only_repo.include?(i.next)
33
+
34
+ yield repo, i if block_given?
47
35
  end
48
36
  end
49
37
 
@@ -56,13 +44,15 @@ module Zypper
56
44
 
57
45
 
58
46
  class Repository
59
- attr_reader :filename
60
-
47
+ attr_reader :filename, :old_url, :old_alias, :old_name
48
+
61
49
  def initialize(filename)
62
50
  @filename = filename
63
51
  @repo = IniParse.parse(File.read(filename))
64
- @key = get_key
65
- @res = nil
52
+ @key = get_key
53
+ @old_url = nil
54
+ @old_name = nil
55
+ @old_alias = nil
66
56
  end
67
57
 
68
58
  def enabled?
@@ -102,109 +92,38 @@ module Zypper
102
92
  @key = get_key
103
93
  end
104
94
 
105
- def available?
106
- ping.is_a?(Net::HTTPSuccess)
107
- end
95
+ def upgrade(version, args = {})
96
+ @old_url ||= self.url
97
+ @old_alias ||= self.alias
98
+ @old_name ||= self.name
108
99
 
109
- def redirected?
110
- ping.is_a?(Net::HTTPRedirection)
111
- end
100
+ if args[:url_override]
101
+ self.url = args[:url_override]
102
+ else
103
+ self.url = self.url.gsub(/\d\d\.\d/, version)
104
+ end
112
105
 
113
- def redirected_to
114
- ping['location']
106
+ self.alias = self.alias.gsub(/\d\d\.\d/, version) if args[:alias]
107
+ self.name = self.name.gsub(/\d\d\.\d/, version) if args[:name]
115
108
  end
116
109
 
117
- def not_found?
118
- ping.is_a?(Net::HTTPNotFound)
110
+ def upgraded?(item = :url)
111
+ (!self.send("old_#{item}").nil?) && (self.send("old_#{item}") != self.send(item))
119
112
  end
120
113
 
121
114
  def save
122
115
  raise InvalidPermissions, @filename unless File.writable? @filename
123
- @repo.save(@filename)
116
+ @repo.save(@filename)
124
117
  end
125
118
 
126
- def evaluate_alternative(version)
127
- if url =~ /dl\.google\.com/
128
- return { url: '', message: 'Just Google security, use this repo anyway ;)'}
129
- elsif not_found?
130
- return traverse_url(URI(url.clone), version)
131
- elsif redirected?
132
- return { url: redirected_to, message: 'Redirected to:' }
133
- end
134
- end
135
119
 
136
120
  private
137
121
 
138
- def ping(uri = URI(url), force = false)
139
- begin
140
- @res = Net::HTTP.get_response(uri) if @res.nil? || force
141
- rescue SocketError
142
- raise NoConnection
143
- end
144
- @res
145
- end
146
-
147
122
  def get_key
148
123
  @repo.to_hash.keys.delete_if {|k| k == '0'}.pop
149
124
  end
150
-
151
- def traverse_url(uri, version)
152
- uri.path = File.dirname(uri.path)
153
-
154
- return {url: '', message: 'None, try to find it manually'} if uri.path == '/'
155
-
156
- uri.path += '/'
157
- ping(uri, true)
158
-
159
- if not_found?
160
- return traverse_url(uri, version)
161
- elsif available?
162
- return {url: uri.to_s, message: 'Override with this one' } if uri.path =~ Regexp.new(version) && !search_repo(version).empty?
163
-
164
- path = search_path(version)
165
- if path.empty?
166
- return traverse_url(uri, version)
167
- else
168
- return traverse_url_forward(uri, version) if search_repo(version).empty?
169
-
170
- uri.path += extract_path(path)
171
- return {url: uri.to_s, message: 'Override with this one' }
172
- end
173
-
174
- end
175
-
176
- end
177
-
178
- def traverse_url_forward(uri, version)
179
- ping(uri, true)
180
-
181
- if search_repo(version).empty?
182
-
183
- path = search_path(version)
184
- if path.empty?
185
- return {url: '', message: 'Can\'t find anything similar, try manually!' }
186
- else
187
- uri.path += extract_path(path)
188
- return traverse_url_forward(uri, version)
189
- end
190
- else
191
- return {url: uri.to_s, message: 'Override with this one' }
192
- end
193
- end
194
-
195
- def search_path(version)
196
- ping.body.to_s.scan(Regexp.new("href=\"[^\"]*#{version}[^\"]*\"")).delete_if { |x| x =~ Regexp.new("\"#{URI(url).path}\"") }.uniq
197
- end
198
-
199
- def search_repo(version)
200
- ping.body.to_s.scan(Regexp.new("href=\"[^\"]*#{version}[^\"]*\.repo\"|repodata/")).uniq
201
- end
202
-
203
- def extract_path(path)
204
- "#{path.pop.scan(/href="(.*)"/).pop.pop}"
205
- end
206
-
207
125
  end
208
126
 
127
+
209
128
  end
210
129
  end
@@ -0,0 +1,196 @@
1
+ require 'delegate'
2
+ require 'net/http'
3
+
4
+ module Zypper
5
+ module Upgraderepo
6
+
7
+
8
+ class PageRequest < SimpleDelegator
9
+
10
+ attr_reader :page
11
+
12
+ USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'
13
+
14
+ def initialize(obj, timeout = 60)
15
+ super obj
16
+ @timeout = timeout
17
+ end
18
+
19
+ def available?
20
+ ping.is_a?(Net::HTTPSuccess)
21
+ end
22
+
23
+ def redirected?
24
+ ping.is_a?(Net::HTTPRedirection)
25
+ end
26
+
27
+ def redirected_to
28
+ ping['location']
29
+ end
30
+
31
+ def not_found?
32
+ ping.is_a?(Net::HTTPNotFound)
33
+ end
34
+
35
+ def forbidden?
36
+ ping.is_a?(Net::HTTPForbidden)
37
+ end
38
+
39
+ def timeout?
40
+ ping.is_a?(Net::HTTPRequestTimeOut)
41
+ end
42
+
43
+ def status
44
+ ping.class.to_s
45
+ end
46
+
47
+
48
+ private
49
+
50
+ def get_request(uri, head)
51
+ uri ||= repodata_uri
52
+
53
+ if head
54
+ request = Net::HTTP::Head.new(uri.request_uri)
55
+ else
56
+ request = Net::HTTP::Get.new(uri.request_uri)
57
+ end
58
+
59
+ request['User-Agent'] = USER_AGENT
60
+
61
+ http = Net::HTTP.new(uri.host, uri.port)
62
+ http.use_ssl = (uri.scheme == "https")
63
+ http.open_timeout = @timeout
64
+
65
+ http.request(request)
66
+ end
67
+
68
+ def ping(uri = nil, head = true)
69
+ begin
70
+ if @page.nil? || uri
71
+ @page = get_request(uri, head)
72
+ end
73
+ rescue SocketError
74
+ raise NoConnection
75
+ rescue Net::OpenTimeout
76
+ @page = Net::HTTPRequestTimeOut.new('1.1', '', '')
77
+ end
78
+ @page
79
+ end
80
+
81
+ end
82
+
83
+
84
+ class RepositoryRequest < PageRequest
85
+
86
+ def evaluate_alternative(version)
87
+
88
+ if not_found?
89
+ return traverse_url(URI(url), version)
90
+ elsif redirected?
91
+ return { url: redirected_to, message: 'Redirected to:' }
92
+ end
93
+ end
94
+
95
+
96
+ private
97
+
98
+ def traverse_url(uri, version)
99
+ ping(uri)
100
+
101
+ if forbidden?
102
+ res = { url: url, message: 'Can\'t navigate through the repository!' }
103
+ elsif available? && uri.to_s =~ /#{version}/
104
+ res = traverse_url_forward(uri, version)
105
+ else
106
+ res = traverse_url_backward(uri, version)
107
+ end
108
+
109
+ res || { url: '', message: 'Can\'t find a valid alternative, try manually!' }
110
+ end
111
+
112
+ def traverse_url_backward(uri, version)
113
+ uri.path = File.dirname(uri.path)
114
+
115
+ return nil if uri.path == '/' || uri.path == '.'
116
+
117
+ uri.path += '/' if uri.path[-1] != '/'
118
+ ping(uri, false)
119
+
120
+ if not_found?
121
+ return traverse_url_backward(uri, version)
122
+ elsif available?
123
+
124
+ if uri.path =~ /#{version}/ && repodata?
125
+ return {url: uri.to_s, message: 'Override with this one' }
126
+ elsif res = traverse_url_forward(uri, version, !(uri.path =~ /#{version}/))
127
+ return res
128
+ else
129
+ return traverse_url_backward(uri, version)
130
+ end
131
+
132
+ elsif forbidden?
133
+ return { url: uri.to_s, message: 'Try to replace with this one' } if repodata?(uri)
134
+
135
+ return traverse_url_backward(uri, version)
136
+ end
137
+
138
+ nil
139
+ end
140
+
141
+ def traverse_url_forward(uri, version, check_version = false)
142
+ uri.path += '/' if uri.path[-1] != '/'
143
+ ping(uri, false)
144
+
145
+ subfolders(version, check_version).each do |dir|
146
+ u = URI(uri.to_s)
147
+ u.path += dir
148
+
149
+ if repodata?(u)
150
+ return {url: u.to_s, message: 'Override with this one' }
151
+ else
152
+ res = traverse_url_forward(u, version)
153
+ return res if res.class == Hash
154
+ end
155
+ end
156
+
157
+ nil
158
+ end
159
+
160
+ def repodata_uri(uri = nil)
161
+ if uri
162
+ uri = URI(uri.to_s)
163
+ else
164
+ uri = URI(url)
165
+ end
166
+
167
+ uri.path = uri.path.gsub(/\/$/, '') + '/repodata/repomd.xml'
168
+
169
+ uri
170
+ end
171
+
172
+ def repodata?(uri = nil)
173
+ if uri.nil?
174
+ return ping.body.to_s.scan(Regexp.new("href=\"repodata/")).empty?
175
+ else
176
+ ping(repodata_uri(uri))
177
+ return available?
178
+ end
179
+ end
180
+
181
+ def subfolders(version, check_version)
182
+ res = ping.body.to_s.scan(Regexp.new('href=[\'\"][^\/\"]+\/[\'\"]')).delete_if do |x|
183
+ x =~ /^\// || x =~ /^\.\./ || x =~ /\:\/\// || x =~ /href=[\"\'](media\.1|boot|EFI)\/[\"\']/
184
+ end.uniq.map do |d|
185
+ d.scan(/href=[\"\']([^"]+)[\'\"]/).pop.pop
186
+ end
187
+
188
+ res = res.delete_if { |x| !(x =~ /#{version}/) } if check_version
189
+
190
+ res
191
+ end
192
+ end
193
+
194
+
195
+ end
196
+ end
@@ -31,6 +31,8 @@ module Zypper
31
31
  def self.error(e)
32
32
  if e.class == String
33
33
  puts ' [E] '.bold.red + e
34
+ elsif e.class == Interruption
35
+ STDERR.puts e.message =~ /\(/ ? e.message.gsub(/.*\((.*)\).*/, '\1').green : e.message.green
34
36
  else
35
37
  STDERR.puts 'Error! '.bold.red + e.message
36
38
  end
@@ -46,96 +48,13 @@ module Zypper
46
48
 
47
49
  end
48
50
 
49
- class TableView
50
-
51
- def self.available(num, repo, max_col)
52
- Messages.ok("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} |")
53
- end
54
-
55
- def self.redirected(num, repo, max_col, redirected)
56
- Messages.warning("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} | #{'Redirection'.bold.yellow} of #{repo.url} ")
57
- puts " #{' ' * 3} | #{' ' * 2} | #{ ' ' * max_col} | #{ ' ' * 3 } | #{'To:'.bold.yellow} #{redirected}"
58
- end
59
-
60
- def self.not_found(num, repo, max_col)
61
- Messages.error("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} |")
62
- end
63
-
64
- def self.alternative(num, repo, max_col, alt)
65
- Messages.error("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} | #{alt[:message].bold.yellow}")
66
- puts " #{' ' * 3} | #{' ' * 2} | #{' ' * max_col} | #{' ' * 3} | #{alt[:url]}" unless alt[:url].to_s.empty?
67
- end
68
-
69
- def self.separator
70
- puts '-' * 90
71
- end
72
-
73
- def self.header(max_col)
74
- puts " St. | # | #{'Name'.ljust(max_col, ' ')} | En. | Hint"
75
- end
76
-
77
- def self.footer
78
- self.separator
79
- end
80
- end
81
-
82
-
83
- class ReportView
84
-
85
- def self.available(num, repo, max_col)
86
- puts " #{num.to_s.rjust(2).bold.green} | Status: #{'Ok'.bold.green}"
87
- self.info(repo)
88
- end
89
-
90
- def self.redirected(num, repo, max_col, redirected)
91
- puts " #{num.to_s.rjust(2).bold.yellow} | Status: #{'Redirected'.bold.yellow}"
92
- puts " #{' ' * 2} | #{'To:'.bold.yellow} #{redirected}"
93
- self.info(repo)
94
- end
95
-
96
- def self.not_found(num, repo, max_col)
97
- puts " #{num.to_s.rjust(2).bold.red} | Status: #{'Not Found'.bold.red}"
98
- self.info(repo)
99
- end
100
-
101
- def self.alternative(num, repo, max_col, alt)
102
- puts " #{num.to_s.rjust(2).bold.red} | Status: #{'Not Found'.bold.red}"
103
- puts " #{' ' * 2} | Hint: #{alt[:message].bold.yellow}"
104
- puts " #{' ' * 2} | #{'Suggested:'.bold.yellow} #{alt[:url]}" unless alt[:url].to_s.empty?
105
- self.info(repo)
106
- end
107
-
108
- def self.separator
109
- puts '-' * 90
110
- end
111
-
112
- def self.header(max_col)
113
- puts " # | Report"
114
- end
115
-
116
- def self.footer
117
- self.separator
118
- end
119
-
120
- private
121
-
122
- def self.info(repo)
123
- puts " #{ ' ' * 2 } | Name: #{repo.name}"
124
- puts " #{ ' ' * 2 } | Alias: #{repo.alias}"
125
- puts " #{ ' ' * 2 } | Url: #{repo.url}"
126
- puts " #{ ' ' * 2 } | Priority: #{repo.priority}"
127
- puts " #{ ' ' * 2 } | #{repo.enabled? ? 'Enabled: Yes' : 'Enabled: No'.yellow}"
128
- puts " #{ ' ' * 2 } | Filename: #{repo.filename}"
129
- end
130
- end
131
-
132
51
 
133
52
  class ReleaseFileNotFound < StandardError
134
53
  def initialize
135
54
  super 'The release file is not found.'
136
55
  end
137
56
  end
138
-
57
+
139
58
  class InvalidVersion < StandardError
140
59
  def initialize(version)
141
60
  super "The version #{version} is not valid"
@@ -159,5 +78,15 @@ module Zypper
159
78
  super 'Internet connection has some trouble'
160
79
  end
161
80
  end
81
+
82
+ class Interruption < StandardError
83
+ def initialize
84
+ super 'Ok ok... Exiting!'
85
+ end
86
+ end
87
+
88
+ Signal.trap('INT') { raise Interruption }
89
+
90
+ Signal.trap('TERM') { raise Interruption }
162
91
  end
163
92
  end
@@ -1,5 +1,5 @@
1
1
  module Zypper
2
2
  module Upgraderepo
3
- VERSION = "1.1.0"
3
+ VERSION = "1.2.0"
4
4
  end
5
5
  end
@@ -0,0 +1,126 @@
1
+ module Zypper
2
+ module Upgraderepo
3
+
4
+ module View
5
+
6
+ class Report
7
+
8
+ def self.available(num, repo, max_col)
9
+ puts " #{num.to_s.rjust(2).bold.green} | Status: #{'Ok'.bold.green}"
10
+ self.info(repo)
11
+ end
12
+
13
+ def self.redirected(num, repo, max_col, redirected)
14
+ puts " #{num.to_s.rjust(2).bold.yellow} | Status: #{'Redirected'.bold.yellow}"
15
+ puts " #{' ' * 2} | #{'To:'.bold.yellow} #{redirected}"
16
+ self.info(repo)
17
+ end
18
+
19
+ def self.not_found(num, repo, max_col)
20
+ puts " #{num.to_s.rjust(2).bold.red} | Status: #{'Not Found'.bold.red}"
21
+ self.info(repo)
22
+ end
23
+
24
+ def self.alternative(num, repo, max_col, alt)
25
+ puts " #{num.to_s.rjust(2).bold.red} | Status: #{'Not Found'.bold.red}"
26
+ puts " #{' ' * 2} | Hint: #{alt[:message].bold.yellow}"
27
+ puts " #{' ' * 2} | #{'Suggested:'.bold.yellow} #{alt[:url]}" unless alt[:url].to_s.empty?
28
+ self.info(repo)
29
+ end
30
+
31
+ def self.timeout(num, repo, max_col)
32
+ puts " #{num.to_s.rjust(2).bold.yellow} | Status: #{'Server Timeout'.bold.yellow}"
33
+ self.info(repo)
34
+ end
35
+
36
+ def self.upgraded(num, repo, max_col)
37
+ puts " #{num.to_s.rjust(2).bold.green} | #{'Upgraded'.bold.green}" #{'Upgraded from:'.bold.green} #{repo.old_url}"
38
+ #puts " #{' ' * 2} | Old Name: #{old_data[:name].yellow}" if old_data[:name] != repo.name
39
+ #puts " #{' ' * 2} | Old Alias: #{old_data[:alias].yellow}" if old_data[:alias] != repo.alias
40
+
41
+ #puts " #{' ' * 2} | Old URL: #{repo.old_url}"
42
+ self.info(repo)
43
+ end
44
+
45
+ def self.untouched(num, repo, max_col)
46
+ puts " #{num.to_s.rjust(2).bold.yellow} | #{'Untouched'.bold.yellow}"
47
+ self.info(repo)
48
+ end
49
+
50
+ def self.separator
51
+ puts '-' * 90
52
+ end
53
+
54
+ def self.header(max_col)
55
+ puts " # | Report"
56
+ end
57
+
58
+ def self.footer
59
+ self.separator
60
+ end
61
+
62
+
63
+ private
64
+
65
+ def self.info(repo)
66
+ puts " #{ ' ' * 2 } | Name: #{repo.name} #{repo.upgraded?(:name) ? '(' + repo.old_name.yellow + ')' : '' }"
67
+ puts " #{ ' ' * 2 } | Alias: #{repo.alias} #{repo.upgraded?(:alias) ? '(' + repo.old_alias.yellow + ')' : ''}"
68
+ puts " #{ ' ' * 2 } | Url: #{repo.url}"
69
+ puts " #{ ' ' * 2 } | (#{repo.old_url.yellow})" if repo.upgraded?
70
+ puts " #{ ' ' * 2 } | Priority: #{repo.priority}"
71
+ puts " #{ ' ' * 2 } | #{repo.enabled? ? 'Enabled: Yes' : 'Enabled: No'.yellow}"
72
+ puts " #{ ' ' * 2 } | Filename: #{repo.filename}"
73
+ end
74
+ end
75
+
76
+
77
+ class Table
78
+
79
+ def self.available(num, repo, max_col)
80
+ Messages.ok("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} |")
81
+ end
82
+
83
+ def self.redirected(num, repo, max_col, redirected)
84
+ Messages.warning("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} | #{'Redirection'.bold.yellow} of #{repo.url} ")
85
+ puts " #{' ' * 3} | #{' ' * 2} | #{ ' ' * max_col} | #{ ' ' * 3 } | #{'To:'.bold.yellow} #{redirected}"
86
+ end
87
+
88
+ def self.not_found(num, repo, max_col)
89
+ Messages.error("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} |")
90
+ end
91
+
92
+ def self.alternative(num, repo, max_col, alt)
93
+ Messages.error("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} | #{alt[:message].bold.yellow}")
94
+ puts " #{' ' * 3} | #{' ' * 2} | #{' ' * max_col} | #{' ' * 3} | #{alt[:url]}" unless alt[:url].to_s.empty?
95
+ end
96
+
97
+ def self.timeout(num, repo, max_col)
98
+ Messages.error("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} | #{'Server Timeout'.bold.yellow}")
99
+ end
100
+
101
+ def self.upgraded(num, repo, max_col) #, old_data)
102
+ Messages.ok("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} | #{'From:'.bold.green} #{repo.old_url}")
103
+ puts " #{' ' * 3} | #{' ' * 2} | #{' ' * max_col} | #{' ' * 3} | #{'To:'.bold.green} #{repo.url}"
104
+ end
105
+
106
+ def self.untouched(num, repo, max_col)
107
+ Messages.warning("| #{num.to_s.rjust(2)} | #{repo.name.ljust(max_col, ' ')} | #{repo.enabled? ? ' Y ' : ' N '.yellow} | #{'Untouched:'.bold.yellow} #{repo.old_url}")
108
+ end
109
+
110
+ def self.separator
111
+ puts '-' * 90
112
+ end
113
+
114
+ def self.header(max_col, upgrade = false)
115
+ puts " St. | # | #{'Name'.ljust(max_col, ' ')} | En. | #{upgrade ? 'Details' : 'Hint' }"
116
+ end
117
+
118
+ def self.footer
119
+ self.separator
120
+ end
121
+ end
122
+
123
+ end
124
+
125
+ end
126
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zypper-upgraderepo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Mucciante
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-03 00:00:00.000000000 Z
11
+ date: 2018-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -105,15 +105,17 @@ files:
105
105
  - lib/zypper/upgraderepo/cli.rb
106
106
  - lib/zypper/upgraderepo/os_release.rb
107
107
  - lib/zypper/upgraderepo/repository.rb
108
+ - lib/zypper/upgraderepo/request.rb
108
109
  - lib/zypper/upgraderepo/utils.rb
109
110
  - lib/zypper/upgraderepo/version.rb
111
+ - lib/zypper/upgraderepo/view.rb
110
112
  - zypper-upgraderepo.gemspec
111
113
  homepage: https://github.com/fabiomux/zypper-upgraderepo
112
114
  licenses:
113
115
  - GPL-3.0
114
116
  metadata:
115
117
  bug_tracker_uri: https://github.com/fabiomux/zypper-upgraderepo/issues
116
- documentation_uri: https://www.rubydoc.info/gems/zypper-upgraderepo/1.1.0
118
+ documentation_uri: https://www.rubydoc.info/gems/zypper-upgraderepo/1.2.0
117
119
  homepage_uri: https://github.com/fabiomux/zypper-upgraderepo
118
120
  source_code_uri: https://github.com/fabiomux/zypper-upgraderepo
119
121
  wiki_uri: https://github.com/fabiomux/zypper-upgraderepo/wiki