@@ -738,152 +738,6 @@ static struct ref_iterator *cache_ref_iterator_begin(struct ref_dir *dir)
738
738
return ref_iterator ;
739
739
}
740
740
741
- struct nonmatching_ref_data {
742
- const struct string_list * skip ;
743
- const char * conflicting_refname ;
744
- };
745
-
746
- static int nonmatching_ref_fn (struct ref_entry * entry , void * vdata )
747
- {
748
- struct nonmatching_ref_data * data = vdata ;
749
-
750
- if (data -> skip && string_list_has_string (data -> skip , entry -> name ))
751
- return 0 ;
752
-
753
- data -> conflicting_refname = entry -> name ;
754
- return 1 ;
755
- }
756
-
757
- /*
758
- * Return 0 if a reference named refname could be created without
759
- * conflicting with the name of an existing reference in dir.
760
- * See verify_refname_available for more information.
761
- */
762
- static int verify_refname_available_dir (const char * refname ,
763
- const struct string_list * extras ,
764
- const struct string_list * skip ,
765
- struct ref_dir * dir ,
766
- struct strbuf * err )
767
- {
768
- const char * slash ;
769
- const char * extra_refname ;
770
- int pos ;
771
- struct strbuf dirname = STRBUF_INIT ;
772
- int ret = -1 ;
773
-
774
- /*
775
- * For the sake of comments in this function, suppose that
776
- * refname is "refs/foo/bar".
777
- */
778
-
779
- assert (err );
780
-
781
- strbuf_grow (& dirname , strlen (refname ) + 1 );
782
- for (slash = strchr (refname , '/' ); slash ; slash = strchr (slash + 1 , '/' )) {
783
- /* Expand dirname to the new prefix, not including the trailing slash: */
784
- strbuf_add (& dirname , refname + dirname .len , slash - refname - dirname .len );
785
-
786
- /*
787
- * We are still at a leading dir of the refname (e.g.,
788
- * "refs/foo"; if there is a reference with that name,
789
- * it is a conflict, *unless* it is in skip.
790
- */
791
- if (dir ) {
792
- pos = search_ref_dir (dir , dirname .buf , dirname .len );
793
- if (pos >= 0 &&
794
- (!skip || !string_list_has_string (skip , dirname .buf ))) {
795
- /*
796
- * We found a reference whose name is
797
- * a proper prefix of refname; e.g.,
798
- * "refs/foo", and is not in skip.
799
- */
800
- strbuf_addf (err , "'%s' exists; cannot create '%s'" ,
801
- dirname .buf , refname );
802
- goto cleanup ;
803
- }
804
- }
805
-
806
- if (extras && string_list_has_string (extras , dirname .buf ) &&
807
- (!skip || !string_list_has_string (skip , dirname .buf ))) {
808
- strbuf_addf (err , "cannot process '%s' and '%s' at the same time" ,
809
- refname , dirname .buf );
810
- goto cleanup ;
811
- }
812
-
813
- /*
814
- * Otherwise, we can try to continue our search with
815
- * the next component. So try to look up the
816
- * directory, e.g., "refs/foo/". If we come up empty,
817
- * we know there is nothing under this whole prefix,
818
- * but even in that case we still have to continue the
819
- * search for conflicts with extras.
820
- */
821
- strbuf_addch (& dirname , '/' );
822
- if (dir ) {
823
- pos = search_ref_dir (dir , dirname .buf , dirname .len );
824
- if (pos < 0 ) {
825
- /*
826
- * There was no directory "refs/foo/",
827
- * so there is nothing under this
828
- * whole prefix. So there is no need
829
- * to continue looking for conflicting
830
- * references. But we need to continue
831
- * looking for conflicting extras.
832
- */
833
- dir = NULL ;
834
- } else {
835
- dir = get_ref_dir (dir -> entries [pos ]);
836
- }
837
- }
838
- }
839
-
840
- /*
841
- * We are at the leaf of our refname (e.g., "refs/foo/bar").
842
- * There is no point in searching for a reference with that
843
- * name, because a refname isn't considered to conflict with
844
- * itself. But we still need to check for references whose
845
- * names are in the "refs/foo/bar/" namespace, because they
846
- * *do* conflict.
847
- */
848
- strbuf_addstr (& dirname , refname + dirname .len );
849
- strbuf_addch (& dirname , '/' );
850
-
851
- if (dir ) {
852
- pos = search_ref_dir (dir , dirname .buf , dirname .len );
853
-
854
- if (pos >= 0 ) {
855
- /*
856
- * We found a directory named "$refname/"
857
- * (e.g., "refs/foo/bar/"). It is a problem
858
- * iff it contains any ref that is not in
859
- * "skip".
860
- */
861
- struct nonmatching_ref_data data ;
862
-
863
- data .skip = skip ;
864
- data .conflicting_refname = NULL ;
865
- dir = get_ref_dir (dir -> entries [pos ]);
866
- sort_ref_dir (dir );
867
- if (do_for_each_entry_in_dir (dir , 0 , nonmatching_ref_fn , & data )) {
868
- strbuf_addf (err , "'%s' exists; cannot create '%s'" ,
869
- data .conflicting_refname , refname );
870
- goto cleanup ;
871
- }
872
- }
873
- }
874
-
875
- extra_refname = find_descendant_ref (dirname .buf , extras , skip );
876
- if (extra_refname )
877
- strbuf_addf (err , "cannot process '%s' and '%s' at the same time" ,
878
- refname , extra_refname );
879
- else
880
- ret = 0 ;
881
-
882
- cleanup :
883
- strbuf_release (& dirname );
884
- return ret ;
885
- }
886
-
887
741
struct packed_ref_cache {
888
742
struct ref_entry * root ;
889
743
@@ -1562,7 +1416,7 @@ static void unlock_ref(struct ref_lock *lock)
1562
1416
*
1563
1417
* If the reference doesn't already exist, verify that refname doesn't
1564
1418
* have a D/F conflict with any existing references. extras and skip
1565
- * are passed to verify_refname_available_dir () for this check.
1419
+ * are passed to refs_verify_refname_available () for this check.
1566
1420
*
1567
1421
* If mustexist is not set and the reference is not found or is
1568
1422
* broken, lock the reference anyway but clear sha1.
@@ -1577,7 +1431,7 @@ static void unlock_ref(struct ref_lock *lock)
1577
1431
*
1578
1432
* but it includes a lot more code to
1579
1433
* - Deal with possible races with other processes
1580
- * - Avoid calling verify_refname_available_dir () when it can be
1434
+ * - Avoid calling refs_verify_refname_available () when it can be
1581
1435
* avoided, namely if we were successfully able to read the ref
1582
1436
* - Generate informative error messages in the case of failure
1583
1437
*/
@@ -1634,7 +1488,8 @@ static int lock_raw_ref(struct files_ref_store *refs,
1634
1488
} else {
1635
1489
/*
1636
1490
* The error message set by
1637
- * verify_refname_available_dir() is OK.
1491
+ * refs_verify_refname_available() is
1492
+ * OK.
1638
1493
*/
1639
1494
ret = TRANSACTION_NAME_CONFLICT ;
1640
1495
}
@@ -1758,16 +1613,13 @@ static int lock_raw_ref(struct files_ref_store *refs,
1758
1613
1759
1614
/*
1760
1615
* If the ref did not exist and we are creating it,
1761
- * make sure there is no existing packed ref whose
1762
- * name begins with our refname, nor a packed ref
1763
- * whose name is a proper prefix of our refname.
1616
+ * make sure there is no existing ref that conflicts
1617
+ * with refname:
1764
1618
*/
1765
- if (verify_refname_available_dir (
1766
- refname , extras , skip ,
1767
- get_packed_refs (refs ),
1768
- err )) {
1619
+ if (refs_verify_refname_available (
1620
+ & refs -> base , refname ,
1621
+ extras , skip , err ))
1769
1622
goto error_return ;
1770
- }
1771
1623
}
1772
1624
1773
1625
ret = 0 ;
@@ -2122,9 +1974,8 @@ static struct ref_lock *lock_ref_sha1_basic(struct files_ref_store *refs,
2122
1974
* our refname.
2123
1975
*/
2124
1976
if (is_null_oid (& lock -> old_oid ) &&
2125
- verify_refname_available_dir (refname , extras , skip ,
2126
- get_packed_refs (refs ),
2127
- err )) {
1977
+ refs_verify_refname_available (& refs -> base , refname ,
1978
+ extras , skip , err )) {
2128
1979
last_errno = ENOTDIR ;
2129
1980
goto error_return ;
2130
1981
}
0 commit comments