diff --git a/docs/chapters/building.xml b/docs/chapters/building.xml
index 500a5cc2..a44f8755 100644
--- a/docs/chapters/building.xml
+++ b/docs/chapters/building.xml
@@ -58,6 +58,11 @@
state of the current index, which can be used to include staged but uncommitted
changes in the build. Whereas the special argument
WC exports the current working copy as is.
+ By default uncommitted changes are not exported and
+ &gbp-buildpackage; aborts when it finds them. Passing
+ includes the uncommitted changes (both
+ modified and untracked files) in the exported tree, mirroring the behaviour
+ of building without .If you want to default to build in a separate build area, you can
specify the directory to use in the gbp.conf file.
diff --git a/docs/manpages/gbp-buildpackage.xml b/docs/manpages/gbp-buildpackage.xml
index 6dcfae14..aacc53df 100644
--- a/docs/manpages/gbp-buildpackage.xml
+++ b/docs/manpages/gbp-buildpackage.xml
@@ -758,7 +758,11 @@
Don't abort if there are uncommitted changes in the source tree or
the current branch doesn't match the
- DEBIAN-BRANCH.
+ DEBIAN-BRANCH. The uncommitted changes
+ are included in the build. This holds whether or not
+ is used, as long as
+ is left at its default
+ (HEAD).
diff --git a/gbp/scripts/buildpackage.py b/gbp/scripts/buildpackage.py
index f3e96f14..58c1c1d9 100755
--- a/gbp/scripts/buildpackage.py
+++ b/gbp/scripts/buildpackage.py
@@ -62,6 +62,13 @@ def maybe_write_tree(repo: DebianGitRepository, options: optparse.Values) -> str
tree = repo.write_tree()
elif options.export == wc_name:
tree = write_wc(repo)
+ elif options.ignore_new and options.export == 'HEAD':
+ # --git-ignore-new asks to build with the uncommitted changes
+ # in the source tree. Without an export-dir we build in the
+ # working copy and the changes are included, so export the
+ # working copy here too to keep the behaviour consistent
+ # (#1091531).
+ tree = write_wc(repo)
else:
tree = options.export
if not repo.has_treeish(tree):
diff --git a/tests/component/deb/test_buildpackage.py b/tests/component/deb/test_buildpackage.py
index 3dc92647..528ef443 100644
--- a/tests/component/deb/test_buildpackage.py
+++ b/tests/component/deb/test_buildpackage.py
@@ -222,6 +222,37 @@ def test_export_wc_buildpackage(self, repo):
self._test_buildpackage(repo, ["--git-export=WC", "--git-export-dir=../foo/bar"])
assert os.path.exists("../foo/bar")
+ @RepoFixtures.quilt30()
+ def test_export_dir_ignore_new(self, repo):
+ """
+ Test that --git-ignore-new includes uncommitted changes in the export
+ when an export dir is used (#1091531).
+
+ Without an export dir the package is built in-place in the working copy
+ so uncommitted changes are always part of the build. With an export dir
+ the tree to export defaults to HEAD, which used to silently drop those
+ changes. Before the fix both assertions below failed because HEAD was
+ exported instead of the working copy.
+ """
+ # Uncommitted modification to a tracked file ...
+ rules = os.path.join(repo.path, 'debian', 'rules')
+ with open(rules, 'a') as f:
+ f.write('\n# uncommitted-marker\n')
+ # ... and an untracked new file
+ with open(os.path.join(repo.path, 'untracked.txt'), 'w') as f:
+ f.write('untracked')
+
+ self._test_buildpackage(repo, ['--git-ignore-new',
+ '--git-no-purge',
+ '--git-export-dir=../bdir'])
+
+ exported = '../bdir/hello-debhelper-2.8'
+ with open(os.path.join(exported, 'debian', 'rules')) as f:
+ assert '# uncommitted-marker' in f.read(), \
+ "Uncommitted change to tracked file was not exported"
+ assert os.path.exists(os.path.join(exported, 'untracked.txt')), \
+ "Untracked file was not exported"
+
@RepoFixtures.native()
def test_argument_quoting(self, repo):
"""Test that we quote arguments to builder (#850869)"""