export def serve [ path: path # The path to serve --dir (-d): string # The base dir in miniserve for the path --public (-p) # Send to http://pubserve (via http://privserve) rather than http://files --verbose (-v) # Print uploads ] { let endpoint = if $public { "http://privserve" } else { "http://files" } let url = if $public { "http://pubserve.serval-vibes.ts.net" } else { "http://files" } let upload = $"($endpoint)/upload" let baseName = $path | path basename let cleanDir = if $dir != null { $"($dir | str trim --char '/')" } else { "" } # When uploading, "" is invalid. It must either be "/" or relative "foo/bar/" let uploadDir = $"($cleanDir)/" let serveDir = if $cleanDir != "" { $uploadDir } else { "" } if ($path | path type) == "dir" { let prefix = $path | path expand let baseDir = [$cleanDir, ($prefix | path basename | str trim --char '/')] | path join glob -F $"($prefix)/**" | each {|g| let b = $g | str replace $prefix "" | str trim --left --char '/' let d = [$baseDir, $b] | path join if $verbose { print $"Creating dir ($d)" } ^curl -F $"mkdir=($d)" $"($upload)?path=/" | complete } glob -D $"($prefix)/**" | each {|g| let f = $g | str replace $prefix "" | str trim --left --char '/' let t = [$baseDir, $f] | path join let p = $t | path dirname if $verbose { print $"Uploading ($g) to ($t)" } ^curl -F $"path=@($g)" $"($upload)?path=($p)" | complete } } else { if $verbose { print $"Creating dir ($uploadDir)" } ^curl -F $"mkdir=($uploadDir)" $"($upload)?path=/" | complete if $verbose { print $"Uploading ($path | path expand) to ($serveDir)($baseName)" } ^curl -F $"path=@($path)" $"($upload)?path=($uploadDir)" | complete } $"($url)/($serveDir)($baseName)" }