Linux Bash
#!/usr/bin/env bash
set -euo pipefail

read -rp "GitLab URL (например, https://git.zubovspace.com): " BASE
read -rsp "Personal Access Token (PAT): " TOKEN; echo
read -rp "Project ID или путь (например, zubovspace%2Fmyproj): " PROJECT
echo "Сначала посмотрим лейблы в проекте (это безопасно)..."
curl -fsS "$BASE/api/v4/projects/$PROJECT/labels?per_page=100" -H "PRIVATE-TOKEN: $TOKEN" | jq -r '.[].name' | sort

read -rp "Укажи ЛЕЙБЛ импортированных задач (например, jira-import): " LABEL
read -rp "Сначала dry-run? (y/n): " DRY

PAGE=1
TOTAL=0
while :; do
  DATA=$(curl -fsS "$BASE/api/v4/projects/$PROJECT/issues?per_page=100&state=all&labels=$(printf %s "$LABEL" | sed 's/ /%20/g')&page=$PAGE" -H "PRIVATE-TOKEN: $TOKEN")
  COUNT=$(echo "$DATA" | jq 'length')
  [[ "$COUNT" -eq 0 ]] && break

  echo "$DATA" | jq -r '.[].iid' | while read -r IID; do
    TITLE=$(echo "$DATA" | jq -r ".[] | select(.iid==$IID) | .title")
    if [[ "$DRY" == "y" || "$DRY" == "Y" ]]; then
      echo "DRY-RUN: удалил бы #$IID \"$TITLE\""
    else
      curl -fsS -X DELETE "$BASE/api/v4/projects/$PROJECT/issues/$IID" -H "PRIVATE-TOKEN: $TOKEN" >/dev/null
      echo "Удалено: #$IID \"$TITLE\""
    fi
    TOTAL=$((TOTAL+1))
  done
  PAGE=$((PAGE+1))
done

echo "Готово. Обработано задач: $TOTAL"
Windows Powershell
# Ввод параметров (интерактивно)
$BaseUrl = Read-Host "GitLab URL (например, https://git.zubovspace.com)"
$Token   = Read-Host "Personal Access Token (PAT)"
$Project = Read-Host "Project ID или путь (например, zubovspace%2Fmyproj)"

# Показать лейблы (безопасно)
$labels = Invoke-RestMethod -Method Get -Uri "$BaseUrl/api/v4/projects/$Project/labels?per_page=100" -Headers @{ "PRIVATE-TOKEN" = $Token }
$labels.name | Sort-Object | ForEach-Object { Write-Host $_ }

$Label  = Read-Host "Укажи ЛЕЙБЛ импортированных задач (например, jira-import)"
$dry    = Read-Host "Сначала dry-run? (y/n)"

$Page = 1
$Total = 0
while ($true) {
  $issues = Invoke-RestMethod -Method Get -Uri "$BaseUrl/api/v4/projects/$Project/issues?per_page=100&state=all&labels=$([uri]::EscapeDataString($Label))&page=$Page" -Headers @{ "PRIVATE-TOKEN" = $Token }
  if (-not $issues -or $issues.Count -eq 0) { break }

  foreach ($i in $issues) {
    if ($dry -match '^[Yy]') {
      Write-Host ("DRY-RUN: удалил бы #{0} `"{1}`"" -f $i.iid, $i.title)
    } else {
      Invoke-RestMethod -Method Delete -Uri "$BaseUrl/api/v4/projects/$Project/issues/$($i.iid)" -Headers @{ "PRIVATE-TOKEN" = $Token } | Out-Null
      Write-Host ("Удалено: #{0} `"{1}`"" -f $i.iid, $i.title)
    }
    $Total++
  }
  $Page++
}
Write-Host ("Готово. Обработано задач: {0}" -f $Total)


  • No labels
Write a comment…