Changeset 15404 for docs

Show
Ignore:
Timestamp:
07/07/08 22:06:08 (5 months ago)
Author:
shyouhei
Message:

implement of subcommands

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • docs/shyouhei/ruby development/merger.rb

    r14694 r15404  
    44require 'tempfile' 
    55 
    6 d = Date.today 
    7 v = nil 
    8 p = nil 
    9 system *%w'svn revert version.h' 
    10 open '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 
     6$repos = 'svn+ssh://svn@ci.ruby-lang.org/ruby/' 
     7 
     8def version 
     9  v = nil 
     10  p = nil 
     11  open 'version.h', 'rb' do |f| 
     12    f.each_line do |l| 
     13      case l 
     14      when /^#define RUBY_VERSION "(\d)\.(\d)\.(\d)"$/ 
     15        v = $~.captures 
     16      when /^#define RUBY_PATCHLEVEL (\d+)$/ 
     17        p = $1 
     18      end 
     19    end 
     20  end 
     21  return v, p 
     22end 
     23 
     24def interactive str 
     25  loop do 
     26    yield 
     27    STDERR.puts str 
     28    case STDIN.gets 
     29    when /\Aa/i then exit 
     30    when /\Ar/i then redo 
     31    when /\Ay/i then break 
     32    else exit 
    1733    end 
    1834  end 
    1935end 
    2036 
    21 repos = 'svn+ssh://svn@ci.ruby-lang.org/ruby/' 
    22 q = repos + (ARGV[1] || 'branches/ruby_1_8') 
    23 revs = ARGV[0].split /,\s*/ 
    24 log = '' 
    25 log_svn = '' 
     37def version_up 
     38  d = Date.today 
     39  system *%w'svn revert version.h' 
     40  v, p = version 
    2641 
    27 revs.each do |rev| 
    28   case rev 
    29   when /\A\d+:\d+\z/ 
    30     r = ['-r', rev] 
    31   when /\A\d+\z/ 
    32     r = ['-c', rev] 
    33   when nil then 
    34     puts "#$0 revision" 
    35     exit 
    36   end 
    37  
    38   l = IO.popen %w'svn diff' + r + %w'--diff-cmd=diff -x -pU0' + [File.join(q, 'ChangeLog')] do |f| 
    39     f.read 
    40   end 
    41  
    42   log << l 
    43  
    44   log_svn << l.lines.grep(/^\+\t/).join.gsub(/^\+/, '') 
    45  
    46   a = %w'svn merge' + r + [q] 
    47   STDERR.puts a.join(' ') 
    48  
    49   system(*a) 
    50 end 
    51 if /^\+/ =~ log 
    52   system *%w'svn revert ChangeLog' 
    53   IO.popen %w'patch -p 0', 'wb' do |f| 
    54     f.write log.gsub(/\+(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/, 
    55                     # this format-time-string was from the file local variables of ChangeLog 
    56                     '+'+Time.now.strftime('%a %b %e %H:%M:%S %Y')) 
    57   end 
    58   system *%w'touch ChangeLog' # needed somehow, don't know why... 
    59 else 
    60   STDERR.puts '*** You should write ChangeLog NOW!!! ***' 
    61 end 
    62 open 'version.h', 'r+b' do |f| 
    63   str = f.read 
    64   [%W[RUBY_VERSION      "#{v.join '.'}"], 
    65    %W[RUBY_VERSION_CODE  #{v.join ''}], 
    66    %W[RUBY_VERSION_MAJOR #{v[0]}], 
    67    %W[RUBY_VERSION_MINOR #{v[1]}], 
    68    %W[RUBY_VERSION_TEENY #{v[2]}], 
    69    %W[RUBY_RELEASE_DATE "#{d.strftime '%Y-%m-%d'}"], 
    70    %W[RUBY_RELEASE_CODE  #{d.strftime '%Y%m%d'}], 
    71    %W[RUBY_PATCHLEVEL    #{p.to_i.succ.to_s}], 
    72    %W[RUBY_RELEASE_YEAR  #{d.year}], 
    73    %W[RUBY_RELEASE_MONTH #{d.month}], 
    74    %W[RUBY_RELEASE_DAY   #{d.day}], 
    75   ].each do |(k, v)| 
    76     str.sub! /^(#define\s+#{k}\s+).*$/, "\\1#{v}" 
    77   end 
    78   f.rewind 
    79   f.write str 
    80 end 
    81 system *%w'svn resolved version.h' 
    82  
    83 f = Tempfile.new 'merger.rb' 
    84 f.printf "merge revision(s) %s:\n", ARGV[0] 
    85 f.write log_svn 
    86 f.flush 
    87 f.close 
    88 f.open # avoid gc 
    89  
    90 loop do 
    91   f.rewind 
    92   r, w = IO.pipe 
    93   fork do 
    94     w.close 
    95     STDIN.reopen r 
    96     exec 'lv' 
    97   end 
    98   r.close 
    99   w << f.read 
    100   w << "\n\n" 
    101   w << `svn stat` 
    102   w << `svn diff` 
    103   w.close 
    104   Process.waitall 
    105   STDERR.puts 'conflicts resolved? (y:yes, a:abort, r:retry, otherwise abort)' 
    106   case STDIN.gets 
    107   when /\Aa/i then exit 
    108   when /\Ar/i then redo 
    109   when /\Ay/i then break 
    110   else exit 
     42  open 'version.h', 'r+b' do |f| 
     43    str = f.read 
     44    [%W[RUBY_VERSION      "#{v.join '.'}"], 
     45     %W[RUBY_VERSION_CODE  #{v.join ''}], 
     46     %W[RUBY_VERSION_MAJOR #{v[0]}], 
     47     %W[RUBY_VERSION_MINOR #{v[1]}], 
     48     %W[RUBY_VERSION_TEENY #{v[2]}], 
     49     %W[RUBY_RELEASE_DATE "#{d.strftime '%Y-%m-%d'}"], 
     50     %W[RUBY_RELEASE_CODE  #{d.strftime '%Y%m%d'}], 
     51     %W[RUBY_PATCHLEVEL    #{p.to_i.succ.to_s}], 
     52     %W[RUBY_RELEASE_YEAR  #{d.year}], 
     53     %W[RUBY_RELEASE_MONTH #{d.month}], 
     54     %W[RUBY_RELEASE_DAY   #{d.day}], 
     55    ].each do |(k, i)| 
     56      str.sub! /^(#define\s+#{k}\s+).*$/, "\\1#{i}" 
     57    end 
     58    f.rewind 
     59    f.write str 
    11160  end 
    11261end 
    11362 
    114 if system *%w'svn ci -F' + [f.path] 
     63def tag intv_p = false 
     64  v, p = version 
    11565  x = v.join('_') 
    116   y = repos + '/branches/ruby_' + x 
    117   z = 'v' + x + '_' + p.to_i.succ.to_s 
    118   w = repos + '/tags/' + z 
     66  y = $repos + '/branches/ruby_' + x 
     67  z = 'v' + x + '_' + p 
     68  w = $repos + '/tags/' + z 
     69  if intv_p 
     70    interactive "OK? svn cp -m \"add tag #{z}\" #{y} #{w} ([y]es|[a]bort|[r]etry)" do 
     71    end 
     72  end 
    11973  system *%w'svn cp -m' + ["add tag #{z}"] + [y, w] 
    120   system 'rm -f subversion.commitlog' 
    121 else 
    122   echo 'commit failed; try again.' 
    12374end 
    12475 
     76case ARGV[0] 
     77when "up", /\A(ver|version|rev|revision|lv|level|patch\s*level)\s*up/ 
     78  version_up 
     79  system 'svn diff version.h' 
     80when "tag" 
     81  tag :interactive 
     82else 
     83  q = $repos + (ARGV[1] || 'branches/ruby_1_8') 
     84  revs = ARGV[0].split /,\s*/ 
     85  log = '' 
     86  log_svn = '' 
     87 
     88  revs.each do |rev| 
     89    case rev 
     90    when /\A\d+:\d+\z/ 
     91      r = ['-r', rev] 
     92    when /\A\d+\z/ 
     93      r = ['-c', rev] 
     94    when nil then 
     95      puts "#$0 revision" 
     96      exit 
     97    end 
     98 
     99    l = IO.popen %w'svn diff' + r + %w'--diff-cmd=diff -x -pU0' + [File.join(q, 'ChangeLog')] do |f| 
     100      f.read 
     101    end 
     102 
     103    log << l 
     104    log_svn << l.lines.grep(/^\+\t/).join.gsub(/^\+/, '') 
     105 
     106    a = %w'svn merge' + r + [q] 
     107    STDERR.puts a.join(' ') 
     108 
     109    system(*a) 
     110    system *%w'svn revert ChangeLog' if /^\+/ =~ l 
     111  end 
     112 
     113  if /^\+/ =~ log 
     114    system *%w'svn revert ChangeLog' 
     115    IO.popen %w'patch -p 0', 'wb' do |f| 
     116      f.write log.gsub(/\+(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/, 
     117                       # this format-time-string was from the file local variables of ChangeLog 
     118                       '+'+Time.now.strftime('%a %b %e %H:%M:%S %Y')) 
     119    end 
     120    system *%w'touch ChangeLog' # needed somehow, don't know why... 
     121  else 
     122    STDERR.puts '*** You should write ChangeLog NOW!!! ***' 
     123  end 
     124 
     125  version_up 
     126  f = Tempfile.new 'merger.rb' 
     127  f.printf "merge revision(s) %s:\n", ARGV[0] 
     128  f.write log_svn 
     129  f.flush 
     130  f.close 
     131  f.open # avoid gc 
     132 
     133  interactive 'conflicts resolved? (y:yes, a:abort, r:retry, otherwise abort)' do 
     134    f.rewind 
     135    r, w = IO.pipe 
     136    fork do 
     137      w.close 
     138      STDIN.reopen r 
     139      exec 'lv' 
     140    end 
     141    r.close 
     142    w << f.read 
     143    w << "\n\n" 
     144    w << `svn stat` 
     145    w << `svn diff --diff-cmd=diff -x -upw` 
     146    w.close 
     147    Process.waitall 
     148  end 
     149 
     150  if system *%w'svn ci -F' + [f.path] 
     151    tag :interactive 
     152    system 'rm -f subversion.commitlog' 
     153  else 
     154    echo 'commit failed; try again.' 
     155  end 
     156 
     157  f.close 
     158end