From efd0201684c6e9bf663811dc849590b8fe27b8b2 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 6 Jun 2006 08:46:23 -0700 Subject: [PATCH 1/6] git-format-patch: add --output-directory long option again Additionally notices and complains to an -o option without directory or a duplicated -o option, -o and --stdout given together. Also delays the creation of directory until all arguments are parsed, so that the command does not leave an empty directory behind when it exits after seeing an unrelated invalid option. [jc: originally from Dennis Stosberg but with minor fixes, and documentation updates from Dennis.] Signed-off-by: Junio C Hamano --- Documentation/git-format-patch.txt | 3 +-- builtin-log.c | 26 ++++++++++++++++---------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 493cac22db..4ca0014dac 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -40,8 +40,7 @@ OPTIONS ------- -o|--output-directory :: Use to store the resulting files, instead of the - current working directory. This option is ignored if - --stdout is specified. + current working directory. -n|--numbered:: Name output in '[PATCH n/m]' format. diff --git a/builtin-log.c b/builtin-log.c index 6612f4c2a8..29a885121d 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -103,7 +103,7 @@ static int git_format_config(const char *var, const char *value) static FILE *realstdout = NULL; -static char *output_directory = NULL; +static const char *output_directory = NULL; static void reopen_stdout(struct commit *commit, int nr, int keep_subject) { @@ -206,14 +206,14 @@ int cmd_format_patch(int argc, const char **argv, char **envp) keep_subject = 1; rev.total = -1; } - else if (!strcmp(argv[i], "-o")) { - if (argc < 3) - die ("Which directory?"); - if (mkdir(argv[i + 1], 0777) < 0 && errno != EEXIST) - die("Could not create directory %s", - argv[i + 1]); - output_directory = strdup(argv[i + 1]); + else if (!strcmp(argv[i], "--output-directory") || + !strcmp(argv[i], "-o")) { i++; + if (argc <= i) + die("Which directory?"); + if (output_directory) + die("Two output directories?"); + output_directory = argv[i]; } else if (!strcmp(argv[i], "--signoff") || !strcmp(argv[i], "-s")) { @@ -243,6 +243,14 @@ int cmd_format_patch(int argc, const char **argv, char **envp) if (argc > 1) die ("unrecognized argument: %s", argv[1]); + if (output_directory) { + if (use_stdout) + die("standard output, or directory, which one?"); + if (mkdir(output_directory, 0777) < 0 && errno != EEXIST) + die("Could not create directory %s", + output_directory); + } + if (rev.pending_objects && rev.pending_objects->next == NULL) { rev.pending_objects->item->flags |= UNINTERESTING; add_head(&rev); @@ -293,8 +301,6 @@ int cmd_format_patch(int argc, const char **argv, char **envp) if (!use_stdout) fclose(stdout); } - if (output_directory) - free(output_directory); free(list); return 0; } From b3ca4e4ebba6915ea534c4b82cfc5d6f10b4c283 Mon Sep 17 00:00:00 2001 From: Nick Hengeveld Date: Tue, 6 Jun 2006 09:41:32 -0700 Subject: [PATCH 2/6] HTTP cleanup Fix broken build when USE_CURL_MULTI is not defined, as noted by Becky Bruce. During cleanup, free header slist that was created during init, as noted by Junio. Signed-off-by: Nick Hengeveld Signed-off-by: Junio C Hamano --- http-push.c | 8 ++++++++ http.c | 7 ++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/http-push.c b/http-push.c index b1c018a089..40524a8593 100644 --- a/http-push.c +++ b/http-push.c @@ -788,6 +788,7 @@ static void finish_request(struct transfer_request *request) } } +#ifdef USE_CURL_MULTI void fill_active_slots(void) { struct transfer_request *request = request_queue_head; @@ -821,6 +822,7 @@ void fill_active_slots(void) slot = slot->next; } } +#endif static void get_remote_object_list(unsigned char parent); @@ -851,8 +853,10 @@ static void add_fetch_request(struct object *obj) request->next = request_queue_head; request_queue_head = request; +#ifdef USE_CURL_MULTI fill_active_slots(); step_active_slots(); +#endif } static int add_send_request(struct object *obj, struct remote_lock *lock) @@ -889,8 +893,10 @@ static int add_send_request(struct object *obj, struct remote_lock *lock) request->next = request_queue_head; request_queue_head = request; +#ifdef USE_CURL_MULTI fill_active_slots(); step_active_slots(); +#endif return 1; } @@ -2523,7 +2529,9 @@ int main(int argc, char **argv) if (objects_to_send) fprintf(stderr, " sending %d objects\n", objects_to_send); +#ifdef USE_CURL_MULTI fill_active_slots(); +#endif finish_all_active_slots(); /* Update the remote branch if all went well */ diff --git a/http.c b/http.c index 146cf7bf36..08769cc7cd 100644 --- a/http.c +++ b/http.c @@ -286,7 +286,8 @@ void http_cleanup(void) curl_multi_cleanup(curlm); #endif curl_global_cleanup(); - + + curl_slist_free_all(pragma_header); } struct active_request_slot *get_active_slot(void) @@ -438,11 +439,15 @@ void release_active_slot(struct active_request_slot *slot) { closedown_active_slot(slot); if (slot->curl) { +#ifdef USE_CURL_MULTI curl_multi_remove_handle(curlm, slot->curl); +#endif curl_easy_cleanup(slot->curl); slot->curl = NULL; } +#ifdef USE_CURL_MULTI fill_active_slots(); +#endif } static void finish_active_slot(struct active_request_slot *slot) From dd8239f997962d94162790039b008acb6068a242 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 6 Jun 2006 14:26:57 -0700 Subject: [PATCH 3/6] HTTP cleanup This ifdef's out more functions that are not used while !USE_MULTI in http code. Also the dependency of http related objects on http.h header file was missing in the Makefile. Signed-off-by: Junio C Hamano --- Makefile | 3 ++- http-push.c | 70 +++++++++++++++++++++++++++-------------------------- 2 files changed, 38 insertions(+), 35 deletions(-) diff --git a/Makefile b/Makefile index 004c2169c9..f802043aa9 100644 --- a/Makefile +++ b/Makefile @@ -552,7 +552,7 @@ http.o: http.c $(CC) -o $*.o -c $(ALL_CFLAGS) -DGIT_USER_AGENT='"git/$(GIT_VERSION)"' $< ifdef NO_EXPAT -http-fetch.o: http-fetch.c +http-fetch.o: http-fetch.c http.h $(CC) -o $*.o -c $(ALL_CFLAGS) -DNO_EXPAT $< endif @@ -576,6 +576,7 @@ git-ssh-push$X: rsh.o git-imap-send$X: imap-send.o $(LIB_FILE) +http.o http-fetch.o http-push.o: http.h git-http-fetch$X: fetch.o http.o http-fetch.o $(LIB_FILE) $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT) diff --git a/http-push.c b/http-push.c index 40524a8593..b39b36b767 100644 --- a/http-push.c +++ b/http-push.c @@ -186,6 +186,7 @@ static void process_response(void *callback_data) finish_request(request); } +#ifdef USE_CURL_MULTI static size_t fwrite_sha1_file(void *ptr, size_t eltsize, size_t nmemb, void *data) { @@ -349,6 +350,41 @@ static void start_fetch_loose(struct transfer_request *request) } } +static void start_mkcol(struct transfer_request *request) +{ + char *hex = sha1_to_hex(request->obj->sha1); + struct active_request_slot *slot; + char *posn; + + request->url = xmalloc(strlen(remote->url) + 13); + strcpy(request->url, remote->url); + posn = request->url + strlen(remote->url); + strcpy(posn, "objects/"); + posn += 8; + memcpy(posn, hex, 2); + posn += 2; + strcpy(posn, "/"); + + slot = get_active_slot(); + slot->callback_func = process_response; + slot->callback_data = request; + curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1); /* undo PUT setup */ + curl_easy_setopt(slot->curl, CURLOPT_URL, request->url); + curl_easy_setopt(slot->curl, CURLOPT_ERRORBUFFER, request->errorstr); + curl_easy_setopt(slot->curl, CURLOPT_CUSTOMREQUEST, DAV_MKCOL); + curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_null); + + if (start_active_slot(slot)) { + request->slot = slot; + request->state = RUN_MKCOL; + } else { + request->state = ABORTED; + free(request->url); + request->url = NULL; + } +} +#endif + static void start_fetch_packed(struct transfer_request *request) { char *url; @@ -438,40 +474,6 @@ static void start_fetch_packed(struct transfer_request *request) } } -static void start_mkcol(struct transfer_request *request) -{ - char *hex = sha1_to_hex(request->obj->sha1); - struct active_request_slot *slot; - char *posn; - - request->url = xmalloc(strlen(remote->url) + 13); - strcpy(request->url, remote->url); - posn = request->url + strlen(remote->url); - strcpy(posn, "objects/"); - posn += 8; - memcpy(posn, hex, 2); - posn += 2; - strcpy(posn, "/"); - - slot = get_active_slot(); - slot->callback_func = process_response; - slot->callback_data = request; - curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1); /* undo PUT setup */ - curl_easy_setopt(slot->curl, CURLOPT_URL, request->url); - curl_easy_setopt(slot->curl, CURLOPT_ERRORBUFFER, request->errorstr); - curl_easy_setopt(slot->curl, CURLOPT_CUSTOMREQUEST, DAV_MKCOL); - curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_null); - - if (start_active_slot(slot)) { - request->slot = slot; - request->state = RUN_MKCOL; - } else { - request->state = ABORTED; - free(request->url); - request->url = NULL; - } -} - static void start_put(struct transfer_request *request) { char *hex = sha1_to_hex(request->obj->sha1); From 021b6e454944a4fba878651ebf9bfe0a3f6c3077 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 6 Jun 2006 12:51:49 -0700 Subject: [PATCH 4/6] Make index file locking code reusable to others. The framework to create lockfiles that are removed at exit is first used to reliably write the index file, but it is applicable to other things, so stop calling it "cache_file". This also rewords a few remaining error message that called the index file "cache file". Signed-off-by: Junio C Hamano --- Makefile | 2 +- builtin-add.c | 8 +++---- builtin-apply.c | 14 +++++++---- builtin-read-tree.c | 8 +++---- builtin-rm.c | 6 ++--- cache.h | 12 +++++----- checkout-index.c | 13 +++++------ index.c | 57 --------------------------------------------- lockfile.c | 57 +++++++++++++++++++++++++++++++++++++++++++++ update-index.c | 10 ++++---- write-tree.c | 6 ++--- 11 files changed, 98 insertions(+), 95 deletions(-) delete mode 100644 index.c create mode 100644 lockfile.c diff --git a/Makefile b/Makefile index f802043aa9..265a716704 100644 --- a/Makefile +++ b/Makefile @@ -210,7 +210,7 @@ DIFF_OBJS = \ LIB_OBJS = \ blob.o commit.o connect.o csum-file.o cache-tree.o base85.o \ - date.o diff-delta.o entry.o exec_cmd.o ident.o index.o \ + date.o diff-delta.o entry.o exec_cmd.o ident.o lockfile.o \ object.o pack-check.o patch-delta.o path.o pkt-line.o \ quote.o read-cache.o refs.o run-command.o dir.o \ server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \ diff --git a/builtin-add.c b/builtin-add.c index 02fe38b0c4..bfbbb1bf52 100644 --- a/builtin-add.c +++ b/builtin-add.c @@ -122,7 +122,7 @@ static int add_file_to_index(const char *path, int verbose) return 0; } -static struct cache_file cache_file; +static struct lock_file lock_file; int cmd_add(int argc, const char **argv, char **envp) { @@ -134,9 +134,9 @@ int cmd_add(int argc, const char **argv, char **envp) git_config(git_default_config); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); if (newfd < 0) - die("unable to create new cachefile"); + die("unable to create new index file"); if (read_cache() < 0) die("index file corrupt"); @@ -181,7 +181,7 @@ int cmd_add(int argc, const char **argv, char **envp) if (active_cache_changed) { if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) + commit_lock_file(&lock_file)) die("Unable to write new index file"); } diff --git a/builtin-apply.c b/builtin-apply.c index 6a4fb9663d..e113c74dd8 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -2072,7 +2072,7 @@ static void write_out_results(struct patch *list, int skipped_patch) } } -static struct cache_file cache_file; +static struct lock_file lock_file; static struct excludes { struct excludes *next; @@ -2133,8 +2133,12 @@ static int apply_patch(int fd, const char *filename) apply = 0; write_index = check_index && apply; - if (write_index && newfd < 0) - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + if (write_index && newfd < 0) { + newfd = hold_lock_file_for_update(&lock_file, + get_index_file()); + if (newfd < 0) + die("unable to create new index file"); + } if (check_index) { if (read_cache() < 0) die("unable to read index file"); @@ -2312,8 +2316,8 @@ int cmd_apply(int argc, const char **argv, char **envp) if (write_index) { if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) - die("Unable to write new cachefile"); + commit_lock_file(&lock_file)) + die("Unable to write new index file"); } return 0; diff --git a/builtin-read-tree.c b/builtin-read-tree.c index 8d1a22d373..bb50fbd274 100644 --- a/builtin-read-tree.c +++ b/builtin-read-tree.c @@ -853,7 +853,7 @@ static void prime_cache_tree(void) static const char read_tree_usage[] = "git-read-tree ( | -m [--aggressive] [-u | -i] [ []])"; -static struct cache_file cache_file; +static struct lock_file lock_file; int cmd_read_tree(int argc, const char **argv, char **envp) { @@ -864,9 +864,9 @@ int cmd_read_tree(int argc, const char **argv, char **envp) setup_git_directory(); git_config(git_default_config); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); if (newfd < 0) - die("unable to create new cachefile"); + die("unable to create new index file"); git_config(git_default_config); @@ -981,7 +981,7 @@ int cmd_read_tree(int argc, const char **argv, char **envp) } if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) + commit_lock_file(&lock_file)) die("unable to write new index file"); return 0; } diff --git a/builtin-rm.c b/builtin-rm.c index e7793a20f5..ef2f8b5d09 100644 --- a/builtin-rm.c +++ b/builtin-rm.c @@ -41,7 +41,7 @@ static int remove_file(const char *name) return ret; } -static struct cache_file cache_file; +static struct lock_file lock_file; int cmd_rm(int argc, const char **argv, char **envp) { @@ -53,7 +53,7 @@ int cmd_rm(int argc, const char **argv, char **envp) git_config(git_default_config); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); if (newfd < 0) die("unable to create new index file"); @@ -144,7 +144,7 @@ int cmd_rm(int argc, const char **argv, char **envp) if (active_cache_changed) { if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) + commit_lock_file(&lock_file)) die("Unable to write new index file"); } diff --git a/cache.h b/cache.h index d530af97cc..d5d7fe4f8c 100644 --- a/cache.h +++ b/cache.h @@ -167,13 +167,13 @@ extern void fill_stat_cache_info(struct cache_entry *ce, struct stat *st); #define REFRESH_IGNORE_MISSING 0x0008 /* ignore non-existent */ extern int refresh_cache(unsigned int flags); -struct cache_file { - struct cache_file *next; - char lockfile[PATH_MAX]; +struct lock_file { + struct lock_file *next; + char filename[PATH_MAX]; }; -extern int hold_index_file_for_update(struct cache_file *, const char *path); -extern int commit_index_file(struct cache_file *); -extern void rollback_index_file(struct cache_file *); +extern int hold_lock_file_for_update(struct lock_file *, const char *path); +extern int commit_lock_file(struct lock_file *); +extern void rollback_lock_file(struct lock_file *); /* Environment bits from configuration mechanism */ extern int trust_executable_bit; diff --git a/checkout-index.c b/checkout-index.c index 9876af6fd6..ea40bc29be 100644 --- a/checkout-index.c +++ b/checkout-index.c @@ -168,7 +168,7 @@ static int checkout_all(void) static const char checkout_cache_usage[] = "git-checkout-index [-u] [-q] [-a] [-f] [-n] [--stage=[123]|all] [--prefix=] [--temp] [--] ..."; -static struct cache_file cache_file; +static struct lock_file lock_file; int main(int argc, char **argv) { @@ -211,9 +211,8 @@ int main(int argc, char **argv) if (!strcmp(arg, "-u") || !strcmp(arg, "--index")) { state.refresh_cache = 1; if (newfd < 0) - newfd = hold_index_file_for_update - (&cache_file, - get_index_file()); + newfd = hold_lock_file_for_update + (&lock_file, get_index_file()); if (newfd < 0) die("cannot open index.lock file."); continue; @@ -262,7 +261,7 @@ int main(int argc, char **argv) */ if (state.refresh_cache) { close(newfd); newfd = -1; - rollback_index_file(&cache_file); + rollback_lock_file(&lock_file); } state.refresh_cache = 0; } @@ -312,7 +311,7 @@ int main(int argc, char **argv) if (0 <= newfd && (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file))) - die("Unable to write new cachefile"); + commit_lock_file(&lock_file))) + die("Unable to write new index file"); return 0; } diff --git a/index.c b/index.c deleted file mode 100644 index f92b960ae4..0000000000 --- a/index.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2005, Junio C Hamano - */ -#include -#include "cache.h" - -static struct cache_file *cache_file_list; - -static void remove_lock_file(void) -{ - while (cache_file_list) { - if (cache_file_list->lockfile[0]) - unlink(cache_file_list->lockfile); - cache_file_list = cache_file_list->next; - } -} - -static void remove_lock_file_on_signal(int signo) -{ - remove_lock_file(); - signal(SIGINT, SIG_DFL); - raise(signo); -} - -int hold_index_file_for_update(struct cache_file *cf, const char *path) -{ - int fd; - sprintf(cf->lockfile, "%s.lock", path); - fd = open(cf->lockfile, O_RDWR | O_CREAT | O_EXCL, 0666); - if (fd >=0 && !cf->next) { - cf->next = cache_file_list; - cache_file_list = cf; - signal(SIGINT, remove_lock_file_on_signal); - atexit(remove_lock_file); - } - return fd; -} - -int commit_index_file(struct cache_file *cf) -{ - char indexfile[PATH_MAX]; - int i; - strcpy(indexfile, cf->lockfile); - i = strlen(indexfile) - 5; /* .lock */ - indexfile[i] = 0; - i = rename(cf->lockfile, indexfile); - cf->lockfile[0] = 0; - return i; -} - -void rollback_index_file(struct cache_file *cf) -{ - if (cf->lockfile[0]) - unlink(cf->lockfile); - cf->lockfile[0] = 0; -} - diff --git a/lockfile.c b/lockfile.c new file mode 100644 index 0000000000..9bc60837aa --- /dev/null +++ b/lockfile.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2005, Junio C Hamano + */ +#include +#include "cache.h" + +static struct lock_file *lock_file_list; + +static void remove_lock_file(void) +{ + while (lock_file_list) { + if (lock_file_list->filename[0]) + unlink(lock_file_list->filename); + lock_file_list = lock_file_list->next; + } +} + +static void remove_lock_file_on_signal(int signo) +{ + remove_lock_file(); + signal(SIGINT, SIG_DFL); + raise(signo); +} + +int hold_lock_file_for_update(struct lock_file *lk, const char *path) +{ + int fd; + sprintf(lk->filename, "%s.lock", path); + fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666); + if (fd >=0 && !lk->next) { + lk->next = lock_file_list; + lock_file_list = lk; + signal(SIGINT, remove_lock_file_on_signal); + atexit(remove_lock_file); + } + return fd; +} + +int commit_lock_file(struct lock_file *lk) +{ + char result_file[PATH_MAX]; + int i; + strcpy(result_file, lk->filename); + i = strlen(result_file) - 5; /* .lock */ + result_file[i] = 0; + i = rename(lk->filename, result_file); + lk->filename[0] = 0; + return i; +} + +void rollback_lock_file(struct lock_file *lk) +{ + if (lk->filename[0]) + unlink(lk->filename); + lk->filename[0] = 0; +} + diff --git a/update-index.c b/update-index.c index 956b6b34f9..fbccc4a67b 100644 --- a/update-index.c +++ b/update-index.c @@ -186,7 +186,7 @@ static void chmod_path(int flip, const char *path) die("git-update-index: cannot chmod %cx '%s'", flip, path); } -static struct cache_file cache_file; +static struct lock_file lock_file; static void update_one(const char *path, const char *prefix, int prefix_length) { @@ -489,9 +489,9 @@ int main(int argc, const char **argv) git_config(git_default_config); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); if (newfd < 0) - die("unable to create new cachefile"); + die("unable to create new index file"); entries = read_cache(); if (entries < 0) @@ -645,8 +645,8 @@ int main(int argc, const char **argv) finish: if (active_cache_changed) { if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) - die("Unable to write new cachefile"); + commit_lock_file(&lock_file)) + die("Unable to write new index file"); } return has_errors ? 1 : 0; diff --git a/write-tree.c b/write-tree.c index 7a4f691d8a..d6a605893d 100644 --- a/write-tree.c +++ b/write-tree.c @@ -11,7 +11,7 @@ static int missing_ok = 0; static const char write_tree_usage[] = "git-write-tree [--missing-ok]"; -static struct cache_file cache_file; +static struct lock_file lock_file; int main(int argc, char **argv) { @@ -19,7 +19,7 @@ int main(int argc, char **argv) setup_git_directory(); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); entries = read_cache(); if (argc == 2) { if (!strcmp(argv[1], "--missing-ok")) @@ -45,7 +45,7 @@ int main(int argc, char **argv) die("git-write-tree: error building trees"); if (0 <= newfd) { if (!write_cache(newfd, active_cache, active_nr)) - commit_index_file(&cache_file); + commit_lock_file(&lock_file); } /* Not being able to write is fine -- we are only interested * in updating the cache-tree part, and if the next caller From c33d5174d692b1861e0b2f656e51b80b2b00a23c Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 6 Jun 2006 13:54:14 -0700 Subject: [PATCH 5/6] refs.c: convert it to use lockfile interface. This updates the ref locking code to use creat-rename locking code we use for the index file, so that it can borrow the code to clean things up upon signals and program termination. Signed-off-by: Junio C Hamano --- refs.c | 21 ++++++++++----------- refs.h | 2 +- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/refs.c b/refs.c index eeb1196ec4..24dcba7189 100644 --- a/refs.c +++ b/refs.c @@ -301,19 +301,18 @@ static struct ref_lock* lock_ref_sha1_basic(const char *path, unlock_ref(lock); return NULL; } + lock->lk = xcalloc(1, sizeof(struct lock_file)); lock->ref_file = strdup(path); - lock->lock_file = strdup(mkpath("%s.lock", lock->ref_file)); lock->log_file = strdup(git_path("logs/%s", lock->ref_file + plen)); lock->force_write = lstat(lock->ref_file, &st) && errno == ENOENT; - if (safe_create_leading_directories(lock->lock_file)) - die("unable to create directory for %s", lock->lock_file); - lock->lock_fd = open(lock->lock_file, - O_WRONLY | O_CREAT | O_EXCL, 0666); + if (safe_create_leading_directories(lock->ref_file)) + die("unable to create directory for %s", lock->ref_file); + lock->lock_fd = hold_lock_file_for_update(lock->lk, lock->ref_file); if (lock->lock_fd < 0) { error("Couldn't open lock file %s: %s", - lock->lock_file, strerror(errno)); + lock->lk->filename, strerror(errno)); unlock_ref(lock); return NULL; } @@ -341,12 +340,12 @@ void unlock_ref (struct ref_lock *lock) { if (lock->lock_fd >= 0) { close(lock->lock_fd); - unlink(lock->lock_file); + /* Do not free lock->lk -- atexit() still looks at them */ + if (lock->lk) + rollback_lock_file(lock->lk); } if (lock->ref_file) free(lock->ref_file); - if (lock->lock_file) - free(lock->lock_file); if (lock->log_file) free(lock->log_file); free(lock); @@ -415,7 +414,7 @@ int write_ref_sha1(struct ref_lock *lock, if (write(lock->lock_fd, sha1_to_hex(sha1), 40) != 40 || write(lock->lock_fd, &term, 1) != 1 || close(lock->lock_fd) < 0) { - error("Couldn't write %s", lock->lock_file); + error("Couldn't write %s", lock->lk->filename); unlock_ref(lock); return -1; } @@ -423,7 +422,7 @@ int write_ref_sha1(struct ref_lock *lock, unlock_ref(lock); return -1; } - if (rename(lock->lock_file, lock->ref_file) < 0) { + if (commit_lock_file(lock->lk)) { error("Couldn't set %s", lock->ref_file); unlock_ref(lock); return -1; diff --git a/refs.h b/refs.h index 6c946eabcf..bc01691ec5 100644 --- a/refs.h +++ b/refs.h @@ -3,8 +3,8 @@ struct ref_lock { char *ref_file; - char *lock_file; char *log_file; + struct lock_file *lk; unsigned char old_sha1[20]; int lock_fd; int force_write; From e5f38ec3c5d8553413501e6141932b8ccc7aceb4 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 6 Jun 2006 14:04:17 -0700 Subject: [PATCH 6/6] ref-log: style fixes. A few style fixes to get the code in line with the rest. - asterisk to make a type a pointer to something goes in front of the variable, not at the end of the base type. E.g. a pointer to an integer is "int *ip", not "int* ip". - open parenthesis for function parameter list, unlike syntactic constructs, comes immediately after the function name. E.g. "if (foo) bar();" not "if(foo) bar ();". - "else" does not come on the same line as the closing brace of corresponding "if". The style is mostly a matter of personal taste, and people may disagree, but consistency is important. Signed-off-by: Junio C Hamano --- fetch.c | 6 ++++-- refs.c | 19 +++++++++++-------- refs.h | 6 +++--- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/fetch.c b/fetch.c index e040ef97b6..cf6c99490c 100644 --- a/fetch.c +++ b/fetch.c @@ -150,7 +150,8 @@ static int process(struct object *obj) if (has_sha1_file(obj->sha1)) { /* We already have it, so we should scan it now. */ obj->flags |= TO_SCAN; - } else { + } + else { if (obj->flags & COMPLETE) return 0; prefetch(obj->sha1); @@ -255,7 +256,8 @@ int pull(char *target) if (write_ref_log_details) { msg = xmalloc(strlen(write_ref_log_details) + 12); sprintf(msg, "fetch from %s", write_ref_log_details); - } else + } + else msg = NULL; ret = write_ref_sha1(lock, sha1, msg ? msg : "fetch (unknown)"); if (msg) diff --git a/refs.c b/refs.c index 24dcba7189..f91b7716dc 100644 --- a/refs.c +++ b/refs.c @@ -259,7 +259,7 @@ int check_ref_format(const char *ref) } } -static struct ref_lock* verify_lock(struct ref_lock *lock, +static struct ref_lock *verify_lock(struct ref_lock *lock, const unsigned char *old_sha1, int mustexist) { char buf[40]; @@ -285,7 +285,7 @@ static struct ref_lock* verify_lock(struct ref_lock *lock, return lock; } -static struct ref_lock* lock_ref_sha1_basic(const char *path, +static struct ref_lock *lock_ref_sha1_basic(const char *path, int plen, const unsigned char *old_sha1, int mustexist) { @@ -320,7 +320,7 @@ static struct ref_lock* lock_ref_sha1_basic(const char *path, return old_sha1 ? verify_lock(lock, old_sha1, mustexist) : lock; } -struct ref_lock* lock_ref_sha1(const char *ref, +struct ref_lock *lock_ref_sha1(const char *ref, const unsigned char *old_sha1, int mustexist) { if (check_ref_format(ref)) @@ -329,14 +329,14 @@ struct ref_lock* lock_ref_sha1(const char *ref, 5 + strlen(ref), old_sha1, mustexist); } -struct ref_lock* lock_any_ref_for_update(const char *ref, +struct ref_lock *lock_any_ref_for_update(const char *ref, const unsigned char *old_sha1, int mustexist) { return lock_ref_sha1_basic(git_path("%s", ref), strlen(ref), old_sha1, mustexist); } -void unlock_ref (struct ref_lock *lock) +void unlock_ref(struct ref_lock *lock) { if (lock->lock_fd >= 0) { close(lock->lock_fd); @@ -384,7 +384,8 @@ static int log_ref_write(struct ref_lock *lock, sha1_to_hex(sha1), comitter, msg); - } else { + } + else { maxlen = strlen(comitter) + 2*40 + 4; logrec = xmalloc(maxlen); len = snprintf(logrec, maxlen, "%s %s %s\n", @@ -477,10 +478,12 @@ int read_ref_at(const char *ref, unsigned long at_time, unsigned char *sha1) "warning: Log %s has gap after %s.\n", logfile, show_rfc2822_date(date, tz)); } - } else if (date == at_time) { + } + else if (date == at_time) { if (get_sha1_hex(rec + 41, sha1)) die("Log %s is corrupt.", logfile); - } else { + } + else { if (get_sha1_hex(rec + 41, logged_sha1)) die("Log %s is corrupt.", logfile); if (memcmp(logged_sha1, sha1, 20)) { diff --git a/refs.h b/refs.h index bc01691ec5..553155c04a 100644 --- a/refs.h +++ b/refs.h @@ -24,13 +24,13 @@ extern int for_each_remote_ref(int (*fn)(const char *path, const unsigned char * extern int get_ref_sha1(const char *ref, unsigned char *sha1); /** Locks a "refs/" ref returning the lock on success and NULL on failure. **/ -extern struct ref_lock* lock_ref_sha1(const char *ref, const unsigned char *old_sha1, int mustexist); +extern struct ref_lock *lock_ref_sha1(const char *ref, const unsigned char *old_sha1, int mustexist); /** Locks any ref (for 'HEAD' type refs). */ -extern struct ref_lock* lock_any_ref_for_update(const char *ref, const unsigned char *old_sha1, int mustexist); +extern struct ref_lock *lock_any_ref_for_update(const char *ref, const unsigned char *old_sha1, int mustexist); /** Release any lock taken but not written. **/ -extern void unlock_ref (struct ref_lock *lock); +extern void unlock_ref(struct ref_lock *lock); /** Writes sha1 into the ref specified by the lock. **/ extern int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1, const char *msg);