Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions PowerShell/Snippets/Add-PullRequests.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
function Add-PullRequests {

[CmdletBinding()]
Param(
[Parameter()]
[string]$org = "x00",
[Parameter()]
[string]$project = "Modules",
[Parameter()]
[string]$token = "token",
[Parameter()]
[string]$branchName = "users/segraef/provider-upgrade"
)

az extension add --name azure-devops

Write-Output $token | az devops login --organization https://dev.azure.com/$org
az devops configure --defaults organization=https://dev.azure.com/$org project=$project
$repos = az repos list | ConvertFrom-Json

# Create Pull Request on all repos
foreach ($repo in $repos) {
Write-Output $repo.name
az repos pr create --repository $repo.name --source-branch $branchName --open --output table
}
}
48 changes: 23 additions & 25 deletions PowerShell/Snippets/Clone-Repos.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,36 @@ Param(
[string]$destinationFolder = ".",
[string]$org = "123",
[array]$projects = (
"Modules"
)
"Modules")

# Make sure you have the Azure CLI installed (az extension add --name azure-devops) and logged in via az login or az devops login
# If you face /_apis authentication issues make sure to login via az login --allow-no-subscriptions
# Make sure you have the Azure CLI installed (az extension add --name azure-devops) and logged in via az login or az devops login
# If you face /_apis authentication issues make sure to login via az login --allow-no-subscriptions

az devops configure --defaults organization=https://dev.azure.com/$org
# $projects = az devops project list --organization=https://dev.azure.com/$org | ConvertFrom-Json
az devops configure --defaults organization=https://dev.azure.com/$org
# $projects = az devops project list --organization=https://dev.azure.com/$org | ConvertFrom-Json

foreach ($project in $projects) {
$repos = az repos list --project $project | ConvertFrom-Json
foreach ($repo in $repos) {
Write-Output "Repository [$($repo.name)] in project [$($project)]"
If(!(test-path -PathType container $destinationFolder))
{
foreach ($project in $projects) {
$repos = az repos list --project $project | ConvertFrom-Json
foreach ($repo in $repos) {
Write-Output "Repository [$($repo.name)] in project [$($project)]"
If (!(test-path -PathType container $destinationFolder)) {
New-Item -ItemType Directory -Path $destinationFolder
}
git clone $($repo.remoteUrl) $destinationFolder/$($project)/$($repo.name)
git clone $($repo.remoteUrl) $destinationFolder/$($project)/$($repo.name)
}
}
}

# clone repos in github
# clone repos in github

$destinationFolder = "."
$destinationFolder = "."

$tfrepos = gh repo list azure -L 5000 --json name --jq '.[].name' | Select-String -Pattern "terraform-azurerm-avm"
$org = 'Azure'
$tfrepos = gh repo list azure -L 5000 --json name --jq '.[].name' | Select-String -Pattern "terraform-azurerm-avm"
$org = 'Azure'

foreach ($repo in $tfrepos) {
If (!(test-path -PathType container $destinationFolder/$($org)/$($repo))) {
New-Item -ItemType Directory -Path $destinationFolder/$($org)/$($repo)
}
Write-Output "https://github.com/$org/$repo.git into $destinationFolder/$($org)/$($repo)"
git clone "https://github.com/$org/$repo.git" $destinationFolder/$($org)/$($repo)
}
foreach ($repo in $tfrepos) {
If (!(test-path -PathType container $destinationFolder/$($org)/$($repo))) {
New-Item -ItemType Directory -Path $destinationFolder/$($org)/$($repo)
}
Write-Output "https://github.com/$org/$repo.git into $destinationFolder/$($org)/$($repo)"
git clone "https://github.com/$org/$repo.git" $destinationFolder/$($org)/$($repo)
}
65 changes: 0 additions & 65 deletions PowerShell/Snippets/CloneUpdate-Repos.ps1

This file was deleted.

21 changes: 0 additions & 21 deletions PowerShell/Snippets/Create-PullRequests.ps1

This file was deleted.

80 changes: 0 additions & 80 deletions PowerShell/Snippets/Get-GitHubRepos.ps1

This file was deleted.

110 changes: 110 additions & 0 deletions PowerShell/Update-AdoRepos.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<#
.SYNOPSIS
Script to clone or update Azure DevOps repositories for all projects in an organization.

.DESCRIPTION
This script clones or updates Azure DevOps repositories for all projects in a specified organization into a specified destination folder.

.PARAMETER organization
The Azure DevOps organization name.

.PARAMETER destinationFolder
The folder where the repositories will be cloned or updated.

.PARAMETER pat
The personal access token for authentication.

.INPUTS
None

.OUTPUTS
None

.NOTES
Version: 1.0
Author: Sebastian Graef
Creation Date: 22-03-2025
Purpose/Change: Initial script development

.EXAMPLE
CloneUpdate-AdoRepos.ps1 -organization "yourOrg" -destinationFolder "C:\Repos" -pat "yourPAT"
#>

function Update-AdoRepos {

[CmdletBinding(SupportsShouldProcess)]
param
(
[Parameter()]
[string]$organization,
[Parameter()]
[string]$destinationFolder,
[Parameter()]
[string]$pat
)

# Function to get all projects in the organization
function Get-AdoProjects($organization,$pat) {
$uri = "https://dev.azure.com/$organization/_apis/projects?api-version=6.0"
$response = Invoke-RestMethod -Uri $uri -Headers @{Authorization = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")) }
return $response.value
}

# Function to get repositories for a given project
function Get-AdoRepositories($organization,$pat,$project) {
$uri = "https://dev.azure.com/$organization/$project/_apis/git/repositories?api-version=6.0"
$uri = $uri -replace " ", "%20"
Write-Output $uri
$response = Invoke-RestMethod -Uri $uri -Headers @{Authorization = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")) }
return $response.value
}

# Function to clone or update repositories
function CloneOrUpdateRepo($repo, $projectFolder) {
$repoName = $repo.name
$repoUrl = $repo.remoteUrl
$repoFolder = "$projectFolder/$repoName"

if (-not (Test-Path -Path $repoFolder)) {
if ($PSCmdlet.ShouldProcess("Cloning $($repo.name)")) {
Write-Output "Cloning $($repo.name)"
git clone $repoUrl $repoFolder
}
} else {
if ($PSCmdlet.ShouldProcess("Pulling/Refreshing $($repo.name)")) {
Write-Output "Pulling/Refreshing $($repo.name)"
Set-Location -Path $repoFolder
git checkout main
git pull
Set-Location -Path $projectFolder
}
}
}

# Main script
Write-Output "Getting projects ..."
$projects = Get-AdoProjects -organization $organization -pat $pat
Write-Output "Found $($projects.Count) projects: $($projects.name)"
foreach ($project in $projects) {
$projectFolder = "$destinationFolder/$($project.name)"
if (-not (Test-Path -Path $projectFolder)) {
if ($PSCmdlet.ShouldProcess("Creating folder $projectFolder")) {
Write-Output "Creating folder $projectFolder"
New-Item -ItemType Directory -Path $projectFolder
}
}

Write-Output "Getting repos for $($project.name) ..."
$repos = Get-AdoRepositories -organization $organization -pat $pat -project $project.name
Write-Output "Found $($repos.Count) repos: $($repos.name)"
Read-Host "Press Enter to continue"
foreach ($repo in $repos) {
$response = Read-Host "Do you want to clone/update the repo $($repo.name)? (y/n)"
if ($response -eq 'y') {
CloneOrUpdateRepo -repo $repo -projectFolder $projectFolder
} else {
Write-Output "Skipping $($repo.name)"
}
}
}
}
Loading