[前][次][番号順一覧][スレッド一覧]

ruby-changes:44595

From: nobu <ko1@a...>
Date: Tue, 8 Nov 2016 15:39:53 +0900 (JST)
Subject: [ruby-changes:44595] nobu:r56668 (trunk): vcs.rb: fix srcdir in VCS::GIT

nobu	2016-11-08 15:39:46 +0900 (Tue, 08 Nov 2016)

  New Revision: 56668

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=56668

  Log:
    vcs.rb: fix srcdir in VCS::GIT
    
    * tool/vcs.rb (VCS::GIT.cmd_args): add chdir option to arguments
      for IO.popen if srcdir is a local path.  unless -srcdir command
      line option is given, srcdir is the default URL.
      [ruby-core:78036] [Bug #12908]

  Modified files:
    trunk/tool/vcs.rb
Index: tool/vcs.rb
===================================================================
--- tool/vcs.rb	(revision 56667)
+++ tool/vcs.rb	(revision 56668)
@@ -120,7 +120,6 @@ class VCS https://github.com/ruby/ruby/blob/trunk/tool/vcs.rb#L120
 
   def initialize(path)
     @srcdir = path
-    @abs_srcdir = File.realpath(path)
     super()
   end
 
@@ -322,29 +321,53 @@ class VCS https://github.com/ruby/ruby/blob/trunk/tool/vcs.rb#L321
   class GIT < self
     register(".git") {|path, dir| File.exist?(File.join(path, dir))}
 
+    def self.cmd_args(cmds, srcdir = nil)
+      if srcdir and local_path?(srcdir)
+        (opts = cmds.last).kind_of?(Hash) or cmds << (opts = {})
+        opts[:chdir] ||= srcdir
+      end
+      cmds
+    end
+
+    def self.cmd_pipe_at(srcdir, cmds, &block)
+      IO.popen(*cmd_args(cmds, srcdir), &block)
+    end
+
+    def self.cmd_read_at(srcdir, cmds)
+      IO.pread(*cmd_args(cmds, srcdir))
+    end
+
     def self.get_revisions(path, srcdir = nil)
       gitcmd = %W[git]
       logcmd = gitcmd + %W[log -n1 --date=iso]
       logcmd << "--grep=^ *git-svn-id: .*@[0-9][0-9]*"
       idpat = /git-svn-id: .*?@(\d+) \S+\Z/
-      log = IO.pread(logcmd, :chdir => srcdir)
+      log = IO.pread(logcmd)
       commit = log[/\Acommit (\w+)/, 1]
       last = log[idpat, 1]
       if path
         cmd = logcmd
         cmd += [path] unless path == '.'
-        log = IO.pread(cmd, :chdir => srcdir)
+        log = IO.pread(cmd)
         changed = log[idpat, 1]
       else
         changed = last
       end
       modified = log[/^Date:\s+(.*)/, 1]
-      branch = IO.pread(gitcmd + %W[symbolic-ref HEAD], :chdir => srcdir)[%r'\A(?:refs/heads/)?(.+)', 1]
-      title = IO.pread(gitcmd + %W[log --format=%s -n1 #{commit}..HEAD], :chdir => srcdir)
+      branch = IO.pread(gitcmd + %W[symbolic-ref HEAD])[%r'\A(?:refs/heads/)?(.+)', 1]
+      title = IO.pread(gitcmd + %W[log --format=%s -n1 #{commit}..HEAD])
       title = nil if title.empty?
       [last, changed, modified, branch, title]
     end
 
+    def cmd_pipe(*cmds, &block)
+      self.class.cmd_pipe_at(@srcdir, cmds, &block)
+    end
+
+    def cmd_read(*cmds)
+      self.class.cmd_read_at(@srcdir, cmds)
+    end
+
     Branch = Struct.new(:to_str)
 
     def branch(name)
@@ -359,12 +382,12 @@ class VCS https://github.com/ruby/ruby/blob/trunk/tool/vcs.rb#L382
 
     def stable
       cmd = %W"git for-each-ref --format=\%(refname:short) refs/heads/ruby_[0-9]*"
-      branch(IO.pread(cmd, :chdir => srcdir)[/.*^(ruby_\d+_\d+)$/m, 1])
+      branch(cmd_read(cmd)[/.*^(ruby_\d+_\d+)$/m, 1])
     end
 
     def branch_list(pat)
       cmd = %W"git for-each-ref --format=\%(refname:short) refs/heads/#{pat}"
-      IO.popen(cmd, :chdir => srcdir) {|f|
+      cmd_pipe(cmd) {|f|
         f.each {|line|
           line.chomp!
           yield line
@@ -375,7 +398,7 @@ class VCS https://github.com/ruby/ruby/blob/trunk/tool/vcs.rb#L398
     def grep(pat, tag, *files, &block)
       cmd = %W[git grep -h --perl-regexp #{tag} --]
       set = block.binding.eval("proc {|match| $~ = match}")
-      IO.popen([cmd, *files], :chdir => srcdir) do |f|
+      cmd_pipe(cmd+files) do |f|
         f.grep(pat) do |s|
           set[$~]
           yield s
@@ -384,7 +407,7 @@ class VCS https://github.com/ruby/ruby/blob/trunk/tool/vcs.rb#L407
     end
 
     def export(revision, url, dir, keep_temp = false)
-      ret = system("git", "clone", "-s", (@srcdir || '.'), "-b", url, dir)
+      ret = system("git", "clone", "-s", (@srcdir || '.').to_s, "-b", url, dir)
       FileUtils.rm_rf("#{dir}/.git") if ret and !keep_temp
       ret
     end
@@ -396,15 +419,13 @@ class VCS https://github.com/ruby/ruby/blob/trunk/tool/vcs.rb#L419
     def export_changelog(from, to, path)
       range = [from, to].map do |rev|
         rev or next
-        rev = IO.pread({'LANG' => 'C', 'LC_ALL' => 'C'},
+        rev = cmd_read({'LANG' => 'C', 'LC_ALL' => 'C'},
                        %W"git log -n1 --format=format:%H" <<
-                       "--grep=^ *git-svn-id: .*@#{rev} ",
-                       :chdir => @abs_srcdir)
+                       "--grep=^ *git-svn-id: .*@#{rev} ")
         rev unless rev.empty?
       end.join('..')
-      IO.popen({'TZ' => 'JST-9', 'LANG' => 'C', 'LC_ALL' => 'C'},
-               %W"git svn log --date=iso-local --topo-order #{range}",
-               :chdir => @abs_srcdir) do |r|
+      cmd_pipe({'TZ' => 'JST-9', 'LANG' => 'C', 'LC_ALL' => 'C'},
+               %W"git svn log --date=iso-local --topo-order #{range}") do |r|
         open(path, 'w') do |w|
           IO.copy_stream(r, w)
         end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]