34
34
*/
35
35
#define REF_UPDATE_VIA_HEAD (1 << 8)
36
36
37
+ struct reftable_backend {
38
+ struct reftable_stack * stack ;
39
+ };
40
+
41
+ static int reftable_backend_init (struct reftable_backend * be ,
42
+ const char * path ,
43
+ const struct reftable_write_options * opts )
44
+ {
45
+ return reftable_new_stack (& be -> stack , path , opts );
46
+ }
47
+
48
+ static void reftable_backend_release (struct reftable_backend * be )
49
+ {
50
+ reftable_stack_destroy (be -> stack );
51
+ be -> stack = NULL ;
52
+ }
53
+
37
54
struct reftable_ref_store {
38
55
struct ref_store base ;
39
56
40
57
/*
41
- * The main stack refers to the common dir and thus contains common
58
+ * The main backend refers to the common dir and thus contains common
42
59
* refs as well as refs of the main repository.
43
60
*/
44
- struct reftable_stack * main_stack ;
61
+ struct reftable_backend main_backend ;
45
62
/*
46
- * The worktree stack refers to the gitdir in case the refdb is opened
63
+ * The worktree backend refers to the gitdir in case the refdb is opened
47
64
* via a worktree. It thus contains the per-worktree refs.
48
65
*/
49
- struct reftable_stack * worktree_stack ;
66
+ struct reftable_backend worktree_backend ;
50
67
/*
51
- * Map of worktree stacks by their respective worktree names. The map
68
+ * Map of worktree backends by their respective worktree names. The map
52
69
* is populated lazily when we try to resolve `worktrees/$worktree` refs.
53
70
*/
54
- struct strmap worktree_stacks ;
71
+ struct strmap worktree_backends ;
55
72
struct reftable_write_options write_options ;
56
73
57
74
unsigned int store_flags ;
@@ -97,21 +114,21 @@ static struct reftable_ref_store *reftable_be_downcast(struct ref_store *ref_sto
97
114
* like `worktrees/$worktree/refs/heads/foo` as worktree stacks will store
98
115
* those references in their normalized form.
99
116
*/
100
- static struct reftable_stack * stack_for (struct reftable_ref_store * store ,
101
- const char * refname ,
102
- const char * * rewritten_ref )
117
+ static struct reftable_backend * backend_for (struct reftable_ref_store * store ,
118
+ const char * refname ,
119
+ const char * * rewritten_ref )
103
120
{
104
121
const char * wtname ;
105
122
int wtname_len ;
106
123
107
124
if (!refname )
108
- return store -> main_stack ;
125
+ return & store -> main_backend ;
109
126
110
127
switch (parse_worktree_ref (refname , & wtname , & wtname_len , rewritten_ref )) {
111
128
case REF_WORKTREE_OTHER : {
112
129
static struct strbuf wtname_buf = STRBUF_INIT ;
113
130
struct strbuf wt_dir = STRBUF_INIT ;
114
- struct reftable_stack * stack ;
131
+ struct reftable_backend * be ;
115
132
116
133
/*
117
134
* We're using a static buffer here so that we don't need to
@@ -125,37 +142,39 @@ static struct reftable_stack *stack_for(struct reftable_ref_store *store,
125
142
/*
126
143
* There is an edge case here: when the worktree references the
127
144
* current worktree, then we set up the stack once via
128
- * `worktree_stacks ` and once via `worktree_stack `. This is
145
+ * `worktree_backends ` and once via `worktree_backend `. This is
129
146
* wasteful, but in the reading case it shouldn't matter. And
130
147
* in the writing case we would notice that the stack is locked
131
148
* already and error out when trying to write a reference via
132
149
* both stacks.
133
150
*/
134
- stack = strmap_get (& store -> worktree_stacks , wtname_buf .buf );
135
- if (!stack ) {
151
+ be = strmap_get (& store -> worktree_backends , wtname_buf .buf );
152
+ if (!be ) {
136
153
strbuf_addf (& wt_dir , "%s/worktrees/%s/reftable" ,
137
154
store -> base .repo -> commondir , wtname_buf .buf );
138
155
139
- store -> err = reftable_new_stack (& stack , wt_dir .buf ,
140
- & store -> write_options );
156
+ CALLOC_ARRAY (be , 1 );
157
+ store -> err = reftable_backend_init (be , wt_dir .buf ,
158
+ & store -> write_options );
141
159
assert (store -> err != REFTABLE_API_ERROR );
142
- strmap_put (& store -> worktree_stacks , wtname_buf .buf , stack );
160
+
161
+ strmap_put (& store -> worktree_backends , wtname_buf .buf , be );
143
162
}
144
163
145
164
strbuf_release (& wt_dir );
146
- return stack ;
165
+ return be ;
147
166
}
148
167
case REF_WORKTREE_CURRENT :
149
168
/*
150
169
* If there is no worktree stack then we're currently in the
151
170
* main worktree. We thus return the main stack in that case.
152
171
*/
153
- if (!store -> worktree_stack )
154
- return store -> main_stack ;
155
- return store -> worktree_stack ;
172
+ if (!store -> worktree_backend . stack )
173
+ return & store -> main_backend ;
174
+ return & store -> worktree_backend ;
156
175
case REF_WORKTREE_MAIN :
157
176
case REF_WORKTREE_SHARED :
158
- return store -> main_stack ;
177
+ return & store -> main_backend ;
159
178
default :
160
179
BUG ("unhandled worktree reference type" );
161
180
}
@@ -292,7 +311,7 @@ static struct ref_store *reftable_be_init(struct repository *repo,
292
311
umask (mask );
293
312
294
313
base_ref_store_init (& refs -> base , repo , gitdir , & refs_be_reftable );
295
- strmap_init (& refs -> worktree_stacks );
314
+ strmap_init (& refs -> worktree_backends );
296
315
refs -> store_flags = store_flags ;
297
316
refs -> log_all_ref_updates = repo_settings_get_log_all_ref_updates (repo );
298
317
@@ -337,8 +356,8 @@ static struct ref_store *reftable_be_init(struct repository *repo,
337
356
strbuf_realpath (& path , gitdir , 0 );
338
357
}
339
358
strbuf_addstr (& path , "/reftable" );
340
- refs -> err = reftable_new_stack (& refs -> main_stack , path .buf ,
341
- & refs -> write_options );
359
+ refs -> err = reftable_backend_init (& refs -> main_backend , path .buf ,
360
+ & refs -> write_options );
342
361
if (refs -> err )
343
362
goto done ;
344
363
@@ -354,8 +373,8 @@ static struct ref_store *reftable_be_init(struct repository *repo,
354
373
strbuf_reset (& path );
355
374
strbuf_addf (& path , "%s/reftable" , gitdir );
356
375
357
- refs -> err = reftable_new_stack (& refs -> worktree_stack , path .buf ,
358
- & refs -> write_options );
376
+ refs -> err = reftable_backend_init (& refs -> worktree_backend , path .buf ,
377
+ & refs -> write_options );
359
378
if (refs -> err )
360
379
goto done ;
361
380
}
@@ -374,19 +393,17 @@ static void reftable_be_release(struct ref_store *ref_store)
374
393
struct strmap_entry * entry ;
375
394
struct hashmap_iter iter ;
376
395
377
- if (refs -> main_stack ) {
378
- reftable_stack_destroy ( refs -> main_stack );
379
- refs -> main_stack = NULL ;
380
- }
396
+ if (refs -> main_backend . stack )
397
+ reftable_backend_release ( & refs -> main_backend );
398
+ if ( refs -> worktree_backend . stack )
399
+ reftable_backend_release ( & refs -> worktree_backend );
381
400
382
- if (refs -> worktree_stack ) {
383
- reftable_stack_destroy (refs -> worktree_stack );
384
- refs -> worktree_stack = NULL ;
401
+ strmap_for_each_entry (& refs -> worktree_backends , & iter , entry ) {
402
+ struct reftable_backend * be = entry -> value ;
403
+ reftable_backend_release (be );
404
+ free (be );
385
405
}
386
-
387
- strmap_for_each_entry (& refs -> worktree_stacks , & iter , entry )
388
- reftable_stack_destroy (entry -> value );
389
- strmap_clear (& refs -> worktree_stacks , 0 );
406
+ strmap_clear (& refs -> worktree_backends , 0 );
390
407
}
391
408
392
409
static int reftable_be_create_on_disk (struct ref_store * ref_store ,
@@ -781,22 +798,22 @@ static struct ref_iterator *reftable_be_iterator_begin(struct ref_store *ref_sto
781
798
required_flags |= REF_STORE_ODB ;
782
799
refs = reftable_be_downcast (ref_store , required_flags , "ref_iterator_begin" );
783
800
784
- main_iter = ref_iterator_for_stack (refs , refs -> main_stack , prefix ,
801
+ main_iter = ref_iterator_for_stack (refs , refs -> main_backend . stack , prefix ,
785
802
exclude_patterns , flags );
786
803
787
804
/*
788
805
* The worktree stack is only set when we're in an actual worktree
789
806
* right now. If we aren't, then we return the common reftable
790
807
* iterator, only.
791
808
*/
792
- if (!refs -> worktree_stack )
809
+ if (!refs -> worktree_backend . stack )
793
810
return & main_iter -> base ;
794
811
795
812
/*
796
813
* Otherwise we merge both the common and the per-worktree refs into a
797
814
* single iterator.
798
815
*/
799
- worktree_iter = ref_iterator_for_stack (refs , refs -> worktree_stack , prefix ,
816
+ worktree_iter = ref_iterator_for_stack (refs , refs -> worktree_backend . stack , prefix ,
800
817
exclude_patterns , flags );
801
818
return merge_ref_iterator_begin (& worktree_iter -> base , & main_iter -> base ,
802
819
ref_iterator_select , NULL );
@@ -811,7 +828,7 @@ static int reftable_be_read_raw_ref(struct ref_store *ref_store,
811
828
{
812
829
struct reftable_ref_store * refs =
813
830
reftable_be_downcast (ref_store , REF_STORE_READ , "read_raw_ref" );
814
- struct reftable_stack * stack = stack_for (refs , refname , & refname );
831
+ struct reftable_stack * stack = backend_for (refs , refname , & refname )-> stack ;
815
832
int ret ;
816
833
817
834
if (refs -> err < 0 )
@@ -838,7 +855,7 @@ static int reftable_be_read_symbolic_ref(struct ref_store *ref_store,
838
855
{
839
856
struct reftable_ref_store * refs =
840
857
reftable_be_downcast (ref_store , REF_STORE_READ , "read_symbolic_ref" );
841
- struct reftable_stack * stack = stack_for (refs , refname , & refname );
858
+ struct reftable_stack * stack = backend_for (refs , refname , & refname )-> stack ;
842
859
struct reftable_ref_record ref = {0 };
843
860
int ret ;
844
861
@@ -898,7 +915,7 @@ static int prepare_transaction_update(struct write_transaction_table_arg **out,
898
915
struct ref_update * update ,
899
916
struct strbuf * err )
900
917
{
901
- struct reftable_stack * stack = stack_for (refs , update -> refname , NULL );
918
+ struct reftable_stack * stack = backend_for (refs , update -> refname , NULL )-> stack ;
902
919
struct write_transaction_table_arg * arg = NULL ;
903
920
size_t i ;
904
921
int ret ;
@@ -1031,7 +1048,7 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store,
1031
1048
goto done ;
1032
1049
}
1033
1050
1034
- ret = read_ref_without_reload (refs , stack_for (refs , "HEAD" , NULL ), "HEAD" ,
1051
+ ret = read_ref_without_reload (refs , backend_for (refs , "HEAD" , NULL )-> stack , "HEAD" ,
1035
1052
& head_oid , & head_referent , & head_type );
1036
1053
if (ret < 0 )
1037
1054
goto done ;
@@ -1043,7 +1060,7 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store,
1043
1060
struct reftable_stack * stack ;
1044
1061
const char * rewritten_ref ;
1045
1062
1046
- stack = stack_for (refs , u -> refname , & rewritten_ref );
1063
+ stack = backend_for (refs , u -> refname , & rewritten_ref )-> stack ;
1047
1064
1048
1065
/* Verify that the new object ID is valid. */
1049
1066
if ((u -> flags & REF_HAVE_NEW ) && !is_null_oid (& u -> new_oid ) &&
@@ -1525,9 +1542,9 @@ static int reftable_be_pack_refs(struct ref_store *ref_store,
1525
1542
if (refs -> err )
1526
1543
return refs -> err ;
1527
1544
1528
- stack = refs -> worktree_stack ;
1545
+ stack = refs -> worktree_backend . stack ;
1529
1546
if (!stack )
1530
- stack = refs -> main_stack ;
1547
+ stack = refs -> main_backend . stack ;
1531
1548
1532
1549
if (opts -> flags & PACK_REFS_AUTO )
1533
1550
ret = reftable_stack_auto_compact (stack );
@@ -1782,7 +1799,7 @@ static int reftable_be_rename_ref(struct ref_store *ref_store,
1782
1799
{
1783
1800
struct reftable_ref_store * refs =
1784
1801
reftable_be_downcast (ref_store , REF_STORE_WRITE , "rename_ref" );
1785
- struct reftable_stack * stack = stack_for (refs , newrefname , & newrefname );
1802
+ struct reftable_stack * stack = backend_for (refs , newrefname , & newrefname )-> stack ;
1786
1803
struct write_copy_arg arg = {
1787
1804
.refs = refs ,
1788
1805
.stack = stack ,
@@ -1814,7 +1831,7 @@ static int reftable_be_copy_ref(struct ref_store *ref_store,
1814
1831
{
1815
1832
struct reftable_ref_store * refs =
1816
1833
reftable_be_downcast (ref_store , REF_STORE_WRITE , "copy_ref" );
1817
- struct reftable_stack * stack = stack_for (refs , newrefname , & newrefname );
1834
+ struct reftable_stack * stack = backend_for (refs , newrefname , & newrefname )-> stack ;
1818
1835
struct write_copy_arg arg = {
1819
1836
.refs = refs ,
1820
1837
.stack = stack ,
@@ -1952,11 +1969,11 @@ static struct ref_iterator *reftable_be_reflog_iterator_begin(struct ref_store *
1952
1969
reftable_be_downcast (ref_store , REF_STORE_READ , "reflog_iterator_begin" );
1953
1970
struct reftable_reflog_iterator * main_iter , * worktree_iter ;
1954
1971
1955
- main_iter = reflog_iterator_for_stack (refs , refs -> main_stack );
1956
- if (!refs -> worktree_stack )
1972
+ main_iter = reflog_iterator_for_stack (refs , refs -> main_backend . stack );
1973
+ if (!refs -> worktree_backend . stack )
1957
1974
return & main_iter -> base ;
1958
1975
1959
- worktree_iter = reflog_iterator_for_stack (refs , refs -> worktree_stack );
1976
+ worktree_iter = reflog_iterator_for_stack (refs , refs -> worktree_backend . stack );
1960
1977
1961
1978
return merge_ref_iterator_begin (& worktree_iter -> base , & main_iter -> base ,
1962
1979
ref_iterator_select , NULL );
@@ -1995,7 +2012,7 @@ static int reftable_be_for_each_reflog_ent_reverse(struct ref_store *ref_store,
1995
2012
{
1996
2013
struct reftable_ref_store * refs =
1997
2014
reftable_be_downcast (ref_store , REF_STORE_READ , "for_each_reflog_ent_reverse" );
1998
- struct reftable_stack * stack = stack_for (refs , refname , & refname );
2015
+ struct reftable_stack * stack = backend_for (refs , refname , & refname )-> stack ;
1999
2016
struct reftable_log_record log = {0 };
2000
2017
struct reftable_iterator it = {0 };
2001
2018
int ret ;
@@ -2035,7 +2052,7 @@ static int reftable_be_for_each_reflog_ent(struct ref_store *ref_store,
2035
2052
{
2036
2053
struct reftable_ref_store * refs =
2037
2054
reftable_be_downcast (ref_store , REF_STORE_READ , "for_each_reflog_ent" );
2038
- struct reftable_stack * stack = stack_for (refs , refname , & refname );
2055
+ struct reftable_stack * stack = backend_for (refs , refname , & refname )-> stack ;
2039
2056
struct reftable_log_record * logs = NULL ;
2040
2057
struct reftable_iterator it = {0 };
2041
2058
size_t logs_alloc = 0 , logs_nr = 0 , i ;
@@ -2084,7 +2101,7 @@ static int reftable_be_reflog_exists(struct ref_store *ref_store,
2084
2101
{
2085
2102
struct reftable_ref_store * refs =
2086
2103
reftable_be_downcast (ref_store , REF_STORE_READ , "reflog_exists" );
2087
- struct reftable_stack * stack = stack_for (refs , refname , & refname );
2104
+ struct reftable_stack * stack = backend_for (refs , refname , & refname )-> stack ;
2088
2105
struct reftable_log_record log = {0 };
2089
2106
struct reftable_iterator it = {0 };
2090
2107
int ret ;
@@ -2169,7 +2186,7 @@ static int reftable_be_create_reflog(struct ref_store *ref_store,
2169
2186
{
2170
2187
struct reftable_ref_store * refs =
2171
2188
reftable_be_downcast (ref_store , REF_STORE_WRITE , "create_reflog" );
2172
- struct reftable_stack * stack = stack_for (refs , refname , & refname );
2189
+ struct reftable_stack * stack = backend_for (refs , refname , & refname )-> stack ;
2173
2190
struct write_reflog_existence_arg arg = {
2174
2191
.refs = refs ,
2175
2192
.stack = stack ,
@@ -2243,7 +2260,7 @@ static int reftable_be_delete_reflog(struct ref_store *ref_store,
2243
2260
{
2244
2261
struct reftable_ref_store * refs =
2245
2262
reftable_be_downcast (ref_store , REF_STORE_WRITE , "delete_reflog" );
2246
- struct reftable_stack * stack = stack_for (refs , refname , & refname );
2263
+ struct reftable_stack * stack = backend_for (refs , refname , & refname )-> stack ;
2247
2264
struct write_reflog_delete_arg arg = {
2248
2265
.stack = stack ,
2249
2266
.refname = refname ,
@@ -2352,7 +2369,7 @@ static int reftable_be_reflog_expire(struct ref_store *ref_store,
2352
2369
*/
2353
2370
struct reftable_ref_store * refs =
2354
2371
reftable_be_downcast (ref_store , REF_STORE_WRITE , "reflog_expire" );
2355
- struct reftable_stack * stack = stack_for (refs , refname , & refname );
2372
+ struct reftable_stack * stack = backend_for (refs , refname , & refname )-> stack ;
2356
2373
struct reftable_log_record * logs = NULL ;
2357
2374
struct reftable_log_record * rewritten = NULL ;
2358
2375
struct reftable_ref_record ref_record = {0 };
0 commit comments