@@ -693,29 +693,39 @@ int upgrade_repository_format(int target_version)
693693 struct strbuf err = STRBUF_INIT ;
694694 struct strbuf repo_version = STRBUF_INIT ;
695695 struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT ;
696+ int ret ;
696697
697698 strbuf_git_common_path (& sb , the_repository , "config" );
698699 read_repository_format (& repo_fmt , sb .buf );
699700 strbuf_release (& sb );
700701
701- if (repo_fmt .version >= target_version )
702- return 0 ;
702+ if (repo_fmt .version >= target_version ) {
703+ ret = 0 ;
704+ goto out ;
705+ }
703706
704707 if (verify_repository_format (& repo_fmt , & err ) < 0 ) {
705- error ("cannot upgrade repository format from %d to %d: %s" ,
706- repo_fmt .version , target_version , err .buf );
707- strbuf_release (& err );
708- return -1 ;
708+ ret = error ("cannot upgrade repository format from %d to %d: %s" ,
709+ repo_fmt .version , target_version , err .buf );
710+ goto out ;
711+ }
712+ if (!repo_fmt .version && repo_fmt .unknown_extensions .nr ) {
713+ ret = error ("cannot upgrade repository format: "
714+ "unknown extension %s" ,
715+ repo_fmt .unknown_extensions .items [0 ].string );
716+ goto out ;
709717 }
710- if (!repo_fmt .version && repo_fmt .unknown_extensions .nr )
711- return error ("cannot upgrade repository format: "
712- "unknown extension %s" ,
713- repo_fmt .unknown_extensions .items [0 ].string );
714718
715719 strbuf_addf (& repo_version , "%d" , target_version );
716720 git_config_set ("core.repositoryformatversion" , repo_version .buf );
721+
722+ ret = 1 ;
723+
724+ out :
725+ clear_repository_format (& repo_fmt );
717726 strbuf_release (& repo_version );
718- return 1 ;
727+ strbuf_release (& err );
728+ return ret ;
719729}
720730
721731static void init_repository_format (struct repository_format * format )
@@ -2190,6 +2200,7 @@ int init_db(const char *git_dir, const char *real_git_dir,
21902200 git_dir , len && git_dir [len - 1 ] != '/' ? "/" : "" );
21912201 }
21922202
2203+ clear_repository_format (& repo_fmt );
21932204 free (original_git_dir );
21942205 return 0 ;
21952206}
0 commit comments