lockfile: allow reopening a closed but still locked file

In some code paths (e.g. giving "add -i" to prepare the contents to be committed interactively inside "commit -p") where a caller takes a lock, writes the new content, give chance for others to use it while still holding the lock, and then releases the lock when all is done. As an extension, allow the caller to re-update an already closed file while still holding the lock (i.e. not yet committed) by re-opening the file, to be followed by updating the contents and then by the usual close_lock_file() or commit_lock_file(). This is necessary if we want to add code to rebuild the cache-tree and write the resulting index out after "add -i" returns the control to "commit -p", for example. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Jul 14, 2014 at 10:29 UTC 93dcaea22674864f931be3fe6050671d335dc5b0
2 files changed +11
cache.h
+1
@@ -567,6 +567,7 @@ extern NORETURN void unable_to_lock_index_die(const char *path, int err);
567 extern int hold_lock_file_for_update(struct lock_file *, const char *path, int);
568 extern int hold_lock_file_for_append(struct lock_file *, const char *path, int);
569 extern int commit_lock_file(struct lock_file *);
570 +extern int reopen_lock_file(struct lock_file *);
571 extern void update_index_if_able(struct index_state *, struct lock_file *);
572
573 extern int hold_locked_index(struct lock_file *, int);
lockfile.c
+10
@@ -228,6 +228,16 @@ int close_lock_file(struct lock_file *lk)
228 return close(fd);
229 }
230
231 +int reopen_lock_file(struct lock_file *lk)
232 +{
233 + if (0 <= lk->fd)
234 + die(_("BUG: reopen a lockfile that is still open"));
235 + if (!lk->filename[0])
236 + die(_("BUG: reopen a lockfile that has been committed"));
237 + lk->fd = open(lk->filename, O_WRONLY);
238 + return lk->fd;
239 +}
240 +
241 int commit_lock_file(struct lock_file *lk)
242 {
243 char result_file[PATH_MAX];