dr 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/bin/dr CHANGED
@@ -539,6 +539,45 @@ class RepoCLI < ExtendedThor
539
539
  end
540
540
 
541
541
 
542
+ desc "suite-diff", "Show the differences between packages in two suites"
543
+ def suite_diff(first, second)
544
+ repo = get_repo_handle
545
+
546
+ first = repo.codename_to_suite first
547
+ if !first
548
+ log :err, "Can't find the #{first.fg 'blue'} suite in this repo"
549
+ raise "Suite doesn't exist"
550
+ end
551
+
552
+ second = repo.codename_to_suite second
553
+ if !second
554
+ log :err, "Can't find the #{second.fg 'blue'} suite in this repo"
555
+ raise "Suite doesn't exist"
556
+ end
557
+
558
+ log :info, "Showing the differences between #{first.fg 'green'} and #{second.fg 'red'}"
559
+ repo.list_packages(first).each do |pkg|
560
+ first_v = repo.get_subpackage_versions(pkg.name)[first].values.max
561
+
562
+ if !repo.suite_has_package? second, pkg.name
563
+ log :info, "#{pkg.name.fg 'orange'} is in #{first.fg 'green'} but not in #{second.fg 'red'}"
564
+ next
565
+ end
566
+
567
+ second_v = repo.get_subpackage_versions(pkg.name)[second].values.max
568
+ if Dr::PkgVersion.new(first_v) != Dr::PkgVersion.new(second_v)
569
+ log :info, "#{pkg.name.fg 'orange'} #{first_v.fg 'green'} != #{second_v.fg 'red'}"
570
+ end
571
+ end
572
+
573
+ repo.list_packages(second).each do |pkg|
574
+ if !repo.suite_has_package? first, pkg.name
575
+ log :info, "#{pkg.name.fg 'orange'} is in #{second.fg 'red'} but not in #{first.fg 'green'}"
576
+ end
577
+ end
578
+ end
579
+
580
+
542
581
  desc "force-sync", "Force cloning the sources repository from scratch again"
543
582
  method_option :url, :aliases => "-u", :type => :string,
544
583
  :desc => "The URL to clone from"
File without changes
data/lib/dr/pkgversion.rb CHANGED
@@ -1,30 +1,49 @@
1
- # Copyright (C) 2014 Kano Computing Ltd.
2
- # License: http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
1
+ # Copyright (C) 2014, 2015 Kano Computing Ltd.
2
+ # License: http://www.gnu.org/licenses/gpl-2.0.txt GNU GPL v2
3
3
 
4
4
  module Dr
5
5
  class PkgVersion
6
- attr_accessor :upstream, :debian, :date, :build
6
+ attr_accessor :epoch, :upstream, :debian, :date, :build
7
7
 
8
8
  def initialize(version_string)
9
- @upstream = nil
10
- @debian = nil
11
- @date = nil
12
- @build = 0
9
+ @epoch = 0 # integer
10
+ @upstream = "" # string
11
+ @debian = "" # string
12
+ @date = 0 # integer
13
+ @build = 0 # integer
13
14
 
14
- v = version_string.split "-"
15
- @upstream = v[0] if v.length > 0
15
+ v = version_string.split ":"
16
16
  if v.length > 1
17
- dv = v[1].split "."
17
+ @epoch = v[0].to_i
18
+ version_string = v[1..-1].join ":"
19
+ end
18
20
 
19
- @debian = dv[0] if dv.length > 0
20
- if dv.length > 1
21
- if dv[1] =~ /^[0-9]{8}/
22
- @date = dv[1][0..7]
23
- end
21
+ v = version_string.split "-"
22
+ if v.length == 1
23
+ @upstream = version_string
24
+ else
25
+ @upstream = v[0...-1].join "-"
24
26
 
25
- match = dv[1].match /build([0-9]+)$/
26
- if match
27
- @build = match.captures[0]
27
+ # Check whether the is a build tag in the debian version
28
+ dv = v[-1].split "."
29
+ if dv.length == 1
30
+ @debian = v[-1]
31
+ else
32
+ @debian = dv[0]
33
+
34
+ build_tag = dv[1..-1].join "."
35
+
36
+ if build_tag =~ /^[0-9]{8}/
37
+ @date = dv[1][0..7].to_i
38
+
39
+ match = dv[1].match(/build([0-9]+)$/)
40
+ if match
41
+ @build = match.captures[0].to_i
42
+ end
43
+ else
44
+ # The part behind the '.' isn't a valid build tag,
45
+ # append the string back to debian version.
46
+ @debian << '.' << build_tag
28
47
  end
29
48
  end
30
49
  end
@@ -41,35 +60,40 @@ module Dr
41
60
  end
42
61
 
43
62
  def <(o)
44
- self.to_s < o.to_s
63
+ compare(o) < 0
64
+ end
65
+
66
+ def >(o)
67
+ compare(o) > 0
45
68
  end
46
69
 
47
70
  def <=(o)
48
- self.to_s <= o.to_s
71
+ compare(o) <= 0
72
+ end
73
+
74
+ def >=(o)
75
+ compare(o) >= 0
49
76
  end
50
77
 
51
78
  def ==(o)
52
- self.to_s == o.to_s
79
+ compare(o) == 0
53
80
  end
54
81
 
55
82
  def to_s
56
83
  v = @upstream.clone
57
- if @debian
84
+
85
+ if @epoch > 0
86
+ v = "#{@epoch}:{v}"
87
+ end
88
+
89
+ if @debian.length > 0
58
90
  v << "-#{@debian}"
59
- else
60
- v << "-0"
61
91
  end
62
92
 
63
- if @date
93
+ if @date > 0
64
94
  v << ".#{@date}"
65
- else
66
- v << ".#{today}"
67
- end
68
95
 
69
- if @build > 0
70
- if @build < 10
71
- v << "build0#{@build}"
72
- else
96
+ if @build > 0
73
97
  v << "build#{@build}"
74
98
  end
75
99
  end
@@ -79,7 +103,8 @@ module Dr
79
103
 
80
104
  def source
81
105
  v = "#{upstream}"
82
- v << "-#{debian}" if @debian
106
+ v = "#{epoch}:#{v}" if @epoch > 0
107
+ v << "-#{debian}" if @debian.length > 0
83
108
  v
84
109
  end
85
110
 
@@ -87,5 +112,88 @@ module Dr
87
112
  def today
88
113
  Time.now.strftime "%Y%m%d"
89
114
  end
115
+
116
+ def compare(o)
117
+ return @epoch <=> o.epoch if @epoch != o.epoch
118
+
119
+ result = debian_version_string_compare @upstream, o.upstream
120
+ return result if result != 0
121
+
122
+ result = debian_version_string_compare @debian, o.debian
123
+ return result if result != 0
124
+
125
+ result = @date <=> o.date
126
+ return result if result != 0
127
+
128
+ @build <=> o.build
129
+ end
130
+
131
+ # Compare two version strings (either upstream or debian versions)
132
+ # in the Debian way
133
+ def debian_version_string_compare(str1, str2)
134
+ phase = :string
135
+ while true
136
+ return 0 if str1.length == 0 && str2.length == 0
137
+ return -1 if str1.length == 0
138
+ return 1 if str2.length == 0
139
+
140
+ if phase == :digit
141
+ part1 = str1.match(/^[0-9]*/)[0]
142
+ str1 = str1.sub(/^[0-9]*/, "")
143
+
144
+ part2 = str2.match(/^[0-9]*/)[0]
145
+ str2 = str2.sub(/^[0-9]*/, "")
146
+
147
+ result = part1.to_i <=> part2.to_i
148
+ return result if result != 0
149
+ phase = :string
150
+ else
151
+ part1 = str1.match(/^[^0-9]*/)[0]
152
+ str1 = str1.sub(/^[^0-9]*/, "")
153
+
154
+ part2 = str2.match(/^[^0-9]*/)[0]
155
+ str2 = str2.sub(/^[^0-9]*/, "")
156
+
157
+ result = debian_string_compare part1, part2
158
+ return result if result != 0
159
+ phase = :digit
160
+ end
161
+ end
162
+ end
163
+
164
+ # Compare two strings without any digits in the Debian way
165
+ def debian_string_compare(str1, str2)
166
+ return 0 if str1.length == 0 && str2.length == 0
167
+ return -1 if str1.length == 0
168
+ return 1 if str2.length == 0
169
+
170
+ c1 = str1[0]
171
+ c2 = str2[0]
172
+
173
+ # Both characters are letters and are not equal
174
+ # -> compare them and return the result
175
+ return c1 <=> c2 if is_letter(c1) && is_letter(c2) && c1 != c2
176
+
177
+ # Both characters are non-letters and are not equal
178
+ # We need to sort out ~ being less than everything
179
+ if !is_letter(c1) && !is_letter(c2)
180
+ if c1 != c2
181
+ return -1 if c1 == '~'
182
+ return 1 if c2 == '~'
183
+ return c1 <=> c2
184
+ end
185
+ end
186
+
187
+ # If one is a letter and one isn't, non-letter is always smaller
188
+ return -1 if !is_letter(c1) && is_letter(c2)
189
+ return 1 if is_letter(c1) && !is_letter(c2)
190
+
191
+ # The characters are equal, compare the rest of the string
192
+ return debian_string_compare str1[1..-1], str2[1..-1]
193
+ end
194
+
195
+ def is_letter(str)
196
+ (str =~ /[a-z]/i) != nil
197
+ end
90
198
  end
91
199
  end
data/lib/dr/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # License: http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
3
3
 
4
4
  module Dr
5
- VERSION = "1.0.1"
5
+ VERSION = "1.0.2"
6
6
  end
@@ -0,0 +1,180 @@
1
+ # Tests for the PkgVersion class
2
+ #
3
+ # Copyright (C) 2015 Kano Computing Ltd.
4
+ # License: http://www.gnu.org/licenses/gpl-2.0.txt GNU GPL v2
5
+
6
+ require 'dr/pkgversion'
7
+
8
+ describe Dr do
9
+ describe 'PkgVersion' do
10
+ describe "compare based on epoch" do
11
+ it "works when smaller" do
12
+ one = Dr::PkgVersion.new('1:1.5-1')
13
+ two = Dr::PkgVersion.new('2:1.5-1')
14
+
15
+ expect(one < two).to be_true
16
+ end
17
+
18
+ it "works when equal" do
19
+ one = Dr::PkgVersion.new('1:2.7-2')
20
+ two = Dr::PkgVersion.new('1:2.7-2')
21
+
22
+ expect(one == two).to be_true
23
+ end
24
+
25
+ it "works when smaller" do
26
+ one = Dr::PkgVersion.new('2:3.6-1')
27
+ two = Dr::PkgVersion.new('1:3.5')
28
+
29
+ expect(one > two).to be_true
30
+ end
31
+ end
32
+
33
+ describe "compare based on upstram version" do
34
+ it "works when epoch is equal" do
35
+ one = Dr::PkgVersion.new('1:1.5-1')
36
+ two = Dr::PkgVersion.new('1:1.6-1')
37
+
38
+ expect(one < two).to be_true
39
+ end
40
+
41
+ it "works when smaller" do
42
+ one = Dr::PkgVersion.new('1-1')
43
+ two = Dr::PkgVersion.new('2')
44
+
45
+ expect(one < two).to be_true
46
+ end
47
+
48
+ it "works when smaller with string inbetween" do
49
+ one = Dr::PkgVersion.new('1.5')
50
+ two = Dr::PkgVersion.new('1.16-5')
51
+
52
+ expect(one < two).to be_true
53
+ end
54
+
55
+ it "works when equal" do
56
+ one = Dr::PkgVersion.new('1.5-5')
57
+ two = Dr::PkgVersion.new('1.5-5')
58
+
59
+ expect(one == two).to be_true
60
+ end
61
+
62
+ it "equal with no debian version" do
63
+ one = Dr::PkgVersion.new('15')
64
+ two = Dr::PkgVersion.new('15')
65
+
66
+ expect(one == two).to be_true
67
+ end
68
+
69
+ it "works when bigger" do
70
+ one = Dr::PkgVersion.new('6.5')
71
+ two = Dr::PkgVersion.new('1.16-5')
72
+
73
+ expect(one > two).to be_true
74
+ end
75
+ end
76
+
77
+ describe "compare based on debian version" do
78
+ it "smaller comparison" do
79
+ one = Dr::PkgVersion.new('1.5-1')
80
+ two = Dr::PkgVersion.new('1.5-2')
81
+
82
+ expect(one < two).to be_true
83
+ end
84
+
85
+ it "equal comparison" do
86
+ one = Dr::PkgVersion.new('1.5-2')
87
+ two = Dr::PkgVersion.new('1.5-2')
88
+
89
+ expect(one == two).to be_true
90
+ end
91
+
92
+ it "bigger comparison" do
93
+ one = Dr::PkgVersion.new('1.5-11')
94
+ two = Dr::PkgVersion.new('1.5-9')
95
+
96
+ expect(one > two).to be_true
97
+ end
98
+
99
+ it "substring comparison" do
100
+ one = Dr::PkgVersion.new('1.5-111')
101
+ two = Dr::PkgVersion.new('1.5-11')
102
+
103
+ expect(one > two).to be_true
104
+ end
105
+ end
106
+
107
+ describe "build tags" do
108
+ it "build date parsed correctly" do
109
+ v = Dr::PkgVersion.new('1.5-1.20150323')
110
+ expect(v.date).to eq 20150323
111
+ end
112
+
113
+ it "build number parsed correctly" do
114
+ v = Dr::PkgVersion.new('1.5-1.20150323build9')
115
+ expect(v.build).to eq 9
116
+ end
117
+
118
+ it "debian version parsed correctly with build tag" do
119
+ v = Dr::PkgVersion.new('1.5-7.20150323build9')
120
+ expect(v.debian).to eq "7"
121
+ end
122
+
123
+ it "debian version includes malformed build tag" do
124
+ v = Dr::PkgVersion.new('1.5-7.a20150323build9')
125
+ expect(v.debian).to eq "7.a20150323build9"
126
+ end
127
+ end
128
+
129
+ describe "comparison with build tags" do
130
+ it "smaller date" do
131
+ one = Dr::PkgVersion.new('1.5-7.20150320')
132
+ two = Dr::PkgVersion.new('1.5-7.20150323')
133
+
134
+ expect(one < two).to be_true
135
+ end
136
+
137
+ it "bigger date" do
138
+ one = Dr::PkgVersion.new('1.5-7.20150328')
139
+ two = Dr::PkgVersion.new('1.5-7.20150323')
140
+
141
+ expect(one > two).to be_true
142
+ end
143
+
144
+ it "equal dates" do
145
+ one = Dr::PkgVersion.new('1.5-7.20150328')
146
+ two = Dr::PkgVersion.new('1.5-7.20150328')
147
+
148
+ expect(one == two).to be_true
149
+ end
150
+
151
+ it "equal dates with build numbers (smaller)" do
152
+ one = Dr::PkgVersion.new('1.5-7.20150328build1')
153
+ two = Dr::PkgVersion.new('1.5-7.20150328build5')
154
+
155
+ expect(one < two).to be_true
156
+ end
157
+
158
+ it "equal dates with build numbers (equal)" do
159
+ one = Dr::PkgVersion.new('1.5-7.20150328build15')
160
+ two = Dr::PkgVersion.new('1.5-7.20150328build15')
161
+
162
+ expect(one == two).to be_true
163
+ end
164
+
165
+ it "equal dates with build numbers (bigger)" do
166
+ one = Dr::PkgVersion.new('1.5-7.20150328build15')
167
+ two = Dr::PkgVersion.new('1.5-7.20150328build5')
168
+
169
+ expect(one > two).to be_true
170
+ end
171
+
172
+ it "build number substrings" do
173
+ one = Dr::PkgVersion.new('1.5-7.20150328build11')
174
+ two = Dr::PkgVersion.new('1.5-7.20150328build111')
175
+
176
+ expect(one < two).to be_true
177
+ end
178
+ end
179
+ end
180
+ end
metadata CHANGED
@@ -1,105 +1,116 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Radek Pazdera
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2015-01-08 00:00:00.000000000 Z
12
+ date: 2015-03-24 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: thor
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - "~>"
19
+ - - ~>
18
20
  - !ruby/object:Gem::Version
19
21
  version: '0.18'
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - "~>"
27
+ - - ~>
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0.18'
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: tco
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - "~>"
35
+ - - ~>
32
36
  - !ruby/object:Gem::Version
33
37
  version: '0.1'
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
- - - "~>"
43
+ - - ~>
39
44
  - !ruby/object:Gem::Version
40
45
  version: '0.1'
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: octokit
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
- - - "~>"
51
+ - - ~>
46
52
  - !ruby/object:Gem::Version
47
53
  version: '3.3'
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
- - - "~>"
59
+ - - ~>
53
60
  - !ruby/object:Gem::Version
54
61
  version: '3.3'
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: bundler
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
- - - "~>"
67
+ - - ~>
60
68
  - !ruby/object:Gem::Version
61
69
  version: '1.5'
62
70
  type: :development
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
- - - "~>"
75
+ - - ~>
67
76
  - !ruby/object:Gem::Version
68
77
  version: '1.5'
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: rake
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
- - - "~>"
83
+ - - ~>
74
84
  - !ruby/object:Gem::Version
75
85
  version: '10.3'
76
86
  type: :development
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
- - - "~>"
91
+ - - ~>
81
92
  - !ruby/object:Gem::Version
82
93
  version: '10.3'
83
94
  - !ruby/object:Gem::Dependency
84
95
  name: rspec
85
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
86
98
  requirements:
87
- - - "~>"
99
+ - - ~>
88
100
  - !ruby/object:Gem::Version
89
101
  version: '3.1'
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
93
106
  requirements:
94
- - - "~>"
107
+ - - ~>
95
108
  - !ruby/object:Gem::Version
96
109
  version: '3.1'
97
- description: |-
98
- dr works with distribution-level packaging
99
- tools and helps you make and distribute your own
100
- Debian packages through your own repository.
101
- This is a super early release, certainly NOT ready
102
- for production.
110
+ description: ! "dr works with distribution-level packaging\n tools
111
+ and helps you make and distribute your own\n Debian packages
112
+ through your own repository.\n This is a super early release,
113
+ certainly NOT ready\n for production."
103
114
  email:
104
115
  - radek@kano.me
105
116
  executables:
@@ -107,14 +118,14 @@ executables:
107
118
  extensions: []
108
119
  extra_rdoc_files: []
109
120
  files:
110
- - ".gitignore"
121
+ - .gitignore
111
122
  - Gemfile
112
123
  - LICENSE.txt
113
124
  - README.md
114
125
  - Rakefile
115
126
  - bin/dr
116
127
  - dr.conf-example
117
- - dr.spec
128
+ - dr.gemspec
118
129
  - lib/dr.rb
119
130
  - lib/dr/build_environments.rb
120
131
  - lib/dr/buildroot.rb
@@ -129,31 +140,33 @@ files:
129
140
  - lib/dr/shellcmd.rb
130
141
  - lib/dr/utils.rb
131
142
  - lib/dr/version.rb
143
+ - spec/pkgversion_spec.rb
132
144
  homepage: http://github.com/KanoComputing/kano-package-system
133
145
  licenses:
134
146
  - GPLv2
135
- metadata: {}
136
147
  post_install_message:
137
148
  rdoc_options: []
138
149
  require_paths:
139
150
  - lib
140
151
  required_ruby_version: !ruby/object:Gem::Requirement
152
+ none: false
141
153
  requirements:
142
- - - ">="
154
+ - - ! '>='
143
155
  - !ruby/object:Gem::Version
144
156
  version: '0'
145
157
  required_rubygems_version: !ruby/object:Gem::Requirement
158
+ none: false
146
159
  requirements:
147
- - - ">="
160
+ - - ! '>='
148
161
  - !ruby/object:Gem::Version
149
162
  version: '0'
150
163
  requirements: []
151
164
  rubyforge_project:
152
- rubygems_version: 2.2.2
165
+ rubygems_version: 1.8.23
153
166
  signing_key:
154
- specification_version: 4
167
+ specification_version: 3
155
168
  summary: dr stands for debian-repository. It is a packaging tool that helps you make,
156
169
  distribute and maintain you own disto packages and repositories. It's in a very
157
170
  early stage, NOT READY for production.
158
- test_files: []
159
- has_rdoc:
171
+ test_files:
172
+ - spec/pkgversion_spec.rb
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 48dfeab96a546a1ea867447378a4db3d2004a87a
4
- data.tar.gz: f9002254094f0d190ce164e74c39118e44a0aaee
5
- SHA512:
6
- metadata.gz: 93d864a9d2c275c1c90bee88d8f2d91c91797659c86648183fb8df996a71ec6563ce801b553775598d3a28e35bd1836ff49270b72c22365e2f0cf21e2d71a244
7
- data.tar.gz: 0eaa169652f489a898171edb18758306c276a46bd149260fb425bf7d94fb7683067dad0e6dd16fd91eb074d19992631d08ad9942ac43bdfa18eb707980bcb6fc