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

[PATCH] bash prompt: test the prompt with newline in repository path

From
SZEDER Gábor <szeder@ira.uka.de>
Date
Aug 16, 2013, 10:36 UTC
Message-ID
<1376649395-24363-1-git-send-email-szeder@ira.uka.de>

Newlines in the path to a git repository were not an issue for the git-specific bash prompt before commit efaa0c1532 (bash prompt: combine 'git rev-parse' executions in the main code path, 2013-06-17), because the path returned by 'git rev-parse --git-dir' was directly stored in a variable, and this variable was later always accessed inside double quotes.

Newlines are not an issue after commit efaa0c1532 either, but it's more subtle. Since efaa0c1532 we use the following single 'git rev-parse' execution to query various info about the repository:

  git rev-parse --git-dir --is-inside-git-dir \
          --is-bare-repository --is-inside-work-tree

The results to these queries are separated by a newline character in the output, e.g.:

  /home/szeder/src/git/.git
  false
  false
  true

A newline in the path to the git repository could potentially break the parsing of these results and ultimately the bash prompt, unless the parsing is done right. Commit efaa0c1532 got it right, as I consciously started parsing 'git rev-parse's output from the end, where each record is a single line containing either 'true' or 'false' or, after e3e0b9378b (bash prompt: combine 'git rev-parse' for detached head, 2013-06-24), the abbreviated commit object name, and all what remains at the beginning is the path to the git repository, no matter how many lines it is.

This subtlety really warrants its own test, especially since I didn't explait it in the log message or in an in-code comment back then, so add a test to excercise the prompt with newline characters in the path to the repository. Note that 'git rev-parse --git-dir' prints '.git' or '.' when at the top of the worktree or the repository, respectively, and only prints the full path to the repository when in a subdirectory, hence the need for changing into a subdir in the test.

Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
---
 t/t9903-bash-prompt.sh | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
diff --git a/t/t9903-bash-prompt.sh b/t/t9903-bash-prompt.sh
index 3c3e4e8c38..dfe2088ef4 100755
--- a/t/t9903-bash-prompt.sh
+++ b/t/t9903-bash-prompt.sh
@@ -61,6 +61,22 @@ test_expect_success 'prompt - unborn branch' '
 	test_cmp expected "$actual"
 '
 
+repo_with_newline='repo
+with
+newline'
+
+test_expect_success 'prompt - with newline in path' '
+	printf " (master)" >expected &&
+	git init "$repo_with_newline" &&
+	test_when_finished "rm -rf \"$repo_with_newline\"" &&
+	mkdir "$repo_with_newline"/subdir &&
+	(
+		cd "$repo_with_newline/subdir" &&
+		__git_ps1 >"$actual"
+	) &&
+	test_cmp expected "$actual"
+'
+
 test_expect_success 'prompt - detached head' '
 	printf " ((%s...))" $(git log -1 --format="%h" --abbrev=13 b1^) >expected &&
 	test_config core.abbrev 13 &&
-- 
1.8.3.3.824.gb0ea0e3
Next: Johannes Sixt
Message 1 of 4 in “bash prompt: test the prompt with newline in repository path”
  1. bash prompt: test the prompt with newline in repository pathSZEDER Gábor, Aug 16, 2013
  2. Johannes SixtAug 16, 2013
  3. bash prompt: test the prompt with newline in repository pathSZEDER Gábor, Aug 17, 2013
  4. Eric SunshineAug 16, 2013

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.