packed_refs_unlock(), packed_refs_is_locked(): new functions
authorMichael Haggerty <mhagger@alum.mit.edu>
Fri, 23 Jun 2017 07:01:43 +0000 (09:01 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 23 Jun 2017 20:27:33 +0000 (13:27 -0700)
Add two new public functions, `packed_refs_unlock()` and
`packed_refs_is_locked()`, with which callers can manage and query the
`packed-refs` lock externally.

Call `packed_refs_unlock()` from `commit_packed_refs()` and
`rollback_packed_refs()`.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs/packed-backend.c
refs/packed-backend.h
index 78e877a9e39b7e3f9cfb51f7741cbaabfe4aea6c..f27943f9a156e6e1f1b498d2cc5f2abe4b65b6fc 100644 (file)
@@ -563,6 +563,29 @@ int packed_refs_lock(struct ref_store *ref_store, int flags, struct strbuf *err)
        return 0;
 }
 
+void packed_refs_unlock(struct ref_store *ref_store)
+{
+       struct packed_ref_store *refs = packed_downcast(
+                       ref_store,
+                       REF_STORE_READ | REF_STORE_WRITE,
+                       "packed_refs_unlock");
+
+       if (!is_lock_file_locked(&refs->lock))
+               die("BUG: packed_refs_unlock() called when not locked");
+       rollback_lock_file(&refs->lock);
+       release_packed_ref_cache(refs->cache);
+}
+
+int packed_refs_is_locked(struct ref_store *ref_store)
+{
+       struct packed_ref_store *refs = packed_downcast(
+                       ref_store,
+                       REF_STORE_READ | REF_STORE_WRITE,
+                       "packed_refs_is_locked");
+
+       return is_lock_file_locked(&refs->lock);
+}
+
 /*
  * The packed-refs header line that we write out.  Perhaps other
  * traits will be added later.  The trailing space is required.
@@ -649,8 +672,7 @@ int commit_packed_refs(struct ref_store *ref_store, struct strbuf *err)
        delete_tempfile(&refs->tempfile);
 
 out:
-       rollback_lock_file(&refs->lock);
-       release_packed_ref_cache(packed_ref_cache);
+       packed_refs_unlock(ref_store);
        return ret;
 }
 
@@ -661,14 +683,11 @@ int commit_packed_refs(struct ref_store *ref_store, struct strbuf *err)
  */
 static void rollback_packed_refs(struct packed_ref_store *refs)
 {
-       struct packed_ref_cache *packed_ref_cache = get_packed_ref_cache(refs);
-
        packed_assert_main_repository(refs, "rollback_packed_refs");
 
        if (!is_lock_file_locked(&refs->lock))
                die("BUG: packed-refs not locked");
-       rollback_lock_file(&refs->lock);
-       release_packed_ref_cache(packed_ref_cache);
+       packed_refs_unlock(&refs->base);
        clear_packed_ref_cache(refs);
 }
 
index 210e3f35ced2593c66198cdb0a549ad829d09de7..03b7c1de95be9387fa0d2165036a4aa6d276d19c 100644 (file)
@@ -11,6 +11,9 @@ struct ref_store *packed_ref_store_create(const char *path,
  */
 int packed_refs_lock(struct ref_store *ref_store, int flags, struct strbuf *err);
 
+void packed_refs_unlock(struct ref_store *ref_store);
+int packed_refs_is_locked(struct ref_store *ref_store);
+
 void add_packed_ref(struct ref_store *ref_store,
                    const char *refname, const struct object_id *oid);