Add "--branches", "--tags" and "--remotes" options to git-rev-parse.
"git branch" uses "rev-parse --all" and becomes much too slow when there are many tags (it scans all refs). Use the new "--branches" option of rev-parse to speed things up. Signed-off-by: Sean Estabrooks <seanlkml@sympatico.ca> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
23
refs.c
23
refs.c
@ -114,7 +114,7 @@ int read_ref(const char *filename, unsigned char *sha1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int do_for_each_ref(const char *base, int (*fn)(const char *path, const unsigned char *sha1))
|
||||
static int do_for_each_ref(const char *base, int (*fn)(const char *path, const unsigned char *sha1), int trim)
|
||||
{
|
||||
int retval = 0;
|
||||
DIR *dir = opendir(git_path("%s", base));
|
||||
@ -146,7 +146,7 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, const u
|
||||
if (stat(git_path("%s", path), &st) < 0)
|
||||
continue;
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
retval = do_for_each_ref(path, fn);
|
||||
retval = do_for_each_ref(path, fn, trim);
|
||||
if (retval)
|
||||
break;
|
||||
continue;
|
||||
@ -160,7 +160,7 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, const u
|
||||
"commit object!", path);
|
||||
continue;
|
||||
}
|
||||
retval = fn(path, sha1);
|
||||
retval = fn(path + trim, sha1);
|
||||
if (retval)
|
||||
break;
|
||||
}
|
||||
@ -180,7 +180,22 @@ int head_ref(int (*fn)(const char *path, const unsigned char *sha1))
|
||||
|
||||
int for_each_ref(int (*fn)(const char *path, const unsigned char *sha1))
|
||||
{
|
||||
return do_for_each_ref("refs", fn);
|
||||
return do_for_each_ref("refs", fn, 0);
|
||||
}
|
||||
|
||||
int for_each_tag_ref(int (*fn)(const char *path, const unsigned char *sha1))
|
||||
{
|
||||
return do_for_each_ref("refs/tags", fn, 10);
|
||||
}
|
||||
|
||||
int for_each_branch_ref(int (*fn)(const char *path, const unsigned char *sha1))
|
||||
{
|
||||
return do_for_each_ref("refs/heads", fn, 11);
|
||||
}
|
||||
|
||||
int for_each_remote_ref(int (*fn)(const char *path, const unsigned char *sha1))
|
||||
{
|
||||
return do_for_each_ref("refs/remotes", fn, 13);
|
||||
}
|
||||
|
||||
static char *ref_file_name(const char *ref)
|
||||
|
Reference in New Issue
Block a user