@@ -188,6 +188,8 @@ static int global_argc;
188188static const char * * global_argv ;
189189static const char * global_prefix ;
190190
191+ static enum sign_mode signed_commit_mode = SIGN_VERBATIM ;
192+
191193/* Memory pools */
192194static struct mem_pool fi_mem_pool = {
193195 .block_alloc = 2 * 1024 * 1024 - sizeof (struct mp_block ),
@@ -2752,6 +2754,15 @@ static void parse_one_signature(struct signature_data *sig, const char *v)
27522754 parse_data (& sig -> data , 0 , NULL );
27532755}
27542756
2757+ static void discard_one_signature (void )
2758+ {
2759+ struct strbuf data = STRBUF_INIT ;
2760+
2761+ read_next_command ();
2762+ parse_data (& data , 0 , NULL );
2763+ strbuf_release (& data );
2764+ }
2765+
27552766static void add_gpgsig_to_commit (struct strbuf * commit_data ,
27562767 const char * header ,
27572768 struct signature_data * sig )
@@ -2785,6 +2796,22 @@ static void store_signature(struct signature_data *stored_sig,
27852796 }
27862797}
27872798
2799+ static void import_one_signature (struct signature_data * sig_sha1 ,
2800+ struct signature_data * sig_sha256 ,
2801+ const char * v )
2802+ {
2803+ struct signature_data sig = { NULL , NULL , STRBUF_INIT };
2804+
2805+ parse_one_signature (& sig , v );
2806+
2807+ if (!strcmp (sig .hash_algo , "sha1" ))
2808+ store_signature (sig_sha1 , & sig , "SHA-1" );
2809+ else if (!strcmp (sig .hash_algo , "sha256" ))
2810+ store_signature (sig_sha256 , & sig , "SHA-256" );
2811+ else
2812+ die (_ ("parse_one_signature() returned unknown hash algo" ));
2813+ }
2814+
27882815static void parse_new_commit (const char * arg )
27892816{
27902817 static struct strbuf msg = STRBUF_INIT ;
@@ -2817,19 +2844,32 @@ static void parse_new_commit(const char *arg)
28172844 if (!committer )
28182845 die ("Expected committer but didn't get one" );
28192846
2820- /* Process signatures (up to 2: one "sha1" and one "sha256") */
28212847 while (skip_prefix (command_buf .buf , "gpgsig " , & v )) {
2822- struct signature_data sig = { NULL , NULL , STRBUF_INIT };
2823-
2824- parse_one_signature (& sig , v );
2848+ switch (signed_commit_mode ) {
2849+
2850+ /* First, modes that don't need the signature to be parsed */
2851+ case SIGN_ABORT :
2852+ die ("encountered signed commit; use "
2853+ "--signed-commits=<mode> to handle it" );
2854+ case SIGN_WARN_STRIP :
2855+ warning (_ ("stripping a commit signature" ));
2856+ /* fallthru */
2857+ case SIGN_STRIP :
2858+ discard_one_signature ();
2859+ break ;
28252860
2826- if (!strcmp (sig .hash_algo , "sha1" ))
2827- store_signature (& sig_sha1 , & sig , "SHA-1" );
2828- else if (!strcmp (sig .hash_algo , "sha256" ))
2829- store_signature (& sig_sha256 , & sig , "SHA-256" );
2830- else
2831- BUG ("parse_one_signature() returned unknown hash algo" );
2861+ /* Second, modes that parse the signature */
2862+ case SIGN_WARN_VERBATIM :
2863+ warning (_ ("importing a commit signature verbatim" ));
2864+ /* fallthru */
2865+ case SIGN_VERBATIM :
2866+ import_one_signature (& sig_sha1 , & sig_sha256 , v );
2867+ break ;
28322868
2869+ /* Third, BUG */
2870+ default :
2871+ BUG ("invalid signed_commit_mode value %d" , signed_commit_mode );
2872+ }
28332873 read_next_command ();
28342874 }
28352875
@@ -3501,6 +3541,9 @@ static int parse_one_option(const char *option)
35013541 option_active_branches (option );
35023542 } else if (skip_prefix (option , "export-pack-edges=" , & option )) {
35033543 option_export_pack_edges (option );
3544+ } else if (skip_prefix (option , "signed-commits=" , & option )) {
3545+ if (parse_sign_mode (option , & signed_commit_mode ))
3546+ usagef (_ ("unknown --signed-commits mode '%s'" ), option );
35043547 } else if (!strcmp (option , "quiet" )) {
35053548 show_stats = 0 ;
35063549 quiet = 1 ;
0 commit comments