This reduces the amount of string editing gyrations and makes it
unnecessary for callers to know how to derive the filename from the
lock_filename.

Signed-off-by: Michael Haggerty <mhag...@alum.mit.edu>
---
 cache.h    |  1 +
 lockfile.c | 57 ++++++++++++++++++++++++++++++++-------------------------
 refs.c     | 10 ++--------
 3 files changed, 35 insertions(+), 33 deletions(-)

diff --git a/cache.h b/cache.h
index 3d0a835..0fefc66 100644
--- a/cache.h
+++ b/cache.h
@@ -538,6 +538,7 @@ struct lock_file {
        int fd;
        pid_t owner;
        unsigned char flags;
+       struct strbuf filename;
        struct strbuf lock_filename;
 };
 #define LOCK_DIE_ON_ERROR 1
diff --git a/lockfile.c b/lockfile.c
index 87b40c4..07b5c21 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -35,24 +35,26 @@
  *
  * - Uninitialized.  In this state the object's flags field must be
  *   zero but the rest of the contents need not be initialized.  In
- *   particular, the lock_filename strbuf should *not* be initialized
- *   externally.  The first time the object is used in any way, it is
- *   initialized, permanently registered in the lock_file_list, and
- *   flags & LOCK_FLAGS_ON_LIST is set.
+ *   particular, the filename and lock_filename strbufs should *not*
+ *   be initialized externally.  The first time the object is used in
+ *   any way, it is initialized, permanently registered in the
+ *   lock_file_list, and flags & LOCK_FLAGS_ON_LIST is set.
  *
  * - Locked, lockfile open (after hold_lock_file_for_update() or
  *   hold_lock_file_for_append()).  In this state, the lockfile
- *   exists, lock_filename holds the filename of the lockfile, fd
- *   holds a file descriptor open for writing to the lockfile, and
- *   owner holds the PID of the process that locked the file.
+ *   exists, filename holds the filename of the locked file,
+ *   lock_filename holds the filename of the lockfile, fd holds a file
+ *   descriptor open for writing to the lockfile, and owner holds the
+ *   PID of the process that locked the file.
  *
  * - Locked, lockfile closed (after close_lock_file()).  Same as the
  *   previous state, except that the lockfile is closed and fd is -1.
  *
  * - Unlocked (after commit_lock_file(), rollback_lock_file(), or a
- *   failed attempt to lock).  In this state, lock_filename is the
- *   empty string and fd is -1.  The object is left registered in the
- *   lock_file_list, and flags & LOCK_FLAGS_ON_LIST is set.
+ *   failed attempt to lock).  In this state, filename and
+ *   lock_filename are the empty string and fd is -1.  The object is
+ *   left registered in the lock_file_list, and flags &
+ *   LOCK_FLAGS_ON_LIST is set.
  *
  * See Documentation/api-lockfile.txt for more information.
  */
@@ -164,25 +166,30 @@ static int lock_file(struct lock_file *lk, const char 
*path, int flags)
 
        lk->owner = getpid();
        if (lk->flags & LOCK_FLAGS_ON_LIST) {
-               assert(!lk->lock_filename.len); /* object not already in use */
-               if (strbuf_avail(&lk->lock_filename) < path_len + 
LOCK_SUFFIX_LEN)
-                       strbuf_grow(&lk->lock_filename, path_len + 
LOCK_SUFFIX_LEN);
+               /* Sanity check that object is not already in use: */
+               assert(!lk->filename.len);
+               assert(!lk->lock_filename.len);
        } else {
                /* Initialize *lk and add it to lock_file_list: */
                lk->fd = -1;
                lk->flags |= LOCK_FLAGS_ON_LIST;
-               strbuf_init(&lk->lock_filename, path_len + LOCK_SUFFIX_LEN);
+               strbuf_init(&lk->filename, path_len);
+               strbuf_init(&lk->lock_filename, 0);
                lk->next = lock_file_list;
                lock_file_list = lk;
        }
 
-       strbuf_add(&lk->lock_filename, path, path_len);
+       strbuf_add(&lk->filename, path, path_len);
        if (!(flags & LOCK_NODEREF))
-               resolve_symlink(&lk->lock_filename);
+               resolve_symlink(&lk->filename);
+
+       strbuf_grow(&lk->lock_filename, lk->filename.len + LOCK_SUFFIX_LEN);
+       strbuf_addbuf(&lk->lock_filename, &lk->filename);
        strbuf_addstr(&lk->lock_filename, ".lock");
 
        lk->fd = open(lk->lock_filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666);
        if (lk->fd < 0) {
+               strbuf_setlen(&lk->filename, 0);
                strbuf_setlen(&lk->lock_filename, 0);
                return -1;
        }
@@ -269,18 +276,16 @@ int close_lock_file(struct lock_file *lk)
 
 int commit_lock_file(struct lock_file *lk)
 {
-       char *result_file;
-       size_t path_len = lk->lock_filename.len - LOCK_SUFFIX_LEN;
        int err = 0;
 
        if (lk->fd >= 0 && close_lock_file(lk))
                return -1;
-       result_file = xmemdupz(lk->lock_filename.buf, path_len);
-       if (rename(lk->lock_filename.buf, result_file))
+       if (rename(lk->lock_filename.buf, lk->filename.buf)) {
                err = -1;
-       else
+       } else {
+               strbuf_setlen(&lk->filename, 0);
                strbuf_setlen(&lk->lock_filename, 0);
-       free(result_file);
+       }
        return err;
 }
 
@@ -304,19 +309,21 @@ int commit_locked_index(struct lock_file *lk)
                        return -1;
                if (rename(lk->lock_filename.buf, alternate_index_output))
                        return -1;
+               strbuf_setlen(&lk->filename, 0);
                strbuf_setlen(&lk->lock_filename, 0);
                return 0;
-       }
-       else
+       } else {
                return commit_lock_file(lk);
+       }
 }
 
 void rollback_lock_file(struct lock_file *lk)
 {
-       if (lk->lock_filename.len) {
+       if (lk->filename.len) {
                if (lk->fd >= 0)
                        close_lock_file(lk);
                unlink_or_warn(lk->lock_filename.buf);
+               strbuf_setlen(&lk->filename, 0);
                strbuf_setlen(&lk->lock_filename, 0);
        }
 }
diff --git a/refs.c b/refs.c
index 93abc94..85967e7 100644
--- a/refs.c
+++ b/refs.c
@@ -2485,14 +2485,8 @@ static int repack_without_ref(const char *refname)
 static int delete_ref_loose(struct ref_lock *lock, int flag)
 {
        if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) {
-               /*
-                * loose.  The loose file name is the same as the
-                * lockfile name, minus ".lock":
-                */
-               char *loose_filename = xmemdupz(lock->lk->lock_filename.buf,
-                                               lock->lk->lock_filename.len - 
5);
-               int err = unlink_or_warn(loose_filename);
-               free(loose_filename);
+               /* loose */
+               int err = unlink_or_warn(lock->lk->filename.buf);
                if (err && errno != ENOENT)
                        return 1;
        }
-- 
1.9.0

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to