From patchwork Sat Jul 16 07:40:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Siddharth Asthana X-Patchwork-Id: 12919966 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 D652DC43334 for ; Sat, 16 Jul 2022 07:41:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230022AbiGPHlT (ORCPT ); Sat, 16 Jul 2022 03:41:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55714 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229436AbiGPHlR (ORCPT ); Sat, 16 Jul 2022 03:41:17 -0400 Received: from mail-pj1-x102d.google.com (mail-pj1-x102d.google.com [IPv6:2607:f8b0:4864:20::102d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AB3111055F for ; Sat, 16 Jul 2022 00:41:16 -0700 (PDT) Received: by mail-pj1-x102d.google.com with SMTP id j1-20020a17090aeb0100b001ef777a7befso9615440pjz.0 for ; Sat, 16 Jul 2022 00:41:16 -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=DCmC8i8ashrRnHfFoSvLmXY456g/qnefS1Bfp7aVcsc=; b=MI6EcxKUnNeQ3RFNHFkKpjHSHDKrL72hEbpTiTxqesTYBG+DjPqMq3qX6aLgqphEKr ohZNUOElqqQtGSjY7HI63K+8owVGSGXgXUHkcdBTu1lNMpELjauVG9j0Muw3ar82aq3d GY6geghETUw5JOYAMhyTorHt6lm3bNz6HfomRM7tS4q9pMOZtWhd9KiTN1vJYtvZOBkd FzH01Z8N1mHegYjA0AfDtmKNOiYx0TILpq1yuaskNbTMBJgY9bHW/yaIt9Cg5kfLOz1C ybM2GPwkFqAehathTiugr6f3rdSHL8uOtE4sGDOH3tU/BT0A778OLtRsqWbPK7r8ofrs aX6Q== 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=DCmC8i8ashrRnHfFoSvLmXY456g/qnefS1Bfp7aVcsc=; b=vWjyWBRvE9fgkrcno69XpVHG63L0tutqarVkkHz40l5sP1nbs/ks4KFi9vFBMFMAh9 V6ngZvKTNfGRHj/cEmfiBylowIC6ufPVfJcYb959GqDr2fTkWp3bsgyHmWCOD9VGRPiB DAJxtqoLZckxhcIeYG5p4jfM4doEZ8aWgcF0TBFgy7NJWe3ZJblRQWC5gaBe3lAQU+mb Y+ePX6RmdztSbAfYfLFSkwKcPp+h0iKjKmbFRgPgDM4AimzonXz6GssyJq1RxdiF2/Ea r9JYj/+OSiu5iKcMEJhPPTd2lG2Q+9TaiPLHh8cVUCxWWCNeNYPd5tVQb0apH0lzKFWw 3Buw== X-Gm-Message-State: AJIora9qgpWKA2OidJFQbXanaMabZA5k8kz32oSR9c1qBEvGnSxrqcfC n0NbbCSQWQ522srKSoa3TVwaRs8HccGL8KV5 X-Google-Smtp-Source: AGRyM1uKFi4Yxh2ZX6x5ZoTlJ/7a5S5wuvuSFd1evZoOnTmOf++ryPGPOOsDIRp0didxA6gRY+0tEQ== X-Received: by 2002:a17:90b:33cd:b0:1f0:3655:17a8 with SMTP id lk13-20020a17090b33cd00b001f0365517a8mr20117838pjb.33.1657957275710; Sat, 16 Jul 2022 00:41:15 -0700 (PDT) Received: from HB2.. ([110.225.168.189]) by smtp.gmail.com with ESMTPSA id i27-20020a63541b000000b004161e62a3a5sm4325923pgb.78.2022.07.16.00.41.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 Jul 2022 00:41:15 -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 v5 1/4] revision: improve commit_rewrite_person() Date: Sat, 16 Jul 2022 13:10:52 +0530 Message-Id: <20220716074055.1786231-2-siddharthasthana31@gmail.com> X-Mailer: git-send-email 2.37.1.120.g001f220fb8 In-Reply-To: <20220716074055.1786231-1-siddharthasthana31@gmail.com> References: <20220712160634.213956-1-siddharthasthana31@gmail.com> <20220716074055.1786231-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 Helped-by: Johannes Schindelin Signed-off-by: Siddharth Asthana --- revision.c | 51 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/revision.c b/revision.c index 211352795c..9909da928e 100644 --- a/revision.c +++ b/revision.c @@ -3755,19 +3755,18 @@ 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 +3783,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 +3792,44 @@ 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 **header, + struct string_list *mailmap) +{ + size_t buf_offset = 0; + + if (!mailmap) + return; + + for (;;) { + const char *person, *line; + size_t i; + + line = buf->buf + buf_offset; + if (!*line || *line == '\n') + return; /* End of header */ + + for (i = 0; header[i]; i++) + if (skip_prefix(line, header[i], &person)) { + rewrite_ident_line(person, buf, mailmap); + break; + } + + buf_offset = strchrnul(buf->buf + buf_offset, '\n') - buf->buf; + if (buf->buf[buf_offset] == '\n') + ++buf_offset; + } +} + static int commit_match(struct commit *commit, struct rev_info *opt) { int retval; @@ -3832,11 +3862,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 16 07:40:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddharth Asthana X-Patchwork-Id: 12919967 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 A0F95C43334 for ; Sat, 16 Jul 2022 07:41:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231241AbiGPHl0 (ORCPT ); Sat, 16 Jul 2022 03:41:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55828 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229436AbiGPHlY (ORCPT ); Sat, 16 Jul 2022 03:41:24 -0400 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1799D32445 for ; Sat, 16 Jul 2022 00:41:23 -0700 (PDT) Received: by mail-pj1-x102a.google.com with SMTP id z12-20020a17090a7b8c00b001ef84000b8bso13508643pjc.1 for ; Sat, 16 Jul 2022 00:41:23 -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=S5isKAruz8q9i+ThNIdKLFl6xNmH33iy/FzynZD77eQ=; b=kypfWmytyTaxic7pXNp58TTBAs5e2WEixsizBdXn5G+KDPfNjVU+UljExLd+pTN5Ht moR5qSpKuwP4TrVYrBk0ISAtY+r0yGwJmKYdtYjVjcV1mss86RS952YROv/m2H1vffoY WR1OPDWYLwFwq6eMjgxnYx/Ql/0mmfLd5O2j3zWjUGskurt52vdnKJnHzxow3Yd45aJ+ XurTYcW9LtXymtwfYtvLs3pZznB3DI0/njiPCG7EYZahi/utGfQ68nPTMreahYxr9mFN wDWEkcOycYgqrRGVYI3G0/ZWwG1wYYaGEjXcdePu1CVX5En3tA0nyuWsyM00b5jdmU3a nHnw== 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=S5isKAruz8q9i+ThNIdKLFl6xNmH33iy/FzynZD77eQ=; b=hJIjCrvTGwqzxoDKr2kxXhQ8eaAbemargVZPh6FxtPS8Ky+YZHJonkcVvEjspDukpH Vhwqi2mmZ9yYpJKNypkqSbfTjFTnt4lqwE/xOFOjcNCoZPRfQakdm3I0O0Z2ke0yPkfN 6JD+7vom6gqytJiU0OrrfPrKSdemmX1YNHoEB7muiNfFJTLd84Hi2/8KWZhh+QHI8vm0 WlbC0JmHQ2Y1dAGclsLvg+iv9aNp0bfzFwJRiZzLe+lRx4z7KueWh4NjXPssocGgmj6Z emP4FoulDJj1iXJJc1uXTVZ63dXHoO8C1CAl1RoF4GAeRl0Xntlqg22w2fOPBn6YgBFu z1Zw== X-Gm-Message-State: AJIora/EDH39IU8GRqdjYAwYs8502YNpcHj+cWKOG035HcRKicHa8cw2 3kNIe/CqeDUCusI/5TjpAcu7HqPPLIhPRD1T X-Google-Smtp-Source: AGRyM1vba2I/lfroJDZJExsHjNSyMS2gB35uRViiv0rFpk+JJzeo2wxY186EJgA9fa5QR6gGoBMpmg== X-Received: by 2002:a17:90b:e95:b0:1ef:825f:cb40 with SMTP id fv21-20020a17090b0e9500b001ef825fcb40mr26246147pjb.29.1657957282053; Sat, 16 Jul 2022 00:41:22 -0700 (PDT) Received: from HB2.. ([110.225.168.189]) by smtp.gmail.com with ESMTPSA id i27-20020a63541b000000b004161e62a3a5sm4325923pgb.78.2022.07.16.00.41.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 Jul 2022 00:41:21 -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 v5 2/4] ident: move commit_rewrite_person() to ident.c Date: Sat, 16 Jul 2022 13:10:53 +0530 Message-Id: <20220716074055.1786231-3-siddharthasthana31@gmail.com> X-Mailer: git-send-email 2.37.1.120.g001f220fb8 In-Reply-To: <20220716074055.1786231-1-siddharthasthana31@gmail.com> References: <20220712160634.213956-1-siddharthasthana31@gmail.com> <20220716074055.1786231-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 | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ revision.c | 75 ------------------------------------------------------ 3 files changed, 81 insertions(+), 75 deletions(-) diff --git a/cache.h b/cache.h index ac5ab4ef9d..16a08aada2 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 *, const char **, struct string_list *); + /* * 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..83007e3e5d 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,80 @@ 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 **header, + struct string_list *mailmap) +{ + size_t buf_offset = 0; + + if (!mailmap) + return; + + for (;;) { + const char *person, *line; + size_t i; + + line = buf->buf + buf_offset; + if (!*line || *line == '\n') + return; /* End of header */ + + for (i = 0; header[i]; i++) + if (skip_prefix(line, header[i], &person)) { + rewrite_ident_line(person, buf, mailmap); + break; + } + + buf_offset = strchrnul(buf->buf + buf_offset, '\n') - buf->buf; + if (buf->buf[buf_offset] == '\n') + ++buf_offset; + } +} static void ident_env_hint(enum want_ident whose_ident) { diff --git a/revision.c b/revision.c index 9909da928e..14dca903b6 100644 --- a/revision.c +++ b/revision.c @@ -3755,81 +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 **header, - struct string_list *mailmap) -{ - size_t buf_offset = 0; - - if (!mailmap) - return; - - for (;;) { - const char *person, *line; - size_t i; - - line = buf->buf + buf_offset; - if (!*line || *line == '\n') - return; /* End of header */ - - for (i = 0; header[i]; i++) - if (skip_prefix(line, header[i], &person)) { - rewrite_ident_line(person, buf, mailmap); - break; - } - - buf_offset = strchrnul(buf->buf + buf_offset, '\n') - buf->buf; - if (buf->buf[buf_offset] == '\n') - ++buf_offset; - } -} - static int commit_match(struct commit *commit, struct rev_info *opt) { int retval; From patchwork Sat Jul 16 07:40:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddharth Asthana X-Patchwork-Id: 12919968 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 49BC4C43334 for ; Sat, 16 Jul 2022 07:41:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231311AbiGPHlb (ORCPT ); Sat, 16 Jul 2022 03:41:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55966 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231229AbiGPHla (ORCPT ); Sat, 16 Jul 2022 03:41:30 -0400 Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 396FE3A48A for ; Sat, 16 Jul 2022 00:41:29 -0700 (PDT) Received: by mail-pj1-x102e.google.com with SMTP id p9so7467806pjd.3 for ; Sat, 16 Jul 2022 00:41: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=QJxZj0Jrgy5mlqfq/AM1YpVdYgsX4/X/ABLCtc7qxKE=; b=NGOXP48eQNn73BiDffHkDZZK9HNQx9cPVKXoPz/CU2F0sPC3ncphnejJL9vVRY3doF PDhw6mFV1L6T0O0bId9KaLb/7IlyKru7Ez6jwWkxCYLVmsiiHUKVR/+pOflRTkvtHX4+ wVQrG7Xz+YTIhvooIjT4yQbLC8o/ALNmSfQdCc+na+jzKgF6CRxtYl6MPFH8V8iGRhF8 Kl0AaA/CHHIesK3w8rddZGDSsBwSkYY1v0RbDyUXWsgPHhwafFkUsvnLwrkY504XCP7l pM+a6ocY06gBkkHFNgNZ09jEy+gCJzJGwTJPgCQ+yQuFuPcZiJy1YmL9X/w7t/Y1moOZ g9cQ== 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=QJxZj0Jrgy5mlqfq/AM1YpVdYgsX4/X/ABLCtc7qxKE=; b=WCjIOXfU5XVHvEer1w7PRXzgSqtWjimGkcEqZIdZCn9SpVpTQxDQIQ8aoW3BgkldBS TWBxiJfG2sus9+duAVu2eupsBXcOUxw+uIiqJ3lOq0ELdjUuiqwaG4ePWaIKNqv8iyWY bc8UQ1bWG7r3+eyTUQxqsLPsgEHPxeY2hLqDvCKg9E2KeatKjH7GDlEoR84tJrZ/1+i6 G+a9LvSX3bJGFSMG+nUUNtA1OIqp6Cx2zLWtrbQOlGNzTxT9OQbhX9kiOT4hOZrF8rJu qGDRGE3EZBumdeFKCmcFd9WOz3ZYbQ8rhS+hWRmk7xlRlJD22VLKD7m7qRr5X29c54lX b+UQ== X-Gm-Message-State: AJIora96ohAUq5JvE8TTVbHU2mAPedsr2Lgm7oJe6sMhCJuE7Nldsk2q 1jlH4VomTD4OzrV8un0m7bvO4/ZiUOA5nNXz X-Google-Smtp-Source: AGRyM1vMoOwL/lCl3aYw1A0qR0JEAMyN1i8nFbHEWy93nWXB94sN34pzOtVqAGaZajPICi0+j8TRNA== X-Received: by 2002:a17:902:e891:b0:16c:3344:d8a0 with SMTP id w17-20020a170902e89100b0016c3344d8a0mr17391230plg.62.1657957288114; Sat, 16 Jul 2022 00:41:28 -0700 (PDT) Received: from HB2.. ([110.225.168.189]) by smtp.gmail.com with ESMTPSA id i27-20020a63541b000000b004161e62a3a5sm4325923pgb.78.2022.07.16.00.41.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 Jul 2022 00:41:27 -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 v5 3/4] ident: rename commit_rewrite_person() to apply_mailmap_to_header() Date: Sat, 16 Jul 2022 13:10:54 +0530 Message-Id: <20220716074055.1786231-4-siddharthasthana31@gmail.com> X-Mailer: git-send-email 2.37.1.120.g001f220fb8 In-Reply-To: <20220716074055.1786231-1-siddharthasthana31@gmail.com> References: <20220712160634.213956-1-siddharthasthana31@gmail.com> <20220716074055.1786231-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 | 4 ++-- revision.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cache.h b/cache.h index 16a08aada2..4aa1bd079d 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 *, const char **, struct string_list *); +void apply_mailmap_to_header(struct strbuf *, const char **, struct string_list *); /* * Compare split idents for equality or strict ordering. Note that we diff --git a/ident.c b/ident.c index 83007e3e5d..c0f56bc752 100644 --- a/ident.c +++ b/ident.c @@ -394,8 +394,8 @@ static ssize_t rewrite_ident_line(const char *person, struct strbuf *buf, return 0; } -void commit_rewrite_person(struct strbuf *buf, const char **header, - struct string_list *mailmap) +void apply_mailmap_to_header(struct strbuf *buf, const char **header, + 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 16 07:40:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddharth Asthana X-Patchwork-Id: 12919969 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 4FCF4C43334 for ; Sat, 16 Jul 2022 07:41:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231229AbiGPHlh (ORCPT ); Sat, 16 Jul 2022 03:41:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56116 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229589AbiGPHlg (ORCPT ); Sat, 16 Jul 2022 03:41:36 -0400 Received: from mail-pf1-x42d.google.com (mail-pf1-x42d.google.com [IPv6:2607:f8b0:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 89D0231906 for ; Sat, 16 Jul 2022 00:41:35 -0700 (PDT) Received: by mail-pf1-x42d.google.com with SMTP id c3so5521022pfb.13 for ; Sat, 16 Jul 2022 00:41: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=cXU28ChBPwNPp34PUokCn8IiZZbY9kZSLNJKtYqKrgs=; b=jzpcUUVW3nSEK3CYmpSZdYA9lRUp0zASUnfp8veAl4e/JMJyZeiQLm9Lktq5eEAjRg hEvD6w/qgtMPMPwZX22v/lDBraDRCYhTlUvF/T4dpWnJRwO6VObQr74TXQVd2calJeC0 Mhjh1nhkY9z+WwJ/L9aI5Puiaweh1P4PE9nqr11icVojKKnrFh6qbcYtjsaYP6a2ZOgE gIbp2LrIHerPHzqUOO/3ydUf1FLYK+89euhzQnZjxUU7XY+CSZka4tYkOzf2LDgaplmS L99+T2SxKvMw0eo/0es5g71T3WT50PRIhYQLDrtTdTHWsKYVuvQPI1LORPJ1eywxcjIg IjYw== 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=cXU28ChBPwNPp34PUokCn8IiZZbY9kZSLNJKtYqKrgs=; b=HdQtJMqSjv5hbyH8xryE/CMo+IWLvFpPyTOI0ce90sivHPGBXueonOR0hrJA7eCI3C /PMDPhFludcwmaLNIchRYttBJibrXbhSoFWJdAmMbz9y/3qM91vGvTwL/l1+C7YyICPX Pyu+D4DBK2/HT4Kmyuvo8s7I8N/1HM5+HOiFn2RIUEe3/IuYu7W5GOHga0t9MLITMu3A z3wBAl4y9hVDAkvEk5NI4Y2sQYQL3MYD/AO4w0XBT5qDTIYD9jWfl4wxQlIqjWLBNXHq r/u2BK/EW3k9E7eK7rRJH4SRqtiGuNGxZBUeOhLDyh7QIZK8D908nycpZLOuM4YHUFjZ 8M1g== X-Gm-Message-State: AJIora/iTn6C8sPS/92++Z/pU27Xk2rfjHaynDFTk/v8j9dnh1YigXDM 49kRPFc26GOvAOi8fCSr9rnDTvSsNnjuMzAu X-Google-Smtp-Source: AGRyM1ubhFqKnuZJhtORPuU0YA7FwlO+Ha7siz7jyfJbRBzofjhDiUwbBz5kgal7+kEoFXqyQMIDfQ== X-Received: by 2002:a63:6bc4:0:b0:40d:fd98:bb21 with SMTP id g187-20020a636bc4000000b0040dfd98bb21mr15310930pgc.249.1657957294554; Sat, 16 Jul 2022 00:41:34 -0700 (PDT) Received: from HB2.. ([110.225.168.189]) by smtp.gmail.com with ESMTPSA id i27-20020a63541b000000b004161e62a3a5sm4325923pgb.78.2022.07.16.00.41.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 Jul 2022 00:41:34 -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 v5 4/4] cat-file: add mailmap support Date: Sat, 16 Jul 2022 13:10:55 +0530 Message-Id: <20220716074055.1786231-5-siddharthasthana31@gmail.com> X-Mailer: git-send-email 2.37.1.120.g001f220fb8 In-Reply-To: <20220716074055.1786231-1-siddharthasthana31@gmail.com> References: <20220712160634.213956-1-siddharthasthana31@gmail.com> <20220716074055.1786231-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. This patch also introduces new test cases to test the mailmap mechanism in git cat-file command. 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 | 59 ++++++++++++++++++++++++++++++++++ 3 files changed, 107 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..cd1cab3e54 100755 --- a/t/t4203-mailmap.sh +++ b/t/t4203-mailmap.sh @@ -963,4 +963,63 @@ test_expect_success SYMLINKS 'symlinks not respected in-tree' ' test_cmp expect actual ' +test_expect_success 'prepare for cat-file --mailmap' ' + rm -f .mailmap && + git commit --allow-empty -m foo --author="Orig " +' + +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