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

ruby-changes:53746

From: hsbt <ko1@a...>
Date: Sun, 25 Nov 2018 10:20:07 +0900 (JST)
Subject: [ruby-changes:53746] hsbt:r65963 (trunk): Use stub executables generated by RubyGems istead of original executables.

hsbt	2018-11-25 10:20:00 +0900 (Sun, 25 Nov 2018)

  New Revision: 65963

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

  Log:
    Use stub executables generated by RubyGems istead of original executables.
    It resolved the conflict issues when invoking `gem i rdoc` and the binstub
    issues with Bundler and Rails.
    
      [Bug #5060][ruby-core:38257][Fix GH-2023]
    
      * https://github.com/rubygems/rubygems/pull/2338
      * https://github.com/heroku/heroku-buildpack-ruby/issues/829

  Added directories:
    trunk/libexec/
  Added files:
    trunk/libexec/bundle
    trunk/libexec/bundle_ruby
    trunk/libexec/bundler
    trunk/libexec/irb
    trunk/libexec/rdoc
    trunk/libexec/ri
  Modified files:
    trunk/bin/bundle
    trunk/bin/bundle_ruby
    trunk/bin/bundler
    trunk/bin/irb
    trunk/bin/rdoc
    trunk/bin/ri
    trunk/common.mk
    trunk/lib/bundler.gemspec
    trunk/spec/bundler/spec_helper.rb
    trunk/spec/bundler/support/path.rb
    trunk/tool/rbinstall.rb
Index: common.mk
===================================================================
--- common.mk	(revision 65962)
+++ common.mk	(revision 65963)
@@ -542,15 +542,15 @@ post-install-gem:: https://github.com/ruby/ruby/blob/trunk/common.mk#L542
 
 rdoc: PHONY main
 	@echo Generating RDoc documentation
-	$(Q) $(XRUBY) "$(srcdir)/bin/rdoc" --root "$(srcdir)" --page-dir "$(srcdir)/doc" --encoding=UTF-8 --no-force-update --all --ri --op "$(RDOCOUT)" $(RDOCFLAGS) "$(srcdir)"
+	$(Q) $(XRUBY) "$(srcdir)/libexec/rdoc" --root "$(srcdir)" --page-dir "$(srcdir)/doc" --encoding=UTF-8 --no-force-update --all --ri --op "$(RDOCOUT)" $(RDOCFLAGS) "$(srcdir)"
 
 html: PHONY main
 	@echo Generating RDoc HTML files
-	$(Q) $(XRUBY) "$(srcdir)/bin/rdoc" --root "$(srcdir)" --page-dir "$(srcdir)/doc" --encoding=UTF-8 --no-force-update --all --op "$(HTMLOUT)" $(RDOCFLAGS) "$(srcdir)"
+	$(Q) $(XRUBY) "$(srcdir)/libexec/rdoc" --root "$(srcdir)" --page-dir "$(srcdir)/doc" --encoding=UTF-8 --no-force-update --all --op "$(HTMLOUT)" $(RDOCFLAGS) "$(srcdir)"
 
 rdoc-coverage: PHONY main
 	@echo Generating RDoc coverage report
-	$(Q) $(XRUBY) "$(srcdir)/bin/rdoc" --root "$(srcdir)" --encoding=UTF-8 --all --quiet -C $(RDOCFLAGS) "$(srcdir)"
+	$(Q) $(XRUBY) "$(srcdir)/libexec/rdoc" --root "$(srcdir)" --encoding=UTF-8 --all --quiet -C $(RDOCFLAGS) "$(srcdir)"
 
 RDOCBENCHOUT=/tmp/rdocbench
 
Index: spec/bundler/spec_helper.rb
===================================================================
--- spec/bundler/spec_helper.rb	(revision 65962)
+++ spec/bundler/spec_helper.rb	(revision 65963)
@@ -131,6 +131,12 @@ RSpec.configure do |config| https://github.com/ruby/ruby/blob/trunk/spec/bundler/spec_helper.rb#L131
     Gem.ruby = orig_ruby if ENV["BUNDLE_RUBY"]
   end
 
+  config.before :suite do
+    if ENV["BUNDLE_RUBY"]
+      FileUtils.cp_r Spec::Path.bindir, File.join(Spec::Path.root, "lib", "exe")
+    end
+  end
+
   config.before :all do
     build_repo1
   end
@@ -155,4 +161,10 @@ RSpec.configure do |config| https://github.com/ruby/ruby/blob/trunk/spec/bundler/spec_helper.rb#L161
     Dir.chdir(original_wd)
     ENV.replace(original_env)
   end
+
+  config.after :suite do
+    if ENV["BUNDLE_RUBY"]
+      FileUtils.rm_rf File.join(Spec::Path.root, "lib", "exe")
+    end
+  end
 end
Index: spec/bundler/support/path.rb
===================================================================
--- spec/bundler/support/path.rb	(revision 65962)
+++ spec/bundler/support/path.rb	(revision 65963)
@@ -13,7 +13,7 @@ module Spec https://github.com/ruby/ruby/blob/trunk/spec/bundler/support/path.rb#L13
     end
 
     def bindir
-      @bindir ||= root.join(ruby_core? ? "bin" : "exe")
+      @bindir ||= root.join(ruby_core? ? "libexec" : "exe")
     end
 
     def spec_dir
Index: bin/rdoc
===================================================================
--- bin/rdoc	(revision 65962)
+++ bin/rdoc	(revision 65963)
@@ -1,44 +1,27 @@ https://github.com/ruby/ruby/blob/trunk/bin/rdoc#L1
 #!/usr/bin/env ruby
 #
-#  RDoc: Documentation tool for source code
-#        (see lib/rdoc/rdoc.rb for more information)
+# This file was generated by RubyGems.
+#
+# The application 'rdoc' is installed as part of a gem, and
+# this file is here to facilitate running it.
 #
-#  Copyright (c) 2003 Dave Thomas
-#  Released under the same terms as Ruby
 
-begin
-  gem 'rdoc'
-rescue NameError => e # --disable-gems
-  raise unless e.name == :gem
-rescue Gem::LoadError
-end
+require 'rubygems'
 
-require 'rdoc/rdoc'
+version = ">= 0.a"
 
-begin
-  r = RDoc::RDoc.new
-  r.document ARGV
-rescue Errno::ENOSPC
-  $stderr.puts 'Ran out of space creating documentation'
-  $stderr.puts
-  $stderr.puts 'Please free up some space and try again'
-rescue SystemExit
-  raise
-rescue Exception => e
-  if $DEBUG_RDOC then
-    $stderr.puts e.message
-    $stderr.puts "#{e.backtrace.join "\n\t"}"
-    $stderr.puts
-  elsif Interrupt === e then
-    $stderr.puts
-    $stderr.puts 'Interrupted'
-  else
-    $stderr.puts "uh-oh! RDoc had a problem:"
-    $stderr.puts e.message
-    $stderr.puts
-    $stderr.puts "run with --debug for full backtrace"
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
   end
-
-  exit 1
 end
 
+if Gem.respond_to?(:activate_bin_path)
+load Gem.activate_bin_path('rdoc', 'rdoc', version)
+else
+gem "rdoc", version
+load Gem.bin_path("rdoc", "rdoc", version)
+end
Index: bin/bundle
===================================================================
--- bin/bundle	(revision 65962)
+++ bin/bundle	(revision 65963)
@@ -1,31 +1,27 @@ https://github.com/ruby/ruby/blob/trunk/bin/bundle#L1
 #!/usr/bin/env ruby
-# frozen_string_literal: true
+#
+# This file was generated by RubyGems.
+#
+# The application 'bundler' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
 
-# Exit cleanly from an early interrupt
-Signal.trap("INT") do
-  Bundler.ui.debug("\n#{caller.join("\n")}") if defined?(Bundler)
-  exit 1
-end
-
-require "bundler"
-# Check if an older version of bundler is installed
-$LOAD_PATH.each do |path|
-  next unless path =~ %r{/bundler-0\.(\d+)} && $1.to_i < 9
-  err = String.new
-  err << "Looks like you have a version of bundler that's older than 0.9.\n"
-  err << "Please remove your old versions.\n"
-  err << "An easy way to do this is by running `gem cleanup bundler`."
-  abort(err)
-end
+require 'rubygems'
 
-require "bundler/friendly_errors"
-Bundler.with_friendly_errors do
-  require "bundler/cli"
+version = ">= 0.a"
 
-  # Allow any command to use --help flag to show help for that command
-  help_flags = %w[--help -h]
-  help_flag_used = ARGV.any? {|a| help_flags.include? a }
-  args = help_flag_used ? Bundler::CLI.reformatted_help_args(ARGV) : ARGV
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
 
-  Bundler::CLI.start(args, :debug => true)
+if Gem.respond_to?(:activate_bin_path)
+load Gem.activate_bin_path('bundler', 'bundle', version)
+else
+gem "bundler", version
+load Gem.bin_path("bundler", "bundle", version)
 end
Index: bin/bundle_ruby
===================================================================
--- bin/bundle_ruby	(revision 65962)
+++ bin/bundle_ruby	(revision 65963)
@@ -1,60 +1,27 @@ https://github.com/ruby/ruby/blob/trunk/bin/bundle_ruby#L1
 #!/usr/bin/env ruby
-# frozen_string_literal: true
-
-require "bundler/shared_helpers"
-
-Bundler::SharedHelpers.major_deprecation(3, "the bundle_ruby executable has been removed in favor of `bundle platform --ruby`")
-
-Signal.trap("INT") { exit 1 }
-
-require "bundler/errors"
-require "bundler/ruby_version"
-require "bundler/ruby_dsl"
-
-module Bundler
-  class Dsl
-    include RubyDsl
-
-    attr_accessor :ruby_version
-
-    def initialize
-      @ruby_version = nil
-    end
-
-    def eval_gemfile(gemfile, contents = nil)
-      contents ||= File.open(gemfile, "rb", &:read)
-      instance_eval(contents, gemfile.to_s, 1)
-    rescue SyntaxError => e
-      bt = e.message.split("\n")[1..-1]
-      raise GemfileError, ["Gemfile syntax error:", *bt].join("\n")
-    rescue ScriptError, RegexpError, NameError, ArgumentError => e
-      e.backtrace[0] = "#{e.backtrace[0]}: #{e.message} (#{e.class})"
-      STDERR.puts e.backtrace.join("\n       ")
-      raise GemfileError, "There was an error in your Gemfile," \
-        " and Bundler cannot continue."
-    end
-
-    def source(source, options = {})
-    end
-
-    def gem(name, *args)
-    end
-
-    def group(*args)
-    end
+#
+# This file was generated by RubyGems.
+#
+# The application 'bundler' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
   end
 end
 
-dsl = Bundler::Dsl.new
-begin
-  dsl.eval_gemfile(Bundler::SharedHelpers.default_gemfile)
-  ruby_version = dsl.ruby_version
-  if ruby_version
-    puts ruby_version
-  else
-    puts "No ruby version specified"
-  end
-rescue Bundler::GemfileError => e
-  puts e.message
-  exit(-1)
+if Gem.respond_to?(:activate_bin_path)
+load Gem.activate_bin_path('bundler', 'bundle_ruby', version)
+else
+gem "bundler", version
+load Gem.bin_path("bundler", "bundle_ruby", version)
 end
Index: bin/ri
===================================================================
--- bin/ri	(revision 65962)
+++ bin/ri	(revision 65963)
@@ -1,12 +1,27 @@ https://github.com/ruby/ruby/blob/trunk/bin/ri#L1
 #!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'rdoc' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
 
-begin
-  gem 'rdoc'
-rescue NameError => e # --disable-gems
-  raise unless e.name == :gem
-rescue Gem::LoadError
-end
+require 'rubygems'
+
+version = ">= 0.a"
 
-require 'rdoc/ri/driver'
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
 
-RDoc::RI::Driver.run ARGV
+if Gem.respond_to?(:activate_bin_path)
+load Gem.activate_bin_path('rdoc', 'ri', version)
+else
+gem "rdoc", version
+load Gem.bin_path("rdoc", "ri", version)
+end
Index: bin/bundler
===================================================================
--- bin/bundler	(revision 65962)
+++ bin/bundler	(revision 65963)
@@ -1,4 +1,27 @@ https://github.com/ruby/ruby/blob/trunk/bin/bundler#L1
 #!/usr/bin/env ruby
-# frozen_string_literal: true
+#
+# This file was generated by RubyGems.
+#
+# The application 'bundler' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
 
-load File.expand_path("../bundle", __FILE__)
+require 'rubygems'
+
+version = ">= 0.a"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
+
+if Gem.respond_to?(:activate_bin_path)
+load Gem.activate_bin_path('bundler', 'bundler', version)
+else
+gem "bundler", version
+load Gem.bin_path("bundler", "bundler", version)
+end
Index: bin/irb
===================================================================
--- bin/irb	(revision 65962)
+++ bin/irb	(revision 65963)
@@ -1,11 +1,27 @@ https://github.com/ruby/ruby/blob/trunk/bin/irb#L1
 #!/usr/bin/env ruby
 #
-#   irb.rb - interactive ruby
-#   	$Release Version: 0.9.6 $
-#   	$Revision$
-#   	by Keiju ISHITSUKA(keiju@r...)
+# This file was generated by RubyGems.
 #
+# The application 'irb' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
 
-require "irb"
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
 
-IRB.start(__FILE__)
+if Gem.respond_to?(:activate_bin_path)
+load Gem.activate_bin_path('irb', 'irb', version)
+else
+gem "irb", version
+load Gem.bin_path("irb", "irb", version)
+end
Index: tool/rbinstall.rb
===================================================================
--- tool/rbinstall.rb	(revision 65962)
+++ tool/rbinstall.rb	(revision 65963)
@@ -781,7 +781,7 @@ def install_default_gem(dir, srcdir) https://github.com/ruby/ruby/blob/trunk/tool/rbinstall.rb#L781
       makedirs(bin_dir)
 
       gemspec.executables.map {|exec|
-        $script_installer.install(File.join(srcdir, 'bin', exec),
+        $script_installer.install(File.join(srcdir, 'libexec', exec),
                                   File.join(bin_dir, exec))
       }
     end
Index: lib/bundler.gemspec
===================================================================
--- lib/bundler.gemspec	(revision 65962)
+++ lib/bundler.gemspec	(revision 65963)
@@ -58,7 +58,7 @@ Gem::Specification.new do |s| https://github.com/ruby/ruby/blob/trunk/lib/bundler.gemspec#L58
   # include the gemspec itself because warbler breaks w/o it
   s.files += %w[bundler.gemspec]
 
-  # s.bindir        = "exe"
-  # s.executables   = %w[bundle bundler]
+  s.bindir        = "exe"
+  s.executables   = %w[bundle bundler]
   s.require_paths = ["lib"]
 end
Index: libexec/rdoc
===================================================================
--- libexec/rdoc	(nonexistent)
+++ libexec/rdoc	(revision 65963)
@@ -0,0 +1,44 @@ https://github.com/ruby/ruby/blob/trunk/libexec/rdoc#L1
+#!/usr/bin/env ruby
+#
+#  RDoc: Documentation tool for source code
+#        (see lib/rdoc/rdoc.rb for more information)
+#
+#  Copyright (c) 2003 Dave Thomas
+#  Released under the same terms as Ruby
+
+begin
+  gem 'rdoc'
+rescue NameError => e # --disable-gems
+  raise unless e.name == :gem
+rescue Gem::LoadError
+end
+
+require 'rdoc/rdoc'
+
+begin
+  r = RDoc::RDoc.new
+  r.document ARGV
+rescue Errno::ENOSPC
+  $stderr.puts 'Ran out of space creating documentation'
+  $stderr.puts
+  $stderr.puts 'Please free up some space and try again'
+rescue SystemExit
+  raise
+rescue Exception => e
+  if $DEBUG_RDOC then
+    $stderr.puts e.message
+    $stderr.puts "#{e.backtrace.join "\n\t"}"
+    $stderr.puts
+  elsif Interrupt === e then
+    $stderr.puts
+    $stderr.puts 'Interrupted'
+  else
+    $stderr.puts "uh-oh! RDoc had a problem:"
+    $stderr.puts e.message
+    $stderr.puts
+    $stderr.puts "run with --debug for full backtrace"
+  end
+
+  exit 1
+end
+

Property changes on: libexec/rdoc
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Revision
\ No newline at end of property
Index: libexec/bundle
===================================================================
--- libexec/bundle	(nonexistent)
+++ libexec/bundle	(revision 65963)
@@ -0,0 +1,31 @@ https://github.com/ruby/ruby/blob/trunk/libexec/bundle#L1
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+# Exit cleanly from an early interrupt
+Signal.trap("INT") do
+  Bundler.ui.debug("\n#{caller.join("\n")}") if defined?(Bundler)
+  exit 1
+end
+
+require "bundler"
+# Check if an older version of bundler is installed
+$LOAD_PATH.each do |path|
+  next unless path =~ %r{/bundler-0\.(\d+)} && $1.to_i < 9
+  err = String.new
+  err << "Looks like you have a version of bundler that's older than 0.9.\n"
+  err << "Please remove your old versions.\n"
+  err << "An easy way to do this is by running `gem cleanup bundler`."
+  abort(err)
+end
+
+require "bundler/friendly_errors"
+Bundler.with_friendly_errors do
+  require "bundler/cli"
+
+  # Allow any command to use --help flag to show help for that command
+  help_flags = %w[--help -h]
+  help_flag_used = ARGV.any? {|a| help_flags.include? a }
+  args = help_flag_used ? Bundler::CLI.reformatted_help_args(ARGV) : ARGV
+
+  Bundler::CLI.start(args, :debug => true)
+end

Property changes on: libexec/bundle
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: libexec/bundle_ruby
===================================================================
--- libexec/bundle_ruby	(nonexistent)
+++ libexec/bundle_ruby	(revision 65963)
@@ -0,0 +1,60 @@ https://github.com/ruby/ruby/blob/trunk/libexec/bundle_ruby#L1
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require "bundler/shared_helpers"
+
+Bundler::SharedHelpers.major_deprecation(3, "the bundle_ruby executable has been removed in favor of `bundle platform --ruby`")
+
+Signal.trap("INT") { exit 1 }
+
+require "bundler/errors"
+require "bundler/ruby_version"
+require "bundler/ruby_dsl"
+
+module Bundler
+  class Dsl
+    include RubyDsl
+
+    attr_accessor :ruby_version
+
+    def initialize
+      @ruby_version = nil
+    end
+
+    def eval_gemfile(gemfile, contents = nil)
+      contents ||= File.open(gemfile, "rb", &:read)
+      instance_eval(contents, gemfile.to_s, 1)
+    rescue SyntaxError => e
+      bt = e.message.split("\n")[1..-1]
+      raise GemfileError, ["Gemfile syntax error:", *bt].join("\n")
+    rescue ScriptError, RegexpError, NameError, ArgumentError => e
+      e.backtrace[0] = "#{e.backtrace[0]}: #{e.message} (#{e.class})"
+      STDERR.puts e.backtrace.join("\n       ")
+      raise GemfileError, "There was an error in your Gemfile," \
+        " and Bundler cannot continue."
+    end
+
+    def source(source, options = {})
+    end
+
+    def gem(name, *args)
+    end
+
+    def group(*args)
+    end
+  end
+end
+
+dsl = Bundler::Dsl.new
+begin
+  dsl.eval_gemfile(Bundler::SharedHelpers.default_gemfile)
+  ruby_version = dsl.ruby_version
+  if ruby_version
+    puts ruby_version
+  else
+    puts "No ruby version specified"
+  end
+rescue Bundler::GemfileError => e
+  puts e.message
+  exit(-1)
+end

Property changes on: libexec/bundle_ruby
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: libexec/ri
===================================================================
--- libexec/ri	(nonexistent)
+++ libexec/ri	(revision 65963)
@@ -0,0 +1,12 @@ https://github.com/ruby/ruby/blob/trunk/libexec/ri#L1
+#!/usr/bin/env ruby
+
+begin
+  gem 'rdoc'
+rescue NameError => e # --disable-gems
+  raise unless e.name == :gem
+rescue Gem::LoadError
+end
+
+require 'rdoc/ri/driver'
+
+RDoc::RI::Driver.run ARGV

Property changes on: libexec/ri
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: libexec/bundler
===================================================================
--- libexec/bundler	(nonexistent)
+++ libexec/bundler	(revision 65963)
@@ -0,0 +1,4 @@ https://github.com/ruby/ruby/blob/trunk/libexec/bundler#L1
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+load File.expand_path("../bundle", __FILE__)

Property changes on: libexec/bundler
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: libexec/irb
===================================================================
--- libexec/irb	(nonexistent)
+++ libexec/irb	(revision 65963)
@@ -0,0 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/libexec/irb#L1
+#!/usr/bin/env ruby
+#
+#   irb.rb - interactive ruby
+#   	$Release Version: 0.9.6 $
+#   	$Revision$
+#   	by Keiju ISHITSUKA(keiju@r...)
+#
+
+require "irb"
+
+IRB.start(__FILE__)

Property changes on: libexec/irb
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Revision
\ No newline at end of property

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

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