11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/packageiq/utils.rb', line 11
def self.rpmvercmp(str1, str2)
return 0 if str1 == str2
front_strip_re = /^[^A-Za-z0-9~]+/
while str1.length > 0 or str2.length > 0
str1 = str1.gsub(front_strip_re, '')
str2 = str2.gsub(front_strip_re, '')
if /^~/.match(str1) && /^~/.match(str2)
str1 = str1[1..-1]
str2 = str2[1..-1]
elsif /^~/.match(str1)
return -1
elsif /^~/.match(str2)
return 1
end
break if str1.length == 0 or str2.length == 0
isnum = false
if /^[0-9]+/.match(str1)
if str1 =~ /^[0-9]+/
segment1 = $~.to_s
str1 = $~.post_match
else
segment1 = ''
end
if str2 =~ /^[0-9]+/
segment2 = $~.to_s
str2 = $~.post_match
else
segment2 = ''
end
isnum = true
else
if str1 =~ /^[A-Za-z]+/
segment1 = $~.to_s
str1 = $~.post_match
else
segment1 = ''
end
if str2 =~ /^[A-Za-z]+/
segment2 = $~.to_s
str2 = $~.post_match
else
segment2 = ''
end
end
if segment2.length == 0
return 1 if isnum
return -1
end
if isnum
segment1 = segment1.gsub(/^0+/, '')
segment2 = segment2.gsub(/^0+/, '')
return 1 if segment1.length > segment2.length
return -1 if segment1.length < segment2.length
end
rc = segment1 <=> segment2
return rc if rc != 0
end
if str1.length > str2.length
return 1
elsif str1.length < str2.length
return -1
else
return 0
end
end
|