From 72b64b44e77112b93e7b046e54c62a01e69cef3d Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Wed, 25 Apr 2012 00:45:08 +0200 Subject: [PATCH] get_ref_dir(): use a strbuf to hold refname This simplifies the bookkeeping and allows an (artificial) restriction on refname component length to be removed. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano --- refs.c | 54 ++++++++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/refs.c b/refs.c index d539241d9..ed6d84230 100644 --- a/refs.c +++ b/refs.c @@ -756,7 +756,7 @@ static void get_ref_dir(struct ref_cache *refs, const char *base, const char *path; struct dirent *de; int baselen; - char *refname; + struct strbuf refname; if (*refs->name) path = git_path_submodule(refs->name, "%s", base); @@ -768,50 +768,48 @@ static void get_ref_dir(struct ref_cache *refs, const char *base, return; baselen = strlen(base); - refname = xmalloc(baselen + 257); - - memcpy(refname, base, baselen); - if (baselen && base[baselen-1] != '/') - refname[baselen++] = '/'; + strbuf_init(&refname, baselen + 257); + strbuf_add(&refname, base, baselen); + if (baselen && base[baselen-1] != '/') { + strbuf_addch(&refname, '/'); + baselen++; + } while ((de = readdir(d)) != NULL) { unsigned char sha1[20]; struct stat st; int flag; - int namelen; const char *refdir; if (de->d_name[0] == '.') continue; - namelen = strlen(de->d_name); - if (namelen > 255) - continue; if (has_extension(de->d_name, ".lock")) continue; - memcpy(refname + baselen, de->d_name, namelen+1); + strbuf_addstr(&refname, de->d_name); refdir = *refs->name - ? git_path_submodule(refs->name, "%s", refname) - : git_path("%s", refname); - if (stat(refdir, &st) < 0) - continue; - if (S_ISDIR(st.st_mode)) { - get_ref_dir(refs, refname, dir); - continue; - } - if (*refs->name) { - hashclr(sha1); - flag = 0; - if (resolve_gitlink_ref(refs->name, refname, sha1) < 0) { + ? git_path_submodule(refs->name, "%s", refname.buf) + : git_path("%s", refname.buf); + if (stat(refdir, &st) < 0) { + ; /* silently ignore */ + } else if (S_ISDIR(st.st_mode)) { + get_ref_dir(refs, refname.buf, dir); + } else { + if (*refs->name) { + hashclr(sha1); + flag = 0; + if (resolve_gitlink_ref(refs->name, refname.buf, sha1) < 0) { + hashclr(sha1); + flag |= REF_ISBROKEN; + } + } else if (read_ref_full(refname.buf, sha1, 1, &flag)) { hashclr(sha1); flag |= REF_ISBROKEN; } - } else if (read_ref_full(refname, sha1, 1, &flag)) { - hashclr(sha1); - flag |= REF_ISBROKEN; + add_ref(dir, create_ref_entry(refname.buf, sha1, flag, 1)); } - add_ref(dir, create_ref_entry(refname, sha1, flag, 1)); + strbuf_setlen(&refname, baselen); } - free(refname); + strbuf_release(&refname); closedir(d); } -- 2.26.2