Avoid cross-directory renames and linking on object creation
[gitweb.git] / builtin-pack-refs.c
index a62f06bb89aa6ef035c26c4aad05c0fdbf0512de..1aaa76dd1fe42f56e25dac6c3ca0e787eb7b005e 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)
@@ -122,19 +128,13 @@ static char const * const pack_refs_usage[] = {
 
 int cmd_pack_refs(int argc, const char **argv, const char *prefix)
 {
-       int all = 0, prune = 1;
-       unsigned int flags = 0;
+       unsigned int flags = PACK_REFS_PRUNE;
        struct option opts[] = {
-               OPT_BOOLEAN(0, "all", &all, "pack everything"),
-               OPT_BOOLEAN(0, "prune", &prune, "prune loose refs (default)"),
+               OPT_BIT(0, "all",   &flags, "pack everything", PACK_REFS_ALL),
+               OPT_BIT(0, "prune", &flags, "prune loose refs (default)", PACK_REFS_PRUNE),
                OPT_END(),
        };
-
        if (parse_options(argc, argv, opts, pack_refs_usage, 0))
                usage_with_options(pack_refs_usage, opts);
-       if (prune)
-               flags |= PACK_REFS_PRUNE;
-       if (all)
-               flags |= PACK_REFS_ALL;
        return pack_refs(flags);
 }