OSDN Git Service

Improve use of lockfile API
authorBrandon Casey <casey@nrlssc.navy.mil>
Wed, 16 Jan 2008 19:12:46 +0000 (13:12 -0600)
committerJunio C Hamano <gitster@pobox.com>
Wed, 16 Jan 2008 23:35:35 +0000 (15:35 -0800)
Remove remaining double close(2)'s.  i.e. close() before
commit_locked_index() or commit_lock_file().

Signed-off-by: Junio C Hamano <gitster@pobox.com>
20 files changed:
builtin-add.c
builtin-apply.c
builtin-checkout-index.c
builtin-commit.c
builtin-diff.c
builtin-fetch-pack.c
builtin-mv.c
builtin-pack-refs.c
builtin-read-tree.c
builtin-rerere.c
builtin-reset.c
builtin-revert.c
builtin-rm.c
builtin-update-index.c
builtin-write-tree.c
bundle.c
config.c
fast-import.c
merge-recursive.c
refs.c

index 5c29cc2..4a91e3e 100644 (file)
@@ -259,7 +259,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
  finish:
        if (active_cache_changed) {
                if (write_cache(newfd, active_cache, active_nr) ||
-                   close(newfd) || commit_locked_index(&lock_file))
+                   commit_locked_index(&lock_file))
                        die("Unable to write new index file");
        }
 
index d57bb6e..15432b6 100644 (file)
@@ -2921,7 +2921,7 @@ int cmd_apply(int argc, const char **argv, const char *unused_prefix)
 
        if (update_index) {
                if (write_cache(newfd, active_cache, active_nr) ||
-                   close(newfd) || commit_locked_index(&lock_file))
+                   commit_locked_index(&lock_file))
                        die("Unable to write new index file");
        }
 
index 70d619d..7e42024 100644 (file)
@@ -246,8 +246,8 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
                 * want to update cache.
                 */
                if (state.refresh_cache) {
-                       close(newfd); newfd = -1;
                        rollback_lock_file(&lock_file);
+                       newfd = -1;
                }
                state.refresh_cache = 0;
        }
@@ -297,7 +297,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
 
        if (0 <= newfd &&
            (write_cache(newfd, active_cache, active_nr) ||
-            close(newfd) || commit_locked_index(&lock_file)))
+            commit_locked_index(&lock_file)))
                die("Unable to write new index file");
        return 0;
 }
index 49541c0..0227936 100644 (file)
@@ -237,7 +237,8 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
                int fd = hold_locked_index(&index_lock, 1);
                add_files_to_cache(0, also ? prefix : NULL, pathspec);
                refresh_cache(REFRESH_QUIET);
-               if (write_cache(fd, active_cache, active_nr))
+               if (write_cache(fd, active_cache, active_nr) ||
+                   close_lock_file(&index_lock))
                        die("unable to write new_index file");
                commit_style = COMMIT_NORMAL;
                return index_lock.filename;
@@ -298,7 +299,8 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
        fd = hold_locked_index(&index_lock, 1);
        add_remove_files(&partial);
        refresh_cache(REFRESH_QUIET);
-       if (write_cache(fd, active_cache, active_nr))
+       if (write_cache(fd, active_cache, active_nr) ||
+           close_lock_file(&index_lock))
                die("unable to write new_index file");
 
        fd = hold_lock_file_for_update(&false_lock,
@@ -308,7 +310,8 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
        add_remove_files(&partial);
        refresh_cache(REFRESH_QUIET);
 
-       if (write_cache(fd, active_cache, active_nr))
+       if (write_cache(fd, active_cache, active_nr) ||
+           close_lock_file(&false_lock))
                die("unable to write temporary index file");
        return false_lock.filename;
 }
index 29365a0..8d7a569 100644 (file)
@@ -190,7 +190,7 @@ static void refresh_index_quietly(void)
        refresh_cache(REFRESH_QUIET|REFRESH_UNMERGED);
 
        if (active_cache_changed &&
-           !write_cache(fd, active_cache, active_nr) && !close(fd))
+           !write_cache(fd, active_cache, active_nr))
                commit_locked_index(lock_file);
 
        rollback_lock_file(lock_file);
index 807fa93..e68e015 100644 (file)
@@ -783,7 +783,6 @@ struct ref *fetch_pack(struct fetch_pack_args *my_args,
                        unlink(shallow);
                        rollback_lock_file(&lock);
                } else {
-                       close(fd);
                        commit_lock_file(&lock);
                }
        }
index a3f9ad1..990e213 100644 (file)
@@ -264,7 +264,6 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
                if (active_cache_changed) {
                        if (write_cache(newfd, active_cache, active_nr) ||
-                           close(newfd) ||
                            commit_locked_index(&lock_file))
                                die("Unable to write new index file");
                }
index 1923fb1..1aaa76d 100644 (file)
@@ -108,6 +108,12 @@ static int pack_refs(unsigned int flags)
                die("failed to write ref-pack file");
        if (fflush(cbdata.refs_file) || fsync(fd) || fclose(cbdata.refs_file))
                die("failed to write ref-pack file (%s)", strerror(errno));
+       /*
+        * Since the lock file was fdopen()'ed and then fclose()'ed above,
+        * assign -1 to the lock file descriptor so that commit_lock_file()
+        * won't try to close() it.
+        */
+       packed.fd = -1;
        if (commit_lock_file(&packed) < 0)
                die("unable to overwrite old ref-pack file (%s)", strerror(errno));
        if (cbdata.flags & PACK_REFS_PRUNE)
index 43cd56a..c0ea034 100644 (file)
@@ -283,7 +283,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
        }
 
        if (write_cache(newfd, active_cache, active_nr) ||
-           close(newfd) || commit_locked_index(&lock_file))
+           commit_locked_index(&lock_file))
                die("unable to write new index file");
        return 0;
 }
index 37e6248..a9e3ebc 100644 (file)
@@ -61,9 +61,9 @@ static int write_rr(struct path_list *rr, int out_fd)
                    write_in_full(out_fd, path, length) != length)
                        die("unable to write rerere record");
        }
-       if (close(out_fd) != 0)
+       if (commit_lock_file(&write_lock) != 0)
                die("unable to write rerere record");
-       return commit_lock_file(&write_lock);
+       return 0;
 }
 
 static int handle_file(const char *path,
index 10dba60..7ee811f 100644 (file)
@@ -108,7 +108,6 @@ static int update_index_refresh(int fd, struct lock_file *index_lock)
                return error("Could not read index");
        result = refresh_cache(0) ? 1 : 0;
        if (write_cache(fd, active_cache, active_nr) ||
-                       close(fd) ||
                        commit_locked_index(index_lock))
                return error ("Could not refresh index");
        return result;
index 4bf8eb2..358af53 100644 (file)
@@ -371,13 +371,13 @@ static int revert_or_cherry_pick(int argc, const char **argv)
                                        i++;
                        }
                }
-               if (close(msg_fd) || commit_lock_file(&msg_file) < 0)
+               if (commit_lock_file(&msg_file) < 0)
                        die ("Error wrapping up %s", defmsg);
                fprintf(stderr, "Automatic %s failed.%s\n",
                        me, help_msg(commit->object.sha1));
                exit(1);
        }
-       if (close(msg_fd) || commit_lock_file(&msg_file) < 0)
+       if (commit_lock_file(&msg_file) < 0)
                die ("Error wrapping up %s", defmsg);
        fprintf(stderr, "Finished one %s.\n", me);
 
index a3d25e6..c0a8bb6 100644 (file)
@@ -250,7 +250,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
 
        if (active_cache_changed) {
                if (write_cache(newfd, active_cache, active_nr) ||
-                   close(newfd) || commit_locked_index(&lock_file))
+                   commit_locked_index(&lock_file))
                        die("Unable to write new index file");
        }
 
index e1a938d..c3a14c7 100644 (file)
@@ -738,7 +738,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
                            get_index_file(), strerror(lock_error));
                }
                if (write_cache(newfd, active_cache, active_nr) ||
-                   close(newfd) || commit_locked_index(lock_file))
+                   commit_locked_index(lock_file))
                        die("Unable to write new index file");
        }
 
index b89d02e..d16b9ed 100644 (file)
@@ -35,11 +35,9 @@ int write_tree(unsigned char *sha1, int missing_ok, const char *prefix)
                                      missing_ok, 0) < 0)
                        die("git-write-tree: error building trees");
                if (0 <= newfd) {
-                       if (!write_cache(newfd, active_cache, active_nr)
-                                       && !close(newfd)) {
-                               commit_lock_file(lock_file);
+                       if (!write_cache(newfd, active_cache, active_nr) &&
+                           !commit_lock_file(lock_file))
                                newfd = -1;
-                       }
                }
                /* Not being able to write is fine -- we are only interested
                 * in updating the cache-tree part, and if the next caller
@@ -60,8 +58,7 @@ int write_tree(unsigned char *sha1, int missing_ok, const char *prefix)
                hashcpy(sha1, active_cache_tree->sha1);
 
        if (0 <= newfd)
-               close(newfd);
-       rollback_lock_file(lock_file);
+               rollback_lock_file(lock_file);
 
        return 0;
 }
index 316aa74..5c95eca 100644 (file)
--- a/bundle.c
+++ b/bundle.c
@@ -317,6 +317,14 @@ int create_bundle(struct bundle_header *header, const char *path,
        rls.git_cmd = 1;
        if (start_command(&rls))
                return error("Could not spawn pack-objects");
+
+       /*
+        * start_command closed bundle_fd if it was > 1
+        * so set the lock fd to -1 so commit_lock_file()
+        * won't fail trying to close it.
+        */
+       lock.fd = -1;
+
        for (i = 0; i < revs.pending.nr; i++) {
                struct object *object = revs.pending.objects[i].item;
                if (object->flags & UNINTERESTING)
@@ -326,10 +334,8 @@ int create_bundle(struct bundle_header *header, const char *path,
        }
        if (finish_command(&rls))
                return error ("pack-objects died");
-       close(bundle_fd);
-       if (!bundle_to_stdout)
-               commit_lock_file(&lock);
-       return 0;
+
+       return bundle_to_stdout ? close(bundle_fd) : commit_lock_file(&lock);
 }
 
 int unbundle(struct bundle_header *header, int bundle_fd)
index 857deb6..526a3f4 100644 (file)
--- a/config.c
+++ b/config.c
@@ -955,14 +955,12 @@ int git_config_set_multivar(const char* key, const char* value,
                munmap(contents, contents_sz);
        }
 
-       if (close(fd) || commit_lock_file(lock) < 0) {
+       if (commit_lock_file(lock) < 0) {
                fprintf(stderr, "Cannot commit config file!\n");
                ret = 4;
                goto out_free;
        }
 
-       /* fd is closed, so don't try to close it below. */
-       fd = -1;
        /*
         * lock is committed, so don't try to roll it back below.
         * NOTE: Since lockfile.c keeps a linked list of all created
@@ -973,8 +971,6 @@ int git_config_set_multivar(const char* key, const char* value,
        ret = 0;
 
 out_free:
-       if (0 <= fd)
-               close(fd);
        if (lock)
                rollback_lock_file(lock);
        free(config_filename);
@@ -1072,7 +1068,7 @@ int git_config_rename_section(const char *old_name, const char *new_name)
        }
        fclose(config_file);
  unlock_and_out:
-       if (close(out_fd) || commit_lock_file(lock) < 0)
+       if (commit_lock_file(lock) < 0)
                        ret = error("Cannot commit config file!");
  out:
        free(config_filename);
index 82e9161..3609c24 100644 (file)
@@ -1546,10 +1546,18 @@ static void dump_marks(void)
        }
 
        dump_marks_helper(f, 0, marks);
-       fclose(f);
-       if (commit_lock_file(&mark_lock))
+       if (ferror(f) || fclose(f))
                failure |= error("Unable to write marks file %s: %s",
                        mark_file, strerror(errno));
+       /*
+        * Since the lock file was fdopen()'ed and then fclose()'ed above,
+        * assign -1 to the lock file descriptor so that commit_lock_file()
+        * won't try to close() it.
+        */
+       mark_lock.fd = -1;
+       if (commit_lock_file(&mark_lock))
+               failure |= error("Unable to write commit file %s: %s",
+                       mark_file, strerror(errno));
 }
 
 static int read_next_command(void)
index b34177d..c292a77 100644 (file)
@@ -1753,7 +1753,7 @@ int main(int argc, char *argv[])
 
        if (active_cache_changed &&
            (write_cache(index_fd, active_cache, active_nr) ||
-            close(index_fd) || commit_locked_index(lock)))
+            commit_locked_index(lock)))
                        die ("unable to write %s", get_index_file());
 
        return clean ? 0: 1;
diff --git a/refs.c b/refs.c
index c3ffe03..8a42d39 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -864,7 +864,6 @@ static int repack_without_ref(const char *refname)
                        die("too long a refname '%s'", list->name);
                write_or_die(fd, line, len);
        }
-       close(fd);
        return commit_lock_file(&packlock);
 }
 
@@ -1021,12 +1020,9 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg)
 
 void unlock_ref(struct ref_lock *lock)
 {
-       if (lock->lock_fd >= 0) {
-               close(lock->lock_fd);
-               /* Do not free lock->lk -- atexit() still looks at them */
-               if (lock->lk)
-                       rollback_lock_file(lock->lk);
-       }
+       /* Do not free lock->lk -- atexit() still looks at them */
+       if (lock->lk)
+               rollback_lock_file(lock->lk);
        free(lock->ref_name);
        free(lock->orig_ref_name);
        free(lock);
@@ -1151,7 +1147,7 @@ int write_ref_sha1(struct ref_lock *lock,
        }
        if (write_in_full(lock->lock_fd, sha1_to_hex(sha1), 40) != 40 ||
            write_in_full(lock->lock_fd, &term, 1) != 1
-               || close(lock->lock_fd) < 0) {
+               || close_lock_file(lock->lk) < 0) {
                error("Couldn't write %s", lock->lk->filename);
                unlock_ref(lock);
                return -1;