@@ -3645,9 +3645,9 @@ static int do_reset(struct repository *r,
3645
3645
struct strbuf ref_name = STRBUF_INIT ;
3646
3646
struct object_id oid ;
3647
3647
struct lock_file lock = LOCK_INIT ;
3648
- struct tree_desc desc ;
3648
+ struct tree_desc desc = { 0 } ;
3649
3649
struct tree * tree ;
3650
- struct unpack_trees_options unpack_tree_opts ;
3650
+ struct unpack_trees_options unpack_tree_opts = { 0 } ;
3651
3651
int ret = 0 ;
3652
3652
3653
3653
if (repo_hold_locked_index (r , & lock , LOCK_REPORT_ON_ERROR ) < 0 )
@@ -3679,14 +3679,11 @@ static int do_reset(struct repository *r,
3679
3679
strbuf_addf (& ref_name , "refs/rewritten/%.*s" , len , name );
3680
3680
if (get_oid (ref_name .buf , & oid ) &&
3681
3681
get_oid (ref_name .buf + strlen ("refs/rewritten/" ), & oid )) {
3682
- error (_ ("could not read '%s'" ), ref_name .buf );
3683
- rollback_lock_file (& lock );
3684
- strbuf_release (& ref_name );
3685
- return -1 ;
3682
+ ret = error (_ ("could not read '%s'" ), ref_name .buf );
3683
+ goto cleanup ;
3686
3684
}
3687
3685
}
3688
3686
3689
- memset (& unpack_tree_opts , 0 , sizeof (unpack_tree_opts ));
3690
3687
setup_unpack_trees_porcelain (& unpack_tree_opts , "reset" );
3691
3688
unpack_tree_opts .head_idx = 1 ;
3692
3689
unpack_tree_opts .src_index = r -> index ;
@@ -3698,39 +3695,36 @@ static int do_reset(struct repository *r,
3698
3695
init_checkout_metadata (& unpack_tree_opts .meta , name , & oid , NULL );
3699
3696
3700
3697
if (repo_read_index_unmerged (r )) {
3701
- rollback_lock_file (& lock );
3702
- strbuf_release (& ref_name );
3703
- return error_resolve_conflict (_ (action_name (opts )));
3698
+ ret = error_resolve_conflict (_ (action_name (opts )));
3699
+ goto cleanup ;
3704
3700
}
3705
3701
3706
3702
if (!fill_tree_descriptor (r , & desc , & oid )) {
3707
- error (_ ("failed to find tree of %s" ), oid_to_hex (& oid ));
3708
- rollback_lock_file (& lock );
3709
- free ((void * )desc .buffer );
3710
- strbuf_release (& ref_name );
3711
- return -1 ;
3703
+ ret = error (_ ("failed to find tree of %s" ), oid_to_hex (& oid ));
3704
+ goto cleanup ;
3712
3705
}
3713
3706
3714
3707
if (unpack_trees (1 , & desc , & unpack_tree_opts )) {
3715
- rollback_lock_file (& lock );
3716
- free ((void * )desc .buffer );
3717
- strbuf_release (& ref_name );
3718
- return -1 ;
3708
+ ret = -1 ;
3709
+ goto cleanup ;
3719
3710
}
3720
3711
3721
3712
tree = parse_tree_indirect (& oid );
3722
3713
prime_cache_tree (r , r -> index , tree );
3723
3714
3724
3715
if (write_locked_index (r -> index , & lock , COMMIT_LOCK ) < 0 )
3725
3716
ret = error (_ ("could not write index" ));
3726
- free ((void * )desc .buffer );
3727
3717
3728
3718
if (!ret )
3729
3719
ret = update_ref (reflog_message (opts , "reset" , "'%.*s'" ,
3730
3720
len , name ), "HEAD" , & oid ,
3731
3721
NULL , 0 , UPDATE_REFS_MSG_ON_ERR );
3732
-
3722
+ cleanup :
3723
+ free ((void * )desc .buffer );
3724
+ if (ret < 0 )
3725
+ rollback_lock_file (& lock );
3733
3726
strbuf_release (& ref_name );
3727
+ clear_unpack_trees_porcelain (& unpack_tree_opts );
3734
3728
return ret ;
3735
3729
}
3736
3730
0 commit comments