@@ -51,6 +51,50 @@ static void reftable_backend_release(struct reftable_backend *be)
5151 be -> stack = NULL ;
5252}
5353
54+ static int reftable_backend_read_ref (struct reftable_backend * be ,
55+ const char * refname ,
56+ struct object_id * oid ,
57+ struct strbuf * referent ,
58+ unsigned int * type )
59+ {
60+ struct reftable_ref_record ref = {0 };
61+ int ret ;
62+
63+ ret = reftable_stack_read_ref (be -> stack , refname , & ref );
64+ if (ret )
65+ goto done ;
66+
67+ if (ref .value_type == REFTABLE_REF_SYMREF ) {
68+ strbuf_reset (referent );
69+ strbuf_addstr (referent , ref .value .symref );
70+ * type |= REF_ISSYMREF ;
71+ } else if (reftable_ref_record_val1 (& ref )) {
72+ unsigned int hash_id ;
73+
74+ switch (reftable_stack_hash_id (be -> stack )) {
75+ case REFTABLE_HASH_SHA1 :
76+ hash_id = GIT_HASH_SHA1 ;
77+ break ;
78+ case REFTABLE_HASH_SHA256 :
79+ hash_id = GIT_HASH_SHA256 ;
80+ break ;
81+ default :
82+ BUG ("unhandled hash ID %d" , reftable_stack_hash_id (be -> stack ));
83+ }
84+
85+ oidread (oid , reftable_ref_record_val1 (& ref ),
86+ & hash_algos [hash_id ]);
87+ } else {
88+ /* We got a tombstone, which should not happen. */
89+ BUG ("unhandled reference value type %d" , ref .value_type );
90+ }
91+
92+ done :
93+ assert (ret != REFTABLE_API_ERROR );
94+ reftable_ref_record_release (& ref );
95+ return ret ;
96+ }
97+
5498struct reftable_ref_store {
5599 struct ref_store base ;
56100
@@ -243,38 +287,6 @@ static void fill_reftable_log_record(struct reftable_log_record *log, const stru
243287 log -> value .update .tz_offset = sign * atoi (tz_begin );
244288}
245289
246- static int read_ref_without_reload (struct reftable_ref_store * refs ,
247- struct reftable_stack * stack ,
248- const char * refname ,
249- struct object_id * oid ,
250- struct strbuf * referent ,
251- unsigned int * type )
252- {
253- struct reftable_ref_record ref = {0 };
254- int ret ;
255-
256- ret = reftable_stack_read_ref (stack , refname , & ref );
257- if (ret )
258- goto done ;
259-
260- if (ref .value_type == REFTABLE_REF_SYMREF ) {
261- strbuf_reset (referent );
262- strbuf_addstr (referent , ref .value .symref );
263- * type |= REF_ISSYMREF ;
264- } else if (reftable_ref_record_val1 (& ref )) {
265- oidread (oid , reftable_ref_record_val1 (& ref ),
266- refs -> base .repo -> hash_algo );
267- } else {
268- /* We got a tombstone, which should not happen. */
269- BUG ("unhandled reference value type %d" , ref .value_type );
270- }
271-
272- done :
273- assert (ret != REFTABLE_API_ERROR );
274- reftable_ref_record_release (& ref );
275- return ret ;
276- }
277-
278290static int reftable_be_config (const char * var , const char * value ,
279291 const struct config_context * ctx ,
280292 void * _opts )
@@ -855,7 +867,7 @@ static int reftable_be_read_raw_ref(struct ref_store *ref_store,
855867 if (ret )
856868 return ret ;
857869
858- ret = read_ref_without_reload ( refs , be -> stack , refname , oid , referent , type );
870+ ret = reftable_backend_read_ref ( be , refname , oid , referent , type );
859871 if (ret < 0 )
860872 return ret ;
861873 if (ret > 0 ) {
@@ -1074,8 +1086,8 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store,
10741086 if (ret )
10751087 goto done ;
10761088
1077- ret = read_ref_without_reload ( refs , be -> stack , "HEAD" ,
1078- & head_oid , & head_referent , & head_type );
1089+ ret = reftable_backend_read_ref ( be , "HEAD" , & head_oid ,
1090+ & head_referent , & head_type );
10791091 if (ret < 0 )
10801092 goto done ;
10811093 ret = 0 ;
@@ -1143,8 +1155,8 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store,
11431155 string_list_insert (& affected_refnames , new_update -> refname );
11441156 }
11451157
1146- ret = read_ref_without_reload ( refs , be -> stack , rewritten_ref ,
1147- & current_oid , & referent , & u -> type );
1158+ ret = reftable_backend_read_ref ( be , rewritten_ref ,
1159+ & current_oid , & referent , & u -> type );
11481160 if (ret < 0 )
11491161 goto done ;
11501162 if (ret > 0 && !ref_update_expects_existing_old_ref (u )) {
@@ -1602,7 +1614,7 @@ struct write_create_symref_arg {
16021614
16031615struct write_copy_arg {
16041616 struct reftable_ref_store * refs ;
1605- struct reftable_stack * stack ;
1617+ struct reftable_backend * be ;
16061618 const char * oldname ;
16071619 const char * newname ;
16081620 const char * logmsg ;
@@ -1627,7 +1639,7 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
16271639 if (split_ident_line (& committer_ident , committer_info , strlen (committer_info )))
16281640 BUG ("failed splitting committer info" );
16291641
1630- if (reftable_stack_read_ref (arg -> stack , arg -> oldname , & old_ref )) {
1642+ if (reftable_stack_read_ref (arg -> be -> stack , arg -> oldname , & old_ref )) {
16311643 ret = error (_ ("refname %s not found" ), arg -> oldname );
16321644 goto done ;
16331645 }
@@ -1666,7 +1678,7 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
16661678 * the old branch and the creation of the new branch, and we cannot do
16671679 * two changes to a reflog in a single update.
16681680 */
1669- deletion_ts = creation_ts = reftable_stack_next_update_index (arg -> stack );
1681+ deletion_ts = creation_ts = reftable_stack_next_update_index (arg -> be -> stack );
16701682 if (arg -> delete_old )
16711683 creation_ts ++ ;
16721684 reftable_writer_set_limits (writer , deletion_ts , creation_ts );
@@ -1709,8 +1721,8 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
17091721 memcpy (logs [logs_nr ].value .update .old_hash , old_ref .value .val1 , GIT_MAX_RAWSZ );
17101722 logs_nr ++ ;
17111723
1712- ret = read_ref_without_reload (arg -> refs , arg -> stack , "HEAD" , & head_oid ,
1713- & head_referent , & head_type );
1724+ ret = reftable_backend_read_ref (arg -> be , "HEAD" , & head_oid ,
1725+ & head_referent , & head_type );
17141726 if (ret < 0 )
17151727 goto done ;
17161728 append_head_reflog = (head_type & REF_ISSYMREF ) && !strcmp (head_referent .buf , arg -> oldname );
@@ -1753,7 +1765,7 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
17531765 * copy over all log entries from the old reflog. Last but not least,
17541766 * when renaming we also have to delete all the old reflog entries.
17551767 */
1756- ret = reftable_stack_init_log_iterator (arg -> stack , & it );
1768+ ret = reftable_stack_init_log_iterator (arg -> be -> stack , & it );
17571769 if (ret < 0 )
17581770 goto done ;
17591771
@@ -1826,7 +1838,6 @@ static int reftable_be_rename_ref(struct ref_store *ref_store,
18261838{
18271839 struct reftable_ref_store * refs =
18281840 reftable_be_downcast (ref_store , REF_STORE_WRITE , "rename_ref" );
1829- struct reftable_backend * be ;
18301841 struct write_copy_arg arg = {
18311842 .refs = refs ,
18321843 .oldname = oldrefname ,
@@ -1840,11 +1851,10 @@ static int reftable_be_rename_ref(struct ref_store *ref_store,
18401851 if (ret < 0 )
18411852 goto done ;
18421853
1843- ret = backend_for (& be , refs , newrefname , & newrefname , 1 );
1854+ ret = backend_for (& arg . be , refs , newrefname , & newrefname , 1 );
18441855 if (ret )
18451856 goto done ;
1846- arg .stack = be -> stack ;
1847- ret = reftable_stack_add (be -> stack , & write_copy_table , & arg );
1857+ ret = reftable_stack_add (arg .be -> stack , & write_copy_table , & arg );
18481858
18491859done :
18501860 assert (ret != REFTABLE_API_ERROR );
@@ -1858,7 +1868,6 @@ static int reftable_be_copy_ref(struct ref_store *ref_store,
18581868{
18591869 struct reftable_ref_store * refs =
18601870 reftable_be_downcast (ref_store , REF_STORE_WRITE , "copy_ref" );
1861- struct reftable_backend * be ;
18621871 struct write_copy_arg arg = {
18631872 .refs = refs ,
18641873 .oldname = oldrefname ,
@@ -1871,11 +1880,10 @@ static int reftable_be_copy_ref(struct ref_store *ref_store,
18711880 if (ret < 0 )
18721881 goto done ;
18731882
1874- ret = backend_for (& be , refs , newrefname , & newrefname , 1 );
1883+ ret = backend_for (& arg . be , refs , newrefname , & newrefname , 1 );
18751884 if (ret )
18761885 goto done ;
1877- arg .stack = be -> stack ;
1878- ret = reftable_stack_add (be -> stack , & write_copy_table , & arg );
1886+ ret = reftable_stack_add (arg .be -> stack , & write_copy_table , & arg );
18791887
18801888done :
18811889 assert (ret != REFTABLE_API_ERROR );
0 commit comments