Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: git completion horribly slow in kernel tree



On 23/01/2008, Clint Adams <clint@xxxxxxx> wrote:
> On Wed, Jan 23, 2008 at 05:30:05PM +0100, Mikael Magnusson wrote:
> > Hm, I don't really know... git ls-tree seems to not want to output ..,
> > if you specify --full-name, it does show the dir you specify, but
> > relative to the root of the project. So if you're in proj/dir1/dir2
> > and git ls-tree --full-name --name-only HEAD .., you will get files
> > shown as dir1/file1. I guess it's possible to use that output, but
> > maybe it's easier to just manually cd to the proj/ dir first :). I
> > just looked at the bash completer (which is very confusing code), and
> > it seems to use something like
> > git --git-dir=$(git rev-parse --git-dir) ls-tree $ref:prefix
> > which lists the file as file1 instead of dir1/file1. (no idea why it
> > doesn't use --name-only).
>
> I just looked and git-add completion is using ls-files, which can't
> handle relative paths either.

Hm, this "works", but it definitely isn't nice, and doesn't work when
you type the shorter path manually first.
# Untracked files:
#	Src/Modules/curses_keys.h
if i'm sitting in Src/Builtins, the following code will produce
git add <tab>
git add ../<tab>
git add ../../<tab>
git add ../../Src/Modules<tab>
git add ../../Src/Modules/curses_keys.h
which is not so great.
Annoyingly, when i'm sitting in Src/Builtins, git status produces the following
# Untracked files:
#	../Modules/curses_keys.h

I don't know how often one really wants to git add files above the
current dir, but it just annoys me that it's so hard to fix. :)

(( $+functions[__git_files] )) ||
__git_files () {
  local expl files ls_opts opts gitdir cdup

  zparseopts -D -E -a opts -- -cached -deleted -modified -others
-ignored -unmerged -killed

  gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
  __git_command_successful || return

  ls_opts=("--exclude-per-directory=.gitignore")
  [[ -f "$gitdir/info/exclude" ]] &&
ls_opts+="--exclude-from=$gitdir/info/exclude"

  cdup=$(_call_program revparse git rev-parse --show-cdup)
  files=(${(ps:\0:)"$(_call_program files git ls-files --full-name -z
$ls_opts $opts $cdup 2>/dev/null)"})
  files=$cdup${^files}
  __git_command_successful || return

  _wanted files expl 'index file' _multi_parts $@ - / files
}


-- 
Mikael Magnusson



Messages sorted by: Reverse Date, Date, Thread, Author