fix: issue #10 incomplete upload
This commit is contained in:
@@ -181,7 +181,7 @@ defmodule BDS.Publishing do
|
||||
ssh_auth_sock
|
||||
) do
|
||||
args =
|
||||
["--update", "--compress", "--verbose"] ++
|
||||
["--update", "--compress", "--verbose", "--recursive", "--times"] ++
|
||||
rsync_excludes(target) ++
|
||||
[
|
||||
"-e",
|
||||
@@ -198,25 +198,39 @@ defmodule BDS.Publishing do
|
||||
files_to_upload =
|
||||
filter_scp_uploads(project_id, credentials, target.kind, files_with_mtimes)
|
||||
|
||||
case upload_scp_files(
|
||||
project_id,
|
||||
target,
|
||||
credentials,
|
||||
runner,
|
||||
ssh_auth_sock,
|
||||
files_to_upload,
|
||||
[]
|
||||
) do
|
||||
{:ok, uploaded_files} ->
|
||||
persist_uploaded_scp_files(project_id, credentials, target.kind, uploaded_files)
|
||||
:ok
|
||||
|
||||
{:error, reason} ->
|
||||
{:error, reason}
|
||||
with :ok <-
|
||||
ensure_remote_dirs(target, credentials, runner, ssh_auth_sock, files_to_upload) do
|
||||
do_upload_scp_files(
|
||||
project_id,
|
||||
target,
|
||||
credentials,
|
||||
runner,
|
||||
ssh_auth_sock,
|
||||
files_to_upload
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
defp do_upload_scp_files(project_id, target, credentials, runner, ssh_auth_sock, files_to_upload) do
|
||||
case upload_scp_files(
|
||||
project_id,
|
||||
target,
|
||||
credentials,
|
||||
runner,
|
||||
ssh_auth_sock,
|
||||
files_to_upload,
|
||||
[]
|
||||
) do
|
||||
{:ok, uploaded_files} ->
|
||||
persist_uploaded_scp_files(project_id, credentials, target.kind, uploaded_files)
|
||||
:ok
|
||||
|
||||
{:error, reason} ->
|
||||
{:error, reason}
|
||||
end
|
||||
end
|
||||
|
||||
defp run_command(runner, command, args, ssh_auth_sock) do
|
||||
opts = command_opts(ssh_auth_sock)
|
||||
{output, exit_status} = runner.(command, args, opts)
|
||||
@@ -302,6 +316,25 @@ defmodule BDS.Publishing do
|
||||
end
|
||||
end
|
||||
|
||||
# scp does not create missing remote directories, so create them up front.
|
||||
defp ensure_remote_dirs(_target, _credentials, _runner, _ssh_auth_sock, []), do: :ok
|
||||
|
||||
defp ensure_remote_dirs(target, credentials, runner, ssh_auth_sock, files_to_upload) do
|
||||
remote_dirs =
|
||||
files_to_upload
|
||||
|> Enum.map(fn {relative_path, _local_mtime} ->
|
||||
target.remote_dir |> Path.join(relative_path) |> Path.dirname()
|
||||
end)
|
||||
|> Enum.uniq()
|
||||
|
||||
run_command(
|
||||
runner,
|
||||
"ssh",
|
||||
[remote_base(credentials), "mkdir", "-p" | remote_dirs],
|
||||
ssh_auth_sock
|
||||
)
|
||||
end
|
||||
|
||||
defp collect_file_mtimes(local_dir, files) do
|
||||
Enum.reduce_while(files, {:ok, []}, fn relative_path, {:ok, acc} ->
|
||||
local_path = Path.join(local_dir, relative_path)
|
||||
|
||||
Reference in New Issue
Block a user