[Libguestfs] [PATCH 1/2] v2v: -i ova: Hoist utility functions to the top of the file.

Richard W.M. Jones rjones at redhat.com
Mon Mar 13 13:14:51 UTC 2017


These functions obscure the true flow of the code, so hoist
them out of the source () method to the top of the file.

No change, just refactoring.
---
 v2v/input_ova.ml | 139 +++++++++++++++++++++++++++----------------------------
 1 file changed, 69 insertions(+), 70 deletions(-)

diff --git a/v2v/input_ova.ml b/v2v/input_ova.ml
index 72a63d3..9a6a615 100644
--- a/v2v/input_ova.ml
+++ b/v2v/input_ova.ml
@@ -40,6 +40,69 @@ let libvirt_supports_json_raw_driver () =
   else
     true
 
+(* Untar part or all files from tar archive. If [paths] is specified it is
+ * a list of paths in the tar archive.
+ *)
+let untar ?(format = "") ?paths file outdir =
+  let cmd = [ "tar"; sprintf "-x%sf" format; file; "-C"; outdir ]
+            @ match paths with None -> [] | Some p -> p in
+  if run_command cmd <> 0 then
+    error (f_"error unpacking %s, see earlier error messages") file
+
+(* Untar only ovf and manifest from the archive *)
+let untar_metadata file outdir =
+  let files = external_command (sprintf "tar -tf %s" (Filename.quote file)) in
+  let files =
+    filter_map (
+      fun f ->
+        if Filename.check_suffix f ".ovf" ||
+           Filename.check_suffix f ".mf" then Some f
+        else None
+    ) files in
+  untar ~paths:files file outdir
+
+(* Find files in [dir] ending with [ext]. *)
+let find_files dir ext =
+  let rec loop = function
+    | [] -> []
+    | dir :: rest ->
+       let files = Array.to_list (Sys.readdir dir) in
+       let files = List.map (Filename.concat dir) files in
+       let dirs, files = List.partition Sys.is_directory files in
+       let files =
+         List.filter (fun x -> Filename.check_suffix x ext) files in
+       files @ loop (rest @ dirs)
+  in
+  loop [dir]
+
+(* Uncompress the first few bytes of [file] and return it as
+ * [(bytes, len)].  [zcat] is the command to use (eg. zcat or xzcat).
+ *)
+let uncompress_head zcat file =
+  let cmd = sprintf "%s %s" zcat (quote file) in
+  let chan_out, chan_in, chan_err = Unix.open_process_full cmd [||] in
+  let b = Bytes.create 512 in
+  let len = input chan_out b 0 (Bytes.length b) in
+  (* We're expecting the subprocess to fail because we close
+   * the pipe early, so:
+   *)
+  ignore (Unix.close_process_full (chan_out, chan_in, chan_err));
+  b, len
+
+(* Run [detect_file_type] on a compressed file, returning the
+ * type of the uncompressed content (if known).
+ *)
+let uncompressed_type format file =
+  let zcat = match format with `GZip -> "zcat" | `XZ -> "xzcat" in
+  let head, headlen = uncompress_head zcat file in
+  let tmpfile, chan =
+    Filename.open_temp_file "ova.file." "" in
+  output chan head 0 headlen;
+  close_out chan;
+  let ret = detect_file_type tmpfile in
+  Sys.remove tmpfile;
+  ret
+
 class input_ova ova =
   let tmpdir =
     let base_dir = (open_guestfs ())#get_cachedir () in
@@ -52,17 +115,6 @@ object
   method as_options = "-i ova " ^ ova
 
   method source () =
-    (* Untar part or all files from tar archive. If [paths] is specified it is
-     * a list of paths in the tar archive.
-     *)
-    let untar ?(format = "") ?paths file outdir =
-      let cmd =
-        [ "tar"; sprintf "-x%sf" format; file; "-C"; outdir ]
-        @ match paths with None -> [] | Some p -> p in
-      if run_command cmd <> 0 then
-        error (f_"error unpacking %s, see earlier error messages") ova
-    in
-
     (* Extract ova file. *)
     let exploded, partial =
       (* The spec allows a directory to be specified as an ova.  This
@@ -70,37 +122,6 @@ object
        *)
       if is_directory ova then ova, false
       else (
-        let uncompress_head zcat file =
-          let cmd = sprintf "%s %s" zcat (quote file) in
-          let chan_out, chan_in, chan_err = Unix.open_process_full cmd [||] in
-          let b = Bytes.create 512 in
-          let len = input chan_out b 0 (Bytes.length b) in
-          (* We're expecting the subprocess to fail because we close
-           * the pipe early, so:
-           *)
-          ignore (Unix.close_process_full (chan_out, chan_in, chan_err));
-
-          let tmpfile, chan =
-            Filename.open_temp_file ~temp_dir:tmpdir "ova.file." "" in
-          output chan b 0 len;
-          close_out chan;
-
-          tmpfile in
-
-        (* Untar only ovf and manifest from the archive *)
-        let untar_metadata ova outdir =
-          let files =
-            external_command (sprintf "tar -tf %s" (Filename.quote ova)) in
-          let files =
-            filter_map (fun f ->
-              if Filename.check_suffix f ".ovf" ||
-                  Filename.check_suffix f ".mf" then
-                Some f
-              else None
-            ) files in
-          untar ~paths:files ova outdir
-        in
-
         match detect_file_type ova with
         | `Tar ->
           (* Normal ovas are tar file (not compressed). *)
@@ -126,22 +147,17 @@ object
           if run_command cmd <> 0 then
             error (f_"error unpacking %s, see earlier error messages") ova;
           tmpdir, false
+
         | (`GZip|`XZ) as format ->
-          let zcat, tar_fmt =
-            match format with
-            | `GZip -> "zcat", "z"
-            | `XZ -> "xzcat", "J" in
-          let tmpfile = uncompress_head zcat ova in
-          let tmpfiletype = detect_file_type tmpfile in
-          (* Remove tmpfile from tmpdir, to leave it empty. *)
-          Sys.remove tmpfile;
-          (match tmpfiletype with
+          (match uncompressed_type format ova with
           | `Tar ->
-            untar ~format:tar_fmt ova tmpdir;
-            tmpdir, false
+             let format = match format with `GZip -> "z" | `XZ -> "J" in
+             untar ~format ova tmpdir;
+             tmpdir, false
           | `Zip | `GZip | `XZ | `Unknown ->
             error (f_"%s: unsupported file format\n\nFormats which we currently understand for '-i ova' are: tar (uncompressed, compress with gzip or xz), zip") ova
           )
+
         | `Unknown ->
           error (f_"%s: unsupported file format\n\nFormats which we currently understand for '-i ova' are: tar (uncompressed, compress with gzip or xz), zip") ova
       ) in
@@ -159,23 +175,6 @@ object
       ignore (run_command cmd)
     );
 
-    (* Find files in [dir] ending with [ext]. *)
-    let find_files dir ext =
-      let rec loop = function
-        | [] -> []
-        | dir :: rest ->
-          let files = Array.to_list (Sys.readdir dir) in
-          let files = List.map (Filename.concat dir) files in
-          let dirs, files = List.partition Sys.is_directory files in
-          let files = List.filter (
-            fun x ->
-              Filename.check_suffix x ext
-          ) files in
-          files @ loop (rest @ dirs)
-      in
-      loop [dir]
-    in
-
     (* Search for the ovf file. *)
     let ovf = find_files exploded ".ovf" in
     let ovf =
-- 
2.9.3




More information about the Libguestfs mailing list