From c9e2ff001f8b82aba5b3c073210b61e55426cbf0 Mon Sep 17 00:00:00 2001 From: Rohan Patnaik Date: Fri, 22 May 2026 13:46:04 +0530 Subject: [PATCH 1/2] fix(core): emit LF newlines for tsv output --- src/azure-cli-core/azure/cli/core/_output.py | 9 ++++++++ .../azure/cli/core/tests/test_output.py | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/azure-cli-core/azure/cli/core/_output.py b/src/azure-cli-core/azure/cli/core/_output.py index 5cf98b38d8b..7c3b300c265 100644 --- a/src/azure-cli-core/azure/cli/core/_output.py +++ b/src/azure-cli-core/azure/cli/core/_output.py @@ -3,6 +3,8 @@ # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- +import sys + import knack.output @@ -11,6 +13,13 @@ class AzOutputProducer(knack.output.OutputProducer): def check_valid_format_type(self, format_type): return format_type in self._FORMAT_DICT + def out(self, obj, formatter=None, out_file=None): + if get_output_format(self.cli_ctx) == "tsv": + file = out_file or sys.stdout + if hasattr(file, "reconfigure"): + file.reconfigure(newline="\n") + super().out(obj, formatter=formatter, out_file=out_file) + def get_output_format(cli_ctx): return cli_ctx.invocation.data.get("output", None) diff --git a/src/azure-cli-core/azure/cli/core/tests/test_output.py b/src/azure-cli-core/azure/cli/core/tests/test_output.py index b114e888ff2..13b2a8a1112 100644 --- a/src/azure-cli-core/azure/cli/core/tests/test_output.py +++ b/src/azure-cli-core/azure/cli/core/tests/test_output.py @@ -4,6 +4,8 @@ # -------------------------------------------------------------------------------------------- import unittest +from io import BytesIO, TextIOWrapper +from types import SimpleNamespace class TestCoreCLIOutput(unittest.TestCase): @@ -16,6 +18,25 @@ def test_create_AzOutputProducer(self): self.assertIn('yaml', output_producer._FORMAT_DICT) self.assertIn('none', output_producer._FORMAT_DICT) + def test_tsv_output_uses_lf_newlines(self): + from azure.cli.core._output import AzOutputProducer + from azure.cli.core.mock import DummyCli + from knack.util import CommandResultItem + + cli = DummyCli() + cli.invocation = SimpleNamespace(data={'output': 'tsv'}) + output_producer = AzOutputProducer(cli) + buffer = BytesIO() + out_file = TextIOWrapper(buffer, encoding='utf-8', newline='\r\n') + + output_producer.out( + CommandResultItem(result=['first', 'second']), + formatter=output_producer.get_formatter('tsv'), + out_file=out_file) + out_file.flush() + + self.assertEqual(b'first\nsecond\n', buffer.getvalue()) + # regression test for https://github.com/Azure/azure-cli/issues/9263 def test_yaml_output_with_ordered_dict(self): from azure.cli.core._output import AzOutputProducer From d523bf121312a432b750f4b2b5df730bd117f33d Mon Sep 17 00:00:00 2001 From: Rohan Patnaik Date: Fri, 22 May 2026 13:54:31 +0530 Subject: [PATCH 2/2] fix(core): preserve output producer return value --- src/azure-cli-core/azure/cli/core/_output.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/_output.py b/src/azure-cli-core/azure/cli/core/_output.py index 7c3b300c265..45c8d8a118b 100644 --- a/src/azure-cli-core/azure/cli/core/_output.py +++ b/src/azure-cli-core/azure/cli/core/_output.py @@ -14,11 +14,11 @@ def check_valid_format_type(self, format_type): return format_type in self._FORMAT_DICT def out(self, obj, formatter=None, out_file=None): + file = out_file or sys.stdout if get_output_format(self.cli_ctx) == "tsv": - file = out_file or sys.stdout if hasattr(file, "reconfigure"): file.reconfigure(newline="\n") - super().out(obj, formatter=formatter, out_file=out_file) + return super().out(obj, formatter=formatter, out_file=file) def get_output_format(cli_ctx):