@@ -115,6 +115,47 @@ def read_legacy_resource(self, path):
115
115
# Transform the parsed result which is an iterator into a dict.
116
116
return {entity .key : entity .val for entity in parser }
117
117
118
+ def read_reference_ftl (self , path ):
119
+ """Read and parse a reference FTL file.
120
+
121
+ A missing resource file is a fatal error and will raise an
122
+ UnreadableReferenceError.
123
+ """
124
+ fullpath = os .path .join (self .reference_dir , path )
125
+ try :
126
+ return self .read_ftl_resource (fullpath )
127
+ except IOError as err :
128
+ error_message = 'Missing reference file: {}' .format (fullpath )
129
+ logging .getLogger ('migrate' ).error (error_message )
130
+ raise UnreadableReferenceError (error_message )
131
+ except UnicodeDecodeError as err :
132
+ error_message = 'Error reading file {}: {}' .format (fullpath , err )
133
+ logging .getLogger ('migrate' ).error (error_message )
134
+ raise UnreadableReferenceError (error_message )
135
+
136
+ def read_localization_ftl (self , path ):
137
+ """Read and parse an existing localization FTL file.
138
+
139
+ Create a new FTL.Resource if the file doesn't exist or can't be
140
+ decoded.
141
+ """
142
+ fullpath = os .path .join (self .localization_dir , path )
143
+ try :
144
+ return self .read_ftl_resource (fullpath )
145
+ except IOError :
146
+ logger = logging .getLogger ('migrate' )
147
+ logger .info (
148
+ 'Localization file {} does not exist and '
149
+ 'it will be created' .format (path ))
150
+ return FTL .Resource ()
151
+ except UnicodeDecodeError :
152
+ logger = logging .getLogger ('migrate' )
153
+ logger .warn (
154
+ 'Localization file {} has broken encoding. '
155
+ 'It will be re-created and some translations '
156
+ 'may be lost' .format (path ))
157
+ return FTL .Resource ()
158
+
118
159
def maybe_add_localization (self , path ):
119
160
"""Add a localization resource to migrate translations from.
120
161
@@ -160,29 +201,16 @@ def get_sources(acc, cur):
160
201
acc .add ((cur .path , cur .key ))
161
202
return acc
162
203
163
- refpath = os .path .join (self .reference_dir , reference )
164
- try :
165
- ast = self .read_ftl_resource (refpath )
166
- except IOError as err :
167
- error_message = 'Missing reference file: {}' .format (refpath )
168
- logging .getLogger ('migrate' ).error (error_message )
169
- raise UnreadableReferenceError (error_message )
170
- except UnicodeDecodeError as err :
171
- error_message = 'Error reading file {}: {}' .format (refpath , err )
172
- logging .getLogger ('migrate' ).error (error_message )
173
- raise UnreadableReferenceError (error_message )
174
- else :
175
- # The reference file will be used by the merge function as
176
- # a template for serializing the merge results.
177
- self .reference_resources [target ] = ast
204
+ reference_ast = self .read_reference_ftl (reference )
205
+ self .reference_resources [target ] = reference_ast
178
206
179
207
for node in transforms :
180
208
# Scan `node` for `Source` nodes and collect the information they
181
209
# store into a set of dependencies.
182
210
dependencies = fold (get_sources , node , set ())
183
211
# Set these sources as dependencies for the current transform.
184
212
self .dependencies [(target , node .id .name )] = dependencies
185
-
213
+
186
214
# Keep track of localization resource paths which were defined as
187
215
# sources in the transforms.
188
216
expected_paths = set ()
@@ -194,7 +222,7 @@ def get_sources(acc, cur):
194
222
for path in set (path for path , _ in dependencies ):
195
223
expected_paths .add (path )
196
224
self .maybe_add_localization (path )
197
-
225
+
198
226
# However, if all legacy resources are missing, bail out early. There
199
227
# are no translations to migrate. We'd also get errors in hg annotate.
200
228
if len (expected_paths ) > 0 and len (self .localization_resources ) == 0 :
@@ -208,21 +236,8 @@ def get_sources(acc, cur):
208
236
path_transforms += transforms
209
237
210
238
if target not in self .localization_resources :
211
- fullpath = os .path .join (self .localization_dir , target )
212
- try :
213
- ast = self .read_ftl_resource (fullpath )
214
- except IOError :
215
- logger = logging .getLogger ('migrate' )
216
- logger .info (
217
- 'Localization file {} does not exist and '
218
- 'it will be created' .format (target ))
219
- except UnicodeDecodeError :
220
- logger = logging .getLogger ('migrate' )
221
- logger .warn (
222
- 'Localization file {} will be re-created and some '
223
- 'translations might be lost' .format (target ))
224
- else :
225
- self .localization_resources [target ] = ast
239
+ target_ast = self .read_localization_ftl (target )
240
+ self .localization_resources [target ] = target_ast
226
241
227
242
def get_source (self , path , key ):
228
243
"""Get an entity value from a localized legacy source.
@@ -277,7 +292,7 @@ def merge_changeset(self, changeset=None):
277
292
}
278
293
279
294
for path , reference in self .reference_resources .iteritems ():
280
- current = self .localization_resources . get ( path , FTL . Resource ())
295
+ current = self .localization_resources [ path ]
281
296
transforms = self .transforms .get (path , [])
282
297
283
298
def in_changeset (ident ):
0 commit comments