[Libosinfo] [PATCH v3 60/60] loader: implement new semantics for entity overriding

Christophe Fergeau cfergeau at redhat.com
Fri Oct 16 12:02:59 UTC 2015


On Mon, Oct 12, 2015 at 06:11:21PM +0100, Daniel P. Berrange wrote:
> This implements the new scheme for allowing entities to
> be overridden. If an XML file relative path matches one
> in an earlier datbase directory, the original file is

'database'

> not loaded at all. Any files in a ENTITY-NAME.d will
> now augment earlier data rather than replace it.
> 
> eg consider these files
> 
> 1. /usr/share/libosinfo/db/os/fedoraproject.org/fedora-22.xml
> 2. /etc/libosinfo/db/os/fedoraproject.org/fedora-22.xml
> 3. $HOME/.config/libosinfo/db/os/fedoraproject.org/fedora-22.d/extra.xml
> 
> File #1 will not get loaded, because file #2 is detected
> as a full override. File #2 will get loaded to define the
> main Fedora 22 OS, and then file #3 will get loaded to
> augment the main data.
> 
> Most of the PCI and USB device info in the local DB is
> just augmenting the pci.ids and usb.ids master files,
> so these need to move to .d directories now
> 
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
>  .gitignore                                         |   1 +
>  configure.ac                                       |  19 ++
>  data/device/pcisig.com/Makefile.am                 |  22 ++
>  data/device/pcisig.com/pci-1000-0012.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-1013-00b8.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-1022-2000.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-10ec-8029.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-10ec-8139.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-1234-1111.d/Makefile.am |   1 +
>  data/device/pcisig.com/pci-1274-5000.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-15ad-0710.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-1af4-1000.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-1af4-1001.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-1af4-1002.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-1af4-1003.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-1af4-1009.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-1b36-0100.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-8086-100e.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-8086-2415.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-8086-25ab.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/pcisig.com/pci-8086-2668.d/Makefile.am |   1 +
>  .../class.xml.in}                                  |   0
>  data/device/usb.org/Makefile.am                    |   3 +-
>  data/device/usb.org/usb-80ee-0021.d/Makefile.am    |   1 +
>  .../class.xml.in}                                  |   0
>  osinfo/osinfo_loader.c                             | 276 ++++++++++++++++++---
>  42 files changed, 299 insertions(+), 41 deletions(-)
>  create mode 100644 data/device/pcisig.com/pci-1000-0012.d/Makefile.am
>  rename data/device/pcisig.com/{pci-1000-0012.xml.in => pci-1000-0012.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-1013-00b8.d/Makefile.am
>  rename data/device/pcisig.com/{pci-1013-00b8.xml.in => pci-1013-00b8.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-1022-2000.d/Makefile.am
>  rename data/device/pcisig.com/{pci-1022-2000.xml.in => pci-1022-2000.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-10ec-8029.d/Makefile.am
>  rename data/device/pcisig.com/{pci-10ec-8029.xml.in => pci-10ec-8029.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-10ec-8139.d/Makefile.am
>  rename data/device/pcisig.com/{pci-10ec-8139.xml.in => pci-10ec-8139.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-1234-1111.d/Makefile.am
>  create mode 100644 data/device/pcisig.com/pci-1274-5000.d/Makefile.am
>  rename data/device/pcisig.com/{pci-1274-5000.xml.in => pci-1274-5000.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-15ad-0710.d/Makefile.am
>  rename data/device/pcisig.com/{pci-15ad-0710.xml.in => pci-15ad-0710.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-1af4-1000.d/Makefile.am
>  rename data/device/pcisig.com/{pci-1af4-1000.xml.in => pci-1af4-1000.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-1af4-1001.d/Makefile.am
>  rename data/device/pcisig.com/{pci-1af4-1001.xml.in => pci-1af4-1001.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-1af4-1002.d/Makefile.am
>  rename data/device/pcisig.com/{pci-1af4-1002.xml.in => pci-1af4-1002.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-1af4-1003.d/Makefile.am
>  rename data/device/pcisig.com/{pci-1af4-1003.xml.in => pci-1af4-1003.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-1af4-1009.d/Makefile.am
>  rename data/device/pcisig.com/{pci-1af4-1009.xml.in => pci-1af4-1009.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-1b36-0100.d/Makefile.am
>  rename data/device/pcisig.com/{pci-1b36-0100.xml.in => pci-1b36-0100.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-8086-100e.d/Makefile.am
>  rename data/device/pcisig.com/{pci-8086-100e.xml.in => pci-8086-100e.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-8086-2415.d/Makefile.am
>  rename data/device/pcisig.com/{pci-8086-2415.xml.in => pci-8086-2415.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-8086-25ab.d/Makefile.am
>  rename data/device/pcisig.com/{pci-8086-25ab.xml.in => pci-8086-25ab.d/class.xml.in} (100%)
>  create mode 100644 data/device/pcisig.com/pci-8086-2668.d/Makefile.am
>  rename data/device/pcisig.com/{pci-8086-2668.xml.in => pci-8086-2668.d/class.xml.in} (100%)
>  create mode 100644 data/device/usb.org/usb-80ee-0021.d/Makefile.am
>  rename data/device/usb.org/{usb-80ee-0021.xml.in => usb-80ee-0021.d/class.xml.in} (100%)
> 
> diff --git a/.gitignore b/.gitignore
> index b663072..1cc9e2f 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -70,6 +70,7 @@ build/
>  gtk-doc.make
>  data/95-osinfo.rules
>  data/*/*/*.xml
> +data/*/*/*/*.xml
>  data/pci.ids
>  data/usb.ids
>  tools/osinfo-detect
> diff --git a/configure.ac b/configure.ac
> index a7eaf26..494372c 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -229,7 +229,26 @@ AC_CONFIG_FILES([
>  	data/device/ibasetechnologies.net/Makefile
>  	data/device/ibm.com/Makefile
>  	data/device/pcisig.com/Makefile
> +	data/device/pcisig.com/pci-1000-0012.d/Makefile
> +	data/device/pcisig.com/pci-1013-00b8.d/Makefile
> +	data/device/pcisig.com/pci-1022-2000.d/Makefile
> +	data/device/pcisig.com/pci-10ec-8029.d/Makefile
> +	data/device/pcisig.com/pci-10ec-8139.d/Makefile
> +	data/device/pcisig.com/pci-1234-1111.d/Makefile
> +	data/device/pcisig.com/pci-1274-5000.d/Makefile
> +	data/device/pcisig.com/pci-15ad-0710.d/Makefile
> +	data/device/pcisig.com/pci-1af4-1000.d/Makefile
> +	data/device/pcisig.com/pci-1af4-1001.d/Makefile
> +	data/device/pcisig.com/pci-1af4-1002.d/Makefile
> +	data/device/pcisig.com/pci-1af4-1003.d/Makefile
> +	data/device/pcisig.com/pci-1af4-1009.d/Makefile
> +	data/device/pcisig.com/pci-1b36-0100.d/Makefile
> +	data/device/pcisig.com/pci-8086-100e.d/Makefile
> +	data/device/pcisig.com/pci-8086-2415.d/Makefile
> +	data/device/pcisig.com/pci-8086-25ab.d/Makefile
> +	data/device/pcisig.com/pci-8086-2668.d/Makefile
>  	data/device/usb.org/Makefile
> +	data/device/usb.org/usb-80ee-0021.d/Makefile
>  	data/device/xen.org/Makefile
>  	data/platform/Makefile
>  	data/platform/linux-kvm.org/Makefile
> diff --git a/data/device/pcisig.com/Makefile.am b/data/device/pcisig.com/Makefile.am
> index ee4552b..567618a 100644
> --- a/data/device/pcisig.com/Makefile.am
> +++ b/data/device/pcisig.com/Makefile.am
> @@ -1 +1,23 @@
> +
> +SUBDIRS = \
> +	pci-1000-0012.d \
> +	pci-1013-00b8.d \
> +	pci-1022-2000.d \
> +	pci-10ec-8029.d \
> +	pci-10ec-8139.d \
> +	pci-1234-1111.d \
> +	pci-1274-5000.d \
> +	pci-15ad-0710.d \
> +	pci-1af4-1000.d \
> +	pci-1af4-1001.d \
> +	pci-1af4-1002.d \
> +	pci-1af4-1003.d \
> +	pci-1af4-1009.d \
> +	pci-1b36-0100.d \
> +	pci-8086-100e.d \
> +	pci-8086-2415.d \
> +	pci-8086-25ab.d \
> +	pci-8086-2668.d \
> +	$(NULL)
> +
>  include ../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1000-0012.d/Makefile.am b/data/device/pcisig.com/pci-1000-0012.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1000-0012.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1000-0012.xml.in b/data/device/pcisig.com/pci-1000-0012.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-1000-0012.xml.in
> rename to data/device/pcisig.com/pci-1000-0012.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-1013-00b8.d/Makefile.am b/data/device/pcisig.com/pci-1013-00b8.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1013-00b8.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1013-00b8.xml.in b/data/device/pcisig.com/pci-1013-00b8.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-1013-00b8.xml.in
> rename to data/device/pcisig.com/pci-1013-00b8.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-1022-2000.d/Makefile.am b/data/device/pcisig.com/pci-1022-2000.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1022-2000.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1022-2000.xml.in b/data/device/pcisig.com/pci-1022-2000.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-1022-2000.xml.in
> rename to data/device/pcisig.com/pci-1022-2000.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-10ec-8029.d/Makefile.am b/data/device/pcisig.com/pci-10ec-8029.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-10ec-8029.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-10ec-8029.xml.in b/data/device/pcisig.com/pci-10ec-8029.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-10ec-8029.xml.in
> rename to data/device/pcisig.com/pci-10ec-8029.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-10ec-8139.d/Makefile.am b/data/device/pcisig.com/pci-10ec-8139.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-10ec-8139.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-10ec-8139.xml.in b/data/device/pcisig.com/pci-10ec-8139.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-10ec-8139.xml.in
> rename to data/device/pcisig.com/pci-10ec-8139.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-1234-1111.d/Makefile.am b/data/device/pcisig.com/pci-1234-1111.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1234-1111.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1274-5000.d/Makefile.am b/data/device/pcisig.com/pci-1274-5000.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1274-5000.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1274-5000.xml.in b/data/device/pcisig.com/pci-1274-5000.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-1274-5000.xml.in
> rename to data/device/pcisig.com/pci-1274-5000.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-15ad-0710.d/Makefile.am b/data/device/pcisig.com/pci-15ad-0710.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-15ad-0710.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-15ad-0710.xml.in b/data/device/pcisig.com/pci-15ad-0710.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-15ad-0710.xml.in
> rename to data/device/pcisig.com/pci-15ad-0710.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-1af4-1000.d/Makefile.am b/data/device/pcisig.com/pci-1af4-1000.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1af4-1000.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1af4-1000.xml.in b/data/device/pcisig.com/pci-1af4-1000.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-1af4-1000.xml.in
> rename to data/device/pcisig.com/pci-1af4-1000.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-1af4-1001.d/Makefile.am b/data/device/pcisig.com/pci-1af4-1001.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1af4-1001.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1af4-1001.xml.in b/data/device/pcisig.com/pci-1af4-1001.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-1af4-1001.xml.in
> rename to data/device/pcisig.com/pci-1af4-1001.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-1af4-1002.d/Makefile.am b/data/device/pcisig.com/pci-1af4-1002.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1af4-1002.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1af4-1002.xml.in b/data/device/pcisig.com/pci-1af4-1002.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-1af4-1002.xml.in
> rename to data/device/pcisig.com/pci-1af4-1002.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-1af4-1003.d/Makefile.am b/data/device/pcisig.com/pci-1af4-1003.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1af4-1003.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1af4-1003.xml.in b/data/device/pcisig.com/pci-1af4-1003.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-1af4-1003.xml.in
> rename to data/device/pcisig.com/pci-1af4-1003.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-1af4-1009.d/Makefile.am b/data/device/pcisig.com/pci-1af4-1009.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1af4-1009.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1af4-1009.xml.in b/data/device/pcisig.com/pci-1af4-1009.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-1af4-1009.xml.in
> rename to data/device/pcisig.com/pci-1af4-1009.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-1b36-0100.d/Makefile.am b/data/device/pcisig.com/pci-1b36-0100.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-1b36-0100.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-1b36-0100.xml.in b/data/device/pcisig.com/pci-1b36-0100.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-1b36-0100.xml.in
> rename to data/device/pcisig.com/pci-1b36-0100.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-8086-100e.d/Makefile.am b/data/device/pcisig.com/pci-8086-100e.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-8086-100e.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-8086-100e.xml.in b/data/device/pcisig.com/pci-8086-100e.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-8086-100e.xml.in
> rename to data/device/pcisig.com/pci-8086-100e.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-8086-2415.d/Makefile.am b/data/device/pcisig.com/pci-8086-2415.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-8086-2415.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-8086-2415.xml.in b/data/device/pcisig.com/pci-8086-2415.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-8086-2415.xml.in
> rename to data/device/pcisig.com/pci-8086-2415.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-8086-25ab.d/Makefile.am b/data/device/pcisig.com/pci-8086-25ab.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-8086-25ab.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-8086-25ab.xml.in b/data/device/pcisig.com/pci-8086-25ab.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-8086-25ab.xml.in
> rename to data/device/pcisig.com/pci-8086-25ab.d/class.xml.in
> diff --git a/data/device/pcisig.com/pci-8086-2668.d/Makefile.am b/data/device/pcisig.com/pci-8086-2668.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/pcisig.com/pci-8086-2668.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/pcisig.com/pci-8086-2668.xml.in b/data/device/pcisig.com/pci-8086-2668.d/class.xml.in
> similarity index 100%
> rename from data/device/pcisig.com/pci-8086-2668.xml.in
> rename to data/device/pcisig.com/pci-8086-2668.d/class.xml.in
> diff --git a/data/device/usb.org/Makefile.am b/data/device/usb.org/Makefile.am
> index ee4552b..37a2078 100644
> --- a/data/device/usb.org/Makefile.am
> +++ b/data/device/usb.org/Makefile.am
> @@ -1 +1,2 @@
> -include ../../Makefile.inc
> +
> +SUBDIRS = usb-80ee-0021.d
> diff --git a/data/device/usb.org/usb-80ee-0021.d/Makefile.am b/data/device/usb.org/usb-80ee-0021.d/Makefile.am
> new file mode 100644
> index 0000000..4ce2491
> --- /dev/null
> +++ b/data/device/usb.org/usb-80ee-0021.d/Makefile.am
> @@ -0,0 +1 @@
> +include ../../../Makefile.inc
> diff --git a/data/device/usb.org/usb-80ee-0021.xml.in b/data/device/usb.org/usb-80ee-0021.d/class.xml.in
> similarity index 100%
> rename from data/device/usb.org/usb-80ee-0021.xml.in
> rename to data/device/usb.org/usb-80ee-0021.d/class.xml.in
> diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
> index 30546b4..b828291 100644
> --- a/osinfo/osinfo_loader.c
> +++ b/osinfo/osinfo_loader.c
> @@ -74,6 +74,13 @@ struct _OsinfoEntityKey
>  };
>  typedef struct _OsinfoEntityKey OsinfoEntityKey;
>  
> +typedef struct OsinfoLoaderEntityFiles OsinfoLoaderEntityFiles;
> +
> +struct OsinfoLoaderEntityFiles {
> +    GFile *master;
> +    GList *extensions;
> +};
> +
>  static void
>  osinfo_loader_finalize(GObject *object)
>  {
> @@ -496,6 +503,8 @@ static gboolean osinfo_loader_check_id(const gchar *relpath,
>      gchar *name;
>      gchar *suffix;
>      gboolean sep = FALSE;
> +    gchar *reldir;
> +    gboolean extension;
>      gsize i;
>      if (g_str_has_prefix(id, "http://")) {
>          suffix = g_strdup(id + strlen("http://"));
> @@ -512,18 +521,28 @@ static gboolean osinfo_loader_check_id(const gchar *relpath,
>                  suffix[i] = '-';
>          }
>      }
> -    name = g_strdup_printf("/%s/%s.xml", type, suffix);
> +    reldir = g_path_get_dirname(relpath);
> +    if (g_str_has_suffix(reldir, ".d")) {
> +        name = g_strdup_printf("/%s/%s.d", type, suffix);
> +        extension = TRUE;
> +    } else {
> +        name = g_strdup_printf("/%s/%s.xml", type, suffix);
> +        extension = FALSE;
> +    }
>      g_free(suffix);
>  
> -    if (!g_str_equal(relpath, name)) {
> +    if (!g_str_equal(extension ? reldir : relpath, name)) {
>          g_warning("Entity %s should be in file %s not %s",
> -                  id, name, relpath);
> +                  id, name, extension ? reldir : relpath);
> +        g_free(reldir);
> +        g_free(name);
>          return TRUE; /* In future switch to FALSE to refuse
>                        * to load non-compliant named files.
>                        * Need a period of grace for backcompat
>                        * first though... Switch ETA Jan 2017
>                        */
>      }
> +    g_free(reldir);
>      g_free(name);
>      return TRUE;
>  }
> @@ -1665,6 +1684,7 @@ static void osinfo_loader_process_xml(OsinfoLoader *loader,
>  static void
>  osinfo_loader_process_file_reg_ids(OsinfoLoader *loader,
>                                     GFile *file,
> +                                   GHashTable *allentries,
>                                     gboolean withSubsys,
>                                     const char *baseURI,
>                                     const char *busType,
> @@ -1749,6 +1769,15 @@ osinfo_loader_process_file_reg_ids(OsinfoLoader *loader,
>  
>                  gchar *id = g_strdup_printf("%s/%s/%s/%s",
>                                              baseURI, busType, vendor_id, device_id);
> +                gchar *key = g_strdup_printf("/device/%s/%s-%s-%s",
> +                                              baseURI + 7, busType, vendor_id, device_id);
> +                OsinfoLoaderEntityFiles *files = g_hash_table_lookup(allentries, key);
> +                g_free(key);
> +                if (files && files->master) {
> +                    /* Native database has a matching entry that completely
> +                     * replaces the external record */
> +                    continue;
> +                }
>  
>                  OsinfoDevice *dev = osinfo_loader_get_device(loader, id);
>                  g_hash_table_remove(loader->priv->entity_refs, id);
> @@ -1792,10 +1821,12 @@ osinfo_loader_process_file_reg_ids(OsinfoLoader *loader,
>  static void
>  osinfo_loader_process_file_reg_usb(OsinfoLoader *loader,
>                                     GFile *file,
> +                                   GHashTable *allentries,
>                                     GError **err)
>  {
>      osinfo_loader_process_file_reg_ids(loader,
>                                         file,
> +                                       allentries,
>                                         FALSE,
>                                         "http://usb.org",
>                                         "usb",
> @@ -1805,10 +1836,12 @@ osinfo_loader_process_file_reg_usb(OsinfoLoader *loader,
>  static void
>  osinfo_loader_process_file_reg_pci(OsinfoLoader *loader,
>                                     GFile *file,
> +                                   GHashTable *allentries,
>                                     GError **err)
>  {
>      osinfo_loader_process_file_reg_ids(loader,
>                                         file,
> +                                       allentries,
>                                         TRUE,
>                                         "http://pcisig.com",
>                                         "pci",
> @@ -1851,13 +1884,96 @@ osinfo_loader_process_file_reg_xml(OsinfoLoader *loader,
>  }
>  
>  
> -static GList *osinfo_loader_find_files(OsinfoLoader *loader,
> -                                       GFile *file,
> -                                       GError **err)
> +static void osinfo_loader_entity_files_free(OsinfoLoaderEntityFiles *files)
> +{
> +    if (!files)
> +        return;
> +    g_list_foreach(files->extensions, (GFunc)g_object_unref, NULL);
> +    g_list_free(files->extensions);
> +    if (files->master)
> +        g_object_unref(files->master);
> +    g_free(files);
> +}
> +
> +
> +static void osinfo_loader_entity_files_add_path(GHashTable *entries,
> +                                                GFile *base,
> +                                                GFile *ent)
> +{
> +    /*
> +     * We have paths which are either:
> +     *
> +     *   $DB_ROOT/os/fedoraproject.org/fedora-19.xml
> +     *   $DB_ROOT/os/fedoraproject.org/fedora-19.d/fragment.xml
> +     *
> +     * And need to extract the prefix
> +     *
> +     *   os/fedoraproject.org/fedora-19
> +     *
> +     * We assume that no domain names end with '.d'
> +     */
> +    gchar *path = g_file_get_path(ent);
> +    const gchar *relpath = path;
> +    gchar *dirname;
> +    gchar *key = NULL;
> +    gboolean extension = FALSE;
> +    OsinfoLoaderEntityFiles *entry;
> +    gchar *basepath = g_file_get_path(base);
> +
> +    g_object_set_data(G_OBJECT(ent), "base", base);
> +
> +    if (g_str_has_prefix(path, basepath))
> +        relpath += strlen(basepath);
> +
> +    dirname = g_path_get_dirname(relpath);
> +
> +    if (g_str_has_suffix(dirname, ".d")) {
> +        key = g_strdup(dirname);
> +        key[strlen(key) - 2] = '\0';

Could alternatively be g_strndup

> +        extension = TRUE;
> +    } else if (g_str_has_suffix(relpath, ".xml")) {
> +        key = g_strdup(relpath);
> +        key[strlen(key) - 4] = '\0';

ditto

> +    } else {
> +        /* This should not be reached, since we already
> +         * filtered to only have files in .xml
> +         */
> +        g_warning("Unexpected database file %s", path);
> +        goto error;
> +        return;

unneeded return.

> +    }
> +
> +    entry = g_hash_table_lookup(entries, key);
> +    if (!entry) {
> +        entry = g_new0(OsinfoLoaderEntityFiles, 1);
> +        g_hash_table_insert(entries, g_strdup(key), entry);
> +    }
> +    g_object_ref(ent);
> +    if (extension) {
> +        entry->extensions = g_list_append(entry->extensions, ent);
> +    } else {
> +        if (entry->master) {
> +            g_warning("Unexpected duplicate master file %s", path);
> +        }
> +        entry->master = ent;
> +    }
> +
> + error:
> +    g_free(key);
> +    g_free(dirname);
> +    g_free(path);
> +    g_free(basepath);
> +}
> +
> +
> +static void osinfo_loader_find_files(OsinfoLoader *loader,
> +                                     GFile *base,
> +                                     GFile *file,
> +                                     GHashTable *entries,
> +                                     GError **err)
>  {
>      GError *error = NULL;
>      GFileInfo *child;
> -    GList *files = NULL;
>      GFileEnumerator *ents = g_file_enumerate_children(file,
>                                                        "standard::*",
>                                                        G_FILE_QUERY_INFO_NONE,
> @@ -1879,25 +1995,19 @@ static GList *osinfo_loader_find_files(OsinfoLoader *loader,
>                                                            G_FILE_ATTRIBUTE_STANDARD_TYPE);
>          if (type == G_FILE_TYPE_REGULAR) {
>              if (g_str_has_suffix(name, ".xml"))
> -                files = g_list_append(files, g_object_ref(ent));
> +                osinfo_loader_entity_files_add_path(entries, base, ent);
>          } else if (type == G_FILE_TYPE_DIRECTORY) {
> -            GList *subfiles = osinfo_loader_find_files(loader, ent, &error);
> -            if (subfiles) {
> -                files = g_list_concat(files, subfiles);
> -            }
> +            osinfo_loader_find_files(loader, base, ent, entries, &error);
>          }
>          g_object_unref(ent);
>          g_object_unref(child);
>  
>          if (error) {
> -            g_list_foreach(files, (GFunc)g_object_unref, NULL);
> -            g_list_free(files);
> -            return NULL;
> +            break;
>          }
>      }
>  
>      g_object_unref(ents);
> -    return files;
>  }
>  
>  
> @@ -1912,41 +2022,92 @@ static void osinfo_loader_process_list(OsinfoLoader *loader,
>                                         GError **err)
>  {
>      GError *lerr = NULL;
> +    GFile **tmp;
> +    GHashTable *allentries = g_hash_table_new_full(g_str_hash,
> +                                                   g_str_equal,
> +                                                   g_free,
> +                                                   (GDestroyNotify)osinfo_loader_entity_files_free);
>      GHashTableIter iter;
>      gpointer key, value;
>  
> -    while (dirs && *dirs) {
> -        OsinfoLoaderDataFormat fmt = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(*dirs), "data-format"));
> +    /* Phase 1: gather the files in each native format location */
> +    tmp = dirs;
> +    while (tmp && *tmp) {
> +        OsinfoLoaderDataFormat fmt = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(*tmp), "data-format"));
>  
> -        switch (fmt) {
> -        case OSINFO_DATA_FORMAT_NATIVE: {
> -            GList *files = osinfo_loader_find_files(loader, *dirs, &lerr);
> -            GList *tmp;
> -            if (lerr) {
> -                g_propagate_error(err, lerr);
> -                return;
> -            }
> +        if (fmt != OSINFO_DATA_FORMAT_NATIVE) {
> +            tmp++;
> +            continue;
> +        }
>  
> -            tmp = files;
> -            while (tmp) {
> -                osinfo_loader_process_file_reg_xml(loader, *dirs, tmp->data, &lerr);
> -                if (lerr) {
> -                    g_propagate_error(err, lerr);
> -                    break;
> -                }
> -                tmp = tmp->next;
> +        GHashTable *entries = g_hash_table_new_full(g_str_hash,
> +                                                    g_str_equal,
> +                                                    g_free,
> +                                                    (GDestroyNotify)osinfo_loader_entity_files_free);
> +
> +        osinfo_loader_find_files(loader, *tmp, *tmp, entries, &lerr);
> +        if (lerr) {
> +            g_propagate_error(err, lerr);
> +            return;

This leaks 'allentries' and 'entries'

> +        }
> +
> +        /* 'entries' contains a list of files from this location, which
> +         * we need to merge with any previously gathered files.
> +         *
> +         * If 'allentries' already contains an entry with the matching key
> +         *
> +         *  => If 'entries' has the master file present, this completely
> +         *     replaces the data in 'allentries.'
> +         *  => Else we just augment the extensions in 'allentries'
> +         */
> +        g_hash_table_iter_init(&iter, entries);
> +        while (g_hash_table_iter_next(&iter, &key, &value)) {
> +            const gchar *path = key;
> +            OsinfoLoaderEntityFiles *newfiles = value;
> +            OsinfoLoaderEntityFiles *oldfiles;
> +
> +            oldfiles = g_hash_table_lookup(allentries, key);
> +            if (!oldfiles || newfiles->master) {
> +                /* Completely new, or replacing master */
> +                oldfiles = g_new0(OsinfoLoaderEntityFiles, 1);
> +                oldfiles->master = newfiles->master;
> +                newfiles->master = NULL;
> +                oldfiles->extensions = newfiles->extensions;
> +                newfiles->extensions = NULL;
> +                g_hash_table_insert(allentries, g_strdup(path), oldfiles);
> +            } else {
> +                /* Just augmenting the extensions */
> +                oldfiles->extensions = g_list_concat(oldfiles->extensions,
> +                                                     newfiles->extensions);
> +                newfiles->extensions = NULL;
>              }
> -            g_list_foreach(files, (GFunc)g_object_unref, NULL);
> -            g_list_free(files);
> +        }
> +
> +        g_hash_table_unref(entries);
>  
> -        }   break;
> +        tmp++;
> +    }
> +
> +    if (lerr)
> +        return;
> +
> +    /* Phase 2: load data from non-native locations, filtering based
> +     * on overrides from native locations */
> +    tmp = dirs;
> +    while (tmp && *tmp) {
> +        OsinfoLoaderDataFormat fmt = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(*tmp), "data-format"));
> +
> +        switch (fmt) {
> +        case OSINFO_DATA_FORMAT_NATIVE:
> +            /* nada */
> +            break;
>  
>          case OSINFO_DATA_FORMAT_PCI_IDS:
> -            osinfo_loader_process_file_reg_pci(loader, *dirs, &lerr);
> +            osinfo_loader_process_file_reg_pci(loader, *tmp, allentries, &lerr);
>              break;
>  
>          case OSINFO_DATA_FORMAT_USB_IDS:
> -            osinfo_loader_process_file_reg_usb(loader, *dirs, &lerr);
> +            osinfo_loader_process_file_reg_usb(loader, *tmp, allentries, &lerr);
>              break;
>          }
>  
> @@ -1954,9 +2115,44 @@ static void osinfo_loader_process_list(OsinfoLoader *loader,
>              break;
>          }
>  
> -        dirs++;
> +        tmp++;
> +    }
> +
> +    if (lerr)
> +        return;

This will leak all_entries (I guess there are more error handling path
which are going to leak it)}

Seems good otherwise.

Christophe

> +
> +    /* Phase 3: load combined set of files from native locations */
> +    g_hash_table_iter_init(&iter, allentries);
> +    while (g_hash_table_iter_next(&iter, &key, &value)) {
> +        OsinfoLoaderEntityFiles *files = value;
> +        GList *tmpl;
> +        if (files->master) {
> +            osinfo_loader_process_file_reg_xml(loader,
> +                                               g_object_get_data(G_OBJECT(files->master), "base"),
> +                                               files->master, &lerr);
> +            if (lerr) {
> +                g_propagate_error(err, lerr);
> +                break;
> +            }
> +        }
> +
> +        tmpl = files->extensions;
> +        while (tmpl) {
> +            GFile *file = tmpl->data;
> +            osinfo_loader_process_file_reg_xml(loader,
> +                                               g_object_get_data(G_OBJECT(file), "base"),
> +                                               file,
> +                                               &lerr);
> +            if (lerr) {
> +                g_propagate_error(err, lerr);
> +                break;
> +            }
> +
> +            tmpl = tmpl->next;
> +        }
>      }
>  
> +    g_hash_table_unref(allentries);
>      g_hash_table_iter_init(&iter, loader->priv->entity_refs);
>      while (g_hash_table_iter_next(&iter, &key, &value)) {
>          g_warning("Entity %s referenced but not defined", (const char *)key);
> -- 
> 2.4.3
> 
> _______________________________________________
> Libosinfo mailing list
> Libosinfo at redhat.com
> https://www.redhat.com/mailman/listinfo/libosinfo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libosinfo/attachments/20151016/27a83f95/attachment.sig>


More information about the Libosinfo mailing list