)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3adf85fb2aee084a86490f939ace9763cd5954eb","unresolved":true,"context_lines":[{"line_number":41,"context_line":"* Output ordering is stable and deterministic"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Change-Id: I93972d756340b81633002813c7aa312673402ac0"},{"line_number":44,"context_line":"Signed-off-by: Udayendu Kar \u003cudayendu.kar@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"03fd9b47_00c04c87","line":44,"updated":"2026-07-31 11:20:03.000000000","message":"This reads AI\u0027y. If you used AI to help with this, please add `Assisted-by` [per the guidelines](https://openinfra.org/legal/ai-policy)","commit_id":"d5b1e4397247afe0e4de29d06455bebe2629bb5a"},{"author":{"_account_id":39263,"name":"Udayendu Kar","display_name":"Udayendu Kar","email":"udayendu.kar@gmail.com","username":"udayendu.kar"},"change_message_id":"69ac607454e1cf653c8cb1691c00706621e29df2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"* Output ordering is stable and deterministic"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Change-Id: I93972d756340b81633002813c7aa312673402ac0"},{"line_number":44,"context_line":"Signed-off-by: Udayendu Kar \u003cudayendu.kar@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3fbe225e_b82d9097","line":44,"in_reply_to":"03fd9b47_00c04c87","updated":"2026-07-31 17:19:02.000000000","message":"Done","commit_id":"d5b1e4397247afe0e4de29d06455bebe2629bb5a"},{"author":{"_account_id":39263,"name":"Udayendu Kar","display_name":"Udayendu Kar","email":"udayendu.kar@gmail.com","username":"udayendu.kar"},"change_message_id":"69ac607454e1cf653c8cb1691c00706621e29df2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"* Output ordering is stable and deterministic"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Change-Id: I93972d756340b81633002813c7aa312673402ac0"},{"line_number":44,"context_line":"Signed-off-by: Udayendu Kar \u003cudayendu.kar@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"89b38483_889502d9","line":44,"in_reply_to":"03fd9b47_00c04c87","updated":"2026-07-31 17:19:02.000000000","message":"Yes, will draft the commit again.","commit_id":"d5b1e4397247afe0e4de29d06455bebe2629bb5a"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fd62b462ab8bb2b5d90d1daec12ada46a0263e04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"743f5fac_00d57a64","updated":"2026-06-29 11:43:23.000000000","message":"Need to look at this closer. One early question though","commit_id":"3d46a095e740f01c846267062eca3f749a483d46"}],"cliff/lister.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3adf85fb2aee084a86490f939ace9763cd5954eb","unresolved":true,"context_lines":[{"line_number":47,"context_line":"        custom sorting procedure or data is already sorted."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        return True"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"},{"line_number":52,"context_line":"    def _safe_get("},{"line_number":53,"context_line":"        row: Sequence[Any],"},{"line_number":54,"context_line":"        index: int,"},{"line_number":55,"context_line":"    ) -\u003e Any:"},{"line_number":56,"context_line":"        try:"},{"line_number":57,"context_line":"            return row[index]"},{"line_number":58,"context_line":"        except Exception:"},{"line_number":59,"context_line":"            return None"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @abc.abstractmethod"},{"line_number":62,"context_line":"    def take_action("}],"source_content_type":"text/x-python","patch_set":5,"id":"6439d3c3_c1317d29","line":59,"range":{"start_line":50,"start_character":1,"end_line":59,"end_character":23},"updated":"2026-07-31 11:20:03.000000000","message":"I think this is not needed. We [build our indexes by iterating through the provided column names](https://review.opendev.org/c/openstack/cliff/+/995202/5/cliff/lister.py#110). If those are invalid, I suspect we probably *want* to die?","commit_id":"d5b1e4397247afe0e4de29d06455bebe2629bb5a"},{"author":{"_account_id":39263,"name":"Udayendu Kar","display_name":"Udayendu Kar","email":"udayendu.kar@gmail.com","username":"udayendu.kar"},"change_message_id":"69ac607454e1cf653c8cb1691c00706621e29df2","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        custom sorting procedure or data is already sorted."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        return True"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"},{"line_number":52,"context_line":"    def _safe_get("},{"line_number":53,"context_line":"        row: Sequence[Any],"},{"line_number":54,"context_line":"        index: int,"},{"line_number":55,"context_line":"    ) -\u003e Any:"},{"line_number":56,"context_line":"        try:"},{"line_number":57,"context_line":"            return row[index]"},{"line_number":58,"context_line":"        except Exception:"},{"line_number":59,"context_line":"            return None"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @abc.abstractmethod"},{"line_number":62,"context_line":"    def take_action("}],"source_content_type":"text/x-python","patch_set":5,"id":"63237e22_ee987913","line":59,"range":{"start_line":50,"start_character":1,"end_line":59,"end_character":23},"in_reply_to":"6439d3c3_c1317d29","updated":"2026-07-31 17:19:02.000000000","message":"When I was working on it, my system was having 4.13.3 and based on that I prepared this patch. But now seems like with 4.15.0 the code base has changed.\n\nFrom my dev setup:\n\n```\n(kolla-venv) root@uskar-dev-node:~# diff -u lister.py.orig /root/kolla-venv/lib/python3.11/site-packages/cliff/lister.py\n--- lister.py.orig      2026-07-31 08:55:06.493969374 -0700\n+++ /root/kolla-venv/lib/python3.11/site-packages/cliff/lister.py       2026-07-31 08:55:21.242118953 -0700\n@@ -14,9 +14,9 @@\n \n import abc\n import argparse\n-import collections.abc\n+from collections.abc import Iterable, Sequence\n import logging\n-import typing as ty\n+from typing import Any\n \n from cliff import display\n from cliff.formatters import base as base_formatters\n@@ -50,9 +50,7 @@\n     @abc.abstractmethod\n     def take_action(\n         self, parsed_args: argparse.Namespace\n-    ) -\u003e tuple[\n-        collections.abc.Sequence[str], collections.abc.Iterable[ty.Any]\n-    ]:\n+    ) -\u003e tuple[Sequence[str], Iterable[Any]]:\n         \"\"\"Run command.\n \n         Return a tuple containing the column names and an iterable containing\n@@ -94,8 +92,8 @@\n     def produce_output(\n         self,\n         parsed_args: argparse.Namespace,\n-        column_names: collections.abc.Sequence[str],\n-        data: collections.abc.Iterable[collections.abc.Sequence[ty.Any]],\n+        column_names: Sequence[str],\n+        data: Iterable[Sequence[Any]],\n     ) -\u003e int:\n         if parsed_args.sort_columns and self.need_sort_by_cliff:\n             indexes \u003d [\n@@ -122,7 +120,7 @@\n                     # Simply log and then ignore this; sorting is best effort\n                     self.log.warning(\n                         \"Could not sort on field \u0027%s\u0027; unsortable types\",\n-                        parsed_args.sort_columns[index],\n+                        column_names[index],\n                     )\n \n         columns_to_include, selector \u003d self._generate_columns_and_selector(\n(kolla-venv) root@uskar-dev-node:~# pip3 show cliff\nName: cliff\nVersion: 4.13.3\nSummary: Command Line Interface Formulation Framework\nHome-page: https://docs.openstack.org/cliff/\nAuthor: \nAuthor-email: OpenStack \u003copenstack-discuss@lists.openstack.org\u003e\nLicense: Apache-2.0\nLocation: /root/kolla-venv/lib/python3.11/site-packages\nRequires: autopage, cmd2, PrettyTable, PyYAML, stevedore\nRequired-by: kolla-ansible, osc-lib, python-openstackclient\n```\n\nLet me take a fresh pull and verify everything again.","commit_id":"d5b1e4397247afe0e4de29d06455bebe2629bb5a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3adf85fb2aee084a86490f939ace9763cd5954eb","unresolved":true,"context_lines":[{"line_number":113,"context_line":"                if c in column_names"},{"line_number":114,"context_line":"            ]"},{"line_number":115,"context_line":"            reverse \u003d parsed_args.sort_direction \u003d\u003d \u0027desc\u0027"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"            # IMPORTANT: materialize iterable BEFORE sorting"},{"line_number":118,"context_line":"            data \u003d list(data)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"            for index in indexes[::-1]:"},{"line_number":121,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"8029ffd0_23f13963","line":118,"range":{"start_line":116,"start_character":1,"end_line":118,"end_character":29},"updated":"2026-07-31 11:20:03.000000000","message":"Doesn\u0027t sorting do this for us already?","commit_id":"d5b1e4397247afe0e4de29d06455bebe2629bb5a"},{"author":{"_account_id":39263,"name":"Udayendu Kar","display_name":"Udayendu Kar","email":"udayendu.kar@gmail.com","username":"udayendu.kar"},"change_message_id":"69ac607454e1cf653c8cb1691c00706621e29df2","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                if c in column_names"},{"line_number":114,"context_line":"            ]"},{"line_number":115,"context_line":"            reverse \u003d parsed_args.sort_direction \u003d\u003d \u0027desc\u0027"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"            # IMPORTANT: materialize iterable BEFORE sorting"},{"line_number":118,"context_line":"            data \u003d list(data)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"            for index in indexes[::-1]:"},{"line_number":121,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfa2654c_4ae59ba5","line":118,"range":{"start_line":116,"start_character":1,"end_line":118,"end_character":29},"in_reply_to":"8029ffd0_23f13963","updated":"2026-07-31 17:19:02.000000000","message":"Verifying again.","commit_id":"d5b1e4397247afe0e4de29d06455bebe2629bb5a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3adf85fb2aee084a86490f939ace9763cd5954eb","unresolved":true,"context_lines":[{"line_number":122,"context_line":"                    # Handling all fields sorting"},{"line_number":123,"context_line":"                    data \u003d sorted("},{"line_number":124,"context_line":"                        data,"},{"line_number":125,"context_line":"                        key\u003dlambda k: safe_sort_value("},{"line_number":126,"context_line":"                            self._safe_get(k, index)"},{"line_number":127,"context_line":"                        ),"},{"line_number":128,"context_line":"                        reverse\u003dreverse,"}],"source_content_type":"text/x-python","patch_set":5,"id":"506e007f_44e3e896","line":125,"updated":"2026-07-31 11:20:03.000000000","message":"Can you just inline this helper like you\u0027ve done with `_safe_get`? I don\u0027t see it being broadly useful","commit_id":"d5b1e4397247afe0e4de29d06455bebe2629bb5a"},{"author":{"_account_id":39263,"name":"Udayendu Kar","display_name":"Udayendu Kar","email":"udayendu.kar@gmail.com","username":"udayendu.kar"},"change_message_id":"69ac607454e1cf653c8cb1691c00706621e29df2","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                    # Handling all fields sorting"},{"line_number":123,"context_line":"                    data \u003d sorted("},{"line_number":124,"context_line":"                        data,"},{"line_number":125,"context_line":"                        key\u003dlambda k: safe_sort_value("},{"line_number":126,"context_line":"                            self._safe_get(k, index)"},{"line_number":127,"context_line":"                        ),"},{"line_number":128,"context_line":"                        reverse\u003dreverse,"}],"source_content_type":"text/x-python","patch_set":5,"id":"57957a27_fbabdfbf","line":125,"in_reply_to":"506e007f_44e3e896","updated":"2026-07-31 17:19:02.000000000","message":"Verifying again.","commit_id":"d5b1e4397247afe0e4de29d06455bebe2629bb5a"}],"cliff/tests/test_lister.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9409cd6c18bf38c81a5650b917b603ae83696382","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        test_lister.run(parsed_args)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        f \u003d test_lister._formatter_plugins[\u0027test\u0027]"},{"line_number":180,"context_line":"        args \u003d f.args[0]"},{"line_number":181,"context_line":"        data \u003d list(args[1])"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"a92bee37_495b9745","line":180,"updated":"2026-06-29 04:50:36.000000000","message":"pep8: error: \"Extension[ListFormatter]\" has no attribute \"args\"  [attr-defined]","commit_id":"15c177f85c026a80b3991cb8abf5d31deb5264c4"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fd62b462ab8bb2b5d90d1daec12ada46a0263e04","unresolved":true,"context_lines":[{"line_number":68,"context_line":"        parsed_args.sort_columns \u003d []"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        test_lister.run(parsed_args)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        f \u003d cast("},{"line_number":73,"context_line":"            FauxFormatter,"},{"line_number":74,"context_line":"            test_lister._formatter_plugins[\u0027test\u0027],"},{"line_number":75,"context_line":"        )"},{"line_number":76,"context_line":"        self.assertEqual(1, len(f.args))"},{"line_number":77,"context_line":"        args \u003d f.args[0]"},{"line_number":78,"context_line":"        self.assertEqual(list(parsed_args.columns), args[0])"}],"source_content_type":"text/x-python","patch_set":4,"id":"d0c1ffee_668ca343","line":75,"range":{"start_line":71,"start_character":1,"end_line":75,"end_character":9},"updated":"2026-06-29 11:43:23.000000000","message":"These changes seem unrelated?","commit_id":"3d46a095e740f01c846267062eca3f749a483d46"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c85abfe11819272a7c459d97d377d975294b6b4d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        parsed_args.sort_columns \u003d []"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        test_lister.run(parsed_args)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        f \u003d cast("},{"line_number":73,"context_line":"            FauxFormatter,"},{"line_number":74,"context_line":"            test_lister._formatter_plugins[\u0027test\u0027],"},{"line_number":75,"context_line":"        )"},{"line_number":76,"context_line":"        self.assertEqual(1, len(f.args))"},{"line_number":77,"context_line":"        args \u003d f.args[0]"},{"line_number":78,"context_line":"        self.assertEqual(list(parsed_args.columns), args[0])"}],"source_content_type":"text/x-python","patch_set":4,"id":"8fdcaa5d_c01e6f20","line":75,"range":{"start_line":71,"start_character":1,"end_line":75,"end_character":9},"in_reply_to":"d0c1ffee_668ca343","updated":"2026-06-29 22:13:03.000000000","message":"Done","commit_id":"3d46a095e740f01c846267062eca3f749a483d46"},{"author":{"_account_id":39263,"name":"Udayendu Kar","display_name":"Udayendu Kar","email":"udayendu.kar@gmail.com","username":"udayendu.kar"},"change_message_id":"69ac607454e1cf653c8cb1691c00706621e29df2","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        parsed_args.sort_columns \u003d []"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        test_lister.run(parsed_args)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        f \u003d cast("},{"line_number":73,"context_line":"            FauxFormatter,"},{"line_number":74,"context_line":"            test_lister._formatter_plugins[\u0027test\u0027],"},{"line_number":75,"context_line":"        )"},{"line_number":76,"context_line":"        self.assertEqual(1, len(f.args))"},{"line_number":77,"context_line":"        args \u003d f.args[0]"},{"line_number":78,"context_line":"        self.assertEqual(list(parsed_args.columns), args[0])"}],"source_content_type":"text/x-python","patch_set":4,"id":"021e4200_3147741a","line":75,"range":{"start_line":71,"start_character":1,"end_line":75,"end_character":9},"in_reply_to":"d0c1ffee_668ca343","updated":"2026-07-31 17:19:02.000000000","message":"In my earlier commit, \u0027assert isinstance(f, FauxFormatter)\u0027 was missing at L180. To fix that I changed it. But seems like its not needed. So, I fixed the old file with dynamic way and reverted the change.","commit_id":"3d46a095e740f01c846267062eca3f749a483d46"}]}
