OLD | NEW |
1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import argparse | 5 import argparse |
6 import plistlib | 6 import plistlib |
7 import os | 7 import os |
8 import re | 8 import re |
9 import subprocess | 9 import subprocess |
10 import sys | 10 import sys |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 subprocess.check_call(['plutil', '-convert', format, '-o', path, name]) | 134 subprocess.check_call(['plutil', '-convert', format, '-o', path, name]) |
135 finally: | 135 finally: |
136 os.unlink(name) | 136 os.unlink(name) |
137 | 137 |
138 | 138 |
139 def MergePList(plist1, plist2): | 139 def MergePList(plist1, plist2): |
140 """Merges |plist1| with |plist2| recursively. | 140 """Merges |plist1| with |plist2| recursively. |
141 | 141 |
142 Creates a new dictionary representing a Property List (.plist) files by | 142 Creates a new dictionary representing a Property List (.plist) files by |
143 merging the two dictionary |plist1| and |plist2| recursively (only for | 143 merging the two dictionary |plist1| and |plist2| recursively (only for |
144 dictionary values). | 144 dictionary values). List value will be concatenated. |
145 | 145 |
146 Args: | 146 Args: |
147 plist1: a dictionary representing a Property List (.plist) file | 147 plist1: a dictionary representing a Property List (.plist) file |
148 plist2: a dictionary representing a Property List (.plist) file | 148 plist2: a dictionary representing a Property List (.plist) file |
149 | 149 |
150 Returns: | 150 Returns: |
151 A new dictionary representing a Property List (.plist) file by merging | 151 A new dictionary representing a Property List (.plist) file by merging |
152 |plist1| with |plist2|. If any value is a dictionary, they are merged | 152 |plist1| with |plist2|. If any value is a dictionary, they are merged |
153 recursively, otherwise |plist2| value is used. | 153 recursively, otherwise |plist2| value is used. If values are list, they |
| 154 are concatenated. |
154 """ | 155 """ |
155 if not isinstance(plist1, dict) or not isinstance(plist2, dict): | 156 if not isinstance(plist1, dict) or not isinstance(plist2, dict): |
156 if plist2 is not None: | 157 if plist2 is not None: |
157 return plist2 | 158 return plist2 |
158 else: | 159 else: |
159 return plist1 | 160 return plist1 |
160 result = {} | 161 result = {} |
161 for key in set(plist1) | set(plist2): | 162 for key in set(plist1) | set(plist2): |
162 if key in plist2: | 163 if key in plist2: |
163 value = plist2[key] | 164 value = plist2[key] |
164 else: | 165 else: |
165 value = plist1[key] | 166 value = plist1[key] |
166 if isinstance(value, dict): | 167 if isinstance(value, dict): |
167 value = MergePList(plist1.get(key, None), plist2.get(key, None)) | 168 value = MergePList(plist1.get(key, None), plist2.get(key, None)) |
| 169 if isinstance(value, list): |
| 170 value = plist1.get(key, []) + plist2.get(key, []) |
168 result[key] = value | 171 result[key] = value |
169 return result | 172 return result |
170 | 173 |
171 | 174 |
172 class Action(object): | 175 class Action(object): |
173 """Class implementing one action supported by the script.""" | 176 """Class implementing one action supported by the script.""" |
174 | 177 |
175 @classmethod | 178 @classmethod |
176 def Register(cls, subparsers): | 179 def Register(cls, subparsers): |
177 parser = subparsers.add_parser(cls.name, help=cls.help) | 180 parser = subparsers.add_parser(cls.name, help=cls.help) |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 | 245 |
243 for action in [MergeAction, SubstituteAction]: | 246 for action in [MergeAction, SubstituteAction]: |
244 action.Register(subparsers) | 247 action.Register(subparsers) |
245 | 248 |
246 args = parser.parse_args() | 249 args = parser.parse_args() |
247 args.func(args) | 250 args.func(args) |
248 | 251 |
249 | 252 |
250 if __name__ == '__main__': | 253 if __name__ == '__main__': |
251 sys.exit(Main()) | 254 sys.exit(Main()) |
OLD | NEW |