# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # frozen_string_literal: true require 'pathname' namespace :hhvm do def filter_set_hhvm_third_party_source_args(tokens) args = tokens[0] allowed_arguments = tokens[1..].each_slice(2) .filter do |key, _value| !key.end_with?('_URL') && !key.end_with?('_HASH') end allowed_arguments .flatten .prepend(" #{args}") .join("\n ") end def split_set_hhvm_third_party_source_args(section_content) section_content .split("\n") .map do |line| hash_index = line.index '#' line = line[...hash_index] unless hash_index.nil? line.strip end end def rewrite_set_hhvm_third_party_source_args(contents) set_hhvm_start = contents.index 'SET_HHVM_THIRD_PARTY_SOURCE_ARGS(' return nil if set_hhvm_start.nil? section_contents = contents[set_hhvm_start + 'SET_HHVM_THIRD_PARTY_SOURCE_ARGS('.length..] set_hhvm_end = section_contents.index ')' lines = split_set_hhvm_third_party_source_args section_contents[...set_hhvm_end] new_cmake_section = filter_set_hhvm_third_party_source_args lines.reject(&:blank?).join(' ').split contents[...set_hhvm_start] + "SET_HHVM_THIRD_PARTY_SOURCE_ARGS(\n#{new_cmake_section}\n)\n" + section_contents[set_hhvm_end..] end desc 'Generates diffs with removed download URLs' task :bundled_dependencies, [:version] do |_, arguments| run_on_source arguments[:version] do |third_party| c_make_lists = third_party + 'CMakeLists.txt' next unless c_make_lists.exist? contents = c_make_lists.read rewritten_cmake = rewrite_set_hhvm_third_party_source_args contents next if rewritten_cmake.nil? puts Open3.capture2('diff', '-Nur', c_make_lists.to_path, '-', stdin_data: rewritten_cmake).first end end desc 'Generated SlackBuild code to prepare bundled dependencies' task :bundled_code, [:version] do |_, arguments| run_on_source arguments[:version] do |third_party| c_make_lists = third_party + 'CMakeLists.txt' next unless c_make_lists.exist? contents = c_make_lists.read set_hhvm_start = contents.index 'SET_HHVM_THIRD_PARTY_SOURCE_ARGS(' next if set_hhvm_start.nil? set_hhvm_end = contents.index ')', set_hhvm_start set_hhvm_start += 'SET_HHVM_THIRD_PARTY_SOURCE_ARGS('.length set_hhvm_end -= 1 contents = contents[set_hhvm_start..set_hhvm_end].split[1..].map(&:strip) src = Pathname.new('third-party') + third_party.basename + "bundled_#{third_party.basename}-prefix" + 'src' bundled = src + "bundled_#{third_party.basename}" archive_name = contents[1][contents[1].rindex('/') + 1..-2] puts "mkdir -p #{bundled}" puts "install -m 0644 -D $CWD/#{archive_name} #{src + archive_name}" puts "tar -zxvf $CWD/#{archive_name} -C #{bundled}" puts end end end private def run_on_source(version, &block) package = Package.new 'development/hhvm', version: version, homepage: 'https://hhvm.com/', requires: %w[tbb glog libdwarf libmemcached dobule-conversion] repository = SlackBuilder.clone 'https://github.com/facebook/hhvm.git', package, 'HHVM-' (repository + 'third-party').each_child do |third_party| block.call third_party end end