Functions/Public/New-GitHubPullRequest.ps1

function New-GitHubPullRequest {
    <#
    .SYNOPSIS
        This cmdlet creates submitts a pull request to a repo

    .DESCRIPTION
        This cmdlet submitts a pull request from branch to an upstream branch,
        you can set the title and body of the pull request (default),
        alternatively you can also creates a pull request based on issue.

    .EXAMPLE
        explaination
        PS C:\> example usage

    .PARAMETER Owner
        Optional.
        the Owner of the upstream repo (the repo that you want to send the pull request to),
        default is the user returned by Get-GitHubAuthenticatedUser

    .PARAMETER Repository
        Mandatory.
        the name of the upstream repo (the repo that you want to send the pull request to)

    .PARAMETER Head
        Mandatory. The name of the branch where your changes are implemented.
        For cross-repository pull requests in the same network, namespace head with a user like this: username:branch

    .PARAMETER Base
        Mandatory. The name of the branch you want the changes pulled into. This should be an existing branch on the current repository.
        You cannot submit a pull request to one repository that requests a merge to a base of another repository.

    .PARAMETER Title
        Mandatory if you want to send the pull request via title and body
        The title of the pull request.

    .PARAMETER Body
        Optional. The contents of the pull request.

    .PARAMETER Issue
        Mandatory if you want to send the pull request via existing issue.
        The issue number in this repository to turn into a Pull Request.

    .EXAMPLE
        # creates a pull request from my 'master' (chantisnake is my user name) to upstream 'master'
        C:\PS> New-GitHubPullRequest -Owner 'test-orgnization' -Repository 'test-repo' -Head 'chantisnake:master' -Base master -Title 'new test pull request' -body 'the awesome content in the pull request'

        # creates a pull request via issue #2
        New-GitHubPullRequest -Owner 'test-orgnization' -Repository 'test-repo' -Head 'chantisnake:master' -Base master -issue 2

    .NOTES
        Please make sure the Head is in the right format.

    #>

    [CmdletBinding(DefaultParameterSetName = 'title')]
    param(
        [Parameter(Mandatory = $False)]
        [string] $Owner = (Get-GitHubAuthenticatedUser).login,
        [Parameter(Mandatory = $true)]
        [string] $Repository,
        [Parameter(Mandatory = $true)]
        [string] $Head,
        [Parameter(Mandatory = $true)]
        [string] $Base,
        [Parameter(Mandatory = $true, ParameterSetName = 'title')]
        [string] $Title,
        [Parameter(Mandatory = $false, ParameterSetName = 'title')]
        [string] $Body,
        [Parameter(Mandatory = $true, ParameterSetName = 'issue')]
        [int] $issue,
        [Security.SecureString] $Token = (Get-GitHubToken)
    )

    begin {
    }

    process {

        # construct the parameter to post
        if ($PSCmdlet.ParameterSetName -eq 'title') {
            # send the pull request via title and body
            $ApiBody = @{
                title = $Title
                head  = $Head
                base  = $Base
                body  = $Body
            } | ConvertTo-Json
        }
        else {
            # send the pull request via existing issue
            $ApiBody = @{
                issue = $issue
                head  = $Head
                base  = $Base
            } | ConvertTo-Json
        }

        Write-Verbose 'Post parameters are:'
        Write-Verbose $ApiBody

        # construct the parameters of the ApiCall
        $ApiCall = @{
            Body   = $ApiBody
            Method = 'post'
            Uri    = "repos/$Owner/$Repository/pulls"
            Token  = $Token
        }

    }

    end {
        Invoke-GithubApi @ApiCall
    }
}