root/docs/shyouhei/ruby development/merger.rb @ 13582

Revision 13582, 2.7 kB (checked in by shyouhei, 5 years ago)

welcome to 1.8.7 world

Line 
1#! /bin/ruby
2
3require 'date'
4require 'tempfile'
5
6d = Date.today
7v = nil
8p = nil
9system *%w'svn revert version.h'
10open 'version.h', 'rb' do |f|
11  f.each_line do |l|
12    case l
13    when /^#define RUBY_VERSION "(\d)\.(\d)\.(\d)"$/
14      v = $~.captures
15    when /^#define RUBY_PATCHLEVEL (\d+)$/
16      p = $1
17    end
18  end
19end
20
21version_h = <<end
22#define RUBY_VERSION "#{v.join '.'}"
23#define RUBY_RELEASE_DATE "#{d.strftime '%Y-%m-%d'}"
24#define RUBY_VERSION_CODE #{v.join ''}
25#define RUBY_RELEASE_CODE #{d.strftime '%Y%m%d'}
26#define RUBY_PATCHLEVEL #{p.to_i.succ.to_s}
27
28#define RUBY_VERSION_MAJOR #{v[0]}
29#define RUBY_VERSION_MINOR #{v[1]}
30#define RUBY_VERSION_TEENY #{v[2]}
31#define RUBY_RELEASE_YEAR #{d.year}
32#define RUBY_RELEASE_MONTH #{d.month}
33#define RUBY_RELEASE_DAY #{d.day}
34
35#ifdef RUBY_EXTERN
36RUBY_EXTERN const char ruby_version[];
37RUBY_EXTERN const char ruby_release_date[];
38RUBY_EXTERN const char ruby_platform[];
39RUBY_EXTERN const int ruby_patchlevel;
40#endif
41end
42
43case ARGV[0]
44when /\A\d+:\d+\z/
45  r = ['-r', ARGV[0]]
46when /\A\d+\z/
47  r = ['-c', ARGV[0]]
48when nil then
49  puts "#$0 revision"
50  exit
51end
52
53repos = 'svn+ssh://svn@ci.ruby-lang.org/ruby/'
54q = repos + (ARGV[1] || 'branches/ruby_1_8')
55
56log = IO.popen %w'svn diff' + r + %w'--diff-cmd=diff -x -pU0' + [File.join(q, 'ChangeLog')] do |f|
57  f.read
58end
59
60log_svn = log.lines.grep(/^\+\t/).join.gsub(/^\+/, '')
61
62a = %w'svn merge' + r + [q]
63STDERR.puts a.join(' ')
64STDERR.puts log_svn
65
66system(*a)
67if /^\+/ =~ log
68  system *%w'svn revert ChangeLog'
69  IO.popen %w'patch -p 0', 'wb' do |f|
70    f.write log.sub(/\+(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 123][0-9] [012][0-9]:[0-5][0-9]:[0-5][0-9] \d\d\d\d/,
71                    # this format-time-string was from the file local variables of ChangeLog
72                    '+'+Time.now.strftime('%a %b %e %H:%M:%S %Y'))
73  end
74  system *%w'touch ChangeLog' # needed somehow, don't know why...
75else
76  STDERR.puts '*** You should write ChangeLog NOW!!! ***'
77end
78open 'version.h', 'wb' do |f| f.write version_h end
79system *%w'svn resolved version.h'
80
81f = Tempfile.new 'merger.rb'
82f.printf "merge revision(s) %s:\n", ARGV[0]
83f.write log_svn
84f.flush
85f.close
86f.open # avoid gc
87
88loop do
89  system 'svn diff | lv' # explicitly invoke shell
90  STDERR.puts 'conflicts resolved? (y:yes, a:abort, r:retry, otherwise abort)'
91  case STDIN.gets
92  when /\Aa/i then exit
93  when /\Ar/i then redo
94  when /\Ay/i then break
95  else exit
96  end
97end
98
99if system *%w'svn ci -F' + [f.path]
100  x = v.join('_')
101  y = repos + '/branches/ruby_' + x
102  z = 'v' + x + '_' + p.to_i.succ.to_s
103  w = repos + '/tags/' + z
104  system *%w'svn cp -m' + ["add tag #{z}"] + [y, w]
105  system 'rm -f subversion.commitlog'
106else
107  echo 'commit failed; try again.'
108end
109
Note: See TracBrowser for help on using the browser.