Public/Branch.ps1

<#
.SYNOPSIS
    Deletes all brunches but master.
    Can be used to get rid of old/merged feature branches
.Description
    Iterates over the branches and deletes everything but master.
.PARAMETER masterName
    The name of the master branch. Default is master.
.EXAMPLE
    PurgeBranches
    PurgeBranches myBranch
#>

Function PurgeBranches() {
    param (
        [string]$masterName = "master"
    )

    # Abort if not in Git repository
    if ( !(IsGitRepo) ) {
        Return
    }

    $allBranches = git branch
    foreach ( $x in $allBranches ) {
        $name = $x.ToString().Trim()
        
        if ( $name -eq $masterName ) {
            continue
        }

        if ( $name.StartsWith( "*" ) ) {
            continue
        }

        git branch -D $name
    }
}

<#
.SYNOPSIS
    Adds all changes from the specified branch to the current branch.
    You can use this e.g. to add changes from master to your feature branch.
.Description
    - Checks the specifed branch out
    - Pulls changes
    - Checks out the 'current' branch
    - Rebases with the specifed branch
    - Pushes all changes
.PARAMETER masterName
    The name of the branch to sync with. Default is master.
.EXAMPLE
    SyncBranch
    SyncBranch myBranch
#>

Function SyncBranch() {
    param (
        [string]$branch = "master"
    )

    # Abort if not in Git repository
    if ( !(IsGitRepo) ) {
        Return
    }

    # Check same branch
    $startingBranch = GetCurrentBranchName
    if ( $startingBranch -eq $branch ) {
        Write-Host "Cannot sync with same branch - select another target branch" -ForegroundColor Yellow
        return
    }

    # Checkout and update the target branch
    git checkout $branch
    $out = $(git pull) 2>&1
    if ( $out -is [System.Management.Automation.ErrorRecord] ) {
        Write-Host $out.Exception.Message
        Write-Host "Failed to pull branch $branch => abort" -ForegroundColor Yellow
        return
    }
    if ( !$out.Contains( "Already up to date." ) ) {
        Write-Host "Failed to pull branch $branch => abort" -ForegroundColor Yellow
        return
    }

    # Add changes from $branch to current branch
    git checkout $startingBranch
    $out = $(git rebase $branch) 2>&1
    if ( $out -is [System.Management.Automation.ErrorRecord] ) {
        Write-Host $out.Exception.Message
        Write-Host "Rebase $branch failed => abort" -ForegroundColor Yellow
        return
    }
    if ( $out.Contains( "CONFLICT" ) -and !$out.Contains( "Successfully" ) -and !$out.Contains("is up to date.")) {
        foreach ( $x in $out ) {
            Write-Host $x
        }
        Write-Host "Rebase $branch failed => abort" -ForegroundColor Yellow
        return
    }
    
    # Update remote
    Up "Sync with $branch"
}

<#
.SYNOPSIS
    Closes the currently checked out feature branch by switching to the specified branch (default is master)
    and deleting the 'starting/current' feature branch.
.Description
    - Checks the specifed branch out
    - Pulls changes
    - Deletes teh starting feature branch
.PARAMETER masterName
    The name of the branch to switch to. Default is master.
.EXAMPLE
    CloseFeature
    CloseFeature myBranch
#>

Function CloseFeature() {
    param (
        [string]$branch = "master"
    )

    # Abort if not in Git repository
    if ( !(IsGitRepo) ) {
        Return
    }

    # Check same branch
    $startingBranch = GetCurrentBranchName
    if ( $startingBranch -eq $branch ) {
        Write-Host "Cannot close target branch (same as current branch) - select another target branch" -ForegroundColor Yellow
        return
    }

    # Checkout and update the target branch
    git checkout $branch
    $out = $(git pull) 2>&1
    if ( !$out.Contains( "Already up to date." ) ) {
        Write-Host "Failed to pull branch $branch"
    }

    # Delete the starting branch
    git branch -D $startingBranch
}