From 43816e976ca1008bad55ed5e01974e0709980418 Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sun, 21 Oct 2018 14:12:52 +0100 Subject: Handle very odd author names Found in https://perl5.git.perl.org/metaconfig.git by ilmari, the commit 8004414d7809df2e2574f6c149ac592bd2d5af96 has a very unpleasant 'author' line which git parses in a very particular way (and which Gall failed to parse at all). This corrects that issue, making Gall's parser match outputs with Git's Signed-off-by: Daniel Silverstone --- lib/gall/commit.lua | 2 +- test/test-gall.commit.lua | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/gall/commit.lua b/lib/gall/commit.lua index b87904e..fca8ebf 100644 --- a/lib/gall/commit.lua +++ b/lib/gall/commit.lua @@ -49,7 +49,7 @@ local _new --- @section end local function parse_person(pers) - local real, email, when, tz = pers:match("^(.-) <([^>]+)> ([0-9]+) ([+-][0-9]+)$") + local real, email, when, tz = pers:match("^(.-) <([^>]+)>.-([0-9]+) ([+-][0-9]+)$") return { realname = real, email = email, diff --git a/test/test-gall.commit.lua b/test/test-gall.commit.lua index 8c79080..38eb591 100644 --- a/test/test-gall.commit.lua +++ b/test/test-gall.commit.lua @@ -111,6 +111,32 @@ function suite.commit_create() local newcommit = assert(gall.commit.create(repo, commitinfo)) end +function suite.commit_create_odd_names() + local repo = test_repo() + local head = repo:get("HEAD").content + local tree = head.tree + -- Stolen very nasty author commit content from https://perl5.git.perl.org/metaconfig.git + -- commit 8004414d7809df2e2574f6c149ac592bd2d5af96 + local commit_mess = ([[ +tree %s +parent %s +author Todd C. Miller" > 1031751852 -0600 +committer H.Merijn Brand 1038300039 +0000 + +#17171: ld flag for shrplib on OpenBSD +From: "Todd C. Miller" + +p4raw-id: //depot/metaconfig@18181]]):format(tree.sha, head.sha) + local commitsha = repo:hash_object("commit", commit_mess, true) + local commit = repo:get(commitsha) + local person = commit.content.author + -- This is meant to replicate how Git parses the above horror... + assert(person.realname == [[Todd C. Miller"]]) + assert(person.email == "Todd.Miller at courtesan.com") + assert(person.unixtime == "1031751852") + assert(person.timezone == "-0600") +end + function suite.commit_create_no_parents_ok() local repo = test_repo() local head = repo:get("HEAD").content -- cgit v1.2.1