@@ -447,6 +447,54 @@ static int read_worktree_config(const char *var, const char *value, void *vdata)
447
447
return 0 ;
448
448
}
449
449
450
+ enum extension_result {
451
+ EXTENSION_ERROR = -1 , /* compatible with error(), etc */
452
+ EXTENSION_UNKNOWN = 0 ,
453
+ EXTENSION_OK = 1
454
+ };
455
+
456
+ /*
457
+ * Do not add new extensions to this function. It handles extensions which are
458
+ * respected even in v0-format repositories for historical compatibility.
459
+ */
460
+ static enum extension_result handle_extension_v0 (const char * var ,
461
+ const char * value ,
462
+ const char * ext ,
463
+ struct repository_format * data )
464
+ {
465
+ if (!strcmp (ext , "noop" )) {
466
+ return EXTENSION_OK ;
467
+ } else if (!strcmp (ext , "preciousobjects" )) {
468
+ data -> precious_objects = git_config_bool (var , value );
469
+ return EXTENSION_OK ;
470
+ } else if (!strcmp (ext , "partialclone" )) {
471
+ if (!value )
472
+ return config_error_nonbool (var );
473
+ data -> partial_clone = xstrdup (value );
474
+ return EXTENSION_OK ;
475
+ } else if (!strcmp (ext , "worktreeconfig" )) {
476
+ data -> worktree_config = git_config_bool (var , value );
477
+ return EXTENSION_OK ;
478
+ }
479
+
480
+ return EXTENSION_UNKNOWN ;
481
+ }
482
+
483
+ /*
484
+ * Record any new extensions in this function.
485
+ */
486
+ static enum extension_result handle_extension (const char * var ,
487
+ const char * value ,
488
+ const char * ext ,
489
+ struct repository_format * data )
490
+ {
491
+ if (!strcmp (ext , "noop-v1" )) {
492
+ return EXTENSION_OK ;
493
+ }
494
+
495
+ return EXTENSION_UNKNOWN ;
496
+ }
497
+
450
498
static int check_repo_format (const char * var , const char * value , void * vdata )
451
499
{
452
500
struct repository_format * data = vdata ;
@@ -455,23 +503,25 @@ static int check_repo_format(const char *var, const char *value, void *vdata)
455
503
if (strcmp (var , "core.repositoryformatversion" ) == 0 )
456
504
data -> version = git_config_int (var , value );
457
505
else if (skip_prefix (var , "extensions." , & ext )) {
458
- /*
459
- * record any known extensions here; otherwise,
460
- * we fall through to recording it as unknown, and
461
- * check_repository_format will complain
462
- */
463
- if (! strcmp ( ext , "noop" ))
464
- ;
465
- else if (! strcmp ( ext , "preciousobjects" ))
466
- data -> precious_objects = git_config_bool ( var , value );
467
- else if (! strcmp ( ext , "partialclone" )) {
468
- if (! value )
469
- return config_error_nonbool ( var ) ;
470
- data -> partial_clone = xstrdup ( value );
471
- } else if (! strcmp ( ext , "worktreeconfig" ))
472
- data -> worktree_config = git_config_bool ( var , value ) ;
473
- else
506
+ switch ( handle_extension_v0 ( var , value , ext , data )) {
507
+ case EXTENSION_ERROR :
508
+ return -1 ;
509
+ case EXTENSION_OK :
510
+ return 0 ;
511
+ case EXTENSION_UNKNOWN :
512
+ break ;
513
+ }
514
+
515
+ switch ( handle_extension ( var , value , ext , data )) {
516
+ case EXTENSION_ERROR :
517
+ return -1 ;
518
+ case EXTENSION_OK :
519
+ string_list_append ( & data -> v1_only_extensions , ext );
520
+ return 0 ;
521
+ case EXTENSION_UNKNOWN :
474
522
string_list_append (& data -> unknown_extensions , ext );
523
+ return 0 ;
524
+ }
475
525
}
476
526
477
527
return read_worktree_config (var , value , vdata );
@@ -510,6 +560,7 @@ static int check_repository_format_gently(const char *gitdir, struct repository_
510
560
set_repository_format_partial_clone (candidate -> partial_clone );
511
561
repository_format_worktree_config = candidate -> worktree_config ;
512
562
string_list_clear (& candidate -> unknown_extensions , 0 );
563
+ string_list_clear (& candidate -> v1_only_extensions , 0 );
513
564
514
565
if (repository_format_worktree_config ) {
515
566
/*
@@ -588,6 +639,7 @@ int read_repository_format(struct repository_format *format, const char *path)
588
639
void clear_repository_format (struct repository_format * format )
589
640
{
590
641
string_list_clear (& format -> unknown_extensions , 0 );
642
+ string_list_clear (& format -> v1_only_extensions , 0 );
591
643
free (format -> work_tree );
592
644
free (format -> partial_clone );
593
645
init_repository_format (format );
@@ -613,6 +665,18 @@ int verify_repository_format(const struct repository_format *format,
613
665
return -1 ;
614
666
}
615
667
668
+ if (format -> version == 0 && format -> v1_only_extensions .nr ) {
669
+ int i ;
670
+
671
+ strbuf_addstr (err ,
672
+ _ ("repo version is 0, but v1-only extensions found:" ));
673
+
674
+ for (i = 0 ; i < format -> v1_only_extensions .nr ; i ++ )
675
+ strbuf_addf (err , "\n\t%s" ,
676
+ format -> v1_only_extensions .items [i ].string );
677
+ return -1 ;
678
+ }
679
+
616
680
return 0 ;
617
681
}
618
682
0 commit comments