* [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
@ 2010-03-21 17:23 Simon Ruderich
2010-03-21 19:48 ` Benjamin R. Haskell
0 siblings, 1 reply; 15+ messages in thread
From: Simon Ruderich @ 2010-03-21 17:23 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: text/plain, Size: 979 bytes --]
Hi,
Maybe it should be checked if FETCH_HEAD, ORIG_HEAD and
MERGE_HEAD exist before completing them, but I'm not sure how to
that.
Simon
---
Completion/Unix/Command/_git | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index d7570cc..dbc3dae 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -3125,7 +3125,7 @@ __git_heads () {
branch_names=(${${(f)"$(_call_program headrefs git for-each-ref --format='"%(refname)"' refs/heads refs/remotes 2>/dev/null)"}#refs/(heads|remotes)/})
__git_command_successful || return
- _wanted heads expl branch-name compadd $* - $branch_names HEAD
+ _wanted heads expl branch-name compadd $* - $branch_names HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD
}
(( $+functions[__git_tags] )) ||
--
1.7.0.2
--
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9
[-- Attachment #2: Type: application/pgp-signature, Size: 835 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-03-21 17:23 [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD Simon Ruderich
@ 2010-03-21 19:48 ` Benjamin R. Haskell
2010-03-21 20:17 ` Nikolai Weibull
0 siblings, 1 reply; 15+ messages in thread
From: Benjamin R. Haskell @ 2010-03-21 19:48 UTC (permalink / raw)
To: Zsh Workers
On Sun, 21 Mar 2010, Simon Ruderich wrote:
> Hi,
>
> Maybe it should be checked if FETCH_HEAD, ORIG_HEAD and
> MERGE_HEAD exist before completing them, but I'm not sure how to
> that.
>
> Simon
This version checks that rev-parse returns something valid for each of
those three 'symbolic ref names' (as git-rev-parse(1) calls them), plus
'HEAD' itself (which isn't a valid name on a newly-init'ed repository).
It could probably be improved via the use of _call_program rather than
calling 'git rev-parse' directly (the same way branch_names uses
'headrefs' to allow for zstyle niceness, I think), but I don't fully
grok that yet.
Best,
Ben
---
Completion/Unix/Command/_git | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index d7570cc..730a952 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -3119,13 +3119,18 @@ __git_tag_ids () {
(( $+functions[__git_heads] )) ||
__git_heads () {
- local expl
+ local expl head symbolic_heads
declare -a branch_names
branch_names=(${${(f)"$(_call_program headrefs git for-each-ref --format='"%(refname)"' refs/heads refs/remotes 2>/dev/null)"}#refs/(heads|remotes)/})
__git_command_successful || return
- _wanted heads expl branch-name compadd $* - $branch_names HEAD
+ symbolic_heads=()
+ for head in HEAD ORIG_HEAD FETCH_HEAD MERGE_HEAD ; do
+ git rev-parse $head &>/dev/null && symbolic_heads+=( $head )
+ done
+
+ _wanted heads expl branch-name compadd $* - $branch_names $symbolic_heads
}
(( $+functions[__git_tags] )) ||
--
1.7.0
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-03-21 19:48 ` Benjamin R. Haskell
@ 2010-03-21 20:17 ` Nikolai Weibull
2010-03-22 1:25 ` Simon Ruderich
0 siblings, 1 reply; 15+ messages in thread
From: Nikolai Weibull @ 2010-03-21 20:17 UTC (permalink / raw)
To: Benjamin R. Haskell; +Cc: Zsh Workers
On Sun, Mar 21, 2010 at 20:48, Benjamin R. Haskell <zsh@benizi.com> wrote:
> + symbolic_heads=()
> + for head in HEAD ORIG_HEAD FETCH_HEAD MERGE_HEAD ; do
> + git rev-parse $head &>/dev/null && symbolic_heads+=( $head )
> + done
That’s a lot of forking to make a simple check. Is there no better
way? Do we actually have to filter the heads?
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-03-21 20:17 ` Nikolai Weibull
@ 2010-03-22 1:25 ` Simon Ruderich
2010-03-22 2:30 ` Benjamin R. Haskell
0 siblings, 1 reply; 15+ messages in thread
From: Simon Ruderich @ 2010-03-22 1:25 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: text/plain, Size: 754 bytes --]
On Sun, Mar 21, 2010 at 09:17:25PM +0100, Nikolai Weibull wrote:
> On Sun, Mar 21, 2010 at 20:48, Benjamin R. Haskell wrote:
>
>> + symbolic_heads=()
>> + for head in HEAD ORIG_HEAD FETCH_HEAD MERGE_HEAD ; do
>> + git rev-parse $head &>/dev/null && symbolic_heads+=( $head )
>> + done
>
> That’s a lot of forking to make a simple check. Is there no better
> way? Do we actually have to filter the heads?
I don't know the _git completion code, but couldn't we just check
if .git/{ORIG_HEAD,FETCH_HEAD,MERGE_HEAD} exists? This should
work for most things.
Another possibility would be to just complete them all the time.
Simon
--
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9
[-- Attachment #2: Type: application/pgp-signature, Size: 835 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-03-22 1:25 ` Simon Ruderich
@ 2010-03-22 2:30 ` Benjamin R. Haskell
2010-03-22 9:27 ` Nikolai Weibull
0 siblings, 1 reply; 15+ messages in thread
From: Benjamin R. Haskell @ 2010-03-22 2:30 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: TEXT/PLAIN, Size: 2416 bytes --]
On Mon, 22 Mar 2010, Simon Ruderich wrote:
> On Sun, Mar 21, 2010 at 09:17:25PM +0100, Nikolai Weibull wrote:
> > On Sun, Mar 21, 2010 at 20:48, Benjamin R. Haskell wrote:
> >
> >> + symbolic_heads=()
> >> + for head in HEAD ORIG_HEAD FETCH_HEAD MERGE_HEAD ; do
> >> + git rev-parse $head &>/dev/null && symbolic_heads+=( $head )
> >> + done
> >
> > That’s a lot of forking to make a simple check. Is there no better
> > way? Do we actually have to filter the heads?
>
> I don't know the _git completion code, but couldn't we just check if
> .git/{ORIG_HEAD,FETCH_HEAD,MERGE_HEAD} exists? This should work for
> most things.
>
> Another possibility would be to just complete them all the time.
Testing the existence of $gitdir/{refname} seems a fine compromise.
(Really, I don't see the issue; this seems like a drop in the bucket of
_git's performance issues... I s'pose the forks are prohibitively
expensive on Win32? Revised patch below anyway.)
Also, this breaks the fact that my previous patch fixed 'HEAD' *not*
completing in a newly init'ed repo. (The file .git/HEAD contains the
text "ref: refs/heads/master", even if HEAD doesn't exist.) But,
whatever; speed trumps correctness.
(In case it's unclear, I prefer my previous patch -- doesn't _git fork
all over the place? -- but either one's preferable to no-change or
always-adding-them.)
Best,
Ben
---
Completion/Unix/Command/_git | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index d7570cc..ae6565f 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -3119,13 +3119,17 @@ __git_tag_ids () {
(( $+functions[__git_heads] )) ||
__git_heads () {
- local expl
+ local expl gitdir head symbolic_heads
declare -a branch_names
branch_names=(${${(f)"$(_call_program headrefs git for-each-ref --format='"%(refname)"' refs/heads refs/remotes 2>/dev/null)"}#refs/(heads|remotes)/})
__git_command_successful || return
- _wanted heads expl branch-name compadd $* - $branch_names HEAD
+ symbolic_heads=()
+ gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
+ __git_command_successful && symbolic_heads=( $gitdir/{,{ORIG,FETCH,MERGE}_}HEAD(N:t) )
+
+ _wanted heads expl branch-name compadd $* - $branch_names $symbolic_heads
}
(( $+functions[__git_tags] )) ||
--
1.7.0
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-03-22 2:30 ` Benjamin R. Haskell
@ 2010-03-22 9:27 ` Nikolai Weibull
2010-03-29 0:07 ` Simon Ruderich
2010-03-29 13:56 ` Benjamin R. Haskell
0 siblings, 2 replies; 15+ messages in thread
From: Nikolai Weibull @ 2010-03-22 9:27 UTC (permalink / raw)
To: Benjamin R. Haskell; +Cc: zsh-workers
On Mon, Mar 22, 2010 at 03:30, Benjamin R. Haskell <zsh@benizi.com> wrote:
> Testing the existence of $gitdir/{refname} seems a fine compromise.
> (Really, I don't see the issue; this seems like a drop in the bucket of
> _git's performance issues... I s'pose the forks are prohibitively
> expensive on Win32? Revised patch below anyway.)
> (In case it's unclear, I prefer my previous patch -- doesn't _git fork
> all over the place? -- but either one's preferable to no-change or
> always-adding-them.)
Yes, it does, and, as you mention, it’s horribly slow to fork on
Windows. I mean, what where they thinking? But I question the value
of forking for this particular test. Still, it’s more correct to use
rev-parse. As your patch uses rev-parse to find gitdir once already,
we’re not gaining much by globbing instead.
I just ran a benchmark on Cygwin and it takes about 0.5 seconds to run
four rev-parses.
Perhaps completing them all without checking if they’re valid
beforehand is the best solution?
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-03-22 9:27 ` Nikolai Weibull
@ 2010-03-29 0:07 ` Simon Ruderich
2010-05-01 8:28 ` Simon Ruderich
2010-03-29 13:56 ` Benjamin R. Haskell
1 sibling, 1 reply; 15+ messages in thread
From: Simon Ruderich @ 2010-03-29 0:07 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: text/plain, Size: 427 bytes --]
On Mon, Mar 22, 2010 at 10:27:29AM +0100, Nikolai Weibull wrote:
> [snip]
>
> Perhaps completing them all without checking if they’re valid
> beforehand is the best solution?
I think so too, it's simple and works. And as all these names are
uppercase they shouldn't interfere with normal completion.
Thanks,
Simon
--
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9
[-- Attachment #2: Type: application/pgp-signature, Size: 835 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-03-22 9:27 ` Nikolai Weibull
2010-03-29 0:07 ` Simon Ruderich
@ 2010-03-29 13:56 ` Benjamin R. Haskell
1 sibling, 0 replies; 15+ messages in thread
From: Benjamin R. Haskell @ 2010-03-29 13:56 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: TEXT/PLAIN, Size: 2101 bytes --]
[oops, sat in my drafts]
On Mon, 22 Mar 2010, Nikolai Weibull wrote:
> On Mon, Mar 22, 2010 at 03:30, Benjamin R. Haskell <zsh@benizi.com> wrote:
> > Testing the existence of $gitdir/{refname} seems a fine compromise.
> > (Really, I don't see the issue; this seems like a drop in the bucket
> > of _git's performance issues... I s'pose the forks are
> > prohibitively expensive on Win32? Revised patch below anyway.)
>
> > (In case it's unclear, I prefer my previous patch -- doesn't _git
> > fork all over the place? -- but either one's preferable to no-change
> > or always-adding-them.)
>
> Yes, it does, and, as you mention, it’s horribly slow to fork on
> Windows. I mean, what where they thinking? But I question the value
> of forking for this particular test. Still, it’s more correct to use
> rev-parse. As your patch uses rev-parse to find gitdir once already,
> we’re not gaining much by globbing instead.
>
> I just ran a benchmark on Cygwin and it takes about 0.5 seconds to run
> four rev-parses.
>
> Perhaps completing them all without checking if they’re valid
> beforehand is the best solution?
I'd still rather see some checking than none at all. (MERGE_HEAD isn't
often applicable, for example.)
In the context I was using to test:
$ git log <Tab>
It appears to be completing both tags and branches, and it already forks
git once to find each of those (@lines 3117 and 3140). Four more forks
(the version calling rev-parse on each name) might be excessive, but one
doesn't seem so bad (the version calling it once to get --git-dir) for
the added filtering.
rev-parse each: 100% correct, only much slower on Win32 (~.5s)
rev-parse dir + glob: mostly correct, a-bit-slower on Win32 (~.125s)
always-complete: usually wrong, no slower
Really, I feel like the forking cost would prohibit _git from being
useful on Win32 in the first place, so it seems an odd metric to use.
(Are there other systems where the fork is expensive? AFAIK, anything
Unix-like shouldn't incur too much cost for it, which leaves Win32 and
...?)
--
Best,
Ben
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-03-29 0:07 ` Simon Ruderich
@ 2010-05-01 8:28 ` Simon Ruderich
2010-05-01 10:46 ` Frank Terbeck
0 siblings, 1 reply; 15+ messages in thread
From: Simon Ruderich @ 2010-05-01 8:28 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: text/plain, Size: 630 bytes --]
On Mon, Mar 29, 2010 at 02:07:15AM +0200, Simon Ruderich wrote:
> On Mon, Mar 22, 2010 at 10:27:29AM +0100, Nikolai Weibull wrote:
>> [snip]
>>
>> Perhaps completing them all without checking if they’re valid
>> beforehand is the best solution?
>
> I think so too, it's simple and works. And as all these names are
> uppercase they shouldn't interfere with normal completion.
>
> Thanks,
> Simon
Could please somebody commit one of the possible solutions (I
would prefer no forking if possible).
Thanks,
Simon
--
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9
[-- Attachment #2: Type: application/pgp-signature, Size: 835 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-05-01 8:28 ` Simon Ruderich
@ 2010-05-01 10:46 ` Frank Terbeck
2010-05-01 12:12 ` Simon Ruderich
0 siblings, 1 reply; 15+ messages in thread
From: Frank Terbeck @ 2010-05-01 10:46 UTC (permalink / raw)
To: zsh-workers
Simon Ruderich wrote:
> On Mon, Mar 29, 2010 at 02:07:15AM +0200, Simon Ruderich wrote:
>> On Mon, Mar 22, 2010 at 10:27:29AM +0100, Nikolai Weibull wrote:
>>> Perhaps completing them all without checking if they’re valid
>>> beforehand is the best solution?
>>
>> I think so too, it's simple and works. And as all these names are
>> uppercase they shouldn't interfere with normal completion.
>
> Could please somebody commit one of the possible solutions (I
> would prefer no forking if possible).
Um, I didn't follow this thread closely; which one? Benjamin's patch
from workers-27817¹?
Regards, Frank
¹ <http://www.zsh.org/mla/workers/2010/msg00269.html>
--
In protocol design, perfection has been reached not when there is
nothing left to add, but when there is nothing left to take away.
-- RFC 1925
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-05-01 10:46 ` Frank Terbeck
@ 2010-05-01 12:12 ` Simon Ruderich
2010-05-01 12:17 ` Frank Terbeck
0 siblings, 1 reply; 15+ messages in thread
From: Simon Ruderich @ 2010-05-01 12:12 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: text/plain, Size: 498 bytes --]
On Sat, May 01, 2010 at 12:46:00PM +0200, Frank Terbeck wrote:
> Um, I didn't follow this thread closely; which one? Benjamin's patch
> from workers-27817¹?
>
> Regards, Frank
>
> ¹ <http://www.zsh.org/mla/workers/2010/msg00269.html>
I would prefer mine because of the speed penalty of Benjamin's
patch. Checking if the file exists in .git would be another
possibility.
Thanks,
Simon
--
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9
[-- Attachment #2: Type: application/pgp-signature, Size: 835 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-05-01 12:12 ` Simon Ruderich
@ 2010-05-01 12:17 ` Frank Terbeck
2010-05-01 20:32 ` Simon Ruderich
0 siblings, 1 reply; 15+ messages in thread
From: Frank Terbeck @ 2010-05-01 12:17 UTC (permalink / raw)
To: Simon Ruderich; +Cc: zsh-workers
Simon Ruderich wrote:
> On Sat, May 01, 2010 at 12:46:00PM +0200, Frank Terbeck wrote:
>> Um, I didn't follow this thread closely; which one? Benjamin's patch
>> from workers-27817¹?
[...]
>> ¹ <http://www.zsh.org/mla/workers/2010/msg00269.html>
>
> I would prefer mine because of the speed penalty of Benjamin's
> patch. Checking if the file exists in .git would be another
> possibility.
And that would be the one from workers-27813¹?
Regards, Frank
¹ <http://www.zsh.org/mla/workers/2010/msg00265.html>
--
In protocol design, perfection has been reached not when there is
nothing left to add, but when there is nothing left to take away.
-- RFC 1925
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-05-01 12:17 ` Frank Terbeck
@ 2010-05-01 20:32 ` Simon Ruderich
2010-05-02 9:04 ` Frank Terbeck
0 siblings, 1 reply; 15+ messages in thread
From: Simon Ruderich @ 2010-05-01 20:32 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: text/plain, Size: 496 bytes --]
On Sat, May 01, 2010 at 02:17:19PM +0200, Frank Terbeck wrote:
>> I would prefer mine because of the speed penalty of Benjamin's
>> patch. Checking if the file exists in .git would be another
>> possibility.
>
> And that would be the one from workers-27813¹?
>
> Regards, Frank
>
> ¹ <http://www.zsh.org/mla/workers/2010/msg00265.html>
Ah sorry. Yes, that's the one.
Thanks,
Simon
--
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9
[-- Attachment #2: Type: application/pgp-signature, Size: 835 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-05-01 20:32 ` Simon Ruderich
@ 2010-05-02 9:04 ` Frank Terbeck
2010-05-03 14:51 ` Benjamin R. Haskell
0 siblings, 1 reply; 15+ messages in thread
From: Frank Terbeck @ 2010-05-02 9:04 UTC (permalink / raw)
To: zsh-workers
Simon Ruderich wrote:
> On Sat, May 01, 2010 at 02:17:19PM +0200, Frank Terbeck wrote:
>>> I would prefer mine because of the speed penalty of Benjamin's
>>> patch. Checking if the file exists in .git would be another
>>> possibility.
>>
>> And that would be the one from workers-27813¹?
>>
>> Regards, Frank
>>
>> ¹ <http://www.zsh.org/mla/workers/2010/msg00265.html>
>
> Ah sorry. Yes, that's the one.
Committed this one. Actually checking whether the head symbols are
available at any time probably requires something like this:
gdir="$(git rev-parse --git-dir)"
[[ -f ${gdir}/ORIG_HEAD ]] && ...
[[ -f ${gdir}/FETCH_HEAD ]] && ...
...
I don't know if it's worth the additional fork.
Regards, Frank
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD.
2010-05-02 9:04 ` Frank Terbeck
@ 2010-05-03 14:51 ` Benjamin R. Haskell
0 siblings, 0 replies; 15+ messages in thread
From: Benjamin R. Haskell @ 2010-05-03 14:51 UTC (permalink / raw)
To: Frank Terbeck; +Cc: zsh-workers
[-- Attachment #1: Type: TEXT/PLAIN, Size: 2525 bytes --]
On Sun, 2 May 2010, Frank Terbeck wrote:
> Simon Ruderich wrote:
> > On Sat, May 01, 2010 at 02:17:19PM +0200, Frank Terbeck wrote:
> >>> I would prefer mine because of the speed penalty of Benjamin's
> >>> patch. Checking if the file exists in .git would be another
> >>> possibility.
> >>
> >> And that would be the one from workers-27813¹?
> >>
> >> Regards, Frank
> >>
> >> ¹ <http://www.zsh.org/mla/workers/2010/msg00265.html>
> >
> > Ah sorry. Yes, that's the one.
>
> Committed this one. Actually checking whether the head symbols are
> available at any time probably requires something like this:
>
> gdir="$(git rev-parse --git-dir)"
> [[ -f ${gdir}/ORIG_HEAD ]] && ...
> [[ -f ${gdir}/FETCH_HEAD ]] && ...
> ...
>
> I don't know if it's worth the additional fork.
That's essentially what my 'compromise' patch does. The one from
workers-27817 [links below].
==== this portion: ====
+ symbolic_heads=()
+ gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
+ __git_command_successful && symbolic_heads=( $gitdir/{,{ORIG,FETCH,MERGE}_}HEAD(N:t) )
=======================
As stated before, I think the fork is worth it. The three options were:
[27813]. always-complete: usually-incorrect, 0 extra forks
[27817]. --git-dir + filesystem tests: possibly-incorrect, 1 extra fork
[27814]. rev-parse each name: always correct, 4 extra forks
Personally, I think the 4 extra forks are worth it (The particular
execution path that this alters already does two _call_program git
forks). But, I'm not stuck on a system where forking is expensive (100
git forks takes ~1sec)[2], so I see the need for the compromise [27817].
[27813] is usually incorrect (depending on your workflow) because
FETCH_HEAD, ORIG_HEAD, and MERGE_HEAD come and go depending on what
actions you take on your repository.
The reason [27817] is possibly-incorrect is that the .git/*HEAD files
can exist even if the branch hasn't been born. (e.g. try 'git rev-parse
HEAD' in a newly-init'ed repo, even though .git/HEAD exists)
But, it's rare enough that the correctness vs. speed tradeoff seems
reasonable.
--
Best,
Ben
[27813] http://www.zsh.org/mla/workers/2010/msg00265.html
[27814] http://www.zsh.org/mla/workers/2010/msg00266.html
[27817] http://www.zsh.org/mla/workers/2010/msg00269.html
[2]
$ date ; r=( HEAD ORIG_HEAD --git-dir ) ; for l in {1..100} ; git rev-parse $r[$(( 1 + $RANDOM % $#r ))] 2>/dev/null >/dev/null ; date
Mon May 3 10:50:06 EDT 2010
Mon May 3 10:50:07 EDT 2010
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2010-05-03 15:01 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-21 17:23 [PATCH] _git: Also complete FETCH_HEAD, ORIG_HEAD and MERGE_HEAD Simon Ruderich
2010-03-21 19:48 ` Benjamin R. Haskell
2010-03-21 20:17 ` Nikolai Weibull
2010-03-22 1:25 ` Simon Ruderich
2010-03-22 2:30 ` Benjamin R. Haskell
2010-03-22 9:27 ` Nikolai Weibull
2010-03-29 0:07 ` Simon Ruderich
2010-05-01 8:28 ` Simon Ruderich
2010-05-01 10:46 ` Frank Terbeck
2010-05-01 12:12 ` Simon Ruderich
2010-05-01 12:17 ` Frank Terbeck
2010-05-01 20:32 ` Simon Ruderich
2010-05-02 9:04 ` Frank Terbeck
2010-05-03 14:51 ` Benjamin R. Haskell
2010-03-29 13:56 ` Benjamin R. Haskell
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).