-
-
Notifications
You must be signed in to change notification settings - Fork 799
/
GitTabExpansion.ps1
153 lines (128 loc) · 4.58 KB
/
GitTabExpansion.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# Initial implementation by Jeremy Skinner
# http://www.jeremyskinner.co.uk/2010/03/07/using-git-with-windows-powershell/
$global:GitTabSettings = New-Object PSObject -Property @{
AllCommands = $false
}
$global:ops = @{
remote = 'add','rename','rm','set-head','show','prune','update'
stash = 'list','show','drop','pop','apply','branch','save','clear','create'
svn = 'init', 'fetch', 'clone', 'rebase', 'dcommit', 'branch', 'tag', 'log', 'blame', 'find-rev', 'set-tree', 'create-ignore', 'show-ignore', 'mkdirs', 'commit-diff', 'info', 'proplist', 'propget', 'show-externals', 'gc', 'reset'
}
function script:gitCmdOperations($command, $filter) {
$ops.$command |
where { $_ -like "$filter*" }
}
function script:gitCommands($filter, $includeAliases) {
$cmdList = @()
if (-not $global:GitTabSettings.AllCommands) {
$cmdList += git help |
foreach { if($_ -match '^ (\S+) (.*)') { $matches[1] } } |
where { $_ -like "$filter*" }
} else {
$cmdList += git help --all |
where { $_ -match '^ \S.*' } |
foreach { $_.Split(' ', [StringSplitOptions]::RemoveEmptyEntries) } |
where { $_ -like "$filter*" }
}
if ($includeAliases) {
$cmdList += gitAliases $filter
}
$cmdList | sort
}
function script:gitRemotes($filter) {
git remote |
where { $_ -like "$filter*" }
}
function script:gitLocalBranches($filter) {
git branch |
foreach { if($_ -match "^\*?\s*(.*)") { $matches[1] } } |
where { $_ -like "$filter*" }
}
function script:gitStashes($filter) {
(git stash list) -replace ':.*','' |
where { $_ -like "$filter*" } |
foreach { "'$_'" }
}
function script:gitIndex($filter) {
if($GitStatus) {
$GitStatus.Index |
where { $_ -like "$filter*" } |
foreach { if($_ -like '* *') { "'$_'" } else { $_ } }
}
}
function script:gitFiles($filter) {
if($GitStatus) {
$GitStatus.Working |
where { $_ -like "$filter*" } |
foreach { if($_ -like '* *') { "'$_'" } else { $_ } }
}
}
function script:gitAliases($filter) {
$aliasList = @()
git config --get-regexp alias\..+ | foreach {
$alias = $_.Split(' ', [StringSplitOptions]::RemoveEmptyEntries)[0].Split(
'.', [StringSplitOptions]::RemoveEmptyEntries)[1]
if($alias -like "$filter*") {
$aliasList += $alias.Trim()
}
}
$aliasList | Sort
}
function GitTabExpansion($lastBlock) {
switch -regex ($lastBlock) {
# Handles tgit <command> (tortoisegit)
'tgit (\S*)$' {
# Need return statement to prevent fall-through.
return $tortoiseGitCommands | where { $_ -like "$($matches[1])*" }
}
# Handles git remote <op>
# Handles git stash <op>
'git (remote|stash|svn) (\S*)$' {
gitCmdOperations $matches[1] $matches[2]
}
# Handles git stash (show|apply|drop|pop|branch) <stash>
'git stash (show|apply|drop|pop|branch) (\S*)$' {
gitStashes $matches[2]
}
# Handles git branch -d|-D|-m|-M <branch name>
'git branch -(d|D|m|M) (\S*)$' {
gitLocalBranches $matches[2]
}
# Handles git checkout <branch name>
# Handles git merge <branch name>
# handles git rebase <branch name>
'git (checkout|merge|rebase) (\S*)$' {
gitLocalBranches $matches[2]
}
# Handles git <cmd> (commands & aliases)
'git (\S*)$' {
gitCommands $matches[1] $TRUE
}
# Handles git help <cmd> (commands only)
'git help (\S*)$' {
gitCommands $matches[1] $FALSE
}
# Handles git push remote <branch>
# Handles git pull remote <branch>
'git (push|pull) (\S+) (\S*)$' {
gitLocalBranches $matches[3]
}
# Handles git pull <remote>
# Handles git push <remote>
'git (push|pull) (\S*)$' {
gitRemotes $matches[2]
}
# Handles git reset HEAD <path>
'git reset HEAD (\S*)$' {
gitIndex $matches[1]
}
# Handles git add <path>
'git add (\S*)$' {
gitFiles $matches[1]
}
# Handles git checkout -- <path>
'git checkout -- (\S*)$' {
gitFiles $matches[1]
}
}
}