From patchwork Sat Jul 9 15:41:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Siddharth Asthana X-Patchwork-Id: 12912260 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 49E83C433EF for ; Sat, 9 Jul 2022 15:42:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229555AbiGIPmb (ORCPT ); Sat, 9 Jul 2022 11:42:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34844 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229448AbiGIPma (ORCPT ); Sat, 9 Jul 2022 11:42:30 -0400 Received: from mail-pj1-x1032.google.com (mail-pj1-x1032.google.com [IPv6:2607:f8b0:4864:20::1032]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AD3232A732 for ; Sat, 9 Jul 2022 08:42:29 -0700 (PDT) Received: by mail-pj1-x1032.google.com with SMTP id v4-20020a17090abb8400b001ef966652a3so4534891pjr.4 for ; Sat, 09 Jul 2022 08:42:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=pVNAQ+ZfOMv2yKI1iHlzflyugwyXQWFM6NDBeidxkPg=; b=VpWkTVbUn+IUQy1jjkbP+mQ4SdlqYdl6JDpj1MD0JhkEYHIJQpu1Hl183qRkXIXrrW xGVAm+P9iPhWiFEoMUkpx+iDV5FWD8dx+cr6CJr4D7PUEnLpYe07y9uZLAIYgOGUOQ+1 IzSVi7oXn8ek7TrcP3FwpFI+mMsT7uwYgieu6pk9ggn/W/yHpsiiUQFRki88DJSdvtCm MlVZVxHeJgJT/gzG7+Cy2FtMcdanYxXCLpXo+eY58lcB8P2j/wkykqBW7vBwgeFYBC0X rsUh3jQLDqUyaQkxW6ZhlfMOToNNC+uwhnd8MwD7ofCIHjSvOvNekmRQtXWOv+qpJgt9 RVWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=pVNAQ+ZfOMv2yKI1iHlzflyugwyXQWFM6NDBeidxkPg=; b=bYLf+/txDHbGCWNwUS6tLosdA9Hsmm8FttFptvDkIIEjL1UThFcvSiX4+6gm+bG80Q XQ58aISZNPxua4AeW4Gd4zNFl+RuWexUVpYU5MY58B+k9rf5Kg6oXXqhXYnifwtI3aBw UQBFDgbwElrxMosPbtHRXoRfBp93lmESm5mxkAn3GoG8Jok06AnwnkZsF/AFbmiWayhR gqBJXy9mz7qMUryC0ZIm0hGsVz0PLEurf0Oklj42H774KgmlrAEMuhqvBqvJjjgGDDig Igu0c8MsJc6egV85eWp6CPzH+o96Q6z8PnxSuX4GpK9AJWRn3TOaM5ORBX14W4tRWULe ZYIg== X-Gm-Message-State: AJIora+Y0g/unTXYLYzmCUGz3e9WWeNsn3skR3WccVTm2oJbdAfhMW89 54DCtcRV6+X44vDHmWGUZ/7ax27ZTaJmdKfY X-Google-Smtp-Source: AGRyM1uz4hO0Pxdo+rN4vpYiGPeY7pWEkjap+b7rYGqdV6Sf2YFQPqOjNBSiEaYaeAKRI/+kIfrS3g== X-Received: by 2002:a17:90a:2f46:b0:1ef:a785:dd2a with SMTP id s64-20020a17090a2f4600b001efa785dd2amr6762661pjd.238.1657381348524; Sat, 09 Jul 2022 08:42:28 -0700 (PDT) Received: from HB2.. ([122.175.103.204]) by smtp.gmail.com with ESMTPSA id jj9-20020a170903048900b0016be4d78792sm1473833plb.257.2022.07.09.08.42.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 Jul 2022 08:42:28 -0700 (PDT) From: Siddharth Asthana To: git@vger.kernel.org Cc: phillip.wood123@gmail.com, congdanhqx@gmail.com, christian.couder@gmail.com, avarab@gmail.com, gitster@pobox.com, Johannes.Schindelin@gmx.de, johncai86@gmail.com, Siddharth Asthana Subject: [PATCH v3 1/4] revision: improve commit_rewrite_person() Date: Sat, 9 Jul 2022 21:11:46 +0530 Message-Id: <20220709154149.165524-2-siddharthasthana31@gmail.com> X-Mailer: git-send-email 2.37.0.6.g69b7ad898b In-Reply-To: <20220709154149.165524-1-siddharthasthana31@gmail.com> References: <20220707161554.6900-1-siddharthasthana31@gmail.com> <20220709154149.165524-1-siddharthasthana31@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The function, commit_rewrite_person(), is designed to find and replace an ident string in the header part, and the way it avoids a random occurrence of "author A U Thor Mentored-by: John Cai Helped-by: Đoàn Trần Công Danh Signed-off-by: Siddharth Asthana Signed-off-by: Johannes Schindelin --- revision.c | 48 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/revision.c b/revision.c index 211352795c..1939c56c67 100644 --- a/revision.c +++ b/revision.c @@ -3755,19 +3755,17 @@ int rewrite_parents(struct rev_info *revs, struct commit *commit, return 0; } -static int commit_rewrite_person(struct strbuf *buf, const char *what, struct string_list *mailmap) +/* + * Returns the difference between the new and old length of the ident line. + */ +static ssize_t rewrite_ident_line(const char* person, struct strbuf *buf, struct string_list *mailmap) { - char *person, *endp; + char *endp; size_t len, namelen, maillen; const char *name; const char *mail; struct ident_split ident; - person = strstr(buf->buf, what); - if (!person) - return 0; - - person += strlen(what); endp = strchr(person, '\n'); if (!endp) return 0; @@ -3784,6 +3782,7 @@ static int commit_rewrite_person(struct strbuf *buf, const char *what, struct st if (map_user(mailmap, &mail, &maillen, &name, &namelen)) { struct strbuf namemail = STRBUF_INIT; + size_t newlen; strbuf_addf(&namemail, "%.*s <%.*s>", (int)namelen, name, (int)maillen, mail); @@ -3792,14 +3791,42 @@ static int commit_rewrite_person(struct strbuf *buf, const char *what, struct st ident.mail_end - ident.name_begin + 1, namemail.buf, namemail.len); + newlen = namemail.len; + strbuf_release(&namemail); - return 1; + return newlen - (ident.mail_end - ident.name_begin + 1); } return 0; } +static void commit_rewrite_person(struct strbuf *buf, const char **headers, struct string_list *mailmap) +{ + size_t buf_offset = 0; + + if (!mailmap) + return; + + for (;;) { + const char *person, *line; + size_t i, linelen; + + line = buf->buf + buf_offset; + linelen = strchrnul(line, '\n') - line + 1; + + if (linelen <= 1) + /* End of header */ + return; + + buf_offset += linelen; + + for (i = 0; headers[i]; i++) + if (skip_prefix(line, headers[i], &person)) + buf_offset += rewrite_ident_line(person, buf, mailmap); + } +} + static int commit_match(struct commit *commit, struct rev_info *opt) { int retval; @@ -3832,11 +3859,12 @@ static int commit_match(struct commit *commit, struct rev_info *opt) strbuf_addstr(&buf, message); if (opt->grep_filter.header_list && opt->mailmap) { + const char *commit_headers[] = { "author ", "committer ", NULL }; + if (!buf.len) strbuf_addstr(&buf, message); - commit_rewrite_person(&buf, "\nauthor ", opt->mailmap); - commit_rewrite_person(&buf, "\ncommitter ", opt->mailmap); + commit_rewrite_person(&buf, commit_headers, opt->mailmap); } /* Append "fake" message parts as needed */ From patchwork Sat Jul 9 15:41:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddharth Asthana X-Patchwork-Id: 12912261 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 00F10C433EF for ; Sat, 9 Jul 2022 15:42:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229567AbiGIPmh (ORCPT ); Sat, 9 Jul 2022 11:42:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34930 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229560AbiGIPmg (ORCPT ); Sat, 9 Jul 2022 11:42:36 -0400 Received: from mail-pl1-x633.google.com (mail-pl1-x633.google.com [IPv6:2607:f8b0:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 522B43D585 for ; Sat, 9 Jul 2022 08:42:35 -0700 (PDT) Received: by mail-pl1-x633.google.com with SMTP id m2so1149249plx.3 for ; Sat, 09 Jul 2022 08:42:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Phvkfw8wl/cag2XeSqKzJu4tEeNHTaSonhL7JNi8m2c=; b=Lj/sra0CClh6eMWEj8Vt60nDqpiI6kYP80Z3w3hVD6ddPH1SJPKcAgHOs1sE1J0rB1 Uj6aicvr8oflZIXICZSsFVYodyBPWwFyjFFvRpaTCL9tHw4C8y7stNkdtoTaH7l7yG65 JZzzgioG5jd9lGqIwwuwdfPxl50RXTbrxmoXQq86DxSG9yJVukuD4xGyL0JkVlLEKxjL 7vzBBcLuYv0FaM5IVAAxn20rfN1TXYMkIx/Wzu6Ej0q2OGb6p/t715YAK3bURNJ9QWYh J5xd3O/csKXDu9rlcppMhk/L5Vp37l8mIJ8lQy5yR5cF6hbSk972OMGx95vhFEDM5Mqg tqKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Phvkfw8wl/cag2XeSqKzJu4tEeNHTaSonhL7JNi8m2c=; b=b88T1aiyPcCfYOspe/y0uiKsUTbK7eGDe+ZPxuFEzRZO6WeMJyCHdY2lYpVD93KHEB jAQiRjFaBw3q3OvTf4jBA7nul9Dd8IdSkUiCFLLC4lPDt2DiQE8Yqlp/JHwrmurPW290 wkC3AmsVM/GkxaieO2dVPsdu00/+AR359gwYmSBN6RUmO4jIgnHa7LI1iP+gsUqsRGkm mwv+tgkwu2NfkUN9CRZtrDybQpWuUdU97cYVDTKJQjJ1b7EKYRFCRTNxfcJpE6NRsOH5 3dYJey6CEWmXByPSi4sqqEwmvzYXsSnshh24+tnqfd2649//1Il7W++fdkSZEzu9VYTf C+Vg== X-Gm-Message-State: AJIora9YmtSlgM0LbQFombb2OwDv7X2Hf00hgafaq8YFnvpUMKvypJzJ 7L4rNkYl9zjAWccNZ0pIcv9QqiG9mtGsNzwj X-Google-Smtp-Source: AGRyM1sHwv0LgLq00jxWnKwcxpRKvmCJ1Ca+Qs2AUm6VjX5oNJR/PmKmyO68OkbBRsnrwHdl0oi30A== X-Received: by 2002:a17:90a:2e03:b0:1ed:2cd5:6c4e with SMTP id q3-20020a17090a2e0300b001ed2cd56c4emr6610491pjd.225.1657381354353; Sat, 09 Jul 2022 08:42:34 -0700 (PDT) Received: from HB2.. ([122.175.103.204]) by smtp.gmail.com with ESMTPSA id jj9-20020a170903048900b0016be4d78792sm1473833plb.257.2022.07.09.08.42.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 Jul 2022 08:42:33 -0700 (PDT) From: Siddharth Asthana To: git@vger.kernel.org Cc: phillip.wood123@gmail.com, congdanhqx@gmail.com, christian.couder@gmail.com, avarab@gmail.com, gitster@pobox.com, Johannes.Schindelin@gmx.de, johncai86@gmail.com, Siddharth Asthana Subject: [PATCH v3 2/4] ident: move commit_rewrite_person() to ident.c Date: Sat, 9 Jul 2022 21:11:47 +0530 Message-Id: <20220709154149.165524-3-siddharthasthana31@gmail.com> X-Mailer: git-send-email 2.37.0.6.g69b7ad898b In-Reply-To: <20220709154149.165524-1-siddharthasthana31@gmail.com> References: <20220707161554.6900-1-siddharthasthana31@gmail.com> <20220709154149.165524-1-siddharthasthana31@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org commit_rewrite_person() and rewrite_ident_line() are static functions defined in revision.c. Their usages are as follows: - commit_rewrite_person() takes a commit buffer and replaces the author and committer idents with their canonical versions using the mailmap mechanism - rewrite_ident_line() takes author/committer header lines from the commit buffer and replaces the idents with their canonical versions using the mailmap mechanism. This patch moves commit_rewrite_person() and rewrite_ident_line() to ident.c which contains many other functions related to idents like split_ident_line(). By moving commit_rewrite_person() to ident.c, we also intend to use it in git-cat-file to replace committer and author idents from the headers to their canonical versions using the mailmap mechanism. The function is moved as is for now to make it clear that there are no other changes, but it will be renamed in a following commit. Mentored-by: Christian Couder Mentored-by: John Cai Signed-off-by: Siddharth Asthana --- cache.h | 6 +++++ ident.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ revision.c | 72 ------------------------------------------------------ 3 files changed, 78 insertions(+), 72 deletions(-) diff --git a/cache.h b/cache.h index ac5ab4ef9d..c9dbe1c29a 100644 --- a/cache.h +++ b/cache.h @@ -1688,6 +1688,12 @@ struct ident_split { */ int split_ident_line(struct ident_split *, const char *, int); +/* + * Given a commit object buffer and the commit headers, replaces the idents + * in the headers with their canonical versions using the mailmap mechanism. + */ +void commit_rewrite_person(struct strbuf *buf, const char **commit_headers, struct string_list *mailmap); + /* * Compare split idents for equality or strict ordering. Note that we * compare only the ident part of the line, ignoring any timestamp. diff --git a/ident.c b/ident.c index 89ca5b4700..9f4f6e9071 100644 --- a/ident.c +++ b/ident.c @@ -8,6 +8,7 @@ #include "cache.h" #include "config.h" #include "date.h" +#include "mailmap.h" static struct strbuf git_default_name = STRBUF_INIT; static struct strbuf git_default_email = STRBUF_INIT; @@ -346,6 +347,77 @@ int split_ident_line(struct ident_split *split, const char *line, int len) return 0; } +/* + * Returns the difference between the new and old length of the ident line. + */ +static ssize_t rewrite_ident_line(const char* person, struct strbuf *buf, struct string_list *mailmap) +{ + char *endp; + size_t len, namelen, maillen; + const char *name; + const char *mail; + struct ident_split ident; + + endp = strchr(person, '\n'); + if (!endp) + return 0; + + len = endp - person; + + if (split_ident_line(&ident, person, len)) + return 0; + + mail = ident.mail_begin; + maillen = ident.mail_end - ident.mail_begin; + name = ident.name_begin; + namelen = ident.name_end - ident.name_begin; + + if (map_user(mailmap, &mail, &maillen, &name, &namelen)) { + struct strbuf namemail = STRBUF_INIT; + size_t newlen; + + strbuf_addf(&namemail, "%.*s <%.*s>", + (int)namelen, name, (int)maillen, mail); + + strbuf_splice(buf, ident.name_begin - buf->buf, + ident.mail_end - ident.name_begin + 1, + namemail.buf, namemail.len); + + newlen = namemail.len; + + strbuf_release(&namemail); + + return newlen - (ident.mail_end - ident.name_begin + 1); + } + + return 0; +} + +void commit_rewrite_person(struct strbuf *buf, const char **headers, struct string_list *mailmap) +{ + size_t buf_offset = 0; + + if (!mailmap) + return; + + for (;;) { + const char *person, *line; + size_t i, linelen; + + line = buf->buf + buf_offset; + linelen = strchrnul(line, '\n') - line + 1; + + if (linelen <= 1) + /* End of header */ + return; + + buf_offset += linelen; + + for (i = 0; headers[i]; i++) + if (skip_prefix(line, headers[i], &person)) + buf_offset += rewrite_ident_line(person, buf, mailmap); + } +} static void ident_env_hint(enum want_ident whose_ident) { diff --git a/revision.c b/revision.c index 1939c56c67..14dca903b6 100644 --- a/revision.c +++ b/revision.c @@ -3755,78 +3755,6 @@ int rewrite_parents(struct rev_info *revs, struct commit *commit, return 0; } -/* - * Returns the difference between the new and old length of the ident line. - */ -static ssize_t rewrite_ident_line(const char* person, struct strbuf *buf, struct string_list *mailmap) -{ - char *endp; - size_t len, namelen, maillen; - const char *name; - const char *mail; - struct ident_split ident; - - endp = strchr(person, '\n'); - if (!endp) - return 0; - - len = endp - person; - - if (split_ident_line(&ident, person, len)) - return 0; - - mail = ident.mail_begin; - maillen = ident.mail_end - ident.mail_begin; - name = ident.name_begin; - namelen = ident.name_end - ident.name_begin; - - if (map_user(mailmap, &mail, &maillen, &name, &namelen)) { - struct strbuf namemail = STRBUF_INIT; - size_t newlen; - - strbuf_addf(&namemail, "%.*s <%.*s>", - (int)namelen, name, (int)maillen, mail); - - strbuf_splice(buf, ident.name_begin - buf->buf, - ident.mail_end - ident.name_begin + 1, - namemail.buf, namemail.len); - - newlen = namemail.len; - - strbuf_release(&namemail); - - return newlen - (ident.mail_end - ident.name_begin + 1); - } - - return 0; -} - -static void commit_rewrite_person(struct strbuf *buf, const char **headers, struct string_list *mailmap) -{ - size_t buf_offset = 0; - - if (!mailmap) - return; - - for (;;) { - const char *person, *line; - size_t i, linelen; - - line = buf->buf + buf_offset; - linelen = strchrnul(line, '\n') - line + 1; - - if (linelen <= 1) - /* End of header */ - return; - - buf_offset += linelen; - - for (i = 0; headers[i]; i++) - if (skip_prefix(line, headers[i], &person)) - buf_offset += rewrite_ident_line(person, buf, mailmap); - } -} - static int commit_match(struct commit *commit, struct rev_info *opt) { int retval; From patchwork Sat Jul 9 15:41:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddharth Asthana X-Patchwork-Id: 12912262 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 30694C43334 for ; Sat, 9 Jul 2022 15:42:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229560AbiGIPmo (ORCPT ); Sat, 9 Jul 2022 11:42:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229568AbiGIPmn (ORCPT ); Sat, 9 Jul 2022 11:42:43 -0400 Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 00A343D5AA for ; Sat, 9 Jul 2022 08:42:43 -0700 (PDT) Received: by mail-pj1-x1030.google.com with SMTP id o31-20020a17090a0a2200b001ef7bd037bbso1254912pjo.0 for ; Sat, 09 Jul 2022 08:42:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=cFJvu+AqqPOe9XgzLb+7cbOS+hj7hA1P6aUDOl8dz74=; b=T8c54or2Q8H+ZZBUZgzNwV9eXGrBxRfleEzsy/bqztvTxb8S1ImDU9lf7F79K8BPfj JLW/L+nm7YPbusRlB7lJAwBTgV7M2SEBU2EYgEBzxbBS1nFEvTE3RbrdhosWnmSrf5L+ VIWrZGnu/sA94ZORGdT42gVH8pPdDahTUzip/etcQBFtFaq86JJ5zl5f/qbEDYNoURYc 5ydkNo19Sr+MgUm44UpGKleelnnoxye0xTwjGywDr6Q/sXPCV7k0Qu3v3GdwIy+XCpP1 QeAvWECs7H2DBDv+L5ENr+m8rxvbqF1/0nPxI+8l0ADd2mTPwQqgwMB0Clt6MvtE9DzV tLzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=cFJvu+AqqPOe9XgzLb+7cbOS+hj7hA1P6aUDOl8dz74=; b=yB3oNUPUwyHMm11aPP+N1Sx2T/1jyRUpUI6HBY4zaXd439zNn5+aYdJqehDqggg4o/ +c04H9Rs5LFGT7UDfudy1GqbpKCgkk97Ch17jhnqfLBpIWucmftOzwEs6TdajfFFyEl3 BcLbzdiNAT7r6Rt2qu+Lgo3YF+5E/Jx7naI3fieipdFyZvZd72WmdjsrRKbewxa2ND4m zZqb16IFjN/X6LBCgnko6LqA8R9aTzubHyzyM/+IyFN79FsK/DirlMXtrlo7soGlOP6Y +3VnQa8MAHQhCyoNuHBNqh2hoI5v8ZqN0QyYF8f23coXKaK6sOcjd2mpOwU0YACX9S2M O9OA== X-Gm-Message-State: AJIora++leinqXtiTWGPb9/DgSnaFu5MbheAIVk10RbiCvhXsHbyHLuN j5xr6a9ZO6IXL+sG/3r9kiU5MFi5is/welr0 X-Google-Smtp-Source: AGRyM1uPHHGx/WgJmg0b6qIPpTI5mUSNsE9j+/35WkRgXEXMasVZ1fC12JF0SopBy9VovoViGK/oQg== X-Received: by 2002:a17:902:e952:b0:16a:74b7:57eb with SMTP id b18-20020a170902e95200b0016a74b757ebmr9264708pll.13.1657381362019; Sat, 09 Jul 2022 08:42:42 -0700 (PDT) Received: from HB2.. ([122.175.103.204]) by smtp.gmail.com with ESMTPSA id jj9-20020a170903048900b0016be4d78792sm1473833plb.257.2022.07.09.08.42.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 Jul 2022 08:42:41 -0700 (PDT) From: Siddharth Asthana To: git@vger.kernel.org Cc: phillip.wood123@gmail.com, congdanhqx@gmail.com, christian.couder@gmail.com, avarab@gmail.com, gitster@pobox.com, Johannes.Schindelin@gmx.de, johncai86@gmail.com, Siddharth Asthana Subject: [PATCH v3 3/4] ident: rename commit_rewrite_person() to apply_mailmap_to_header() Date: Sat, 9 Jul 2022 21:11:48 +0530 Message-Id: <20220709154149.165524-4-siddharthasthana31@gmail.com> X-Mailer: git-send-email 2.37.0.6.g69b7ad898b In-Reply-To: <20220709154149.165524-1-siddharthasthana31@gmail.com> References: <20220707161554.6900-1-siddharthasthana31@gmail.com> <20220709154149.165524-1-siddharthasthana31@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org commit_rewrite_person() takes a commit buffer and replaces the idents in the header with their canonical versions using the mailmap mechanism. The name "commit_rewrite_person()" is misleading as it doesn't convey what kind of rewrite are we going to do to the buffer. It also doesn't clearly mention that the function will limit itself to the header part of the buffer. The new name, "apply_mailmap_to_header()", expresses the functionality of the function pretty clearly. We intend to use apply_mailmap_to_header() in git-cat-file to replace idents in the headers of commit and tag object buffers. So, we will be extending this function to take tag objects buffer as well and replace idents on the tagger header using the mailmap mechanism. Mentored-by: Christian Couder Mentored-by: John Cai Signed-off-by: Siddharth Asthana --- cache.h | 6 +++--- ident.c | 2 +- revision.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cache.h b/cache.h index c9dbe1c29a..9edb7fefd3 100644 --- a/cache.h +++ b/cache.h @@ -1689,10 +1689,10 @@ struct ident_split { int split_ident_line(struct ident_split *, const char *, int); /* - * Given a commit object buffer and the commit headers, replaces the idents - * in the headers with their canonical versions using the mailmap mechanism. + * Given a commit or tag object buffer and the commit or tag headers, replaces + * the idents in the headers with their canonical versions using the mailmap mechanism. */ -void commit_rewrite_person(struct strbuf *buf, const char **commit_headers, struct string_list *mailmap); +void apply_mailmap_to_header(struct strbuf *buf, const char **headers, struct string_list *mailmap); /* * Compare split idents for equality or strict ordering. Note that we diff --git a/ident.c b/ident.c index 9f4f6e9071..5f17bd607d 100644 --- a/ident.c +++ b/ident.c @@ -393,7 +393,7 @@ static ssize_t rewrite_ident_line(const char* person, struct strbuf *buf, struct return 0; } -void commit_rewrite_person(struct strbuf *buf, const char **headers, struct string_list *mailmap) +void apply_mailmap_to_header(struct strbuf *buf, const char **headers, struct string_list *mailmap) { size_t buf_offset = 0; diff --git a/revision.c b/revision.c index 14dca903b6..6ad3665204 100644 --- a/revision.c +++ b/revision.c @@ -3792,7 +3792,7 @@ static int commit_match(struct commit *commit, struct rev_info *opt) if (!buf.len) strbuf_addstr(&buf, message); - commit_rewrite_person(&buf, commit_headers, opt->mailmap); + apply_mailmap_to_header(&buf, commit_headers, opt->mailmap); } /* Append "fake" message parts as needed */ From patchwork Sat Jul 9 15:41:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddharth Asthana X-Patchwork-Id: 12912263 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B3CE5C43334 for ; Sat, 9 Jul 2022 15:42:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229607AbiGIPm5 (ORCPT ); Sat, 9 Jul 2022 11:42:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35298 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229591AbiGIPmu (ORCPT ); Sat, 9 Jul 2022 11:42:50 -0400 Received: from mail-pf1-x432.google.com (mail-pf1-x432.google.com [IPv6:2607:f8b0:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CC1923D5AA for ; Sat, 9 Jul 2022 08:42:49 -0700 (PDT) Received: by mail-pf1-x432.google.com with SMTP id y9so1396358pff.12 for ; Sat, 09 Jul 2022 08:42:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Yqf4H0DsuAVRlZz1akSmzJ4bXsQNsN/5xsq25XpKVN4=; b=GFC5VxPqFdV+kUfY58YAl1Pfo1PrGBtQz8f94Sq7s2TEVwObdLPAZC1pCs+M6Bpu6X P3yPgq9eFsobjACwOYnLLHlVbky22Fu1PwTEal3LGC8T6GymbuXshE/kKMmXXRSaoqBy wtI5RmjXifU5xwn7e2jc26GZpfh37lP4yBOSVOT7ewH972A2BrlNxtXT/O7e0HVFYMFu s9FFXp01VUwR9BjaL3YcBnrWQaM8r+E1kWxlNyPOFehmQFJnQ7lNx/CRzHL5PeZTCI6e c/ZpD4Z572h4gugZTnC7jr8l054hX4kRtWxAcDWO7a4RkOhLW+gu8KZO+CKFYsdbYKWv Zggg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Yqf4H0DsuAVRlZz1akSmzJ4bXsQNsN/5xsq25XpKVN4=; b=SUk+cMTRE6VgieCpYv9S26FOdgYIK75F73a32mOI8p5Y5kPWc8B6mwoQD+Ful1q0YY 5pQLbuky69Mzb6jUcs4Ms5e+r6+6ItnN4/5KxKpPRGMzkL1e2VI1lsAV5F+S6KcgyNoU A2ac5xqfIZKhtl0jkMBY3UbLrL2abB63zZ+t0O72dlvJYr7alxrHlkrt2nlYQzIZGIUo GQogIHS4kjYAXQLPqYVP15hJiVwkwd0w8QKIhQLuRxw0mP3nko0rucqp3vkjhMDGxEiZ SLOeP3TyH0IjoKzs/KS7OkEP2Il5c5/uw90YVU2dDv+L3a8N7AxymI31hG5ExZPD9lp/ 5Ogg== X-Gm-Message-State: AJIora+W/wNFfs4gL4QeEoBIdwJLDafMRWxmoBpPrT9I4u87h3A8tAJm jTYLTEFCDUMkOmrCs0vD3oDjPjBooa//hjRR X-Google-Smtp-Source: AGRyM1tKAic0tqob7Qia8EKDvcjs0kV5JtgaLW4DivrQDs02FrgGdnFgHVKe0E3EP1L5behbO8X1Fg== X-Received: by 2002:aa7:8649:0:b0:52a:baae:16c9 with SMTP id a9-20020aa78649000000b0052abaae16c9mr3329656pfo.26.1657381368802; Sat, 09 Jul 2022 08:42:48 -0700 (PDT) Received: from HB2.. ([122.175.103.204]) by smtp.gmail.com with ESMTPSA id jj9-20020a170903048900b0016be4d78792sm1473833plb.257.2022.07.09.08.42.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 Jul 2022 08:42:48 -0700 (PDT) From: Siddharth Asthana To: git@vger.kernel.org Cc: phillip.wood123@gmail.com, congdanhqx@gmail.com, christian.couder@gmail.com, avarab@gmail.com, gitster@pobox.com, Johannes.Schindelin@gmx.de, johncai86@gmail.com, Siddharth Asthana , Phillip Wood Subject: [PATCH v3 4/4] cat-file: add mailmap support Date: Sat, 9 Jul 2022 21:11:49 +0530 Message-Id: <20220709154149.165524-5-siddharthasthana31@gmail.com> X-Mailer: git-send-email 2.37.0.6.g69b7ad898b In-Reply-To: <20220709154149.165524-1-siddharthasthana31@gmail.com> References: <20220707161554.6900-1-siddharthasthana31@gmail.com> <20220709154149.165524-1-siddharthasthana31@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org git-cat-file is used by tools like GitLab to get commit tag contents that are then displayed to users. This content which has author, committer or tagger information, could benefit from passing through the mailmap mechanism before being sent or displayed. This patch adds --[no-]use-mailmap command line option to the git cat-file command. It also adds --[no-]mailmap option as an alias to --[no-]use-mailmap. Mentored-by: Christian Couder Mentored-by: John Cai Helped-by: Phillip Wood Helped-by: Johannes Schindelin Signed-off-by: Siddharth Asthana --- Documentation/git-cat-file.txt | 6 ++++ builtin/cat-file.c | 43 ++++++++++++++++++++++++++- t/t4203-mailmap.sh | 54 ++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 1 deletion(-) diff --git a/Documentation/git-cat-file.txt b/Documentation/git-cat-file.txt index 24a811f0ef..1880e9bba1 100644 --- a/Documentation/git-cat-file.txt +++ b/Documentation/git-cat-file.txt @@ -63,6 +63,12 @@ OPTIONS or to ask for a "blob" with `` being a tag object that points at it. +--[no-]mailmap:: +--[no-]use-mailmap:: + Use mailmap file to map author, committer and tagger names + and email addresses to canonical real names and email addresses. + See linkgit:git-shortlog[1]. + --textconv:: Show the content as transformed by a textconv filter. In this case, `` has to be of the form `:`, or `:` in diff --git a/builtin/cat-file.c b/builtin/cat-file.c index 50cf38999d..4b68216b51 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -16,6 +16,7 @@ #include "packfile.h" #include "object-store.h" #include "promisor-remote.h" +#include "mailmap.h" enum batch_mode { BATCH_MODE_CONTENTS, @@ -36,6 +37,22 @@ struct batch_options { static const char *force_path; +static struct string_list mailmap = STRING_LIST_INIT_NODUP; +static int use_mailmap; + +static char *replace_idents_using_mailmap(char *, size_t *); + +static char *replace_idents_using_mailmap(char *object_buf, size_t *size) +{ + struct strbuf sb = STRBUF_INIT; + const char *headers[] = { "author ", "committer ", "tagger ", NULL }; + + strbuf_attach(&sb, object_buf, *size, *size + 1); + apply_mailmap_to_header(&sb, headers, &mailmap); + *size = sb.len; + return strbuf_detach(&sb, NULL); +} + static int filter_object(const char *path, unsigned mode, const struct object_id *oid, char **buf, unsigned long *size) @@ -152,6 +169,12 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name, if (!buf) die("Cannot read object %s", obj_name); + if (use_mailmap) { + size_t s = size; + buf = replace_idents_using_mailmap(buf, &s); + size = cast_size_t_to_ulong(s); + } + /* otherwise just spit out the data */ break; @@ -183,6 +206,12 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name, } buf = read_object_with_reference(the_repository, &oid, exp_type_id, &size, NULL); + + if (use_mailmap) { + size_t s = size; + buf = replace_idents_using_mailmap(buf, &s); + size = cast_size_t_to_ulong(s); + } break; } default: @@ -348,11 +377,18 @@ static void print_object_or_die(struct batch_options *opt, struct expand_data *d void *contents; contents = read_object_file(oid, &type, &size); + + if (use_mailmap) { + size_t s = size; + contents = replace_idents_using_mailmap(contents, &s); + size = cast_size_t_to_ulong(s); + } + if (!contents) die("object %s disappeared", oid_to_hex(oid)); if (type != data->type) die("object %s changed type!?", oid_to_hex(oid)); - if (data->info.sizep && size != data->size) + if (data->info.sizep && size != data->size && !use_mailmap) die("object %s changed size!?", oid_to_hex(oid)); batch_write(opt, contents, size); @@ -843,6 +879,8 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix) OPT_CMDMODE('s', NULL, &opt, N_("show object size"), 's'), OPT_BOOL(0, "allow-unknown-type", &unknown_type, N_("allow -s and -t to work with broken/corrupt objects")), + OPT_BOOL(0, "use-mailmap", &use_mailmap, N_("use mail map file")), + OPT_ALIAS(0, "mailmap", "use-mailmap"), /* Batch mode */ OPT_GROUP(N_("Batch objects requested on stdin (or --batch-all-objects)")), OPT_CALLBACK_F(0, "batch", &batch, N_("format"), @@ -885,6 +923,9 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix) opt_cw = (opt == 'c' || opt == 'w'); opt_epts = (opt == 'e' || opt == 'p' || opt == 't' || opt == 's'); + if (use_mailmap) + read_mailmap(&mailmap); + /* --batch-all-objects? */ if (opt == 'b') batch.all_objects = 1; diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh index 0b2d21ec55..c60a90615c 100755 --- a/t/t4203-mailmap.sh +++ b/t/t4203-mailmap.sh @@ -963,4 +963,58 @@ test_expect_success SYMLINKS 'symlinks not respected in-tree' ' test_cmp expect actual ' +test_expect_success '--no-use-mailmap disables mailmap in cat-file' ' + test_when_finished "rm .mailmap" && + cat >.mailmap <<-EOF && + A U Thor Orig + EOF + cat >expect <<-EOF && + author Orig + EOF + git cat-file --no-use-mailmap commit HEAD >log && + sed -n "/^author /s/\([^>]*>\).*/\1/p" log >actual && + test_cmp expect actual +' + +test_expect_success '--use-mailmap enables mailmap in cat-file' ' + test_when_finished "rm .mailmap" && + cat >.mailmap <<-EOF && + A U Thor Orig + EOF + cat >expect <<-EOF && + author A U Thor + EOF + git cat-file --use-mailmap commit HEAD >log && + sed -n "/^author /s/\([^>]*>\).*/\1/p" log >actual && + test_cmp expect actual +' + +test_expect_success '--no-mailmap disables mailmap in cat-file for annotated tag objects' ' + test_when_finished "rm .mailmap" && + cat >.mailmap <<-EOF && + Orig C O Mitter + EOF + cat >expect <<-EOF && + tagger C O Mitter + EOF + git tag -a -m "annotated tag" v1 && + git cat-file --no-mailmap -p v1 >log && + sed -n "/^tagger /s/\([^>]*>\).*/\1/p" log >actual && + test_cmp expect actual +' + +test_expect_success '--mailmap enables mailmap in cat-file for annotated tag objects' ' + test_when_finished "rm .mailmap" && + cat >.mailmap <<-EOF && + Orig C O Mitter + EOF + cat >expect <<-EOF && + tagger Orig + EOF + git tag -a -m "annotated tag" v2 && + git cat-file --mailmap -p v2 >log && + sed -n "/^tagger /s/\([^>]*>\).*/\1/p" log >actual && + test_cmp expect actual +' + test_done