)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12200,"name":"Sebastian Kalinowski","email":"sebastian@kalinowski.eu","username":"prmtl"},"change_message_id":"90bf2759645e7de787df971e0c490994e61fe8c7","unresolved":false,"context_lines":[{"line_number":9,"context_line":"In some cases, plugins will need to be able to run install scripts. This"},{"line_number":10,"context_line":" adds the ability to specify an \u0027install_script\u0027 in the metadata to run"},{"line_number":11,"context_line":" during install"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ieaf2f8e0f208176b39f6de3d098a4675e853dd70"},{"line_number":14,"context_line":"Closes-bug: 1395228"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3a961159_07231e06","line":12,"updated":"2014-12-08 09:39:11.000000000","message":"Needs DocImpact tag","commit_id":"5a16a2a9d8113750ffaf76a92b4887f9e3da577b"}],"fuelclient/fuelclient/objects/plugins.py":[{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"d40176bee5ffd55b1c86bb0182bdca0e5f5d8204","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def run_script(cls, cmd, cwd\u003dNone):"},{"line_number":50,"context_line":"        child \u003d subprocess.popen("},{"line_number":51,"context_line":"            cmd,"},{"line_number":52,"context_line":"            stdout\u003dsubprocess.PIPE,"},{"line_number":53,"context_line":"            stderr\u003dsubprocess.STDOUT,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a890539_0504fd16","line":50,"updated":"2014-11-26 23:45:19.000000000","message":"Why not use subprocess.call or check_call here?","commit_id":"80b9139056201d12a65442a823b79955db01e056"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"5bb01a7af0c61b06945cd2e4279d705ca32a47d6","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            shell\u003dTrue,"},{"line_number":55,"context_line":"            cwd\u003dcwd)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        if self.connection.debug:"},{"line_number":58,"context_line":"            for each in child.stdout:"},{"line_number":59,"context_line":"                self.connection.print_debug(each.rstrip())"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a890539_205d6716","line":57,"updated":"2014-11-27 00:02:34.000000000","message":"self should be cls in this method.","commit_id":"80b9139056201d12a65442a823b79955db01e056"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"d40176bee5ffd55b1c86bb0182bdca0e5f5d8204","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        child.wait()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if exit_code !\u003d 0:"},{"line_number":64,"context_line":"            raise error.GenericProcessingError("},{"line_number":65,"context_line":"                u\u0027Shell command executed with \"{0}\" \u0027"},{"line_number":66,"context_line":"                \u0027exit code: {1} \u0027.format(exit_code, cmd))"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a890539_e51ff16e","line":63,"updated":"2014-11-26 23:45:19.000000000","message":"Where does exit_code come from?","commit_id":"80b9139056201d12a65442a823b79955db01e056"},{"author":{"_account_id":8829,"name":"Ryan Moe","email":"rmoe@mirantis.com","username":"rmoe"},"change_message_id":"27b799f4550fb7c9ed71ac88ff1f3fa20675a7a7","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                    \u0027-\u0027,"},{"line_number":83,"context_line":"                    metadata.get(\u0027version\u0027, \u0027\u0027),"},{"line_number":84,"context_line":"                    \u0027/\u0027,))"},{"line_number":85,"context_line":"                cls.run_script(cmd\u003dpath + install_script, cwd\u003dpath)"},{"line_number":86,"context_line":"        finally:"},{"line_number":87,"context_line":"            plugin_tar.close()"},{"line_number":88,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_a05b17f5","line":85,"updated":"2014-11-27 00:09:24.000000000","message":"Add install_script to the join above","commit_id":"9822f868b2f7a57b376d3eadc4c949d916f9c2b5"},{"author":{"_account_id":12200,"name":"Sebastian Kalinowski","email":"sebastian@kalinowski.eu","username":"prmtl"},"change_message_id":"90bf2759645e7de787df971e0c490994e61fe8c7","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def run_script(cls, cmd, cwd\u003dNone):"},{"line_number":50,"context_line":"        return subprocess.check_output(cmd, cwd\u003dcwd)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @classmethod"},{"line_number":53,"context_line":"    def add_plugin(cls, plugin_meta, plugin_tar):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_32e4d63a","line":50,"updated":"2014-12-08 09:39:11.000000000","message":"Let\u0027s wrap subrocess exceptions in fuel client\u0027s exceptions.","commit_id":"5a16a2a9d8113750ffaf76a92b4887f9e3da577b"}]}
