)]}'
{"trove/guestagent/pkg.py":[{"author":{"_account_id":10215,"name":"Peter Stachowski","email":"peter@tesora.com","username":"peterstac"},"change_message_id":"c7d3b6ad0c99973d0d57e7074e156f92debcbf8e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                stdout\u003dsubprocess.PIPE,"},{"line_number":50,"context_line":"                                stderr\u003dsubprocess.STDOUT)"},{"line_number":51,"context_line":"    except OSError:"},{"line_number":52,"context_line":"        # ignore errors like program not found"},{"line_number":53,"context_line":"        return b\u0027\u0027"},{"line_number":54,"context_line":"    stdout \u003d proc.communicate()[0]"},{"line_number":55,"context_line":"    return stdout"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_17ce45b7","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":46},"updated":"2016-06-15 15:42:04.000000000","message":"I don\u0027t think we should just eat these - they probably represent coding errors.  Let\u0027s at least log them.\n\n    except OSError:\n        # ignore errors like \u0027program not found\u0027 but log them\n        LOG.exception(_(\"An error occurred running \u0027%s\u0027\") % str(cmd))","commit_id":"6082ce019c760d48218a00287bfac207a8682d9c"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7859a020a1a06540924ae4293cf911aadbb01586","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                stdout\u003dsubprocess.PIPE,"},{"line_number":50,"context_line":"                                stderr\u003dsubprocess.STDOUT)"},{"line_number":51,"context_line":"    except OSError:"},{"line_number":52,"context_line":"        # ignore errors like program not found"},{"line_number":53,"context_line":"        return b\u0027\u0027"},{"line_number":54,"context_line":"    stdout \u003d proc.communicate()[0]"},{"line_number":55,"context_line":"    return stdout"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_52e61bb1","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":46},"in_reply_to":"7aa08908_17ce45b7","updated":"2016-06-16 00:27:20.000000000","message":"I would prefer to restrict my change to porting the code to Python 3. If you want to store logging errors, please write a new change on top of mine.\n\nI already have enough issues to get this change merged :-/","commit_id":"6082ce019c760d48218a00287bfac207a8682d9c"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"03f0a1c4944318c43555e86a673e465bffaf1aeb","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                stdout\u003dsubprocess.PIPE,"},{"line_number":50,"context_line":"                                stderr\u003dsubprocess.STDOUT)"},{"line_number":51,"context_line":"    except OSError:"},{"line_number":52,"context_line":"        # ignore errors like program not found"},{"line_number":53,"context_line":"        return b\u0027\u0027"},{"line_number":54,"context_line":"    stdout \u003d proc.communicate()[0]"},{"line_number":55,"context_line":"    return stdout"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_72aa051c","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":46},"in_reply_to":"7aa08908_3c0e968c","updated":"2016-06-16 13:20:57.000000000","message":"I restrict my changes to adding Python 3 support without changing the behaviour on Python 2.\n\nThe commands.getstatusoutput() function does not raise an exception but return the exit status:\nhttps://hg.python.org/cpython/file/399d49d4acae/Lib/commands.py#l53\n\nMy getoutput() is basically commands.getstatusoutput() reimplemented with the subprocess module. Bonus point: it avoids the usage of a shell and so is more secure (no risk of shell injection).\n\nCurrently, Trove ignores the exit status, so I simply decided to not return it in my getoutput() function.\n\nIf you want to start handling errors, please write a new change. (Well, it doesn\u0027t have to be based on mine, it\u0027s up to you.)","commit_id":"6082ce019c760d48218a00287bfac207a8682d9c"},{"author":{"_account_id":10215,"name":"Peter Stachowski","email":"peter@tesora.com","username":"peterstac"},"change_message_id":"a52041f0febef730225ac5f87aafa492c299dcc3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                stdout\u003dsubprocess.PIPE,"},{"line_number":50,"context_line":"                                stderr\u003dsubprocess.STDOUT)"},{"line_number":51,"context_line":"    except OSError:"},{"line_number":52,"context_line":"        # ignore errors like program not found"},{"line_number":53,"context_line":"        return b\u0027\u0027"},{"line_number":54,"context_line":"    stdout \u003d proc.communicate()[0]"},{"line_number":55,"context_line":"    return stdout"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_3c0e968c","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":46},"in_reply_to":"7aa08908_52e61bb1","updated":"2016-06-16 12:54:14.000000000","message":"Well, you are adding this change as part of the port.  The reason the other error was so hard to find was that the exception was being eaten here.","commit_id":"6082ce019c760d48218a00287bfac207a8682d9c"},{"author":{"_account_id":10215,"name":"Peter Stachowski","email":"peter@tesora.com","username":"peterstac"},"change_message_id":"e68e02ebfd04e3a7465fc356bfa5ae5a1ed846d8","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                stdout\u003dsubprocess.PIPE,"},{"line_number":50,"context_line":"                                stderr\u003dsubprocess.STDOUT)"},{"line_number":51,"context_line":"    except OSError:"},{"line_number":52,"context_line":"        # ignore errors like program not found"},{"line_number":53,"context_line":"        return b\u0027\u0027"},{"line_number":54,"context_line":"    stdout \u003d proc.communicate()[0]"},{"line_number":55,"context_line":"    return stdout"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_54453641","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":46},"in_reply_to":"7aa08908_72aa051c","updated":"2016-06-16 13:24:31.000000000","message":"Fair enough","commit_id":"6082ce019c760d48218a00287bfac207a8682d9c"},{"author":{"_account_id":10215,"name":"Peter Stachowski","email":"peter@tesora.com","username":"peterstac"},"change_message_id":"c7d3b6ad0c99973d0d57e7074e156f92debcbf8e","unresolved":false,"context_lines":[{"line_number":379,"context_line":"            self._fix_package_selections(packages, config_opts)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    def pkg_version(self, package_name):"},{"line_number":382,"context_line":"        std_out \u003d getoutput(\"apt-cache policy\", package_name)"},{"line_number":383,"context_line":"        for line in std_out.split(\"\\n\"):"},{"line_number":384,"context_line":"            m \u003d re.match(\"\\s+Installed: (.*)\", line)"},{"line_number":385,"context_line":"            if m:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_3729c138","line":382,"range":{"start_line":382,"start_character":28,"end_line":382,"end_character":46},"updated":"2016-06-15 15:42:04.000000000","message":"This should be broken into two arguments:\n\n    \"apt-cache\", \"policy\",","commit_id":"6082ce019c760d48218a00287bfac207a8682d9c"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7859a020a1a06540924ae4293cf911aadbb01586","unresolved":false,"context_lines":[{"line_number":379,"context_line":"            self._fix_package_selections(packages, config_opts)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    def pkg_version(self, package_name):"},{"line_number":382,"context_line":"        std_out \u003d getoutput(\"apt-cache policy\", package_name)"},{"line_number":383,"context_line":"        for line in std_out.split(\"\\n\"):"},{"line_number":384,"context_line":"            m \u003d re.match(\"\\s+Installed: (.*)\", line)"},{"line_number":385,"context_line":"            if m:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_e6dbf44d","line":382,"range":{"start_line":382,"start_character":28,"end_line":382,"end_character":46},"in_reply_to":"7aa08908_3729c138","updated":"2016-06-16 00:27:20.000000000","message":"Oops, you\u0027re right! It should now be fixed.","commit_id":"6082ce019c760d48218a00287bfac207a8682d9c"}]}
