metacon 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
@@ -1,10 +1,14 @@
1
1
  module MetaCon
2
+ require 'metacon/shorthand'
2
3
  require 'metacon/cli_helpers'
3
4
  require 'metacon/command'
4
5
  require 'metacon/project'
5
6
  VERSION = File.exist?(File.join(File.dirname(__FILE__),'VERSION')) ?
6
7
  File.read(File.join(File.dirname(__FILE__),'VERSION')) : ""
7
8
  class << self
8
- def version() VERSION end
9
+ def version; VERSION end
10
+ def shelp_dir
11
+ File.join(File.expand_path(File.dirname(__FILE__)),'..','shelp')
12
+ end
9
13
  end
10
14
  end
@@ -38,6 +38,30 @@ module MetaCon
38
38
  :bg_white =>"\e[47m", :"=" =>"\e[44;1;37m", :"==" =>"\e[4;1;37m",
39
39
  :"===" =>"\e[1;34m"}
40
40
 
41
+ ANSI = Hash[%w[reset bright _faint _italic underline _slowblink _fastblink
42
+ negative _conceal _crossedout font0 _font1 _font2 _font3
43
+ _font4 _font5 _font6 _font7 _font8 _font9 _fraktur
44
+ _bright_off normal _italic_off underline_off _blink_off
45
+ _reserved negative_off _conceal_off _crossedout_off fg_black
46
+ fg_red fg_green fg_yellow fg_blue fg_magenta fg_cyan fg_white
47
+ fg_256 fg_default bg_black bg_red bg_green bg_yellow bg_blue
48
+ bg_magenta bg_cyan bg_white bg_256 bg_default _reserved2
49
+ _frame _encircle _overline _frame_off
50
+ _overline_off].each_with_index.map{|k,i| [k, i.to_s]}]
51
+
52
+ def cstr2(str, for_ps1=true)
53
+ fmtres = str.gsub(/(<\|[^>]+>)+/) do
54
+ parts = $1
55
+ cmdseq = parts.gsub(/<\|([^>]+)>/) do
56
+ ctrl = $1.split(/\s*\|\s*/).compact
57
+ ctrl = ctrl.map{|k| ANSI[k]}.join(';')
58
+ "\e[#{ctrl}m"
59
+ end
60
+ if for_ps1 then '\\[' + cmdseq + '\\]'
61
+ else cmdseq end
62
+ end
63
+ end
64
+
41
65
  def color_puts(str, emit=true)
42
66
  begin
43
67
  r = false
@@ -41,7 +41,10 @@ module MetaCon
41
41
 
42
42
  :conf => :conf,
43
43
  :config => :conf,
44
- :configuration=> :conf
44
+ :configuration=> :conf,
45
+
46
+ :prompt => :ps1,
47
+ :ps1 => :ps1
45
48
  }
46
49
  COMMANDS = [[:init, {:args => ['[DIRECTORY]'],
47
50
  :desc => 'Init metacon project dir, default ./, create if necessary',
@@ -66,6 +69,9 @@ module MetaCon
66
69
  :handler => MetaCon::Switch}],
67
70
  [:conf, {:args => ['[FAMILY]'],
68
71
  :desc => 'Output the currently applicable configuration',
72
+ :handler => MetaCon::Command}],
73
+ [:ps1, {:args => [],
74
+ :desc => 'Emit value appropriate for ps1 prompt',
69
75
  :handler => MetaCon::Command}] ]
70
76
  def self.run
71
77
  banner = "metacon\n"+
@@ -112,9 +118,10 @@ module MetaCon
112
118
 
113
119
  $cli = HighLine.new
114
120
  $cli.extend(MetaCon::CLIHelpers)
115
- unless command == :init
121
+ $proj = nil
122
+ unless [:init].include?(command)
116
123
  $proj = MetaCon::Project.new('./', options[:verbose])
117
- unless $proj.valid
124
+ unless $proj.valid || (command == :ps1)
118
125
  $cli.cfail 'Not a metacon project. Use `metacon init`'
119
126
  exit 5
120
127
  end
@@ -129,7 +136,51 @@ module MetaCon
129
136
  conf = $proj.conf
130
137
  conf = Hash[opts.map{|fam| [fam, conf[fam]]}] if opts.size > 0
131
138
  puts conf.to_yaml
139
+ elsif cmd == :ps1
140
+ puts ps1
132
141
  end
133
142
  end
143
+
144
+ def self.ps1(color=true)
145
+ return `echo -n $ORIG_PS1` unless $proj.valid
146
+ fc = $proj.full_context
147
+
148
+ #---- project-name
149
+ parts = [fc[:name]]
150
+
151
+ #---- git-branch
152
+ style = []
153
+ style << 'underline' if fc[:git_branch] == 'master'
154
+ style << ({:diverged => 'fg_blue',
155
+ :behind => 'fg_yellow',
156
+ :ahead => 'fg_green'}[fc[:git_upstream]] || 'fg_default')
157
+ gitbr = "<|reset|#{style.join('|')}>#{fc[:git_branch]}<|reset|>"
158
+ # yes, these are actually orthoganal, but this precedence makes more
159
+ # sense for the UI.
160
+ if fc[:git_has_unstaged] then gitbr << '<|bright>*<|reset>'
161
+ elsif fc[:git_has_staged] then gitbr << '<|bright>+<|reset>'
162
+ elsif fc[:git_has_stashed] then gitbr << '<|bright>$<|reset>' end
163
+ parts << gitbr
164
+
165
+ #---- runtime-context
166
+ r = fc[:runtime_context]
167
+ style = []
168
+ style << 'fg_red' if r[/^prod|hot/i]
169
+ style << 'bright' if r[/^prod|hot/i]
170
+ style << 'fg_green' if r[/^dev/i]
171
+ style << 'fg_yellow' if r[/test/i]
172
+ style << 'fg_cyan' if r[/staging|deploy/i]
173
+ parts << "<|reset|#{style.join('|')}>#{r}<|reset|>"
174
+
175
+ #---- the rest
176
+ parts << (fc[:role] == 'main' ? '~' : "<|reset>#{fc[:role]}")
177
+ parts << (fc[:os] == $proj.this_os ? '~' : "<|reset>#{fc[:os]}")
178
+ parts << (fc[:machine] == $proj.this_host ? '~' : "<|reset>#{fc[:machine]}")
179
+
180
+
181
+ line = "<|reset|bright|fg_black>(<|reset|underline>#{parts.join('<|reset|bright|fg_black>/')}<|bright|fg_black>)<|reset>/#{fc[:pwd_from_root]}<|bright|fg_black>-><|reset> "
182
+
183
+ return MetaCon::CLIHelpers.cstr2(line)
184
+ end
134
185
  end
135
186
  end
@@ -1,12 +1,12 @@
1
1
 
2
2
  # TODO:
3
- # - rvm:ruby
4
- # - rvm:gem
3
+ # - rvm:ruby [DONE 0.2.2]
5
4
  # - pythonbrew:python
6
5
  # - pythonbrew:pip
7
- # ----
8
6
  # - gitsubmodules:sub
9
7
  # ----
8
+ # - rvm:gem
9
+ # ----
10
10
  # - bundler
11
11
  # - general-tools (apt/homebrew/etc.)
12
12
  #
@@ -15,12 +15,12 @@ module MetaCon
15
15
  module Loaders
16
16
  module Index
17
17
  require 'metacon/loaders/rvm'
18
- #require 'metacon/loaders/python_brew'
18
+ require 'metacon/loaders/python_brew'
19
19
  #require 'metacon/loaders/general_git_submodules'
20
20
  LOADERS = {
21
21
  'ruby' => MetaCon::Loaders::RVM,
22
- 'gem' => MetaCon::Loaders::RVM
23
- #:python => MetaCon::Loaders::PythonBrew,
22
+ 'gem' => MetaCon::Loaders::RVM,
23
+ 'python' => MetaCon::Loaders::PythonBrew
24
24
  #:pip => MetaCon::Loaders::PythonBrew,
25
25
  #:sub => MetaCon::Loaders::GeneralGitSubmodules
26
26
  }
@@ -0,0 +1,22 @@
1
+ module MetaCon
2
+ module Loaders
3
+ class PythonBrew
4
+ include MetaCon::Shorthand
5
+ include MetaCon::CLIHelpers
6
+ def self.load_dependency(dependency_parts, state, proj, opts)
7
+ kind = dependency_parts.shift
8
+ if kind == 'python'
9
+ # Ensure pythonbrew installed / current
10
+ # Make sure that python is installed
11
+ # Make sure this has its venv installed
12
+ # Select via env variables etc.
13
+ elsif kind == 'pip'
14
+
15
+ else
16
+ raise "I don't handle #{kind} dependencies... am I missing something?"
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,12 +1,13 @@
1
1
  module MetaCon
2
2
  module Loaders
3
3
  class RVM
4
- require 'metacon/loaders/helpers'
5
- include MetaCon::Loaders::Helpers
4
+ include MetaCon::Shorthand
6
5
  include MetaCon::CLIHelpers
7
6
  def self.load_dependency(dependency_parts, state, proj, opts)
8
7
  kind = dependency_parts.shift
9
8
  if kind == 'ruby'
9
+ # TODO: check for and install rvm for when this is used outside of
10
+ # the main installed command context.
10
11
  ruby = fix_ruby_version(dependency_parts)
11
12
  return switch_ruby(ruby, state, opts)
12
13
  elsif kind == 'gem'
@@ -3,6 +3,7 @@ module MetaCon
3
3
  require 'metacon/config'
4
4
  require 'metacon/loaders/index'
5
5
  include MetaCon::Loaders::Index
6
+ include MetaCon::Shorthand
6
7
  attr_accessor :mc_dir, :rel_dir, :root_dir, :valid
7
8
  def self.initialized?(relative_to='./')
8
9
  ! find_mc_dir(relative_to).nil?
@@ -73,6 +74,49 @@ module MetaCon
73
74
  return st
74
75
  end
75
76
 
77
+ def full_context
78
+ res = {}
79
+ res[:root_dir] = @root_dir
80
+ o,e,s = shcmd(["cd \"#{@root_dir}\"",
81
+ "source '#{MetaCon::shelp_dir}/git-completion.bash'",
82
+ "export GIT_PS1_SHOWUPSTREAM=\"auto\"",
83
+ "export GIT_PS1_SHOWDIRTYSTATE=1",
84
+ "export GIT_PS1_SHOWUNTRACKEDFILES=1",
85
+ "export GIT_PS1_SHOWSTASHSTATE=1",
86
+ "__git_ps1 \"%s\""].join(' && '), false)
87
+ git_br = o.strip.split(/\s+/)
88
+ git_codes = git_br.pop
89
+ git_brname = git_br.join(' ')
90
+ res[:git_branch] = git_brname
91
+ res[:git_upstream] =
92
+ case
93
+ when git_codes.include?('<>'); :diverged
94
+ when git_codes.include?('<'); :behind
95
+ when git_codes.include?('>'); :ahead
96
+ else :same
97
+ end
98
+ res[:git_has_stashed] = git_codes.include?('$')
99
+ res[:git_has_unstaged] = git_codes.include?('*')
100
+ res[:git_has_staged] = git_codes.include?('+')
101
+ res[:git_has_changes] = res[:git_has_staged] || res[:git_has_unstaged]
102
+ pwd = File.expand_path(Dir.pwd)
103
+ res[:pwd_from_root] = relative_path(@root_dir,pwd)
104
+ cs = current_state
105
+ res[:runtime_context] = cs[:rtc]
106
+ res[:role] = cs[:role]
107
+ res[:os] = cs[:os]
108
+ res[:machine] = cs[:host]
109
+ res[:name] = res[:root_dir].split('/').last.strip
110
+ res[:metadir] = "{#{res[:name]}}/#{res[:pwd_from_root]}"
111
+ res[:user] = `whoami`.strip
112
+ return res
113
+ end
114
+
115
+ def summary_str
116
+ # TODO: for last line emitted in most commands and even used for to_s
117
+ # possibly?
118
+ end
119
+
76
120
  def list(to_list)
77
121
  return nil unless @valid
78
122
  cs = current_state
@@ -100,7 +144,7 @@ module MetaCon
100
144
  # interdependencies. For example, make sure that the ruby version is
101
145
  # switched before any gems are installed, etc. This'll have to be
102
146
  # abstracted somehow for the add-on libraries.
103
- dependencies = self.conf['dependencies']
147
+ dependencies = self.conf['dependencies'] || []
104
148
  incomplete = false
105
149
  emitted = {}
106
150
  dependencies.each do |dep|
@@ -1,6 +1,5 @@
1
1
  module MetaCon
2
- module Loaders
3
- module Helpers
2
+ module Shorthand
4
3
  def included(by); by.extend(self) end
5
4
  def shcmd(cmd_string, echo=true)
6
5
  require 'open3'
@@ -37,7 +36,28 @@ module MetaCon
37
36
  end
38
37
  return [main_out, err_out, exit_status]
39
38
  end
40
- extend self
41
- end
39
+
40
+ # Make a path relative (relative to the initial path)
41
+ def relative_path(initial,dest)
42
+ dest = File.expand_path(dest).split('/')
43
+ initial = File.expand_path(initial)
44
+ initial = File.dirname(initial) unless File.directory?(initial)
45
+ initial = initial.split('/')
46
+ pref,a,b = common_prefix(dest,initial)
47
+ return (b.map{|d|'..'} + a).join('/')
48
+ end
49
+
50
+ # Take two arrays and return an array holding the common prefix and then
51
+ # the remainder for each of the originals.
52
+ def common_prefix(a,b)
53
+ res = []
54
+ (0..[a.size,b.size].max).each do |i|
55
+ if a[i] == b[i]; res << a[i]
56
+ else break end
57
+ end
58
+ return [res, a[res.size..-1] || [], b[res.size..-1] || []]
59
+ end
60
+
61
+ extend self
42
62
  end
43
63
  end
@@ -1,3 +1,5 @@
1
+ # TODO: Move this all into command.rb + project.rb
2
+
1
3
  module MetaCon
2
4
  class Stat
3
5
  def self.handle(cmd, clo, opts)
@@ -8,8 +10,14 @@ module MetaCon
8
10
  end
9
11
 
10
12
  def self.stat(opts, clo)
13
+ # TODO:
14
+ # - git-stat summary
15
+ # - stuff from full_context
16
+ # - stat for each loader
11
17
  puts '(not yet implemented)'
12
- puts curr(opts, nil, clo)
18
+ #puts curr(opts, nil, clo)
19
+ require 'pp'
20
+ pp $proj.full_context
13
21
  end
14
22
 
15
23
  def self.curr(opts=[], proj=nil, clo)
@@ -25,5 +33,6 @@ module MetaCon
25
33
  opts.each{|o| puts state[o.to_sym]}
26
34
  end
27
35
  end
36
+
28
37
  end
29
38
  end
@@ -1,3 +1,6 @@
1
+ # TODO: change result message - curr but with changed part in color and that's
2
+ # it. green if successful switch and yellow if partially successful.
3
+
1
4
  module MetaCon
2
5
  class Switch
3
6
  def self.handle(cmd, clo, opts)
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "metacon"
8
- s.version = "0.2.2"
8
+ s.version = "0.2.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Joseph Wecker"]
12
- s.date = "2011-10-21"
12
+ s.date = "2011-10-25"
13
13
  s.description = "Tool with some similarities to puppet but specializing in fast development iteration and continuous deployment. Specifically initially for use with justin.tv / twitch.tv project clusters."
14
14
  s.email = "jwecker@justin.tv"
15
15
  s.executables = [".metacon_unwrapped", "metacon-installer", "metacon"]
@@ -50,16 +50,18 @@ Gem::Specification.new do |s|
50
50
  "lib/metacon/command.rb",
51
51
  "lib/metacon/config.rb",
52
52
  "lib/metacon/init.rb",
53
- "lib/metacon/loaders/helpers.rb",
54
53
  "lib/metacon/loaders/index.rb",
54
+ "lib/metacon/loaders/python_brew.rb",
55
55
  "lib/metacon/loaders/rvm.rb",
56
56
  "lib/metacon/project.rb",
57
57
  "lib/metacon/self_install.rb",
58
+ "lib/metacon/shorthand.rb",
58
59
  "lib/metacon/stat.rb",
59
60
  "lib/metacon/switch.rb",
60
61
  "metacon.gemspec",
61
62
  "notes-dependency-tool.md",
62
63
  "notes.rdoc",
64
+ "shelp/git-completion.bash",
63
65
  "shelp/metacon-installer.sh",
64
66
  "shelp/metacon.bashrc",
65
67
  "test/helper.rb",
@@ -0,0 +1,2739 @@
1
+ #!bash
2
+ #
3
+ # bash/zsh completion support for core Git.
4
+ #
5
+ # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6
+ # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7
+ # Distributed under the GNU General Public License, version 2.0.
8
+ #
9
+ # The contained completion routines provide support for completing:
10
+ #
11
+ # *) local and remote branch names
12
+ # *) local and remote tag names
13
+ # *) .git/remotes file names
14
+ # *) git 'subcommands'
15
+ # *) tree paths within 'ref:path/to/file' expressions
16
+ # *) common --long-options
17
+ #
18
+ # To use these routines:
19
+ #
20
+ # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21
+ # 2) Add the following line to your .bashrc/.zshrc:
22
+ # source ~/.git-completion.sh
23
+ #
24
+ # 3) Consider changing your PS1 to also show the current branch:
25
+ # Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
26
+ # ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
27
+ #
28
+ # The argument to __git_ps1 will be displayed only if you
29
+ # are currently in a git repository. The %s token will be
30
+ # the name of the current branch.
31
+ #
32
+ # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
33
+ # value, unstaged (*) and staged (+) changes will be shown next
34
+ # to the branch name. You can configure this per-repository
35
+ # with the bash.showDirtyState variable, which defaults to true
36
+ # once GIT_PS1_SHOWDIRTYSTATE is enabled.
37
+ #
38
+ # You can also see if currently something is stashed, by setting
39
+ # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
40
+ # then a '$' will be shown next to the branch name.
41
+ #
42
+ # If you would like to see if there're untracked files, then you can
43
+ # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
44
+ # untracked files, then a '%' will be shown next to the branch name.
45
+ #
46
+ # If you would like to see the difference between HEAD and its
47
+ # upstream, set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates
48
+ # you are behind, ">" indicates you are ahead, and "<>"
49
+ # indicates you have diverged. You can further control
50
+ # behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated
51
+ # list of values:
52
+ # verbose show number of commits ahead/behind (+/-) upstream
53
+ # legacy don't use the '--count' option available in recent
54
+ # versions of git-rev-list
55
+ # git always compare HEAD to @{upstream}
56
+ # svn always compare HEAD to your SVN upstream
57
+ # By default, __git_ps1 will compare HEAD to your SVN upstream
58
+ # if it can find one, or @{upstream} otherwise. Once you have
59
+ # set GIT_PS1_SHOWUPSTREAM, you can override it on a
60
+ # per-repository basis by setting the bash.showUpstream config
61
+ # variable.
62
+ #
63
+ #
64
+ # To submit patches:
65
+ #
66
+ # *) Read Documentation/SubmittingPatches
67
+ # *) Send all patches to the current maintainer:
68
+ #
69
+ # "Shawn O. Pearce" <spearce@spearce.org>
70
+ #
71
+ # *) Always CC the Git mailing list:
72
+ #
73
+ # git@vger.kernel.org
74
+ #
75
+
76
+ if [[ -n ${ZSH_VERSION-} ]]; then
77
+ autoload -U +X bashcompinit && bashcompinit
78
+ fi
79
+
80
+ case "$COMP_WORDBREAKS" in
81
+ *:*) : great ;;
82
+ *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
83
+ esac
84
+
85
+ # __gitdir accepts 0 or 1 arguments (i.e., location)
86
+ # returns location of .git repo
87
+ __gitdir ()
88
+ {
89
+ if [ -z "${1-}" ]; then
90
+ if [ -n "${__git_dir-}" ]; then
91
+ echo "$__git_dir"
92
+ elif [ -d .git ]; then
93
+ echo .git
94
+ else
95
+ git rev-parse --git-dir 2>/dev/null
96
+ fi
97
+ elif [ -d "$1/.git" ]; then
98
+ echo "$1/.git"
99
+ else
100
+ echo "$1"
101
+ fi
102
+ }
103
+
104
+ # stores the divergence from upstream in $p
105
+ # used by GIT_PS1_SHOWUPSTREAM
106
+ __git_ps1_show_upstream ()
107
+ {
108
+ local key value
109
+ local svn_remote=() svn_url_pattern count n
110
+ local upstream=git legacy="" verbose=""
111
+
112
+ # get some config options from git-config
113
+ while read key value; do
114
+ case "$key" in
115
+ bash.showupstream)
116
+ GIT_PS1_SHOWUPSTREAM="$value"
117
+ if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
118
+ p=""
119
+ return
120
+ fi
121
+ ;;
122
+ svn-remote.*.url)
123
+ svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
124
+ svn_url_pattern+="\\|$value"
125
+ upstream=svn+git # default upstream is SVN if available, else git
126
+ ;;
127
+ esac
128
+ done < <(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')
129
+
130
+ # parse configuration values
131
+ for option in ${GIT_PS1_SHOWUPSTREAM}; do
132
+ case "$option" in
133
+ git|svn) upstream="$option" ;;
134
+ verbose) verbose=1 ;;
135
+ legacy) legacy=1 ;;
136
+ esac
137
+ done
138
+
139
+ # Find our upstream
140
+ case "$upstream" in
141
+ git) upstream="@{upstream}" ;;
142
+ svn*)
143
+ # get the upstream from the "git-svn-id: ..." in a commit message
144
+ # (git-svn uses essentially the same procedure internally)
145
+ local svn_upstream=($(git log --first-parent -1 \
146
+ --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
147
+ if [[ 0 -ne ${#svn_upstream[@]} ]]; then
148
+ svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
149
+ svn_upstream=${svn_upstream%@*}
150
+ local n_stop="${#svn_remote[@]}"
151
+ for ((n=1; n <= n_stop; ++n)); do
152
+ svn_upstream=${svn_upstream#${svn_remote[$n]}}
153
+ done
154
+
155
+ if [[ -z "$svn_upstream" ]]; then
156
+ # default branch name for checkouts with no layout:
157
+ upstream=${GIT_SVN_ID:-git-svn}
158
+ else
159
+ upstream=${svn_upstream#/}
160
+ fi
161
+ elif [[ "svn+git" = "$upstream" ]]; then
162
+ upstream="@{upstream}"
163
+ fi
164
+ ;;
165
+ esac
166
+
167
+ # Find how many commits we are ahead/behind our upstream
168
+ if [[ -z "$legacy" ]]; then
169
+ count="$(git rev-list --count --left-right \
170
+ "$upstream"...HEAD 2>/dev/null)"
171
+ else
172
+ # produce equivalent output to --count for older versions of git
173
+ local commits
174
+ if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
175
+ then
176
+ local commit behind=0 ahead=0
177
+ for commit in $commits
178
+ do
179
+ case "$commit" in
180
+ "<"*) let ++behind
181
+ ;;
182
+ *) let ++ahead
183
+ ;;
184
+ esac
185
+ done
186
+ count="$behind $ahead"
187
+ else
188
+ count=""
189
+ fi
190
+ fi
191
+
192
+ # calculate the result
193
+ if [[ -z "$verbose" ]]; then
194
+ case "$count" in
195
+ "") # no upstream
196
+ p="" ;;
197
+ "0 0") # equal to upstream
198
+ p="=" ;;
199
+ "0 "*) # ahead of upstream
200
+ p=">" ;;
201
+ *" 0") # behind upstream
202
+ p="<" ;;
203
+ *) # diverged from upstream
204
+ p="<>" ;;
205
+ esac
206
+ else
207
+ case "$count" in
208
+ "") # no upstream
209
+ p="" ;;
210
+ "0 0") # equal to upstream
211
+ p=" u=" ;;
212
+ "0 "*) # ahead of upstream
213
+ p=" u+${count#0 }" ;;
214
+ *" 0") # behind upstream
215
+ p=" u-${count% 0}" ;;
216
+ *) # diverged from upstream
217
+ p=" u+${count#* }-${count% *}" ;;
218
+ esac
219
+ fi
220
+
221
+ }
222
+
223
+
224
+ # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
225
+ # returns text to add to bash PS1 prompt (includes branch name)
226
+ __git_ps1 ()
227
+ {
228
+ local g="$(__gitdir)"
229
+ if [ -n "$g" ]; then
230
+ local r=""
231
+ local b=""
232
+ if [ -f "$g/rebase-merge/interactive" ]; then
233
+ r="|REBASE-i"
234
+ b="$(cat "$g/rebase-merge/head-name")"
235
+ elif [ -d "$g/rebase-merge" ]; then
236
+ r="|REBASE-m"
237
+ b="$(cat "$g/rebase-merge/head-name")"
238
+ else
239
+ if [ -d "$g/rebase-apply" ]; then
240
+ if [ -f "$g/rebase-apply/rebasing" ]; then
241
+ r="|REBASE"
242
+ elif [ -f "$g/rebase-apply/applying" ]; then
243
+ r="|AM"
244
+ else
245
+ r="|AM/REBASE"
246
+ fi
247
+ elif [ -f "$g/MERGE_HEAD" ]; then
248
+ r="|MERGING"
249
+ elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
250
+ r="|CHERRY-PICKING"
251
+ elif [ -f "$g/BISECT_LOG" ]; then
252
+ r="|BISECTING"
253
+ fi
254
+
255
+ b="$(git symbolic-ref HEAD 2>/dev/null)" || {
256
+
257
+ b="$(
258
+ case "${GIT_PS1_DESCRIBE_STYLE-}" in
259
+ (contains)
260
+ git describe --contains HEAD ;;
261
+ (branch)
262
+ git describe --contains --all HEAD ;;
263
+ (describe)
264
+ git describe HEAD ;;
265
+ (* | default)
266
+ git describe --tags --exact-match HEAD ;;
267
+ esac 2>/dev/null)" ||
268
+
269
+ b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
270
+ b="unknown"
271
+ b="($b)"
272
+ }
273
+ fi
274
+
275
+ local w=""
276
+ local i=""
277
+ local s=""
278
+ local u=""
279
+ local c=""
280
+ local p=""
281
+
282
+ if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
283
+ if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
284
+ c="BARE:"
285
+ else
286
+ b="GIT_DIR!"
287
+ fi
288
+ elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
289
+ if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
290
+ if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
291
+ git diff --no-ext-diff --quiet --exit-code || w="*"
292
+ if git rev-parse --quiet --verify HEAD >/dev/null; then
293
+ git diff-index --cached --quiet HEAD -- || i="+"
294
+ else
295
+ i="#"
296
+ fi
297
+ fi
298
+ fi
299
+ if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
300
+ git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
301
+ fi
302
+
303
+ if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
304
+ if [ -n "$(git ls-files --others --exclude-standard)" ]; then
305
+ u="%"
306
+ fi
307
+ fi
308
+
309
+ if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
310
+ __git_ps1_show_upstream
311
+ fi
312
+ fi
313
+
314
+ local f="$w$i$s$u"
315
+ printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
316
+ fi
317
+ }
318
+
319
+ # __gitcomp_1 requires 2 arguments
320
+ __gitcomp_1 ()
321
+ {
322
+ local c IFS=' '$'\t'$'\n'
323
+ for c in $1; do
324
+ case "$c$2" in
325
+ --*=*) printf %s$'\n' "$c$2" ;;
326
+ *.) printf %s$'\n' "$c$2" ;;
327
+ *) printf %s$'\n' "$c$2 " ;;
328
+ esac
329
+ done
330
+ }
331
+
332
+ # The following function is based on code from:
333
+ #
334
+ # bash_completion - programmable completion functions for bash 3.2+
335
+ #
336
+ # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
337
+ # © 2009-2010, Bash Completion Maintainers
338
+ # <bash-completion-devel@lists.alioth.debian.org>
339
+ #
340
+ # This program is free software; you can redistribute it and/or modify
341
+ # it under the terms of the GNU General Public License as published by
342
+ # the Free Software Foundation; either version 2, or (at your option)
343
+ # any later version.
344
+ #
345
+ # This program is distributed in the hope that it will be useful,
346
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
347
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
348
+ # GNU General Public License for more details.
349
+ #
350
+ # You should have received a copy of the GNU General Public License
351
+ # along with this program; if not, write to the Free Software Foundation,
352
+ # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
353
+ #
354
+ # The latest version of this software can be obtained here:
355
+ #
356
+ # http://bash-completion.alioth.debian.org/
357
+ #
358
+ # RELEASE: 2.x
359
+
360
+ # This function can be used to access a tokenized list of words
361
+ # on the command line:
362
+ #
363
+ # __git_reassemble_comp_words_by_ref '=:'
364
+ # if test "${words_[cword_-1]}" = -w
365
+ # then
366
+ # ...
367
+ # fi
368
+ #
369
+ # The argument should be a collection of characters from the list of
370
+ # word completion separators (COMP_WORDBREAKS) to treat as ordinary
371
+ # characters.
372
+ #
373
+ # This is roughly equivalent to going back in time and setting
374
+ # COMP_WORDBREAKS to exclude those characters. The intent is to
375
+ # make option types like --date=<type> and <rev>:<path> easy to
376
+ # recognize by treating each shell word as a single token.
377
+ #
378
+ # It is best not to set COMP_WORDBREAKS directly because the value is
379
+ # shared with other completion scripts. By the time the completion
380
+ # function gets called, COMP_WORDS has already been populated so local
381
+ # changes to COMP_WORDBREAKS have no effect.
382
+ #
383
+ # Output: words_, cword_, cur_.
384
+
385
+ __git_reassemble_comp_words_by_ref()
386
+ {
387
+ local exclude i j first
388
+ # Which word separators to exclude?
389
+ exclude="${1//[^$COMP_WORDBREAKS]}"
390
+ cword_=$COMP_CWORD
391
+ if [ -z "$exclude" ]; then
392
+ words_=("${COMP_WORDS[@]}")
393
+ return
394
+ fi
395
+ # List of word completion separators has shrunk;
396
+ # re-assemble words to complete.
397
+ for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
398
+ # Append each nonempty word consisting of just
399
+ # word separator characters to the current word.
400
+ first=t
401
+ while
402
+ [ $i -gt 0 ] &&
403
+ [ -n "${COMP_WORDS[$i]}" ] &&
404
+ # word consists of excluded word separators
405
+ [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
406
+ do
407
+ # Attach to the previous token,
408
+ # unless the previous token is the command name.
409
+ if [ $j -ge 2 ] && [ -n "$first" ]; then
410
+ ((j--))
411
+ fi
412
+ first=
413
+ words_[$j]=${words_[j]}${COMP_WORDS[i]}
414
+ if [ $i = $COMP_CWORD ]; then
415
+ cword_=$j
416
+ fi
417
+ if (($i < ${#COMP_WORDS[@]} - 1)); then
418
+ ((i++))
419
+ else
420
+ # Done.
421
+ return
422
+ fi
423
+ done
424
+ words_[$j]=${words_[j]}${COMP_WORDS[i]}
425
+ if [ $i = $COMP_CWORD ]; then
426
+ cword_=$j
427
+ fi
428
+ done
429
+ }
430
+
431
+ if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
432
+ if [[ -z ${ZSH_VERSION:+set} ]]; then
433
+ _get_comp_words_by_ref ()
434
+ {
435
+ local exclude cur_ words_ cword_
436
+ if [ "$1" = "-n" ]; then
437
+ exclude=$2
438
+ shift 2
439
+ fi
440
+ __git_reassemble_comp_words_by_ref "$exclude"
441
+ cur_=${words_[cword_]}
442
+ while [ $# -gt 0 ]; do
443
+ case "$1" in
444
+ cur)
445
+ cur=$cur_
446
+ ;;
447
+ prev)
448
+ prev=${words_[$cword_-1]}
449
+ ;;
450
+ words)
451
+ words=("${words_[@]}")
452
+ ;;
453
+ cword)
454
+ cword=$cword_
455
+ ;;
456
+ esac
457
+ shift
458
+ done
459
+ }
460
+ else
461
+ _get_comp_words_by_ref ()
462
+ {
463
+ while [ $# -gt 0 ]; do
464
+ case "$1" in
465
+ cur)
466
+ cur=${COMP_WORDS[COMP_CWORD]}
467
+ ;;
468
+ prev)
469
+ prev=${COMP_WORDS[COMP_CWORD-1]}
470
+ ;;
471
+ words)
472
+ words=("${COMP_WORDS[@]}")
473
+ ;;
474
+ cword)
475
+ cword=$COMP_CWORD
476
+ ;;
477
+ -n)
478
+ # assume COMP_WORDBREAKS is already set sanely
479
+ shift
480
+ ;;
481
+ esac
482
+ shift
483
+ done
484
+ }
485
+ fi
486
+ fi
487
+
488
+ # __gitcomp accepts 1, 2, 3, or 4 arguments
489
+ # generates completion reply with compgen
490
+ __gitcomp ()
491
+ {
492
+ local cur_="$cur"
493
+
494
+ if [ $# -gt 2 ]; then
495
+ cur_="$3"
496
+ fi
497
+ case "$cur_" in
498
+ --*=)
499
+ COMPREPLY=()
500
+ ;;
501
+ *)
502
+ local IFS=$'\n'
503
+ COMPREPLY=($(compgen -P "${2-}" \
504
+ -W "$(__gitcomp_1 "${1-}" "${4-}")" \
505
+ -- "$cur_"))
506
+ ;;
507
+ esac
508
+ }
509
+
510
+ # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
511
+ __git_heads ()
512
+ {
513
+ local cmd i is_hash=y dir="$(__gitdir "${1-}")"
514
+ if [ -d "$dir" ]; then
515
+ git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
516
+ refs/heads
517
+ return
518
+ fi
519
+ for i in $(git ls-remote "${1-}" 2>/dev/null); do
520
+ case "$is_hash,$i" in
521
+ y,*) is_hash=n ;;
522
+ n,*^{}) is_hash=y ;;
523
+ n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
524
+ n,*) is_hash=y; echo "$i" ;;
525
+ esac
526
+ done
527
+ }
528
+
529
+ # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
530
+ __git_tags ()
531
+ {
532
+ local cmd i is_hash=y dir="$(__gitdir "${1-}")"
533
+ if [ -d "$dir" ]; then
534
+ git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
535
+ refs/tags
536
+ return
537
+ fi
538
+ for i in $(git ls-remote "${1-}" 2>/dev/null); do
539
+ case "$is_hash,$i" in
540
+ y,*) is_hash=n ;;
541
+ n,*^{}) is_hash=y ;;
542
+ n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
543
+ n,*) is_hash=y; echo "$i" ;;
544
+ esac
545
+ done
546
+ }
547
+
548
+ # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
549
+ # presence of 2nd argument means use the guess heuristic employed
550
+ # by checkout for tracking branches
551
+ __git_refs ()
552
+ {
553
+ local i is_hash=y dir="$(__gitdir "${1-}")" track="${2-}"
554
+ local format refs
555
+ if [ -d "$dir" ]; then
556
+ case "$cur" in
557
+ refs|refs/*)
558
+ format="refname"
559
+ refs="${cur%/*}"
560
+ track=""
561
+ ;;
562
+ *)
563
+ for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
564
+ if [ -e "$dir/$i" ]; then echo $i; fi
565
+ done
566
+ format="refname:short"
567
+ refs="refs/tags refs/heads refs/remotes"
568
+ ;;
569
+ esac
570
+ git --git-dir="$dir" for-each-ref --format="%($format)" \
571
+ $refs
572
+ if [ -n "$track" ]; then
573
+ # employ the heuristic used by git checkout
574
+ # Try to find a remote branch that matches the completion word
575
+ # but only output if the branch name is unique
576
+ local ref entry
577
+ git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
578
+ "refs/remotes/" | \
579
+ while read entry; do
580
+ eval "$entry"
581
+ ref="${ref#*/}"
582
+ if [[ "$ref" == "$cur"* ]]; then
583
+ echo "$ref"
584
+ fi
585
+ done | uniq -u
586
+ fi
587
+ return
588
+ fi
589
+ for i in $(git ls-remote "$dir" 2>/dev/null); do
590
+ case "$is_hash,$i" in
591
+ y,*) is_hash=n ;;
592
+ n,*^{}) is_hash=y ;;
593
+ n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
594
+ n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
595
+ n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
596
+ n,*) is_hash=y; echo "$i" ;;
597
+ esac
598
+ done
599
+ }
600
+
601
+ # __git_refs2 requires 1 argument (to pass to __git_refs)
602
+ __git_refs2 ()
603
+ {
604
+ local i
605
+ for i in $(__git_refs "$1"); do
606
+ echo "$i:$i"
607
+ done
608
+ }
609
+
610
+ # __git_refs_remotes requires 1 argument (to pass to ls-remote)
611
+ __git_refs_remotes ()
612
+ {
613
+ local cmd i is_hash=y
614
+ for i in $(git ls-remote "$1" 2>/dev/null); do
615
+ case "$is_hash,$i" in
616
+ n,refs/heads/*)
617
+ is_hash=y
618
+ echo "$i:refs/remotes/$1/${i#refs/heads/}"
619
+ ;;
620
+ y,*) is_hash=n ;;
621
+ n,*^{}) is_hash=y ;;
622
+ n,refs/tags/*) is_hash=y;;
623
+ n,*) is_hash=y; ;;
624
+ esac
625
+ done
626
+ }
627
+
628
+ __git_remotes ()
629
+ {
630
+ local i ngoff IFS=$'\n' d="$(__gitdir)"
631
+ __git_shopt -q nullglob || ngoff=1
632
+ __git_shopt -s nullglob
633
+ for i in "$d/remotes"/*; do
634
+ echo ${i#$d/remotes/}
635
+ done
636
+ [ "$ngoff" ] && __git_shopt -u nullglob
637
+ for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
638
+ i="${i#remote.}"
639
+ echo "${i/.url*/}"
640
+ done
641
+ }
642
+
643
+ __git_list_merge_strategies ()
644
+ {
645
+ git merge -s help 2>&1 |
646
+ sed -n -e '/[Aa]vailable strategies are: /,/^$/{
647
+ s/\.$//
648
+ s/.*://
649
+ s/^[ ]*//
650
+ s/[ ]*$//
651
+ p
652
+ }'
653
+ }
654
+
655
+ __git_merge_strategies=
656
+ # 'git merge -s help' (and thus detection of the merge strategy
657
+ # list) fails, unfortunately, if run outside of any git working
658
+ # tree. __git_merge_strategies is set to the empty string in
659
+ # that case, and the detection will be repeated the next time it
660
+ # is needed.
661
+ __git_compute_merge_strategies ()
662
+ {
663
+ : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
664
+ }
665
+
666
+ __git_complete_revlist_file ()
667
+ {
668
+ local pfx ls ref cur_="$cur"
669
+ case "$cur_" in
670
+ *..?*:*)
671
+ return
672
+ ;;
673
+ ?*:*)
674
+ ref="${cur_%%:*}"
675
+ cur_="${cur_#*:}"
676
+ case "$cur_" in
677
+ ?*/*)
678
+ pfx="${cur_%/*}"
679
+ cur_="${cur_##*/}"
680
+ ls="$ref:$pfx"
681
+ pfx="$pfx/"
682
+ ;;
683
+ *)
684
+ ls="$ref"
685
+ ;;
686
+ esac
687
+
688
+ case "$COMP_WORDBREAKS" in
689
+ *:*) : great ;;
690
+ *) pfx="$ref:$pfx" ;;
691
+ esac
692
+
693
+ local IFS=$'\n'
694
+ COMPREPLY=($(compgen -P "$pfx" \
695
+ -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
696
+ | sed '/^100... blob /{
697
+ s,^.* ,,
698
+ s,$, ,
699
+ }
700
+ /^120000 blob /{
701
+ s,^.* ,,
702
+ s,$, ,
703
+ }
704
+ /^040000 tree /{
705
+ s,^.* ,,
706
+ s,$,/,
707
+ }
708
+ s/^.* //')" \
709
+ -- "$cur_"))
710
+ ;;
711
+ *...*)
712
+ pfx="${cur_%...*}..."
713
+ cur_="${cur_#*...}"
714
+ __gitcomp "$(__git_refs)" "$pfx" "$cur_"
715
+ ;;
716
+ *..*)
717
+ pfx="${cur_%..*}.."
718
+ cur_="${cur_#*..}"
719
+ __gitcomp "$(__git_refs)" "$pfx" "$cur_"
720
+ ;;
721
+ *)
722
+ __gitcomp "$(__git_refs)"
723
+ ;;
724
+ esac
725
+ }
726
+
727
+
728
+ __git_complete_file ()
729
+ {
730
+ __git_complete_revlist_file
731
+ }
732
+
733
+ __git_complete_revlist ()
734
+ {
735
+ __git_complete_revlist_file
736
+ }
737
+
738
+ __git_complete_remote_or_refspec ()
739
+ {
740
+ local cur_="$cur" cmd="${words[1]}"
741
+ local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
742
+ while [ $c -lt $cword ]; do
743
+ i="${words[c]}"
744
+ case "$i" in
745
+ --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
746
+ --all)
747
+ case "$cmd" in
748
+ push) no_complete_refspec=1 ;;
749
+ fetch)
750
+ COMPREPLY=()
751
+ return
752
+ ;;
753
+ *) ;;
754
+ esac
755
+ ;;
756
+ -*) ;;
757
+ *) remote="$i"; break ;;
758
+ esac
759
+ c=$((++c))
760
+ done
761
+ if [ -z "$remote" ]; then
762
+ __gitcomp "$(__git_remotes)"
763
+ return
764
+ fi
765
+ if [ $no_complete_refspec = 1 ]; then
766
+ COMPREPLY=()
767
+ return
768
+ fi
769
+ [ "$remote" = "." ] && remote=
770
+ case "$cur_" in
771
+ *:*)
772
+ case "$COMP_WORDBREAKS" in
773
+ *:*) : great ;;
774
+ *) pfx="${cur_%%:*}:" ;;
775
+ esac
776
+ cur_="${cur_#*:}"
777
+ lhs=0
778
+ ;;
779
+ +*)
780
+ pfx="+"
781
+ cur_="${cur_#+}"
782
+ ;;
783
+ esac
784
+ case "$cmd" in
785
+ fetch)
786
+ if [ $lhs = 1 ]; then
787
+ __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur_"
788
+ else
789
+ __gitcomp "$(__git_refs)" "$pfx" "$cur_"
790
+ fi
791
+ ;;
792
+ pull)
793
+ if [ $lhs = 1 ]; then
794
+ __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur_"
795
+ else
796
+ __gitcomp "$(__git_refs)" "$pfx" "$cur_"
797
+ fi
798
+ ;;
799
+ push)
800
+ if [ $lhs = 1 ]; then
801
+ __gitcomp "$(__git_refs)" "$pfx" "$cur_"
802
+ else
803
+ __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur_"
804
+ fi
805
+ ;;
806
+ esac
807
+ }
808
+
809
+ __git_complete_strategy ()
810
+ {
811
+ __git_compute_merge_strategies
812
+ case "$prev" in
813
+ -s|--strategy)
814
+ __gitcomp "$__git_merge_strategies"
815
+ return 0
816
+ esac
817
+ case "$cur" in
818
+ --strategy=*)
819
+ __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
820
+ return 0
821
+ ;;
822
+ esac
823
+ return 1
824
+ }
825
+
826
+ __git_list_all_commands ()
827
+ {
828
+ local i IFS=" "$'\n'
829
+ for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
830
+ do
831
+ case $i in
832
+ *--*) : helper pattern;;
833
+ *) echo $i;;
834
+ esac
835
+ done
836
+ }
837
+
838
+ __git_all_commands=
839
+ __git_compute_all_commands ()
840
+ {
841
+ : ${__git_all_commands:=$(__git_list_all_commands)}
842
+ }
843
+
844
+ __git_list_porcelain_commands ()
845
+ {
846
+ local i IFS=" "$'\n'
847
+ __git_compute_all_commands
848
+ for i in "help" $__git_all_commands
849
+ do
850
+ case $i in
851
+ *--*) : helper pattern;;
852
+ applymbox) : ask gittus;;
853
+ applypatch) : ask gittus;;
854
+ archimport) : import;;
855
+ cat-file) : plumbing;;
856
+ check-attr) : plumbing;;
857
+ check-ref-format) : plumbing;;
858
+ checkout-index) : plumbing;;
859
+ commit-tree) : plumbing;;
860
+ count-objects) : infrequent;;
861
+ cvsexportcommit) : export;;
862
+ cvsimport) : import;;
863
+ cvsserver) : daemon;;
864
+ daemon) : daemon;;
865
+ diff-files) : plumbing;;
866
+ diff-index) : plumbing;;
867
+ diff-tree) : plumbing;;
868
+ fast-import) : import;;
869
+ fast-export) : export;;
870
+ fsck-objects) : plumbing;;
871
+ fetch-pack) : plumbing;;
872
+ fmt-merge-msg) : plumbing;;
873
+ for-each-ref) : plumbing;;
874
+ hash-object) : plumbing;;
875
+ http-*) : transport;;
876
+ index-pack) : plumbing;;
877
+ init-db) : deprecated;;
878
+ local-fetch) : plumbing;;
879
+ lost-found) : infrequent;;
880
+ ls-files) : plumbing;;
881
+ ls-remote) : plumbing;;
882
+ ls-tree) : plumbing;;
883
+ mailinfo) : plumbing;;
884
+ mailsplit) : plumbing;;
885
+ merge-*) : plumbing;;
886
+ mktree) : plumbing;;
887
+ mktag) : plumbing;;
888
+ pack-objects) : plumbing;;
889
+ pack-redundant) : plumbing;;
890
+ pack-refs) : plumbing;;
891
+ parse-remote) : plumbing;;
892
+ patch-id) : plumbing;;
893
+ peek-remote) : plumbing;;
894
+ prune) : plumbing;;
895
+ prune-packed) : plumbing;;
896
+ quiltimport) : import;;
897
+ read-tree) : plumbing;;
898
+ receive-pack) : plumbing;;
899
+ remote-*) : transport;;
900
+ repo-config) : deprecated;;
901
+ rerere) : plumbing;;
902
+ rev-list) : plumbing;;
903
+ rev-parse) : plumbing;;
904
+ runstatus) : plumbing;;
905
+ sh-setup) : internal;;
906
+ shell) : daemon;;
907
+ show-ref) : plumbing;;
908
+ send-pack) : plumbing;;
909
+ show-index) : plumbing;;
910
+ ssh-*) : transport;;
911
+ stripspace) : plumbing;;
912
+ symbolic-ref) : plumbing;;
913
+ tar-tree) : deprecated;;
914
+ unpack-file) : plumbing;;
915
+ unpack-objects) : plumbing;;
916
+ update-index) : plumbing;;
917
+ update-ref) : plumbing;;
918
+ update-server-info) : daemon;;
919
+ upload-archive) : plumbing;;
920
+ upload-pack) : plumbing;;
921
+ write-tree) : plumbing;;
922
+ var) : infrequent;;
923
+ verify-pack) : infrequent;;
924
+ verify-tag) : plumbing;;
925
+ *) echo $i;;
926
+ esac
927
+ done
928
+ }
929
+
930
+ __git_porcelain_commands=
931
+ __git_compute_porcelain_commands ()
932
+ {
933
+ __git_compute_all_commands
934
+ : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
935
+ }
936
+
937
+ __git_pretty_aliases ()
938
+ {
939
+ local i IFS=$'\n'
940
+ for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
941
+ case "$i" in
942
+ pretty.*)
943
+ i="${i#pretty.}"
944
+ echo "${i/ */}"
945
+ ;;
946
+ esac
947
+ done
948
+ }
949
+
950
+ __git_aliases ()
951
+ {
952
+ local i IFS=$'\n'
953
+ for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
954
+ case "$i" in
955
+ alias.*)
956
+ i="${i#alias.}"
957
+ echo "${i/ */}"
958
+ ;;
959
+ esac
960
+ done
961
+ }
962
+
963
+ # __git_aliased_command requires 1 argument
964
+ __git_aliased_command ()
965
+ {
966
+ local word cmdline=$(git --git-dir="$(__gitdir)" \
967
+ config --get "alias.$1")
968
+ for word in $cmdline; do
969
+ case "$word" in
970
+ \!gitk|gitk)
971
+ echo "gitk"
972
+ return
973
+ ;;
974
+ \!*) : shell command alias ;;
975
+ -*) : option ;;
976
+ *=*) : setting env ;;
977
+ git) : git itself ;;
978
+ *)
979
+ echo "$word"
980
+ return
981
+ esac
982
+ done
983
+ }
984
+
985
+ # __git_find_on_cmdline requires 1 argument
986
+ __git_find_on_cmdline ()
987
+ {
988
+ local word subcommand c=1
989
+ while [ $c -lt $cword ]; do
990
+ word="${words[c]}"
991
+ for subcommand in $1; do
992
+ if [ "$subcommand" = "$word" ]; then
993
+ echo "$subcommand"
994
+ return
995
+ fi
996
+ done
997
+ c=$((++c))
998
+ done
999
+ }
1000
+
1001
+ __git_has_doubledash ()
1002
+ {
1003
+ local c=1
1004
+ while [ $c -lt $cword ]; do
1005
+ if [ "--" = "${words[c]}" ]; then
1006
+ return 0
1007
+ fi
1008
+ c=$((++c))
1009
+ done
1010
+ return 1
1011
+ }
1012
+
1013
+ __git_whitespacelist="nowarn warn error error-all fix"
1014
+
1015
+ _git_am ()
1016
+ {
1017
+ local dir="$(__gitdir)"
1018
+ if [ -d "$dir"/rebase-apply ]; then
1019
+ __gitcomp "--skip --continue --resolved --abort"
1020
+ return
1021
+ fi
1022
+ case "$cur" in
1023
+ --whitespace=*)
1024
+ __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1025
+ return
1026
+ ;;
1027
+ --*)
1028
+ __gitcomp "
1029
+ --3way --committer-date-is-author-date --ignore-date
1030
+ --ignore-whitespace --ignore-space-change
1031
+ --interactive --keep --no-utf8 --signoff --utf8
1032
+ --whitespace= --scissors
1033
+ "
1034
+ return
1035
+ esac
1036
+ COMPREPLY=()
1037
+ }
1038
+
1039
+ _git_apply ()
1040
+ {
1041
+ case "$cur" in
1042
+ --whitespace=*)
1043
+ __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1044
+ return
1045
+ ;;
1046
+ --*)
1047
+ __gitcomp "
1048
+ --stat --numstat --summary --check --index
1049
+ --cached --index-info --reverse --reject --unidiff-zero
1050
+ --apply --no-add --exclude=
1051
+ --ignore-whitespace --ignore-space-change
1052
+ --whitespace= --inaccurate-eof --verbose
1053
+ "
1054
+ return
1055
+ esac
1056
+ COMPREPLY=()
1057
+ }
1058
+
1059
+ _git_add ()
1060
+ {
1061
+ __git_has_doubledash && return
1062
+
1063
+ case "$cur" in
1064
+ --*)
1065
+ __gitcomp "
1066
+ --interactive --refresh --patch --update --dry-run
1067
+ --ignore-errors --intent-to-add
1068
+ "
1069
+ return
1070
+ esac
1071
+ COMPREPLY=()
1072
+ }
1073
+
1074
+ _git_archive ()
1075
+ {
1076
+ case "$cur" in
1077
+ --format=*)
1078
+ __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1079
+ return
1080
+ ;;
1081
+ --remote=*)
1082
+ __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
1083
+ return
1084
+ ;;
1085
+ --*)
1086
+ __gitcomp "
1087
+ --format= --list --verbose
1088
+ --prefix= --remote= --exec=
1089
+ "
1090
+ return
1091
+ ;;
1092
+ esac
1093
+ __git_complete_file
1094
+ }
1095
+
1096
+ _git_bisect ()
1097
+ {
1098
+ __git_has_doubledash && return
1099
+
1100
+ local subcommands="start bad good skip reset visualize replay log run"
1101
+ local subcommand="$(__git_find_on_cmdline "$subcommands")"
1102
+ if [ -z "$subcommand" ]; then
1103
+ if [ -f "$(__gitdir)"/BISECT_START ]; then
1104
+ __gitcomp "$subcommands"
1105
+ else
1106
+ __gitcomp "replay start"
1107
+ fi
1108
+ return
1109
+ fi
1110
+
1111
+ case "$subcommand" in
1112
+ bad|good|reset|skip|start)
1113
+ __gitcomp "$(__git_refs)"
1114
+ ;;
1115
+ *)
1116
+ COMPREPLY=()
1117
+ ;;
1118
+ esac
1119
+ }
1120
+
1121
+ _git_branch ()
1122
+ {
1123
+ local i c=1 only_local_ref="n" has_r="n"
1124
+
1125
+ while [ $c -lt $cword ]; do
1126
+ i="${words[c]}"
1127
+ case "$i" in
1128
+ -d|-m) only_local_ref="y" ;;
1129
+ -r) has_r="y" ;;
1130
+ esac
1131
+ c=$((++c))
1132
+ done
1133
+
1134
+ case "$cur" in
1135
+ --*)
1136
+ __gitcomp "
1137
+ --color --no-color --verbose --abbrev= --no-abbrev
1138
+ --track --no-track --contains --merged --no-merged
1139
+ --set-upstream
1140
+ "
1141
+ ;;
1142
+ *)
1143
+ if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1144
+ __gitcomp "$(__git_heads)"
1145
+ else
1146
+ __gitcomp "$(__git_refs)"
1147
+ fi
1148
+ ;;
1149
+ esac
1150
+ }
1151
+
1152
+ _git_bundle ()
1153
+ {
1154
+ local cmd="${words[2]}"
1155
+ case "$cword" in
1156
+ 2)
1157
+ __gitcomp "create list-heads verify unbundle"
1158
+ ;;
1159
+ 3)
1160
+ # looking for a file
1161
+ ;;
1162
+ *)
1163
+ case "$cmd" in
1164
+ create)
1165
+ __git_complete_revlist
1166
+ ;;
1167
+ esac
1168
+ ;;
1169
+ esac
1170
+ }
1171
+
1172
+ _git_checkout ()
1173
+ {
1174
+ __git_has_doubledash && return
1175
+
1176
+ case "$cur" in
1177
+ --conflict=*)
1178
+ __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1179
+ ;;
1180
+ --*)
1181
+ __gitcomp "
1182
+ --quiet --ours --theirs --track --no-track --merge
1183
+ --conflict= --orphan --patch
1184
+ "
1185
+ ;;
1186
+ *)
1187
+ # check if --track, --no-track, or --no-guess was specified
1188
+ # if so, disable DWIM mode
1189
+ local flags="--track --no-track --no-guess" track=1
1190
+ if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1191
+ track=''
1192
+ fi
1193
+ __gitcomp "$(__git_refs '' $track)"
1194
+ ;;
1195
+ esac
1196
+ }
1197
+
1198
+ _git_cherry ()
1199
+ {
1200
+ __gitcomp "$(__git_refs)"
1201
+ }
1202
+
1203
+ _git_cherry_pick ()
1204
+ {
1205
+ case "$cur" in
1206
+ --*)
1207
+ __gitcomp "--edit --no-commit"
1208
+ ;;
1209
+ *)
1210
+ __gitcomp "$(__git_refs)"
1211
+ ;;
1212
+ esac
1213
+ }
1214
+
1215
+ _git_clean ()
1216
+ {
1217
+ __git_has_doubledash && return
1218
+
1219
+ case "$cur" in
1220
+ --*)
1221
+ __gitcomp "--dry-run --quiet"
1222
+ return
1223
+ ;;
1224
+ esac
1225
+ COMPREPLY=()
1226
+ }
1227
+
1228
+ _git_clone ()
1229
+ {
1230
+ case "$cur" in
1231
+ --*)
1232
+ __gitcomp "
1233
+ --local
1234
+ --no-hardlinks
1235
+ --shared
1236
+ --reference
1237
+ --quiet
1238
+ --no-checkout
1239
+ --bare
1240
+ --mirror
1241
+ --origin
1242
+ --upload-pack
1243
+ --template=
1244
+ --depth
1245
+ "
1246
+ return
1247
+ ;;
1248
+ esac
1249
+ COMPREPLY=()
1250
+ }
1251
+
1252
+ _git_commit ()
1253
+ {
1254
+ __git_has_doubledash && return
1255
+
1256
+ case "$cur" in
1257
+ --cleanup=*)
1258
+ __gitcomp "default strip verbatim whitespace
1259
+ " "" "${cur##--cleanup=}"
1260
+ return
1261
+ ;;
1262
+ --reuse-message=*)
1263
+ __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
1264
+ return
1265
+ ;;
1266
+ --reedit-message=*)
1267
+ __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
1268
+ return
1269
+ ;;
1270
+ --untracked-files=*)
1271
+ __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1272
+ return
1273
+ ;;
1274
+ --*)
1275
+ __gitcomp "
1276
+ --all --author= --signoff --verify --no-verify
1277
+ --edit --amend --include --only --interactive
1278
+ --dry-run --reuse-message= --reedit-message=
1279
+ --reset-author --file= --message= --template=
1280
+ --cleanup= --untracked-files --untracked-files=
1281
+ --verbose --quiet
1282
+ "
1283
+ return
1284
+ esac
1285
+ COMPREPLY=()
1286
+ }
1287
+
1288
+ _git_describe ()
1289
+ {
1290
+ case "$cur" in
1291
+ --*)
1292
+ __gitcomp "
1293
+ --all --tags --contains --abbrev= --candidates=
1294
+ --exact-match --debug --long --match --always
1295
+ "
1296
+ return
1297
+ esac
1298
+ __gitcomp "$(__git_refs)"
1299
+ }
1300
+
1301
+ __git_diff_common_options="--stat --numstat --shortstat --summary
1302
+ --patch-with-stat --name-only --name-status --color
1303
+ --no-color --color-words --no-renames --check
1304
+ --full-index --binary --abbrev --diff-filter=
1305
+ --find-copies-harder
1306
+ --text --ignore-space-at-eol --ignore-space-change
1307
+ --ignore-all-space --exit-code --quiet --ext-diff
1308
+ --no-ext-diff
1309
+ --no-prefix --src-prefix= --dst-prefix=
1310
+ --inter-hunk-context=
1311
+ --patience
1312
+ --raw
1313
+ --dirstat --dirstat= --dirstat-by-file
1314
+ --dirstat-by-file= --cumulative
1315
+ "
1316
+
1317
+ _git_diff ()
1318
+ {
1319
+ __git_has_doubledash && return
1320
+
1321
+ case "$cur" in
1322
+ --*)
1323
+ __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1324
+ --base --ours --theirs --no-index
1325
+ $__git_diff_common_options
1326
+ "
1327
+ return
1328
+ ;;
1329
+ esac
1330
+ __git_complete_revlist_file
1331
+ }
1332
+
1333
+ __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1334
+ tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
1335
+ "
1336
+
1337
+ _git_difftool ()
1338
+ {
1339
+ __git_has_doubledash && return
1340
+
1341
+ case "$cur" in
1342
+ --tool=*)
1343
+ __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1344
+ return
1345
+ ;;
1346
+ --*)
1347
+ __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1348
+ --base --ours --theirs
1349
+ --no-renames --diff-filter= --find-copies-harder
1350
+ --relative --ignore-submodules
1351
+ --tool="
1352
+ return
1353
+ ;;
1354
+ esac
1355
+ __git_complete_file
1356
+ }
1357
+
1358
+ __git_fetch_options="
1359
+ --quiet --verbose --append --upload-pack --force --keep --depth=
1360
+ --tags --no-tags --all --prune --dry-run
1361
+ "
1362
+
1363
+ _git_fetch ()
1364
+ {
1365
+ case "$cur" in
1366
+ --*)
1367
+ __gitcomp "$__git_fetch_options"
1368
+ return
1369
+ ;;
1370
+ esac
1371
+ __git_complete_remote_or_refspec
1372
+ }
1373
+
1374
+ _git_format_patch ()
1375
+ {
1376
+ case "$cur" in
1377
+ --thread=*)
1378
+ __gitcomp "
1379
+ deep shallow
1380
+ " "" "${cur##--thread=}"
1381
+ return
1382
+ ;;
1383
+ --*)
1384
+ __gitcomp "
1385
+ --stdout --attach --no-attach --thread --thread=
1386
+ --output-directory
1387
+ --numbered --start-number
1388
+ --numbered-files
1389
+ --keep-subject
1390
+ --signoff --signature --no-signature
1391
+ --in-reply-to= --cc=
1392
+ --full-index --binary
1393
+ --not --all
1394
+ --cover-letter
1395
+ --no-prefix --src-prefix= --dst-prefix=
1396
+ --inline --suffix= --ignore-if-in-upstream
1397
+ --subject-prefix=
1398
+ "
1399
+ return
1400
+ ;;
1401
+ esac
1402
+ __git_complete_revlist
1403
+ }
1404
+
1405
+ _git_fsck ()
1406
+ {
1407
+ case "$cur" in
1408
+ --*)
1409
+ __gitcomp "
1410
+ --tags --root --unreachable --cache --no-reflogs --full
1411
+ --strict --verbose --lost-found
1412
+ "
1413
+ return
1414
+ ;;
1415
+ esac
1416
+ COMPREPLY=()
1417
+ }
1418
+
1419
+ _git_gc ()
1420
+ {
1421
+ case "$cur" in
1422
+ --*)
1423
+ __gitcomp "--prune --aggressive"
1424
+ return
1425
+ ;;
1426
+ esac
1427
+ COMPREPLY=()
1428
+ }
1429
+
1430
+ _git_gitk ()
1431
+ {
1432
+ _gitk
1433
+ }
1434
+
1435
+ _git_grep ()
1436
+ {
1437
+ __git_has_doubledash && return
1438
+
1439
+ case "$cur" in
1440
+ --*)
1441
+ __gitcomp "
1442
+ --cached
1443
+ --text --ignore-case --word-regexp --invert-match
1444
+ --full-name --line-number
1445
+ --extended-regexp --basic-regexp --fixed-strings
1446
+ --perl-regexp
1447
+ --files-with-matches --name-only
1448
+ --files-without-match
1449
+ --max-depth
1450
+ --count
1451
+ --and --or --not --all-match
1452
+ "
1453
+ return
1454
+ ;;
1455
+ esac
1456
+
1457
+ __gitcomp "$(__git_refs)"
1458
+ }
1459
+
1460
+ _git_help ()
1461
+ {
1462
+ case "$cur" in
1463
+ --*)
1464
+ __gitcomp "--all --info --man --web"
1465
+ return
1466
+ ;;
1467
+ esac
1468
+ __git_compute_all_commands
1469
+ __gitcomp "$__git_all_commands $(__git_aliases)
1470
+ attributes cli core-tutorial cvs-migration
1471
+ diffcore gitk glossary hooks ignore modules
1472
+ namespaces repository-layout tutorial tutorial-2
1473
+ workflows
1474
+ "
1475
+ }
1476
+
1477
+ _git_init ()
1478
+ {
1479
+ case "$cur" in
1480
+ --shared=*)
1481
+ __gitcomp "
1482
+ false true umask group all world everybody
1483
+ " "" "${cur##--shared=}"
1484
+ return
1485
+ ;;
1486
+ --*)
1487
+ __gitcomp "--quiet --bare --template= --shared --shared="
1488
+ return
1489
+ ;;
1490
+ esac
1491
+ COMPREPLY=()
1492
+ }
1493
+
1494
+ _git_ls_files ()
1495
+ {
1496
+ __git_has_doubledash && return
1497
+
1498
+ case "$cur" in
1499
+ --*)
1500
+ __gitcomp "--cached --deleted --modified --others --ignored
1501
+ --stage --directory --no-empty-directory --unmerged
1502
+ --killed --exclude= --exclude-from=
1503
+ --exclude-per-directory= --exclude-standard
1504
+ --error-unmatch --with-tree= --full-name
1505
+ --abbrev --ignored --exclude-per-directory
1506
+ "
1507
+ return
1508
+ ;;
1509
+ esac
1510
+ COMPREPLY=()
1511
+ }
1512
+
1513
+ _git_ls_remote ()
1514
+ {
1515
+ __gitcomp "$(__git_remotes)"
1516
+ }
1517
+
1518
+ _git_ls_tree ()
1519
+ {
1520
+ __git_complete_file
1521
+ }
1522
+
1523
+ # Options that go well for log, shortlog and gitk
1524
+ __git_log_common_options="
1525
+ --not --all
1526
+ --branches --tags --remotes
1527
+ --first-parent --merges --no-merges
1528
+ --max-count=
1529
+ --max-age= --since= --after=
1530
+ --min-age= --until= --before=
1531
+ --min-parents= --max-parents=
1532
+ --no-min-parents --no-max-parents
1533
+ "
1534
+ # Options that go well for log and gitk (not shortlog)
1535
+ __git_log_gitk_options="
1536
+ --dense --sparse --full-history
1537
+ --simplify-merges --simplify-by-decoration
1538
+ --left-right --notes --no-notes
1539
+ "
1540
+ # Options that go well for log and shortlog (not gitk)
1541
+ __git_log_shortlog_options="
1542
+ --author= --committer= --grep=
1543
+ --all-match
1544
+ "
1545
+
1546
+ __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1547
+ __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1548
+
1549
+ _git_log ()
1550
+ {
1551
+ __git_has_doubledash && return
1552
+
1553
+ local g="$(git rev-parse --git-dir 2>/dev/null)"
1554
+ local merge=""
1555
+ if [ -f "$g/MERGE_HEAD" ]; then
1556
+ merge="--merge"
1557
+ fi
1558
+ case "$cur" in
1559
+ --pretty=*)
1560
+ __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1561
+ " "" "${cur##--pretty=}"
1562
+ return
1563
+ ;;
1564
+ --format=*)
1565
+ __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1566
+ " "" "${cur##--format=}"
1567
+ return
1568
+ ;;
1569
+ --date=*)
1570
+ __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1571
+ return
1572
+ ;;
1573
+ --decorate=*)
1574
+ __gitcomp "long short" "" "${cur##--decorate=}"
1575
+ return
1576
+ ;;
1577
+ --*)
1578
+ __gitcomp "
1579
+ $__git_log_common_options
1580
+ $__git_log_shortlog_options
1581
+ $__git_log_gitk_options
1582
+ --root --topo-order --date-order --reverse
1583
+ --follow --full-diff
1584
+ --abbrev-commit --abbrev=
1585
+ --relative-date --date=
1586
+ --pretty= --format= --oneline
1587
+ --cherry-pick
1588
+ --graph
1589
+ --decorate --decorate=
1590
+ --walk-reflogs
1591
+ --parents --children
1592
+ $merge
1593
+ $__git_diff_common_options
1594
+ --pickaxe-all --pickaxe-regex
1595
+ "
1596
+ return
1597
+ ;;
1598
+ esac
1599
+ __git_complete_revlist
1600
+ }
1601
+
1602
+ __git_merge_options="
1603
+ --no-commit --no-stat --log --no-log --squash --strategy
1604
+ --commit --stat --no-squash --ff --no-ff --ff-only
1605
+ "
1606
+
1607
+ _git_merge ()
1608
+ {
1609
+ __git_complete_strategy && return
1610
+
1611
+ case "$cur" in
1612
+ --*)
1613
+ __gitcomp "$__git_merge_options"
1614
+ return
1615
+ esac
1616
+ __gitcomp "$(__git_refs)"
1617
+ }
1618
+
1619
+ _git_mergetool ()
1620
+ {
1621
+ case "$cur" in
1622
+ --tool=*)
1623
+ __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1624
+ return
1625
+ ;;
1626
+ --*)
1627
+ __gitcomp "--tool="
1628
+ return
1629
+ ;;
1630
+ esac
1631
+ COMPREPLY=()
1632
+ }
1633
+
1634
+ _git_merge_base ()
1635
+ {
1636
+ __gitcomp "$(__git_refs)"
1637
+ }
1638
+
1639
+ _git_mv ()
1640
+ {
1641
+ case "$cur" in
1642
+ --*)
1643
+ __gitcomp "--dry-run"
1644
+ return
1645
+ ;;
1646
+ esac
1647
+ COMPREPLY=()
1648
+ }
1649
+
1650
+ _git_name_rev ()
1651
+ {
1652
+ __gitcomp "--tags --all --stdin"
1653
+ }
1654
+
1655
+ _git_notes ()
1656
+ {
1657
+ local subcommands='add append copy edit list prune remove show'
1658
+ local subcommand="$(__git_find_on_cmdline "$subcommands")"
1659
+
1660
+ case "$subcommand,$cur" in
1661
+ ,--*)
1662
+ __gitcomp '--ref'
1663
+ ;;
1664
+ ,*)
1665
+ case "${words[cword-1]}" in
1666
+ --ref)
1667
+ __gitcomp "$(__git_refs)"
1668
+ ;;
1669
+ *)
1670
+ __gitcomp "$subcommands --ref"
1671
+ ;;
1672
+ esac
1673
+ ;;
1674
+ add,--reuse-message=*|append,--reuse-message=*)
1675
+ __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
1676
+ ;;
1677
+ add,--reedit-message=*|append,--reedit-message=*)
1678
+ __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
1679
+ ;;
1680
+ add,--*|append,--*)
1681
+ __gitcomp '--file= --message= --reedit-message=
1682
+ --reuse-message='
1683
+ ;;
1684
+ copy,--*)
1685
+ __gitcomp '--stdin'
1686
+ ;;
1687
+ prune,--*)
1688
+ __gitcomp '--dry-run --verbose'
1689
+ ;;
1690
+ prune,*)
1691
+ ;;
1692
+ *)
1693
+ case "${words[cword-1]}" in
1694
+ -m|-F)
1695
+ ;;
1696
+ *)
1697
+ __gitcomp "$(__git_refs)"
1698
+ ;;
1699
+ esac
1700
+ ;;
1701
+ esac
1702
+ }
1703
+
1704
+ _git_pull ()
1705
+ {
1706
+ __git_complete_strategy && return
1707
+
1708
+ case "$cur" in
1709
+ --*)
1710
+ __gitcomp "
1711
+ --rebase --no-rebase
1712
+ $__git_merge_options
1713
+ $__git_fetch_options
1714
+ "
1715
+ return
1716
+ ;;
1717
+ esac
1718
+ __git_complete_remote_or_refspec
1719
+ }
1720
+
1721
+ _git_push ()
1722
+ {
1723
+ case "$prev" in
1724
+ --repo)
1725
+ __gitcomp "$(__git_remotes)"
1726
+ return
1727
+ esac
1728
+ case "$cur" in
1729
+ --repo=*)
1730
+ __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1731
+ return
1732
+ ;;
1733
+ --*)
1734
+ __gitcomp "
1735
+ --all --mirror --tags --dry-run --force --verbose
1736
+ --receive-pack= --repo=
1737
+ "
1738
+ return
1739
+ ;;
1740
+ esac
1741
+ __git_complete_remote_or_refspec
1742
+ }
1743
+
1744
+ _git_rebase ()
1745
+ {
1746
+ local dir="$(__gitdir)"
1747
+ if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1748
+ __gitcomp "--continue --skip --abort"
1749
+ return
1750
+ fi
1751
+ __git_complete_strategy && return
1752
+ case "$cur" in
1753
+ --whitespace=*)
1754
+ __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1755
+ return
1756
+ ;;
1757
+ --*)
1758
+ __gitcomp "
1759
+ --onto --merge --strategy --interactive
1760
+ --preserve-merges --stat --no-stat
1761
+ --committer-date-is-author-date --ignore-date
1762
+ --ignore-whitespace --whitespace=
1763
+ --autosquash
1764
+ "
1765
+
1766
+ return
1767
+ esac
1768
+ __gitcomp "$(__git_refs)"
1769
+ }
1770
+
1771
+ _git_reflog ()
1772
+ {
1773
+ local subcommands="show delete expire"
1774
+ local subcommand="$(__git_find_on_cmdline "$subcommands")"
1775
+
1776
+ if [ -z "$subcommand" ]; then
1777
+ __gitcomp "$subcommands"
1778
+ else
1779
+ __gitcomp "$(__git_refs)"
1780
+ fi
1781
+ }
1782
+
1783
+ __git_send_email_confirm_options="always never auto cc compose"
1784
+ __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1785
+
1786
+ _git_send_email ()
1787
+ {
1788
+ case "$cur" in
1789
+ --confirm=*)
1790
+ __gitcomp "
1791
+ $__git_send_email_confirm_options
1792
+ " "" "${cur##--confirm=}"
1793
+ return
1794
+ ;;
1795
+ --suppress-cc=*)
1796
+ __gitcomp "
1797
+ $__git_send_email_suppresscc_options
1798
+ " "" "${cur##--suppress-cc=}"
1799
+
1800
+ return
1801
+ ;;
1802
+ --smtp-encryption=*)
1803
+ __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1804
+ return
1805
+ ;;
1806
+ --*)
1807
+ __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1808
+ --compose --confirm= --dry-run --envelope-sender
1809
+ --from --identity
1810
+ --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1811
+ --no-suppress-from --no-thread --quiet
1812
+ --signed-off-by-cc --smtp-pass --smtp-server
1813
+ --smtp-server-port --smtp-encryption= --smtp-user
1814
+ --subject --suppress-cc= --suppress-from --thread --to
1815
+ --validate --no-validate"
1816
+ return
1817
+ ;;
1818
+ esac
1819
+ COMPREPLY=()
1820
+ }
1821
+
1822
+ _git_stage ()
1823
+ {
1824
+ _git_add
1825
+ }
1826
+
1827
+ __git_config_get_set_variables ()
1828
+ {
1829
+ local prevword word config_file= c=$cword
1830
+ while [ $c -gt 1 ]; do
1831
+ word="${words[c]}"
1832
+ case "$word" in
1833
+ --global|--system|--file=*)
1834
+ config_file="$word"
1835
+ break
1836
+ ;;
1837
+ -f|--file)
1838
+ config_file="$word $prevword"
1839
+ break
1840
+ ;;
1841
+ esac
1842
+ prevword=$word
1843
+ c=$((--c))
1844
+ done
1845
+
1846
+ git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1847
+ while read line
1848
+ do
1849
+ case "$line" in
1850
+ *.*=*)
1851
+ echo "${line/=*/}"
1852
+ ;;
1853
+ esac
1854
+ done
1855
+ }
1856
+
1857
+ _git_config ()
1858
+ {
1859
+ case "$prev" in
1860
+ branch.*.remote)
1861
+ __gitcomp "$(__git_remotes)"
1862
+ return
1863
+ ;;
1864
+ branch.*.merge)
1865
+ __gitcomp "$(__git_refs)"
1866
+ return
1867
+ ;;
1868
+ remote.*.fetch)
1869
+ local remote="${prev#remote.}"
1870
+ remote="${remote%.fetch}"
1871
+ __gitcomp "$(__git_refs_remotes "$remote")"
1872
+ return
1873
+ ;;
1874
+ remote.*.push)
1875
+ local remote="${prev#remote.}"
1876
+ remote="${remote%.push}"
1877
+ __gitcomp "$(git --git-dir="$(__gitdir)" \
1878
+ for-each-ref --format='%(refname):%(refname)' \
1879
+ refs/heads)"
1880
+ return
1881
+ ;;
1882
+ pull.twohead|pull.octopus)
1883
+ __git_compute_merge_strategies
1884
+ __gitcomp "$__git_merge_strategies"
1885
+ return
1886
+ ;;
1887
+ color.branch|color.diff|color.interactive|\
1888
+ color.showbranch|color.status|color.ui)
1889
+ __gitcomp "always never auto"
1890
+ return
1891
+ ;;
1892
+ color.pager)
1893
+ __gitcomp "false true"
1894
+ return
1895
+ ;;
1896
+ color.*.*)
1897
+ __gitcomp "
1898
+ normal black red green yellow blue magenta cyan white
1899
+ bold dim ul blink reverse
1900
+ "
1901
+ return
1902
+ ;;
1903
+ help.format)
1904
+ __gitcomp "man info web html"
1905
+ return
1906
+ ;;
1907
+ log.date)
1908
+ __gitcomp "$__git_log_date_formats"
1909
+ return
1910
+ ;;
1911
+ sendemail.aliasesfiletype)
1912
+ __gitcomp "mutt mailrc pine elm gnus"
1913
+ return
1914
+ ;;
1915
+ sendemail.confirm)
1916
+ __gitcomp "$__git_send_email_confirm_options"
1917
+ return
1918
+ ;;
1919
+ sendemail.suppresscc)
1920
+ __gitcomp "$__git_send_email_suppresscc_options"
1921
+ return
1922
+ ;;
1923
+ --get|--get-all|--unset|--unset-all)
1924
+ __gitcomp "$(__git_config_get_set_variables)"
1925
+ return
1926
+ ;;
1927
+ *.*)
1928
+ COMPREPLY=()
1929
+ return
1930
+ ;;
1931
+ esac
1932
+ case "$cur" in
1933
+ --*)
1934
+ __gitcomp "
1935
+ --global --system --file=
1936
+ --list --replace-all
1937
+ --get --get-all --get-regexp
1938
+ --add --unset --unset-all
1939
+ --remove-section --rename-section
1940
+ "
1941
+ return
1942
+ ;;
1943
+ branch.*.*)
1944
+ local pfx="${cur%.*}." cur_="${cur##*.}"
1945
+ __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1946
+ return
1947
+ ;;
1948
+ branch.*)
1949
+ local pfx="${cur%.*}." cur_="${cur#*.}"
1950
+ __gitcomp "$(__git_heads)" "$pfx" "$cur_" "."
1951
+ return
1952
+ ;;
1953
+ guitool.*.*)
1954
+ local pfx="${cur%.*}." cur_="${cur##*.}"
1955
+ __gitcomp "
1956
+ argprompt cmd confirm needsfile noconsole norescan
1957
+ prompt revprompt revunmerged title
1958
+ " "$pfx" "$cur_"
1959
+ return
1960
+ ;;
1961
+ difftool.*.*)
1962
+ local pfx="${cur%.*}." cur_="${cur##*.}"
1963
+ __gitcomp "cmd path" "$pfx" "$cur_"
1964
+ return
1965
+ ;;
1966
+ man.*.*)
1967
+ local pfx="${cur%.*}." cur_="${cur##*.}"
1968
+ __gitcomp "cmd path" "$pfx" "$cur_"
1969
+ return
1970
+ ;;
1971
+ mergetool.*.*)
1972
+ local pfx="${cur%.*}." cur_="${cur##*.}"
1973
+ __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1974
+ return
1975
+ ;;
1976
+ pager.*)
1977
+ local pfx="${cur%.*}." cur_="${cur#*.}"
1978
+ __git_compute_all_commands
1979
+ __gitcomp "$__git_all_commands" "$pfx" "$cur_"
1980
+ return
1981
+ ;;
1982
+ remote.*.*)
1983
+ local pfx="${cur%.*}." cur_="${cur##*.}"
1984
+ __gitcomp "
1985
+ url proxy fetch push mirror skipDefaultUpdate
1986
+ receivepack uploadpack tagopt pushurl
1987
+ " "$pfx" "$cur_"
1988
+ return
1989
+ ;;
1990
+ remote.*)
1991
+ local pfx="${cur%.*}." cur_="${cur#*.}"
1992
+ __gitcomp "$(__git_remotes)" "$pfx" "$cur_" "."
1993
+ return
1994
+ ;;
1995
+ url.*.*)
1996
+ local pfx="${cur%.*}." cur_="${cur##*.}"
1997
+ __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1998
+ return
1999
+ ;;
2000
+ esac
2001
+ __gitcomp "
2002
+ add.ignoreErrors
2003
+ advice.commitBeforeMerge
2004
+ advice.detachedHead
2005
+ advice.implicitIdentity
2006
+ advice.pushNonFastForward
2007
+ advice.resolveConflict
2008
+ advice.statusHints
2009
+ alias.
2010
+ am.keepcr
2011
+ apply.ignorewhitespace
2012
+ apply.whitespace
2013
+ branch.autosetupmerge
2014
+ branch.autosetuprebase
2015
+ browser.
2016
+ clean.requireForce
2017
+ color.branch
2018
+ color.branch.current
2019
+ color.branch.local
2020
+ color.branch.plain
2021
+ color.branch.remote
2022
+ color.decorate.HEAD
2023
+ color.decorate.branch
2024
+ color.decorate.remoteBranch
2025
+ color.decorate.stash
2026
+ color.decorate.tag
2027
+ color.diff
2028
+ color.diff.commit
2029
+ color.diff.frag
2030
+ color.diff.func
2031
+ color.diff.meta
2032
+ color.diff.new
2033
+ color.diff.old
2034
+ color.diff.plain
2035
+ color.diff.whitespace
2036
+ color.grep
2037
+ color.grep.context
2038
+ color.grep.filename
2039
+ color.grep.function
2040
+ color.grep.linenumber
2041
+ color.grep.match
2042
+ color.grep.selected
2043
+ color.grep.separator
2044
+ color.interactive
2045
+ color.interactive.error
2046
+ color.interactive.header
2047
+ color.interactive.help
2048
+ color.interactive.prompt
2049
+ color.pager
2050
+ color.showbranch
2051
+ color.status
2052
+ color.status.added
2053
+ color.status.changed
2054
+ color.status.header
2055
+ color.status.nobranch
2056
+ color.status.untracked
2057
+ color.status.updated
2058
+ color.ui
2059
+ commit.status
2060
+ commit.template
2061
+ core.abbrev
2062
+ core.askpass
2063
+ core.attributesfile
2064
+ core.autocrlf
2065
+ core.bare
2066
+ core.bigFileThreshold
2067
+ core.compression
2068
+ core.createObject
2069
+ core.deltaBaseCacheLimit
2070
+ core.editor
2071
+ core.eol
2072
+ core.excludesfile
2073
+ core.fileMode
2074
+ core.fsyncobjectfiles
2075
+ core.gitProxy
2076
+ core.ignoreCygwinFSTricks
2077
+ core.ignoreStat
2078
+ core.ignorecase
2079
+ core.logAllRefUpdates
2080
+ core.loosecompression
2081
+ core.notesRef
2082
+ core.packedGitLimit
2083
+ core.packedGitWindowSize
2084
+ core.pager
2085
+ core.preferSymlinkRefs
2086
+ core.preloadindex
2087
+ core.quotepath
2088
+ core.repositoryFormatVersion
2089
+ core.safecrlf
2090
+ core.sharedRepository
2091
+ core.sparseCheckout
2092
+ core.symlinks
2093
+ core.trustctime
2094
+ core.warnAmbiguousRefs
2095
+ core.whitespace
2096
+ core.worktree
2097
+ diff.autorefreshindex
2098
+ diff.external
2099
+ diff.ignoreSubmodules
2100
+ diff.mnemonicprefix
2101
+ diff.noprefix
2102
+ diff.renameLimit
2103
+ diff.renames
2104
+ diff.suppressBlankEmpty
2105
+ diff.tool
2106
+ diff.wordRegex
2107
+ difftool.
2108
+ difftool.prompt
2109
+ fetch.recurseSubmodules
2110
+ fetch.unpackLimit
2111
+ format.attach
2112
+ format.cc
2113
+ format.headers
2114
+ format.numbered
2115
+ format.pretty
2116
+ format.signature
2117
+ format.signoff
2118
+ format.subjectprefix
2119
+ format.suffix
2120
+ format.thread
2121
+ format.to
2122
+ gc.
2123
+ gc.aggressiveWindow
2124
+ gc.auto
2125
+ gc.autopacklimit
2126
+ gc.packrefs
2127
+ gc.pruneexpire
2128
+ gc.reflogexpire
2129
+ gc.reflogexpireunreachable
2130
+ gc.rerereresolved
2131
+ gc.rerereunresolved
2132
+ gitcvs.allbinary
2133
+ gitcvs.commitmsgannotation
2134
+ gitcvs.dbTableNamePrefix
2135
+ gitcvs.dbdriver
2136
+ gitcvs.dbname
2137
+ gitcvs.dbpass
2138
+ gitcvs.dbuser
2139
+ gitcvs.enabled
2140
+ gitcvs.logfile
2141
+ gitcvs.usecrlfattr
2142
+ guitool.
2143
+ gui.blamehistoryctx
2144
+ gui.commitmsgwidth
2145
+ gui.copyblamethreshold
2146
+ gui.diffcontext
2147
+ gui.encoding
2148
+ gui.fastcopyblame
2149
+ gui.matchtrackingbranch
2150
+ gui.newbranchtemplate
2151
+ gui.pruneduringfetch
2152
+ gui.spellingdictionary
2153
+ gui.trustmtime
2154
+ help.autocorrect
2155
+ help.browser
2156
+ help.format
2157
+ http.lowSpeedLimit
2158
+ http.lowSpeedTime
2159
+ http.maxRequests
2160
+ http.minSessions
2161
+ http.noEPSV
2162
+ http.postBuffer
2163
+ http.proxy
2164
+ http.sslCAInfo
2165
+ http.sslCAPath
2166
+ http.sslCert
2167
+ http.sslCertPasswordProtected
2168
+ http.sslKey
2169
+ http.sslVerify
2170
+ http.useragent
2171
+ i18n.commitEncoding
2172
+ i18n.logOutputEncoding
2173
+ imap.authMethod
2174
+ imap.folder
2175
+ imap.host
2176
+ imap.pass
2177
+ imap.port
2178
+ imap.preformattedHTML
2179
+ imap.sslverify
2180
+ imap.tunnel
2181
+ imap.user
2182
+ init.templatedir
2183
+ instaweb.browser
2184
+ instaweb.httpd
2185
+ instaweb.local
2186
+ instaweb.modulepath
2187
+ instaweb.port
2188
+ interactive.singlekey
2189
+ log.date
2190
+ log.decorate
2191
+ log.showroot
2192
+ mailmap.file
2193
+ man.
2194
+ man.viewer
2195
+ merge.
2196
+ merge.conflictstyle
2197
+ merge.log
2198
+ merge.renameLimit
2199
+ merge.renormalize
2200
+ merge.stat
2201
+ merge.tool
2202
+ merge.verbosity
2203
+ mergetool.
2204
+ mergetool.keepBackup
2205
+ mergetool.keepTemporaries
2206
+ mergetool.prompt
2207
+ notes.displayRef
2208
+ notes.rewrite.
2209
+ notes.rewrite.amend
2210
+ notes.rewrite.rebase
2211
+ notes.rewriteMode
2212
+ notes.rewriteRef
2213
+ pack.compression
2214
+ pack.deltaCacheLimit
2215
+ pack.deltaCacheSize
2216
+ pack.depth
2217
+ pack.indexVersion
2218
+ pack.packSizeLimit
2219
+ pack.threads
2220
+ pack.window
2221
+ pack.windowMemory
2222
+ pager.
2223
+ pretty.
2224
+ pull.octopus
2225
+ pull.twohead
2226
+ push.default
2227
+ rebase.autosquash
2228
+ rebase.stat
2229
+ receive.autogc
2230
+ receive.denyCurrentBranch
2231
+ receive.denyDeleteCurrent
2232
+ receive.denyDeletes
2233
+ receive.denyNonFastForwards
2234
+ receive.fsckObjects
2235
+ receive.unpackLimit
2236
+ receive.updateserverinfo
2237
+ remotes.
2238
+ repack.usedeltabaseoffset
2239
+ rerere.autoupdate
2240
+ rerere.enabled
2241
+ sendemail.
2242
+ sendemail.aliasesfile
2243
+ sendemail.aliasfiletype
2244
+ sendemail.bcc
2245
+ sendemail.cc
2246
+ sendemail.cccmd
2247
+ sendemail.chainreplyto
2248
+ sendemail.confirm
2249
+ sendemail.envelopesender
2250
+ sendemail.from
2251
+ sendemail.identity
2252
+ sendemail.multiedit
2253
+ sendemail.signedoffbycc
2254
+ sendemail.smtpdomain
2255
+ sendemail.smtpencryption
2256
+ sendemail.smtppass
2257
+ sendemail.smtpserver
2258
+ sendemail.smtpserveroption
2259
+ sendemail.smtpserverport
2260
+ sendemail.smtpuser
2261
+ sendemail.suppresscc
2262
+ sendemail.suppressfrom
2263
+ sendemail.thread
2264
+ sendemail.to
2265
+ sendemail.validate
2266
+ showbranch.default
2267
+ status.relativePaths
2268
+ status.showUntrackedFiles
2269
+ status.submodulesummary
2270
+ submodule.
2271
+ tar.umask
2272
+ transfer.unpackLimit
2273
+ url.
2274
+ user.email
2275
+ user.name
2276
+ user.signingkey
2277
+ web.browser
2278
+ branch. remote.
2279
+ "
2280
+ }
2281
+
2282
+ _git_remote ()
2283
+ {
2284
+ local subcommands="add rename rm show prune update set-head"
2285
+ local subcommand="$(__git_find_on_cmdline "$subcommands")"
2286
+ if [ -z "$subcommand" ]; then
2287
+ __gitcomp "$subcommands"
2288
+ return
2289
+ fi
2290
+
2291
+ case "$subcommand" in
2292
+ rename|rm|show|prune)
2293
+ __gitcomp "$(__git_remotes)"
2294
+ ;;
2295
+ update)
2296
+ local i c='' IFS=$'\n'
2297
+ for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2298
+ i="${i#remotes.}"
2299
+ c="$c ${i/ */}"
2300
+ done
2301
+ __gitcomp "$c"
2302
+ ;;
2303
+ *)
2304
+ COMPREPLY=()
2305
+ ;;
2306
+ esac
2307
+ }
2308
+
2309
+ _git_replace ()
2310
+ {
2311
+ __gitcomp "$(__git_refs)"
2312
+ }
2313
+
2314
+ _git_reset ()
2315
+ {
2316
+ __git_has_doubledash && return
2317
+
2318
+ case "$cur" in
2319
+ --*)
2320
+ __gitcomp "--merge --mixed --hard --soft --patch"
2321
+ return
2322
+ ;;
2323
+ esac
2324
+ __gitcomp "$(__git_refs)"
2325
+ }
2326
+
2327
+ _git_revert ()
2328
+ {
2329
+ case "$cur" in
2330
+ --*)
2331
+ __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2332
+ return
2333
+ ;;
2334
+ esac
2335
+ __gitcomp "$(__git_refs)"
2336
+ }
2337
+
2338
+ _git_rm ()
2339
+ {
2340
+ __git_has_doubledash && return
2341
+
2342
+ case "$cur" in
2343
+ --*)
2344
+ __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2345
+ return
2346
+ ;;
2347
+ esac
2348
+ COMPREPLY=()
2349
+ }
2350
+
2351
+ _git_shortlog ()
2352
+ {
2353
+ __git_has_doubledash && return
2354
+
2355
+ case "$cur" in
2356
+ --*)
2357
+ __gitcomp "
2358
+ $__git_log_common_options
2359
+ $__git_log_shortlog_options
2360
+ --numbered --summary
2361
+ "
2362
+ return
2363
+ ;;
2364
+ esac
2365
+ __git_complete_revlist
2366
+ }
2367
+
2368
+ _git_show ()
2369
+ {
2370
+ __git_has_doubledash && return
2371
+
2372
+ case "$cur" in
2373
+ --pretty=*)
2374
+ __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2375
+ " "" "${cur##--pretty=}"
2376
+ return
2377
+ ;;
2378
+ --format=*)
2379
+ __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2380
+ " "" "${cur##--format=}"
2381
+ return
2382
+ ;;
2383
+ --*)
2384
+ __gitcomp "--pretty= --format= --abbrev-commit --oneline
2385
+ $__git_diff_common_options
2386
+ "
2387
+ return
2388
+ ;;
2389
+ esac
2390
+ __git_complete_file
2391
+ }
2392
+
2393
+ _git_show_branch ()
2394
+ {
2395
+ case "$cur" in
2396
+ --*)
2397
+ __gitcomp "
2398
+ --all --remotes --topo-order --current --more=
2399
+ --list --independent --merge-base --no-name
2400
+ --color --no-color
2401
+ --sha1-name --sparse --topics --reflog
2402
+ "
2403
+ return
2404
+ ;;
2405
+ esac
2406
+ __git_complete_revlist
2407
+ }
2408
+
2409
+ _git_stash ()
2410
+ {
2411
+ local save_opts='--keep-index --no-keep-index --quiet --patch'
2412
+ local subcommands='save list show apply clear drop pop create branch'
2413
+ local subcommand="$(__git_find_on_cmdline "$subcommands")"
2414
+ if [ -z "$subcommand" ]; then
2415
+ case "$cur" in
2416
+ --*)
2417
+ __gitcomp "$save_opts"
2418
+ ;;
2419
+ *)
2420
+ if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2421
+ __gitcomp "$subcommands"
2422
+ else
2423
+ COMPREPLY=()
2424
+ fi
2425
+ ;;
2426
+ esac
2427
+ else
2428
+ case "$subcommand,$cur" in
2429
+ save,--*)
2430
+ __gitcomp "$save_opts"
2431
+ ;;
2432
+ apply,--*|pop,--*)
2433
+ __gitcomp "--index --quiet"
2434
+ ;;
2435
+ show,--*|drop,--*|branch,--*)
2436
+ COMPREPLY=()
2437
+ ;;
2438
+ show,*|apply,*|drop,*|pop,*|branch,*)
2439
+ __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
2440
+ | sed -n -e 's/:.*//p')"
2441
+ ;;
2442
+ *)
2443
+ COMPREPLY=()
2444
+ ;;
2445
+ esac
2446
+ fi
2447
+ }
2448
+
2449
+ _git_submodule ()
2450
+ {
2451
+ __git_has_doubledash && return
2452
+
2453
+ local subcommands="add status init update summary foreach sync"
2454
+ if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2455
+ case "$cur" in
2456
+ --*)
2457
+ __gitcomp "--quiet --cached"
2458
+ ;;
2459
+ *)
2460
+ __gitcomp "$subcommands"
2461
+ ;;
2462
+ esac
2463
+ return
2464
+ fi
2465
+ }
2466
+
2467
+ _git_svn ()
2468
+ {
2469
+ local subcommands="
2470
+ init fetch clone rebase dcommit log find-rev
2471
+ set-tree commit-diff info create-ignore propget
2472
+ proplist show-ignore show-externals branch tag blame
2473
+ migrate mkdirs reset gc
2474
+ "
2475
+ local subcommand="$(__git_find_on_cmdline "$subcommands")"
2476
+ if [ -z "$subcommand" ]; then
2477
+ __gitcomp "$subcommands"
2478
+ else
2479
+ local remote_opts="--username= --config-dir= --no-auth-cache"
2480
+ local fc_opts="
2481
+ --follow-parent --authors-file= --repack=
2482
+ --no-metadata --use-svm-props --use-svnsync-props
2483
+ --log-window-size= --no-checkout --quiet
2484
+ --repack-flags --use-log-author --localtime
2485
+ --ignore-paths= $remote_opts
2486
+ "
2487
+ local init_opts="
2488
+ --template= --shared= --trunk= --tags=
2489
+ --branches= --stdlayout --minimize-url
2490
+ --no-metadata --use-svm-props --use-svnsync-props
2491
+ --rewrite-root= --prefix= --use-log-author
2492
+ --add-author-from $remote_opts
2493
+ "
2494
+ local cmt_opts="
2495
+ --edit --rmdir --find-copies-harder --copy-similarity=
2496
+ "
2497
+
2498
+ case "$subcommand,$cur" in
2499
+ fetch,--*)
2500
+ __gitcomp "--revision= --fetch-all $fc_opts"
2501
+ ;;
2502
+ clone,--*)
2503
+ __gitcomp "--revision= $fc_opts $init_opts"
2504
+ ;;
2505
+ init,--*)
2506
+ __gitcomp "$init_opts"
2507
+ ;;
2508
+ dcommit,--*)
2509
+ __gitcomp "
2510
+ --merge --strategy= --verbose --dry-run
2511
+ --fetch-all --no-rebase --commit-url
2512
+ --revision $cmt_opts $fc_opts
2513
+ "
2514
+ ;;
2515
+ set-tree,--*)
2516
+ __gitcomp "--stdin $cmt_opts $fc_opts"
2517
+ ;;
2518
+ create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2519
+ show-externals,--*|mkdirs,--*)
2520
+ __gitcomp "--revision="
2521
+ ;;
2522
+ log,--*)
2523
+ __gitcomp "
2524
+ --limit= --revision= --verbose --incremental
2525
+ --oneline --show-commit --non-recursive
2526
+ --authors-file= --color
2527
+ "
2528
+ ;;
2529
+ rebase,--*)
2530
+ __gitcomp "
2531
+ --merge --verbose --strategy= --local
2532
+ --fetch-all --dry-run $fc_opts
2533
+ "
2534
+ ;;
2535
+ commit-diff,--*)
2536
+ __gitcomp "--message= --file= --revision= $cmt_opts"
2537
+ ;;
2538
+ info,--*)
2539
+ __gitcomp "--url"
2540
+ ;;
2541
+ branch,--*)
2542
+ __gitcomp "--dry-run --message --tag"
2543
+ ;;
2544
+ tag,--*)
2545
+ __gitcomp "--dry-run --message"
2546
+ ;;
2547
+ blame,--*)
2548
+ __gitcomp "--git-format"
2549
+ ;;
2550
+ migrate,--*)
2551
+ __gitcomp "
2552
+ --config-dir= --ignore-paths= --minimize
2553
+ --no-auth-cache --username=
2554
+ "
2555
+ ;;
2556
+ reset,--*)
2557
+ __gitcomp "--revision= --parent"
2558
+ ;;
2559
+ *)
2560
+ COMPREPLY=()
2561
+ ;;
2562
+ esac
2563
+ fi
2564
+ }
2565
+
2566
+ _git_tag ()
2567
+ {
2568
+ local i c=1 f=0
2569
+ while [ $c -lt $cword ]; do
2570
+ i="${words[c]}"
2571
+ case "$i" in
2572
+ -d|-v)
2573
+ __gitcomp "$(__git_tags)"
2574
+ return
2575
+ ;;
2576
+ -f)
2577
+ f=1
2578
+ ;;
2579
+ esac
2580
+ c=$((++c))
2581
+ done
2582
+
2583
+ case "$prev" in
2584
+ -m|-F)
2585
+ COMPREPLY=()
2586
+ ;;
2587
+ -*|tag)
2588
+ if [ $f = 1 ]; then
2589
+ __gitcomp "$(__git_tags)"
2590
+ else
2591
+ COMPREPLY=()
2592
+ fi
2593
+ ;;
2594
+ *)
2595
+ __gitcomp "$(__git_refs)"
2596
+ ;;
2597
+ esac
2598
+ }
2599
+
2600
+ _git_whatchanged ()
2601
+ {
2602
+ _git_log
2603
+ }
2604
+
2605
+ _git ()
2606
+ {
2607
+ local i c=1 command __git_dir
2608
+
2609
+ if [[ -n ${ZSH_VERSION-} ]]; then
2610
+ emulate -L bash
2611
+ setopt KSH_TYPESET
2612
+
2613
+ # workaround zsh's bug that leaves 'words' as a special
2614
+ # variable in versions < 4.3.12
2615
+ typeset -h words
2616
+ fi
2617
+
2618
+ local cur words cword prev
2619
+ _get_comp_words_by_ref -n =: cur words cword prev
2620
+ while [ $c -lt $cword ]; do
2621
+ i="${words[c]}"
2622
+ case "$i" in
2623
+ --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2624
+ --bare) __git_dir="." ;;
2625
+ --version|-p|--paginate) ;;
2626
+ --help) command="help"; break ;;
2627
+ *) command="$i"; break ;;
2628
+ esac
2629
+ c=$((++c))
2630
+ done
2631
+
2632
+ if [ -z "$command" ]; then
2633
+ case "$cur" in
2634
+ --*) __gitcomp "
2635
+ --paginate
2636
+ --no-pager
2637
+ --git-dir=
2638
+ --bare
2639
+ --version
2640
+ --exec-path
2641
+ --html-path
2642
+ --work-tree=
2643
+ --namespace=
2644
+ --help
2645
+ "
2646
+ ;;
2647
+ *) __git_compute_porcelain_commands
2648
+ __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2649
+ esac
2650
+ return
2651
+ fi
2652
+
2653
+ local completion_func="_git_${command//-/_}"
2654
+ declare -f $completion_func >/dev/null && $completion_func && return
2655
+
2656
+ local expansion=$(__git_aliased_command "$command")
2657
+ if [ -n "$expansion" ]; then
2658
+ completion_func="_git_${expansion//-/_}"
2659
+ declare -f $completion_func >/dev/null && $completion_func
2660
+ fi
2661
+ }
2662
+
2663
+ _gitk ()
2664
+ {
2665
+ if [[ -n ${ZSH_VERSION-} ]]; then
2666
+ emulate -L bash
2667
+ setopt KSH_TYPESET
2668
+
2669
+ # workaround zsh's bug that leaves 'words' as a special
2670
+ # variable in versions < 4.3.12
2671
+ typeset -h words
2672
+ fi
2673
+
2674
+ local cur words cword prev
2675
+ _get_comp_words_by_ref -n =: cur words cword prev
2676
+
2677
+ __git_has_doubledash && return
2678
+
2679
+ local g="$(__gitdir)"
2680
+ local merge=""
2681
+ if [ -f "$g/MERGE_HEAD" ]; then
2682
+ merge="--merge"
2683
+ fi
2684
+ case "$cur" in
2685
+ --*)
2686
+ __gitcomp "
2687
+ $__git_log_common_options
2688
+ $__git_log_gitk_options
2689
+ $merge
2690
+ "
2691
+ return
2692
+ ;;
2693
+ esac
2694
+ __git_complete_revlist
2695
+ }
2696
+
2697
+ complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2698
+ || complete -o default -o nospace -F _git git
2699
+ complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2700
+ || complete -o default -o nospace -F _gitk gitk
2701
+
2702
+ # The following are necessary only for Cygwin, and only are needed
2703
+ # when the user has tab-completed the executable name and consequently
2704
+ # included the '.exe' suffix.
2705
+ #
2706
+ if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2707
+ complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2708
+ || complete -o default -o nospace -F _git git.exe
2709
+ fi
2710
+
2711
+ if [[ -n ${ZSH_VERSION-} ]]; then
2712
+ __git_shopt () {
2713
+ local option
2714
+ if [ $# -ne 2 ]; then
2715
+ echo "USAGE: $0 (-q|-s|-u) <option>" >&2
2716
+ return 1
2717
+ fi
2718
+ case "$2" in
2719
+ nullglob)
2720
+ option="$2"
2721
+ ;;
2722
+ *)
2723
+ echo "$0: invalid option: $2" >&2
2724
+ return 1
2725
+ esac
2726
+ case "$1" in
2727
+ -q) setopt | grep -q "$option" ;;
2728
+ -u) unsetopt "$option" ;;
2729
+ -s) setopt "$option" ;;
2730
+ *)
2731
+ echo "$0: invalid flag: $1" >&2
2732
+ return 1
2733
+ esac
2734
+ }
2735
+ else
2736
+ __git_shopt () {
2737
+ shopt "$@"
2738
+ }
2739
+ fi