es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

API de Azure DevOps: Obtener todos los archivos (origen y objetivo) de una solicitud de extracción.

Busqué bastante, encontré varios hilos aquí (por ejemplo, esto, aquello, y más), pero no pude encontrar la respuesta a la siguiente tarea:
Utilice la API de Azure DevOps para recuperar los cambios de contenido (básicamente el archivo antes y después) de todos los archivos de una PR específica.

Puedo encontrar una PR, puedo hacer un bucle a través de cambios, iteraciones, commits (en varias combinaciones), pero no he podido descargar ambas versiones de cada uno de los archivos (y debería haber una forma ya que puedo ver el antes y el después en una PR en DevOps).

¿Algunas pistas de dónde/cómo puedo recuperar ambas versiones de un archivo de un cierto commit/cambio/iteración?

¡Desde ya muchas gracias!

Saludos,
Udo

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hola Udo,

    Para recuperar los cambios de contenido de todos los archivos de una solicitud de Pull Request (PR) usando la API de Azure DevOps, puedes usar el punto final API Get Pull Request Commits. Este punto final devuelve todos los commits asociados con una solicitud de Pull Request. Para cada commit, puedes usar el punto final API Get Changes para recuperar todos los cambios (añadidos, eliminados, modificados) realizados en ese commit.

    Puedes usar las rutas de archivo devueltas en el objeto de cambios para descargar la primera y la última versión de cada archivo. Para descargar una versión específica de un archivo, puedes usar el punto final API Get Item Content con el ID de commit o el nombre de la rama y la ruta del archivo.

    Aquí tienes un ejemplo de script de PowerShell que recupera los cambios de contenido de todos los archivos de una solicitud de Pull Request específica y descarga la primera y la última versión de cada archivo:

    $org = "tu-organización"
    $project = "tu-proyecto"
    $repository = "tu-repositorio"
    $pullRequestId = "1234"
    
    # Obtener los commits de la solicitud de Pull Request
    $pullRequestUrl = "https://dev.azure.com/$org/$project/_apis/git/repositories/$repository/pullRequests/$pullRequestId/commits?api-version=6.0"
    $pullRequestCommits = Invoke-RestMethod -Uri $pullRequestUrl -Headers @{
        "Authorization" = "Bearer $env:SYSTEM_ACCESSTOKEN"
    }
    
    foreach($commit in $pullRequestCommits.value) {
        # Obtener los cambios
        $changesUrl = "https://dev.azure.com/$org/$project/_apis/git/repositories/$repository/commits/$($commit.commitId)/changes?api-version=6.0"
        $changes = Invoke-RestMethod -Uri $changesUrl -Headers @{
            "Authorization" = "Bearer $env:SYSTEM_ACCESSTOKEN"
        }
    
        foreach($change in $changes.changes) {
            $beforeUrl = "https://dev.azure.com/$org/$project/_apis/git/repositories/$repository/items?path=$($change.item.path)&versionType=commit&version=$($commit.parents[0])&api-version=6.0"
            $beforeContent = Invoke-RestMethod -Uri $beforeUrl -Headers @{
                "Authorization" = "Bearer $env:SYSTEM_ACCESSTOKEN"
            } -Method Get -ContentType "application/octet-stream"
    
            $afterUrl = "https://dev.azure.com/$org/$project/_apis/git/repositories/$repository/items?path=$($change.item.path)&versionType=commit&version=$($commit.commitId)&api-version=6.0"
            $afterContent = Invoke-RestMethod -Uri $afterUrl -Headers @{
                "Authorization" = "Bearer $env:SYSTEM_ACCESSTOKEN"
            } -Method Get -ContentType "application/octet-stream"
    
            # Guardar archivos
            Set-Content -Path "before_$($change.item.path)" -Value $beforeContent -Encoding Byte
            Set-Content -Path "after_$($change.item.path)" -Value $afterContent -Encoding Byte
        }
    }
    

    Reemplaza los marcadores de posición (tu-organización, tu-proyecto, tu-repositorio, 1234) con tus propios valores. Asegúrate también de reemplazar la variable de entorno $env:SYSTEM_ACCESSTOKEN con un token de acceso personal que tenga los permisos necesarios para leer el repositorio y las solicitudes de Pull Request.

    ¡Espero que esto ayude! Avísame si tienes alguna pregunta adicional.

    Saludos,
    [Tu nombre]

Comments are closed.