@@ -33,14 +33,16 @@ static const char *short_commit_name(struct repository *repo,
3333 DEFAULT_ABBREV );
3434}
3535
36- static struct commit * peel_committish (struct repository * repo , const char * name )
36+ static struct commit * peel_committish (struct repository * repo ,
37+ const char * name ,
38+ const char * mode )
3739{
3840 struct object * obj ;
3941 struct object_id oid ;
4042
4143 if (repo_get_oid (repo , name , & oid ))
42- return NULL ;
43- obj = parse_object (repo , & oid );
44+ die ( _ ( "'%s' is not a valid commit-ish for %s" ), name , mode ) ;
45+ obj = parse_object_or_die (repo , & oid , name );
4446 return (struct commit * )repo_peel_to_type (repo , name , 0 , obj ,
4547 OBJ_COMMIT );
4648}
@@ -162,12 +164,12 @@ static void get_ref_information(struct repository *repo,
162164 }
163165}
164166
165- static void determine_replay_mode (struct repository * repo ,
166- struct rev_cmdline_info * cmd_info ,
167- const char * onto_name ,
168- char * * advance_name ,
169- struct commit * * onto ,
170- struct strset * * update_refs )
167+ static void set_up_replay_mode (struct repository * repo ,
168+ struct rev_cmdline_info * cmd_info ,
169+ const char * onto_name ,
170+ char * * advance_name ,
171+ struct commit * * onto ,
172+ struct strset * * update_refs )
171173{
172174 struct ref_info rinfo ;
173175
@@ -178,69 +180,30 @@ static void determine_replay_mode(struct repository *repo,
178180 die_for_incompatible_opt2 (!!onto_name , "--onto" ,
179181 !!* advance_name , "--advance" );
180182 if (onto_name ) {
181- * onto = peel_committish (repo , onto_name );
183+ * onto = peel_committish (repo , onto_name , "--onto" );
182184 if (rinfo .positive_refexprs <
183185 strset_get_size (& rinfo .positive_refs ))
184186 die (_ ("all positive revisions given must be references" ));
185- } else if (* advance_name ) {
187+ * update_refs = xcalloc (1 , sizeof (* * update_refs ));
188+ * * update_refs = rinfo .positive_refs ;
189+ memset (& rinfo .positive_refs , 0 , sizeof (* * update_refs ));
190+ } else {
186191 struct object_id oid ;
187192 char * fullname = NULL ;
188193
189- * onto = peel_committish (repo , * advance_name );
194+ if (!* advance_name )
195+ BUG ("expected either onto_name or *advance_name in this function" );
196+
190197 if (repo_dwim_ref (repo , * advance_name , strlen (* advance_name ),
191198 & oid , & fullname , 0 ) == 1 ) {
192199 free (* advance_name );
193200 * advance_name = fullname ;
194201 } else {
195202 die (_ ("argument to --advance must be a reference" ));
196203 }
204+ * onto = peel_committish (repo , * advance_name , "--advance" );
197205 if (rinfo .positive_refexprs > 1 )
198206 die (_ ("cannot advance target with multiple sources because ordering would be ill-defined" ));
199- } else {
200- int positive_refs_complete = (
201- rinfo .positive_refexprs ==
202- strset_get_size (& rinfo .positive_refs ));
203- int negative_refs_complete = (
204- rinfo .negative_refexprs ==
205- strset_get_size (& rinfo .negative_refs ));
206- /*
207- * We need either positive_refs_complete or
208- * negative_refs_complete, but not both.
209- */
210- if (rinfo .negative_refexprs > 0 &&
211- positive_refs_complete == negative_refs_complete )
212- die (_ ("cannot implicitly determine whether this is an --advance or --onto operation" ));
213- if (negative_refs_complete ) {
214- struct hashmap_iter iter ;
215- struct strmap_entry * entry ;
216- const char * last_key = NULL ;
217-
218- if (rinfo .negative_refexprs == 0 )
219- die (_ ("all positive revisions given must be references" ));
220- else if (rinfo .negative_refexprs > 1 )
221- die (_ ("cannot implicitly determine whether this is an --advance or --onto operation" ));
222- else if (rinfo .positive_refexprs > 1 )
223- die (_ ("cannot advance target with multiple source branches because ordering would be ill-defined" ));
224-
225- /* Only one entry, but we have to loop to get it */
226- strset_for_each_entry (& rinfo .negative_refs ,
227- & iter , entry ) {
228- last_key = entry -> key ;
229- }
230-
231- free (* advance_name );
232- * advance_name = xstrdup_or_null (last_key );
233- } else { /* positive_refs_complete */
234- if (rinfo .negative_refexprs > 1 )
235- die (_ ("cannot implicitly determine correct base for --onto" ));
236- if (rinfo .negative_refexprs == 1 )
237- * onto = rinfo .onto ;
238- }
239- }
240- if (!* advance_name ) {
241- * update_refs = xcalloc (1 , sizeof (* * update_refs ));
242- * * update_refs = rinfo .positive_refs ;
243- memset (& rinfo .positive_refs , 0 , sizeof (* * update_refs ));
244207 }
245208 strset_clear (& rinfo .negative_refs );
246209 strset_clear (& rinfo .positive_refs );
@@ -451,11 +414,11 @@ int cmd_replay(int argc,
451414 revs .simplify_history = 0 ;
452415 }
453416
454- determine_replay_mode (repo , & revs .cmdline , onto_name , & advance_name ,
455- & onto , & update_refs );
417+ set_up_replay_mode (repo , & revs .cmdline ,
418+ onto_name , & advance_name ,
419+ & onto , & update_refs );
456420
457- if (!onto ) /* FIXME: Should handle replaying down to root commit */
458- die ("Replaying down to root commit is not supported yet!" );
421+ /* FIXME: Should allow replaying commits with the first as a root commit */
459422
460423 /* Build reflog message */
461424 if (advance_name_opt )
@@ -491,7 +454,7 @@ int cmd_replay(int argc,
491454 int hr ;
492455
493456 if (!commit -> parents )
494- die (_ ("replaying down to root commit is not supported yet!" ));
457+ die (_ ("replaying down from root commit is not supported yet!" ));
495458 if (commit -> parents -> next )
496459 die (_ ("replaying merge commits is not supported yet!" ));
497460
0 commit comments