Add a function to return the path of the file that is locked by a lock_file object. This reduces the knowledge that callers have to have about the lock_file layout. Suggested-by: Ronnie Sahlberg <sahlberg@xxxxxxxxxx> Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> --- Documentation/technical/api-lockfile.txt | 5 +++++ cache.h | 1 + lockfile.c | 9 +++++++++ refs.c | 4 +--- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Documentation/technical/api-lockfile.txt b/Documentation/technical/api-lockfile.txt index 40cd524..22f1b5c 100644 --- a/Documentation/technical/api-lockfile.txt +++ b/Documentation/technical/api-lockfile.txt @@ -52,6 +52,11 @@ hold_lock_file_for_append:: lockfile and its write pointer is positioned at the end of the file before returning. +get_locked_file_path:: + + Return the path of the file that is locked by the specified + lock_file object. The caller must free the memory. + unable_to_lock_error:: Emit an error describing that there was an error locking the diff --git a/cache.h b/cache.h index d610fab..4bbaffa 100644 --- a/cache.h +++ b/cache.h @@ -590,6 +590,7 @@ extern void unable_to_lock_message(const char *path, int err, extern NORETURN void unable_to_lock_die(const char *path, int err); extern int hold_lock_file_for_update(struct lock_file *, const char *path, int); extern int hold_lock_file_for_append(struct lock_file *, const char *path, int); +extern char *get_locked_file_path(struct lock_file *); extern int commit_lock_file_to(struct lock_file *, const char *path); extern int commit_lock_file(struct lock_file *); extern int reopen_lock_file(struct lock_file *); diff --git a/lockfile.c b/lockfile.c index 0b63554..42cea0a 100644 --- a/lockfile.c +++ b/lockfile.c @@ -274,6 +274,15 @@ int hold_lock_file_for_append(struct lock_file *lk, const char *path, int flags) return fd; } +char *get_locked_file_path(struct lock_file *lk) +{ + if (!lk->active) + die("BUG: get_locked_file_path() called for unlocked object"); + if (lk->filename.len <= LOCK_SUFFIX_LEN) + die("BUG: get_locked_file_path() called for malformed lock object"); + return xmemdupz(lk->filename.buf, lk->filename.len - LOCK_SUFFIX_LEN); +} + int close_lock_file(struct lock_file *lk) { int fd = lk->fd; diff --git a/refs.c b/refs.c index 525ce4b..5842dd0 100644 --- a/refs.c +++ b/refs.c @@ -2556,9 +2556,7 @@ static int delete_ref_loose(struct ref_lock *lock, int flag) * loose. The loose file name is the same as the * lockfile name, minus ".lock": */ - char *loose_filename = xmemdupz( - lock->lk->filename.buf, - lock->lk->filename.len - LOCK_SUFFIX_LEN); + char *loose_filename = get_locked_file_path(lock->lk); int err = unlink_or_warn(loose_filename); free(loose_filename); if (err && errno != ENOENT) -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html