On Tuesday, 7 March 2017 15:27:05 CET Cédric Bosdonnat wrote:
virt-builder-repository allows users to easily create or update
a virt-builder source repository out of disk images. The tool can
be run in either interactive or automated mode.
---
[...]
diff --git a/builder/repository_main.ml b/builder/repository_main.ml
new file mode 100644
index 000000000..16c221b34
+let osinfo_get_short_ids () =
+ match !osinfo_ids with
+ | Some ids -> ids
+ | None -> (
+ let set = ref StringSet.empty in
+ let g = open_guestfs () in
+
+ Osinfo.read_osinfo_db g#ocaml_handle (
+ fun filepath ->
+ let doc = Xml.parse_file filepath in
+ let xpathctx = Xml.xpath_new_context doc in
+ let id = xpath_string_default xpathctx "/libosinfo/os/short-id"
"" in
Now that I look at this again: the above expression will just read only
one short-id from each XML file, while it can be repeated more than once
(for example the Ubuntu ones have two each, "ubuntuXX.YY" and
"ubuntuCODENAME").
+let process_image filename repo tmprepo index interactive sigchecker
=
+ message (f_"Preparing %s") filename;
+
+ let filepath = repo // filename in
+ let { format = format; size = size } = get_disk_image_info filepath in
+ let xz_path = compress_to filepath tmprepo in
+ let checksum = Checksums.compute_checksum "sha512" xz_path in
+ let compressed_size = (Unix.stat xz_path).Unix.st_size in
Since later on this is turned into a int64, then most probably you
could use Unix.LargeFile directly.
+ debug " + %s\n" (String.concat "\n + "
images);
This could be:
info (f_"Found new images: %s") (String.concat " " images);
+ (* Generate entries for uncompressed images *)
+ let written_ids =
+ List.map (
+ fun filename ->
+ let id, new_entry = process_image filename cmdline.repo tmprepo
+ index cmdline.interactive sigchecker in
+
+ Index_parser.write_entry index_channel (id, new_entry);
+ id
+ ) images in
This block is not correctly indented.
+ (* Write the unchanged entries *)
+ List.iter (
+ fun (id, entry) ->
+ let written = List.mem id written_ids in
Note this will exclude an entry in the existing index, if a new image
with the same identifier but a different architecture is found; see
selected_cli_item in builder.ml.
+ if not written then
+ let { Index.file_uri = file_uri } = entry in
+ if Sys.file_exists file_uri then (
+ let rel_path =
+ try
+ subdirectory cmdline.repo file_uri
+ with
+ | Invalid_argument _ ->
+ file_uri in
This block is not correctly indented.
+ debug "adding unchanged entry: %s" rel_path;
+ let rel_entry = { entry with Index.file_uri = rel_path } in
+ Index_parser.write_entry index_channel (id, rel_entry);
+ );
+ ) index;
While the flow of the code from the comment
(* Generate entries for uncompressed images *)
above up to this point is clear, IMHO it'd be slightly better (and
slightly more OCaml-ish) to:
1) first just process 'images', mapping that to the (name * index) list
2) filter out from 'index' the entries that are in the result of (1)
3) map the result of (2) with what currently done (i.e. processing
their file_uri)
4) join (3) + (1)
5) write all the entries of (4) at once
Thanks,
--
Pino Toscano