summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2015-10-21 11:58:44 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2015-11-04 17:11:40 -0800
commitabdbfefbe8b582a050b1dea35f2ff7e7abc86609 (patch)
tree1472b9195284e1fb2bb3c4e876b3fca5526895f3
parentaef97245450bbe11debc5335bb9d3abc4e0d9479 (diff)
downloadlibgit2-abdbfefbe8b582a050b1dea35f2ff7e7abc86609.tar.gz
signature: Strip crud just like Git does
-rw-r--r--src/signature.c18
-rw-r--r--tests/commit/signature.c7
-rw-r--r--tests/revwalk/signatureparsing.c2
3 files changed, 24 insertions, 3 deletions
diff --git a/src/signature.c b/src/signature.c
index 818cd300e..109476efe 100644
--- a/src/signature.c
+++ b/src/signature.c
@@ -34,13 +34,27 @@ static bool contains_angle_brackets(const char *input)
return strchr(input, '<') != NULL || strchr(input, '>') != NULL;
}
+static bool is_crud(unsigned char c)
+{
+ return c <= 32 ||
+ c == '.' ||
+ c == ',' ||
+ c == ':' ||
+ c == ';' ||
+ c == '<' ||
+ c == '>' ||
+ c == '"' ||
+ c == '\\' ||
+ c == '\'';
+}
+
static char *extract_trimmed(const char *ptr, size_t len)
{
- while (len && git__isspace(ptr[0])) {
+ while (len && is_crud((unsigned char)ptr[0])) {
ptr++; len--;
}
- while (len && git__isspace(ptr[len - 1])) {
+ while (len && is_crud((unsigned char)ptr[len - 1])) {
len--;
}
diff --git a/tests/commit/signature.c b/tests/commit/signature.c
index 41a74b999..0070320ae 100644
--- a/tests/commit/signature.c
+++ b/tests/commit/signature.c
@@ -35,6 +35,13 @@ void test_commit_signature__leading_and_trailing_spaces_are_trimmed(void)
assert_name_and_email("nulltoken", "emeric.fermas@gmail.com", " \t nulltoken \n", " \n emeric.fermas@gmail.com \n");
}
+void test_commit_signature__leading_and_trailing_crud_is_trimmed(void)
+{
+ assert_name_and_email("nulltoken", "emeric.fermas@gmail.com", "\"nulltoken\"", "\"emeric.fermas@gmail.com\"");
+ assert_name_and_email("nulltoken w", "emeric.fermas@gmail.com", "nulltoken w.", "emeric.fermas@gmail.com");
+ assert_name_and_email("nulltoken \xe2\x98\xba", "emeric.fermas@gmail.com", "nulltoken \xe2\x98\xba", "emeric.fermas@gmail.com");
+}
+
void test_commit_signature__angle_brackets_in_names_are_not_supported(void)
{
cl_git_fail(try_build_signature("<Phil Haack", "phil@haack", 1234567890, 60));
diff --git a/tests/revwalk/signatureparsing.c b/tests/revwalk/signatureparsing.c
index 5c7d8813d..b312bad09 100644
--- a/tests/revwalk/signatureparsing.c
+++ b/tests/revwalk/signatureparsing.c
@@ -38,7 +38,7 @@ void test_revwalk_signatureparsing__do_not_choke_when_name_contains_angle_bracke
signature = git_commit_committer(commit);
cl_assert_equal_s("foo@example.com", signature->email);
- cl_assert_equal_s("<Yu V. Bin Haacked>", signature->name);
+ cl_assert_equal_s("Yu V. Bin Haacked", signature->name);
cl_assert_equal_i(1323847743, (int)signature->when.time);
cl_assert_equal_i(60, signature->when.offset);