@@ -2,6 +2,8 @@ open Lwt.Infix
22
33let ( / ) = Filename. concat
44
5+ let level = Tar.Header. GNU
6+
57module Tar_lwt_unix = struct
68 include Tar_lwt_unix
79
@@ -32,8 +34,8 @@ module Tar_lwt_unix = struct
3234
3335 module HW = Tar. HeaderWriter (Lwt )(Writer )
3436
35- let write_block (header : Tar.Header.t ) (body : Lwt_unix.file_descr -> unit Lwt.t ) (fd : Lwt_unix.file_descr ) =
36- HW. write ~ level: Tar.Header. GNU header fd
37+ let write_block ? level (header : Tar.Header.t ) (body : Lwt_unix.file_descr -> unit Lwt.t ) (fd : Lwt_unix.file_descr ) =
38+ HW. write ? level header fd
3739 >> = fun () ->
3840 body fd >> = fun () ->
3941 Writer. really_write fd (Tar.Header. zero_padding header)
@@ -62,7 +64,7 @@ let copy_file ~src ~dst ~to_untar ~user =
6264 ~group_id: user.Obuilder_spec. gid
6365 dst stat.Lwt_unix.LargeFile. st_size
6466 in
65- Tar_lwt_unix. write_block hdr (fun ofd ->
67+ Tar_lwt_unix. write_block ~level hdr (fun ofd ->
6668 Lwt_io. (with_file ~mode: input) src (copy_to ~dst: ofd)
6769 ) to_untar
6870
@@ -77,7 +79,7 @@ let copy_symlink ~src ~target ~dst ~to_untar ~user =
7779 ~group_id: user.Obuilder_spec. gid
7880 dst 0L
7981 in
80- Tar_lwt_unix. write_block hdr (fun _ -> Lwt. return_unit) to_untar
82+ Tar_lwt_unix. write_block ~level hdr (fun _ -> Lwt. return_unit) to_untar
8183
8284let rec copy_dir ~src_dir ~src ~dst ~(items :(Manifest.t list) ) ~to_untar ~user =
8385 Log. debug(fun f -> f " Copy dir %S -> %S@." src dst);
@@ -90,8 +92,10 @@ let rec copy_dir ~src_dir ~src ~dst ~(items:(Manifest.t list)) ~to_untar ~user =
9092 ~group_id: user.Obuilder_spec. gid
9193 (dst ^ " /" ) 0L
9294 in
93- Tar_lwt_unix. write_block hdr (fun _ -> Lwt. return_unit) to_untar
94- end >> = fun () ->
95+ Tar_lwt_unix. write_block ~level hdr (fun _ -> Lwt. return_unit) to_untar
96+ end >> = fun () -> send_dir ~src_dir ~dst ~to_untar ~user items
97+
98+ and send_dir ~src_dir ~dst ~to_untar ~user items =
9599 items |> Lwt_list. iter_s (function
96100 | `File (src , _ ) ->
97101 let src = src_dir / src in
@@ -109,21 +113,8 @@ let rec copy_dir ~src_dir ~src ~dst ~(items:(Manifest.t list)) ~to_untar ~user =
109113let remove_leading_slashes = Astring.String. drop ~sat: ((= ) '/' )
110114
111115let send_files ~src_dir ~src_manifest ~dst_dir ~user ~to_untar =
112- let dst_dir = remove_leading_slashes dst_dir in
113- src_manifest |> Lwt_list. iter_s (function
114- | `File (path , _ ) ->
115- let src = src_dir / path in
116- let dst = dst_dir / (Filename. basename path) in
117- copy_file ~src ~dst ~to_untar ~user
118- | `Symlink (src , target ) ->
119- let src = src_dir / src in
120- let dst = dst_dir / Filename. basename src in
121- copy_symlink ~src ~target ~dst ~to_untar ~user
122- | `Dir (src , items ) ->
123- let dst = dst_dir / Filename. basename src in
124- copy_dir ~src_dir ~src ~dst ~items ~to_untar ~user
125- )
126- >> = fun () ->
116+ let dst = remove_leading_slashes dst_dir in
117+ send_dir ~src_dir ~dst ~to_untar ~user src_manifest >> = fun () ->
127118 Tar_lwt_unix. write_end to_untar
128119
129120let send_file ~src_dir ~src_manifest ~dst ~user ~to_untar =
0 commit comments