Atlassian.Bitbucket.Repository.psm1

using module .\Atlassian.Bitbucket.Authentication.psm1

<#
    .SYNOPSIS
        Returns all Repositories in the workspace.
 
    .DESCRIPTION
        Returns all the Bitbucket Repositories in the workspace, or all repositories in the specific project.
 
    .EXAMPLE
        C:\PS> Get-BitbucketRepository
        Returns all repositories for the currently selected workspace.
 
    .EXAMPLE
        C:\PS> Get-BitbucketRepository -ProjectKey 'KEY'
        Returns all repositories for the specified project.
 
    .PARAMETER Workspace
        Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.
 
    .PARAMETER RepoSlug
        Name of the repo in Bitbucket.
 
    .PARAMETER ProjectKey
        Project key in Bitbucket
#>

function Get-BitbucketRepository {
    [CmdletBinding()]
    param(
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.')]
        [Alias("Team")]
        [string]$Workspace = (Get-BitbucketSelectedWorkspace),
        [Parameter( Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'The repository slug.')]
        [Alias('Slug')]
        [string]$RepoSlug,
        [Parameter( Position = 1,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Project key in Bitbucket')]
        [string]$ProjectKey
    )

    Process {
        $endpoint = "repositories/$Workspace"

        if ($RepoSlug) {
            return Invoke-BitbucketAPI -Path "$endpoint/$RepoSlug"
        }
        elseif ($ProjectKey) {
            # Filter to a specific project
            $endpoint += "?q=project.key=%22$ProjectKey%22"
        }
        return Invoke-BitbucketAPI -Path $endpoint -Paginated
    }
}

<#
    .SYNOPSIS
        Creates a new repositories in the workspace.
 
    .DESCRIPTION
        Creates a new Bitbucket repositories in the workspace, and in a specific project if specified.
 
    .EXAMPLE
        C:\PS> New-BitbucketRepository -RepoSlug 'NewRepo'
        Creates a new repository in Bitbucket called NewRepo. Since a project wasn't specified the repository is automatically assigned to the oldest project in the workspace.
 
    .EXAMPLE
        C:\PS> New-BitbucketRepository -RepoSlug 'NewRepo' -ProjectKey 'KEY'
        Creates a new repository in Bitbucket called NewRepo and puts it in the KEY project.
 
    .PARAMETER Workspace
        Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.
 
    .PARAMETER RepoSlug
        Name of the repo in Bitbucket.
 
    .PARAMETER Name
        Sets a Friendly Name for the Repository
 
    .PARAMETER ProjectKey
        Project key in Bitbucket.
 
    .PARAMETER Private
        Whether the repo should be private or public. Defaults to Private.
 
    .PARAMETER Description
        Description for the repo.
 
    .PARAMETER Language
        Programming language used in the repo.
 
    .PARAMETER ForkPolicy
        Fork policy of the repo. [allow_forks, no_public_forks, no_forks]
#>

function New-BitbucketRepository {
    [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Low')]
    param(
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.')]
        [Alias("Team")]
        [string]$Workspace = (Get-BitbucketSelectedWorkspace),
        [Parameter( Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'The repository slug.')]
        [Alias('Slug')]
        [string]$RepoSlug,
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Specify a Friendly Name for the Repo')]
        [ValidateNotNullOrEmpty()]
        [string]$Name,
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Project key in Bitbucket')]
        [string]$ProjectKey,
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Is the repo private?')]
        [boolean]$Private = $true,
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Description for the repo')]
        [string]$Description = '',
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Programming language used in the repo')]
        [ValidateSet('java', 'javascript', 'python', 'ruby', 'php', 'powershell')]
        [string]$Language = '',
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Fork policy of the repo. [allow_forks, no_public_forks, no_forks]')]
        [ValidateSet('allow_forks', 'no_public_forks', 'no_forks')]
        [string]$ForkPolicy = 'no_forks'
    )

    Process {
        $endpoint = "repositories/$Workspace/$RepoSlug"

        if ($ProjectKey) {
            $body = [ordered]@{
                scm         = 'git'
                project     = [ordered]@{
                    key = $ProjectKey
                }
                is_private  = $Private
                name        = if ($Name) { $Name } else { $RepoSlug }
                description = $Description
                language    = $Language
                fork_policy = $ForkPolicy
            } | ConvertTo-Json -Depth 2 -Compress
        }
        else {
            $body = [ordered]@{
                scm         = 'git'
                is_private  = $Private
                name        = if ($Name) { $Name } else { $RepoSlug }
                description = $Description
                language    = $Language
                fork_policy = $ForkPolicy
            } | ConvertTo-Json -Depth 2 -Compress
        }

        if ($pscmdlet.ShouldProcess($RepoSlug, 'create')) {
            return Invoke-BitbucketAPI -Path $endpoint -Body $body  -Method Post
        }
    }
}

<#
    .SYNOPSIS
        Updates an existing repository.
 
    .DESCRIPTION
        Updates properties on an existing repository in Bitbucket. You can set one or many properties at a time.
 
    .EXAMPLE
        C:\PS> Set-BitbucketRepository -RepoSlug 'Repo' -Language 'Java'
        Sets the repo's language to Java
 
    .EXAMPLE
        C:\PS> Set-BitbucketRepository -RepoSlug 'Repo' -ProjectKey 'KEY'
        Moves the repo to the Project 'KEY'
 
    .PARAMETER Workspace
        Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.
 
    .PARAMETER RepoSlug
        Name of the repo in Bitbucket.
 
    .PARAMETER Name
        Rename the repo in Bitbucket. Also renames the Slug.
 
    .PARAMETER ProjectKey
        Project key in Bitbucket.
 
    .PARAMETER Private
        Whether the repo should be private or public.
 
    .PARAMETER Description
        Description for the repo.
 
    .PARAMETER Language
        Programming language used in the repo.
 
    .PARAMETER ForkPolicy
        Fork policy of the repo. [allow_forks, no_public_forks, no_forks]
#>

function Set-BitbucketRepository {
    [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')]
    param(
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.')]
        [Alias("Team")]
        [string]$Workspace = (Get-BitbucketSelectedWorkspace),
        [Parameter( Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'The repository slug.')]
        [Alias('Slug')]
        [string]$RepoSlug,
        [Parameter( HelpMessage = 'Set the Friendly Name of the Repository')]
        [ValidateNotNullOrEmpty()]
        [string]$Name,
        [Parameter( HelpMessage = 'Project key in Bitbucket')]
        [string]$ProjectKey,
        [Parameter( HelpMessage = 'Is the repo private?')]
        [boolean]$Private,
        [Parameter( HelpMessage = 'Description for the repo')]
        [string]$Description,
        [Parameter( HelpMessage = 'Programming language used in the repo')]
        [ValidateSet('java', 'javascript', 'python', 'ruby', 'php', 'powershell')]
        [string]$Language,
        [Parameter( HelpMessage = 'Fork policy of the repo. [allow_forks, no_public_forks, no_forks]')]
        [ValidateSet('allow_forks', 'no_public_forks', 'no_forks')]
        [string]$ForkPolicy
    )

    Process {
        $endpoint = "repositories/$Workspace/$RepoSlug"
        $body = [ordered]@{}

        if ($ProjectKey) {
            $body += [ordered]@{
                project = [ordered]@{
                    key = $ProjectKey
                }
            }
        }
        if ($Private) {
            $body += [ordered]@{
                is_private = $Private
            }
        }
        if ($Name) {
            $body += [ordered]@{
                name = $Name
            }
        }
        if ($Description) {
            $body += [ordered]@{
                description = $Description
            }
        }
        if ($Language) {
            $body += [ordered]@{
                language = $Language
            }
        }
        if ($ForkPolicy) {
            $body += [ordered]@{
                fork_policy = $ForkPolicy
            }
        }
        if ($body.Count -eq 0) {
            throw "No settings provided to update"
        }

        $body = $body | ConvertTo-Json -Depth 2 -Compress

        if ($pscmdlet.ShouldProcess($RepoSlug, 'update')) {
            return Invoke-BitbucketAPI -Path $endpoint -Body $body -Method Put
        }
    }
}

<#
    .SYNOPSIS
        Deletes the specified repository.
 
    .DESCRIPTION
        Deletes the specified repository. This is an irreversible operation. This does not affect its forks.
 
    .EXAMPLE
        C:\PS> Remove-BitbucketRepository -RepoSlug 'Repo1'
        Deletes the repository named Repo1.
 
    .EXAMPLE
        C:\PS> Remove-BitbucketRepository -RepoSlug 'Repo1' -Redirect 'NewURL'
        Deletes the repository named Repo1 and leaves a redirect message for future visitors.
 
    .PARAMETER Workspace
        Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.
 
    .PARAMETER RepoSlug
        Name of the repo in Bitbucket.
 
    .PARAMETER Redirect
        If a repository has been moved to a new location, use this parameter to show users a friendly message in the Bitbucket UI that the repository has moved to a new location. However, a GET to this endpoint will still return a 404.
#>

function Remove-BitbucketRepository {
    [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'High')]
    param(
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.')]
        [Alias("Team")]
        [string]$Workspace = (Get-BitbucketSelectedWorkspace),
        [Parameter( Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'The repository slug.')]
        [Alias('Slug')]
        [string]$RepoSlug,
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Redirect string')]
        [string]$Redirect
    )

    Process {
        $endpoint = "repositories/$Workspace/$RepoSlug"

        if ($Redirect) {
            $endpoint += "?redirect_to=$Redirect"
        }

        if ($pscmdlet.ShouldProcess($RepoSlug, 'permanently delete')) {
            return Invoke-BitbucketAPI -Path $endpoint -Method Delete
        }
    }
}

<#
    .SYNOPSIS
        Creates a new branch
 
    .DESCRIPTION
        Creates a branch in the specified repository. If no parent is specified, branch will be created from the latest commit of the default branch.
 
    .EXAMPLE
        C:\PS> Add-BitBucketRepositoryBranch -Branch 'NewBranch' -Workspace 'MyWorkspace' -RepoSlug 'Repo1'
        Adds new branch from the last commit of the default branch
 
    .EXAMPLE
        C:\PS> Add-BitBucketRepositoryBranch -Branch 'NewBranch' -Parent 'CommitHash'
        Adds new branch from the specified commit
 
    .EXAMPLE
        C:\PS> Add-BitBucketRepositoryBranch -Branch 'NewBranch' -Message 'Create new branch'
        Adds new branch with specified commit message
 
    .PARAMETER Workspace
        Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.
 
    .PARAMETER RepoSlug
        Name of the repo in Bitbucket.
 
    .PARAMETER Branch
        Name of the branch to create
 
    .PARAMETER Parent
        Optional hash of the commit to create the branch from
 
    .PARAMETER Message
        Optional commit message for the new branch
#>

function Add-BitbucketRepositoryBranch {
    [CmdletBinding()]
    param(
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.')]
        [Alias("Team")]
        [string]$Workspace = (Get-BitbucketSelectedWorkspace),
        [Parameter( Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'The repository slug.')]
        [Alias('Slug')]
        [string]$RepoSlug,
        [Parameter( Mandatory = $true,
            Position = 1,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Name of the branch to create.')]
        [string]$Branch,
        [Parameter(HelpMessage = 'Hash of the commit to create the branch from.')]
        [string]$Parent,
        [Parameter(HelpMessage = 'Commit message for the new branch.')]
        [string]$Message
    )

    Process {
        $endpoint = "repositories/$Workspace/$RepoSlug/src/"

        $body = [ordered]@{branch = $Branch }

        if ($Parent) {
            $body.Add("parents", $parent)
        }

        if ($Message) {
            $body.Add("message", $message)
        }

        return Invoke-BitbucketAPI -Path $endpoint -Body $body -Method Post -ContentType 'application/x-www-form-urlencoded'
    }
}

<#
    .SYNOPSIS
        Returns the branches in a specified repository.
 
    .DESCRIPTION
        Returns the branches in a specified repository.
 
    .EXAMPLE
        C:\ PS> Get-BitbucketRepositoryBranch -RepoSlug 'repo'
        Returns all the branches in the Repository named repo
 
    .EXAMPLE
        C:\ PS> Get-BitbucketRepositoryBranch -RepoSlug 'repo' -Name 'feature'
        Returns all the branches in the Repository named repo with the word feature in their name
 
    .PARAMETER Workspace
        Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.
 
    .PARAMETER RepoSlug
        Name of the repo in Bitbucket.
 
    .PARAMETER Name
        Name of the branch to search for.
#>

function Get-BitbucketRepositoryBranch {
    [CmdletBinding()]
    param (
        [Parameter( ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Name of the workspace in Bitbucket. Defaults to selected workspace if not provided.')]
        [Alias("Team")]
        [string]$Workspace = (Get-BitbucketSelectedWorkspace),
        [Parameter( Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'The repository slug.')]
        [Alias('Slug')]
        [string]$RepoSlug,
        [Parameter(HelpMessage = 'Search for the specified branch name')]
        [string]$Name
    )

    Process {
        $endpoint = "repositories/$Workspace/$RepoSlug/refs/branches?q=name~`"$Name`""

        return Invoke-BitbucketAPI -Path $endpoint -Paginated
    }
}