Subject: Re: [PATCH 3/5] fast-export: mark strings for translation

From: Junio C Hamano <[email-masked]>
Date: Tue, 28 Oct 2025 06:43:26 -0700

Christian Couder <[email-masked]> writes:

> Some error or warning messages in "builtin/fast-export.c" are marked
> for translation, but many are not.
>
> To be more consistent and provide a better experience to people using a
> translated version, let's mark all the remaining error or warning
> messages for translation.

Makes sense.  Should we also downcase some Unknown and Unexpected?

> While at it, improve how some arguments to some error functions are
> indented.

OK.

> Signed-off-by: Christian Couder <[email-masked]>
> ---
>  builtin/fast-export.c | 77 ++++++++++++++++++++++---------------------
>  1 file changed, 39 insertions(+), 38 deletions(-)
>
> diff --git a/builtin/fast-export.c b/builtin/fast-export.c
> index dc2486f9a8..cb532f6325 100644
> --- a/builtin/fast-export.c
> +++ b/builtin/fast-export.c
> @@ -65,7 +65,7 @@ static int parse_opt_sign_mode(const struct option *opt,
>  		return 0;
>  
>  	if (parse_sign_mode(arg, val))
> -		return error("Unknown %s mode: %s", opt->long_name, arg);
> +		return error(_("Unknown %s mode: %s"), opt->long_name, arg);
>  
>  	return 0;
>  }
> @@ -82,7 +82,7 @@ static int parse_opt_tag_of_filtered_mode(const struct option *opt,
>  	else if (!strcmp(arg, "rewrite"))
>  		*val = REWRITE;
>  	else
> -		return error("Unknown tag-of-filtered mode: %s", arg);
> +		return error(_("Unknown tag-of-filtered mode: %s"), arg);
>  	return 0;
>  }
>  
> @@ -107,7 +107,7 @@ static int parse_opt_reencode_mode(const struct option *opt,
>  		if (!strcasecmp(arg, "abort"))
>  			*val = REENCODE_ABORT;
>  		else
> -			return error("Unknown reencoding mode: %s", arg);
> +			return error(_("Unknown reencoding mode: %s"), arg);
>  	}
>  
>  	return 0;
> @@ -318,16 +318,16 @@ static void export_blob(const struct object_id *oid)
>  	} else {
>  		buf = odb_read_object(the_repository->objects, oid, &type, &size);
>  		if (!buf)
> -			die("could not read blob %s", oid_to_hex(oid));
> +			die(_("could not read blob %s"), oid_to_hex(oid));
>  		if (check_object_signature(the_repository, oid, buf, size,
>  					   type) < 0)
> -			die("oid mismatch in blob %s", oid_to_hex(oid));
> +			die(_("oid mismatch in blob %s"), oid_to_hex(oid));
>  		object = parse_object_buffer(the_repository, oid, type,
>  					     size, buf, &eaten);
>  	}
>  
>  	if (!object)
> -		die("Could not read blob %s", oid_to_hex(oid));
> +		die(_("Could not read blob %s"), oid_to_hex(oid));
>  
>  	mark_next_object(object);
>  
> @@ -336,7 +336,7 @@ static void export_blob(const struct object_id *oid)
>  		printf("original-oid %s\n", oid_to_hex(oid));
>  	printf("data %"PRIuMAX"\n", (uintmax_t)size);
>  	if (size && fwrite(buf, size, 1, stdout) != 1)
> -		die_errno("could not write blob '%s'", oid_to_hex(oid));
> +		die_errno(_("could not write blob '%s'"), oid_to_hex(oid));
>  	printf("\n");
>  
>  	show_progress();
> @@ -499,10 +499,10 @@ static void show_filemodify(struct diff_queue_struct *q,
>  			break;
>  
>  		default:
> -			die("Unexpected comparison status '%c' for %s, %s",
> -				q->queue[i]->status,
> -				ospec->path ? ospec->path : "none",
> -				spec->path ? spec->path : "none");
> +			die(_("Unexpected comparison status '%c' for %s, %s"),
> +			    q->queue[i]->status,
> +			    ospec->path ? ospec->path : _("none"),
> +			    spec->path ? spec->path : _("none"));
>  		}
>  	}
>  }
> @@ -699,14 +699,14 @@ static void handle_commit(struct commit *commit, struct rev_info *rev,
>  
>  	author = strstr(commit_buffer_cursor, "\nauthor ");
>  	if (!author)
> -		die("could not find author in commit %s",
> +		die(_("could not find author in commit %s"),
>  		    oid_to_hex(&commit->object.oid));
>  	author++;
>  	commit_buffer_cursor = author_end = strchrnul(author, '\n');
>  
>  	committer = strstr(commit_buffer_cursor, "\ncommitter ");
>  	if (!committer)
> -		die("could not find committer in commit %s",
> +		die(_("could not find committer in commit %s"),
>  		    oid_to_hex(&commit->object.oid));
>  	committer++;
>  	commit_buffer_cursor = committer_end = strchrnul(committer, '\n');
> @@ -781,8 +781,8 @@ static void handle_commit(struct commit *commit, struct rev_info *rev,
>  		case REENCODE_NO:
>  			break;
>  		case REENCODE_ABORT:
> -			die("Encountered commit-specific encoding %.*s in commit "
> -			    "%s; use --reencode=[yes|no] to handle it",
> +			die(_("Encountered commit-specific encoding %.*s in commit "
> +			      "%s; use --reencode=[yes|no] to handle it"),
>  			    (int)encoding_len, encoding,
>  			    oid_to_hex(&commit->object.oid));
>  		}
> @@ -798,11 +798,11 @@ static void handle_commit(struct commit *commit, struct rev_info *rev,
>  	if (signatures.nr) {
>  		switch (signed_commit_mode) {
>  		case SIGN_ABORT:
> -			die("encountered signed commit %s; use "
> -			    "--signed-commits=<mode> to handle it",
> +			die(_("encountered signed commit %s; use "
> +			      "--signed-commits=<mode> to handle it"),
>  			    oid_to_hex(&commit->object.oid));
>  		case SIGN_WARN_VERBATIM:
> -			warning("exporting %"PRIuMAX" signature(s) for commit %s",
> +			warning(_("exporting %"PRIuMAX" signature(s) for commit %s"),
>  				(uintmax_t)signatures.nr, oid_to_hex(&commit->object.oid));
>  			/* fallthru */
>  		case SIGN_VERBATIM:
> @@ -812,7 +812,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev,
>  			}
>  			break;
>  		case SIGN_WARN_STRIP:
> -			warning("stripping signature(s) from commit %s",
> +			warning(_("stripping signature(s) from commit %s"),
>  				oid_to_hex(&commit->object.oid));
>  			/* fallthru */
>  		case SIGN_STRIP:
> @@ -890,7 +890,8 @@ static void handle_tag(const char *name, struct tag *tag)
>  		tagged = ((struct tag *)tagged)->tagged;
>  	}
>  	if (tagged->type == OBJ_TREE) {
> -		warning("Omitting tag %s,\nsince tags of trees (or tags of tags of trees, etc.) are not supported.",
> +		warning(_("Omitting tag %s,\nsince tags of trees (or tags "
> +			  "of tags of trees, etc.) are not supported."),
>  			oid_to_hex(&tag->object.oid));
>  		return;
>  	}
> @@ -898,7 +899,7 @@ static void handle_tag(const char *name, struct tag *tag)
>  	buf = odb_read_object(the_repository->objects, &tag->object.oid,
>  			      &type, &size);
>  	if (!buf)
> -		die("could not read tag %s", oid_to_hex(&tag->object.oid));
> +		die(_("could not read tag %s"), oid_to_hex(&tag->object.oid));
>  	message = memmem(buf, size, "\n\n", 2);
>  	if (message) {
>  		message += 2;
> @@ -936,17 +937,17 @@ static void handle_tag(const char *name, struct tag *tag)
>  		if (signature)
>  			switch (signed_tag_mode) {
>  			case SIGN_ABORT:
> -				die("encountered signed tag %s; use "
> -				    "--signed-tags=<mode> to handle it",
> +				die(_("encountered signed tag %s; use "
> +				      "--signed-tags=<mode> to handle it"),
>  				    oid_to_hex(&tag->object.oid));
>  			case SIGN_WARN_VERBATIM:
> -				warning("exporting signed tag %s",
> +				warning(_("exporting signed tag %s"),
>  					oid_to_hex(&tag->object.oid));
>  				/* fallthru */
>  			case SIGN_VERBATIM:
>  				break;
>  			case SIGN_WARN_STRIP:
> -				warning("stripping signature from tag %s",
> +				warning(_("stripping signature from tag %s"),
>  					oid_to_hex(&tag->object.oid));
>  				/* fallthru */
>  			case SIGN_STRIP:
> @@ -961,8 +962,8 @@ static void handle_tag(const char *name, struct tag *tag)
>  	if (!tagged_mark) {
>  		switch (tag_of_filtered_mode) {
>  		case TAG_FILTERING_ABORT:
> -			die("tag %s tags unexported object; use "
> -			    "--tag-of-filtered-object=<mode> to handle it",
> +			die(_("tag %s tags unexported object; use "
> +			      "--tag-of-filtered-object=<mode> to handle it"),
>  			    oid_to_hex(&tag->object.oid));
>  		case DROP:
>  			/* Ignore this tag altogether */
> @@ -1026,7 +1027,7 @@ static struct commit *get_commit(struct rev_cmdline_entry *e, const char *full_n
>  			tag = (struct tag *)tag->tagged;
>  		}
>  		if (!tag)
> -			die("Tag %s points nowhere?", e->name);
> +			die(_("Tag %s points nowhere?"), e->name);
>  		return (struct commit *)tag;
>  	}
>  	default:
> @@ -1064,7 +1065,7 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info)
>  
>  		commit = get_commit(e, full_name);
>  		if (!commit) {
> -			warning("%s: Unexpected object of type %s, skipping.",
> +			warning(_("%s: Unexpected object of type %s, skipping."),
>  				e->name,
>  				type_name(e->item->type));
>  			free(full_name);
> @@ -1079,7 +1080,7 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info)
>  			free(full_name);
>  			continue;
>  		default: /* OBJ_TAG (nested tags) is already handled */
> -			warning("Tag points to object of unexpected type %s, skipping.",
> +			warning(_("Tag points to object of unexpected type %s, skipping."),
>  				type_name(commit->object.type));
>  			free(full_name);
>  			continue;
> @@ -1175,7 +1176,7 @@ static void export_marks(char *file)
>  
>  	f = fopen_for_writing(file);
>  	if (!f)
> -		die_errno("Unable to open marks file %s for writing.", file);
> +		die_errno(_("Unable to open marks file %s for writing."), file);
>  
>  	for (i = 0; i < idnums.size; i++) {
>  		if (deco->base && deco->base->type == 1) {
> @@ -1192,7 +1193,7 @@ static void export_marks(char *file)
>  	e |= ferror(f);
>  	e |= fclose(f);
>  	if (e)
> -		error("Unable to write marks file %s.", file);
> +		error(_("Unable to write marks file %s."), file);
>  }
>  
>  static void import_marks(char *input_file, int check_exists)
> @@ -1215,20 +1216,20 @@ static void import_marks(char *input_file, int check_exists)
>  
>  		line_end = strchr(line, '\n');
>  		if (line[0] != ':' || !line_end)
> -			die("corrupt mark line: %s", line);
> +			die(_("corrupt mark line: %s"), line);
>  		*line_end = '\0';
>  
>  		mark = strtoumax(line + 1, &mark_end, 10);
>  		if (!mark || mark_end == line + 1
>  			|| *mark_end != ' ' || get_oid_hex(mark_end + 1, &oid))
> -			die("corrupt mark line: %s", line);
> +			die(_("corrupt mark line: %s"), line);
>  
>  		if (last_idnum < mark)
>  			last_idnum = mark;
>  
>  		type = odb_read_object_info(the_repository->objects, &oid, NULL);
>  		if (type < 0)
> -			die("object not found: %s", oid_to_hex(&oid));
> +			die(_("object not found: %s"), oid_to_hex(&oid));
>  
>  		if (type != OBJ_COMMIT)
>  			/* only commits */
> @@ -1236,12 +1237,12 @@ static void import_marks(char *input_file, int check_exists)
>  
>  		commit = lookup_commit(the_repository, &oid);
>  		if (!commit)
> -			die("not a commit? can't happen: %s", oid_to_hex(&oid));
> +			die(_("not a commit? can't happen: %s"), oid_to_hex(&oid));
>  
>  		object = &commit->object;
>  
>  		if (object->flags & SHOWN)
> -			error("Object %s already has a mark", oid_to_hex(&oid));
> +			error(_("Object %s already has a mark"), oid_to_hex(&oid));
>  
>  		mark_object(object, mark);
>  
> @@ -1395,7 +1396,7 @@ int cmd_fast_export(int argc,
>  	get_tags_and_duplicates(&revs.cmdline);
>  
>  	if (prepare_revision_walk(&revs))
> -		die("revision walk setup failed");
> +		die(_("revision walk setup failed"));
>  
>  	revs.reverse = 1;
>  	revs.diffopt.format_callback = show_filemodify;