From 28f640c47e7d49f30772a5247cdb0f59e3ca2cc5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= <jelmer@jelmer.uk>
Date: Mon, 4 Jul 2022 10:54:43 +0100
Subject: [PATCH] RTS parser: don't add trailing whitespace when setting field
 values that start with a newline. Closes: #1013485

---
 debian/changelog                      |  2 ++
 lib/debian/_deb822_repro/parsing.py   |  5 ++++-
 lib/debian/tests/test_repro_deb822.py | 14 ++++++++++++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/debian/changelog b/debian/changelog
index 924450d3..469aae09 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,6 +1,8 @@
 python-debian (0.1.45) UNRELEASED; urgency=medium
 
   * Add Deb822FileElement.remove method.
+  * RTS parser: don't add trailing whitespace when setting field values
+    that start with a newline. Closes: #1013485
 
  -- Jelmer Vernooij <jelmer@debian.org>  Sun, 05 Jun 2022 15:39:21 +0100
 
diff --git a/lib/debian/_deb822_repro/parsing.py b/lib/debian/_deb822_repro/parsing.py
index c880245f..6468a6f0 100644
--- a/lib/debian/_deb822_repro/parsing.py
+++ b/lib/debian/_deb822_repro/parsing.py
@@ -1450,7 +1450,10 @@ class Deb822ParagraphToStrWrapperMixin(AutoResolvingMixin[str],
                 return
             # Regenerate the first line with normalized whitespace
             first_line, rest = value.split("\n", 1)
-            value = "".join((" ", first_line.strip(), "\n", rest))
+            if first_line:
+                value = "".join((" ", first_line.strip(), "\n", rest))
+            else:
+                value = "".join(("\n", rest))
         if not value.endswith("\n"):
             if not self._auto_map_final_newline_in_multiline_values:
                 raise ValueError("Values must end with a newline (or be single line"
diff --git a/lib/debian/tests/test_repro_deb822.py b/lib/debian/tests/test_repro_deb822.py
index 46df2eaa..5721d1f6 100644
--- a/lib/debian/tests/test_repro_deb822.py
+++ b/lib/debian/tests/test_repro_deb822.py
@@ -1761,3 +1761,17 @@ class FormatPreservingDeb822ParserTests(TestCase):
                                   expected_result) as bd_list:
             bd_list.append_newline()
             bd_list.append('bar (>= 1.0~)')
+
+    def test_mutate_field_preserves_whitespace(self):
+        # type: () -> None
+
+        original = textwrap.dedent('''\
+        Package: foo
+        Build-Depends:
+         debhelper-compat (= 11),
+         uuid-dev
+        ''')
+        deb822_file = parse_deb822_file(original.splitlines(keepends=True))
+        source_paragraph = next(iter(deb822_file))
+        source_paragraph['Build-Depends'] = '\n debhelper-compat (= 11),\n uuid-dev'
+        self.assertEqual(original, deb822_file.convert_to_text())
-- 
GitLab