On 11/10/25 17:20, Peter Krempa via Devel wrote:
> From: Peter Krempa <[email protected]>
> 
> 'libxml2' deprecated the 'xmlIndentTreeOutput' thread-local variable as
> well as the 'xmlThrDefIndentTreeOutput' function for setting the global
> default, which we use in our code for formatting the metadata sub-XML.
> 
> 'libxml2' also for now doesn't provide a way to set target indentation
> level in 'xmlSaveCtxt' which would allow us to use the modern output
> APIs, we can't replace our use of 'xmlDumpNode'.

Here, I'd like a reference to:

https://gitlab.gnome.org/GNOME/libxml2/-/issues/989

> 
> Since the indentation is enabled by default in libxml2 and most of our
> code using xmlDumpNode (notably except for the 'test' driver and
> embedded qemu driver uses) is in standalone processes, which didn't
> change the default, just removing the override will result in identical
> behaviour.

I think there are more drivers like that: ESX, VMWare, hyperv and maybe
others.

> 
> For the two exeptions, the result of changing the default would be that

exceptions

> the <metadata> part would be un-indented, but that is still valid XML.

Agreed. Once the aforementioned issue is fixed this can be switched to
xmlSaveTree().

> 
> Thus to fix the deprecated use just stop setting 'xmlIndentTreeOutput'.
> 
> Closes: https://gitlab.com/libvirt/libvirt/-/issues/816
> Signed-off-by: Peter Krempa <[email protected]>
> ---
>  src/util/virxml.c | 10 ----------
>  1 file changed, 10 deletions(-)
> 
> diff --git a/src/util/virxml.c b/src/util/virxml.c
> index 44f11accf3..77c7b5a8f4 100644
> --- a/src/util/virxml.c
> +++ b/src/util/virxml.c
> @@ -1920,23 +1920,14 @@ virXMLFormatMetadata(virBuffer *buf,
>  {
>      g_autoptr(xmlBuffer) xmlbuf = NULL;
>      const char *xmlbufContent = NULL;
> -    int oldIndentTreeOutput = xmlIndentTreeOutput;
> 
>      if (!metadata)
>          return 0;
> 
> -    /* Indentation on output requires that we previously set
> -     * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2
> -     * spaces per level of indentation of intermediate elements,
> -     * but no leading indentation before the starting element.
> -     * Thankfully, libxml maps what looks like globals into
> -     * thread-local uses, so we are thread-safe.  */
> -    xmlIndentTreeOutput = 1;
>      xmlbuf = virXMLBufferCreate();
> 
>      if (xmlNodeDump(xmlbuf, metadata->doc, metadata,
>                      virBufferGetIndent(buf) / 2, 1) < 0) {
> -        xmlIndentTreeOutput = oldIndentTreeOutput;
>          virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                         _("Unable to format metadata element"));
>          return -1;
> @@ -1948,7 +1939,6 @@ virXMLFormatMetadata(virBuffer *buf,
>      virSkipSpaces(&xmlbufContent);
> 
>      virBufferAsprintf(buf, "%s\n", xmlbufContent);
> -    xmlIndentTreeOutput = oldIndentTreeOutput;
> 
>      return 0;
>  }


Michal

Reply via email to