Merge ~cjwatson/launchpad:unsixify-translations into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 291d7006c71ab9cabb4e7feacb56a37cdbe3ef98
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:unsixify-translations
Merge into: launchpad:master
Diff against target: 384 lines (+28/-56)
15 files modified
lib/lp/translations/browser/pofile.py (+1/-2)
lib/lp/translations/doc/poexport-language-pack.rst (+1/-1)
lib/lp/translations/doc/potemplate.rst (+3/-3)
lib/lp/translations/doc/potranslation.rst (+0/-11)
lib/lp/translations/doc/translationimportqueue.rst (+1/-3)
lib/lp/translations/doc/translations-export-to-branch.rst (+1/-1)
lib/lp/translations/model/pomsgid.py (+1/-3)
lib/lp/translations/model/potranslation.py (+1/-8)
lib/lp/translations/tests/test_translationimportqueue.py (+1/-2)
lib/lp/translations/utilities/doc/gettext_po_parser.rst (+1/-1)
lib/lp/translations/utilities/gettext_po_parser.py (+5/-5)
lib/lp/translations/utilities/tests/test_file_importer.py (+7/-8)
lib/lp/translations/utilities/translation_import.py (+1/-2)
lib/lp/translations/utilities/translationmerger.py (+0/-3)
lib/lp/translations/utilities/xpi_header.py (+4/-3)
Reviewer Review Type Date Requested Status
Jürgen Gmach Approve
Review via email: mp+442910@code.launchpad.net

Commit message

Remove six from lp.translations

To post a comment you must log in.
Revision history for this message
Jürgen Gmach (jugmac00) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/lib/lp/translations/browser/pofile.py b/lib/lp/translations/browser/pofile.py
index fa958c2..b095a66 100644
--- a/lib/lp/translations/browser/pofile.py
+++ b/lib/lp/translations/browser/pofile.py
@@ -17,7 +17,6 @@ import os.path
17import re17import re
18from urllib.parse import urlencode18from urllib.parse import urlencode
1919
20import six
21from lazr.restful.utils import smartquote20from lazr.restful.utils import smartquote
22from zope.component import getUtility21from zope.component import getUtility
23from zope.publisher.browser import FileUpload22from zope.publisher.browser import FileUpload
@@ -596,7 +595,7 @@ class POFileTranslateView(BaseTranslationView, POFileMetadataViewMixin):
596 self.user is not None595 self.user is not None
597 and translations_person.translations_relicensing_agreement is None596 and translations_person.translations_relicensing_agreement is None
598 ):597 ):
599 url = six.ensure_text(str(self.request.URL), "US-ASCII", "replace")598 url = str(self.request.URL)
600 if self.request.get("QUERY_STRING", None):599 if self.request.get("QUERY_STRING", None):
601 url = url + "?" + self.request["QUERY_STRING"]600 url = url + "?" + self.request["QUERY_STRING"]
602601
diff --git a/lib/lp/translations/doc/poexport-language-pack.rst b/lib/lp/translations/doc/poexport-language-pack.rst
index 751ace6..d4067a3 100644
--- a/lib/lp/translations/doc/poexport-language-pack.rst
+++ b/lib/lp/translations/doc/poexport-language-pack.rst
@@ -98,7 +98,7 @@ And one of the included .po files look like what we expected.
98 >>> fh = tarfile.extractfile(98 >>> fh = tarfile.extractfile(
99 ... "rosetta-hoary/es/LC_MESSAGES/evolution-2.2.po"99 ... "rosetta-hoary/es/LC_MESSAGES/evolution-2.2.po"
100 ... )100 ... )
101 >>> print(six.ensure_text(fh.readline()))101 >>> print(fh.readline().decode())
102 # traducción de es.po al Spanish102 # traducción de es.po al Spanish
103103
104104
diff --git a/lib/lp/translations/doc/potemplate.rst b/lib/lp/translations/doc/potemplate.rst
index 92146d6..f302f86 100644
--- a/lib/lp/translations/doc/potemplate.rst
+++ b/lib/lp/translations/doc/potemplate.rst
@@ -607,7 +607,7 @@ The *-es.po file is indeed the Spanish translation...
607 >>> file_content = tarfile.extractfile(607 >>> file_content = tarfile.extractfile(
608 ... "evolution-2.2/evolution-2.2-es.po"608 ... "evolution-2.2/evolution-2.2-es.po"
609 ... )609 ... )
610 >>> print(six.ensure_text(file_content.readline()))610 >>> print(file_content.readline().decode())
611 # traducción de es.po al Spanish611 # traducción de es.po al Spanish
612612
613And GNU tar can cope with it.613And GNU tar can cope with it.
@@ -615,7 +615,7 @@ And GNU tar can cope with it.
615 >>> from lp.services.helpers import simple_popen2615 >>> from lp.services.helpers import simple_popen2
616 >>> contents = simple_popen2(["tar", "ztf", "-"], tarfile_bytes)616 >>> contents = simple_popen2(["tar", "ztf", "-"], tarfile_bytes)
617 >>> for line in sorted(contents.splitlines()):617 >>> for line in sorted(contents.splitlines()):
618 ... print(six.ensure_text(line))618 ... print(line.decode())
619 ...619 ...
620 evolution-2.2/620 evolution-2.2/
621 evolution-2.2/evolution-2.2-es.po621 evolution-2.2/evolution-2.2-es.po
@@ -629,5 +629,5 @@ And GNU tar can cope with it.
629 ... ["tar", "zxfO", "-", "evolution-2.2/evolution-2.2-es.po"],629 ... ["tar", "zxfO", "-", "evolution-2.2/evolution-2.2-es.po"],
630 ... tarfile_bytes,630 ... tarfile_bytes,
631 ... )631 ... )
632 >>> print(six.ensure_text(pofile).split("\n")[0])632 >>> print(pofile.decode().split("\n")[0])
633 # traducción de es.po al Spanish633 # traducción de es.po al Spanish
diff --git a/lib/lp/translations/doc/potranslation.rst b/lib/lp/translations/doc/potranslation.rst
index 7c1286b..8b44fc3 100644
--- a/lib/lp/translations/doc/potranslation.rst
+++ b/lib/lp/translations/doc/potranslation.rst
@@ -30,14 +30,3 @@ doesn't already exist, use POTranslation.getOrCreateTranslation.
30 >>> got = POTranslation.getOrCreateTranslation("In Xanadu did Kubla Khan")30 >>> got = POTranslation.getOrCreateTranslation("In Xanadu did Kubla Khan")
31 >>> print(got.translation)31 >>> print(got.translation)
32 In Xanadu did Kubla Khan32 In Xanadu did Kubla Khan
33
34If you want to pass non-ascii characters to either of these, it had better be
35either UTF-8 string or, better, a unicode object.
36
37 >>> got = POTranslation.getOrCreateTranslation(b"\xc3\x81")
38 >>> got = POTranslation.getOrCreateTranslation("\u00c2")
39
40 >>> got = POTranslation.getOrCreateTranslation(b"\xc0")
41 Traceback (most recent call last):
42 ...
43 UnicodeDecodeError: 'utf...8' codec can't decode byte 0xc0 in position...
diff --git a/lib/lp/translations/doc/translationimportqueue.rst b/lib/lp/translations/doc/translationimportqueue.rst
index 3801c11..edf81ad 100644
--- a/lib/lp/translations/doc/translationimportqueue.rst
+++ b/lib/lp/translations/doc/translationimportqueue.rst
@@ -1429,11 +1429,9 @@ bug 138650 for an example).
1429If such bad requests do end up on the import queue, the import queue code will1429If such bad requests do end up on the import queue, the import queue code will
1430raise errors about them.1430raise errors about them.
14311431
1432 >>> import six
1433
1434 >>> def print_import_failures(import_script):1432 >>> def print_import_failures(import_script):
1435 ... """List failures recorded in an import script instance."""1433 ... """List failures recorded in an import script instance."""
1436 ... for reason, entries in six.iteritems(script.failures):1434 ... for reason, entries in script.failures.items():
1437 ... print(reason)1435 ... print(reason)
1438 ... for entry in entries:1436 ... for entry in entries:
1439 ... print("-> " + entry)1437 ... print("-> " + entry)
diff --git a/lib/lp/translations/doc/translations-export-to-branch.rst b/lib/lp/translations/doc/translations-export-to-branch.rst
index 4e3507e..f01c7bb 100644
--- a/lib/lp/translations/doc/translations-export-to-branch.rst
+++ b/lib/lp/translations/doc/translations-export-to-branch.rst
@@ -40,7 +40,7 @@ files into the branches. We mock it up here.
40 ...40 ...
41 ... def writeFile(self, path, contents):41 ... def writeFile(self, path, contents):
42 ... self.logger.info("Writing file '%s':" % path)42 ... self.logger.info("Writing file '%s':" % path)
43 ... self.logger.info(six.ensure_text(contents))43 ... self.logger.info(contents.decode())
44 ... self.written_files += 144 ... self.written_files += 1
45 ...45 ...
46 ... def lockForCommit(self):46 ... def lockForCommit(self):
diff --git a/lib/lp/translations/model/pomsgid.py b/lib/lp/translations/model/pomsgid.py
index e00bb54..dd8df23 100644
--- a/lib/lp/translations/model/pomsgid.py
+++ b/lib/lp/translations/model/pomsgid.py
@@ -3,7 +3,6 @@
33
4__all__ = ["POMsgID"]4__all__ = ["POMsgID"]
55
6import six
7from storm.expr import Func6from storm.expr import Func
8from storm.locals import Int, Unicode7from storm.locals import Int, Unicode
9from zope.interface import implementer8from zope.interface import implementer
@@ -46,8 +45,7 @@ class POMsgID(StormBase):
46 IStore(POMsgID)45 IStore(POMsgID)
47 .find(46 .find(
48 POMsgID,47 POMsgID,
49 Func("sha1", POMsgID.msgid)48 Func("sha1", POMsgID.msgid) == Func("sha1", key),
50 == Func("sha1", six.ensure_text(key)),
51 )49 )
52 .one()50 .one()
53 )51 )
diff --git a/lib/lp/translations/model/potranslation.py b/lib/lp/translations/model/potranslation.py
index c367956..5d0626e 100644
--- a/lib/lp/translations/model/potranslation.py
+++ b/lib/lp/translations/model/potranslation.py
@@ -3,7 +3,6 @@
33
4__all__ = ["POTranslation"]4__all__ = ["POTranslation"]
55
6import six
7from storm.expr import Func6from storm.expr import Func
8from storm.locals import Int, Unicode7from storm.locals import Int, Unicode
9from zope.interface import implementer8from zope.interface import implementer
@@ -44,8 +43,7 @@ class POTranslation(StormBase):
44 IStore(POTranslation)43 IStore(POTranslation)
45 .find(44 .find(
46 POTranslation,45 POTranslation,
47 Func("sha1", POTranslation.translation)46 Func("sha1", POTranslation.translation) == Func("sha1", key),
48 == Func("sha1", six.ensure_text(key)),
49 )47 )
50 .one()48 .one()
51 )49 )
@@ -60,11 +58,6 @@ class POTranslation(StormBase):
60 """Return a POTranslation object for the given translation, or create58 """Return a POTranslation object for the given translation, or create
61 it if it doesn't exist.59 it if it doesn't exist.
62 """60 """
63 # If this is not a unicode object, it had better be ASCII or UTF-8.
64 # XXX: JeroenVermeulen 2008-06-06 bug=237868: non-ascii str strings
65 # should be contained in the parser or the browser code.
66 key = six.ensure_text(key)
67
68 try:61 try:
69 return cls.getByTranslation(key)62 return cls.getByTranslation(key)
70 except NotFoundError:63 except NotFoundError:
diff --git a/lib/lp/translations/tests/test_translationimportqueue.py b/lib/lp/translations/tests/test_translationimportqueue.py
index c20bf61..8a51550 100644
--- a/lib/lp/translations/tests/test_translationimportqueue.py
+++ b/lib/lp/translations/tests/test_translationimportqueue.py
@@ -4,7 +4,6 @@
4import os.path4import os.path
5from operator import attrgetter5from operator import attrgetter
66
7import six
8import transaction7import transaction
9from zope.component import getUtility8from zope.component import getUtility
10from zope.security.proxy import removeSecurityProxy9from zope.security.proxy import removeSecurityProxy
@@ -330,7 +329,7 @@ class TestGetGuessedPOFile(TestCaseWithFactory):
330 )329 )
331 queue_entry = self.queue.addOrUpdateEntry(330 queue_entry = self.queue.addOrUpdateEntry(
332 "%s.po" % template_path,331 "%s.po" % template_path,
333 six.ensure_binary(template_name),332 template_name.encode(),
334 True,333 True,
335 self.uploaderperson,334 self.uploaderperson,
336 distroseries=package.distroseries,335 distroseries=package.distroseries,
diff --git a/lib/lp/translations/utilities/doc/gettext_po_parser.rst b/lib/lp/translations/utilities/doc/gettext_po_parser.rst
index ae8013e..76710a3 100644
--- a/lib/lp/translations/utilities/doc/gettext_po_parser.rst
+++ b/lib/lp/translations/utilities/doc/gettext_po_parser.rst
@@ -452,7 +452,7 @@ The special symbols and numeric representations of the chars '8', '80' and 'p'
452are decoded correctly.452are decoded correctly.
453453
454 >>> for translation in translation_file.messages[0].translations:454 >>> for translation in translation_file.messages[0].translations:
455 ... print(repr(six.ensure_str(translation)))455 ... print(repr(translation))
456 ...456 ...
457 '\x07\x08\x0b\x0c\t\x0b\\"\'\n8 8 80 p\n'457 '\x07\x08\x0b\x0c\t\x0b\\"\'\n8 8 80 p\n'
458458
diff --git a/lib/lp/translations/utilities/gettext_po_parser.py b/lib/lp/translations/utilities/gettext_po_parser.py
index 43b5354..a383360 100644
--- a/lib/lp/translations/utilities/gettext_po_parser.py
+++ b/lib/lp/translations/utilities/gettext_po_parser.py
@@ -17,7 +17,6 @@ import re
17from datetime import datetime, timezone17from datetime import datetime, timezone
18from email.utils import parseaddr18from email.utils import parseaddr
1919
20import six
21from zope import datetime as zope_datetime20from zope import datetime as zope_datetime
22from zope.interface import implementer21from zope.interface import implementer
2322
@@ -61,11 +60,14 @@ class POSyntaxWarning(Warning):
61 logging.info(self.message)60 logging.info(self.message)
6261
63 def __str__(self):62 def __str__(self):
64 return six.ensure_text(self.message)63 return self.message
6564
6665
67def parse_charset(string_to_parse, is_escaped=True):66def parse_charset(string_to_parse, is_escaped=True):
68 """Return charset used in the given string_to_parse."""67 """Return charset used in the given string_to_parse."""
68 if isinstance(string_to_parse, bytes):
69 string_to_parse = string_to_parse.decode("UTF-8", "replace")
70
69 # Scan for the charset in the same way that gettext does.71 # Scan for the charset in the same way that gettext does.
70 default_charset = "UTF-8"72 default_charset = "UTF-8"
71 pattern = r"charset=([^\s]+)"73 pattern = r"charset=([^\s]+)"
@@ -75,9 +77,7 @@ def parse_charset(string_to_parse, is_escaped=True):
75 # Default to UTF-8 if the header still has the default value or77 # Default to UTF-8 if the header still has the default value or
76 # is unknown.78 # is unknown.
77 charset = default_charset79 charset = default_charset
78 match = re.search(80 match = re.search(pattern, string_to_parse)
79 pattern, six.ensure_text(string_to_parse, "UTF-8", "replace")
80 )
81 if match is not None and match.group(1) != b"CHARSET":81 if match is not None and match.group(1) != b"CHARSET":
82 charset = match.group(1).strip()82 charset = match.group(1).strip()
83 try:83 try:
diff --git a/lib/lp/translations/utilities/tests/test_file_importer.py b/lib/lp/translations/utilities/tests/test_file_importer.py
index b33596e..b37590d 100644
--- a/lib/lp/translations/utilities/tests/test_file_importer.py
+++ b/lib/lp/translations/utilities/tests/test_file_importer.py
@@ -5,7 +5,6 @@
55
6from textwrap import dedent6from textwrap import dedent
77
8import six
9import transaction8import transaction
10from zope.component import getUtility9from zope.component import getUtility
11from zope.security.proxy import removeSecurityProxy10from zope.security.proxy import removeSecurityProxy
@@ -143,7 +142,7 @@ class FileImporterTestCase(TestCaseWithFactory):
143 potemplate = self.factory.makePOTemplate()142 potemplate = self.factory.makePOTemplate()
144 template_entry = self.translation_import_queue.addOrUpdateEntry(143 template_entry = self.translation_import_queue.addOrUpdateEntry(
145 potemplate.path,144 potemplate.path,
146 six.ensure_binary(pot_content),145 pot_content.encode(),
147 by_maintainer,146 by_maintainer,
148 self.importer_person,147 self.importer_person,
149 productseries=potemplate.productseries,148 productseries=potemplate.productseries,
@@ -172,7 +171,7 @@ class FileImporterTestCase(TestCaseWithFactory):
172 person = person or self.importer_person171 person = person or self.importer_person
173 translation_entry = self.translation_import_queue.addOrUpdateEntry(172 translation_entry = self.translation_import_queue.addOrUpdateEntry(
174 pofile.path,173 pofile.path,
175 six.ensure_binary(po_content),174 po_content.encode(),
176 by_maintainer,175 by_maintainer,
177 person,176 person,
178 productseries=potemplate.productseries,177 productseries=potemplate.productseries,
@@ -202,7 +201,7 @@ class FileImporterTestCase(TestCaseWithFactory):
202 potemplate = self.factory.makePOTemplate()201 potemplate = self.factory.makePOTemplate()
203 template_entry = self.translation_import_queue.addOrUpdateEntry(202 template_entry = self.translation_import_queue.addOrUpdateEntry(
204 potemplate.path,203 potemplate.path,
205 six.ensure_binary(TEST_TEMPLATE_EXPORTED),204 TEST_TEMPLATE_EXPORTED.encode(),
206 False,205 False,
207 self.importer_person,206 self.importer_person,
208 productseries=potemplate.productseries,207 productseries=potemplate.productseries,
@@ -467,7 +466,7 @@ class FileImporterTestCase(TestCaseWithFactory):
467 "should be none.",466 "should be none.",
468 )467 )
469 potmsgset = po_importer.pofile.potemplate.getPOTMsgSetByMsgIDText(468 potmsgset = po_importer.pofile.potemplate.getPOTMsgSetByMsgIDText(
470 six.ensure_text(TEST_MSGID)469 TEST_MSGID
471 )470 )
472 message = potmsgset.getCurrentTranslation(471 message = potmsgset.getCurrentTranslation(
473 po_importer.potemplate,472 po_importer.potemplate,
@@ -561,7 +560,7 @@ class FileImporterTestCase(TestCaseWithFactory):
561 # Although the message has an error, it should still be stored560 # Although the message has an error, it should still be stored
562 # in the database, though only as a suggestion.561 # in the database, though only as a suggestion.
563 potmsgset = po_importer.pofile.potemplate.getPOTMsgSetByMsgIDText(562 potmsgset = po_importer.pofile.potemplate.getPOTMsgSetByMsgIDText(
564 six.ensure_text(TEST_MSGID_ERROR)563 TEST_MSGID_ERROR
565 )564 )
566 message = potmsgset.getLocalTranslationMessages(565 message = potmsgset.getLocalTranslationMessages(
567 po_importer.potemplate, po_importer.pofile.language566 po_importer.potemplate, po_importer.pofile.language
@@ -593,7 +592,7 @@ class FileImporterTestCase(TestCaseWithFactory):
593 po_importer2.importFile()592 po_importer2.importFile()
594593
595 potmsgset = po_importer.pofile.potemplate.getPOTMsgSetByMsgIDText(594 potmsgset = po_importer.pofile.potemplate.getPOTMsgSetByMsgIDText(
596 six.ensure_text(TEST_MSGID_ERROR)595 TEST_MSGID_ERROR
597 )596 )
598 messages = potmsgset.getLocalTranslationMessages(597 messages = potmsgset.getLocalTranslationMessages(
599 po_importer.pofile.potemplate, po_importer.pofile.language598 po_importer.pofile.potemplate, po_importer.pofile.language
@@ -665,7 +664,7 @@ class CreateFileImporterTestCase(TestCaseWithFactory):
665 po_content = TEST_TRANSLATION_FILE % ("", "foo", "bar")664 po_content = TEST_TRANSLATION_FILE % ("", "foo", "bar")
666 queue_entry = self.translation_import_queue.addOrUpdateEntry(665 queue_entry = self.translation_import_queue.addOrUpdateEntry(
667 pofile.path,666 pofile.path,
668 six.ensure_binary(po_content),667 po_content.encode(),
669 by_maintainer,668 by_maintainer,
670 self.importer_person,669 self.importer_person,
671 productseries=pofile.potemplate.productseries,670 productseries=pofile.potemplate.productseries,
diff --git a/lib/lp/translations/utilities/translation_import.py b/lib/lp/translations/utilities/translation_import.py
index 1535590..901bbc1 100644
--- a/lib/lp/translations/utilities/translation_import.py
+++ b/lib/lp/translations/utilities/translation_import.py
@@ -11,7 +11,6 @@ import posixpath
11from datetime import datetime, timezone11from datetime import datetime, timezone
12from operator import attrgetter12from operator import attrgetter
1313
14import six
15import transaction14import transaction
16from storm.exceptions import TimeoutError15from storm.exceptions import TimeoutError
17from zope.component import getUtility16from zope.component import getUtility
@@ -636,7 +635,7 @@ class FileImporter:
636 "pomessage": self.format_exporter.exportTranslationMessageData(635 "pomessage": self.format_exporter.exportTranslationMessageData(
637 message636 message
638 ),637 ),
639 "error-message": six.ensure_text(errormsg),638 "error-message": errormsg,
640 }639 }
641 )640 )
642641
diff --git a/lib/lp/translations/utilities/translationmerger.py b/lib/lp/translations/utilities/translationmerger.py
index 297f54a..2925e1e 100644
--- a/lib/lp/translations/utilities/translationmerger.py
+++ b/lib/lp/translations/utilities/translationmerger.py
@@ -10,7 +10,6 @@ __all__ = [
1010
11from operator import methodcaller11from operator import methodcaller
1212
13import six
14from storm.locals import ClassAlias, Store13from storm.locals import ClassAlias, Store
15from zope.component import getUtility14from zope.component import getUtility
16from zope.security.proxy import removeSecurityProxy15from zope.security.proxy import removeSecurityProxy
@@ -316,8 +315,6 @@ class MessageSharingMerge(LaunchpadScript):
316 sourcepackagename=sourcepackagename,315 sourcepackagename=sourcepackagename,
317 )316 )
318 template_regex = self.options.template_names317 template_regex = self.options.template_names
319 if template_regex is not None:
320 template_regex = six.ensure_text(template_regex)
321 equivalence_classes = subset.groupEquivalentPOTemplates(template_regex)318 equivalence_classes = subset.groupEquivalentPOTemplates(template_regex)
322319
323 class_count = len(equivalence_classes)320 class_count = len(equivalence_classes)
diff --git a/lib/lp/translations/utilities/xpi_header.py b/lib/lp/translations/utilities/xpi_header.py
index b1aa348..cfabddc 100644
--- a/lib/lp/translations/utilities/xpi_header.py
+++ b/lib/lp/translations/utilities/xpi_header.py
@@ -9,7 +9,6 @@ import io
9from email.utils import parseaddr9from email.utils import parseaddr
1010
11import defusedxml.cElementTree as cElementTree11import defusedxml.cElementTree as cElementTree
12import six
13from zope.interface import implementer12from zope.interface import implementer
1413
15from lp.translations.interfaces.translationcommonformat import (14from lp.translations.interfaces.translationcommonformat import (
@@ -65,9 +64,11 @@ class XpiHeader:
65 # Both cElementTree and elementtree fail when trying to parse64 # Both cElementTree and elementtree fail when trying to parse
66 # proper unicode strings. Use our raw input instead.65 # proper unicode strings. Use our raw input instead.
67 try:66 try:
67 raw_content = self._raw_content
68 if not isinstance(raw_content, bytes):
69 raw_content = raw_content.encode()
68 parse = cElementTree.iterparse(70 parse = cElementTree.iterparse(
69 io.BytesIO(six.ensure_binary(self._raw_content)),71 io.BytesIO(raw_content), forbid_dtd=True
70 forbid_dtd=True,
71 )72 )
72 for event, elem in parse:73 for event, elem in parse:
73 if elem.tag == contributor_tag:74 if elem.tag == contributor_tag:

Subscribers

People subscribed via source and target branches

to status/vote changes: