Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(34)

Side by Side Diff: translate/storage/cpo.py

Issue 62: CPO support for previous messages SVN Base: https://translate.svn.sourceforge.net/svnroot/translate/src/trunk/
Patch Set: Fixed minor issues Created 1 year, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*- 2 # -*- coding: utf-8 -*-
3 # 3 #
4 # Copyright 2002-2007 Zuza Software Foundation 4 # Copyright 2002-2007 Zuza Software Foundation
5 # 5 #
6 # This file is part of translate. 6 # This file is part of translate.
7 # 7 #
8 # translate is free software; you can redistribute it and/or modify 8 # translate is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by 9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or 10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version. 11 # (at your option) any later version.
12 # 12 #
13 # translate is distributed in the hope that it will be useful, 13 # translate is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details. 16 # GNU General Public License for more details.
17 # 17 #
18 # You should have received a copy of the GNU General Public License 18 # You should have received a copy of the GNU General Public License
19 # along with translate; if not, write to the Free Software 19 # along with translate; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 21
22 """Classes that hold units of .po files (pounit) or entire files (pofile). 22 """Classes that hold units of .po files (pounit) or entire files (pofile).
23 23
24 Gettext-style .po (or .pot) files are used in translations for KDE, GNOME and 24 Gettext-style .po (or .pot) files are used in translations for KDE, GNOME and
25 many other projects. 25 many other projects.
26 26
27 This uses libgettextpo from the gettext package. Any version before 0.17 will 27 This uses libgettextpo from the gettext package. Any version before 0.17 will
28 at least cause some subtle bugs or may not work at all. Developers might want 28 at least cause some subtle bugs or may not work at all. Developers might want
29 to have a look at gettext-tools/libgettextpo/gettext-po.h from the gettext 29 to have a look at gettext-tools/libgettextpo/gettext-po.h from the gettext
30 package for the public API of the library. 30 package for the public API of the library.
31 """ 31 """
32 32
33 from translate.misc.multistring import multistring 33 from translate.misc.multistring import multistring
34 from translate.storage import pocommon 34 from translate.storage import pocommon
35 from translate.misc import quote 35 from translate.misc import quote
36 from translate.lang import data 36 from translate.lang import data
37 from ctypes import * 37 from ctypes import *
38 import ctypes.util 38 import ctypes.util
39 try: 39 try:
40 import cStringIO as StringIO 40 import cStringIO as StringIO
41 except ImportError: 41 except ImportError:
42 import StringIO 42 import StringIO
43 import os 43 import os
44 import pypo 44 import pypo
45 import re 45 import re
46 import sys 46 import sys
47 import tempfile 47 import tempfile
48 48
49 lsep = " " 49 lsep = " "
50 """Seperator for #: entries""" 50 """Seperator for #: entries"""
51 51
52 STRING = c_char_p 52 STRING = c_char_p
53 53
54 # Structures 54 # Structures
55 class po_message(Structure): 55 class po_message(Structure):
56 _fields_ = [] 56 _fields_ = []
57 57
58 # Function prototypes 58 # Function prototypes
59 xerror_prototype = CFUNCTYPE(None, c_int, POINTER(po_message), STRING, c_uint, c _uint, c_int, STRING) 59 xerror_prototype = CFUNCTYPE(None, c_int, POINTER(po_message), STRING, c_uint, c _uint, c_int, STRING)
60 xerror2_prototype = CFUNCTYPE(None, c_int, POINTER(po_message), STRING, c_uint, c_uint, c_int, STRING, POINTER(po_message), STRING, c_uint, c_uint, c_int, STRIN G) 60 xerror2_prototype = CFUNCTYPE(None, c_int, POINTER(po_message), STRING, c_uint, c_uint, c_int, STRING, POINTER(po_message), STRING, c_uint, c_uint, c_int, STRIN G)
61 61
62 62
63 # Structures (error handler) 63 # Structures (error handler)
64 class po_xerror_handler(Structure): 64 class po_xerror_handler(Structure):
65 _fields_ = [('xerror', xerror_prototype), 65 _fields_ = [('xerror', xerror_prototype),
66 ('xerror2', xerror2_prototype)] 66 ('xerror2', xerror2_prototype)]
67 67
68 class po_error_handler(Structure): 68 class po_error_handler(Structure):
69 _fields_ = [ 69 _fields_ = [
70 ('error', CFUNCTYPE(None, c_int, c_int, STRING)), 70 ('error', CFUNCTYPE(None, c_int, c_int, STRING)),
71 ('error_at_line', CFUNCTYPE(None, c_int, c_int, STRING, c_uint, STRING)), 71 ('error_at_line', CFUNCTYPE(None, c_int, c_int, STRING, c_uint, STRING)),
72 ('multiline_warning', CFUNCTYPE(None, STRING, STRING)), 72 ('multiline_warning', CFUNCTYPE(None, STRING, STRING)),
73 ('multiline_error', CFUNCTYPE(None, STRING, STRING)), 73 ('multiline_error', CFUNCTYPE(None, STRING, STRING)),
74 ] 74 ]
75 75
76 # Callback functions for po_xerror_handler 76 # Callback functions for po_xerror_handler
77 def xerror_cb(severity, message, filename, lineno, column, multilint_p, message_ text): 77 def xerror_cb(severity, message, filename, lineno, column, multilint_p, message_ text):
78 print >> sys.stderr, "xerror_cb", severity, message, filename, lineno, colum n, multilint_p, message_text 78 print >> sys.stderr, "xerror_cb", severity, message, filename, lineno, colum n, multilint_p, message_text
79 if severity >= 1: 79 if severity >= 1:
80 raise ValueError(message_text) 80 raise ValueError(message_text)
81 81
82 def xerror2_cb(severity, message1, filename1, lineno1, column1, multiline_p1, me ssage_text1, message2, filename2, lineno2, column2, multiline_p2, message_text2) : 82 def xerror2_cb(severity, message1, filename1, lineno1, column1, multiline_p1, me ssage_text1, message2, filename2, lineno2, column2, multiline_p2, message_text2) :
83 print >> sys.stderr, "xerror2_cb", severity, message1, filename1, lineno1, c olumn1, multiline_p1, message_text1, message2, filename2, lineno2, column2, mult iline_p2, message_text2 83 print >> sys.stderr, "xerror2_cb", severity, message1, filename1, lineno1, c olumn1, multiline_p1, message_text1, message2, filename2, lineno2, column2, mult iline_p2, message_text2
84 if severity >= 1: 84 if severity >= 1:
85 raise ValueError(message_text1) 85 raise ValueError(message_text1)
86 86
87 87
88 88
89 # Load libgettextpo 89 # Load libgettextpo
90 gpo = None 90 gpo = None
91 # 'gettextpo' is recognised on Unix, while only 'libgettextpo' is recognised on 91 # 'gettextpo' is recognised on Unix, while only 'libgettextpo' is recognised on
92 # windows. Therefore we test both. 92 # windows. Therefore we test both.
93 names = ['gettextpo', 'libgettextpo'] 93 names = ['gettextpo', 'libgettextpo']
94 for name in names: 94 for name in names:
95 lib_location = ctypes.util.find_library(name) 95 lib_location = ctypes.util.find_library(name)
96 if lib_location: 96 if lib_location:
97 gpo = cdll.LoadLibrary(lib_location) 97 gpo = cdll.LoadLibrary(lib_location)
98 if gpo: 98 if gpo:
99 break 99 break
100 else: 100 else:
101 # Now we are getting desperate, so let's guess a unix type DLL that might 101 # Now we are getting desperate, so let's guess a unix type DLL that might
102 # be in LD_LIBRARY_PATH or loaded with LD_PRELOAD 102 # be in LD_LIBRARY_PATH or loaded with LD_PRELOAD
103 try: 103 try:
104 gpo = cdll.LoadLibrary('libgettextpo.so') 104 gpo = cdll.LoadLibrary('libgettextpo.so')
105 except OSError, e: 105 except OSError, e:
106 raise ImportError("gettext PO library not found") 106 raise ImportError("gettext PO library not found")
107 107
108 # Setup return and paramater types 108 # Setup return and paramater types
109 # File access 109 # File access
110 gpo.po_file_read_v3.argtypes = [STRING, POINTER(po_xerror_handler)] 110 gpo.po_file_read_v3.argtypes = [STRING, POINTER(po_xerror_handler)]
111 gpo.po_file_write_v2.argtypes = [c_int, STRING, POINTER(po_xerror_handler)] 111 gpo.po_file_write_v2.argtypes = [c_int, STRING, POINTER(po_xerror_handler)]
112 gpo.po_file_write_v2.retype = c_int 112 gpo.po_file_write_v2.retype = c_int
113 113
114 # Header 114 # Header
115 gpo.po_file_domain_header.restype = STRING 115 gpo.po_file_domain_header.restype = STRING
116 gpo.po_header_field.restype = STRING 116 gpo.po_header_field.restype = STRING
117 gpo.po_header_field.argtypes = [STRING, STRING] 117 gpo.po_header_field.argtypes = [STRING, STRING]
118 118
119 # Locations (filepos) 119 # Locations (filepos)
120 gpo.po_filepos_file.restype = STRING 120 gpo.po_filepos_file.restype = STRING
121 gpo.po_message_filepos.restype = c_int 121 gpo.po_message_filepos.restype = c_int
122 gpo.po_message_filepos.argtypes = [c_int, c_int] 122 gpo.po_message_filepos.argtypes = [c_int, c_int]
123 gpo.po_message_add_filepos.argtypes = [c_int, STRING, c_int] 123 gpo.po_message_add_filepos.argtypes = [c_int, STRING, c_int]
124 124
125 # Message (get methods) 125 # Message (get methods)
126 gpo.po_message_comments.restype = STRING 126 gpo.po_message_comments.restype = STRING
127 gpo.po_message_extracted_comments.restype = STRING 127 gpo.po_message_extracted_comments.restype = STRING
128 gpo.po_message_prev_msgctxt.restype = STRING 128 gpo.po_message_prev_msgctxt.restype = STRING
129 gpo.po_message_prev_msgid.restype = STRING 129 gpo.po_message_prev_msgid.restype = STRING
130 gpo.po_message_prev_msgid_plural.restype = STRING 130 gpo.po_message_prev_msgid_plural.restype = STRING
131 gpo.po_message_is_format.restype = c_int 131 gpo.po_message_is_format.restype = c_int
132 gpo.po_message_msgctxt.restype = STRING 132 gpo.po_message_msgctxt.restype = STRING
133 gpo.po_message_msgid.restype = STRING 133 gpo.po_message_msgid.restype = STRING
134 gpo.po_message_msgid_plural.restype = STRING 134 gpo.po_message_msgid_plural.restype = STRING
135 gpo.po_message_msgstr.restype = STRING 135 gpo.po_message_msgstr.restype = STRING
136 gpo.po_message_msgstr_plural.restype = STRING 136 gpo.po_message_msgstr_plural.restype = STRING
137 137
138 # Message (set methods) 138 # Message (set methods)
139 gpo.po_message_set_comments.argtypes = [c_int, STRING] 139 gpo.po_message_set_comments.argtypes = [c_int, STRING]
140 gpo.po_message_set_extracted_comments.argtypes = [c_int, STRING] 140 gpo.po_message_set_extracted_comments.argtypes = [c_int, STRING]
141 gpo.po_message_set_fuzzy.argtypes = [c_int, c_int] 141 gpo.po_message_set_fuzzy.argtypes = [c_int, c_int]
142 gpo.po_message_set_msgctxt.argtypes = [c_int, STRING] 142 gpo.po_message_set_msgctxt.argtypes = [c_int, STRING]
143 gpo.po_message_set_prev_msgctxt.argtypes = [c_int, STRING]
144 gpo.po_message_set_prev_msgid.argtypes = [c_int, STRING]
145 gpo.po_message_set_prev_msgid_plural.argtypes = [c_int, STRING]
143 146
144 # Setup the po_xerror_handler 147 # Setup the po_xerror_handler
145 xerror_handler = po_xerror_handler() 148 xerror_handler = po_xerror_handler()
146 xerror_handler.xerror = xerror_prototype(xerror_cb) 149 xerror_handler.xerror = xerror_prototype(xerror_cb)
147 xerror_handler.xerror2 = xerror2_prototype(xerror2_cb) 150 xerror_handler.xerror2 = xerror2_prototype(xerror2_cb)
148 151
149 def escapeforpo(text): 152 def escapeforpo(text):
150 return pypo.escapeforpo(text) 153 return pypo.escapeforpo(text)
151 154
152 def quoteforpo(text): 155 def quoteforpo(text):
153 return pypo.quoteforpo(text) 156 return pypo.quoteforpo(text)
154 157
155 def unquotefrompo(postr, joinwithlinebreak=False): 158 def unquotefrompo(postr, joinwithlinebreak=False):
156 return pypo.unquotefrompo(postr, joinwithlinebreak) 159 return pypo.unquotefrompo(postr, joinwithlinebreak)
157 160
158 def encodingToUse(encoding): 161 def encodingToUse(encoding):
159 return pypo.encodingToUse(encoding) 162 return pypo.encodingToUse(encoding)
160 163
161 def get_libgettextpo_version(): 164 def get_libgettextpo_version():
162 """Returns the libgettextpo version 165 """Returns the libgettextpo version
163 166
164 @return: a three-value tuple containing the libgettextpo version in the 167 @return: a three-value tuple containing the libgettextpo version in the
165 following format: 168 following format:
166 (major version, minor version, subminor version) 169 (major version, minor version, subminor version)
167 """ 170 """
168 libversion = c_long.in_dll(gpo, 'libgettextpo_version') 171 libversion = c_long.in_dll(gpo, 'libgettextpo_version')
169 major = libversion.value >> 16 172 major = libversion.value >> 16
170 minor = libversion.value >> 8 173 minor = libversion.value >> 8
171 subminor = libversion.value - (major << 16) - (minor << 8) 174 subminor = libversion.value - (major << 16) - (minor << 8)
172 return major, minor, subminor 175 return major, minor, subminor
173 176
174 177
175 class pounit(pocommon.pounit): 178 class pounit(pocommon.pounit):
176 def __init__(self, source=None, encoding='utf-8', gpo_message=None): 179 def __init__(self, source=None, encoding='utf-8', gpo_message=None):
177 self._encoding = encoding 180 self._encoding = encoding
178 if not gpo_message: 181 if not gpo_message:
179 self._gpo_message = gpo.po_message_create() 182 self._gpo_message = gpo.po_message_create()
180 if source or source == "": 183 if source or source == "":
181 self.source = source 184 self.source = source
182 self.target = "" 185 self.target = ""
183 elif gpo_message: 186 elif gpo_message:
184 self._gpo_message = gpo_message 187 self._gpo_message = gpo_message
185 188
186 def setmsgidcomment(self, msgidcomment): 189 def setmsgidcomment(self, msgidcomment):
187 if msgidcomment: 190 if msgidcomment:
188 newsource = "_: " + msgidcomment + "\n" + self.source 191 newsource = "_: " + msgidcomment + "\n" + self.source
189 self.source = newsource 192 self.source = newsource
190 msgidcomment = property(None, setmsgidcomment) 193 msgidcomment = property(None, setmsgidcomment)
191 194
192 def setmsgid_plural(self, msgid_plural): 195 def setmsgid_plural(self, msgid_plural):
193 if isinstance(msgid_plural, list): 196 if isinstance(msgid_plural, list):
194 msgid_plural = "".join(msgid_plural) 197 msgid_plural = "".join(msgid_plural)
195 gpo.po_message_set_msgid_plural(self._gpo_message, msgid_plural) 198 gpo.po_message_set_msgid_plural(self._gpo_message, msgid_plural)
196 msgid_plural = property(None, setmsgid_plural) 199 msgid_plural = property(None, setmsgid_plural)
200
201 def setprev_context(self, context):
202 """Set the previous context for this message"""
203 if self.isfuzzy():
204 return
205 gpo.po_message_set_prev_msgctxt(self._gpo_message, context)
206
207 def getprev_context(self):
208 """Get the previous context for this message, if any """
209 prev_ctxt = gpo.po_message_prev_msgctxt(self._gpo_message)
210 if not prev_ctxt:
211 return ""
212 return prev_ctxt
213
214 prev_context = property(getprev_context, setprev_context)
215
216 def setprev_source(self, prev_source):
217 """Set msgid as a previous msgid for this message"""
218 if self.isfuzzy():
219 return
220 if not self.source:
221 return
222 if isinstance(prev_source, multistring):
223 prev_source = prev_source.strings
224 if isinstance(prev_source, unicode):
225 prev_source = prev_source.encode(self._encoding)
226 if isinstance(prev_source, list):
227 if len(prev_source) > 1:
228 msgid_plural = str(prev_source[1])
229 if isinstance(msgid_plural, list):
230 msgid_plural = "".join(msgid_plural)
231
232 gpo.po_message_set_prev_msgid_plural(self._gpo_message,
233 msgid_plural)
234 prev_source = str(prev_source[0])
235
236 gpo.po_message_set_prev_msgid(self._gpo_message, prev_source)
237
238 def getprev_source(self):
239 """Get the previous msgid for this message, if any"""
240 prev_source = gpo.po_message_prev_msgid(self._gpo_message)
241 if not prev_source:
242 return multistring(u"")
243
244 prev_source = multistring(prev_source, self._encoding)
245 prev_plural = gpo.po_message_prev_msgid_plural(self._gpo_message)
246 if prev_plural:
247 prev_source.strings.append(prev_plural.decode(self._encoding))
248 return prev_source
249
250 prev_source = property(getprev_source, setprev_source)
251
252 def set_as_previous(self):
253 """Sets the current msgid as previous message. Then, the current
254 msgid could be filled with a new msgid. Note that, if a unit
255 contains a previous msgid, it also is marked as fuzzy (to keep the
256 same behavior as msgmerge).
257 """
258 if not self.target:
259 return
260 # since the context accessor might also return KDE style comments, I'm
261 # just using the libgettextpo accessor to retrive only the context
262 self.prev_context = gpo.po_message_msgctxt(self._gpo_message)
263 self.prev_source = self.source
264 self.source = ""
265 self.markfuzzy()
197 266
198 def getsource(self): 267 def getsource(self):
199 def remove_msgid_comments(text): 268 def remove_msgid_comments(text):
200 if not text: 269 if not text:
201 return text 270 return text
202 if text.startswith("_:"): 271 if text.startswith("_:"):
203 remainder = re.search(r"_: .*\n(.*)", text) 272 remainder = re.search(r"_: .*\n(.*)", text)
204 if remainder: 273 if remainder:
205 return remainder.group(1) 274 return remainder.group(1)
206 else: 275 else:
207 return u"" 276 return u""
208 else: 277 else:
209 return text 278 return text
210 singular = remove_msgid_comments(gpo.po_message_msgid(self._gpo_message) ) 279 singular = remove_msgid_comments(gpo.po_message_msgid(self._gpo_message) )
211 if singular: 280 if singular:
212 multi = multistring(singular, self._encoding) 281 multi = multistring(singular, self._encoding)
213 if self.hasplural(): 282 if self.hasplural():
214 pluralform = gpo.po_message_msgid_plural(self._gpo_message) 283 pluralform = gpo.po_message_msgid_plural(self._gpo_message)
215 if isinstance(pluralform, str): 284 if isinstance(pluralform, str):
216 pluralform = pluralform.decode(self._encoding) 285 pluralform = pluralform.decode(self._encoding)
217 multi.strings.append(pluralform) 286 multi.strings.append(pluralform)
218 return multi 287 return multi
219 else: 288 else:
220 return u"" 289 return u""
221 290
222 def setsource(self, source): 291 def setsource(self, source):
223 if isinstance(source, multistring): 292 if isinstance(source, multistring):
224 source = source.strings 293 source = source.strings
225 if isinstance(source, unicode): 294 if isinstance(source, unicode):
226 source = source.encode(self._encoding) 295 source = source.encode(self._encoding)
227 if isinstance(source, list): 296 if isinstance(source, list):
228 gpo.po_message_set_msgid(self._gpo_message, str(source[0])) 297 gpo.po_message_set_msgid(self._gpo_message, str(source[0]))
229 if len(source) > 1: 298 if len(source) > 1:
230 gpo.po_message_set_msgid_plural(self._gpo_message, str(source[1] )) 299 gpo.po_message_set_msgid_plural(self._gpo_message, str(source[1] ))
231 else: 300 else:
232 gpo.po_message_set_msgid(self._gpo_message, source) 301 gpo.po_message_set_msgid(self._gpo_message, source)
233 gpo.po_message_set_msgid_plural(self._gpo_message, None) 302 gpo.po_message_set_msgid_plural(self._gpo_message, None)
234 303
235 source = property(getsource, setsource) 304 source = property(getsource, setsource)
236 305
237 def gettarget(self): 306 def gettarget(self):
238 if self.hasplural(): 307 if self.hasplural():
239 plurals = [] 308 plurals = []
240 nplural = 0 309 nplural = 0
241 plural = gpo.po_message_msgstr_plural(self._gpo_message, nplural) 310 plural = gpo.po_message_msgstr_plural(self._gpo_message, nplural)
242 while plural: 311 while plural:
243 plurals.append(plural) 312 plurals.append(plural)
244 nplural += 1 313 nplural += 1
245 plural = gpo.po_message_msgstr_plural(self._gpo_message, nplural ) 314 plural = gpo.po_message_msgstr_plural(self._gpo_message, nplural )
246 if plurals: 315 if plurals:
(...skipping 388 matching lines...) Show 10 above Show 10 below
635 posrc = input.read() 704 posrc = input.read()
636 input.close() 705 input.close()
637 input = posrc 706 input = posrc
638 707
639 needtmpfile = not os.path.isfile(input) 708 needtmpfile = not os.path.isfile(input)
640 if needtmpfile: 709 if needtmpfile:
641 # This is not a file - we write the string to a temporary file 710 # This is not a file - we write the string to a temporary file
642 fd, fname = tempfile.mkstemp(prefix='translate', suffix='.po') 711 fd, fname = tempfile.mkstemp(prefix='translate', suffix='.po')
643 os.write(fd, input) 712 os.write(fd, input)
644 input = fname 713 input = fname
645 os.close(fd) 714 os.close(fd)
646 715
647 self._gpo_memory_file = gpo.po_file_read_v3(input, xerror_handler) 716 self._gpo_memory_file = gpo.po_file_read_v3(input, xerror_handler)
648 if self._gpo_memory_file is None: 717 if self._gpo_memory_file is None:
649 print >> sys.stderr, "Error:" 718 print >> sys.stderr, "Error:"
650 719
651 if needtmpfile: 720 if needtmpfile:
652 os.remove(input) 721 os.remove(input)
653 722
654 # Handle xerrors here 723 # Handle xerrors here
655 self._header = gpo.po_file_domain_header(self._gpo_memory_file, None) 724 self._header = gpo.po_file_domain_header(self._gpo_memory_file, None)
656 if self._header: 725 if self._header:
657 charset = gpo.po_header_field(self._header, "Content-Type") 726 charset = gpo.po_header_field(self._header, "Content-Type")
658 if charset: 727 if charset:
659 charset = re.search("charset=([^\\s]+)", charset).group(1) 728 charset = re.search("charset=([^\\s]+)", charset).group(1)
660 self._encoding = encodingToUse(charset) 729 self._encoding = encodingToUse(charset)
661 self._gpo_message_iterator = gpo.po_message_iterator(self._gpo_memory_fi le, None) 730 self._gpo_message_iterator = gpo.po_message_iterator(self._gpo_memory_fi le, None)
662 newmessage = gpo.po_next_message(self._gpo_message_iterator) 731 newmessage = gpo.po_next_message(self._gpo_message_iterator)
663 while newmessage: 732 while newmessage:
664 newunit = pounit(gpo_message=newmessage) 733 newunit = pounit(gpo_message=newmessage)
665 self.units.append(newunit) 734 self.units.append(newunit)
666 newmessage = gpo.po_next_message(self._gpo_message_iterator) 735 newmessage = gpo.po_next_message(self._gpo_message_iterator)
667 self._free_iterator() 736 self._free_iterator()
668 737
669 def __del__(self): 738 def __del__(self):
670 # We currently disable this while we still get segmentation faults. 739 # We currently disable this while we still get segmentation faults.
671 # Note that this is definitely leaking memory because of this. 740 # Note that this is definitely leaking memory because of this.
672 return 741 return
673 self._free_iterator() 742 self._free_iterator()
674 if self._gpo_memory_file is not None: 743 if self._gpo_memory_file is not None:
675 gpo.po_file_free(self._gpo_memory_file) 744 gpo.po_file_free(self._gpo_memory_file)
676 self._gpo_memory_file = None 745 self._gpo_memory_file = None
677 746
678 def _free_iterator(self): 747 def _free_iterator(self):
679 # We currently disable this while we still get segmentation faults. 748 # We currently disable this while we still get segmentation faults.
680 # Note that this is definitely leaking memory because of this. 749 # Note that this is definitely leaking memory because of this.
681 return 750 return
682 if self._gpo_message_iterator is not None: 751 if self._gpo_message_iterator is not None:
683 gpo.po_message_iterator_free(self._gpo_message_iterator) 752 gpo.po_message_iterator_free(self._gpo_message_iterator)
684 self._gpo_message_iterator = None 753 self._gpo_message_iterator = None
OLDNEW

Powered by Google App Engine
This is Rietveld r159