)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1d2d6e55a9bab72bb4e5dc49ba0c0d48d3a58668","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"94912094_4f0b501b","updated":"2026-01-21 21:56:02.000000000","message":"Looks like the failure is real","commit_id":"8e8a7e926c0512df5826bdeee06d5e3ff92ccf00"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a6696cbc85cca3f046d63ce318b9e0ef1615209e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"cb569e4f_37a8fe4c","updated":"2026-01-26 22:14:04.000000000","message":"recheck","commit_id":"064cee54da600c622a6f816fe7cded8189a74b06"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ac533427fba5c1132b616e3ac87a4961bf066f23","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"fa9aaccd_b970f432","updated":"2026-01-26 18:26:09.000000000","message":"recheck","commit_id":"064cee54da600c622a6f816fe7cded8189a74b06"}],"nova/cmd/common.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d88dc886959ee0aa9186b1f0917454a8e86aa50c","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"# Decorators for actions"},{"line_number":85,"context_line":"def args(*args: ty.Any, **kwargs: ty.Any) -\u003e ty.Callable:"},{"line_number":86,"context_line":"    \"\"\"Decorator which adds the given args and kwargs to the args list of"},{"line_number":87,"context_line":"    the desired func\u0027s __dict__."},{"line_number":88,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"ca35bf28_94f654be","line":85,"range":{"start_line":85,"start_character":9,"end_line":85,"end_character":40},"updated":"2021-08-04 15:27:30.000000000","message":"I tempted to make this *args: ty.List, **kwargs: ty.Dict but that fails miserably as mypy apply the type annotation of *args to each item in the args list. :/","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"954a1dff956c0fa34482f6414b7211cd58019d1e","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"# Decorators for actions"},{"line_number":85,"context_line":"def args(*args: ty.Any, **kwargs: ty.Any) -\u003e ty.Callable:"},{"line_number":86,"context_line":"    \"\"\"Decorator which adds the given args and kwargs to the args list of"},{"line_number":87,"context_line":"    the desired func\u0027s __dict__."},{"line_number":88,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"a7bddb55_ad866e60","line":85,"range":{"start_line":85,"start_character":9,"end_line":85,"end_character":40},"in_reply_to":"ca35bf28_94f654be","updated":"2021-08-06 16:40:03.000000000","message":"Yup. This threw me too /o\\","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d88dc886959ee0aa9186b1f0917454a8e86aa50c","unresolved":true,"context_lines":[{"line_number":92,"context_line":"    return _decorator"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def methods_of(obj: ty.Callable) -\u003e ty.List[ty.Tuple[str, ty.Any]]:"},{"line_number":96,"context_line":"    \"\"\"Get all callable methods of an object that don\u0027t start with underscore"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    returns a list of tuples of the form (method_name, method)"}],"source_content_type":"text/x-python","patch_set":22,"id":"aaa25f2b_b072b59a","line":95,"range":{"start_line":95,"start_character":58,"end_line":95,"end_character":64},"updated":"2021-08-04 15:27:30.000000000","message":"we are returning methods so this can be ty.Callable","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"954a1dff956c0fa34482f6414b7211cd58019d1e","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    return _decorator"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def methods_of(obj: ty.Callable) -\u003e ty.List[ty.Tuple[str, ty.Any]]:"},{"line_number":96,"context_line":"    \"\"\"Get all callable methods of an object that don\u0027t start with underscore"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    returns a list of tuples of the form (method_name, method)"}],"source_content_type":"text/x-python","patch_set":22,"id":"de95a2ba_cd997a73","line":95,"range":{"start_line":95,"start_character":58,"end_line":95,"end_character":64},"in_reply_to":"aaa25f2b_b072b59a","updated":"2021-08-06 16:40:03.000000000","message":"Done","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"}],"nova/cmd/manage.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d88dc886959ee0aa9186b1f0917454a8e86aa50c","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        pass"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @args(\u0027version\u0027, metavar\u003d\u0027VERSION\u0027, nargs\u003d\u0027?\u0027, help\u003d\u0027Database version\u0027)"},{"line_number":620,"context_line":"    def sync(self, version\u003dNone) -\u003e None:"},{"line_number":621,"context_line":"        \"\"\"Sync the database up to the most recent version.\"\"\""},{"line_number":622,"context_line":"        migration.db_sync(version, database\u003d\u0027api\u0027)"},{"line_number":623,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"ca56cb47_f4458903","line":620,"range":{"start_line":620,"start_character":19,"end_line":620,"end_character":26},"updated":"2021-08-04 15:27:30.000000000","message":"was tempted to add :ty.Optional[int] but the db impl method force this to int with\n  version \u003d int(version) \n\nso I guess it can be a string as well","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"954a1dff956c0fa34482f6414b7211cd58019d1e","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        pass"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @args(\u0027version\u0027, metavar\u003d\u0027VERSION\u0027, nargs\u003d\u0027?\u0027, help\u003d\u0027Database version\u0027)"},{"line_number":620,"context_line":"    def sync(self, version\u003dNone) -\u003e None:"},{"line_number":621,"context_line":"        \"\"\"Sync the database up to the most recent version.\"\"\""},{"line_number":622,"context_line":"        migration.db_sync(version, database\u003d\u0027api\u0027)"},{"line_number":623,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"d596aaa0_a2baee86","line":620,"range":{"start_line":620,"start_character":19,"end_line":620,"end_character":26},"in_reply_to":"ca56cb47_f4458903","updated":"2021-08-06 16:40:03.000000000","message":"Yeah, and with the alebmic changes this will actually become a UUID (so definitely a string 😊). I actually forgot the type hint here too","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d88dc886959ee0aa9186b1f0917454a8e86aa50c","unresolved":false,"context_lines":[{"line_number":2272,"context_line":"                return 4"},{"line_number":2273,"context_line":""},{"line_number":2274,"context_line":"        placement \u003d report.SchedulerReportClient()"},{"line_number":2275,"context_line":"        neutron \u003d neutron_api.get_client(ctxt, admin\u003dTrue)"},{"line_number":2276,"context_line":""},{"line_number":2277,"context_line":"        num_processed \u003d 0"},{"line_number":2278,"context_line":"        # TODO(mriedem): Use context.scatter_gather_skip_cell0."}],"source_content_type":"text/x-python","patch_set":22,"id":"6eb05b16_ccbc2c4f","line":2275,"updated":"2021-08-04 15:27:30.000000000","message":"That feels like a logic change. Now heal_allocation always needs neutron creds in the config even if it will never use it. I won\u0027t block on this as it is just an admin CLI, they will adapt...","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"}],"nova/conf/opts.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d88dc886959ee0aa9186b1f0917454a8e86aa50c","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    return [(key, val) for key, val in dct.items()]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def list_opts():"},{"line_number":46,"context_line":"    opts: ty.DefaultDict[str, ty.List[cfg.Opt]] \u003d collections.defaultdict(list)"},{"line_number":47,"context_line":"    module_names \u003d _list_module_names()"},{"line_number":48,"context_line":"    imported_modules \u003d _import_modules(module_names)"}],"source_content_type":"text/x-python","patch_set":22,"id":"dfcdeb7d_b4208a20","line":45,"updated":"2021-08-04 15:27:30.000000000","message":"I\u0027m not sure you intended to enable mypy on opts.py but if yes then the public method should have some annotation.","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ac891825d392c96731b5fc0f1ccd9a6486cb032e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    return [(key, val) for key, val in dct.items()]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def list_opts():"},{"line_number":46,"context_line":"    opts: ty.DefaultDict[str, ty.List[cfg.Opt]] \u003d collections.defaultdict(list)"},{"line_number":47,"context_line":"    module_names \u003d _list_module_names()"},{"line_number":48,"context_line":"    imported_modules \u003d _import_modules(module_names)"}],"source_content_type":"text/x-python","patch_set":22,"id":"ed152bc0_7e68a68b","line":45,"in_reply_to":"7defd59d_dc658334","updated":"2026-01-23 15:43:34.000000000","message":"Done","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"954a1dff956c0fa34482f6414b7211cd58019d1e","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    return [(key, val) for key, val in dct.items()]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def list_opts():"},{"line_number":46,"context_line":"    opts: ty.DefaultDict[str, ty.List[cfg.Opt]] \u003d collections.defaultdict(list)"},{"line_number":47,"context_line":"    module_names \u003d _list_module_names()"},{"line_number":48,"context_line":"    imported_modules \u003d _import_modules(module_names)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7defd59d_dc658334","line":45,"in_reply_to":"dfcdeb7d_b4208a20","updated":"2021-08-06 16:40:03.000000000","message":"Good point. I\u0027ve slowly been adding annotations as I rebased this. I might leave to a later person though, if that\u0027s okay?","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"}],"nova/console/serial.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d88dc886959ee0aa9186b1f0917454a8e86aa50c","unresolved":true,"context_lines":[{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"ALLOCATED_PORTS: ty.Set[ty.Tuple[str, int]] \u003d set()"},{"line_number":29,"context_line":"#: in-memory set of already allocated ports"},{"line_number":30,"context_line":"SERIAL_LOCK \u003d \u0027serial-lock\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF \u003d nova.conf.CONF"}],"source_content_type":"text/x-python","patch_set":22,"id":"4725fe9b_e6b43a3e","line":29,"updated":"2021-08-04 15:27:30.000000000","message":"should this be top of ALLOCATED_PORTS?","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"954a1dff956c0fa34482f6414b7211cd58019d1e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"ALLOCATED_PORTS: ty.Set[ty.Tuple[str, int]] \u003d set()"},{"line_number":29,"context_line":"#: in-memory set of already allocated ports"},{"line_number":30,"context_line":"SERIAL_LOCK \u003d \u0027serial-lock\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF \u003d nova.conf.CONF"}],"source_content_type":"text/x-python","patch_set":22,"id":"b4f07e21_158968f1","line":29,"in_reply_to":"4725fe9b_e6b43a3e","updated":"2021-08-06 16:40:03.000000000","message":"Surprisingly, no. Sphinx expects the comment to come after the variable (this is a Sphinx comment as indicated by the colon)","commit_id":"029b361b7097f141ee41022604c10d88fb0fa75a"}]}
