@@ -918,7 +918,7 @@ int refs_delete_ref(struct ref_store *refs, const char *msg,
918918 struct ref_transaction * transaction ;
919919 struct strbuf err = STRBUF_INIT ;
920920
921- transaction = ref_store_transaction_begin (refs , & err );
921+ transaction = ref_store_transaction_begin (refs , 0 , & err );
922922 if (!transaction ||
923923 ref_transaction_delete (transaction , refname , old_oid ,
924924 NULL , flags , msg , & err ) ||
@@ -1116,13 +1116,15 @@ int read_ref_at(struct ref_store *refs, const char *refname,
11161116}
11171117
11181118struct ref_transaction * ref_store_transaction_begin (struct ref_store * refs ,
1119+ unsigned int flags ,
11191120 struct strbuf * err )
11201121{
11211122 struct ref_transaction * tr ;
11221123 assert (err );
11231124
11241125 CALLOC_ARRAY (tr , 1 );
11251126 tr -> ref_store = refs ;
1127+ tr -> flags = flags ;
11261128 return tr ;
11271129}
11281130
@@ -1186,8 +1188,9 @@ struct ref_update *ref_transaction_add_update(
11861188 oidcpy (& update -> new_oid , new_oid );
11871189 if ((flags & REF_HAVE_OLD ) && old_oid )
11881190 oidcpy (& update -> old_oid , old_oid );
1191+ if (!(flags & REF_SKIP_CREATE_REFLOG ))
1192+ update -> msg = normalize_reflog_message (msg );
11891193
1190- update -> msg = normalize_reflog_message (msg );
11911194 return update ;
11921195}
11931196
@@ -1309,7 +1312,7 @@ int refs_update_ref(struct ref_store *refs, const char *msg,
13091312 struct strbuf err = STRBUF_INIT ;
13101313 int ret = 0 ;
13111314
1312- t = ref_store_transaction_begin (refs , & err );
1315+ t = ref_store_transaction_begin (refs , 0 , & err );
13131316 if (!t ||
13141317 ref_transaction_update (t , refname , new_oid , old_oid , NULL , NULL ,
13151318 flags , msg , & err ) ||
@@ -2120,7 +2123,7 @@ int refs_update_symref(struct ref_store *refs, const char *ref,
21202123 struct strbuf err = STRBUF_INIT ;
21212124 int ret = 0 ;
21222125
2123- transaction = ref_store_transaction_begin (refs , & err );
2126+ transaction = ref_store_transaction_begin (refs , 0 , & err );
21242127 if (!transaction ||
21252128 ref_transaction_update (transaction , ref , NULL , NULL ,
21262129 target , NULL , REF_NO_DEREF ,
@@ -2316,7 +2319,7 @@ int ref_transaction_commit(struct ref_transaction *transaction,
23162319 }
23172320
23182321 ret = refs -> be -> transaction_finish (refs , transaction , err );
2319- if (!ret )
2322+ if (!ret && !( transaction -> flags & REF_TRANSACTION_FLAG_INITIAL ) )
23202323 run_transaction_hook (transaction , "committed" );
23212324 return ret ;
23222325}
@@ -2325,6 +2328,7 @@ int refs_verify_refname_available(struct ref_store *refs,
23252328 const char * refname ,
23262329 const struct string_list * extras ,
23272330 const struct string_list * skip ,
2331+ int initial_transaction ,
23282332 struct strbuf * err )
23292333{
23302334 const char * slash ;
@@ -2333,8 +2337,6 @@ int refs_verify_refname_available(struct ref_store *refs,
23332337 struct strbuf referent = STRBUF_INIT ;
23342338 struct object_id oid ;
23352339 unsigned int type ;
2336- struct ref_iterator * iter ;
2337- int ok ;
23382340 int ret = -1 ;
23392341
23402342 /*
@@ -2364,7 +2366,8 @@ int refs_verify_refname_available(struct ref_store *refs,
23642366 if (skip && string_list_has_string (skip , dirname .buf ))
23652367 continue ;
23662368
2367- if (!refs_read_raw_ref (refs , dirname .buf , & oid , & referent ,
2369+ if (!initial_transaction &&
2370+ !refs_read_raw_ref (refs , dirname .buf , & oid , & referent ,
23682371 & type , & ignore_errno )) {
23692372 strbuf_addf (err , _ ("'%s' exists; cannot create '%s'" ),
23702373 dirname .buf , refname );
@@ -2389,21 +2392,26 @@ int refs_verify_refname_available(struct ref_store *refs,
23892392 strbuf_addstr (& dirname , refname + dirname .len );
23902393 strbuf_addch (& dirname , '/' );
23912394
2392- iter = refs_ref_iterator_begin (refs , dirname .buf , NULL , 0 ,
2393- DO_FOR_EACH_INCLUDE_BROKEN );
2394- while ((ok = ref_iterator_advance (iter )) == ITER_OK ) {
2395- if (skip &&
2396- string_list_has_string (skip , iter -> refname ))
2397- continue ;
2395+ if (!initial_transaction ) {
2396+ struct ref_iterator * iter ;
2397+ int ok ;
23982398
2399- strbuf_addf (err , _ ("'%s' exists; cannot create '%s'" ),
2400- iter -> refname , refname );
2401- ref_iterator_abort (iter );
2402- goto cleanup ;
2403- }
2399+ iter = refs_ref_iterator_begin (refs , dirname .buf , NULL , 0 ,
2400+ DO_FOR_EACH_INCLUDE_BROKEN );
2401+ while ((ok = ref_iterator_advance (iter )) == ITER_OK ) {
2402+ if (skip &&
2403+ string_list_has_string (skip , iter -> refname ))
2404+ continue ;
2405+
2406+ strbuf_addf (err , _ ("'%s' exists; cannot create '%s'" ),
2407+ iter -> refname , refname );
2408+ ref_iterator_abort (iter );
2409+ goto cleanup ;
2410+ }
24042411
2405- if (ok != ITER_DONE )
2406- BUG ("error while iterating over references" );
2412+ if (ok != ITER_DONE )
2413+ BUG ("error while iterating over references" );
2414+ }
24072415
24082416 extra_refname = find_descendant_ref (dirname .buf , extras , skip );
24092417 if (extra_refname )
@@ -2487,14 +2495,6 @@ int refs_reflog_expire(struct ref_store *refs,
24872495 cleanup_fn , policy_cb_data );
24882496}
24892497
2490- int initial_ref_transaction_commit (struct ref_transaction * transaction ,
2491- struct strbuf * err )
2492- {
2493- struct ref_store * refs = transaction -> ref_store ;
2494-
2495- return refs -> be -> initial_transaction_commit (refs , transaction , err );
2496- }
2497-
24982498void ref_transaction_for_each_queued_update (struct ref_transaction * transaction ,
24992499 ref_transaction_for_each_queued_update_fn cb ,
25002500 void * cb_data )
@@ -2530,7 +2530,7 @@ int refs_delete_refs(struct ref_store *refs, const char *logmsg,
25302530 * individual updates can't fail, so we can pack all of the
25312531 * updates into a single transaction.
25322532 */
2533- transaction = ref_store_transaction_begin (refs , & err );
2533+ transaction = ref_store_transaction_begin (refs , 0 , & err );
25342534 if (!transaction ) {
25352535 ret = error ("%s" , err .buf );
25362536 goto out ;
@@ -2836,7 +2836,8 @@ int repo_migrate_ref_storage_format(struct repository *repo,
28362836 if (ret < 0 )
28372837 goto done ;
28382838
2839- transaction = ref_store_transaction_begin (new_refs , errbuf );
2839+ transaction = ref_store_transaction_begin (new_refs , REF_TRANSACTION_FLAG_INITIAL ,
2840+ errbuf );
28402841 if (!transaction )
28412842 goto done ;
28422843
@@ -2861,13 +2862,6 @@ int repo_migrate_ref_storage_format(struct repository *repo,
28612862 if (ret < 0 )
28622863 goto done ;
28632864
2864- /*
2865- * TODO: we might want to migrate to `initial_ref_transaction_commit()`
2866- * here, which is more efficient for the files backend because it would
2867- * write new refs into the packed-refs file directly. At this point,
2868- * the files backend doesn't handle pseudo-refs and symrefs correctly
2869- * though, so this requires some more work.
2870- */
28712865 ret = ref_transaction_commit (transaction , errbuf );
28722866 if (ret < 0 )
28732867 goto done ;
0 commit comments