git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 13/39] i18n: git-sh-setup.sh: mark strings for translation

From
Vasco Almeida <vascomalmeida@sapo.pt>
Date
Jun 1, 2016, 16:41 UTC
Message-ID
<1464799289-7639-14-git-send-email-vascomalmeida@sapo.pt>
In-Reply-To
<1464799289-7639-1-git-send-email-vascomalmeida@sapo.pt>

Positional arguments, such as $0, $1, etc, need to be stored on shell variables for use in translatable strings, according to gettext manual [1].

Add git-sh-setup.sh to LOCALIZED_SH variable in Makefile to enable extraction of string marked for translation by xgettext.

Although git-sh-setup.sh is a shell library to be sourced by other shell scripts, it is necessary to source git-sh-i18n at this point, because some scripts don't do it themselves. Not sourcing git-sh-i18n would lead to failure due to, for instance, gettextln not being found.

Source "$(git --exec-path)"/git-sh-i18n instead of simply git-sh-i18n, because latter case would fail test t2300-cd-to-toplevel.sh.

[1] http://www.gnu.org/software/gettext/manual/html_node/Preparing-Shell-Scripts.html
Signed-off-by: Vasco Almeida <vascomalmeida@sapo.pt>
---
 Makefile        |  4 +++-
 git-sh-setup.sh | 62 +++++++++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 50 insertions(+), 16 deletions(-)
diff --git a/Makefile b/Makefile
index 0d59718..4e0c4eb 100644
--- a/Makefile
+++ b/Makefile
@@ -2062,7 +2062,9 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
 LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
-LOCALIZED_SH = $(SCRIPT_SH) git-parse-remote.sh
+LOCALIZED_SH = $(SCRIPT_SH)
+LOCALIZED_SH += git-parse-remote.sh
+LOCALIZED_SH += git-sh-setup.sh
 LOCALIZED_PERL = $(SCRIPT_PERL)
 
 ifdef XGETTEXT_INCLUDE_TESTS
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index c48139a..61a3d95 100644
--- a/git-sh-setup.sh
+++ b/git-sh-setup.sh
@@ -2,6 +2,10 @@
 # to set up some variables pointing at the normal git directories and
 # a few helper shell functions.
 
+# Some shell scripts source git-sh-setup (i.e. this scriplet) but
+# don't source git-sh-i18n which is needed here for gettext support.
+. "$(git --exec-path)"/git-sh-i18n
+
 # Having this variable in your environment would break scripts because
 # you would cause "cd" to be taken to unexpected places.  If you
 # like CDPATH, define it for your interactive shell sessions without
@@ -83,14 +87,14 @@ if test -n "$OPTIONS_SPEC"; then
 else
 	dashless=$(basename -- "$0" | sed -e 's/-/ /')
 	usage() {
-		die "usage: $dashless $USAGE"
+		die "$(gettext usage:) $dashless $USAGE"
 	}
 
 	if [ -z "$LONG_USAGE" ]
 	then
-		LONG_USAGE="usage: $dashless $USAGE"
+		LONG_USAGE="$(gettext usage:) $dashless $USAGE"
 	else
-		LONG_USAGE="usage: $dashless $USAGE
+		LONG_USAGE="$(gettext usage:) $dashless $USAGE
 
 $LONG_USAGE"
 	fi
@@ -182,7 +186,7 @@ is_bare_repository () {
 cd_to_toplevel () {
 	cdup=$(git rev-parse --show-toplevel) &&
 	cd "$cdup" || {
-		echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
+		gettextln "Cannot chdir to \$cdup, the toplevel of the working tree" >&2
 		exit 1
 	}
 }
@@ -190,13 +194,16 @@ cd_to_toplevel () {
 require_work_tree_exists () {
 	if test "z$(git rev-parse --is-bare-repository)" != zfalse
 	then
-		die "fatal: $0 cannot be used without a working tree."
+		program_name=$0
+		die "$(gettext "fatal: \$program_name cannot be used without a working tree.")"
 	fi
 }
 
 require_work_tree () {
-	test "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = true ||
-	die "fatal: $0 cannot be used without a working tree."
+	test "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = true || {
+		program_name=$0
+		die "$(gettext "fatal: \$program_name cannot be used without a working tree.")"
+	}
 }
 
 require_clean_work_tree () {
@@ -206,24 +213,49 @@ require_clean_work_tree () {
 
 	if ! git diff-files --quiet --ignore-submodules
 	then
-		echo >&2 "Cannot $1: You have unstaged changes."
+		action=$1
+		case "$action" in
+		rebase)
+			gettextln "Cannot rebase: You have unstaged changes." >&2
+			;;
+		"rewrite branches")
+			gettextln "Cannot rewrite branches: You have unstaged changes." >&2
+			;;
+		"pull with rebase")
+			gettextln "Cannot pull with rebase: You have unstaged changes." >&2
+			;;
+		*)
+			eval_gettextln "Cannot \$action: You have unstaged changes." >&2
+			;;
+		esac
 		err=1
 	fi
 
 	if ! git diff-index --cached --quiet --ignore-submodules HEAD --
 	then
-		if [ $err = 0 ]
+		if test $err = 0
 		then
-		    echo >&2 "Cannot $1: Your index contains uncommitted changes."
+			action=$1
+			case "$action" in
+			rebase)
+				gettextln "Cannot rebase: Your index contains uncommitted changes." >&2
+				;;
+			"pull with rebase")
+				gettextln "Cannot pull with rebase: Your index contains uncommitted changes." >&2
+				;;
+			*)
+				eval_gettextln "Cannot \$action: Your index contains uncommitted changes." >&2
+				;;
+			esac
 		else
-		    echo >&2 "Additionally, your index contains uncommitted changes."
+		    gettextln "Additionally, your index contains uncommitted changes." >&2
 		fi
 		err=1
 	fi
 
-	if [ $err = 1 ]
+	if test $err = 1
 	then
-		test -n "$2" && echo >&2 "$2"
+		test -n "$2" && echo "$2" >&2
 		exit 1
 	fi
 }
@@ -336,12 +368,12 @@ git_dir_init () {
 	then
 		test -z "$(git rev-parse --show-cdup)" || {
 			exit=$?
-			echo >&2 "You need to run this command from the toplevel of the working tree."
+			gettextln "You need to run this command from the toplevel of the working tree." >&2
 			exit $exit
 		}
 	fi
 	test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd) || {
-		echo >&2 "Unable to determine absolute path of git directory"
+		gettextln "Unable to determine absolute path of git directory" >&2
 		exit 1
 	}
 	: ${GIT_OBJECT_DIRECTORY="$(git rev-parse --git-path objects)"}
-- 
2.7.3
Previous: Vasco AlmeidaNext: Junio C Hamano
Message 14 of 50 in “i18n and test updates”
  1. 00/39 i18n and test updatesVasco Almeida, Jun 1, 2016
  2. 01/39 i18n: builtin/remote.c: fix mark for translationVasco Almeida, Jun 1, 2016
  3. 02/39 i18n: advice: mark string about detached head for translationVasco Almeida, Jun 1, 2016
  4. 03/39 i18n: advice: internationalize message for conflictsVasco Almeida, Jun 1, 2016
  5. 04/39 i18n: transport: mark strings for translationVasco Almeida, Jun 1, 2016
  6. 05/39 i18n: sequencer: mark entire sentences for translationVasco Almeida, Jun 1, 2016
  7. 06/39 i18n: sequencer: mark string for translationVasco Almeida, Jun 1, 2016
  8. 07/39 i18n: merge-octopus: mark messages for translationVasco Almeida, Jun 1, 2016
  9. 08/39 merge-octupus: use die shell function from git-sh-setup.shVasco Almeida, Jun 1, 2016
  10. 09/39 i18n: rebase: fix marked string to use eval_gettext variantVasco Almeida, Jun 1, 2016
  11. 10/39 i18n: rebase: mark placeholder for translationVasco Almeida, Jun 1, 2016
  12. 11/39 i18n: bisect: simplify error message for i18nVasco Almeida, Jun 1, 2016
  13. 12/39 t6030: update to use test_i18ncmpVasco Almeida, Jun 1, 2016
  14. 13/39 i18n: git-sh-setup.sh: mark strings for translationVasco Almeida, Jun 1, 2016
  15. Junio C HamanoJun 1, 2016
  16. Junio C HamanoJun 1, 2016
  17. Vasco AlmeidaJun 2, 2016
  18. 14/39 i18n: rebase-interactive: mark strings for translationVasco Almeida, Jun 1, 2016
  19. 15/39 i18n: rebase-interactive: mark here-doc strings for translationVasco Almeida, Jun 1, 2016
  20. 16/39 i18n: rebase-interactive: mark comments of squash for translationVasco Almeida, Jun 1, 2016
  21. 17/39 i18n: setup: mark strings for translationVasco Almeida, Jun 1, 2016
  22. 18/39 tests: use test_i18n* functions to suppress false positivesVasco Almeida, Jun 1, 2016
  23. 19/39 tests: unpack-trees: update to use test_i18n* functionsVasco Almeida, Jun 1, 2016
  24. 20/39 t9003: become resilient to GETTEXT_POISONVasco Almeida, Jun 1, 2016
  25. 21/39 t4153: fix negated test_i18ngrep callVasco Almeida, Jun 1, 2016
  26. 22/39 t5523: use test_i18ngrep for negationVasco Almeida, Jun 1, 2016
  27. 23/39 i18n: bisect: mark strings for translationVasco Almeida, Jun 1, 2016
  28. 24/39 i18n: bisect: enable l10n of bisect terms in messagesVasco Almeida, Jun 1, 2016
  29. Junio C HamanoJun 1, 2016
  30. Vasco AlmeidaJun 2, 2016
  31. Junio C HamanoJun 2, 2016
  32. Vasco AlmeidaJun 3, 2016
  33. 25/39 i18n: transport-helper.c: change N_() call to _()Vasco Almeida, Jun 1, 2016
  34. 26/39 i18n: notes: mark strings for translationVasco Almeida, Jun 1, 2016
  35. 27/39 i18n: notes: mark options for translationVasco Almeida, Jun 1, 2016
  36. 28/39 i18n: config: unfold error messages marked for translationVasco Almeida, Jun 1, 2016
  37. Junio C HamanoJun 1, 2016
  38. Vasco AlmeidaJun 2, 2016
  39. Junio C HamanoJun 2, 2016
  40. 29/39 i18n: merge: mark messages for translationVasco Almeida, Jun 1, 2016
  41. 30/39 i18n: merge: change command option help to lowercaseVasco Almeida, Jun 1, 2016
  42. 31/39 i18n: sequencer: add period to error messageVasco Almeida, Jun 1, 2016
  43. 32/39 i18n: standardise messagesVasco Almeida, Jun 1, 2016
  44. 33/39 i18n: remote: mark URL fallback text for translationVasco Almeida, Jun 1, 2016
  45. 34/39 i18n: remote: allow translations to reorder messageVasco Almeida, Jun 1, 2016
  46. 35/39 i18n: init-db: join message piecesVasco Almeida, Jun 1, 2016
  47. 36/39 i18n: submodule: join strings marked for translationVasco Almeida, Jun 1, 2016
  48. 37/39 i18n: submodule: escape shell variables inside eval_gettextVasco Almeida, Jun 1, 2016
  49. 38/39 i18n: unmark die messages for translationVasco Almeida, Jun 1, 2016
  50. 39/39 i18n: branch: mark comment when editing branch description for translationVasco Almeida, Jun 1, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.