/
updater.rb
executable file
·147 lines (117 loc) · 3.01 KB
/
updater.rb
1
2
3
4
5
6
7
8
9
10
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/usr/bin/env ruby1.9
require 'tmpdir'
require 'date'
require 'iconv'
class String
def quote
gsub(/([$"\\])/, '\\\\\1')
end
end
class NginxUpdater
module Config
NGINX_SRC_PATH = ARGV[0]
TMP_DIR_SUFFIX = "nginx-updater"
AUTHOR = "Igor Sysoev <igor@sysoev.ru>"
end
class Version < Array
def to_s
"#{self[0]}.#{self[1]}.#{self[2]}"
end
def url
"http://sysoev.ru/nginx/nginx-#{self}.tar.gz"
end
end
def initialize
@ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
@branches = ["0.7", "0.8", "0.9"]
ENV["GIT_DIR"] = "#{Config::NGINX_SRC_PATH}.git/"
end
def run
Dir.chdir(Config::NGINX_SRC_PATH)
unless `git st` =~ /working directory clean/
warn "error: working directory is not clean"
return 1
end
@branches.each do |branch|
update_branch branch
end
return 0
end
def update_branch git_branch
git_checkout(git_branch)
while true do
get_latest
current = guess_current_nginx_version
puts "Current version is #{current}"
nxt = guess_next_version(current)
unless nxt
puts "Current version is the latest"
return
end
puts "Next version is #{nxt}"
prepare_temp_dir
get_version nxt
changes = get_changes nxt
commit nxt, changes["message"], changes["date"]
end
end
def prepare_temp_dir
@tmp = "#{Dir.tmpdir}/#{Config::TMP_DIR_SUFFIX}"
FileUtils.rm_rf(@tmp)
FileUtils.mkdir_p(@tmp)
end
def guess_next_version v
n = v.dup
found = nil
misses = 0
while misses < 3
n[2] += 1
if check_version(n)
return n
end
misses += 1
end
found
end
def check_version v
puts "..checking for #{v}"
!!`curl -sI #{v.url}`.match(/200 OK/)
end
def get_version v
`curl -so #{@tmp}/nginx.tar.gz #{v.url}`
`tar -xzf #{@tmp}/nginx.tar.gz -C #{@tmp}`
end
def get_changes v
changes = @ic.iconv(File.read("#{@tmp}/nginx-#{v}/CHANGES"))
changes.scan(/^Changes\s+with\s+nginx\s+(\d+\.\d+\.\d+)\s+(\d+\s+\w+\s+\d+)\n(.+?)\n\n\n/m) do |m|
unless m[0] == v.to_s
next
end
return {
"date" => Date.parse(m[1]),
"message" => m[2]
}
end
nil
end
def commit v, message, date
ENV["GIT_AUTHOR_DATE"] = date.strftime("%Y-%m-%d 12:00:00")
system(%Q{
cd #{@tmp}/nginx-#{v}/
git add . && git add -u . && git status
git commit --author="#{Config::AUTHOR}" --message="nginx #{v}\n\n#{message.quote}"
git tag #{v}
})
end
def git_checkout branch
system("git checkout #{branch} && git reset --hard && git clean -f -d")
end
def get_latest
system("git reset --hard && git clean -f -d")
end
def guess_current_nginx_version
source = File.read("src/core/nginx.h")
Version.new(source.scan(/#define\s+NGINX_VERSION\s+"(\d+)\.(\d+)\.(\d+)"/)[0].map{ |v| v.to_i })
end
end
exit NginxUpdater.new.run