dr 1.0.1 → 1.0.2

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.
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