[Libguestfs] [PATCH v2 7/9] v2v: -i ova: Replace subdirectory function with clearer inline code.

Richard W.M. Jones rjones at redhat.com
Wed Apr 25 13:35:32 UTC 2018


---
 v2v/parse_ova.ml | 36 +++++++++++++++++++++++++-----------
 1 file changed, 25 insertions(+), 11 deletions(-)

diff --git a/v2v/parse_ova.ml b/v2v/parse_ova.ml
index c11502667..6c4af4464 100644
--- a/v2v/parse_ova.ml
+++ b/v2v/parse_ova.ml
@@ -251,15 +251,6 @@ and get_ovf_file { orig_ova; top_dir } =
   | _ :: _ ->
      error (f_"more than one .ovf file was found in %s") orig_ova
 
-let unsafe_remove_directory_prefix parent path =
-  if path = parent then
-    ""
-  else if String.is_prefix path (parent // "") then (
-    let len = String.length parent in
-    String.sub path (len+1) (String.length path - len-1)
-  ) else
-    invalid_arg (sprintf "%S is not a path prefix of %S" parent path)
-
 let rex = PCRE.compile "^(SHA1|SHA256)\\((.*)\\)= ([0-9a-fA-F]+)\r?$"
 
 let get_manifest { top_dir; ova_type } =
@@ -268,8 +259,19 @@ let get_manifest { top_dir; ova_type } =
     List.map (
       fun mf ->
         debug "ova: processing manifest file %s" mf;
+        (*               (1)                 (2)
+         * mf:           <top_dir>/bar.mf    <top_dir>/foo/bar.mf
+         * mf_folder:    <top_dir>           <top_dir>/foo
+         * mf_subfolder: ""                  foo
+         *)
         let mf_folder = Filename.dirname mf in
-        let mf_subfolder = unsafe_remove_directory_prefix top_dir mf_folder in
+        let mf_subfolder =
+          if String.is_prefix mf_folder (top_dir // "") then ( (* 2 *)
+            let len = String.length top_dir + 1 in
+            String.sub mf_folder len (String.length mf_folder - len)
+          )
+          else if top_dir = mf_folder then "" (* 1 *)
+          else assert false in
         with_open_in mf (
           fun chan ->
             let ret = ref [] in
@@ -306,7 +308,19 @@ let get_file_ref ({ top_dir; ova_type } as t) href =
   match ova_type with
   | Directory -> LocalFile (ovf_folder // href)
   | TarOptimized tar ->
-     let filename = unsafe_remove_directory_prefix top_dir ovf_folder // href in
+     (*             (1)                 (2)
+      * ovf:        <top_dir>/bar.ovf   <top_dir>/foo/bar.ovf
+      * ovf_folder: <top_dir>           <top_dir>/foo
+      * subdir:     ""                  foo
+      * filename:   href                foo/href
+      *)
+     let filename =
+       if String.is_prefix ovf_folder (top_dir // "") then ( (* 2 *)
+         let len = String.length top_dir + 1 in
+         String.sub ovf_folder len (String.length ovf_folder - len) // href
+       )
+       else if top_dir = ovf_folder then href (* 1 *)
+       else assert false in
      TarFile (tar, filename)
 
 let ws = PCRE.compile "\\s+"
-- 
2.16.2




More information about the Libguestfs mailing list