summaryrefslogtreecommitdiff
path: root/refs
diff options
context:
space:
mode:
authorLibravatar Michael Haggerty <mhagger@alum.mit.edu>2017-06-23 09:01:43 +0200
committerLibravatar Junio C Hamano <gitster@pobox.com>2017-06-23 13:27:33 -0700
commit49aebcf4328d96bb984672213de76cd4c45197f2 (patch)
treef84a389eead52efb743a15f9784fcc29be08ea74 /refs
parentpacked_refs_lock(): report errors via a `struct strbuf *err` (diff)
downloadtgif-49aebcf4328d96bb984672213de76cd4c45197f2.tar.xz
packed_refs_unlock(), packed_refs_is_locked(): new functions
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>
Diffstat (limited to 'refs')
-rw-r--r--refs/packed-backend.c31
-rw-r--r--refs/packed-backend.h3
2 files changed, 28 insertions, 6 deletions
diff --git a/refs/packed-backend.c b/refs/packed-backend.c
index 78e877a9e3..f27943f9a1 100644
--- a/refs/packed-backend.c
+++ b/refs/packed-backend.c
@@ -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 @@ error:
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 @@ out:
*/
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);
}
diff --git a/refs/packed-backend.h b/refs/packed-backend.h
index 210e3f35ce..03b7c1de95 100644
--- a/refs/packed-backend.h
+++ b/refs/packed-backend.h
@@ -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);