Functions/Get-GitCommit.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
    
function Get-GitCommit
{
    <#
    .SYNOPSIS
    Gets the sha-1 ID for specific changes in a Git repository.
 
    .DESCRIPTION
    The `Get-GitCommit` gets all the commits in a repository, from most recent to oldest.
 
    To get a commit for a specific named revision, e.g. HEAD, a branch, a tag), pass the name to the `Revision` parameter.
 
    To get the commit of the current checkout, pass `HEAD` to the `Revision` parameter.
    #>

    [CmdletBinding(DefaultParameterSetName='All')]
    param(
        [Parameter(Mandatory=$true,ParameterSetName='Lookup')]
        [string]
        # A named revision to get, e.g. `HEAD`, a branch name, tag name, etc.
        #
        # To get the commit of the current checkout, pass `HEAD`.
        $Revision,

        [string]
        # The path to the repository. Defaults to the current directory.
        $RepoRoot
    )

    Set-StrictMode -Version 'Latest'

    $repo = Find-GitRepository -Path $RepoRoot
    if( -not $repo )
    {
        return
    }
    
    try
    {
        if( $PSCmdlet.ParameterSetName -eq 'All' )
        {
            $repo.Commits | ForEach-Object { New-Object -TypeName 'LibGit2.Automation.CommitInfo' -ArgumentList $_ }
            return
        }

        $change = $repo.Lookup($Revision)
        if( $change )
        {
            return New-Object -TypeName 'LibGit2.Automation.CommitInfo' -ArgumentList $change
        }
        else
        {
            Write-Error -Message ('Commit ''{0}'' not found in repository ''{1}''.' -f $Revision,$repo.Info.WorkingDirectory) -ErrorAction $ErrorActionPreference
        }
    }
    finally
    {
        $repo.Dispose()
    }

}