Class: Xcodeproj::Project::Object::XCBuildConfiguration

Inherits:
Object
  • Object
show all
Defined in:
lib/kintsugi/xcodeproj_extensions.rb

Overview

Extends ‘XCBuildConfiguration` to convert array settings (which might be either array or string) to actual arrays in `to_tree_hash` so diffs are always between arrays. This means that if the values in both `ours` and `theirs` are different strings, we will know to solve the conflict into an array containing both strings. Code was mostly copied from github.com/CocoaPods/Xcodeproj/blob/master/lib/xcodeproj/project/object/build_configuration.rb#L211

Constant Summary collapse

@@old_to_tree_hash =
instance_method(:to_tree_hash)

Instance Method Summary collapse

Instance Method Details

#convert_array_settings_to_arrays(settings) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/kintsugi/xcodeproj_extensions.rb', line 95

def convert_array_settings_to_arrays(settings)
  return unless settings

  array_settings = BuildSettingsArraySettingsByObjectVersion[project.object_version]

  settings.each_key do |key|
    value = settings[key]
    next unless value.is_a?(String)

    stripped_key = key.sub(/\[[^\]]+\]$/, '')
    next unless array_settings.include?(stripped_key)

    array_value = split_string_setting_into_array(value)
    settings[key] = array_value
  end
end

#split_string_setting_into_array(string) ⇒ Object



112
113
114
# File 'lib/kintsugi/xcodeproj_extensions.rb', line 112

def split_string_setting_into_array(string)
  string.scan(/ *((['"]?).*?[^\\]\2)(?=( |\z))/).map(&:first)
end

#to_tree_hashObject



89
90
91
92
93
# File 'lib/kintsugi/xcodeproj_extensions.rb', line 89

def to_tree_hash
  @@old_to_tree_hash.bind(self).call.tap do |hash|
    convert_array_settings_to_arrays(hash['buildSettings'])
  end
end