class XcodeBuildTimer

Public Class Methods

new(options) click to toggle source
# File lib/xcode-build-times.rb, line 8
def initialize(options)
  @inject_path = options[:inject_path] || ''
  @events_file_path = options[:events_file_path]
end

Public Instance Methods

add_timings(xcodeproj_path) click to toggle source
# File lib/xcode-build-times.rb, line 13
  def add_timings(xcodeproj_path)
    begin
      project = Xcodeproj::Project.open(xcodeproj_path)
    rescue Exception => e
      puts '[???]'.yellow + " There were some problems in opening #{xcodeproj_path} : #{e.to_s}"
      return
    end

    project.native_targets.each do |target|
      unless target.shell_script_build_phases.find {|phase| phase.name == 'Timing START'
      }
        timing_start = target.new_shell_script_build_phase('Timing START')
        timing_start.shell_script = <<-eos
      DATE=`date "+%Y-%m-%dT%H:%M:%S.%s"`
      echo "{\\"date\\":\\"$DATE\\", \\"taskName\\":\\"$TARGETNAME\\", \\"event\\":\\"start\\"}," >> #{@events_file_path}
        eos

        index = target.build_phases.index {|phase| (defined? phase.name) && phase.name == 'Timing START'
        }
        target.build_phases.move_from(index, 0)

      end

      unless target.shell_script_build_phases.find {|phase| phase.name == 'Timing END'
      }

        timing_end = target.new_shell_script_build_phase('Timing END')
        timing_end.shell_script = <<-eos
      DATE=`date "+%Y-%m-%dT%H:%M:%S.%s"`
      echo "{\\"date\\":\\"$DATE\\", \\"taskName\\":\\"$TARGETNAME\\", \\"event\\":\\"end\\"}," >> #{@events_file_path}
        eos
      end

    end

    project.save

  end
generate_events_js() click to toggle source
# File lib/xcode-build-times.rb, line 95
def generate_events_js
  begin
    raw_events = File.read(File.expand_path(@events_file_path))
  rescue
    puts '[???]'.yellow + " There were some problems in opening #{@events_file_path} (It doesn't seem that build was created)"
    return
  end

  js_chart_directory = 'xcode-build-times-chart'
  unless File.exist?(js_chart_directory)
    puts "[CHART] Will copy chart to #{Dir.pwd}"
    source_dir = File.expand_path("../#{js_chart_directory}", __FILE__)
    FileUtils.copy_entry(source_dir, File.expand_path(js_chart_directory))
  end

  js_valid_file = "var raw_events = [\n" + raw_events + "\n]"
  open("#{js_chart_directory}/events.js", 'w') do |f|
    f << js_valid_file
    puts '[EVENTS]'.green + " Updated events.js at #{f.path}\n" +
         '[EVENTS]'.green + " It's time to open #{js_chart_directory}/gantt.html"
  end
end
inject_timings_to_all_projects() click to toggle source
# File lib/xcode-build-times.rb, line 72
def inject_timings_to_all_projects

  Dir.chdir(@inject_path) {
    all_xcode_projects = Dir.glob('**/*.xcodeproj').reject {|path| !File.directory?(path)}
    all_xcode_projects.each {|xcodeproj|
      puts "Adding timings phases to #{xcodeproj.green}"
      add_timings(xcodeproj)
    }
  }
end
remove_timings(xcodeproj_path) click to toggle source
# File lib/xcode-build-times.rb, line 52
def remove_timings(xcodeproj_path)
  begin
    project = Xcodeproj::Project.open(xcodeproj_path)
  rescue Exception => e
    puts '[???]'.yellow + " There were some problems in opening #{xcodeproj_path} : #{e.to_s}"
    return
  end

  project.native_targets.each do |target|
    start_target = target.shell_script_build_phases.find {|phase| phase.name == 'Timing START' }
    start_target.remove_from_project if start_target

    end_target = target.shell_script_build_phases.find {|phase| phase.name == 'Timing END' }
    end_target.remove_from_project if end_target
  end

  project.save

end
remove_timings_from_all_projects() click to toggle source
# File lib/xcode-build-times.rb, line 83
def remove_timings_from_all_projects

  Dir.chdir(@inject_path) {
    all_xcode_projects = Dir.glob('**/*.xcodeproj').reject {|path| !File.directory?(path)}
    all_xcode_projects.each {|xcodeproj|
      puts "Removing timings phases from #{xcodeproj.green}"
      remove_timings(xcodeproj)
    }
  }
end