Commit a7fd7e34 authored by Pierre Smeyers's avatar Pierre Smeyers
Browse files

Merge branch 'fix/optim-api-calls' into 'master'

perf: reduce the number of API calls

See merge request to-be-continuous/tools/gitlab-sync!36
parents b9ee3d4d d926301c
Loading
Loading
Loading
Loading
+24 −24
Original line number Diff line number Diff line
@@ -106,19 +106,19 @@ function maybe_create_group() {
# Synchronize a Release for a project
# $1: source project ID
# $2: destination project ID
# $3: release (as JSON object)
# $3: source release (as JSON object)
# $4: destination release (as JSON object or empty string)
function sync_release() {
  src_project_id=$1
  dest_project_id=$2
  src_release=$3
  dest_release=$4

  tag_name=$(echo "$src_release" | jq -r .tag_name)
  log_info "Synchronizing release \\e[33;1m${tag_name}\\e[0m to project ID \\e[33;1m${dest_project_id}\\e[0m)"

  dest_release_status=$(curl ${INSECURE:+-k} -s -o /dev/null -I -w "%{http_code}" -H "${DEST_TOKEN:+PRIVATE-TOKEN: $DEST_TOKEN}" "$DEST_GITLAB_API/projects/$dest_project_id/releases/$tag_name")
  if [[ "$dest_release_status" == 404* ]]
  if [[ -z "$dest_release" ]]
  then
    # dest release does not exist: create
    log_info "Release \\e[33;1m${tag_name}\\e[0m not found in project \\e[33;1m${dest_project_id}\\e[0m): create"
    curl ${INSECURE:+-k} -sSf -H "${DEST_TOKEN:+PRIVATE-TOKEN: $DEST_TOKEN}" -H "Content-Type: application/json" -X POST "$DEST_GITLAB_API/projects/$dest_project_id/releases" \
      --data "{
        \"tag_name\": \"$tag_name\",
@@ -126,12 +126,10 @@ function sync_release() {
        \"released_at\": $(echo "$src_release" | jq .released_at),
        \"description\": $(echo "$src_release" | jq .description)
      }" >/dev/null
  elif [[ "$dest_release_status" == 200* ]]
  then
    if [[ "$UPDATE_RELEASE" == "true" ]]
  elif [[ "$UPDATE_RELEASE" == "true" ]]
  then
      log_info "... release \\e[33;1m$tag_name\\e[0m exists: update"
      # dest release does not exist: create
    log_info "Release \\e[33;1m${tag_name}\\e[0m found in project \\e[33;1m${dest_project_id}\\e[0m): update (force)"
    # dest release already exists: update
    curl ${INSECURE:+-k} -sSf -H "${DEST_TOKEN:+PRIVATE-TOKEN: $DEST_TOKEN}" -H "Content-Type: application/json" -X PUT "$DEST_GITLAB_API/projects/$dest_project_id/releases/$tag_name" \
      --data "{
        \"tag_name\": \"$tag_name\",
@@ -140,11 +138,8 @@ function sync_release() {
        \"description\": $(echo "$src_release" | jq .description)
      }" >/dev/null
  else
      log_info "... release \\e[33;1m$tag_name\\e[0m exists: skip"
    fi
  else
    # another error: abort
    fail "... unexpected error: $dest_release_status"
    # dest release already exists: skip
    log_info "Release \\e[33;1m${tag_name}\\e[0m found in project \\e[33;1m${dest_project_id}\\e[0m): skip"
  fi
}

@@ -274,8 +269,13 @@ function sync_project() {
    fi

    # 3: sync Releases
    curl ${INSECURE:+-k} -sSf -H "${SRC_TOKEN:+PRIVATE-TOKEN: $SRC_TOKEN}" "$SRC_GITLAB_API/projects/$src_project_id/releases?per_page=100" | jq -c '.[]' | while read -r release; do
      sync_release "$src_project_id" "$dest_project_id" "$release"
    src_releases_json=$(curl ${INSECURE:+-k} -sSf -H "${SRC_TOKEN:+PRIVATE-TOKEN: $SRC_TOKEN}" "$SRC_GITLAB_API/projects/$src_project_id/releases?per_page=100")
    dest_releases_json=$(curl ${INSECURE:+-k} -sSf -H "${DEST_TOKEN:+PRIVATE-TOKEN: $DEST_TOKEN}" "$DEST_GITLAB_API/projects/$dest_project_id/releases?per_page=100")
    printf '%s' "$src_releases_json" | jq -c '.[]' | while read -r src_release_json
    do
      tag_name=$(printf '%s' "$src_release_json" | jq -r '.tag_name')
      dest_release_json=$(printf '%s' "$dest_releases_json" | jq -c '.[] | select(.tag_name == "'"${tag_name}"'")')
      sync_release "$src_project_id" "$dest_project_id" "$src_release_json" "$dest_release_json"
    done
  fi
}