-
-
Save Orangenhain/7691314 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby -w | |
class String | |
def starts_with?(prefix) | |
prefix.respond_to?(:to_str) && self[0, prefix.length] == prefix | |
end | |
end | |
HEADER_REGEX = /^#import\s+["<](.*)[">]/ | |
BUILD_DIR = File.expand_path("~/Code/project_xyz") | |
BUILD_CMD = 'xcodebuild -target "Project XYZ" -configuration "Debug" build > /tmp/import_minimizer-build.log 2>&1' | |
FILE_TO_MINIMIZE = ARGV.shift | |
unless File.readable?(FILE_TO_MINIMIZE) | |
puts "Usage: import_minimizer.rb FileToMinimize.m" | |
puts "\t file path must be relative to #{BUILD_DIR} (or an absolute path)" | |
exit 1 | |
end | |
Dir.chdir(BUILD_DIR) | |
lines = open(FILE_TO_MINIMIZE, "r").each_line.to_a | |
line_no = 0 | |
counter = 0 | |
puts "testing #{FILE_TO_MINIMIZE}" | |
printf ". checking for duplicates" | |
seen_headers = [] | |
while line_no < lines.length | |
line = lines[line_no] | |
line_no += 1 | |
next unless line.starts_with? "#import " | |
header = line[HEADER_REGEX, 1] | |
if seen_headers.include?(header) | |
lines[line_no-1] = "// #{line.strip} // -- duplicate\n" | |
counter += 1 | |
end | |
seen_headers << header | |
end | |
puts " - found: #{counter}" | |
line_no = 0 | |
while line_no < lines.length | |
line = lines[line_no] | |
unless line.starts_with? "#import " | |
line_no += 1 | |
next | |
end | |
orig_line = line | |
header = line[HEADER_REGEX, 1] | |
printf ". checking import: #{header}" | |
lines[line_no] = "// #{orig_line.strip} // -- not needed\n" | |
open(FILE_TO_MINIMIZE, "w+") { |f| f.write(lines.join) } | |
`#{BUILD_CMD}` | |
if ($?.exitstatus != 0) | |
lines[line_no] = orig_line | |
puts " - needed" | |
else | |
puts " - NOT needed" | |
counter += 1 | |
end | |
line_no += 1 | |
end | |
puts "\nFound #{counter} #import's that are not needed / duplicates" | |
open(FILE_TO_MINIMIZE, "w+") { |f| f.write(lines.join) } |
Hi, I just have a question on how exactly to use this script, because I keep getting this error.
import_minimizer.rb:16:in readable?': no implicit conversion of nil into String (TypeError) from import_minimizer.rb:16:in
I changed BUILD_DIR & BUILD_CMD correctly but I can't get this to work.
Thanks!!
@soniccat I got it to work, but It only checks the first file with your way.
Is there a way to recursively search every folder and check every file?
Managed to use this script recursively by doing this on bash
find . -name "*.[mh]" | while read -r dir; do ruby ./import_minimizer.rb "${dir}"; done
I dont think this script can remove useless import.
After i update the target and cmd directory, It is able to check duplicate but i manually added some useless import, it is not able to identify it.
If you use Swift in your project, importing the Swift header (SWIFT_OBJC_INTERFACE_HEADER_NAME
) also imports the Swift bridging header (SWIFT_OBJC_BRIDGING_HEADER
). Removing an #import
statement which is also included in the bridging header therefore leads to false-positive results, as the project still compiles.
recommend to add
ARGV.each do|file|
to be able to use it this wayfind . -name "*.[mh]" | xargs ruby ./import_minimizer.rb