summaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-12 14:35:13 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-12 14:35:13 +0000
commitf4d766499fcae954970c7d17406a0bd42af6b14d (patch)
tree74ffc15269e245eb18c921247cbd3b2f139fdd65 /tool
parent68eb3d86a1ee9b7ca6b26bb30f930ab74b1b4ce1 (diff)
merge revision(s) 43609,43617: [Backport #8878] [Backport #9085]
vcs.rb: split * tool/vcs.rb: split from file2lastrev.rb. * tool/rbinstall.rb (Gem::Specification.load): obtain spec date from VCS for the case using git, RUBY_RELEASE_DATE is the last resort. probably fixes [Bug #9085]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@43655 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'tool')
-rwxr-xr-xtool/file2lastrev.rb103
-rwxr-xr-xtool/rbinstall.rb18
-rw-r--r--tool/vcs.rb112
3 files changed, 131 insertions, 102 deletions
diff --git a/tool/file2lastrev.rb b/tool/file2lastrev.rb
index 90816ae83e..56e1b9f512 100755
--- a/tool/file2lastrev.rb
+++ b/tool/file2lastrev.rb
@@ -1,110 +1,13 @@
#!/usr/bin/env ruby
-ENV.delete('PWD')
-
require 'optparse'
-unless File.respond_to? :realpath
- require 'pathname'
- def File.realpath(arg)
- Pathname(arg).realpath.to_s
- end
-end
+# this file run with BASERUBY, which may be older than 1.9, so no
+# require_relative
+require File.expand_path('../vcs', __FILE__)
Program = $0
-class VCS
- class NotFoundError < RuntimeError; end
-
- @@dirs = []
- def self.register(dir)
- @@dirs << [dir, self]
- end
-
- def self.detect(path)
- @@dirs.each do |dir, klass|
- return klass.new(path) if File.directory?(File.join(path, dir))
- prev = path
- loop {
- curr = File.realpath(File.join(prev, '..'))
- break if curr == prev # stop at the root directory
- return klass.new(path) if File.directory?(File.join(curr, dir))
- prev = curr
- }
- end
- raise VCS::NotFoundError, "does not seem to be under a vcs: #{path}"
- end
-
- def initialize(path)
- @srcdir = path
- super()
- end
-
- # return a pair of strings, the last revision and the last revision in which
- # +path+ was modified.
- def get_revisions(path)
- path = relative_to(path)
- last, changed, *rest = Dir.chdir(@srcdir) {self.class.get_revisions(path)}
- last or raise "last revision not found"
- changed or raise "changed revision not found"
- return last, changed, *rest
- end
-
- def relative_to(path)
- if path
- srcdir = File.realpath(@srcdir)
- path = File.realpath(path)
- list1 = srcdir.split(%r{/})
- list2 = path.split(%r{/})
- while !list1.empty? && !list2.empty? && list1.first == list2.first
- list1.shift
- list2.shift
- end
- if list1.empty? && list2.empty?
- "."
- else
- ([".."] * list1.length + list2).join("/")
- end
- else
- '.'
- end
- end
-
- class SVN < self
- register(".svn")
-
- def self.get_revisions(path)
- begin
- nulldevice = %w[/dev/null NUL NIL: NL:].find {|dev| File.exist?(dev)}
- if nulldevice
- save_stderr = STDERR.dup
- STDERR.reopen nulldevice, 'w'
- end
- info_xml = `svn info --xml "#{path}"`
- ensure
- if save_stderr
- STDERR.reopen save_stderr
- save_stderr.close
- end
- end
- _, last, _, changed, _ = info_xml.split(/revision="(\d+)"/)
- [last, changed]
- end
- end
-
- class GIT < self
- register(".git")
-
- def self.get_revisions(path)
- logcmd = %Q[git log -n1 --grep="^ *git-svn-id: .*@[0-9][0-9]* "]
- idpat = /git-svn-id: .*?@(\d+) \S+\Z/
- last = `#{logcmd}`[idpat, 1]
- changed = path ? `#{logcmd} "#{path}"`[idpat, 1] : last
- [last, changed]
- end
- end
-end
-
@output = nil
def self.output=(output)
if @output and @output != output
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
index 9d10f59a5d..5162498ecd 100755
--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -18,10 +18,17 @@ require 'shellwords'
require 'optparse'
require 'optparse/shellwords'
require 'ostruct'
+require_relative 'vcs'
STDOUT.sync = true
File.umask(0)
+begin
+ $vcs = VCS.detect(File.expand_path('../..', __FILE__))
+rescue VCS::NotFoundError
+ $vcs = nil
+end
+
def parse_args(argv = ARGV)
$mantype = 'doc'
$destdir = nil
@@ -555,13 +562,20 @@ module Gem
super
yield(self) if defined?(yield)
self.executables ||= []
- self.date ||= RUBY_RELEASE_DATE
end
def self.load(path)
src = File.open(path, "rb") {|f| f.read}
src.sub!(/\A#.*/, '')
- eval(src, nil, path)
+ spec = eval(src, nil, path)
+ spec.date ||= last_date(path) || RUBY_RELEASE_DATE
+ spec
+ end
+
+ def self.last_date(path)
+ return unless $vcs
+ return unless time = $vcs.get_revisions(path)[2]
+ time.strftime("%Y-%m-%d")
end
def to_ruby
diff --git a/tool/vcs.rb b/tool/vcs.rb
new file mode 100644
index 0000000000..6e86cfb07e
--- /dev/null
+++ b/tool/vcs.rb
@@ -0,0 +1,112 @@
+# vcs
+
+require 'time'
+
+ENV.delete('PWD')
+
+unless File.respond_to? :realpath
+ require 'pathname'
+ def File.realpath(arg)
+ Pathname(arg).realpath.to_s
+ end
+end
+
+class VCS
+ class NotFoundError < RuntimeError; end
+
+ @@dirs = []
+ def self.register(dir)
+ @@dirs << [dir, self]
+ end
+
+ def self.detect(path)
+ @@dirs.each do |dir, klass|
+ return klass.new(path) if File.directory?(File.join(path, dir))
+ prev = path
+ loop {
+ curr = File.realpath(File.join(prev, '..'))
+ break if curr == prev # stop at the root directory
+ return klass.new(path) if File.directory?(File.join(curr, dir))
+ prev = curr
+ }
+ end
+ raise VCS::NotFoundError, "does not seem to be under a vcs: #{path}"
+ end
+
+ def initialize(path)
+ @srcdir = path
+ super()
+ end
+
+ # return a pair of strings, the last revision and the last revision in which
+ # +path+ was modified.
+ def get_revisions(path)
+ path = relative_to(path)
+ last, changed, modified, *rest = Dir.chdir(@srcdir) {self.class.get_revisions(path)}
+ last or raise "last revision not found"
+ changed or raise "changed revision not found"
+ modified &&= Time.parse(modified)
+ return last, changed, modified, *rest
+ end
+
+ def relative_to(path)
+ if path
+ srcdir = File.realpath(@srcdir)
+ path = File.realpath(path)
+ list1 = srcdir.split(%r{/})
+ list2 = path.split(%r{/})
+ while !list1.empty? && !list2.empty? && list1.first == list2.first
+ list1.shift
+ list2.shift
+ end
+ if list1.empty? && list2.empty?
+ "."
+ else
+ ([".."] * list1.length + list2).join("/")
+ end
+ else
+ '.'
+ end
+ end
+
+ class SVN < self
+ register(".svn")
+
+ def self.get_revisions(path)
+ begin
+ nulldevice = %w[/dev/null NUL NIL: NL:].find {|dev| File.exist?(dev)}
+ if nulldevice
+ save_stderr = STDERR.dup
+ STDERR.reopen nulldevice, 'w'
+ end
+ info_xml = `svn info --xml "#{path}"`
+ ensure
+ if save_stderr
+ STDERR.reopen save_stderr
+ save_stderr.close
+ end
+ end
+ _, last, _, changed, _ = info_xml.split(/revision="(\d+)"/)
+ modified = info_xml[/<date>([^<>]*)/, 1]
+ [last, changed, modified]
+ end
+ end
+
+ class GIT < self
+ register(".git")
+
+ def self.get_revisions(path)
+ logcmd = %Q[git log -n1 --grep="^ *git-svn-id: .*@[0-9][0-9]* "]
+ idpat = /git-svn-id: .*?@(\d+) \S+\Z/
+ last = `#{logcmd}`[idpat, 1]
+ if path
+ log = `#{logcmd} "#{path}"`
+ changed = log[idpat, 1]
+ modified = `git log --format=%ai -- #{path}`
+ else
+ changed = last
+ end
+ [last, changed, modified]
+ end
+ end
+end