summaryrefslogtreecommitdiff
path: root/tool/file2lastrev.rb
blob: f8f147057435240cf9a7d948d494e1f4b681e4c1 (plain)
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
#!/usr/bin/env ruby

require 'optparse'
require 'pathname'

class VCSNotFoundError < RuntimeError; end

def detect_vcs(path)
  target_path = Pathname(File.expand_path(path))

  path = target_path.directory? ? target_path : target_path.parent  
  begin
    return :svn, target_path.relative_path_from(path) if File.directory?("#{path}/.svn")
    return :git, target_path.relative_path_from(path) if File.directory?("#{path}/.git")
    path, orig = path.parent, path
  end until path == orig
  raise VCSNotFoundError, "does not seem to be under a vcs"
end

def get_revisions(path)
  ENV['LANG'] = ENV['LC_ALL'] = ENV['LC_MESSAGES'] = 'C'
  vcs, path = detect_vcs(path)

  info = case vcs
  when :svn
    `svn info #{path}`
  when :git
    `git svn info #{path}`
  end

  if info =~ /^Revision: (\d+)$/
    last = $1 
  else
    raise "last revision not found"
  end
  if info =~ /^Last Changed Rev: (\d+)$/
    changed = $1
  else
    raise "changed revision not found"
  end

  return last, changed
end

def raise_if_conflict
  raise "you can specify only one of --changed, --revision.h and --doxygen" if $output
end

parser = OptionParser.new {|opts|
  opts.on("--changed", "changed rev") do
    raise_if_conflict
    $output = :changed
  end
  opts.on("--revision.h") do
    raise_if_conflict
    $output = :revision_h
  end
  opts.on("--doxygen") do
    raise_if_conflict
    $output = :doxygen
  end
  opts.on("-q", "--suppress_not_found") do
    $suppress_not_found = true
  end
}
parser.parse!


begin
  last, changed = get_revisions(ARGV.shift)
rescue VCSNotFoundError
  raise unless $suppress_not_found
end

case $output
when :changed, nil
  puts changed
when :revision_h
  puts "#define RUBY_REVISION #{changed}"
when :doxygen
  puts "r#{changed}/r#{last}"
else
  raise "unknown output format `#{$output}'"
end