Skip to content

Commit

Permalink
fix unzip command and properly clean up temp files
Browse files Browse the repository at this point in the history
If unzip is compiled with -DWILD_STOP_AT_DIR, the * wildcard does not
match the dir separator, so subdirectories are not extracted.
  • Loading branch information
vqns committed Oct 5, 2024
1 parent 173732f commit ac2a237
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions src/util/zip.sml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ fun fromFile (s:string) : t =
{zipfile=s,deleted=ref false}

fun download (url:string) : t =
let val localzip = OS.FileSys.tmpName() ^ ".zip"
let val localzip = OS.FileSys.tmpName()
val (status,out,err) = System.command ("curl -L -o " ^ localzip ^ " " ^ url)
in if OS.Process.isSuccess status then
{zipfile=localzip,deleted=ref false}
Expand All @@ -37,7 +37,7 @@ fun extractSubDir {log: string -> unit} ({zipfile,deleted}:t) {path:string,targe
val () = System.createDirectoryIfMissing true target
fun cmds zipfile path target : {zipcmd:string,mvcmd:string,tmpdir:string} =
let val tmpdir = target ^ "_tmp~"
in {zipcmd = "unzip " ^ zipfile ^ " '" ^ path ^ "/*' -d " ^ tmpdir,
in {zipcmd = "unzip " ^ zipfile ^ " '" ^ path ^ "/**' -d " ^ tmpdir,
mvcmd = "mv " ^ tmpdir ^ "/" ^ path ^ "/* " ^ target ^ "/",
tmpdir = tmpdir}
end
Expand All @@ -49,16 +49,21 @@ fun extractSubDir {log: string -> unit} ({zipfile,deleted}:t) {path:string,targe

val () = log ("cmd: " ^ zipcmd)
val (status,out,err) = System.command zipcmd

val () = log ("removing " ^ zipfile)
val () = System.removePathForcibly zipfile

val () = if OS.Process.isSuccess status then ()
else raise Fail ("failed to extract " ^ zipfile ^ ": " ^ err)

val () = log ("cmd: " ^ mvcmd)
val (status,out,err) = System.command mvcmd
val () = if OS.Process.isSuccess status then ()
else raise Fail ("failed to move tmpdir into target: " ^ err)

val () = log ("removing " ^ tmpdir)
val () = System.removePathForcibly tmpdir

val () = if OS.Process.isSuccess status then ()
else raise Fail ("failed to move tmpdir into target: " ^ err)
in ()
end

Expand Down

0 comments on commit ac2a237

Please sign in to comment.