diff --git a/scripts/patch.py b/scripts/patch.py
index e4187d5..38d9016 100644
--- a/scripts/patch.py
+++ b/scripts/patch.py
@@ -1,5 +1,6 @@
import re
import os
+import plist_patch as plist
def RewriteFile(file_to_rewrite, content):
file_to_rewrite.seek(0)
@@ -24,14 +25,8 @@ def PatchInfoPlist(build_config):
sln_dir = os.path.dirname(build_config['sln_path'])
abs_info_plist_path = os.path.join(sln_dir, build_config['info_plist_rel_path'])
- info_plist_file = open(abs_info_plist_path, 'r+')
- content = info_plist_file.read()
-
- version_patt = r'\s*CFBundleVersion\s+[\d\.]+'
- version_node = r'\n\tCFBundleVersion\n\t{0}'.format(build_config['version'])
- content = re.sub(version_patt, version_node, content)
-
- RewriteFile(info_plist_file, content)
+ key_values = {'CFBundleVersion' : build_config['version']}
+ plist.AppendOrReplace(key_values, abs_info_plist_path)
def PathcIos(build_config):
diff --git a/scripts/plist_patch.py b/scripts/plist_patch.py
new file mode 100644
index 0000000..b034937
--- /dev/null
+++ b/scripts/plist_patch.py
@@ -0,0 +1,49 @@
+import xml.etree.ElementTree as ET
+
+def AppendKeyValue(key_name, value, dict_element):
+ key_element = ET.Element('key')
+ key_element.text = key_name
+
+ value_element = ET.Element('string')
+ value_element.text = value
+
+ dict_element.append(key_element)
+ dict_element.append(value_element)
+
+def ReplaceValueByKeyIndex(key_element_index, value, dict_element):
+ value_index = key_element_index + 1
+ value_element = dict_element[value_index]
+ value_element.text = value
+
+def FindIndexByKey(key_name, dict_element):
+ all_keys_elements = dict_element.findall('key')
+
+ is_exists = False
+ index = 0
+
+ for e in all_keys_elements:
+ if e.text == key_name:
+ is_exists = True
+ break
+ index += 1
+
+ element_index = index * 2
+ return element_index if is_exists else -1
+
+def AppendOrReplaceValueByKey(key_name, value, dict_element):
+ key_index = FindIndexByKey(key_name, dict_element)
+ element_exists = key_index >= 0
+
+ if element_exists:
+ ReplaceValueByKeyIndex(key_index, value, dict_element)
+ else:
+ AppendKeyValue(key_name, value, dict_element)
+
+def AppendOrReplace(key_value_dict, abs_plist_path):
+ tree = ET.parse(abs_plist_path)
+ plist_dict = tree.getroot().find('dict')
+
+ for key_name in key_value_dict:
+ AppendOrReplaceValueByKey(key_name, key_value_dict[key_name], plist_dict)
+
+ tree.write(abs_plist_path)
\ No newline at end of file