)]}'
{"rally/common/utils.py":[{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"d597da7520f8836e9a8769b48ea812d1b2ce101c","unresolved":false,"context_lines":[{"line_number":715,"context_line":"            interruptable_sleep(sec)"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"def generate_random_path(root_dir\u003dNone):"},{"line_number":719,"context_line":"    root_dir \u003d root_dir or tempfile.gettempdir()"},{"line_number":720,"context_line":"    path \u003d None"},{"line_number":721,"context_line":"    while path is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_bffa3541","line":718,"range":{"start_line":718,"start_character":25,"end_line":718,"end_character":33},"updated":"2016-12-28 10:43:28.000000000","message":"root_dir may mislead people. What about just \u0027dir\u0027?","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ef9c67949133b001bd857560bf2eec5bdbfcd19a","unresolved":false,"context_lines":[{"line_number":715,"context_line":"            interruptable_sleep(sec)"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"def generate_random_path(root_dir\u003dNone):"},{"line_number":719,"context_line":"    root_dir \u003d root_dir or tempfile.gettempdir()"},{"line_number":720,"context_line":"    path \u003d None"},{"line_number":721,"context_line":"    while path is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_a5122455","line":718,"range":{"start_line":718,"start_character":25,"end_line":718,"end_character":33},"in_reply_to":"da4df55a_bffa3541","updated":"2016-12-28 11:00:27.000000000","message":"As for me, root_dir is more clear name. I\u0027ll add docstring, so everyone will be satisfied :)","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"5074e03feccd8fff2ddb08229cd91f4e7299fb3d","unresolved":false,"context_lines":[{"line_number":716,"context_line":""},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"def generate_random_path(root_dir\u003dNone):"},{"line_number":719,"context_line":"    \"\"\"Generates a vacant name foo file or dir at specified place."},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"    :param root_dir: Name of a directory to generate path in. If None (default"},{"line_number":722,"context_line":"        behaviour), temporary directory (i.e /tmp in linux) will be used."}],"source_content_type":"text/x-python","patch_set":6,"id":"da4df55a_d49a7b6d","line":719,"range":{"start_line":719,"start_character":31,"end_line":719,"end_character":34},"updated":"2016-12-28 12:46:51.000000000","message":"for","commit_id":"76565603a4544e698f9ace0bf9c12c139bf764c7"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"f18cd8a9eae8c97e436fb820d1ce820455039944","unresolved":false,"context_lines":[{"line_number":716,"context_line":""},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"def generate_random_path(root_dir\u003dNone):"},{"line_number":719,"context_line":"    \"\"\"Generates a vacant name foo file or dir at specified place."},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"    :param root_dir: Name of a directory to generate path in. If None (default"},{"line_number":722,"context_line":"        behaviour), temporary directory (i.e /tmp in linux) will be used."}],"source_content_type":"text/x-python","patch_set":6,"id":"da4df55a_6add64df","line":719,"range":{"start_line":719,"start_character":31,"end_line":719,"end_character":34},"in_reply_to":"da4df55a_d49a7b6d","updated":"2016-12-28 14:46:30.000000000","message":"Done","commit_id":"76565603a4544e698f9ace0bf9c12c139bf764c7"}],"rally/plugins/common/verification/testr.py":[{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"d597da7520f8836e9a8769b48ea812d1b2ce101c","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return self.environ"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _init_testr(self):"},{"line_number":88,"context_line":"        \"\"\"Initialize testr.\"\"\""},{"line_number":89,"context_line":"        test_repository_dir \u003d os.path.join(self.base_dir, \".testrepository\")"},{"line_number":90,"context_line":"        # NOTE(andreykurilin): Is there any possibility that .testrepository"},{"line_number":91,"context_line":"        #   presents in clear repo?!"}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_1a2d0f95","line":88,"range":{"start_line":88,"start_character":11,"end_line":88,"end_character":27},"updated":"2016-12-28 10:43:28.000000000","message":"Initialize a new repository for testr.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ef9c67949133b001bd857560bf2eec5bdbfcd19a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return self.environ"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _init_testr(self):"},{"line_number":88,"context_line":"        \"\"\"Initialize testr.\"\"\""},{"line_number":89,"context_line":"        test_repository_dir \u003d os.path.join(self.base_dir, \".testrepository\")"},{"line_number":90,"context_line":"        # NOTE(andreykurilin): Is there any possibility that .testrepository"},{"line_number":91,"context_line":"        #   presents in clear repo?!"}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_257b948d","line":88,"range":{"start_line":88,"start_character":11,"end_line":88,"end_character":27},"in_reply_to":"da4df55a_1a2d0f95","updated":"2016-12-28 11:00:27.000000000","message":"There are limited number of people who knows what is \"testr repository\" (.testrepository folder) and phrase \"initialize new repository\" can mislead. Simple phrase \"Initialize testr\" is clear enough and, imo, is a good notification about what is happening now.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"d597da7520f8836e9a8769b48ea812d1b2ce101c","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # NOTE(andreykurilin): Is there any possibility that .testrepository"},{"line_number":91,"context_line":"        #   presents in clear repo?!"},{"line_number":92,"context_line":"        if not os.path.isdir(test_repository_dir):"},{"line_number":93,"context_line":"            LOG.debug(\"Initializing testr.\")"},{"line_number":94,"context_line":"            try:"},{"line_number":95,"context_line":"                utils.check_output([\"testr\", \"init\"], cwd\u003dself.repo_dir,"},{"line_number":96,"context_line":"                                   env\u003dself.environ)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_3a1e535f","line":93,"range":{"start_line":93,"start_character":23,"end_line":93,"end_character":42},"updated":"2016-12-28 10:43:28.000000000","message":"Initialize a new repository for testr.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ef9c67949133b001bd857560bf2eec5bdbfcd19a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # NOTE(andreykurilin): Is there any possibility that .testrepository"},{"line_number":91,"context_line":"        #   presents in clear repo?!"},{"line_number":92,"context_line":"        if not os.path.isdir(test_repository_dir):"},{"line_number":93,"context_line":"            LOG.debug(\"Initializing testr.\")"},{"line_number":94,"context_line":"            try:"},{"line_number":95,"context_line":"                utils.check_output([\"testr\", \"init\"], cwd\u003dself.repo_dir,"},{"line_number":96,"context_line":"                                   env\u003dself.environ)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_a56784e7","line":93,"range":{"start_line":93,"start_character":23,"end_line":93,"end_character":42},"in_reply_to":"da4df55a_3a1e535f","updated":"2016-12-28 11:00:27.000000000","message":"same here.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"d597da7520f8836e9a8769b48ea812d1b2ce101c","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        testr_cmd \u003d context[\"testr_cmd\"]"},{"line_number":117,"context_line":"        run_args \u003d context.get(\"run_args\", {})"},{"line_number":118,"context_line":"        LOG.debug(\"Test(s) started by the command: \u0027%s\u0027.\","},{"line_number":119,"context_line":"                  \" \".join(testr_cmd))"},{"line_number":120,"context_line":"        stream \u003d subprocess.Popen(testr_cmd, env\u003dself.run_environ,"},{"line_number":121,"context_line":"                                  cwd\u003dself.repo_dir,"},{"line_number":122,"context_line":"                                  stdout\u003dsubprocess.PIPE,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_fa83eb53","line":119,"range":{"start_line":119,"start_character":18,"end_line":119,"end_character":37},"updated":"2016-12-28 10:43:28.000000000","message":"Can be put in L118.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ef9c67949133b001bd857560bf2eec5bdbfcd19a","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        testr_cmd \u003d context[\"testr_cmd\"]"},{"line_number":117,"context_line":"        run_args \u003d context.get(\"run_args\", {})"},{"line_number":118,"context_line":"        LOG.debug(\"Test(s) started by the command: \u0027%s\u0027.\","},{"line_number":119,"context_line":"                  \" \".join(testr_cmd))"},{"line_number":120,"context_line":"        stream \u003d subprocess.Popen(testr_cmd, env\u003dself.run_environ,"},{"line_number":121,"context_line":"                                  cwd\u003dself.repo_dir,"},{"line_number":122,"context_line":"                                  stdout\u003dsubprocess.PIPE,"}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_0584d05b","line":119,"range":{"start_line":119,"start_character":18,"end_line":119,"end_character":37},"in_reply_to":"da4df55a_fa83eb53","updated":"2016-12-28 11:00:27.000000000","message":"Done","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"d597da7520f8836e9a8769b48ea812d1b2ce101c","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        return results"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _process_run_args(self, run_args):"},{"line_number":135,"context_line":"        \"\"\"run_args pre-processing"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        This method is called by TestrContext before transforming run_args to"},{"line_number":138,"context_line":"        cli arguments of testr."}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_babc0307","line":135,"range":{"start_line":135,"start_character":11,"end_line":135,"end_character":34},"updated":"2016-12-28 10:43:28.000000000","message":"Process run args.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ef9c67949133b001bd857560bf2eec5bdbfcd19a","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        return results"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _process_run_args(self, run_args):"},{"line_number":135,"context_line":"        \"\"\"run_args pre-processing"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        This method is called by TestrContext before transforming run_args to"},{"line_number":138,"context_line":"        cli arguments of testr."}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_e5b42c36","line":135,"range":{"start_line":135,"start_character":11,"end_line":135,"end_character":34},"in_reply_to":"da4df55a_babc0307","updated":"2016-12-28 11:00:27.000000000","message":"Done","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"5074e03feccd8fff2ddb08229cd91f4e7299fb3d","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            except (subprocess.CalledProcessError, OSError):"},{"line_number":98,"context_line":"                if os.path.exists(test_repository_dir):"},{"line_number":99,"context_line":"                    shutil.rmtree(test_repository_dir)"},{"line_number":100,"context_line":"                LOG.error(\"Failed to initialize a new repository for \u0027testr\u0027.\")"},{"line_number":101,"context_line":"                raise"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def install(self):"},{"line_number":104,"context_line":"        super(TestrLauncher, self).install()"}],"source_content_type":"text/x-python","patch_set":6,"id":"da4df55a_34b4a780","line":101,"range":{"start_line":100,"start_character":16,"end_line":101,"end_character":21},"updated":"2016-12-28 12:46:51.000000000","message":"Let\u0027s raise RallyException here with the message \"Failed to initialize a new repository for \u0027testr\u0027.\" like it is done in \u0027list_extensions\u0027 method in rally/plugins/openstack/verification/tempest/manager.py to keep consistency.","commit_id":"76565603a4544e698f9ace0bf9c12c139bf764c7"}],"rally/plugins/openstack/verification/tempest/config.py":[{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"d597da7520f8836e9a8769b48ea812d1b2ce101c","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        self.conf.read(self.conf_path)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        self.data_dir \u003d _create_or_get_data_dir()"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        self._create_tempest_roles()"},{"line_number":371,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_1a334fac","line":368,"range":{"start_line":368,"start_character":24,"end_line":368,"end_character":49},"updated":"2016-12-28 10:43:28.000000000","message":"Can be used the create_dir method from rally/verification/utils.py.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ef9c67949133b001bd857560bf2eec5bdbfcd19a","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        self.conf.read(self.conf_path)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        self.data_dir \u003d _create_or_get_data_dir()"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        self._create_tempest_roles()"},{"line_number":371,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_457a5878","line":368,"range":{"start_line":368,"start_character":24,"end_line":368,"end_character":49},"in_reply_to":"da4df55a_1a334fac","updated":"2016-12-28 11:00:27.000000000","message":"will be done in separate patch.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"}],"rally/plugins/openstack/verification/tempest/manager.py":[{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"d597da7520f8836e9a8769b48ea812d1b2ce101c","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                                   env\u003dself.environ).strip())"},{"line_number":109,"context_line":"        except subprocess.CalledProcessError:"},{"line_number":110,"context_line":"            raise exceptions.RallyException("},{"line_number":111,"context_line":"                \"Cannot list installed Tempest plugins for verifier \u0027%s\u0027.\" %"},{"line_number":112,"context_line":"                self.verifier)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def uninstall_extension(self, name):"}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_3ae573db","line":111,"range":{"start_line":111,"start_character":68,"end_line":111,"end_character":69},"updated":"2016-12-28 10:43:28.000000000","message":"\u0027 - is redundant.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ef9c67949133b001bd857560bf2eec5bdbfcd19a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                                   env\u003dself.environ).strip())"},{"line_number":109,"context_line":"        except subprocess.CalledProcessError:"},{"line_number":110,"context_line":"            raise exceptions.RallyException("},{"line_number":111,"context_line":"                \"Cannot list installed Tempest plugins for verifier \u0027%s\u0027.\" %"},{"line_number":112,"context_line":"                self.verifier)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def uninstall_extension(self, name):"}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_85dfe067","line":111,"range":{"start_line":111,"start_character":68,"end_line":111,"end_character":69},"in_reply_to":"da4df55a_3ae573db","updated":"2016-12-28 11:00:27.000000000","message":"Done","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"d597da7520f8836e9a8769b48ea812d1b2ce101c","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                utils.check_output([\"python\", \"-c\", cmd], cwd\u003dself.base_dir,"},{"line_number":108,"context_line":"                                   env\u003dself.environ).strip())"},{"line_number":109,"context_line":"        except subprocess.CalledProcessError:"},{"line_number":110,"context_line":"            raise exceptions.RallyException("},{"line_number":111,"context_line":"                \"Cannot list installed Tempest plugins for verifier \u0027%s\u0027.\" %"},{"line_number":112,"context_line":"                self.verifier)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def uninstall_extension(self, name):"},{"line_number":115,"context_line":"        \"\"\"Uninstall a Tempest plugin.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_dabf07a8","line":112,"range":{"start_line":110,"start_character":0,"end_line":112,"end_character":30},"updated":"2016-12-28 10:43:28.000000000","message":"Let\u0027s raise an original exception to understand what is going on and what we should fix.\n\n\nLOG.error(\"Cannot list installed Tempest plugins for verifier %s.\", self.verifier)\nraise","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ef9c67949133b001bd857560bf2eec5bdbfcd19a","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                utils.check_output([\"python\", \"-c\", cmd], cwd\u003dself.base_dir,"},{"line_number":108,"context_line":"                                   env\u003dself.environ).strip())"},{"line_number":109,"context_line":"        except subprocess.CalledProcessError:"},{"line_number":110,"context_line":"            raise exceptions.RallyException("},{"line_number":111,"context_line":"                \"Cannot list installed Tempest plugins for verifier \u0027%s\u0027.\" %"},{"line_number":112,"context_line":"                self.verifier)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def uninstall_extension(self, name):"},{"line_number":115,"context_line":"        \"\"\"Uninstall a Tempest plugin.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_85228050","line":112,"range":{"start_line":110,"start_character":0,"end_line":112,"end_character":30},"in_reply_to":"da4df55a_dabf07a8","updated":"2016-12-28 11:00:27.000000000","message":"I can imagine several possible errors:\n\n  - tempest changed a way of discovering plugins\n  - tempest renamed modules\n  - it is an old or custom version of tempest which doesn\u0027t support extensions\n\nIn all these cases error will be too pythonic and can be unclear for regular rally-user.\n\nSince, we already have configured logging at utils.check_output method and original errors will not be hidden, I prefer to raise more user-friendly message which, possibly, can be handled to some wrappers.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"b1abaad4cb5c7c5840e3b67c39c0c95a3b0411da","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        \"\"\"Uninstall a Tempest plugin.\"\"\""},{"line_number":116,"context_line":"        for ext in self.list_extensions():"},{"line_number":117,"context_line":"            if ext[\"name\"] \u003d\u003d name:"},{"line_number":118,"context_line":"                shutil.rmtree(ext[\"location\"])"},{"line_number":119,"context_line":"                break"},{"line_number":120,"context_line":"        else:"},{"line_number":121,"context_line":"            raise exceptions.RallyException("}],"source_content_type":"text/x-python","patch_set":5,"id":"da4df55a_856fe029","line":118,"updated":"2016-12-28 11:13:58.000000000","message":"Let\u0027s add \n\nif os.path.exists(ext[\"location\"]):\n\nhere.","commit_id":"302400f5f13d28724dc5bb2eaf492469865a30cb"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"5074e03feccd8fff2ddb08229cd91f4e7299fb3d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        with open(self.configfile, \"w\") as f:"},{"line_number":69,"context_line":"            f.write(new_content)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def install_extension(self, source, version\u003dNone, extra\u003dNone):"},{"line_number":72,"context_line":"        \"\"\"Install a Tempest plugin.\"\"\""},{"line_number":73,"context_line":"        if extra:"},{"line_number":74,"context_line":"            raise NotImplementedError("}],"source_content_type":"text/x-python","patch_set":6,"id":"da4df55a_f42cdf03","line":71,"range":{"start_line":71,"start_character":54,"end_line":71,"end_character":59},"updated":"2016-12-28 12:46:51.000000000","message":"extra_settings","commit_id":"76565603a4544e698f9ace0bf9c12c139bf764c7"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"f18cd8a9eae8c97e436fb820d1ce820455039944","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        with open(self.configfile, \"w\") as f:"},{"line_number":69,"context_line":"            f.write(new_content)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def install_extension(self, source, version\u003dNone, extra\u003dNone):"},{"line_number":72,"context_line":"        \"\"\"Install a Tempest plugin.\"\"\""},{"line_number":73,"context_line":"        if extra:"},{"line_number":74,"context_line":"            raise NotImplementedError("}],"source_content_type":"text/x-python","patch_set":6,"id":"da4df55a_ea96b4ee","line":71,"range":{"start_line":71,"start_character":54,"end_line":71,"end_character":59},"in_reply_to":"da4df55a_f42cdf03","updated":"2016-12-28 14:46:30.000000000","message":"Done","commit_id":"76565603a4544e698f9ace0bf9c12c139bf764c7"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"5074e03feccd8fff2ddb08229cd91f4e7299fb3d","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        \"\"\"Install a Tempest plugin.\"\"\""},{"line_number":73,"context_line":"        if extra:"},{"line_number":74,"context_line":"            raise NotImplementedError("},{"line_number":75,"context_line":"                _LE(\"\u0027%s\u0027 verifiers don\u0027t support extra options for \""},{"line_number":76,"context_line":"                    \"extension installations.\")"},{"line_number":77,"context_line":"                % self.get_name())"},{"line_number":78,"context_line":"        version \u003d version or \"master\""},{"line_number":79,"context_line":"        egg \u003d re.sub(\"\\.git$\", \"\", os.path.basename(source.strip(\"/\")))"}],"source_content_type":"text/x-python","patch_set":6,"id":"da4df55a_54384b3d","line":76,"range":{"start_line":75,"start_character":56,"end_line":76,"end_character":44},"updated":"2016-12-28 12:46:51.000000000","message":"installation settings for extensions","commit_id":"76565603a4544e698f9ace0bf9c12c139bf764c7"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"f18cd8a9eae8c97e436fb820d1ce820455039944","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        \"\"\"Install a Tempest plugin.\"\"\""},{"line_number":73,"context_line":"        if extra:"},{"line_number":74,"context_line":"            raise NotImplementedError("},{"line_number":75,"context_line":"                _LE(\"\u0027%s\u0027 verifiers don\u0027t support extra options for \""},{"line_number":76,"context_line":"                    \"extension installations.\")"},{"line_number":77,"context_line":"                % self.get_name())"},{"line_number":78,"context_line":"        version \u003d version or \"master\""},{"line_number":79,"context_line":"        egg \u003d re.sub(\"\\.git$\", \"\", os.path.basename(source.strip(\"/\")))"}],"source_content_type":"text/x-python","patch_set":6,"id":"da4df55a_0a9cd80d","line":76,"range":{"start_line":75,"start_character":56,"end_line":76,"end_character":44},"in_reply_to":"da4df55a_54384b3d","updated":"2016-12-28 14:46:30.000000000","message":"Done","commit_id":"76565603a4544e698f9ace0bf9c12c139bf764c7"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"5074e03feccd8fff2ddb08229cd91f4e7299fb3d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            raise NotImplementedError("},{"line_number":75,"context_line":"                _LE(\"\u0027%s\u0027 verifiers don\u0027t support extra options for \""},{"line_number":76,"context_line":"                    \"extension installations.\")"},{"line_number":77,"context_line":"                % self.get_name())"},{"line_number":78,"context_line":"        version \u003d version or \"master\""},{"line_number":79,"context_line":"        egg \u003d re.sub(\"\\.git$\", \"\", os.path.basename(source.strip(\"/\")))"},{"line_number":80,"context_line":"        full_source \u003d \"git+{0}@{1}#egg\u003d{2}\".format(source, version, egg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da4df55a_7428efe2","line":77,"updated":"2016-12-28 12:46:51.000000000","message":"Can be put in L76.","commit_id":"76565603a4544e698f9ace0bf9c12c139bf764c7"}]}
