summaryrefslogtreecommitdiff
path: root/tool/run_without_tabs.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2020-03-23 03:50:45 +0900
committerGitHub <noreply@github.com>2020-03-22 11:50:45 -0700
commit9ebf74fd7843c34eda59f228fc34ab73f2cc458d (patch)
treef03b85433a1a5bed50f9e507fdc8ed9ce76a63ec /tool/run_without_tabs.rb
parent1c056829298479168cf4db8f1ebdd248149fef70 (diff)
Expand tabs for rb_mjit_header.h (#2975)
This is necessary to avoid converting a hard tab to just 1 space in preprocessor to generate rb_mjit_header.h, which is helpful when using gdb or perf report. See also: [Misc #16112] This reverts commit 91acdd17c4b4bb69a8fa3ada46e09dad46b9362e. Fixed permission failure on Travis, encoding, and added SKIPPED_FILES.
Notes
Notes: Merged-By: k0kubun <takashikkbn@gmail.com>
Diffstat (limited to 'tool/run_without_tabs.rb')
-rw-r--r--tool/run_without_tabs.rb47
1 files changed, 47 insertions, 0 deletions
diff --git a/tool/run_without_tabs.rb b/tool/run_without_tabs.rb
new file mode 100644
index 0000000000..bf74468939
--- /dev/null
+++ b/tool/run_without_tabs.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+# This is a script to run a command in ARGV, expanding tabs in some files
+# included by vm.c to normalize indentation of MJIT header.
+#
+# Note that preprocessor of GCC converts a hard tab to one spaces, where
+# we expect it to be shown as 8 spaces. To obviate this script, we need
+# to convert all tabs to spaces in these files.
+
+require 'fileutils'
+
+# These files have no hard tab indentations. Skip normalizing these files.
+SKIPPED_FILES = %w[
+ vm_callinfo.h
+ vm_debug.h
+ vm_exec.h
+ vm_opts.h
+]
+
+srcdir = File.expand_path('..', __dir__)
+targets = Dir.glob(File.join(srcdir, 'vm*.*')) - SKIPPED_FILES.map { |f| File.join(srcdir, f) }
+sources = {}
+mtimes = {}
+
+if skip = targets.any? { |target| !File.writable?(target) }
+ puts "tool/run_without_tabs.rb: srcdir has non-writable files. Skipping tab expansion."
+end
+
+targets.each do |target|
+ sources[target] = File.read(target)
+ mtimes[target] = File.mtime(target)
+
+ expanded = sources[target].force_encoding('UTF-8').gsub(/^\t+/) { |tab| ' ' * 8 * tab.length }
+ if sources[target] == expanded
+ puts "#{target.dump} has no hard tab indentation. This should be ignored in tool/run_without_tabs.rb."
+ end
+ File.write(target, expanded)
+ FileUtils.touch(target, mtime: mtimes[target])
+end unless skip
+
+result = system(*ARGV)
+
+targets.each do |target|
+ File.write(target, sources.fetch(target))
+ FileUtils.touch(target, mtime: mtimes.fetch(target))
+end unless skip
+
+exit result