@@ -126,29 +126,59 @@ int git_refdb_lookup(git_reference **out, git_refdb *db, const char *ref_name)
126126
127127int git_refdb_iterator (git_reference_iterator * * out , git_refdb * db )
128128{
129- git_reference_iterator * iter ;
130-
131129 if (!db -> backend || !db -> backend -> iterator ) {
132130 giterr_set (GITERR_REFERENCE , "This backend doesn't support iterators" );
133131 return -1 ;
134132 }
135133
136- if (db -> backend -> iterator (& iter , db -> backend ) < 0 ) {
137- git__free (iter );
134+ if (db -> backend -> iterator (out , db -> backend ) < 0 )
135+ return -1 ;
136+
137+ return 0 ;
138+ }
139+
140+ int git_refdb_iterator_glob (git_reference_iterator * * out , git_refdb * db , const char * glob )
141+ {
142+ if (!db -> backend ) {
143+ giterr_set (GITERR_REFERENCE , "There are no backends loaded" );
144+ return -1 ;
145+ }
146+
147+ if (db -> backend -> iterator_glob )
148+ return db -> backend -> iterator_glob (out , db -> backend , glob );
149+
150+ /* If the backend doesn't support glob-filtering themselves, we have to do it */
151+ if (db -> backend -> iterator (out , db -> backend ) < 0 )
152+ return -1 ;
153+
154+ (* out )-> glob = git__strdup (glob );
155+ if (!(* out )-> glob ) {
156+ db -> backend -> iterator_free (* out );
138157 return -1 ;
139158 }
140159
141- * out = iter ;
142160 return 0 ;
143161}
144162
145163int git_refdb_next (const char * * out , git_reference_iterator * iter )
146164{
147- return iter -> backend -> next (out , iter );
165+ int error ;
166+
167+ if (!iter -> glob )
168+ return iter -> backend -> next (out , iter );
169+
170+ /* If the iterator has a glob, we need to filter */
171+ while ((error = iter -> backend -> next (out , iter )) == 0 ) {
172+ if (!p_fnmatch (iter -> glob , * out , 0 ))
173+ break ;
174+ }
175+
176+ return error ;
148177}
149178
150179void git_refdb_iterator_free (git_reference_iterator * iter )
151180{
181+ git__free (iter -> glob );
152182 iter -> backend -> iterator_free (iter );
153183}
154184
0 commit comments