提交 92389416 编写于 作者: J Junio C Hamano

Merge branch 'cc/sha1-file-name'

Code clean-up.

* cc/sha1-file-name:
  sha1_file: improve sha1_file_name() perfs
  sha1_file: remove static strbuf from sha1_file_name()
...@@ -960,12 +960,10 @@ extern void check_repository_format(void); ...@@ -960,12 +960,10 @@ extern void check_repository_format(void);
#define TYPE_CHANGED 0x0040 #define TYPE_CHANGED 0x0040
/* /*
* Return the name of the file in the local object database that would * Put in `buf` the name of the file in the local object database that
* be used to store a loose object with the specified sha1. The * would be used to store a loose object with the specified sha1.
* return value is a pointer to a statically allocated buffer that is
* overwritten each time the function is called.
*/ */
extern const char *sha1_file_name(const unsigned char *sha1); extern void sha1_file_name(struct strbuf *buf, const unsigned char *sha1);
/* /*
* Return an abbreviated sha1 unique within this repository's object database. * Return an abbreviated sha1 unique within this repository's object database.
......
...@@ -544,8 +544,10 @@ static int fetch_object(struct walker *walker, unsigned char *sha1) ...@@ -544,8 +544,10 @@ static int fetch_object(struct walker *walker, unsigned char *sha1)
} else if (hashcmp(obj_req->sha1, req->real_sha1)) { } else if (hashcmp(obj_req->sha1, req->real_sha1)) {
ret = error("File %s has bad hash", hex); ret = error("File %s has bad hash", hex);
} else if (req->rename < 0) { } else if (req->rename < 0) {
ret = error("unable to write sha1 filename %s", struct strbuf buf = STRBUF_INIT;
sha1_file_name(req->sha1)); sha1_file_name(&buf, req->sha1);
ret = error("unable to write sha1 filename %s", buf.buf);
strbuf_release(&buf);
} }
release_http_object_request(req); release_http_object_request(req);
......
...@@ -2168,7 +2168,7 @@ struct http_object_request *new_http_object_request(const char *base_url, ...@@ -2168,7 +2168,7 @@ struct http_object_request *new_http_object_request(const char *base_url,
unsigned char *sha1) unsigned char *sha1)
{ {
char *hex = sha1_to_hex(sha1); char *hex = sha1_to_hex(sha1);
const char *filename; struct strbuf filename = STRBUF_INIT;
char prevfile[PATH_MAX]; char prevfile[PATH_MAX];
int prevlocal; int prevlocal;
char prev_buf[PREV_BUF_SIZE]; char prev_buf[PREV_BUF_SIZE];
...@@ -2180,14 +2180,15 @@ struct http_object_request *new_http_object_request(const char *base_url, ...@@ -2180,14 +2180,15 @@ struct http_object_request *new_http_object_request(const char *base_url,
hashcpy(freq->sha1, sha1); hashcpy(freq->sha1, sha1);
freq->localfile = -1; freq->localfile = -1;
filename = sha1_file_name(sha1); sha1_file_name(&filename, sha1);
snprintf(freq->tmpfile, sizeof(freq->tmpfile), snprintf(freq->tmpfile, sizeof(freq->tmpfile),
"%s.temp", filename); "%s.temp", filename.buf);
snprintf(prevfile, sizeof(prevfile), "%s.prev", filename); snprintf(prevfile, sizeof(prevfile), "%s.prev", filename.buf);
unlink_or_warn(prevfile); unlink_or_warn(prevfile);
rename(freq->tmpfile, prevfile); rename(freq->tmpfile, prevfile);
unlink_or_warn(freq->tmpfile); unlink_or_warn(freq->tmpfile);
strbuf_release(&filename);
if (freq->localfile != -1) if (freq->localfile != -1)
error("fd leakage in start: %d", freq->localfile); error("fd leakage in start: %d", freq->localfile);
...@@ -2302,6 +2303,7 @@ void process_http_object_request(struct http_object_request *freq) ...@@ -2302,6 +2303,7 @@ void process_http_object_request(struct http_object_request *freq)
int finish_http_object_request(struct http_object_request *freq) int finish_http_object_request(struct http_object_request *freq)
{ {
struct stat st; struct stat st;
struct strbuf filename = STRBUF_INIT;
close(freq->localfile); close(freq->localfile);
freq->localfile = -1; freq->localfile = -1;
...@@ -2327,8 +2329,10 @@ int finish_http_object_request(struct http_object_request *freq) ...@@ -2327,8 +2329,10 @@ int finish_http_object_request(struct http_object_request *freq)
unlink_or_warn(freq->tmpfile); unlink_or_warn(freq->tmpfile);
return -1; return -1;
} }
freq->rename =
finalize_object_file(freq->tmpfile, sha1_file_name(freq->sha1)); sha1_file_name(&filename, freq->sha1);
freq->rename = finalize_object_file(freq->tmpfile, filename.buf);
strbuf_release(&filename);
return freq->rename; return freq->rename;
} }
......
...@@ -321,15 +321,11 @@ static void fill_sha1_path(struct strbuf *buf, const unsigned char *sha1) ...@@ -321,15 +321,11 @@ static void fill_sha1_path(struct strbuf *buf, const unsigned char *sha1)
} }
} }
const char *sha1_file_name(const unsigned char *sha1) void sha1_file_name(struct strbuf *buf, const unsigned char *sha1)
{ {
static struct strbuf buf = STRBUF_INIT; strbuf_addstr(buf, get_object_directory());
strbuf_addch(buf, '/');
strbuf_reset(&buf); fill_sha1_path(buf, sha1);
strbuf_addf(&buf, "%s/", get_object_directory());
fill_sha1_path(&buf, sha1);
return buf.buf;
} }
struct strbuf *alt_scratch_buf(struct alternate_object_database *alt) struct strbuf *alt_scratch_buf(struct alternate_object_database *alt)
...@@ -710,7 +706,12 @@ int check_and_freshen_file(const char *fn, int freshen) ...@@ -710,7 +706,12 @@ int check_and_freshen_file(const char *fn, int freshen)
static int check_and_freshen_local(const unsigned char *sha1, int freshen) static int check_and_freshen_local(const unsigned char *sha1, int freshen)
{ {
return check_and_freshen_file(sha1_file_name(sha1), freshen); static struct strbuf buf = STRBUF_INIT;
strbuf_reset(&buf);
sha1_file_name(&buf, sha1);
return check_and_freshen_file(buf.buf, freshen);
} }
static int check_and_freshen_nonlocal(const unsigned char *sha1, int freshen) static int check_and_freshen_nonlocal(const unsigned char *sha1, int freshen)
...@@ -866,8 +867,12 @@ static int stat_sha1_file(const unsigned char *sha1, struct stat *st, ...@@ -866,8 +867,12 @@ static int stat_sha1_file(const unsigned char *sha1, struct stat *st,
const char **path) const char **path)
{ {
struct alternate_object_database *alt; struct alternate_object_database *alt;
static struct strbuf buf = STRBUF_INIT;
strbuf_reset(&buf);
sha1_file_name(&buf, sha1);
*path = buf.buf;
*path = sha1_file_name(sha1);
if (!lstat(*path, st)) if (!lstat(*path, st))
return 0; return 0;
...@@ -891,8 +896,12 @@ static int open_sha1_file(const unsigned char *sha1, const char **path) ...@@ -891,8 +896,12 @@ static int open_sha1_file(const unsigned char *sha1, const char **path)
int fd; int fd;
struct alternate_object_database *alt; struct alternate_object_database *alt;
int most_interesting_errno; int most_interesting_errno;
static struct strbuf buf = STRBUF_INIT;
strbuf_reset(&buf);
sha1_file_name(&buf, sha1);
*path = buf.buf;
*path = sha1_file_name(sha1);
fd = git_open(*path); fd = git_open(*path);
if (fd >= 0) if (fd >= 0)
return fd; return fd;
...@@ -1572,9 +1581,12 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, ...@@ -1572,9 +1581,12 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen,
git_SHA_CTX c; git_SHA_CTX c;
unsigned char parano_sha1[20]; unsigned char parano_sha1[20];
static struct strbuf tmp_file = STRBUF_INIT; static struct strbuf tmp_file = STRBUF_INIT;
const char *filename = sha1_file_name(sha1); static struct strbuf filename = STRBUF_INIT;
strbuf_reset(&filename);
sha1_file_name(&filename, sha1);
fd = create_tmpfile(&tmp_file, filename); fd = create_tmpfile(&tmp_file, filename.buf);
if (fd < 0) { if (fd < 0) {
if (errno == EACCES) if (errno == EACCES)
return error("insufficient permission for adding an object to repository database %s", get_object_directory()); return error("insufficient permission for adding an object to repository database %s", get_object_directory());
...@@ -1627,7 +1639,7 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, ...@@ -1627,7 +1639,7 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen,
warning_errno("failed utime() on %s", tmp_file.buf); warning_errno("failed utime() on %s", tmp_file.buf);
} }
return finalize_object_file(tmp_file.buf, filename); return finalize_object_file(tmp_file.buf, filename.buf);
} }
static int freshen_loose_object(const unsigned char *sha1) static int freshen_loose_object(const unsigned char *sha1)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册