Hi,

On 2023-03-22 11:59:17 -0700, Andres Freund wrote:
> Unless somebody sees a reason to wait, I am planning to commit:
>   meson: add install-{quiet, world} targets
>   meson: add install-{docs,doc-html,doc-man} targets
>   meson: make install_test_files more generic, rename to install_files

I've done that now.


> For the .css: docbook-xsl actually has support for writing the .css: [1] - but
> it requires the .css file be valid xml. I wonder if the cleanest approch would
> be to have a build step to create .css.xml - then the non-chunked build's
> generate.css.header would do the right thing.

We don't even need to do that! The attached patch just creates a wrapper
css.xml that loads the .css via an entity reference.

I think this looks reasonably complicated, given that it gives us a working
stylesheet for the non-chunked output?

I don't know if my hack of putting the paramters in stylesheet-common.xsl is
reasonable. Perhaps we should just include stylesheet-html-common.xsl in
stylesheet-hh.xsl, then this uglyness wouldn't be required.


Greetings,

Andres Freund
>From e7145805c25c0f1af983268882107f1557b67d44 Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Wed, 15 Mar 2023 16:45:14 -0700
Subject: [PATCH v3 1/4] docs: html: copy images to output as part of xslt
 build

---
 doc/src/sgml/Makefile              |  2 --
 doc/src/sgml/stylesheet-common.xsl | 22 ++++++++++++++++++++++
 doc/src/sgml/stylesheet-hh.xsl     |  6 ++++++
 doc/src/sgml/stylesheet.xsl        |  7 ++++++-
 4 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/doc/src/sgml/Makefile b/doc/src/sgml/Makefile
index b96c7cbf223..1b098f983ec 100644
--- a/doc/src/sgml/Makefile
+++ b/doc/src/sgml/Makefile
@@ -144,7 +144,6 @@ html: html-stamp
 
 html-stamp: stylesheet.xsl postgres-full.xml $(ALL_IMAGES)
 	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(XSLTPROC_HTML_FLAGS) $(wordlist 1,2,$^)
-	cp $(ALL_IMAGES) html/
 	cp $(srcdir)/stylesheet.css html/
 	touch $@
 
@@ -152,7 +151,6 @@ htmlhelp: htmlhelp-stamp
 
 htmlhelp-stamp: stylesheet-hh.xsl postgres-full.xml $(ALL_IMAGES)
 	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(wordlist 1,2,$^)
-	cp $(ALL_IMAGES) htmlhelp/
 	cp $(srcdir)/stylesheet.css htmlhelp/
 	touch $@
 
diff --git a/doc/src/sgml/stylesheet-common.xsl b/doc/src/sgml/stylesheet-common.xsl
index 761484c7fef..d2928f86eb7 100644
--- a/doc/src/sgml/stylesheet-common.xsl
+++ b/doc/src/sgml/stylesheet-common.xsl
@@ -101,4 +101,26 @@
   <xsl:apply-templates select="." mode="xref"/>
 </xsl:template>
 
+
+<!--
+  Support for copying images to the output directory, so the output is self
+  contained.
+-->
+<xsl:template name="write-image">
+ <xsl:variable name="input_filename">
+   <xsl:value-of select="imagedata/@fileref"/>
+ </xsl:variable>
+
+ <!-- references images directly, without images/ -->
+ <xsl:variable name="output_filename">
+   <xsl:value-of select="concat($chunk.base.dir, substring-after($input_filename, '/'))"/>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+  <xsl:with-param name="filename" select="$output_filename"/>
+  <xsl:with-param name="content" select="document($input_filename)"/>
+ </xsl:call-template>
+</xsl:template>
+
+
 </xsl:stylesheet>
diff --git a/doc/src/sgml/stylesheet-hh.xsl b/doc/src/sgml/stylesheet-hh.xsl
index 6f4b706dac6..568ccf36d2a 100644
--- a/doc/src/sgml/stylesheet-hh.xsl
+++ b/doc/src/sgml/stylesheet-hh.xsl
@@ -39,6 +39,12 @@
 </xsl:template>
 
 
+<xsl:template match="imageobject">
+  <xsl:call-template name="write-image"/>
+  <!-- copy images to the output directory, so the output is self contained -->
+  <xsl:apply-templates select="imagedata"/>
+</xsl:template>
+
 <!-- strip directory name from image filerefs -->
 <xsl:template match="imagedata/@fileref">
  <xsl:value-of select="substring-after(., '/')"/>
diff --git a/doc/src/sgml/stylesheet.xsl b/doc/src/sgml/stylesheet.xsl
index b6141303abd..f9163e7d946 100644
--- a/doc/src/sgml/stylesheet.xsl
+++ b/doc/src/sgml/stylesheet.xsl
@@ -29,7 +29,12 @@
 </xsl:param>
 
 
-<!-- strip directory name from image filerefs -->
+<xsl:template match="imageobject">
+  <xsl:call-template name="write-image"/>
+  <!-- copy images to the output directory, so the output is self contained -->
+  <xsl:apply-templates select="imagedata"/>
+</xsl:template>
+
 <xsl:template match="imagedata/@fileref">
  <xsl:value-of select="substring-after(., '/')"/>
 </xsl:template>
-- 
2.38.0

>From fdd771319069322383e144eba68f07f2c305abc1 Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Fri, 24 Mar 2023 00:13:53 -0700
Subject: [PATCH v3 2/4] docs: load stylesheet via custom.css.source

---
 doc/src/sgml/Makefile                    |  4 +---
 doc/src/sgml/meson.build                 | 12 ++++++------
 doc/src/sgml/stylesheet-common.xsl       | 14 ++++++++++++++
 doc/src/sgml/stylesheet-hh.xsl           |  1 -
 doc/src/sgml/stylesheet-html-nochunk.xsl |  3 +++
 doc/src/sgml/stylesheet.css.xml          |  8 ++++++++
 doc/src/sgml/stylesheet.xsl              | 11 -----------
 7 files changed, 32 insertions(+), 21 deletions(-)
 create mode 100644 doc/src/sgml/stylesheet.css.xml

diff --git a/doc/src/sgml/Makefile b/doc/src/sgml/Makefile
index 1b098f983ec..9be480613b4 100644
--- a/doc/src/sgml/Makefile
+++ b/doc/src/sgml/Makefile
@@ -39,7 +39,7 @@ ifndef FOP
 FOP = $(missing) fop
 endif
 
-XMLINCLUDE = --path .
+XMLINCLUDE = --path . --path $(srcdir)
 
 ifdef XMLLINT
 XMLLINT := $(XMLLINT) --nonet
@@ -144,14 +144,12 @@ html: html-stamp
 
 html-stamp: stylesheet.xsl postgres-full.xml $(ALL_IMAGES)
 	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(XSLTPROC_HTML_FLAGS) $(wordlist 1,2,$^)
-	cp $(srcdir)/stylesheet.css html/
 	touch $@
 
 htmlhelp: htmlhelp-stamp
 
 htmlhelp-stamp: stylesheet-hh.xsl postgres-full.xml $(ALL_IMAGES)
 	$(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(wordlist 1,2,$^)
-	cp $(srcdir)/stylesheet.css htmlhelp/
 	touch $@
 
 # single-page HTML
diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
index 157b8589e55..d9c46224dc9 100644
--- a/doc/src/sgml/meson.build
+++ b/doc/src/sgml/meson.build
@@ -104,7 +104,7 @@ if xsltproc_bin.found()
   xsltproc_flags = [
     '--nonet',
     '--stringparam', 'pg.version', pg_version,
-    '--param', 'website.stylesheet', '1'
+    '--path', '@CURRENT_SOURCE_DIR@', '--path', '@OUTDIR@',
   ]
 
   xsltproc = xmltools_wrapper + [
@@ -140,7 +140,7 @@ if xsltproc_bin.found()
     output: 'htmlhelp',
     depfile: 'htmlhelp.d',
     depends: doc_generated,
-    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    command: [xsltproc, '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
   )
   alldocs += htmlhelp
@@ -152,7 +152,7 @@ if xsltproc_bin.found()
     output: 'postgres.html',
     depfile: 'postgres.html.d',
     depends: doc_generated,
-    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    command: [xsltproc, '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
   )
   alldocs += postgres_html
@@ -180,14 +180,14 @@ if xsltproc_bin.found()
     output: 'INSTALL.xml',
     depfile: 'INSTALL.xml.d',
     depends: doc_generated + [postgres_full_xml],
-    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
+    command: [xsltproc, '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
     build_by_default: false,
   )
   install_html = custom_target('INSTALL.html',
     input: ['stylesheet-text.xsl', install_xml],
     output: 'INSTALL.html',
     depfile: 'INSTALL.html.d',
-    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+    command: [xsltproc, '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
   )
   alldocs += install_html
@@ -216,7 +216,7 @@ if xsltproc_bin.found()
     output: ['man1', 'man3', 'man7'],
     depfile: 'man.d',
     depends: doc_generated,
-    command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+    command: [xsltproc, '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
     build_by_default: false,
   )
   alldocs += man
diff --git a/doc/src/sgml/stylesheet-common.xsl b/doc/src/sgml/stylesheet-common.xsl
index d2928f86eb7..c1a7d46bcc6 100644
--- a/doc/src/sgml/stylesheet-common.xsl
+++ b/doc/src/sgml/stylesheet-common.xsl
@@ -42,6 +42,20 @@
 <xsl:param name="variablelist.term.separator"></xsl:param>
 <xsl:param name="xref.with.number.and.title" select="0"></xsl:param>
 
+<!--
+    currently htmlhelp and "normal" html have no common stylesheet, so this is
+    implemented here
+-->
+<xsl:param name="website.stylesheet" select="0"/>
+
+<xsl:param name="custom.css.source">
+  <xsl:if test="$website.stylesheet = 0">stylesheet.css.xml</xsl:if>
+</xsl:param>
+
+<xsl:param name="html.stylesheet">
+  <xsl:if test="not($website.stylesheet = 0)">https://www.postgresql.org/media/css/docs-complete.css.xml</xsl:if>
+</xsl:param>
+
 
 <!-- Change display of some elements -->
 
diff --git a/doc/src/sgml/stylesheet-hh.xsl b/doc/src/sgml/stylesheet-hh.xsl
index 568ccf36d2a..fb659d2ec38 100644
--- a/doc/src/sgml/stylesheet-hh.xsl
+++ b/doc/src/sgml/stylesheet-hh.xsl
@@ -9,7 +9,6 @@
 <xsl:param name="htmlhelp.use.hhk" select="'1'"/>
 
 <xsl:param name="base.dir" select="'htmlhelp/'"></xsl:param>
-<xsl:param name="html.stylesheet" select="'stylesheet.css'"></xsl:param>
 <xsl:param name="use.id.as.filename" select="'1'"></xsl:param>
 <xsl:param name="manifest.in.base.dir" select="1"/>
 <xsl:param name="make.valid.html" select="1"></xsl:param>
diff --git a/doc/src/sgml/stylesheet-html-nochunk.xsl b/doc/src/sgml/stylesheet-html-nochunk.xsl
index 8167127b93a..fae8d5fbd96 100644
--- a/doc/src/sgml/stylesheet-html-nochunk.xsl
+++ b/doc/src/sgml/stylesheet-html-nochunk.xsl
@@ -7,6 +7,9 @@
 <xsl:include href="stylesheet-html-common.xsl" />
 <xsl:include href="stylesheet-speedup-xhtml.xsl" />
 
+<!-- embed stylesheet.css if using that -->
+<xsl:param name="generate.css.header" select="$website.stylesheet = 0"/>
+
 <!-- embed SVG images into output file -->
 <xsl:template match="imagedata[@format='SVG']">
   <xsl:variable name="filename">
diff --git a/doc/src/sgml/stylesheet.css.xml b/doc/src/sgml/stylesheet.css.xml
new file mode 100644
index 00000000000..a21fcca576f
--- /dev/null
+++ b/doc/src/sgml/stylesheet.css.xml
@@ -0,0 +1,8 @@
+<!--
+    wrapper around stylesheet.css.xml to allow it to be loaded via docbook-xsl's
+    generate.css.header parameter.
+-->
+<!DOCTYPE style [
+<!ENTITY css SYSTEM "stylesheet.css">
+]>
+<style>&css;</style>
diff --git a/doc/src/sgml/stylesheet.xsl b/doc/src/sgml/stylesheet.xsl
index f9163e7d946..65606ca3dbe 100644
--- a/doc/src/sgml/stylesheet.xsl
+++ b/doc/src/sgml/stylesheet.xsl
@@ -17,17 +17,6 @@
 <xsl:param name="chunk.quietly" select="1"></xsl:param>
 <xsl:param name="admon.style"></xsl:param>  <!-- handled by CSS stylesheet -->
 
-<xsl:param name="website.stylesheet" select="0"/>
-
-<xsl:param name="html.stylesheet">
-  <xsl:choose>
-    <xsl:when test="$website.stylesheet = 0">stylesheet.css</xsl:when>
-    <xsl:otherwise>
-      https://www.postgresql.org/media/css/docs-complete.css
-    </xsl:otherwise>
-  </xsl:choose>
-</xsl:param>
-
 
 <xsl:template match="imageobject">
   <xsl:call-template name="write-image"/>
-- 
2.38.0

>From 4a220cc1bf79e19e9cb5e94d8a650123a0347bb4 Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Sun, 19 Mar 2023 11:11:37 -0700
Subject: [PATCH v3 3/4] docs: speed up docs build by special-casing the
 gentext.template

---
 doc/src/sgml/stylesheet-speedup-common.xsl | 79 ++++++++++++++++++++++
 1 file changed, 79 insertions(+)

diff --git a/doc/src/sgml/stylesheet-speedup-common.xsl b/doc/src/sgml/stylesheet-speedup-common.xsl
index e3fb582a1cc..5266ff587b9 100644
--- a/doc/src/sgml/stylesheet-speedup-common.xsl
+++ b/doc/src/sgml/stylesheet-speedup-common.xsl
@@ -96,5 +96,84 @@
 <!-- Just hardcode the language for the whole document, to make it faster. -->
 
 <xsl:template name="l10n.language">en</xsl:template>
+<xsl:param name='pg.l10n.xml' select="document('file:///usr/share/xml/docbook/stylesheet/docbook-xsl/common/en.xml')[1]"/>
+
+<xsl:template name="gentext.template.recurse">
+  <xsl:param name="context"/>
+  <xsl:param name="name"/>
+  <xsl:param name="origname"/>
+  <xsl:param name="verbose"/>
+
+
+  <xsl:choose>
+    <xsl:when test="contains($name, '/')">
+      <xsl:call-template name="gentext.template.recurse">
+        <xsl:with-param name="context" select="$context"/>
+        <xsl:with-param name="name" select="substring-after($name, '/')"/>
+        <xsl:with-param name="origname" select="$origname"/>
+        <xsl:with-param name="verbose" select="$verbose"/>
+      </xsl:call-template>
+    </xsl:when>
+    <xsl:otherwise>
+
+      <!-- FIXME: should find a way to avoid the concat and [1] here -->
+      <xsl:variable name="template.node"
+                    select="key('l10n-template', concat($context, '#', $name))[1]"/>
+
+      <xsl:choose>
+        <xsl:when test="$template.node/@text">
+          <xsl:value-of select="$template.node/@text"/>
+        </xsl:when>
+        <xsl:when test="$verbose = 0">
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:message>
+            <xsl:text>No template for "</xsl:text>
+            <xsl:value-of select="$origname"/>
+            <xsl:text>" (or any of its leaves) exists in the context named "</xsl:text>
+            <xsl:value-of select="$context"/>
+            <xsl:text>" in the "</xsl:text>
+            <xsl:text>" en localization.</xsl:text>
+          </xsl:message>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+
+<xsl:template name="gentext.template">
+  <xsl:param name="context" select="'default'"/>
+  <xsl:param name="name" select="'default'"/>
+  <xsl:param name="origname" select="$name"/>
+  <xsl:param name="lang" select="'en'"/>
+  <xsl:param name="verbose" select="1"/>
+
+  <!-- FIXME: unnecessary recursion for leading -->
+  <xsl:for-each select="$pg.l10n.xml">
+    <xsl:variable name="context.node"
+                  select="key('l10n-context', $context)[1]"/>
+
+    <xsl:if test="count($context.node) = 0
+                  and $verbose != 0">
+      <xsl:message>
+        <xsl:text>No context named "</xsl:text>
+        <xsl:value-of select="$context"/>
+        <xsl:text>" exists in the "</xsl:text>
+        <xsl:value-of select="$lang"/>
+        <xsl:text>" localization.</xsl:text>
+      </xsl:message>
+    </xsl:if>
+
+    <xsl:for-each select="$context.node">
+      <xsl:call-template name="gentext.template.recurse">
+        <xsl:with-param name="context" select="$context"/>
+        <xsl:with-param name="name" select="$name"/>
+        <xsl:with-param name="origname" select="$origname"/>
+        <xsl:with-param name="verbose" select="$verbose"/>
+      </xsl:call-template>
+    </xsl:for-each>
+  </xsl:for-each>
+</xsl:template>
 
 </xsl:stylesheet>
-- 
2.38.0

>From 37c880b04e13efa36b67832c647255ee80e726bd Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Sun, 19 Mar 2023 19:29:41 -0700
Subject: [PATCH v3 4/4] VERY WIP: parallel doc generation

---
 doc/src/sgml/meson.build          | 17 +++++++++++
 doc/src/sgml/postgres.sgml        |  2 +-
 doc/src/sgml/stylesheet.xsl       | 49 +++++++++++++++++++++++++++++++
 doc/src/sgml/xmltools_dep_wrapper |  5 ++++
 4 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
index d9c46224dc9..c6195965a71 100644
--- a/doc/src/sgml/meson.build
+++ b/doc/src/sgml/meson.build
@@ -121,6 +121,23 @@ if xsltproc_bin.found()
   )
   alldocs += html
 
+  parts = ['bookinfo', 'preface', 'tutorial', 'sql', 'admin', 'client-interfaces', 'server-programming', 'reference', 'internals', 'appendixes', 'biblio', 'bookindex']
+  html_parts = []
+  foreach part : parts
+      html_parts += custom_target('html-@0@'.format(part),
+      input: ['stylesheet.xsl', postgres_full_xml],
+      output: 'html-stamp-@0@'.format(part),
+      depfile: 'html.d',
+      depends: doc_generated,
+      command: [
+        xmltools_wrapper, '--tool', xsltproc_bin, '--stamp', '@OUTPUT0@', '--',
+        '-o', '@OUTDIR@/', xsltproc_flags, '--stringparam', 'rootid', part, '@INPUT@',
+      ],
+      build_by_default: false,
+    )
+  endforeach
+  alias_target('html-parts', html_parts)
+
   install_doc_html = custom_target('install-html',
     output: 'install-html',
     command: [
diff --git a/doc/src/sgml/postgres.sgml b/doc/src/sgml/postgres.sgml
index 2e271862fc1..a169fd6f30a 100644
--- a/doc/src/sgml/postgres.sgml
+++ b/doc/src/sgml/postgres.sgml
@@ -23,7 +23,7 @@ break is not needed in a wider output rendering.
 <book id="postgres">
  <title>PostgreSQL &version; Documentation</title>
 
- <bookinfo>
+ <bookinfo id="bookinfo">
   <corpauthor>The PostgreSQL Global Development Group</corpauthor>
   <productname>PostgreSQL</productname>
   <productnumber>&version;</productnumber>
diff --git a/doc/src/sgml/stylesheet.xsl b/doc/src/sgml/stylesheet.xsl
index 65606ca3dbe..f9986d17f4a 100644
--- a/doc/src/sgml/stylesheet.xsl
+++ b/doc/src/sgml/stylesheet.xsl
@@ -28,6 +28,55 @@
  <xsl:value-of select="substring-after(., '/')"/>
 </xsl:template>
 
+<!-- Emit index.html and legalnotice.html -->
+<xsl:template name="pg.write.bookinfo">
+   <xsl:for-each select="/book">
+     <xsl:call-template name="process-chunk">
+       <xsl:with-param name="prev" select="/dontexist"/>
+       <xsl:with-param name="next" select="preface"/>
+       <xsl:with-param name="content">
+
+         <div>
+           <xsl:apply-templates select="." mode="common.html.attributes"/>
+           <xsl:call-template name="id.attribute">
+             <xsl:with-param name="conditional" select="0"/>
+           </xsl:call-template>
+
+           <xsl:call-template name="book.titlepage"/>
+
+           <xsl:apply-templates select="dedication" mode="dedication"/>
+           <xsl:apply-templates select="acknowledgements" mode="acknowledgements"/>
+
+           <xsl:variable name="toc.params">
+             <xsl:call-template name="find.path.params">
+               <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+             </xsl:call-template>
+           </xsl:variable>
+
+           <xsl:call-template name="make.lots">
+             <xsl:with-param name="toc.params" select="$toc.params"/>
+             <xsl:with-param name="toc">
+               <xsl:call-template name="division.toc">
+                 <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+               </xsl:call-template>
+             </xsl:with-param>
+           </xsl:call-template>
+         </div>
+       </xsl:with-param>
+     </xsl:call-template>
+   </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="/book/bookinfo" mode="process.root" priority="2">
+  <xsl:choose>
+    <xsl:when test="$rootid = 'bookinfo'">
+      <xsl:call-template name="pg.write.bookinfo"/>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:apply-imports/>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
 
 <!--
 Customization of header
diff --git a/doc/src/sgml/xmltools_dep_wrapper b/doc/src/sgml/xmltools_dep_wrapper
index dd96f784268..a5f5981dcee 100644
--- a/doc/src/sgml/xmltools_dep_wrapper
+++ b/doc/src/sgml/xmltools_dep_wrapper
@@ -14,6 +14,7 @@ parser = argparse.ArgumentParser(
 parser.add_argument('--targetname', type=str, required=False, nargs='+')
 parser.add_argument('--depfile', type=str, required=False)
 parser.add_argument('--tool', type=str, required=True)
+parser.add_argument('--stamp', type=str, required=False, default=None)
 parser.add_argument('flags', nargs='*')
 
 args = parser.parse_args()
@@ -51,4 +52,8 @@ else:
     command = [args.tool] + args.flags
     res = subprocess.run(command)
 
+if args.stamp is not None:
+    with open(args.stamp, "w") as f:
+        pass
+
 exit(res.returncode)
-- 
2.38.0

Reply via email to