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

[PATCH 1/5] Git.pm Add unquote_path()

From
PWPhillip Wood <phillip.wood@talktalk.net>
Date
Jun 22, 2017, 10:26 UTC
Message-ID
<20170622102622.26147-2-phillip.wood@talktalk.net>
In-Reply-To
<20170622102622.26147-1-phillip.wood@talktalk.net>
From: Phillip Wood <phillip.wood@dunelm.org.uk>

Add unquote_path() from git-add--interactive so it can be used by other scripts. Note this is a straight copy, it does not handle '\a'. That will be fixed in the next commit

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
---
 perl/Git.pm | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 52 insertions(+), 1 deletion(-)
diff --git a/perl/Git.pm b/perl/Git.pm
index bfce1f795dfa5fea05f4f96637a1ae2333038735..8afde87fc8162271ba178e0fff3e921f070ac621 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -61,7 +61,8 @@ require Exporter;
                 remote_refs prompt
                 get_tz_offset get_record
                 credential credential_read credential_write
-                temp_acquire temp_is_locked temp_release temp_reset temp_path);
+                temp_acquire temp_is_locked temp_release temp_reset temp_path
+                unquote_path);
 
 
 =head1 DESCRIPTION
@@ -1451,6 +1452,56 @@ sub prefix_lines {
 	return $string;
 }
 
+=item unquote_path ( PATH )
+
+Unquote a quoted path containing c-escapes as returned by ls-files etc.
+when not using -z
+
+=cut
+
+{
+	my %unquote_map = (
+		"b" => chr(8),
+		"t" => chr(9),
+		"n" => chr(10),
+		"v" => chr(11),
+		"f" => chr(12),
+		"r" => chr(13),
+		"\\" => "\\",
+		"\"" => "\""
+	);
+
+	sub unquote_path {
+		local ($_) = @_;
+		my ($retval, $remainder);
+		if (!/^\042(.*)\042$/) {
+			return $_;
+		}
+		($_, $retval) = ($1, "");
+		while (/^([^\\]*)\\(.*)$/) {
+			$remainder = $2;
+			$retval .= $1;
+			for ($remainder) {
+				if (/^([0-3][0-7][0-7])(.*)$/) {
+					$retval .= chr(oct($1));
+					$_ = $2;
+					last;
+				}
+				if (/^([\\\042btnvfr])(.*)$/) {
+					$retval .= $unquote_map{$1};
+					$_ = $2;
+					last;
+				}
+				# This is malformed -- just return it as-is for now.
+				return $_[0];
+			}
+			$_ = $remainder;
+		}
+		$retval .= $_;
+		return $retval;
+	}
+}
+
 =item get_comment_line_char ( )
 
 Gets the core.commentchar configuration value.
-- 
2.13.0
Previous: Phillip WoodNext: Junio C Hamano
Message 3 of 17 in “Move unquote_path() from git-add--interactive.perl to Git.pm”
  1. 0/5 Move unquote_path() from git-add--interactive.perl to Git.pmPhillip Wood, Jun 22, 2017
  2. 2/5 Git::unquote_path() Handle '\a'Phillip Wood, Jun 22, 2017
  3. 1/5 Git.pm Add unquote_path()Phillip Wood, Jun 22, 2017
  4. Junio C HamanoJun 22, 2017
  5. 3/5 Git::unquote_path() throw an exception on bad pathPhillip Wood, Jun 22, 2017
  6. Junio C HamanoJun 22, 2017
  7. 5/5 git-add--interactive.perl: Use unquote_path() from Git.pmPhillip Wood, Jun 22, 2017
  8. 4/5 Add tests for Git::unquote_path()Phillip Wood, Jun 22, 2017
  9. Junio C HamanoJun 22, 2017
  10. Jeff KingJun 22, 2017
  11. Phillip WoodJun 30, 2017
  12. 0/4 Move unquote_path from git-add--interactive.perl to Git.pmPhillip Wood, Jun 30, 2017
  13. 1/4 add -i move unquote_path() to Git.pmPhillip Wood, Jun 30, 2017
  14. 4/4 Add tests for Git::unquote_path()Phillip Wood, Jun 30, 2017
  15. 2/4 Git::unquote_path() Handle '\a'Phillip Wood, Jun 30, 2017
  16. 3/4 Git::unquote_path() throw an exception on bad pathPhillip Wood, Jun 30, 2017
  17. Junio C HamanoJun 30, 2017

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.