forked from baron/baron-sso
Fix WORKS Drive image upload recovery
This commit is contained in:
@@ -365,6 +365,27 @@ list_child_folders() {
|
||||
printf '%s\n' "$response_body"
|
||||
}
|
||||
|
||||
find_folder_id_in_listing() {
|
||||
local listing_json="$1"
|
||||
local folder_name="$2"
|
||||
local strict_type="${3:-true}"
|
||||
|
||||
jq -er --arg name "$folder_name" --arg strictType "$strict_type" '
|
||||
[
|
||||
(.files // .children // .items // .data // .contents // [])[]
|
||||
| select((.fileName // .name // .displayName // .title) == $name)
|
||||
| select(
|
||||
$strictType != "true"
|
||||
or (
|
||||
((.fileType // .type // .resourceType // "") | ascii_downcase) as $type
|
||||
| ($type == "" or $type == "folder" or $type == "dir" or $type == "directory")
|
||||
)
|
||||
)
|
||||
| .fileId // .id
|
||||
][0] // empty
|
||||
' <<<"$listing_json" 2>/dev/null || true
|
||||
}
|
||||
|
||||
create_child_folder() {
|
||||
local access_token="$1"
|
||||
local endpoint="$2"
|
||||
@@ -382,6 +403,11 @@ create_child_folder() {
|
||||
"$endpoint")"
|
||||
split_curl_response "$response" response_body http_status
|
||||
|
||||
if [[ "$http_status" -eq 409 ]]; then
|
||||
printf 'WORKS_CONFLICT\n'
|
||||
return 2
|
||||
fi
|
||||
|
||||
if [[ "$http_status" -lt 200 || "$http_status" -ge 300 ]]; then
|
||||
backup_die "WORKS folder create request failed (HTTP $http_status): $(printf '%s' "$response_body" | redact_for_log)"
|
||||
fi
|
||||
@@ -396,35 +422,48 @@ ensure_child_folder() {
|
||||
local children_endpoint
|
||||
local create_folder_endpoint
|
||||
local children_json
|
||||
local refreshed_children_json
|
||||
local folder_id
|
||||
local create_status
|
||||
|
||||
if [[ -n "$parent_file_id" ]]; then
|
||||
children_endpoint="$(resolve_target_children_endpoint "$parent_file_id")"
|
||||
create_folder_endpoint="$(resolve_target_create_folder_endpoint "$parent_file_id")"
|
||||
backup_log "Checking WORKS folder: parent=${parent_file_id:-root} name=$folder_name" >&2
|
||||
if ! children_json="$(list_child_folders "$access_token" "$children_endpoint")"; then
|
||||
return 1
|
||||
fi
|
||||
folder_id="$(find_folder_id_in_listing "$children_json" "$folder_name" "true")"
|
||||
|
||||
if [[ -n "$folder_id" ]]; then
|
||||
backup_log "Found existing WORKS folder: $folder_name -> $folder_id" >&2
|
||||
printf '%s\n' "$folder_id"
|
||||
return
|
||||
fi
|
||||
|
||||
backup_log "Creating WORKS folder: parent=${parent_file_id:-root} name=$folder_name" >&2
|
||||
if folder_id="$(create_child_folder "$access_token" "$create_folder_endpoint" "$folder_name")"; then
|
||||
backup_log "Created WORKS folder: $folder_name -> $folder_id" >&2
|
||||
printf '%s\n' "$folder_id"
|
||||
return
|
||||
else
|
||||
create_status="$?"
|
||||
fi
|
||||
|
||||
if [[ "$create_status" -eq 2 ]]; then
|
||||
backup_log "WORKS folder already exists, resolving existing folder id: $folder_name" >&2
|
||||
children_endpoint="$(resolve_target_children_endpoint "$parent_file_id")"
|
||||
create_folder_endpoint="$(resolve_target_create_folder_endpoint "$parent_file_id")"
|
||||
if ! children_json="$(list_child_folders "$access_token" "$children_endpoint")"; then
|
||||
if ! refreshed_children_json="$(list_child_folders "$access_token" "$children_endpoint")"; then
|
||||
return 1
|
||||
fi
|
||||
folder_id="$(jq -er --arg name "$folder_name" '
|
||||
[
|
||||
(.files // .children // .items // [])[]
|
||||
| select((.fileName // .name) == $name)
|
||||
| select(((.fileType // .type // "") | ascii_downcase) == "folder")
|
||||
| .fileId // .id
|
||||
][0] // empty
|
||||
' <<<"$children_json" 2>/dev/null || true)"
|
||||
|
||||
folder_id="$(find_folder_id_in_listing "$refreshed_children_json" "$folder_name" "false")"
|
||||
if [[ -n "$folder_id" ]]; then
|
||||
backup_log "Resolved existing WORKS folder after conflict: $folder_name -> $folder_id" >&2
|
||||
printf '%s\n' "$folder_id"
|
||||
return
|
||||
fi
|
||||
else
|
||||
create_folder_endpoint="$(resolve_target_create_folder_endpoint "$parent_file_id")"
|
||||
backup_die "WORKS folder already exists but its fileId could not be resolved: $folder_name"
|
||||
fi
|
||||
|
||||
if ! folder_id="$(create_child_folder "$access_token" "$create_folder_endpoint" "$folder_name")"; then
|
||||
return 1
|
||||
fi
|
||||
printf '%s\n' "$folder_id"
|
||||
return 1
|
||||
}
|
||||
|
||||
ensure_folder_path() {
|
||||
@@ -441,9 +480,11 @@ ensure_folder_path() {
|
||||
accumulated_path="${accumulated_path:+$accumulated_path/}$component"
|
||||
cached_folder_id="$(read_cached_folder_id "$accumulated_path")"
|
||||
if [[ -n "$cached_folder_id" ]]; then
|
||||
backup_log "Using cached WORKS folder: $accumulated_path -> $cached_folder_id" >&2
|
||||
parent_file_id="$cached_folder_id"
|
||||
continue
|
||||
fi
|
||||
backup_log "Resolving WORKS folder component: $accumulated_path" >&2
|
||||
if ! parent_file_id="$(ensure_child_folder "$access_token" "$parent_file_id" "$component")"; then
|
||||
return 1
|
||||
fi
|
||||
@@ -569,7 +610,9 @@ checksum_file="$artifact_dir/${image_name}.${image_tag}.sha256"
|
||||
manifest_file="$artifact_dir/manifest.${image_tag}.json"
|
||||
upload_report_file="$artifact_dir/works-upload.json"
|
||||
|
||||
rm -f "$tar_file" "$archive_file" "$checksum_file" "$manifest_file" "$upload_report_file"
|
||||
rm -f "$tar_file" "$archive_file" "$checksum_file" "$upload_report_file"
|
||||
|
||||
backup_log "Docker image archive context: image_ref=$image_ref remote_path=$remote_path artifact_dir=$artifact_dir"
|
||||
|
||||
if [[ -n "$commit_container" ]]; then
|
||||
backup_log "Committing container $commit_container to $image_ref"
|
||||
|
||||
Reference in New Issue
Block a user