Merge pull request #3478 from libgit2/vmg/crud signature: Strip crud
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
diff --git a/src/index.c b/src/index.c
index c0be5b9..334a131 100644
--- a/src/index.c
+++ b/src/index.c
@@ -1193,13 +1193,13 @@ static int index_no_dups(void **old, void *new)
}
static void index_existing_and_best(
- const git_index_entry **existing,
+ git_index_entry **existing,
size_t *existing_position,
- const git_index_entry **best,
+ git_index_entry **best,
git_index *index,
const git_index_entry *entry)
{
- const git_index_entry *e;
+ git_index_entry *e;
size_t pos;
int error;
diff --git a/src/signature.c b/src/signature.c
index 818cd30..109476e 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 41a74b9..0070320 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/diff/workdir.c b/tests/diff/workdir.c
index 89f9483..dac3245 100644
--- a/tests/diff/workdir.c
+++ b/tests/diff/workdir.c
@@ -2080,7 +2080,7 @@ void test_diff_workdir__to_index_pathlist(void)
cl_git_pass(git_repository_index(&index, g_repo));
opts.flags = GIT_DIFF_INCLUDE_IGNORED;
- opts.pathspec.strings = pathlist.contents;
+ opts.pathspec.strings = (char **)pathlist.contents;
opts.pathspec.count = pathlist.length;
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, &opts));
diff --git a/tests/revwalk/basic.c b/tests/revwalk/basic.c
index d8236ce..5ed7da4 100644
--- a/tests/revwalk/basic.c
+++ b/tests/revwalk/basic.c
@@ -456,7 +456,8 @@ void test_revwalk_basic__big_timestamp(void)
cl_git_pass(git_signature_new(&sig, "Joe", "joe@example.com", 2399662595, 0));
cl_git_pass(git_commit_tree(&tree, tip));
- cl_git_pass(git_commit_create(&id, _repo, "HEAD", sig, sig, NULL, "some message", tree, 1, &tip));
+ cl_git_pass(git_commit_create(&id, _repo, "HEAD", sig, sig, NULL, "some message", tree, 1,
+ (const git_commit **)&tip));
cl_git_pass(git_revwalk_push_head(_walk));
diff --git a/tests/revwalk/signatureparsing.c b/tests/revwalk/signatureparsing.c
index 5c7d881..b312bad 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);