From 723c31fea2f1c4994de837bda9022ffa8b6de1bb Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 5 Jul 2005 11:31:32 -0700 Subject: [PATCH] Add "git_path()" and "head_ref()" helper functions. "git_path()" returns a static pathname pointer into the git directory using a printf-like format specifier. "head_ref()" works like "for_each_ref()", except for just the HEAD. --- cache.h | 1 + fetch-pack.c | 6 +----- refs.c | 9 +++++++++ refs.h | 1 + send-pack.c | 5 +---- sha1_file.c | 28 +++++++++++++++++++++++----- upload-pack.c | 1 + 7 files changed, 37 insertions(+), 14 deletions(-) diff --git a/cache.h b/cache.h index c79c70f71..c84e797fd 100644 --- a/cache.h +++ b/cache.h @@ -158,6 +158,7 @@ extern void rollback_index_file(struct cache_file *); #define TYPE_CHANGED 0x0040 /* Return a statically allocated filename matching the sha1 signature */ +extern char *git_path(const char *fmt, ...); extern char *sha1_file_name(const unsigned char *sha1); /* Read and unpack a sha1 file into memory, write memory to a sha1 file */ diff --git a/fetch-pack.c b/fetch-pack.c index b8367a4d6..a4c1eccf7 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -72,13 +72,9 @@ static int find_common(int fd[2], unsigned char *result_sha1, unsigned char *rem static int get_old_sha1(const char *refname, unsigned char *sha1) { - static char pathname[PATH_MAX]; - const char *git_dir; int fd, ret; - git_dir = gitenv(GIT_DIR_ENVIRONMENT) ? : DEFAULT_GIT_DIR_ENVIRONMENT; - snprintf(pathname, sizeof(pathname), "%s/%s", git_dir, refname); - fd = open(pathname, O_RDONLY); + fd = open(git_path("%s", refname), O_RDONLY); ret = -1; if (fd >= 0) { char buffer[60]; diff --git a/refs.c b/refs.c index 7ccd721a4..6ca04d3b0 100644 --- a/refs.c +++ b/refs.c @@ -68,6 +68,15 @@ static int do_for_each_ref(const char *base, int (*fn)(const char *path, const u return retval; } +int head_ref(int (*fn)(const char *path, const unsigned char *sha1)) +{ + unsigned char sha1[20]; + const char *headpath = git_path("HEAD"); + if (!read_ref(headpath, sha1)) + fn(headpath, sha1); + return do_for_each_ref(get_refs_directory(), fn); +} + int for_each_ref(int (*fn)(const char *path, const unsigned char *sha1)) { return do_for_each_ref(get_refs_directory(), fn); diff --git a/refs.h b/refs.h index a79cb13cd..262559670 100644 --- a/refs.h +++ b/refs.h @@ -5,6 +5,7 @@ * Calls the specified function for each ref file until it returns nonzero, * and returns the value */ +extern int head_ref(int (*fn)(const char *path, const unsigned char *sha1)); extern int for_each_ref(int (*fn)(const char *path, const unsigned char *sha1)); /** Reads the refs file specified into sha1 **/ diff --git a/send-pack.c b/send-pack.c index f098acb5f..7287c3df8 100644 --- a/send-pack.c +++ b/send-pack.c @@ -92,12 +92,9 @@ static int pack_objects(int fd, struct ref *refs) static int read_ref(const char *ref, unsigned char *sha1) { int fd, ret; - static char pathname[PATH_MAX]; char buffer[60]; - const char *git_dir = gitenv(GIT_DIR_ENVIRONMENT) ? : DEFAULT_GIT_DIR_ENVIRONMENT; - snprintf(pathname, sizeof(pathname), "%s/%s", git_dir, ref); - fd = open(pathname, O_RDONLY); + fd = open(git_path("%s", ref), O_RDONLY); if (fd < 0) return -1; ret = -1; diff --git a/sha1_file.c b/sha1_file.c index 8f20e2f82..74dc2aab2 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -102,9 +102,30 @@ char *get_index_file(void) return git_index_file; } -int get_sha1(const char *str, unsigned char *sha1) +char *git_path(const char *fmt, ...) { static char pathname[PATH_MAX]; + va_list args; + int len; + + if (!git_dir) + setup_git_env(); + len = strlen(git_dir); + if (len == 1 && *git_dir == '.') + len = 0; + if (len > PATH_MAX-100) + return "pad-path"; + memcpy(pathname, git_dir, len); + if (len && git_dir[len-1] != '/') + pathname[len++] = '/'; + va_start(args, fmt); + vsnprintf(pathname + len, sizeof(pathname) - len, fmt, args); + va_end(args); + return pathname; +} + +int get_sha1(const char *str, unsigned char *sha1) +{ static const char *prefix[] = { "", "refs", @@ -118,11 +139,8 @@ int get_sha1(const char *str, unsigned char *sha1) if (!get_sha1_hex(str, sha1)) return 0; - if (!git_dir) - setup_git_env(); for (p = prefix; *p; p++) { - snprintf(pathname, sizeof(pathname), "%s/%s/%s", - git_dir, *p, str); + char * pathname = git_path("%s/%s", *p, str); if (!get_sha1_file(pathname, sha1)) return 0; } diff --git a/upload-pack.c b/upload-pack.c index d35c0685c..9edbf51dc 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -153,6 +153,7 @@ static int send_ref(const char *refname, const unsigned char *sha1) static int upload_pack(void) { + head_ref(send_ref); for_each_ref(send_ref); packet_flush(1); nr_needs = receive_needs(); -- 2.30.2