From patchwork Mon Oct 26 01:04:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387354 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=ch689JeB; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGpf1KrTz9sT6 for ; Mon, 26 Oct 2020 12:05:10 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 1200B8248F; Mon, 26 Oct 2020 02:05:07 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="ch689JeB"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 0DB4D8248E; Mon, 26 Oct 2020 02:05:06 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x144.google.com (mail-il1-x144.google.com [IPv6:2607:f8b0:4864:20::144]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id D578882483 for ; Mon, 26 Oct 2020 02:05:02 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x144.google.com with SMTP id q1so6752167ilt.6 for ; Sun, 25 Oct 2020 18:05:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=mvyONZ0tS8LheXowjcA4n9OkeH/5cdEeTunuP4Mpjwk=; b=ch689JeBYZenWu0U/KwrXd2KgVMtxXxNRH3Gh/2vtNLnFm6IPuhC7rCrz7qg1E/khf 7hgifi2/fFWaUy3MZpBwbjJ3E55P3lIVq7aCxUbQeduCdi/V/D6WF/GPT+EXZ3QMpwWc E1zYS4Ub4yLOIht9HUOE5UI0fvEAMIorMNHwM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mvyONZ0tS8LheXowjcA4n9OkeH/5cdEeTunuP4Mpjwk=; b=bsXJeU/YgsrTkGlkVYZ6ha0AWFoj8eT6a8vgI8R6uUtgmrfxejAgXwBF2JxxIXEsIr dPaiUBN9x8VZRjujd7wjnYGjHfNFRnBs7pPCHVV1xWSJAO5vRhYtC0gJzOjwmq034x3T f8CQ5HGrUyXEvKg8YcwEoj58TOs/e3czNa5mmx8grNG3Rz+ZQPEmhqnW2vglf221nXd/ ZyXO7dkXZoDObM1gfAIxtOlKADJZ5hhiS4bj6Bfo7eRPlurm/+7OWY/+a8K0zNx1795J nGHlQLMjTsXFH/RNQUv/3+JvVrUs/es1IrAQwEKAmSGMoKgQo82lff9n57lAnmnVZl8n FfcA== X-Gm-Message-State: AOAM530mMwknkDt8wQ/Y/l+wt0J9CQswWNaAaSR7RRnAWUl3Yjpfs4QI +q395z3+fYv+BYrjp6njp+xHF1Nn03aA1Q5w X-Google-Smtp-Source: ABdhPJzCx5yHNYImZ9sd4ANqnExws7Qmt0OOmeaKYSdPJ8//KRHGbjaO7uiYmquOrEpgljec6QvPmg== X-Received: by 2002:a92:db84:: with SMTP id f4mr546686ilp.3.1603674301460; Sun, 25 Oct 2020 18:05:01 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:01 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 01/30] patman: Correct operation of -n Date: Sun, 25 Oct 2020 19:04:13 -0600 Message-Id: <20201026010442.1606893-2-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean This operation was unfortunately broken by a recent change. It is now necessary to use -i in addition to -n, if there are errors or warnings in the patches. Correct this by always showing the summary information. Fixes: f3653759758 ("patman: Move main code out to a control module") Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/control.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tools/patman/control.py b/tools/patman/control.py index 67e8f397efd..aea9df8c8d1 100644 --- a/tools/patman/control.py +++ b/tools/patman/control.py @@ -170,9 +170,8 @@ def send(args): ok = ok and gitutil.CheckSuppressCCConfig() its_a_go = ok or args.ignore_errors - if its_a_go: - email_patches( - col, series, cover_fname, patch_files, args.process_tags, - its_a_go, args.ignore_bad_tags, args.add_maintainers, - args.limit, args.dry_run, args.in_reply_to, args.thread, - args.smtp_server) + email_patches( + col, series, cover_fname, patch_files, args.process_tags, + its_a_go, args.ignore_bad_tags, args.add_maintainers, + args.limit, args.dry_run, args.in_reply_to, args.thread, + args.smtp_server) From patchwork Mon Oct 26 01:04:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387357 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=BWxroOny; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGpn6qp9z9sTD for ; Mon, 26 Oct 2020 12:05:21 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 21970824A8; Mon, 26 Oct 2020 02:05:11 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="BWxroOny"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id E7AE68248E; Mon, 26 Oct 2020 02:05:06 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x136.google.com (mail-il1-x136.google.com [IPv6:2607:f8b0:4864:20::136]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 1F52382485 for ; Mon, 26 Oct 2020 02:05:04 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x136.google.com with SMTP id g7so6739253ilr.12 for ; Sun, 25 Oct 2020 18:05:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=poOZeEUOOJU+VU0CY6EimRnWvTcT2Jp/amC2SZo9r8s=; b=BWxroOnymWk9a0MfcTHmA+OcLLclvPJLqdlx6/O0s9QVtijpl9OB1KO42hBn8HSyR9 PsBegpze7mTIDgkw+9YQ77DX618Kz1+/1kpY6o2IKUtPaURmM2zAxVP8G5W5yVD6zBqy ksdYpqI09LjC/F1/QCHXsVG6xRzGaaYQmbkag= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=poOZeEUOOJU+VU0CY6EimRnWvTcT2Jp/amC2SZo9r8s=; b=kLxj9q16BvP3YDz55rCtwkxq39QfRZ5kBkuo1PfOaqK5hNnCofBa7CiBpD81qivJXp 06KCbpbjVR/CpT32ZTvL/7Yzq9F0G5S9c0T6o2sJkwvlfLKom11PExRp5Hl4oiI/UnJs GNLkhb/HH1cQoUELaDVLbLY/kXI/WnJkM+mCWCXfH4WQ/AnWzYNymxTRGxeVcrTySQr9 WPMaFgRadE1Dewoo1k13O5DN1B+JpDvw4NQCbO/qukqd1FQCRss+YtFmGF2l5UXeLiTZ AOkpmP3a+kdGA2hF2iUiqUW4QwP6NDtHCgsyv4hzjODPW/OfNER3ixV2dsU8xguS4Hu2 jjag== X-Gm-Message-State: AOAM5334Ay4y87NS/b0Sew5xSD705T+SHIYY5z7LyDCjL/1NfmI52GN2 uvs8ajZed9jc9iimOlyEYgY8jK+DNlCNVBmW X-Google-Smtp-Source: ABdhPJzrwi3mfcs5Df+Ka/4bswhucseqoerO9hlrWaeYK9dbGUant+MtIAeIVYKN8VPUtLMV1VCkDw== X-Received: by 2002:a92:194d:: with SMTP id e13mr9481892ilm.192.1603674302366; Sun, 25 Oct 2020 18:05:02 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:01 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass , Bin Meng , Daniel Schwierzeck , Heiko Schocher , Heinrich Schuchardt , Marek Vasut , Stephen Warren Subject: [PATCH v2 02/30] azure/gitLab/travis: Add pygit2 as a dependency for tests Date: Sun, 25 Oct 2020 19:04:14 -0600 Message-Id: <20201026010442.1606893-3-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean This lets patman run all of its tests, rather than skipping quite a few. Signed-off-by: Simon Glass --- (no changes since v1) .azure-pipelines.yml | 2 +- .gitlab-ci.yml | 2 +- .travis.yml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index 473ddee3835..132daa358f5 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -140,7 +140,7 @@ jobs: export USER=azure virtualenv -p /usr/bin/python3 /tmp/venv . /tmp/venv/bin/activate - pip install pyelftools pytest + pip install pyelftools pytest pygit2 export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl export PYTHONPATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt export PATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH} diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9ac2b336a11..74aabe53016 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -161,7 +161,7 @@ Run binman, buildman, dtoc, Kconfig and patman testsuites: export USER=gitlab; virtualenv -p /usr/bin/python3 /tmp/venv; . /tmp/venv/bin/activate; - pip install pyelftools pytest; + pip install pyelftools pytest pygit2; export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl; export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt"; export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}"; diff --git a/.travis.yml b/.travis.yml index fb8f73157d7..bfcc74cd62a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ addons: - python3-sphinx - python3-virtualenv - python3-pip + - python3-pygit2 - swig - libpython-dev - iasl From patchwork Mon Oct 26 01:04:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387358 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=N/zB7oLO; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGq22rKmz9sTK for ; Mon, 26 Oct 2020 12:05:34 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 23DFF8248D; Mon, 26 Oct 2020 02:05:14 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="N/zB7oLO"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id B039482487; Mon, 26 Oct 2020 02:05:08 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x135.google.com (mail-il1-x135.google.com [IPv6:2607:f8b0:4864:20::135]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 016BD82487 for ; Mon, 26 Oct 2020 02:05:05 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x135.google.com with SMTP id n5so6737901ile.7 for ; Sun, 25 Oct 2020 18:05:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6VHuYw/aTIefY8KsB1i9G2zOUSx7bk+iYQL4zCwqPGw=; b=N/zB7oLOjcccc2KTZTgknhN0qECwSYinKge4x2NtG4Lzg7+Meh5F+/Ak+KUWwuNXGm a5/Xr6G88Vd7j6XDIWZS9dF1zB/twS1A3CJf9KUnJ/mMDiBOh957+2FEs/P+ZAqWzrOT EKq2lnmZEgCNqQ0YU4RhSxlKuS42rBl9bUpfE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6VHuYw/aTIefY8KsB1i9G2zOUSx7bk+iYQL4zCwqPGw=; b=mjDz9mQCBTNYb8xs7GA25+vznd4R97y4b5H/QnX+1Kfia9OpnLBy5/WuUEaKCmpELC fu9B97pH6lnYuRyNr1gBRt+GJlCx/eNaitTblUVvxJ1yk4tjmYvGNxXT+LJeUDIiG4vm 1mfBrspaHo0vP534hC5AmVvzjp0+/K4zRltmi2yPznWZYEE19DZnldeD47plV5I2eSTI GxPu1rwgkfMl4QWqbOUCF2yogsid58MA57R+blrM9IWUcW3ffnykHbIVO4Q3Oc2qHSZ4 +UMVQeRSHlEch+xhbnUqyShdj9geBoyWvNLD8zG3wOD8Gsdm/IsrD+72XJ//NpF6Z77c PxeQ== X-Gm-Message-State: AOAM5328AXdeo8A8Vit/Eg+eEsbsqKv0aWOWNw3QZsDhkc4XyAh4oUg1 f9l/y8CnF37zCJIo+8nTh5Znszibwypk9Cpy X-Google-Smtp-Source: ABdhPJy6ULlewCnAFOXGr7tDQA4EVYcZMpjn2cN0NFpFUFMxipCLqqxsBmjyOg7slZpTGZqYT5eZXQ== X-Received: by 2002:a92:ddd1:: with SMTP id d17mr8895486ilr.275.1603674303254; Sun, 25 Oct 2020 18:05:03 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:02 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 03/30] patman: Update how tests are run Date: Sun, 25 Oct 2020 19:04:15 -0600 Message-Id: <20201026010442.1606893-4-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean The current instructions are out-of-date. Fix them. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/README | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/patman/README b/tools/patman/README index 52b2cf70bd0..7ede1068ee1 100644 --- a/tools/patman/README +++ b/tools/patman/README @@ -533,12 +533,10 @@ Most of these are indicated by a TODO in the code. It would be nice if this could handle the In-reply-to side of things. -The tests are incomplete, as is customary. Use the --test flag to run them, -and make sure you are in the tools/patman directory first: +The tests are incomplete, as is customary. Use the 'test' subcommand to run +them: - $ cd /path/to/u-boot - $ cd tools/patman - $ ./patman --test + $ tools/patman/patman test Error handling doesn't always produce friendly error messages - e.g. putting an incorrect tag in a commit may provide a confusing message. From patchwork Mon Oct 26 01:04:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387359 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=EHSH0VWB; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGqH25vqz9sT6 for ; Mon, 26 Oct 2020 12:05:46 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 5FAA08244B; Mon, 26 Oct 2020 02:05:16 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="EHSH0VWB"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 29C8B8249B; Mon, 26 Oct 2020 02:05:09 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x133.google.com (mail-il1-x133.google.com [IPv6:2607:f8b0:4864:20::133]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id CBEE38248D for ; Mon, 26 Oct 2020 02:05:05 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x133.google.com with SMTP id x20so1403844ilj.8 for ; Sun, 25 Oct 2020 18:05:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dQZBRSm28HJ7nF6x4nOKEdMqBPUbZxJWQ8xwemRpDz4=; b=EHSH0VWBjZPURiDdGjOQrOY2dqhLw0XtXdTKQWK/BWwf7XV0rffvMhPwylINSXAIHU 1VAXxuea32Fpb8MV5c8PcOKdEMyACNjFWa0lbq8LlE0qkzOu6LPVTbMQ2BEOp0y+REd/ 4TduWU8gSACAVW2tQfkmQUXCMwOSIJC5dTrfc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dQZBRSm28HJ7nF6x4nOKEdMqBPUbZxJWQ8xwemRpDz4=; b=L7FxUz05p3GeSKBfz4V9hvyefjA7ps6oh2YOxitkXn9osFlOgeW89ol95oAuxc6rru EYg2fTyG/yb7sftygTXxRAVCBE2V1Jc8BxrPFYK3xvvOoLfAWwPx2T36kSG3kyutKLLU 4k7BIKBQSsSuYXJ6/kz37Y2+RghNE5lPWQ80aCcns01JVHW1uHkrrhzlQvknOJmO9BkB iOEwD1yziVd4OTDiyHv4QMRFBPTZa9vR1ZEoLYhrAIuE6h583FHO/AUbEY4Cu+nDOHQq 7hYDHwch6qFnNfSwJ/cfvSKJePW3sH2LgVa/KgUp5k1G0PbZ+JWrwOAASa3kZLHIU/16 62Zw== X-Gm-Message-State: AOAM531ldMOfkMD+HxJDXktPVzJHZqiv8Opd/zyudTXkmQjVX8O5ddmb egVDJsxc6x2O4gWd4O59MVrOfGgZ9hO4QKM/ X-Google-Smtp-Source: ABdhPJzaOPdmbKGBygrvv1mzTRfsY54jcC5GN3ST+q+1CGqpzLoJjTN0sXReKfjeA++/UpUbYZz6IQ== X-Received: by 2002:a92:ce45:: with SMTP id a5mr8613130ilr.308.1603674304601; Sun, 25 Oct 2020 18:05:04 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:03 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 04/30] patman: Fix whitespace errors in func_test Date: Sun, 25 Oct 2020 19:04:16 -0600 Message-Id: <20201026010442.1606893-5-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Fix up various indentation and other minor things to make pylint3 happier. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/func_test.py | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 810af9c6042..7fffe649974 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -24,20 +24,20 @@ from patman.test_util import capture_sys_output try: import pygit2 - HAVE_PYGIT2= True + HAVE_PYGIT2 = True except ModuleNotFoundError: HAVE_PYGIT2 = False @contextlib.contextmanager def capture(): - oldout,olderr = sys.stdout, sys.stderr + oldout, olderr = sys.stdout, sys.stderr try: - out=[StringIO(), StringIO()] - sys.stdout,sys.stderr = out + out = [StringIO(), StringIO()] + sys.stdout, sys.stderr = out yield out finally: - sys.stdout,sys.stderr = oldout, olderr + sys.stdout, sys.stderr = oldout, olderr out[0] = out[0].getvalue() out[1] = out[1].getvalue() @@ -160,10 +160,10 @@ class TestFunctional(unittest.TestCase): in_reply_to = mel count = 2 settings.alias = { - 'fdt': ['simon'], - 'u-boot': ['u-boot@lists.denx.de'], - 'simon': [ed], - 'fred': [fred], + 'fdt': ['simon'], + 'u-boot': ['u-boot@lists.denx.de'], + 'simon': [ed], + 'fred': [fred], } text = self.GetText('test01.txt') @@ -177,9 +177,9 @@ class TestFunctional(unittest.TestCase): cc_file = series.MakeCcFile(process_tags, cover_fname, not ignore_bad_tags, add_maintainers, None) - cmd = gitutil.EmailPatches(series, cover_fname, args, - dry_run, not ignore_bad_tags, cc_file, - in_reply_to=in_reply_to, thread=None) + cmd = gitutil.EmailPatches( + series, cover_fname, args, dry_run, not ignore_bad_tags, + cc_file, in_reply_to=in_reply_to, thread=None) series.ShowActions(args, cmd, process_tags) cc_lines = open(cc_file, encoding='utf-8').read().splitlines() os.remove(cc_file) @@ -221,8 +221,9 @@ class TestFunctional(unittest.TestCase): self.assertEqual(('%s %s\0%s' % (args[0], rick, stefan)), tools.ToUnicode(cc_lines[0])) - self.assertEqual(('%s %s\0%s\0%s\0%s' % (args[1], fred, ed, rick, - stefan)), tools.ToUnicode(cc_lines[1])) + self.assertEqual( + '%s %s\0%s\0%s\0%s' % (args[1], fred, ed, rick, stefan), + tools.ToUnicode(cc_lines[1])) expected = ''' This is a test of how the cover @@ -256,8 +257,8 @@ Simon Glass (2): ''' lines = open(cover_fname, encoding='utf-8').read().splitlines() self.assertEqual( - 'Subject: [RFC PATCH v3 0/2] test: A test patch series', - lines[3]) + 'Subject: [RFC PATCH v3 0/2] test: A test patch series', + lines[3]) self.assertEqual(expected.splitlines(), lines[7:]) for i, fname in enumerate(args): @@ -310,7 +311,7 @@ Changes in v2: tools.WriteFile(path, text, binary=False) index = self.repo.index index.add(fname) - author = pygit2.Signature('Test user', 'test@email.com') + author = pygit2.Signature('Test user', 'test@email.com') committer = author tree = index.write_tree() message = subject + '\n' + body @@ -335,7 +336,7 @@ Changes in v2: author = pygit2.Signature('Test user', 'test@email.com') committer = author commit = repo.create_commit('HEAD', author, committer, - 'Created master', new_tree, []) + 'Created master', new_tree, []) self.make_commit_with_file('Initial commit', ''' Add a README From patchwork Mon Oct 26 01:04:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387360 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=mn2D7Gp8; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGqW1Z0Jz9sT6 for ; Mon, 26 Oct 2020 12:05:58 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 6F2228248B; Mon, 26 Oct 2020 02:05:18 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="mn2D7Gp8"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 03D4B82495; Mon, 26 Oct 2020 02:05:10 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd31.google.com (mail-io1-xd31.google.com [IPv6:2607:f8b0:4864:20::d31]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id AF58A8248B for ; Mon, 26 Oct 2020 02:05:06 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd31.google.com with SMTP id u62so8341058iod.8 for ; Sun, 25 Oct 2020 18:05:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=f/07W/iZlaBIjukVLK617fgDgVzVwwbzRgQpDKpfRWU=; b=mn2D7Gp8uL8xPGCo0cQf76HkQdyLi1Llv5CSBFYVpJJa9oq2whdO9PdNx2mtQ1klKl 7FzyGZXTjXAa+VNRQHScfY9xM2CVcp9k22B+j42fpo4cpjYM+WsYNAncg8X9b3vVhoMt sGXRTit+OJnqIRK3lN8u0WAJDGhc+JmxwhuFQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=f/07W/iZlaBIjukVLK617fgDgVzVwwbzRgQpDKpfRWU=; b=jbF1sz1CurrAnIEEL12cydYsCvESO7UQLCS5YBVkSGqPe6zwOjOXYV4Vw/oUCHqFT2 z1K/YsGsifkn6egZ3wvtDK1AR0/PNWToxKoU6af/Ef8mZWrZvSuAtZJDV2M7/F57+mc9 Q3Sg1xnE3dLS6/dolale5xLmAdQjc/rOb7gIjOt3x0JyQER66o99fUTy00pUPk+gZwmQ u9iV8CW1eR3DzYVUOXOQVslM7mmBxz0iq7n33g7pUlaLWG3DfFvu6qo9p12cESPdI+qK oymfHmZ2T/+qWa00ZIyFYL0KBavANOEupxvpDNHDAJwBckyefcC3L/1Fl46WAVvTBOc5 N0vQ== X-Gm-Message-State: AOAM5326/IDkkvlNugg+qLBDG0hwJQjUxhdK1BvWVsqH+4GAf1ImDW82 rmFMMehb/fjo79Amzki36RnYWpnDEB7kZNUZ X-Google-Smtp-Source: ABdhPJyeyx2mjV+3ld6atj07lEhxN97w8ymTWzQU7uACWx+if+nsSbwIuG3JS8AwAyuyDacsGaf++g== X-Received: by 2002:a6b:b5c2:: with SMTP id e185mr8786236iof.106.1603674305389; Sun, 25 Oct 2020 18:05:05 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:05 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 05/30] patman: Use capture_sys_output() consistently Date: Sun, 25 Oct 2020 19:04:17 -0600 Message-Id: <20201026010442.1606893-6-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean One test still uses its own function for capturing output. Modify it to use the standard one in test_util Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/func_test.py | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 7fffe649974..263cb340ef5 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -4,7 +4,6 @@ # Copyright 2017 Google, Inc # -import contextlib import os import re import shutil @@ -12,8 +11,6 @@ import sys import tempfile import unittest -from io import StringIO - from patman import control from patman import gitutil from patman import patchstream @@ -29,19 +26,6 @@ except ModuleNotFoundError: HAVE_PYGIT2 = False -@contextlib.contextmanager -def capture(): - oldout, olderr = sys.stdout, sys.stderr - try: - out = [StringIO(), StringIO()] - sys.stdout, sys.stderr = out - yield out - finally: - sys.stdout, sys.stderr = oldout, olderr - out[0] = out[0].getvalue() - out[1] = out[1].getvalue() - - class TestFunctional(unittest.TestCase): def setUp(self): self.tmpdir = tempfile.mkdtemp(prefix='patman.') @@ -169,7 +153,7 @@ class TestFunctional(unittest.TestCase): text = self.GetText('test01.txt') series = patchstream.GetMetaDataForTest(text) cover_fname, args = self.CreatePatchesForTest(series) - with capture() as out: + with capture_sys_output() as out: patchstream.FixPatches(series, args) if cover_fname and series.get('cover'): patchstream.InsertCoverLetter(cover_fname, series, count) @@ -184,7 +168,7 @@ class TestFunctional(unittest.TestCase): cc_lines = open(cc_file, encoding='utf-8').read().splitlines() os.remove(cc_file) - lines = out[0].splitlines() + lines = out[0].getvalue().splitlines() self.assertEqual('Cleaned %s patches' % len(series.commits), lines[0]) self.assertEqual('Change log missing for v2', lines[1]) self.assertEqual('Change log missing for v3', lines[2]) From patchwork Mon Oct 26 01:04:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387361 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=JWyKWmCq; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGqm1xCnz9sTK for ; Mon, 26 Oct 2020 12:06:11 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 20D8C824C7; Mon, 26 Oct 2020 02:05:25 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="JWyKWmCq"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 68ECB824A9; Mon, 26 Oct 2020 02:05:11 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd2d.google.com (mail-io1-xd2d.google.com [IPv6:2607:f8b0:4864:20::d2d]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 90D6B82485 for ; Mon, 26 Oct 2020 02:05:07 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd2d.google.com with SMTP id r9so8347986ioo.7 for ; Sun, 25 Oct 2020 18:05:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=C9iCyP4hNNsFPb5BXHG/kuLAH+U3Hla2KsGAs0zmn4M=; b=JWyKWmCqtp8aFghE/I3b8Dddsa9Dw5/DGozMuaTBpLCKyI6eMAm8Dfph4Mi4Pz+Pyn zuRwAXbN/JEn6rJURxIFejhBrrdy6T9ZKdFkBcF2y8m4sSruuEJiLjAA5M+n1Wx7xFM7 TaIkMoTsPvl7hMYT12741tDIZXoeLMWNX/3WQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=C9iCyP4hNNsFPb5BXHG/kuLAH+U3Hla2KsGAs0zmn4M=; b=t6SP0bjIKPj1+jFC0WsGLjaC9wyM+U8YKH/znX+rPbBisUQAIJ3ILhx3srGx2r+z3V MZk8dMMJvdad9iPwRIX325/6G6w1Ni68RYHPqS15N3kUoxqxUVuArmm/r50M959GYnZh W+JtvDWzgn8CcrmL4E+OKF7s8pjsw/QxGfnN3qUdVkSlaLziWdPg/4rhuUGnbP5chCpR meSn+wwZsweV/lUW6A9Lo/ouKE7z1DPz4LfnaastnT5wR5nFvOCZYC1tO/kqcrfMlOSn KvXOEOLClTa+Q261wo+YB1iKtkoe4E0GRBgjcKtFKgUg3yOuhtrPNoPbJ+5XGbr08nW5 PkjQ== X-Gm-Message-State: AOAM531DEQ0GH7R7Q9IRKfvHmWYHvmH6sXfKz8mpCjTVprvZ2JV0/Wg/ CMLE7Kcryg/7Y7oj64b0IekT5S1auvI9vyAl X-Google-Smtp-Source: ABdhPJyaV91fBmLQqDrZiAU28regpFX9LXkLv5EqrBgXEMYoIRhZ3JpeyWRTb0VTKE6HOr4rw2KVUg== X-Received: by 2002:a05:6638:d55:: with SMTP id d21mr2284357jak.136.1603674306282; Sun, 25 Oct 2020 18:05:06 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:05 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 06/30] patman: Fix remaining pylint3 warnings in func_test Date: Sun, 25 Oct 2020 19:04:18 -0600 Message-Id: <20201026010442.1606893-7-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean This fixes all but the ones about too many variables/statements. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/func_test.py | 76 +++++++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 263cb340ef5..b3c3e5796ad 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -4,6 +4,8 @@ # Copyright 2017 Google, Inc # +"""Functional tests for checking that patman behaves correctly""" + import os import re import shutil @@ -27,6 +29,7 @@ except ModuleNotFoundError: class TestFunctional(unittest.TestCase): + """Functional tests for checking that patman behaves correctly""" def setUp(self): self.tmpdir = tempfile.mkdtemp(prefix='patman.') self.gitdir = os.path.join(self.tmpdir, 'git') @@ -36,33 +39,69 @@ class TestFunctional(unittest.TestCase): shutil.rmtree(self.tmpdir) @staticmethod - def GetPath(fname): + def _get_path(fname): + """Get the path to a test file + + Args: + fname (str): Filename to obtain + + Returns: + str: Full path to file in the test directory + """ return os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 'test', fname) @classmethod - def GetText(self, fname): - return open(self.GetPath(fname), encoding='utf-8').read() + def _get_text(cls, fname): + """Read a file as text + + Args: + fname (str): Filename to read + + Returns: + str: Contents of file + """ + return open(cls._get_path(fname), encoding='utf-8').read() @classmethod - def GetPatchName(self, subject): + def _get_patch_name(cls, subject): + """Get the filename of a patch given its subject + + Args: + subject (str): Patch subject + + Returns: + str: Filename for that patch + """ fname = re.sub('[ :]', '-', subject) return fname.replace('--', '-') - def CreatePatchesForTest(self, series): + def _create_patches_for_test(self, series): + """Create patch files for use by tests + + This copies patch files from the test directory as needed by the series + + Args: + series (Series): Series containing commits to convert + + Returns: + tuple: + str: Cover-letter filename, or None if none + fname_list: list of str, each a patch filename + """ cover_fname = None fname_list = [] for i, commit in enumerate(series.commits): - clean_subject = self.GetPatchName(commit.subject) + clean_subject = self._get_patch_name(commit.subject) src_fname = '%04d-%s.patch' % (i + 1, clean_subject[:52]) fname = os.path.join(self.tmpdir, src_fname) - shutil.copy(self.GetPath(src_fname), fname) + shutil.copy(self._get_path(src_fname), fname) fname_list.append(fname) if series.get('cover'): src_fname = '0000-cover-letter.patch' cover_fname = os.path.join(self.tmpdir, src_fname) fname = os.path.join(self.tmpdir, src_fname) - shutil.copy(self.GetPath(src_fname), fname) + shutil.copy(self._get_path(src_fname), fname) return cover_fname, fname_list @@ -137,7 +176,8 @@ class TestFunctional(unittest.TestCase): stefan = b'Stefan Br\xc3\xbcns '.decode('utf-8') rick = 'Richard III ' mel = b'Lord M\xc3\xablchett '.decode('utf-8') - ed = b'Lond Edmund Blackadd\xc3\xabr X-Patchwork-Id: 1387363 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=Y0j96wk1; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGr12g20z9sTf for ; Mon, 26 Oct 2020 12:06:25 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 0D1E1824D0; Mon, 26 Oct 2020 02:05:27 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="Y0j96wk1"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 96D98824B8; Mon, 26 Oct 2020 02:05:12 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd41.google.com (mail-io1-xd41.google.com [IPv6:2607:f8b0:4864:20::d41]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 9680F8249C for ; Mon, 26 Oct 2020 02:05:08 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd41.google.com with SMTP id h21so8337128iob.10 for ; Sun, 25 Oct 2020 18:05:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1AWzYHnRvLLdMquyHL+fEUSyaN4HQ0DUOrb4gzDUEZg=; b=Y0j96wk18w9Z6nNgz0xCEn0jbTJUA/wlxCM+10AgvJVsBUlVSnoLOas9tzzrOZQvZv Z0S0E9qF4GWwQEFL0VsCstaIjVGa2rUZ2qK6ocEjVWEf5GVDSYlrGUtd1pKt27D6r9ij O4nsQU9+ghiVEOJ0fIhbS4KuVBhCS0zA5FZXU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1AWzYHnRvLLdMquyHL+fEUSyaN4HQ0DUOrb4gzDUEZg=; b=mliMekU0km4y6sFXdUlQbm9j7Y9XcUGInP4D/2z4dMUHeQmpTD+3Jds7ox9fGxOHCG lEuKIeOz53qWF9tKhzyb54/oWvkjCPlgZwGHivcEXcZ6Yi4N621iq1qO+pGCiXSWKYUM 5tt+Y57Kv+G90nq9TXx+iXebcBku6up1iauZNlgPyQz9ivAFqEK0ZP9hRcGpJxh+tS3f tBwNlRZRCMQ7UQVQBwumDOtlAXFnV6aT1jSaHXH//kE0rm+A0CCZHcjwkVBd5UzbUHfr ElNU6bIn1h1JcmFL+jhZkLfyTzVbVhHmttzdc5INg0/1UcQmWaR2Ms9ExfLM3sBfjO9b wxKA== X-Gm-Message-State: AOAM5304BNBOQ3Ga8Pw+nOov6/iwBQIbqa4zrJwk+eGuVxqSLo0tbDmm jgMXzwAy4B4IIPe/p1sDruMqd/DtRMZoXPcB X-Google-Smtp-Source: ABdhPJwrwc1UKUgaOJXs/HI+c7chH+h8K/IuDf80YRZiC8EmvlfVH1BGNUvxzXlvN+6wgi6Y48NpNg== X-Received: by 2002:a05:6602:160b:: with SMTP id x11mr8631308iow.170.1603674307136; Sun, 25 Oct 2020 18:05:07 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:06 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 07/30] patman: Allow linking a series with patchwork Date: Sun, 25 Oct 2020 19:04:19 -0600 Message-Id: <20201026010442.1606893-8-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Add a new Series-links tag to tell patman how to find the series in patchwork. Each item is the series ID optionally preceded by the series version that the link refers to. An empty version indicates this is the latest series. For example: Series-links: 209816 1:203302 Documentation is added in a later patch. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/README | 15 +++++++++++++++ tools/patman/func_test.py | 1 + tools/patman/series.py | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/patman/README b/tools/patman/README index 7ede1068ee1..6664027ed7d 100644 --- a/tools/patman/README +++ b/tools/patman/README @@ -187,6 +187,21 @@ Series-name: name patman does not yet use it, but it is convenient to put the branch name here to help you keep track of multiple upstreaming efforts. +Series-links: [id | version:id]... + Set the ID of the series in patchwork. You can set this after you send + out the series and look in patchwork for the resulting series. The + URL you want is the one for the series itself, not any particular patch. + E.g. for http://patchwork.ozlabs.org/project/uboot/list/?series=187331 + the series ID is 187331. This property can have a list of series IDs, + one for each version of the series, e.g. + + Series-links: 1:187331 2:188434 189372 + + Patman always uses the one without a version, since it assumes this is + the latest one. When this tag is provided, patman can compare your local + branch against patchwork to see what new reviews your series has + collected ('patman status'). + Cover-letter: This is the patch set title blah blah diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index b3c3e5796ad..ea3c84632c0 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -417,6 +417,7 @@ Series for my board This series implements support for my glorious board. END +Series-links: 183237 ''', 'serial.c', '''The code for the serial driver is here''') self.make_commit_with_file('bootm: Make it boot', ''' diff --git a/tools/patman/series.py b/tools/patman/series.py index 9f885c89873..393a44241bd 100644 --- a/tools/patman/series.py +++ b/tools/patman/series.py @@ -16,7 +16,7 @@ from patman import tools # Series-xxx tags that we understand valid_series = ['to', 'cc', 'version', 'changes', 'prefix', 'notes', 'name', - 'cover_cc', 'process_log'] + 'cover_cc', 'process_log', 'links'] class Series(dict): """Holds information about a patch series, including all tags. From patchwork Mon Oct 26 01:04:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387364 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=ECmWksqL; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGrJ13vLz9sTK for ; Mon, 26 Oct 2020 12:06:39 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 89FC8824D6; Mon, 26 Oct 2020 02:05:28 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="ECmWksqL"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 0B543824A9; Mon, 26 Oct 2020 02:05:13 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x129.google.com (mail-il1-x129.google.com [IPv6:2607:f8b0:4864:20::129]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 988EF8248D for ; Mon, 26 Oct 2020 02:05:09 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x129.google.com with SMTP id q1so6752341ilt.6 for ; Sun, 25 Oct 2020 18:05:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CahQFBcWvhtigFEizm0+Q2YgGLjtaFr/+ZdHmNxEMFo=; b=ECmWksqLY2C1tbgAeF9jpI3BMZmecV8ztXlQgo26a7iCGcyoe2SroYMfewSo6HLvGZ JXzI2XVHG5eNHcpVPfqdOekwvzB4Ke94DfJZ/TdbD3Z77OGU1X9BwV7gfTcPKuP9d2iA obKZTTw/0gOyyVEOobc68sBPwFmk5d5xnkxKo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CahQFBcWvhtigFEizm0+Q2YgGLjtaFr/+ZdHmNxEMFo=; b=X0m1R/StnO1zJv8TiCamTCNg65x7iRVDw02TFOV48gcZ9goX8cQRKXUfzBb+UfbBeY kNdX+/I8TZx/VvUbIyRmYuftn79N0Hjpy9gXiyKNOWVhIhzf4JJ9ezh/0OfgXhipPKNe RcJW2JMDaTLYDCDUS6A5ddvMBsd7nGPwP00v+JFT8gUT88x1Po/hcrHbetXHAHSlAEjy VNbfZ04Y/6mhhd6pr2JrpCtcslGZchtSyz4TyOj0uwc7/zlUaDTXUxB6xdFiw+Lx2iyg wxNqvkAX4ue5uiV1Qiou5mFT7zHHc6H7A243/v9YfTUOUwZ3a89/W07Bhb46BWiSzATq uf3g== X-Gm-Message-State: AOAM530eF2uzrgizTpHCFI5Pe/r/8fnjD1aQBT75vouBgReOyVQlQIGV HK1SjUT+DnWNDoJcCAOIIboaCDlvzqx/QhRq X-Google-Smtp-Source: ABdhPJxBOhP4aHQRY4sXcMd34Pi3anjjiKLHyPPZtcNXh6ULmOdRv2bQZcebnHFyfKOGs+tBah8oXQ== X-Received: by 2002:a92:4b07:: with SMTP id m7mr85642ilg.239.1603674308254; Sun, 25 Oct 2020 18:05:08 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:07 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 08/30] patman: Fix indenting in patchstream Date: Sun, 25 Oct 2020 19:04:20 -0600 Message-Id: <20201026010442.1606893-9-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Update the indenting to keep pylint3 happy. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/patchstream.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index ba0a13f6325..5fff74918ab 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -2,6 +2,8 @@ # Copyright (c) 2011 The Chromium OS Authors. # +"""Handles parsing a stream of commits/emails from 'git log' or other source""" + import datetime import math import os @@ -15,8 +17,8 @@ from patman import gitutil from patman.series import Series # Tags that we detect and remove -re_remove = re.compile('^BUG=|^TEST=|^BRANCH=|^Review URL:' - '|Reviewed-on:|Commit-\w*:') +re_remove = re.compile(r'^BUG=|^TEST=|^BRANCH=|^Review URL:' + r'|Reviewed-on:|Commit-\w*:') # Lines which are allowed after a TEST= line re_allowed_after_test = re.compile('^Signed-off-by:') @@ -46,7 +48,7 @@ re_commit = re.compile('^commit ([0-9a-f]*)$') re_space_before_tab = re.compile('^[+].* \t') # Match indented lines for changes -re_leading_whitespace = re.compile('^\s') +re_leading_whitespace = re.compile(r'^\s') # States we can be in - can we use range() and still have comments? STATE_MSG_HEADER = 0 # Still in the message header @@ -149,7 +151,7 @@ class PatchStream: return int(value) except ValueError as str: raise ValueError("%s: Cannot decode version info '%s'" % - (self.commit.hash, line)) + (self.commit.hash, line)) def FinalizeChange(self): """Finalize a (multi-line) change and add it to the series or commit""" @@ -271,7 +273,7 @@ class PatchStream: # If we are not in a section, it is an unexpected END elif line == 'END': - raise ValueError("'END' wihout section") + raise ValueError("'END' wihout section") # Detect the commit subject elif not is_blank and self.state == STATE_PATCH_SUBJECT: @@ -336,8 +338,9 @@ class PatchStream: value = change_id_match.group(1) if self.is_log: if self.commit.change_id: - raise ValueError("%s: Two Change-Ids: '%s' vs. '%s'" % - (self.commit.hash, self.commit.change_id, value)) + raise ValueError( + "%s: Two Change-Ids: '%s' vs. '%s'" % self.commit.hash, + self.commit.change_id, value) self.commit.change_id = value self.skip_blank = True @@ -353,7 +356,7 @@ class PatchStream: self.change_version = self.ParseVersion(value, line) else: self.warn.append('Line %d: Ignoring Commit-%s' % - (self.linenum, name)) + (self.linenum, name)) # Detect the start of a new commit elif commit_match: @@ -376,7 +379,7 @@ class PatchStream: # Suppress duplicate signoffs elif signoff_match: if (self.is_log or not self.commit or - self.commit.CheckDuplicateSignoff(signoff_match.group(1))): + self.commit.CheckDuplicateSignoff(signoff_match.group(1))): out = [line] # Well that means this is an ordinary line @@ -385,7 +388,7 @@ class PatchStream: m = re_space_before_tab.match(line) if m: self.warn.append('Line %d/%d has space before tab' % - (self.linenum, m.start())) + (self.linenum, m.start())) # OK, we have a valid non-blank line out = [line] @@ -418,7 +421,7 @@ class PatchStream: self.CloseCommit() if self.lines_after_test: self.warn.append('Found %d lines after TEST=' % - self.lines_after_test) + self.lines_after_test) def WriteMessageId(self, outfd): """Write the Message-Id into the output. @@ -494,7 +497,7 @@ class PatchStream: else: if self.blank_count and (line == '-- ' or match): self.warn.append("Found possible blank line(s) at " - "end of file '%s'" % last_fname) + "end of file '%s'" % last_fname) outfd.write('+\n' * self.blank_count) outfd.write(line + '\n') self.blank_count = 0 @@ -502,7 +505,7 @@ class PatchStream: def GetMetaDataForList(commit_range, git_dir=None, count=None, - series = None, allow_overwrite=False): + series=None, allow_overwrite=False): """Reads out patch series metadata from the commits This does a 'git log' on the relevant commits and pulls out the tags we From patchwork Mon Oct 26 01:04:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387365 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=Hl7eNRmw; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGrY3RSYz9sTD for ; Mon, 26 Oct 2020 12:06:53 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id AB91D824E0; Mon, 26 Oct 2020 02:05:30 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="Hl7eNRmw"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3DDD582495; Mon, 26 Oct 2020 02:05:15 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x132.google.com (mail-il1-x132.google.com [IPv6:2607:f8b0:4864:20::132]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id A915982495 for ; Mon, 26 Oct 2020 02:05:10 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x132.google.com with SMTP id k1so6746180ilc.10 for ; Sun, 25 Oct 2020 18:05:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=fVmk3rZ9UoenfgvWOjtGS/gyt1lhf6yen/QH8luZYOY=; b=Hl7eNRmwou7/IL8X2SSxKQo3KkUrw9xoDz1GVJCojRdq1RerJmiqFcPrQSAQGkRUGR 3zs5VJEpCcyfL8MAnFbZF3gnGVbv+nAqrJAwOiy/9OWE0Uj/gu2cT79JJPfm4GHsxD7W vNNnC3hzUfVMAVRl0+kxObyc6ja2Jx93muPXg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=fVmk3rZ9UoenfgvWOjtGS/gyt1lhf6yen/QH8luZYOY=; b=DtdAE7mV4nnHFeScgn8hnwJl5un0rNqNAaaGZD4FSLsz8XvMqw4CiYRBMLzTFePRDq 9lcLPPnBcJZ1qeUdVqio6Mc5yJ0SDZ3wdbyFo7Fg9iJ90SR3zYSL20qGVbcDX4QxMPRX ZJKDUkBEYAhUyXM1VIlM29pOSJvB6cgydK1L37pbb3vuIsvObCGwowTjs/DW5ZfcmBeP lM7b7lnzo1P2lSLl0Ytv/zlJ4JVsqnSn4UhvbKCLKcSUE01p8aAgfRp38xVrAkTzLu6A dAPMI5iKh1O3StBuIPXBOIVo/vjqzup1veIAagzMtY8YbU/fOMz3BqarlDivpsMLah8H 5BmQ== X-Gm-Message-State: AOAM533iyU2kfFLZQhIdW3/KXJkvOSbOHD10D3pKPMEIkXoL2qR8LIbh hIck8bDnzOCR9rJRkMsAiAp2p2jIGff86RPv X-Google-Smtp-Source: ABdhPJzz+Xyr6oK+CmVMZjyRSKKXL4jdqNzE6ZgngNVldcJLJCN6YekcDDzUTs2EqU6Jq+2l6n/T+g== X-Received: by 2002:a92:c0cc:: with SMTP id t12mr4118461ilf.227.1603674309296; Sun, 25 Oct 2020 18:05:09 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:08 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 09/30] patman: Fix constant style in patchstream Date: Sun, 25 Oct 2020 19:04:21 -0600 Message-Id: <20201026010442.1606893-10-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean These constants should use upper case. Update them to keep pylint3 happy. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/patchstream.py | 44 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 5fff74918ab..86b03a7a30b 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -17,38 +17,38 @@ from patman import gitutil from patman.series import Series # Tags that we detect and remove -re_remove = re.compile(r'^BUG=|^TEST=|^BRANCH=|^Review URL:' +RE_REMOVE = re.compile(r'^BUG=|^TEST=|^BRANCH=|^Review URL:' r'|Reviewed-on:|Commit-\w*:') # Lines which are allowed after a TEST= line -re_allowed_after_test = re.compile('^Signed-off-by:') +RE_ALLOWED_AFTER_TEST = re.compile('^Signed-off-by:') # Signoffs -re_signoff = re.compile('^Signed-off-by: *(.*)') +RE_SIGNOFF = re.compile('^Signed-off-by: *(.*)') # Cover letter tag -re_cover = re.compile('^Cover-([a-z-]*): *(.*)') +RE_COVER = re.compile('^Cover-([a-z-]*): *(.*)') # Patch series tag -re_series_tag = re.compile('^Series-([a-z-]*): *(.*)') +RE_SERIES_TAG = re.compile('^Series-([a-z-]*): *(.*)') # Change-Id will be used to generate the Message-Id and then be stripped -re_change_id = re.compile('^Change-Id: *(.*)') +RE_CHANGE_ID = re.compile('^Change-Id: *(.*)') # Commit series tag -re_commit_tag = re.compile('^Commit-([a-z-]*): *(.*)') +RE_COMMIT_TAG = re.compile('^Commit-([a-z-]*): *(.*)') # Commit tags that we want to collect and keep -re_tag = re.compile('^(Tested-by|Acked-by|Reviewed-by|Patch-cc|Fixes): (.*)') +RE_TAG = re.compile('^(Tested-by|Acked-by|Reviewed-by|Patch-cc|Fixes): (.*)') # The start of a new commit in the git log -re_commit = re.compile('^commit ([0-9a-f]*)$') +RE_COMMIT = re.compile('^commit ([0-9a-f]*)$') # We detect these since checkpatch doesn't always do it -re_space_before_tab = re.compile('^[+].* \t') +RE_SPACE_BEFORE_TAB = re.compile('^[+].* \t') # Match indented lines for changes -re_leading_whitespace = re.compile(r'^\s') +RE_LEADING_WHITESPACE = re.compile(r'^\s') # States we can be in - can we use range() and still have comments? STATE_MSG_HEADER = 0 # Still in the message header @@ -195,22 +195,22 @@ class PatchStream: out = [] line = line.rstrip('\n') - commit_match = re_commit.match(line) if self.is_log else None + commit_match = RE_COMMIT.match(line) if self.is_log else None if self.is_log: if line[:4] == ' ': line = line[4:] # Handle state transition and skipping blank lines - series_tag_match = re_series_tag.match(line) - change_id_match = re_change_id.match(line) - commit_tag_match = re_commit_tag.match(line) - cover_match = re_cover.match(line) - signoff_match = re_signoff.match(line) - leading_whitespace_match = re_leading_whitespace.match(line) + series_tag_match = RE_SERIES_TAG.match(line) + change_id_match = RE_CHANGE_ID.match(line) + commit_tag_match = RE_COMMIT_TAG.match(line) + cover_match = RE_COVER.match(line) + signoff_match = RE_SIGNOFF.match(line) + leading_whitespace_match = RE_LEADING_WHITESPACE.match(line) tag_match = None if self.state == STATE_PATCH_HEADER: - tag_match = re_tag.match(line) + tag_match = RE_TAG.match(line) is_blank = not line.strip() if is_blank: if (self.state == STATE_MSG_HEADER @@ -280,7 +280,7 @@ class PatchStream: self.commit.subject = line # Detect the tags we want to remove, and skip blank lines - elif re_remove.match(line) and not commit_tag_match: + elif RE_REMOVE.match(line) and not commit_tag_match: self.skip_blank = True # TEST= should be the last thing in the commit, so remove @@ -385,7 +385,7 @@ class PatchStream: # Well that means this is an ordinary line else: # Look for space before tab - m = re_space_before_tab.match(line) + m = RE_SPACE_BEFORE_TAB.match(line) if m: self.warn.append('Line %d/%d has space before tab' % (self.linenum, m.start())) @@ -410,7 +410,7 @@ class PatchStream: out += self.commit.notes out += [''] + log elif self.found_test: - if not re_allowed_after_test.match(line): + if not RE_ALLOWED_AFTER_TEST.match(line): self.lines_after_test += 1 return out From patchwork Mon Oct 26 01:04:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387369 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=PqX69Z3i; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGsJ0bKpz9sT6 for ; Mon, 26 Oct 2020 12:07:31 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id BFDEE82508; Mon, 26 Oct 2020 02:05:34 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="PqX69Z3i"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id D5A9D824BC; Mon, 26 Oct 2020 02:05:16 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x143.google.com (mail-il1-x143.google.com [IPv6:2607:f8b0:4864:20::143]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id D90B6824B3 for ; Mon, 26 Oct 2020 02:05:11 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x143.google.com with SMTP id k1so6746202ilc.10 for ; Sun, 25 Oct 2020 18:05:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HljIH3UOCNJDAOxCiINrhPtNVmDfyLML2Y/SzKac8z0=; b=PqX69Z3iFDvleQ6emw+ARL0ZxPhaMz628qiYMbIlzOOyXcC5mfIsE+OgsWJq4EZB6Q juRX6ffPrh/SEV+Nvp5qoFPQmop4JJf5imdGYWZXW+cxfMuv3zrwKDuDCIVjxvgscWDB MjRsadlXiJ5gzFgghtPXMtp/YToIWTEUZ2oz4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HljIH3UOCNJDAOxCiINrhPtNVmDfyLML2Y/SzKac8z0=; b=TDYQ40ezM1IXDT0joCKUmcD5WqvwA9KZ4Xnr0eKtgU4FFGROsj/rcQ+0clO+znUezs CxtiOSJiIDCfvJMopmeXnavlcHUSr2WadIIUpLqLHV0zafug77GpAtFOH/LybMiW1QQ2 yqo8psQTQEYFV7kfToKSKE+eMk4VRmP/0EzYrG4t8V6tXxprrrml2kKf9kyUqIAo+X9c 4EDzp8OqkHD/lcY+eiNT3Bhnn2sIgbQTMK/f1CYFNNlGcKyBCMxwDDRUTSol0AL10JLc LVCuAJCwkQQPDH0NUCW8wLNM6ggBukWxbyjoGpiy02TXcN7oLyblQsojJPGIVZaCP0JV 7gwg== X-Gm-Message-State: AOAM5334mD++QyhovFPNWKKwPx0bBKDr+mWAGDqFUFtHhlH9gDUifjhz iAt/OYKzCztzfbnLKpqyGu1pp0Ul9mE8I68A X-Google-Smtp-Source: ABdhPJwxz+JZZ1G+76eT+8K451cZvFJXnUsCSTfp8rlvmYpW6IzXNJmjPLDi07AcwpfdA2unY6dtiQ== X-Received: by 2002:a92:d104:: with SMTP id a4mr9745143ilb.231.1603674310363; Sun, 25 Oct 2020 18:05:10 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:09 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 10/30] patman: Rename functions in patchstream Date: Sun, 25 Oct 2020 19:04:22 -0600 Message-Id: <20201026010442.1606893-11-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Rename these functions to lower case as per PEP8. Signed-off-by: Simon Glass --- (no changes since v1) tools/buildman/control.py | 6 +-- tools/patman/control.py | 6 +-- tools/patman/func_test.py | 6 +-- tools/patman/patchstream.py | 88 ++++++++++++++++----------------- tools/patman/test_checkpatch.py | 6 +-- 5 files changed, 56 insertions(+), 56 deletions(-) diff --git a/tools/buildman/control.py b/tools/buildman/control.py index b81ecf6a539..fe874b8165b 100644 --- a/tools/buildman/control.py +++ b/tools/buildman/control.py @@ -276,14 +276,14 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None, options.branch) upstream_commit = gitutil.GetUpstream(options.git_dir, options.branch) - series = patchstream.GetMetaDataForList(upstream_commit, + series = patchstream.get_metadata_for_list(upstream_commit, options.git_dir, 1, series=None, allow_overwrite=True) - series = patchstream.GetMetaDataForList(range_expr, + series = patchstream.get_metadata_for_list(range_expr, options.git_dir, None, series, allow_overwrite=True) else: # Honour the count - series = patchstream.GetMetaDataForList(options.branch, + series = patchstream.get_metadata_for_list(options.branch, options.git_dir, count, series=None, allow_overwrite=True) else: series = None diff --git a/tools/patman/control.py b/tools/patman/control.py index aea9df8c8d1..6555a4018a4 100644 --- a/tools/patman/control.py +++ b/tools/patman/control.py @@ -54,14 +54,14 @@ def prepare_patches(col, branch, count, start, end, ignore_binary): # Read the metadata from the commits to_do = count - end - series = patchstream.GetMetaData(branch, start, to_do) + series = patchstream.get_metadata(branch, start, to_do) cover_fname, patch_files = gitutil.CreatePatches( branch, start, to_do, ignore_binary, series) # Fix up the patch files to our liking, and insert the cover letter - patchstream.FixPatches(series, patch_files) + patchstream.fix_patches(series, patch_files) if cover_fname and series.get('cover'): - patchstream.InsertCoverLetter(cover_fname, series, to_do) + patchstream.insert_cover_letter(cover_fname, series, to_do) return series, cover_fname, patch_files def check_patches(series, patch_files, run_checkpatch, verbose): diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index ea3c84632c0..bdeccafda0b 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -191,12 +191,12 @@ class TestFunctional(unittest.TestCase): } text = self._get_text('test01.txt') - series = patchstream.GetMetaDataForTest(text) + series = patchstream.get_metadata_for_test(text) cover_fname, args = self._create_patches_for_test(series) with capture_sys_output() as out: - patchstream.FixPatches(series, args) + patchstream.fix_patches(series, args) if cover_fname and series.get('cover'): - patchstream.InsertCoverLetter(cover_fname, series, count) + patchstream.insert_cover_letter(cover_fname, series, count) series.DoChecks() cc_file = series.MakeCcFile(process_tags, cover_fname, not ignore_bad_tags, add_maintainers, diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 86b03a7a30b..5487799bbee 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -83,7 +83,7 @@ class PatchStream: self.signoff = [] # Contents of signoff line self.commit = None # Current commit - def AddToSeries(self, line, name, value): + def _add_to_series(self, line, name, value): """Add a new Series-xxx tag. When a Series-xxx tag is detected, we come here to record it, if we @@ -100,7 +100,7 @@ class PatchStream: if self.is_log: self.series.AddTag(self.commit, line, name, value) - def AddToCommit(self, line, name, value): + def _add_to_commit(self, line, name, value): """Add a new Commit-xxx tag. When a Commit-xxx tag is detected, we come here to record it. @@ -114,7 +114,7 @@ class PatchStream: self.in_section = 'commit-' + name self.skip_blank = False - def AddCommitRtag(self, rtag_type, who): + def _add_commit_rtag(self, rtag_type, who): """Add a response tag to the current commit Args: @@ -123,7 +123,7 @@ class PatchStream: """ self.commit.AddRtag(rtag_type, who) - def CloseCommit(self): + def _close_commit(self): """Save the current commit into our commit list, and reset our state""" if self.commit and self.is_log: self.series.AddCommit(self.commit) @@ -137,7 +137,7 @@ class PatchStream: self.skip_blank = True self.section = [] - def ParseVersion(self, value, line): + def _parse_version(self, value, line): """Parse a version from a *-changes tag Args: @@ -153,8 +153,8 @@ class PatchStream: raise ValueError("%s: Cannot decode version info '%s'" % (self.commit.hash, line)) - def FinalizeChange(self): - """Finalize a (multi-line) change and add it to the series or commit""" + def _finalise_change(self): + """_finalise a (multi-line) change and add it to the series or commit""" if not self.change_lines: return change = '\n'.join(self.change_lines) @@ -167,7 +167,7 @@ class PatchStream: self.commit.AddChange(self.change_version, change) self.change_lines = [] - def ProcessLine(self, line): + def process_line(self, line): """Process a single line of a patch file or commit log This process a line and returns a list of lines to output. The list @@ -248,7 +248,7 @@ class PatchStream: # is missing, fix it up. if self.in_change: self.warn.append("Missing 'blank line' in section '%s-changes'" % self.in_change) - self.FinalizeChange() + self._finalise_change() self.in_change = None self.change_version = 0 @@ -298,26 +298,26 @@ class PatchStream: self.in_section = 'cover' self.skip_blank = False elif name == 'letter-cc': - self.AddToSeries(line, 'cover-cc', value) + self._add_to_series(line, 'cover-cc', value) elif name == 'changes': self.in_change = 'Cover' - self.change_version = self.ParseVersion(value, line) + self.change_version = self._parse_version(value, line) # If we are in a change list, key collected lines until a blank one elif self.in_change: if is_blank: # Blank line ends this change list - self.FinalizeChange() + self._finalise_change() self.in_change = None self.change_version = 0 elif line == '---': - self.FinalizeChange() + self._finalise_change() self.in_change = None self.change_version = 0 - out = self.ProcessLine(line) + out = self.process_line(line) elif self.is_log: if not leading_whitespace_match: - self.FinalizeChange() + self._finalise_change() self.change_lines.append(line) self.skip_blank = False @@ -328,9 +328,9 @@ class PatchStream: if name == 'changes': # value is the version number: e.g. 1, or 2 self.in_change = 'Series' - self.change_version = self.ParseVersion(value, line) + self.change_version = self._parse_version(value, line) else: - self.AddToSeries(line, name, value) + self._add_to_series(line, name, value) self.skip_blank = True # Detect Change-Id tags @@ -349,24 +349,24 @@ class PatchStream: name = commit_tag_match.group(1) value = commit_tag_match.group(2) if name == 'notes': - self.AddToCommit(line, name, value) + self._add_to_commit(line, name, value) self.skip_blank = True elif name == 'changes': self.in_change = 'Commit' - self.change_version = self.ParseVersion(value, line) + self.change_version = self._parse_version(value, line) else: self.warn.append('Line %d: Ignoring Commit-%s' % (self.linenum, name)) # Detect the start of a new commit elif commit_match: - self.CloseCommit() + self._close_commit() self.commit = commit.Commit(commit_match.group(1)) # Detect tags in the commit message elif tag_match: rtag_type, who = tag_match.groups() - self.AddCommitRtag(rtag_type, who) + self._add_commit_rtag(rtag_type, who) # Remove Tested-by self, since few will take much notice if (rtag_type == 'Tested-by' and who.find(os.getenv('USER') + '@') != -1): @@ -415,15 +415,15 @@ class PatchStream: return out - def Finalize(self): + def finalise(self): """Close out processing of this patch stream""" - self.FinalizeChange() - self.CloseCommit() + self._finalise_change() + self._close_commit() if self.lines_after_test: self.warn.append('Found %d lines after TEST=' % self.lines_after_test) - def WriteMessageId(self, outfd): + def _write_message_id(self, outfd): """Write the Message-Id into the output. This is based on the Change-Id in the original patch, the version, @@ -464,7 +464,7 @@ class PatchStream: # Join parts together with "." and write it out. outfd.write('Message-Id: <%s@changeid>\n' % '.'.join(parts)) - def ProcessStream(self, infd, outfd): + def process_stream(self, infd, outfd): """Copy a stream from infd to outfd, filtering out unwanting things. This is used to process patch files one at a time. @@ -478,13 +478,13 @@ class PatchStream: last_fname = None re_fname = re.compile('diff --git a/(.*) b/.*') - self.WriteMessageId(outfd) + self._write_message_id(outfd) while True: line = infd.readline() if not line: break - out = self.ProcessLine(line) + out = self.process_line(line) # Try to detect blank lines at EOF for line in out: @@ -501,11 +501,11 @@ class PatchStream: outfd.write('+\n' * self.blank_count) outfd.write(line + '\n') self.blank_count = 0 - self.Finalize() + self.finalise() -def GetMetaDataForList(commit_range, git_dir=None, count=None, - series=None, allow_overwrite=False): +def get_metadata_for_list(commit_range, git_dir=None, count=None, + series=None, allow_overwrite=False): """Reads out patch series metadata from the commits This does a 'git log' on the relevant commits and pulls out the tags we @@ -529,11 +529,11 @@ def GetMetaDataForList(commit_range, git_dir=None, count=None, stdout = command.RunPipe([params], capture=True).stdout ps = PatchStream(series, is_log=True) for line in stdout.splitlines(): - ps.ProcessLine(line) - ps.Finalize() + ps.process_line(line) + ps.finalise() return series -def GetMetaData(branch, start, count): +def get_metadata(branch, start, count): """Reads out patch series metadata from the commits This does a 'git log' on the relevant commits and pulls out the tags we @@ -544,10 +544,10 @@ def GetMetaData(branch, start, count): start: Commit to start from: 0=branch HEAD, 1=next one, etc. count: Number of commits to list """ - return GetMetaDataForList('%s~%d' % (branch if branch else 'HEAD', start), - None, count) + return get_metadata_for_list( + '%s~%d' % (branch if branch else 'HEAD', start), None, count) -def GetMetaDataForTest(text): +def get_metadata_for_test(text): """Process metadata from a file containing a git log. Used for tests Args: @@ -556,11 +556,11 @@ def GetMetaDataForTest(text): series = Series() ps = PatchStream(series, is_log=True) for line in text.splitlines(): - ps.ProcessLine(line) - ps.Finalize() + ps.process_line(line) + ps.finalise() return series -def FixPatch(backup_dir, fname, series, commit): +def fix_patch(backup_dir, fname, series, commit): """Fix up a patch file, by adding/removing as required. We remove our tags from the patch file, insert changes lists, etc. @@ -580,7 +580,7 @@ def FixPatch(backup_dir, fname, series, commit): infd = open(fname, 'r', encoding='utf-8') ps = PatchStream(series) ps.commit = commit - ps.ProcessStream(infd, outfd) + ps.process_stream(infd, outfd) infd.close() outfd.close() @@ -590,7 +590,7 @@ def FixPatch(backup_dir, fname, series, commit): shutil.move(tmpname, fname) return ps.warn -def FixPatches(series, fnames): +def fix_patches(series, fnames): """Fix up a list of patches identified by filenames The patch files are processed in place, and overwritten. @@ -606,7 +606,7 @@ def FixPatches(series, fnames): commit = series.commits[count] commit.patch = fname commit.count = count - result = FixPatch(backup_dir, fname, series, commit) + result = fix_patch(backup_dir, fname, series, commit) if result: print('%d warnings for %s:' % (len(result), fname)) for warn in result: @@ -615,7 +615,7 @@ def FixPatches(series, fnames): count += 1 print('Cleaned %d patches' % count) -def InsertCoverLetter(fname, series, count): +def insert_cover_letter(fname, series, count): """Inserts a cover letter with the required info into patch 0 Args: diff --git a/tools/patman/test_checkpatch.py b/tools/patman/test_checkpatch.py index f71c70fb13a..1f7c38c4e90 100644 --- a/tools/patman/test_checkpatch.py +++ b/tools/patman/test_checkpatch.py @@ -148,15 +148,15 @@ Signed-off-by: Simon Glass expfd.write(expected) expfd.close() - # Normally by the time we call FixPatch we've already collected + # Normally by the time we call fix_patch we've already collected # metadata. Here, we haven't, but at least fake up something. - # Set the "count" to -1 which tells FixPatch to use a bogus/fixed + # Set the "count" to -1 which tells fix_patch to use a bogus/fixed # time for generating the Message-Id. com = commit.Commit('') com.change_id = 'I80fe1d0c0b7dd10aa58ce5bb1d9290b6664d5413' com.count = -1 - patchstream.FixPatch(None, inname, series.Series(), com) + patchstream.fix_patch(None, inname, series.Series(), com) rc = os.system('diff -u %s %s' % (inname, expname)) self.assertEqual(rc, 0) From patchwork Mon Oct 26 01:04:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387366 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=E/BTdJxr; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGrq1TJVz9sTD for ; Mon, 26 Oct 2020 12:07:06 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id C2FB6824EF; Mon, 26 Oct 2020 02:05:32 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="E/BTdJxr"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 220CC824BB; Mon, 26 Oct 2020 02:05:16 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd43.google.com (mail-io1-xd43.google.com [IPv6:2607:f8b0:4864:20::d43]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 913EE824AE for ; Mon, 26 Oct 2020 02:05:12 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd43.google.com with SMTP id q25so8343214ioh.4 for ; Sun, 25 Oct 2020 18:05:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7j7xAVjDEf20+UR70X+XI6nZn5zlQxEfmVv02WXqnUQ=; b=E/BTdJxr368yXjMvJHRUAp+OIkie5aJv2KqeEYDmRhzt02oDwOlz0j+4x/xOzNi9kI wod+sEsypBXeyeem6UJArsP/dfN4Qkn5pYwVHS+bgbDJkbvEv+8TgaWo9yudZz8JUXR8 WN1pHi2TmtiyyiMkol/WOQaOMO1LTHBo1+T08= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7j7xAVjDEf20+UR70X+XI6nZn5zlQxEfmVv02WXqnUQ=; b=p8yfyVDkD/xf6YumYzCYuy1A55hBIH1Ji/aKwPh87rgLE7gTIVQFB6nMgpBKjeCm0F lbSB8jogPcj3oUJCa8ICexX6lDCZKIM8A3xYDikCKraKX1Z6NPyoRi2XZR+D0lahUKxj 1pCqUzC8vgi5Wmn9p4e26vYubjwTGVwu7hBirh2TBb+X6HwoR8WjH69lTqUjHE4fAiIT llYWEhAGo99eODfWafvMljeKIuyGC9tmpXKaL6yRo/b2HMNulr+Vf6tY/GNWHvg9lULU igiRRdFg3TsLD2ApXVQAagH2tzRWBlujjKbqot1SPqIdMvYKMfm0gdB5NRIk2OKOKt1R 2PJw== X-Gm-Message-State: AOAM532nTKlhVLgFNDbnb8lVTaExWMoO7gHy5Ytu4DbMoiemCgarBD/7 MFq4zNLHfyyONyEjoeR703bzPvbYtKFqcGp3 X-Google-Smtp-Source: ABdhPJz6n+tvnYN2gMXVCOV7RsxjMNzQSULw3CwNrWzSZ8XokWTOeV86rPP1OVqr2ZWZEwgqfP3MDQ== X-Received: by 2002:a5e:de01:: with SMTP id e1mr8862859iok.17.1603674311273; Sun, 25 Oct 2020 18:05:11 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:10 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 11/30] patman: Rename variables in patchstream Date: Sun, 25 Oct 2020 19:04:23 -0600 Message-Id: <20201026010442.1606893-12-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Some variables are too short or shadow other variables or types. Fix these to keep pylint3 happy. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/patchstream.py | 52 ++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 5487799bbee..3a057fbd6c4 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -149,7 +149,7 @@ class PatchStream: """ try: return int(value) - except ValueError as str: + except ValueError: raise ValueError("%s: Cannot decode version info '%s'" % (self.commit.hash, line)) @@ -385,10 +385,10 @@ class PatchStream: # Well that means this is an ordinary line else: # Look for space before tab - m = RE_SPACE_BEFORE_TAB.match(line) - if m: + mat = RE_SPACE_BEFORE_TAB.match(line) + if mat: self.warn.append('Line %d/%d has space before tab' % - (self.linenum, m.start())) + (self.linenum, mat.start())) # OK, we have a valid non-blank line out = [line] @@ -527,10 +527,10 @@ def get_metadata_for_list(commit_range, git_dir=None, count=None, params = gitutil.LogCmd(commit_range, reverse=True, count=count, git_dir=git_dir) stdout = command.RunPipe([params], capture=True).stdout - ps = PatchStream(series, is_log=True) + pst = PatchStream(series, is_log=True) for line in stdout.splitlines(): - ps.process_line(line) - ps.finalise() + pst.process_line(line) + pst.finalise() return series def get_metadata(branch, start, count): @@ -554,13 +554,13 @@ def get_metadata_for_test(text): text: """ series = Series() - ps = PatchStream(series, is_log=True) + pst = PatchStream(series, is_log=True) for line in text.splitlines(): - ps.process_line(line) - ps.finalise() + pst.process_line(line) + pst.finalise() return series -def fix_patch(backup_dir, fname, series, commit): +def fix_patch(backup_dir, fname, series, cmt): """Fix up a patch file, by adding/removing as required. We remove our tags from the patch file, insert changes lists, etc. @@ -571,16 +571,16 @@ def fix_patch(backup_dir, fname, series, commit): Args: fname: Filename to patch file to process series: Series information about this patch set - commit: Commit object for this patch file + cmt: Commit object for this patch file Return: A list of errors, or [] if all ok. """ handle, tmpname = tempfile.mkstemp() outfd = os.fdopen(handle, 'w', encoding='utf-8') infd = open(fname, 'r', encoding='utf-8') - ps = PatchStream(series) - ps.commit = commit - ps.process_stream(infd, outfd) + pst = PatchStream(series) + pst.commit = cmt + pst.process_stream(infd, outfd) infd.close() outfd.close() @@ -588,7 +588,7 @@ def fix_patch(backup_dir, fname, series, commit): if backup_dir: shutil.copy(fname, os.path.join(backup_dir, os.path.basename(fname))) shutil.move(tmpname, fname) - return ps.warn + return pst.warn def fix_patches(series, fnames): """Fix up a list of patches identified by filenames @@ -603,10 +603,10 @@ def fix_patches(series, fnames): backup_dir = None #tempfile.mkdtemp('clean-patch') count = 0 for fname in fnames: - commit = series.commits[count] - commit.patch = fname - commit.count = count - result = fix_patch(backup_dir, fname, series, commit) + cmt = series.commits[count] + cmt.patch = fname + cmt.count = count + result = fix_patch(backup_dir, fname, series, cmt) if result: print('%d warnings for %s:' % (len(result), fname)) for warn in result: @@ -623,11 +623,11 @@ def insert_cover_letter(fname, series, count): series: Series object count: Number of patches in the series """ - fd = open(fname, 'r') - lines = fd.readlines() - fd.close() + fil = open(fname, 'r') + lines = fil.readlines() + fil.close() - fd = open(fname, 'w') + fil = open(fname, 'w') text = series.cover prefix = series.GetPatchPrefix() for line in lines: @@ -647,5 +647,5 @@ def insert_cover_letter(fname, series, count): # Now the change list out = series.MakeChangeLog(None) line += '\n' + '\n'.join(out) - fd.write(line) - fd.close() + fil.write(line) + fil.close() From patchwork Mon Oct 26 01:04:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387368 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=H13O3YsT; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGs5094vz9sT6 for ; Mon, 26 Oct 2020 12:07:20 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id ED394824FC; Mon, 26 Oct 2020 02:05:33 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="H13O3YsT"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 535B7824BE; Mon, 26 Oct 2020 02:05:16 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x135.google.com (mail-il1-x135.google.com [IPv6:2607:f8b0:4864:20::135]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 581758249C for ; Mon, 26 Oct 2020 02:05:13 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x135.google.com with SMTP id k1so6746231ilc.10 for ; Sun, 25 Oct 2020 18:05:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WeV91A6Cp1AkvoZ5fy/uQbq7BnTNlUD9LPspa8PU/3U=; b=H13O3YsTJnAjk4JrDjeoaOrSvyYPHaGyRYtvEN+5H4fTV20VYKR9h9McvPfro2pKO/ 1rO6zs04EGWCr3XJtsSZlfB1ieUfXLEvLkShBenQxI2qKo2yBjvBctxM0gCrqOyvZX4p Cqn7VbBD17uvv5DnAn+DQ05LsI9uVXSFp8oXc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WeV91A6Cp1AkvoZ5fy/uQbq7BnTNlUD9LPspa8PU/3U=; b=ZN7AttAIi97ACBl+5bRy4J6nNab+e7EZgiZuyP+l1tulv+X9j1C/tEQdPmt0SZrkeQ 6DuzXZkYkTs4PusquzRNWPLUEK2eGZpcbAQzKPHSU8HmAYWverMgEm9aB/Sj8wwTfY2j L5NIjxdLGEcoQ7sDQgUT9NDUbFiasn5w2tj16u9ea/jW605/ldS/o8wXqZr9nEITKNjH CHIckrGUByyTVgkWK87vKQHUwJjh2mI/h3oC6Hu/FlS3SrNZQgBLE5ZboeIwjItd2LwI 5OsqemNm6dqz0/ONCVbp3IqN8gWimxqGUa8EFWVCsMRasUjPeAC9xpjjUkH7vypLdwHA boLA== X-Gm-Message-State: AOAM532TY3il3LNbawrxWc6kJilVLpsv8boe556jAuZhnoDUawIuOaPO BpdZgkMuOYTX3JK3vOB7gO7rFsmgZmivQFhd X-Google-Smtp-Source: ABdhPJzzK6SsYWEa9QNOtjA2nwFA860w2uDRmCtc0zsPWkxRMAQIkZ/EFuWwKsripwmq3aAPvfjLcQ== X-Received: by 2002:a92:ba56:: with SMTP id o83mr9682105ili.19.1603674312123; Sun, 25 Oct 2020 18:05:12 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:11 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 12/30] patman: Drop unused args in patchstream Date: Sun, 25 Oct 2020 19:04:24 -0600 Message-Id: <20201026010442.1606893-13-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Drop a few arguments that are not used in functions. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/patchstream.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 3a057fbd6c4..c5402dd896a 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -64,7 +64,7 @@ class PatchStream: unwanted tags or inject additional ones. These correspond to the two phases of processing. """ - def __init__(self, series, name=None, is_log=False): + def __init__(self, series, is_log=False): self.skip_blank = False # True to skip a single blank line self.found_test = False # Found a TEST= line self.lines_after_test = 0 # Number of lines found after TEST= @@ -100,15 +100,13 @@ class PatchStream: if self.is_log: self.series.AddTag(self.commit, line, name, value) - def _add_to_commit(self, line, name, value): + def _add_to_commit(self, name): """Add a new Commit-xxx tag. When a Commit-xxx tag is detected, we come here to record it. Args: - line: Source line containing tag (useful for debug/error messages) name: Tag name (part after 'Commit-') - value: Tag value (part after 'Commit-xxx: ') """ if name == 'notes': self.in_section = 'commit-' + name @@ -349,7 +347,7 @@ class PatchStream: name = commit_tag_match.group(1) value = commit_tag_match.group(2) if name == 'notes': - self._add_to_commit(line, name, value) + self._add_to_commit(name) self.skip_blank = True elif name == 'changes': self.in_change = 'Commit' From patchwork Mon Oct 26 01:04:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387370 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=MHBQxUcl; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGsX203Zz9sTD for ; Mon, 26 Oct 2020 12:07:44 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 16A75824E8; Mon, 26 Oct 2020 02:05:36 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="MHBQxUcl"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 08F85824B3; Mon, 26 Oct 2020 02:05:18 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x144.google.com (mail-il1-x144.google.com [IPv6:2607:f8b0:4864:20::144]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 51B90824B8 for ; Mon, 26 Oct 2020 02:05:14 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x144.google.com with SMTP id p10so6768889ile.3 for ; Sun, 25 Oct 2020 18:05:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4wtVyWB0aS8m5Qz89DszPAsyDTsdJgI8XHqUlroVyhw=; b=MHBQxUcllgCCJNZayFUgev9XKgDroARq5CyTHnR7+ALTUmjAxcqG/QB3nCAPs49iF7 S1clL+wkcf8jM56giVP1W3N98ZauNnPBVMfoAeb3sHwwFRQYBtHIVgHezVmawmDDBQuE zMUMETJNVzzJZJOLTLsZnxwtrLPIcTiKvdQSs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4wtVyWB0aS8m5Qz89DszPAsyDTsdJgI8XHqUlroVyhw=; b=fnJ8mfImC/2LgLO2hmnNU1LY1Usfv1jiaeHC64Mx7CQQgowTHx6YB89z1kT6vgspDG +dvT+LFARtb4O8/K/6wngwfSP5a2jHFp/hdFISimAGAHo5NmhMkcn7JIkV9V8vvsojn0 NxMZWVsNA1GVMQmuM+r8Z5yPkvC9PpZcvDw8snPaXOsYADcAUwKFqWb7GzMod8t+kIRP Yi5vRmyIgC12qcka3uerrbrWqXLZsmPZ1TF1whvCXK6OleIqLQDJbaTyKvgTJVgPzuqx m6jXKKM2+KquHkXMeiVOXmA47bqHzybU4o7X7BY6shv6LHgzomEZH028uktcUrzJKKWO eyEQ== X-Gm-Message-State: AOAM530zMwi8ZoWX/O0HezUKxZou8gy6PvWmnWSN79wyjKrxL4m3E8yC p4wNnjRe8oRYlkkq6kV++qNXRqO/tZebUWQX X-Google-Smtp-Source: ABdhPJyvn4CpC6F+eI9adqatlyQ3+22Dg54Wh31XGP7SDr+x3l0CUWP/ZXs64csiV1B4jI1vdbyGAw== X-Received: by 2002:a05:6e02:ee5:: with SMTP id j5mr4288722ilk.152.1603674312917; Sun, 25 Oct 2020 18:05:12 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:12 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 13/30] patman: Fix up argument/return docs in patchstream Date: Sun, 25 Oct 2020 19:04:25 -0600 Message-Id: <20201026010442.1606893-14-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Add missing documentation and type information. Fix up some missing docs on exceptions also. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/patchstream.py | 82 ++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 32 deletions(-) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index c5402dd896a..b2cb2debeee 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -90,9 +90,10 @@ class PatchStream: are scanning a 'git log'. Args: - line: Source line containing tag (useful for debug/error messages) - name: Tag name (part after 'Series-') - value: Tag value (part after 'Series-xxx: ') + line (str): Source line containing tag (useful for debug/error + messages) + name (str): Tag name (part after 'Series-') + value (str): Tag value (part after 'Series-xxx: ') """ if name == 'notes': self.in_section = name @@ -106,7 +107,7 @@ class PatchStream: When a Commit-xxx tag is detected, we come here to record it. Args: - name: Tag name (part after 'Commit-') + name (str): Tag name (part after 'Commit-') """ if name == 'notes': self.in_section = 'commit-' + name @@ -116,8 +117,9 @@ class PatchStream: """Add a response tag to the current commit Args: - key: rtag type (e.g. 'Reviewed-by') - who: Person who gave that rtag, e.g. 'Fred Bloggs ' + rtag_type (str): rtag type (e.g. 'Reviewed-by') + who (str): Person who gave that rtag, e.g. + 'Fred Bloggs ' """ self.commit.AddRtag(rtag_type, who) @@ -139,11 +141,14 @@ class PatchStream: """Parse a version from a *-changes tag Args: - value: Tag value (part after 'xxx-changes: ' - line: Source line containing tag + value (str): Tag value (part after 'xxx-changes: ' + line (str): Source line containing tag Returns: - The version as an integer + int: The version as an integer + + Raises: + ValueError: the value cannot be converted """ try: return int(value) @@ -184,10 +189,14 @@ class PatchStream: don't want, and add things we think are required. Args: - line: text line to process + line (str): text line to process Returns: - list of output lines, or [] if nothing should be output + list: list of output lines, or [] if nothing should be output + + Raises: + ValueError: a fatal error occurred while parsing, e.g. an END + without a starting tag, or two commits with two change IDs """ # Initially we have no output. Prepare the input line string out = [] @@ -428,7 +437,7 @@ class PatchStream: and the prefix. Args: - outfd: Output stream file object + outfd (io.IOBase): Output stream file object """ if not self.commit.change_id: return @@ -468,8 +477,8 @@ class PatchStream: This is used to process patch files one at a time. Args: - infd: Input stream file object - outfd: Output stream file object + infd (io.IOBase): Input stream file object + outfd (io.IOBase): Output stream file object """ # Extract the filename from each diff, for nice warnings fname = None @@ -510,14 +519,15 @@ def get_metadata_for_list(commit_range, git_dir=None, count=None, are interested in. Args: - commit_range: Range of commits to count (e.g. 'HEAD..base') - git_dir: Path to git repositiory (None to use default) - count: Number of commits to list, or None for no limit - series: Series object to add information into. By default a new series + commit_range (str): Range of commits to count (e.g. 'HEAD..base') + git_dir (str): Path to git repositiory (None to use default) + count (int): Number of commits to list, or None for no limit + series (Series): Object to add information into. By default a new series is started. - allow_overwrite: Allow tags to overwrite an existing tag + allow_overwrite (bool): Allow tags to overwrite an existing tag + Returns: - A Series object containing information about the commits. + Series: Object containing information about the commits. """ if not series: series = Series() @@ -538,9 +548,12 @@ def get_metadata(branch, start, count): are interested in. Args: - branch: Branch to use (None for current branch) - start: Commit to start from: 0=branch HEAD, 1=next one, etc. - count: Number of commits to list + branch (str): Branch to use (None for current branch) + start (int): Commit to start from: 0=branch HEAD, 1=next one, etc. + count (int): Number of commits to list + + Returns: + Series: Object containing information about the commits. """ return get_metadata_for_list( '%s~%d' % (branch if branch else 'HEAD', start), None, count) @@ -550,6 +563,9 @@ def get_metadata_for_test(text): Args: text: + + Returns: + Series: Object containing information about the commits. """ series = Series() pst = PatchStream(series, is_log=True) @@ -567,11 +583,13 @@ def fix_patch(backup_dir, fname, series, cmt): A backup file is put into backup_dir (if not None). Args: - fname: Filename to patch file to process - series: Series information about this patch set - cmt: Commit object for this patch file + backup_dir (str): Path to directory to use to backup the file + fname (str): Filename to patch file to process + series (Series): Series information about this patch set + cmt (Commit): Commit object for this patch file + Return: - A list of errors, or [] if all ok. + list: A list of errors, each str, or [] if all ok. """ handle, tmpname = tempfile.mkstemp() outfd = os.fdopen(handle, 'w', encoding='utf-8') @@ -594,8 +612,8 @@ def fix_patches(series, fnames): The patch files are processed in place, and overwritten. Args: - series: The series object - fnames: List of patch files to process + series (Series): The Series object + fnames (:type: list of str): List of patch files to process """ # Current workflow creates patches, so we shouldn't need a backup backup_dir = None #tempfile.mkdtemp('clean-patch') @@ -617,9 +635,9 @@ def insert_cover_letter(fname, series, count): """Inserts a cover letter with the required info into patch 0 Args: - fname: Input / output filename of the cover letter file - series: Series object - count: Number of patches in the series + fname (str): Input / output filename of the cover letter file + series (Series): Series object + count (int): Number of patches in the series """ fil = open(fname, 'r') lines = fil.readlines() From patchwork Mon Oct 26 01:04:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387371 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=ANnzeaPy; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGsm2xGQz9sTD for ; Mon, 26 Oct 2020 12:07:55 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 5A1A7824EE; Mon, 26 Oct 2020 02:05:37 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="ANnzeaPy"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 4BC05824B8; Mon, 26 Oct 2020 02:05:18 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd2f.google.com (mail-io1-xd2f.google.com [IPv6:2607:f8b0:4864:20::d2f]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 0F4B98248B for ; Mon, 26 Oct 2020 02:05:15 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd2f.google.com with SMTP id y20so8383776iod.5 for ; Sun, 25 Oct 2020 18:05:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Gu7CBvY3/L8TY27+EJcXvdtS+KqaWZ8WFg5nIHbV3pM=; b=ANnzeaPyAM66VaGxWh1SctXqFL3RJBZRJ6ZpKtp06mOMh70H3XRkviCn4vK/xCgsEN ShkGevSPA2lgcKnWONasEAVinRyqw79hi/1Pk0o7/SDD/pys4ipOCvE233z4e5+mE2jh k8Nywuy3kOdyZ7bsKvkV8ciIRDM93njkDoyy0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Gu7CBvY3/L8TY27+EJcXvdtS+KqaWZ8WFg5nIHbV3pM=; b=rhmDL5Ir8ZDg9zc0aOtmG5KDm0PMbyNwbTWFfW+4H9BI2Pvv575IX32VMDwhBbf0Un qxQDCzXsS146XxHjnwvEKAi8CKAjV4K3AgakWI09RqYlwbefqKnjnQ7QWBuILRkcr0pZ UmUavEmxJq5exEOpLEs9fwR5gxdP8icfl6u9mvAwk/9/hdsB3I7Ljud8pON1K8hG+baK E8ytqGuE847o0wNl1kn7FcfQPygD7s8n0sY3n7Va5vukucw31PQMlSDwemDdgB4ruE7n 9yKkaJWQAYw2U/qrGa6rbYJ8NVTSETZFveVbcb1WDoAnXSIPvXWvOGKcbZqtgOY+o5Qu d3Jw== X-Gm-Message-State: AOAM533bjWi5baHvCjqnmmSBCwvuCvUJqqdWQbKHJclZbhCfX2iY/DxI 0hA0MHT1VTpR0o8MeXp2wFKS7wlUg8Crf+Dg X-Google-Smtp-Source: ABdhPJwI9MQ2RQmjBNU19NXkeavQo5dORhCrDeFp/SuXdBFAxr8BHItlaxGRizN31ENmAoEpJyt79A== X-Received: by 2002:a02:b113:: with SMTP id r19mr5771142jah.106.1603674313751; Sun, 25 Oct 2020 18:05:13 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:13 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 14/30] patman: Move warning collection to a function Date: Sun, 25 Oct 2020 19:04:26 -0600 Message-Id: <20201026010442.1606893-15-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Add a new function in PatchStream to collect the warnings generated while parsing the stream. This will allow us to adjust the logic, such as dealing with per-commit warnings. Two of the warnings are in fact internal errors, so change them to raise and exception. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/patchstream.py | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index b2cb2debeee..9f283470bc2 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -83,6 +83,14 @@ class PatchStream: self.signoff = [] # Contents of signoff line self.commit = None # Current commit + def _add_warn(self, warn): + """Add a new warning to report to the user + + Args: + warn (str): Warning to report + """ + self.warn.append(warn) + def _add_to_series(self, line, name, value): """Add a new Series-xxx tag. @@ -237,7 +245,7 @@ class PatchStream: # but we are already in a section, this means 'END' is missing # for that section, fix it up. if self.in_section: - self.warn.append("Missing 'END' in section '%s'" % self.in_section) + self._add_warn("Missing 'END' in section '%s'" % self.in_section) if self.in_section == 'cover': self.series.cover = self.section elif self.in_section == 'notes': @@ -247,14 +255,16 @@ class PatchStream: if self.is_log: self.commit.notes += self.section else: - self.warn.append("Unknown section '%s'" % self.in_section) + # This should not happen + raise ValueError("Unknown section '%s'" % self.in_section) self.in_section = None self.skip_blank = True self.section = [] # but we are already in a change list, that means a blank line # is missing, fix it up. if self.in_change: - self.warn.append("Missing 'blank line' in section '%s-changes'" % self.in_change) + self._add_warn("Missing 'blank line' in section '%s-changes'" % + self.in_change) self._finalise_change() self.in_change = None self.change_version = 0 @@ -271,7 +281,8 @@ class PatchStream: if self.is_log: self.commit.notes += self.section else: - self.warn.append("Unknown section '%s'" % self.in_section) + # This should not happen + raise ValueError("Unknown section '%s'" % self.in_section) self.in_section = None self.skip_blank = True self.section = [] @@ -362,8 +373,8 @@ class PatchStream: self.in_change = 'Commit' self.change_version = self._parse_version(value, line) else: - self.warn.append('Line %d: Ignoring Commit-%s' % - (self.linenum, name)) + self._add_warn('Line %d: Ignoring Commit-%s' % + (self.linenum, name)) # Detect the start of a new commit elif commit_match: @@ -377,7 +388,7 @@ class PatchStream: # Remove Tested-by self, since few will take much notice if (rtag_type == 'Tested-by' and who.find(os.getenv('USER') + '@') != -1): - self.warn.append("Ignoring %s" % line) + self._add_warn("Ignoring %s" % line) elif rtag_type == 'Patch-cc': self.commit.AddCc(who.split(',')) else: @@ -394,8 +405,8 @@ class PatchStream: # Look for space before tab mat = RE_SPACE_BEFORE_TAB.match(line) if mat: - self.warn.append('Line %d/%d has space before tab' % - (self.linenum, mat.start())) + self._add_warn('Line %d/%d has space before tab' % + (self.linenum, mat.start())) # OK, we have a valid non-blank line out = [line] @@ -427,8 +438,7 @@ class PatchStream: self._finalise_change() self._close_commit() if self.lines_after_test: - self.warn.append('Found %d lines after TEST=' % - self.lines_after_test) + self._add_warn('Found %d lines after TEST=' % self.lines_after_test) def _write_message_id(self, outfd): """Write the Message-Id into the output. @@ -503,8 +513,8 @@ class PatchStream: self.blank_count += 1 else: if self.blank_count and (line == '-- ' or match): - self.warn.append("Found possible blank line(s) at " - "end of file '%s'" % last_fname) + self._add_warn("Found possible blank line(s) at end of file '%s'" % + last_fname) outfd.write('+\n' * self.blank_count) outfd.write(line + '\n') self.blank_count = 0 From patchwork Mon Oct 26 01:04:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387372 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=NbYI1dkv; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGsz5gNXz9sT6 for ; Mon, 26 Oct 2020 12:08:07 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 065328250F; Mon, 26 Oct 2020 02:05:39 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="NbYI1dkv"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5649282495; Mon, 26 Oct 2020 02:05:19 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd30.google.com (mail-io1-xd30.google.com [IPv6:2607:f8b0:4864:20::d30]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id E496B82495 for ; Mon, 26 Oct 2020 02:05:15 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd30.google.com with SMTP id y20so8383795iod.5 for ; Sun, 25 Oct 2020 18:05:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5rVaxr8XsU404FQ936J8HLE4iaca4Yd0cmtG68HXJug=; b=NbYI1dkvwGj20fXxTw49DU2PTJDX5OzExweLEnpXORvwt9ynn7qjgHhA4iANqgWdBz g6cCXVCSAFAUupYehusNP/ZynItQRwtAPcjwWMlWV2wqyp1gdLpD47vhJ8MBTGmTAOHX 3tnHPyRa6b5iuqVWO/fhtVKmLvREguzTAKwOE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=5rVaxr8XsU404FQ936J8HLE4iaca4Yd0cmtG68HXJug=; b=ud3KHQm/4UKw3v75y1ir7yk78vtZ0GavmUJpguS68Gdbev0pNvJkvOCz3b/1s6ubkn b7lF4OKSpjVf33I29VVuFABP96QsFNd5LDXg/kG8HEWCGpiwPTo3MTKDKGjSL98yDJaa Tt3sRQ43GweMyGfB3pKBbUDQbRPA03QrQVtDqT16klvCSBJRucwdnuKxTHt6S84YfNkB Ma/ha9kUKwmFwBqvRyY1E6nelgsNbAsb02A7dGa+0zMvuuL8oEOlv10+qjP2/75k1Qcg 3QFmIMiBKrIBojHnvvn8mwRTMuG+l76jNESvkSiynlKt0Yln+o8pagB7I9aq93PSWHof BpdA== X-Gm-Message-State: AOAM533UJIAVhmUN0qTC+l4jOqR9yEOJCvwVQ7r640/bYhhnF74b+Xk0 NvX0iF0TXBQbYY/XEFTzG/Q2qNCC9v/UzjJg X-Google-Smtp-Source: ABdhPJzW3KsTAcib3qVvhvWbxRfp8vlsf/+EDnVMx+4irP3rrWjdkmdYxdklZzxufZR2nvcwhYSQmQ== X-Received: by 2002:a05:6638:92a:: with SMTP id 10mr9636746jak.125.1603674314677; Sun, 25 Oct 2020 18:05:14 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:14 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 15/30] patman: Attach warnings to individual patches Date: Sun, 25 Oct 2020 19:04:27 -0600 Message-Id: <20201026010442.1606893-16-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean At present warnings are produced across the whole set of patches when parsing them. It is more useful to associate each warning with the patch (or commit) that generated it. Attach warnings to the Commit object and move them out of PatchStream. Also avoid generating duplicate warnings for the same commit. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/commit.py | 2 ++ tools/patman/patchstream.py | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tools/patman/commit.py b/tools/patman/commit.py index 8d583c4ed39..e49bf87dfc8 100644 --- a/tools/patman/commit.py +++ b/tools/patman/commit.py @@ -27,6 +27,7 @@ class Commit: rtags: Response tags (e.g. Reviewed-by) collected by the commit, dict: key: rtag type (e.g. 'Reviewed-by') value: Set of people who gave that rtag, each a name/email string + warn: List of warnings for this commit, each a str """ def __init__(self, hash): self.hash = hash @@ -38,6 +39,7 @@ class Commit: self.notes = [] self.change_id = None self.rtags = collections.defaultdict(set) + self.warn = [] def AddChange(self, version, info): """Add a new change line to the change list for a version. diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 9f283470bc2..880d7ddc7f2 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -68,7 +68,6 @@ class PatchStream: self.skip_blank = False # True to skip a single blank line self.found_test = False # Found a TEST= line self.lines_after_test = 0 # Number of lines found after TEST= - self.warn = [] # List of warnings we have collected self.linenum = 1 # Output line number we are up to self.in_section = None # Name of start...END section we are in self.notes = [] # Series notes @@ -84,12 +83,20 @@ class PatchStream: self.commit = None # Current commit def _add_warn(self, warn): - """Add a new warning to report to the user + """Add a new warning to report to the user about the current commit + + The new warning is added to the current commit if not already present. Args: warn (str): Warning to report + + Raises: + ValueError: Warning is generated with no commit associated """ - self.warn.append(warn) + if not self.commit: + raise ValueError('Warning outside commit: %s' % warn) + if warn not in self.commit.warn: + self.commit.warn.append(warn) def _add_to_series(self, line, name, value): """Add a new Series-xxx tag. @@ -614,7 +621,7 @@ def fix_patch(backup_dir, fname, series, cmt): if backup_dir: shutil.copy(fname, os.path.join(backup_dir, os.path.basename(fname))) shutil.move(tmpname, fname) - return pst.warn + return cmt.warn def fix_patches(series, fnames): """Fix up a list of patches identified by filenames From patchwork Mon Oct 26 01:04:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387374 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=hDcZnrvf; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGtC1qFRz9sTD for ; Mon, 26 Oct 2020 12:08:18 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 253DC8251C; Mon, 26 Oct 2020 02:05:41 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="hDcZnrvf"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id CCC14824C3; Mon, 26 Oct 2020 02:05:19 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd35.google.com (mail-io1-xd35.google.com [IPv6:2607:f8b0:4864:20::d35]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id C2917824BB for ; Mon, 26 Oct 2020 02:05:16 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd35.google.com with SMTP id k6so8347560ior.2 for ; Sun, 25 Oct 2020 18:05:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=EwPDx6U0RfJ+oC3KEc9NLLEI7tbzTqPu4vFxu1zzr1Y=; b=hDcZnrvfbKNkM0z7SvgluM059dDsP/a3EcRGZ/8r2pkgU5RIXPjJzh+kvxKEBrTbS+ w9SYQNJy7k/s8qR1L34HUN0eNfvOQS6O7yvhpu5+R3g8Q9VpKl3ndW3OvPMZRmUzxQVZ 9tuKVg0BL/BJAtW1l8lwJM0xPDK/NxjA0xSb4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EwPDx6U0RfJ+oC3KEc9NLLEI7tbzTqPu4vFxu1zzr1Y=; b=sbsQG1T7EWAMfJy4cpzQchFWeFD+YKMpKA6adGiq4ncW/qVnSEyjolESa+su4/uLYC T4wW6H0NBQaIkJxKM7tvX86bW6A4ELwnP7fpiR51F24Csx2WUOfVjGDbnyvuwLBTNvIq YpTEKqdytgMPgNCbL5S07+zyZxDwglGZnJi2UWVy/QyAZHxezZlssJLkRHmZx8YZEIjP m684LpW6MxBBUjtYKI4H80cYMkbiiFz9q7FTZXk8X4dc2N1xhw7AsCm59+g1/i/BEPNQ TmYngM20n1e/rOpKLgCBSC7KS8mgSCeZj4U5K3trPk3FT5uq3DBD9xWlQCRQQOhk8usd wEsg== X-Gm-Message-State: AOAM531C8B7TVWTEYD0j9RaXl7mRgcMA2jegYDARgundFpSyKO16U63K bGHbHpwvEqn2sxUn05nAo7SwJGm/cTwcdgE2 X-Google-Smtp-Source: ABdhPJwOSJjWyKPuDx/NTOHNsH0NSS1+T6ZCtC8Yn75a5pf0HI9lZqCN+VExfRCV/To9xZhxwpOUmQ== X-Received: by 2002:a02:c885:: with SMTP id m5mr8977489jao.72.1603674315522; Sun, 25 Oct 2020 18:05:15 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:15 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 16/30] patman: Convert 'Series-xxx' tag errors into warnings Date: Sun, 25 Oct 2020 19:04:28 -0600 Message-Id: <20201026010442.1606893-17-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean If the Series-xxx tag is not recognised patman currently reports a fatal error. This is inconvenient if a new feature is later added to patman that an earlier version does not support. Report a warning instead, to allow the user to take action if needed, but still allow operation to proceed. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/patchstream.py | 4 +++- tools/patman/series.py | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 880d7ddc7f2..24040d43d62 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -114,7 +114,9 @@ class PatchStream: self.in_section = name self.skip_blank = False if self.is_log: - self.series.AddTag(self.commit, line, name, value) + warn = self.series.AddTag(self.commit, line, name, value) + if warn: + self.commit.warn.append(warn) def _add_to_commit(self, name): """Add a new Commit-xxx tag. diff --git a/tools/patman/series.py b/tools/patman/series.py index 393a44241bd..4457719f2ef 100644 --- a/tools/patman/series.py +++ b/tools/patman/series.py @@ -59,6 +59,9 @@ class Series(dict): line: Source line containing tag (useful for debug/error messages) name: Tag name (part after 'Series-') value: Tag value (part after 'Series-xxx: ') + + Returns: + String warning if something went wrong, else None """ # If we already have it, then add to our list name = name.replace('-', '_') @@ -78,9 +81,10 @@ class Series(dict): else: self[name] = value else: - raise ValueError("In %s: line '%s': Unknown 'Series-%s': valid " + return ("In %s: line '%s': Unknown 'Series-%s': valid " "options are %s" % (commit.hash, line, name, ', '.join(valid_series))) + return None def AddCommit(self, commit): """Add a commit into our list of commits From patchwork Mon Oct 26 01:04:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387375 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=EhXBh8nh; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGtQ71qPz9sT6 for ; Mon, 26 Oct 2020 12:08:30 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 7CD898245F; Mon, 26 Oct 2020 02:05:55 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="EhXBh8nh"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id A98FC824C3; Mon, 26 Oct 2020 02:05:20 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x130.google.com (mail-il1-x130.google.com [IPv6:2607:f8b0:4864:20::130]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id C4D9C824BF for ; Mon, 26 Oct 2020 02:05:17 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x130.google.com with SMTP id x20so1404219ilj.8 for ; Sun, 25 Oct 2020 18:05:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=v800YK0lEHqvctLXycgBml0aRxEEgPh0CjD7IRG4gYM=; b=EhXBh8nhmvLlwdW0G4KuOv2VlEwVSxcXovIWEvDMbh0Tjb1AzWsj1f9R84+vPnU191 Q90imHOS6eYrmpdfF3Ws5isap80ky3+y10/bldmvCPV5Jps6T1W+tCG6nR9wPtcwBTRn s5apGk5VZXH508dFeeFV5vNxn7hf5vwBjRZdM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=v800YK0lEHqvctLXycgBml0aRxEEgPh0CjD7IRG4gYM=; b=cGlTXTvV5xj+h7atKe9kzVBMLZ8LiTq3WrI5WN5r8StzOTSBlbE2GqnAQEL5ka2p3G WMiLQIp7EoA2tK/5XAvbjQMYM4zn3hxD260O/Bm7Ri1SddCsv2cGS5mQTdyv67A4mh/R +RDSkDp2r5R5c5pmqiEdt9ekNCAv0GWK3l22+VuFFKt/3DQ/stj+YpCh16IIMKf4Si6n 928A9fByURW/iMg+hq/rvlFFLomPf7FrSUeOWXA9FyPBiUIlsP8ikxAablnSkuSrjpAe XtrlxyH0bbA7AF7nR8MqPgZI5u46Fi1Q+g6dfrBAWFDkVWcFUdChoWMyN+VnQtTeZmSm 7DHA== X-Gm-Message-State: AOAM531aMsNP2B+szXyYYrEXgAXsRVeyPyShwm7EzT6ZZ42qB6DxwbLt jjNlwJvnEwUF8kSWRTRijSEt79zP9AkSirgT X-Google-Smtp-Source: ABdhPJy0TS95XKChx+I8XCMOLZO9SDvSJ/MxGcdwHIZMdq7lUa3gJ9MgaL/j15wOHCYBlZSAJjotTA== X-Received: by 2002:a92:854e:: with SMTP id f75mr1001563ilh.207.1603674316554; Sun, 25 Oct 2020 18:05:16 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:15 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 17/30] patman: Drop unused signoff member Date: Sun, 25 Oct 2020 19:04:29 -0600 Message-Id: <20201026010442.1606893-18-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean This is not used. Drop it. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/func_test.py | 1 + tools/patman/patchstream.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index bdeccafda0b..2290ba95e9d 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -16,6 +16,7 @@ import unittest from patman import control from patman import gitutil from patman import patchstream +from patman.patchstream import PatchStream from patman import settings from patman import terminal from patman import tools diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 24040d43d62..cf591b27573 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -79,7 +79,6 @@ class PatchStream: self.change_lines = [] # Lines of the current change self.blank_count = 0 # Number of blank lines stored up self.state = STATE_MSG_HEADER # What state are we in? - self.signoff = [] # Contents of signoff line self.commit = None # Current commit def _add_warn(self, warn): From patchwork Mon Oct 26 01:04:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387376 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=AhddS0np; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGtg1Sn5z9sT6 for ; Mon, 26 Oct 2020 12:08:42 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 3DF9882524; Mon, 26 Oct 2020 02:05:57 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="AhddS0np"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id DF5D7824D0; Mon, 26 Oct 2020 02:05:21 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x135.google.com (mail-il1-x135.google.com [IPv6:2607:f8b0:4864:20::135]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id DCBCC824C2 for ; Mon, 26 Oct 2020 02:05:18 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x135.google.com with SMTP id a20so6720290ilk.13 for ; Sun, 25 Oct 2020 18:05:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JbHz5yIzduPGXYJvnWTGbaH8PS+IX+LSaUAM+ukUNz8=; b=AhddS0nppC+ogj6mC6nz+UKvhIdVFRKCq2OzwcQsRJgHJ5lbVKadZK8pWIgon+KEWl VTvzqXTDag6tppUvj8LKwU2GXNQ41f7DUCImxn5PprQ87UsD7/HHc1Use3tu7OtSUaY7 KdeYQyKkUCboG+2UyKXPTOZIQbBwiIjR88LGE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JbHz5yIzduPGXYJvnWTGbaH8PS+IX+LSaUAM+ukUNz8=; b=AymFqnZjGsFRVb7fINUGAMJDLjlLx13qhlA0dKyxiifklAvfXl6EGxElIfD/VDk95N MA9w4PTZP5ZbpvepX+rcjHiQ8FAQIQjHMbtAyf1/droIqMMdZ+tK++KUccBdKM0glqCJ UDh66NI/laly4Zl4pzaBafpFIKBYKyAZz0fWgkJjazb5PeS5UQUONT5vl0RP8HYCDHBl jJ57oGNiSxEwXsTI8dHeaMqC+18CxdB39LGlsP3nDmhq0W24dtc96By2alMmensTzY20 VzKmW7rraOrti/lkIGnbIkWNyfvSzpgZHSduLoL552P+0jMC/h/DZr/uYs4pT3Gr3PVh /TpA== X-Gm-Message-State: AOAM53098QvimmnMidrTzMFb5uhMAU4MoeSFoFIxGT+tKPtmsqW8WY4q APHvh0l87W3pghtKGXDgJV714Uj/BIFshIys X-Google-Smtp-Source: ABdhPJwRERxXON9vRsmXMAJ7SwGdVxZ9Ea8n2Obu115svHzw0UjImGVmEEJerrFkvO/x+7TTijFkUA== X-Received: by 2002:a92:c60e:: with SMTP id p14mr2409108ilm.258.1603674317599; Sun, 25 Oct 2020 18:05:17 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:17 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 18/30] patman: Add a test for PatchStream tags Date: Sun, 25 Oct 2020 19:04:30 -0600 Message-Id: <20201026010442.1606893-19-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean The current functional tests run most of patman. Add a smaller test that just checks tag handling with the PatchStream class. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/func_test.py | 26 +++++++++++++++++++++----- tools/patman/patchstream.py | 23 +++++++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 2290ba95e9d..2a0da8b3ccf 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -31,6 +31,9 @@ except ModuleNotFoundError: class TestFunctional(unittest.TestCase): """Functional tests for checking that patman behaves correctly""" + leb = (b'Lord Edmund Blackadd\xc3\xabr '. + decode('utf-8')) + def setUp(self): self.tmpdir = tempfile.mkdtemp(prefix='patman.') self.gitdir = os.path.join(self.tmpdir, 'git') @@ -177,8 +180,6 @@ class TestFunctional(unittest.TestCase): stefan = b'Stefan Br\xc3\xbcns '.decode('utf-8') rick = 'Richard III ' mel = b'Lord M\xc3\xablchett '.decode('utf-8') - leb = (b'Lond Edmund Blackadd\xc3\xabr +Reviewed-by: Mary Bloggs +Tested-by: %s +''' % self.leb + pstrm = PatchStream.process_text(text) + self.assertEqual(pstrm.commit.rtags, { + 'Reviewed-by': {'Mary Bloggs ', + 'Joe Bloggs '}, + 'Tested-by': {self.leb}}) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index cf591b27573..d6f6ae92513 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -5,6 +5,7 @@ """Handles parsing a stream of commits/emails from 'git log' or other source""" import datetime +import io import math import os import re @@ -81,6 +82,28 @@ class PatchStream: self.state = STATE_MSG_HEADER # What state are we in? self.commit = None # Current commit + @staticmethod + def process_text(text, is_comment=False): + """Process some text through this class using a default Commit/Series + + Args: + text (str): Text to parse + is_comment (bool): True if this is a comment rather than a patch. + If True, PatchStream doesn't expect a patch subject at the + start, but jumps straight into the body + + Returns: + PatchStream: object with results + """ + pstrm = PatchStream(Series()) + pstrm.commit = commit.Commit(None) + infd = io.StringIO(text) + outfd = io.StringIO() + if is_comment: + pstrm.state = STATE_PATCH_HEADER + pstrm.process_stream(infd, outfd) + return pstrm + def _add_warn(self, warn): """Add a new warning to report to the user about the current commit From patchwork Mon Oct 26 01:04:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387378 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=HaWpoJMt; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGtt1ZC1z9sTD for ; Mon, 26 Oct 2020 12:08:53 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id BD24182529; Mon, 26 Oct 2020 02:05:58 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="HaWpoJMt"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5546D824CD; Mon, 26 Oct 2020 02:05:23 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x12b.google.com (mail-il1-x12b.google.com [IPv6:2607:f8b0:4864:20::12b]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id E136382495 for ; Mon, 26 Oct 2020 02:05:19 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x12b.google.com with SMTP id k1so6746388ilc.10 for ; Sun, 25 Oct 2020 18:05:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=nC0N9LEXM2f1aZSJv1RMOCMj/3OoXB90POlJZ0cqkCk=; b=HaWpoJMt4EMGigUAyke+wW/KrMysHVVu74ScaDEwS7hYb5BUuY+zjZaxQzyZRFOJPC zxxdVc2Kdq2bgkmBoKRe2JAgi79t2lyUsFvddp5+zIjfn4y7opKJSxYLulSW5M4YMzNi 6Ryt6tGTVhdgqMQa5wDGoVN31tGzunGeJrwO4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=nC0N9LEXM2f1aZSJv1RMOCMj/3OoXB90POlJZ0cqkCk=; b=iKR0kQYQpzbWI220uj/tKjbyDf3EUfdLJFABkw9CkPvsiTFJk9OlrhmX4xFkKi7vRz SaosrNcypwbUNtHeEPbFMXC8PpBknlabguq2Ls6z1OBQ8EqhWldSibd8ahehzQzSHueE vrdCy1uItUxWmRlKKNEi/JOL98i+ZNP7YiMVtkBcrcaztzofd7Mo2ORmfDk8Kpq24DUJ PjWUoxJNVYvu3xn0Q+BnnoaW1R6qJdDbEpTucfUG4HlwK8mHbr3aXkICHJTU80clh1pH eF068UCmnaUpsGL4Wenx8VgeWX4HUws7bigQnD06L0Bo/6DOr6ib1pQWGM2zVOX2AESZ stZw== X-Gm-Message-State: AOAM532A/UAdCLwOpNtrTzhkWqaAcmrrfY2RauT2gR/9wufM5tFAHk+3 S46+Wq8T5cleSbm8Q/GsFaYXsv3cZYmfv1W0 X-Google-Smtp-Source: ABdhPJz1sbOHQoHeXXm+CBxMgJVkBEEr/BmRGK9CSNY8sECXrAvdoO7IlvTsdZaJjgwbobHtj2wMpA== X-Received: by 2002:a92:5f53:: with SMTP id t80mr7489548ilb.160.1603674318461; Sun, 25 Oct 2020 18:05:18 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:18 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 19/30] patman: Add some tests for warnings Date: Sun, 25 Oct 2020 19:04:31 -0600 Message-Id: <20201026010442.1606893-20-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Add tests that check that warnings are generated when expected. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/func_test.py | 111 +++++++++++++++++++++++++++++++++--- tools/patman/main.py | 16 +++++- tools/patman/patchstream.py | 2 +- 3 files changed, 116 insertions(+), 13 deletions(-) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 2a0da8b3ccf..02d46ae5f73 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -33,6 +33,9 @@ class TestFunctional(unittest.TestCase): """Functional tests for checking that patman behaves correctly""" leb = (b'Lord Edmund Blackadd\xc3\xabr '. decode('utf-8')) + fred = 'Fred Bloggs ' + joe = 'Joe Bloggs ' + mary = 'Mary Bloggs ' def setUp(self): self.tmpdir = tempfile.mkdtemp(prefix='patman.') @@ -180,7 +183,6 @@ class TestFunctional(unittest.TestCase): stefan = b'Stefan Br\xc3\xbcns '.decode('utf-8') rick = 'Richard III ' mel = b'Lord M\xc3\xablchett '.decode('utf-8') - fred = 'Fred Bloggs ' add_maintainers = [stefan, rick] dry_run = True in_reply_to = mel @@ -189,7 +191,7 @@ class TestFunctional(unittest.TestCase): 'fdt': ['simon'], 'u-boot': ['u-boot@lists.denx.de'], 'simon': [self.leb], - 'fred': [fred], + 'fred': [self.fred], } text = self._get_text('test01.txt') @@ -231,7 +233,7 @@ class TestFunctional(unittest.TestCase): self.assertEqual('Prefix:\t RFC', lines[line + 3]) self.assertEqual('Cover: 4 lines', lines[line + 4]) line += 5 - self.assertEqual(' Cc: %s' % fred, lines[line + 0]) + self.assertEqual(' Cc: %s' % self.fred, lines[line + 0]) self.assertEqual(' Cc: %s' % tools.FromUnicode(self.leb), lines[line + 1]) self.assertEqual(' Cc: %s' % tools.FromUnicode(mel), @@ -248,7 +250,7 @@ class TestFunctional(unittest.TestCase): self.assertEqual(('%s %s\0%s' % (args[0], rick, stefan)), tools.ToUnicode(cc_lines[0])) self.assertEqual( - '%s %s\0%s\0%s\0%s' % (args[1], fred, self.leb, rick, stefan), + '%s %s\0%s\0%s\0%s' % (args[1], self.fred, self.leb, rick, stefan), tools.ToUnicode(cc_lines[1])) expected = ''' @@ -487,12 +489,103 @@ complicated as possible''') text = '''This is a patch Signed-off-by: Terminator -Reviewed-by: Joe Bloggs -Reviewed-by: Mary Bloggs +Reviewed-by: %s +Reviewed-by: %s Tested-by: %s -''' % self.leb +''' % (self.joe, self.mary, self.leb) pstrm = PatchStream.process_text(text) self.assertEqual(pstrm.commit.rtags, { - 'Reviewed-by': {'Mary Bloggs ', - 'Joe Bloggs '}, + 'Reviewed-by': {self.joe, self.mary}, 'Tested-by': {self.leb}}) + + def testMissingEnd(self): + """Test a missing END tag""" + text = '''This is a patch + +Cover-letter: +This is the title +missing END after this line +Signed-off-by: Fred +''' + pstrm = PatchStream.process_text(text) + self.assertEqual(["Missing 'END' in section 'cover'"], + pstrm.commit.warn) + + def testMissingBlankLine(self): + """Test a missing blank line after a tag""" + text = '''This is a patch + +Series-changes: 2 +- First line of changes +- Missing blank line after this line +Signed-off-by: Fred +''' + pstrm = PatchStream.process_text(text) + self.assertEqual(["Missing 'blank line' in section 'Series-changes'"], + pstrm.commit.warn) + + def testInvalidCommitTag(self): + """Test an invalid Commit-xxx tag""" + text = '''This is a patch + +Commit-fred: testing +''' + pstrm = PatchStream.process_text(text) + self.assertEqual(["Line 3: Ignoring Commit-fred"], pstrm.commit.warn) + + def testSelfTest(self): + """Test a tested by tag by this user""" + test_line = 'Tested-by: %s@napier.com' % os.getenv('USER') + text = '''This is a patch + +%s +''' % test_line + pstrm = PatchStream.process_text(text) + self.assertEqual(["Ignoring '%s'" % test_line], pstrm.commit.warn) + + def testSpaceBeforeTab(self): + """Test a space before a tab""" + text = '''This is a patch + ++ \tSomething +''' + pstrm = PatchStream.process_text(text) + self.assertEqual(["Line 3/0 has space before tab"], pstrm.commit.warn) + + def testLinesAfterTest(self): + """Test detecting lines after TEST= line""" + text = '''This is a patch + +TEST=sometest +more lines +here +''' + pstrm = PatchStream.process_text(text) + self.assertEqual(["Found 2 lines after TEST="], pstrm.commit.warn) + + def testBlankLineAtEnd(self): + """Test detecting a blank line at the end of a file""" + text = '''This is a patch + +diff --git a/lib/fdtdec.c b/lib/fdtdec.c +index c072e54..942244f 100644 +--- a/lib/fdtdec.c ++++ b/lib/fdtdec.c +@@ -1200,7 +1200,8 @@ int fdtdec_setup_mem_size_base(void) + } + + gd->ram_size = (phys_size_t)(res.end - res.start + 1); +- debug("%s: Initial DRAM size %llx\n", __func__, (u64)gd->ram_size); ++ debug("%s: Initial DRAM size %llx\n", __func__, ++ (unsigned long long)gd->ram_size); ++ +diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c + +-- +2.7.4 + + ''' + pstrm = PatchStream.process_text(text) + self.assertEqual( + ["Found possible blank line(s) at end of file 'lib/fdtdec.c'"], + pstrm.commit.warn) diff --git a/tools/patman/main.py b/tools/patman/main.py index b96000807eb..d1a43c44fcd 100755 --- a/tools/patman/main.py +++ b/tools/patman/main.py @@ -86,6 +86,8 @@ AddCommonArgs(send) send.add_argument('patchfiles', nargs='*') test_parser = subparsers.add_parser('test', help='Run tests') +test_parser.add_argument('testname', type=str, default=None, nargs='?', + help="Specify the test to run") AddCommonArgs(test_parser) # Parse options twice: first to get the project and second to handle @@ -111,15 +113,23 @@ if args.cmd == 'test': sys.argv = [sys.argv[0]] result = unittest.TestResult() + suite = unittest.TestSuite() + loader = unittest.TestLoader() for module in (test_checkpatch.TestPatch, func_test.TestFunctional): - suite = unittest.TestLoader().loadTestsFromTestCase(module) - suite.run(result) + if args.testname: + try: + suite.addTests(loader.loadTestsFromName(args.testname, module)) + except AttributeError: + continue + else: + suite.addTests(loader.loadTestsFromTestCase(module)) + suite.run(result) for module in ['gitutil', 'settings', 'terminal']: suite = doctest.DocTestSuite(module) suite.run(result) - sys.exit(test_util.ReportResult('patman', None, result)) + sys.exit(test_util.ReportResult('patman', args.testname, result)) # Process commits, produce patches files, check them, email them elif args.cmd == 'send': diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index d6f6ae92513..1cb4d6ed0dd 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -419,7 +419,7 @@ class PatchStream: # Remove Tested-by self, since few will take much notice if (rtag_type == 'Tested-by' and who.find(os.getenv('USER') + '@') != -1): - self._add_warn("Ignoring %s" % line) + self._add_warn("Ignoring '%s'" % line) elif rtag_type == 'Patch-cc': self.commit.AddCc(who.split(',')) else: From patchwork Mon Oct 26 01:04:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387379 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=KKk2VDqE; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGv46tjJz9sT6 for ; Mon, 26 Oct 2020 12:09:03 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 61A5D824AE; Mon, 26 Oct 2020 02:06:00 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="KKk2VDqE"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id A0D3C824CC; Mon, 26 Oct 2020 02:05:23 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd2d.google.com (mail-io1-xd2d.google.com [IPv6:2607:f8b0:4864:20::d2d]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id C293C824BB for ; Mon, 26 Oct 2020 02:05:20 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd2d.google.com with SMTP id h21so8337470iob.10 for ; Sun, 25 Oct 2020 18:05:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1in3xx/FRGep8sd3bBkb5SHxZY1uN2F6Of/OCtKTbMI=; b=KKk2VDqEIEJdh9laYVjrtzNnDx24hu112YVVAka/zvPS3u+SpnIaI24M+oSoZDEEbg bcI6HQNsVjnqNG6qeLb2/XriIi2TIo6UL1zs3U/To31JDADKe1++BtS4TyYDz8c0uh50 3NtEuFUosgRIQemXVg4vzkvO0IubN8dJMTqL4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1in3xx/FRGep8sd3bBkb5SHxZY1uN2F6Of/OCtKTbMI=; b=Rr+StpPIxUtIF6q5u9jWLynEmCkmohcOHCo8+mnLPoHj+MIYacy6IivmoVR/UlABuV wa2Twh1+g3IhGzAbw0CH8imJ3R2/orP4GnI++WzrqSS7sqet8ynsypWdgEIADM6zCNfr SA+j4lTPhPY29mNTZ5A1OAA9eNQXnr0a7NhODS2akgu3DKMDPdOVwTqwOCyQn/9d+4+v mvrM0j451kWithIo/vEcMkUnkoxsvLidUbNNewlvTK0NnU0vwSEIiP67HAR2AuvbIH+h mGxR4N2HhGRRM7dycwnhc+gwEuuC3Xo2ZBnHHM3q9g4PK6OIy5haOa2s6lsRiH0ydABY 1VWQ== X-Gm-Message-State: AOAM531tjkBoAhrdO4bkR1eOrp2+ReOYXN/art917QRMwoYyMs5IqWT3 iqGrQsrhAsPP+B2Y1ML4jUgnWBqC8LY59yNU X-Google-Smtp-Source: ABdhPJz6fSS5qgkygBqE3BOZgTvKCuLjurfsiUNp2+wMFj2dpeVG9TP1kJKnD+2p+ED0Nr2dbC1ieQ== X-Received: by 2002:a6b:be84:: with SMTP id o126mr8788992iof.56.1603674319373; Sun, 25 Oct 2020 18:05:19 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:18 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 20/30] patman: Convert testBasic() to use an interator Date: Sun, 25 Oct 2020 19:04:32 -0600 Message-Id: <20201026010442.1606893-21-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean On balance it is easier to use an iterator here, particularly if we need to insert lines due to new functionality. The only niggle is the need to keep the previous iterator value around in one case. Convert this test to use iter(). Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/func_test.py | 55 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 02d46ae5f73..b39e3f671dc 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -212,40 +212,39 @@ class TestFunctional(unittest.TestCase): cc_lines = open(cc_file, encoding='utf-8').read().splitlines() os.remove(cc_file) - lines = out[0].getvalue().splitlines() - self.assertEqual('Cleaned %s patches' % len(series.commits), lines[0]) - self.assertEqual('Change log missing for v2', lines[1]) - self.assertEqual('Change log missing for v3', lines[2]) - self.assertEqual('Change log for unknown version v4', lines[3]) - self.assertEqual("Alias 'pci' not found", lines[4]) - self.assertIn('Dry run', lines[5]) - self.assertIn('Send a total of %d patches' % count, lines[7]) - line = 8 - for i in range(len(series.commits)): - self.assertEqual(' %s' % args[i], lines[line + 0]) - line += 1 - while 'Cc:' in lines[line]: - line += 1 - self.assertEqual('To: u-boot@lists.denx.de', lines[line]) - self.assertEqual('Cc: %s' % tools.FromUnicode(stefan), - lines[line + 1]) - self.assertEqual('Version: 3', lines[line + 2]) - self.assertEqual('Prefix:\t RFC', lines[line + 3]) - self.assertEqual('Cover: 4 lines', lines[line + 4]) - line += 5 - self.assertEqual(' Cc: %s' % self.fred, lines[line + 0]) + lines = iter(out[0].getvalue().splitlines()) + self.assertEqual('Cleaned %s patches' % len(series.commits), + next(lines)) + self.assertEqual('Change log missing for v2', next(lines)) + self.assertEqual('Change log missing for v3', next(lines)) + self.assertEqual('Change log for unknown version v4', next(lines)) + self.assertEqual("Alias 'pci' not found", next(lines)) + self.assertIn('Dry run', next(lines)) + self.assertEqual('', next(lines)) + self.assertIn('Send a total of %d patches' % count, next(lines)) + prev = next(lines) + for i, commit in enumerate(series.commits): + self.assertEqual(' %s' % args[i], prev) + while True: + prev = next(lines) + if 'Cc:' not in prev: + break + self.assertEqual('To: u-boot@lists.denx.de', prev) + self.assertEqual('Cc: %s' % tools.FromUnicode(stefan), next(lines)) + self.assertEqual('Version: 3', next(lines)) + self.assertEqual('Prefix:\t RFC', next(lines)) + self.assertEqual('Cover: 4 lines', next(lines)) + self.assertEqual(' Cc: %s' % self.fred, next(lines)) self.assertEqual(' Cc: %s' % tools.FromUnicode(self.leb), - lines[line + 1]) - self.assertEqual(' Cc: %s' % tools.FromUnicode(mel), - lines[line + 2]) - self.assertEqual(' Cc: %s' % rick, lines[line + 3]) + next(lines)) + self.assertEqual(' Cc: %s' % tools.FromUnicode(mel), next(lines)) + self.assertEqual(' Cc: %s' % rick, next(lines)) expected = ('Git command: git send-email --annotate ' '--in-reply-to="%s" --to "u-boot@lists.denx.de" ' '--cc "%s" --cc-cmd "%s --cc-cmd %s" %s %s' % (in_reply_to, stefan, sys.argv[0], cc_file, cover_fname, ' '.join(args))) - line += 4 - self.assertEqual(expected, tools.ToUnicode(lines[line])) + self.assertEqual(expected, tools.ToUnicode(next(lines))) self.assertEqual(('%s %s\0%s' % (args[0], rick, stefan)), tools.ToUnicode(cc_lines[0])) From patchwork Mon Oct 26 01:04:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387380 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=e1Gq+4Xo; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGvG34wWz9sT6 for ; Mon, 26 Oct 2020 12:09:14 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 6925C82537; Mon, 26 Oct 2020 02:06:03 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="e1Gq+4Xo"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 991E3824CC; Mon, 26 Oct 2020 02:05:25 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE, T_FILL_THIS_FORM_SHORT,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd29.google.com (mail-io1-xd29.google.com [IPv6:2607:f8b0:4864:20::d29]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id AD195824C3 for ; Mon, 26 Oct 2020 02:05:21 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd29.google.com with SMTP id y20so8383951iod.5 for ; Sun, 25 Oct 2020 18:05:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ccZf0tjgnk+HGtaypXboBAmv7yO9uHFHZQCLZ3fWAYk=; b=e1Gq+4XodGuZYRNQ3MaShonFlPkhFRHMuphags83aRzQtUtkAdpHGfu2so6YWzWwnt yiax/lfm+e05IauA6/of/g+HzgNBfyO3HgI9h02Ejmj4tk531c7LhBPskIinAZbwoTwM zLZtNGGXCysu/IcfiZkwSCxqgRXNQr8XbFBhc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ccZf0tjgnk+HGtaypXboBAmv7yO9uHFHZQCLZ3fWAYk=; b=lqAn9WWr1OjSvgdt0slaJqSYi9sSTVskaktrkpb/9Iho7rGLhZwwaLy0zHI926ghRU oxspMlW3GDLXCT8KYkx273Ss80zzYiu3PBIJJXZl/mEj6FTaMFXRRc7TYkCxK9tGJb7U rIDKKlrIEEW7ExOh6x1fhO/KBYVVtIuWhGm3Y22pwrJ6zwf58YsPSH/QAWSxOokOaeQu ekLJ6xuDewkrCTPqTr2SVBBsLx4sDJxLDbvAzIZuYZgPKue9UAsnJpY4I8pa7v5CaIuN EBSP++V+y/o6Cn2SsHh9rCUse5JBzTMSp01GgH2auNfOeLs2oxYBDUkp1Bv+WvIOfuvK jQVQ== X-Gm-Message-State: AOAM532BlOVtMpxt4bKqdy9cFIo5rc0ls2MvBxQO1lzmwk7cDM70rqHw JlpMIVGZAWrY751VTQb3gb3X6M964prmbxNe X-Google-Smtp-Source: ABdhPJzu33WRTlRSvCgbdh0Gjqkuk/9pKjvzgk5S2/QJoAJebNx9agzIj2LCOyxZJIsEw/01VvEcOQ== X-Received: by 2002:a05:6638:45:: with SMTP id a5mr8258914jap.102.1603674320245; Sun, 25 Oct 2020 18:05:20 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:19 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass , Sean Anderson Subject: [PATCH v2 21/30] patman: Require tags to be before sign-off Date: Sun, 25 Oct 2020 19:04:33 -0600 Message-Id: <20201026010442.1606893-22-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean At present it is possible to put sign-off tags before the change log. This works but then it is hard for patman to add its own tags to a commit. Also if the commit has a Change-Id (e.g. for Gerrit) the commit becomes invalid if there is anything after it. Report a warning if patman tags are in the wrong place. One test patch already has the sign-off in the wrong place. Update the second one to avoid warnings. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/README | 3 ++- tools/patman/func_test.py | 23 ++++++++++++++++++- tools/patman/patchstream.py | 22 ++++++++++++++++++ .../0001-pci-Correct-cast-for-sandbox.patch | 2 +- ...-for-sandbox-in-fdtdec_setup_mem_siz.patch | 2 +- tools/patman/test/test01.txt | 4 ++-- 6 files changed, 50 insertions(+), 6 deletions(-) diff --git a/tools/patman/README b/tools/patman/README index 6664027ed7d..54036e1de4a 100644 --- a/tools/patman/README +++ b/tools/patman/README @@ -161,7 +161,8 @@ How to add tags =============== To make this script useful you must add tags like the following into any -commit. Most can only appear once in the whole series. +commit. Most can only appear once in the whole series. Tags should be placed +before the sign-off line / Change-Id. Series-to: email / alias Email address / alias to send patch series to (you can add this diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index b39e3f671dc..5732c674817 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -194,6 +194,9 @@ class TestFunctional(unittest.TestCase): 'fred': [self.fred], } + # NOTE: If you change this file you must also change the patch files in + # the same directory, since we assume that the metadata file matches the + # patched. If it doesn't, this test will fail. text = self._get_text('test01.txt') series = patchstream.get_metadata_for_test(text) cover_fname, args = self._create_patches_for_test(series) @@ -213,6 +216,10 @@ class TestFunctional(unittest.TestCase): os.remove(cc_file) lines = iter(out[0].getvalue().splitlines()) + self.assertIn('1 warnings for', next(lines)) + self.assertEqual( + "\t Tag 'Commit-notes' should be before sign-off / Change-Id", + next(lines)) self.assertEqual('Cleaned %s patches' % len(series.commits), next(lines)) self.assertEqual('Change log missing for v2', next(lines)) @@ -223,7 +230,7 @@ class TestFunctional(unittest.TestCase): self.assertEqual('', next(lines)) self.assertIn('Send a total of %d patches' % count, next(lines)) prev = next(lines) - for i, commit in enumerate(series.commits): + for i in range(len(series.commits)): self.assertEqual(' %s' % args[i], prev) while True: prev = next(lines) @@ -588,3 +595,17 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c self.assertEqual( ["Found possible blank line(s) at end of file 'lib/fdtdec.c'"], pstrm.commit.warn) + + def testTagsAfterSignoff(self): + """Test detection of tags after the signoff""" + text = '''This is a patch + +Signed-off-by: Terminator 2 +Series-changes: 2 +- A change + +''' + pstrm = PatchStream.process_text(text) + self.assertEqual( + ["Tag 'Series-changes' should be before sign-off / Change-Id"], + pstrm.commit.warn) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 1cb4d6ed0dd..75b074a0185 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -81,6 +81,8 @@ class PatchStream: self.blank_count = 0 # Number of blank lines stored up self.state = STATE_MSG_HEADER # What state are we in? self.commit = None # Current commit + self.saw_signoff = False # Found sign-off line for this commit + self.saw_change_id = False # Found Change-Id for this commit @staticmethod def process_text(text, is_comment=False): @@ -176,6 +178,9 @@ class PatchStream: self.skip_blank = True self.section = [] + self.saw_signoff = False + self.saw_change_id = False + def _parse_version(self, value, line): """Parse a version from a *-changes tag @@ -343,6 +348,10 @@ class PatchStream: elif cover_match: name = cover_match.group(1) value = cover_match.group(2) + if self.saw_signoff or self.saw_change_id: + self._add_warn( + "Tag 'Cover-%s' should be before sign-off / Change-Id" % + name) if name == 'letter': self.in_section = 'cover' self.skip_blank = False @@ -374,6 +383,10 @@ class PatchStream: elif series_tag_match: name = series_tag_match.group(1) value = series_tag_match.group(2) + if self.saw_signoff or self.saw_change_id: + self._add_warn( + "Tag 'Series-%s' should be before sign-off / Change-Id" % + name) if name == 'changes': # value is the version number: e.g. 1, or 2 self.in_change = 'Series' @@ -385,6 +398,7 @@ class PatchStream: # Detect Change-Id tags elif change_id_match: value = change_id_match.group(1) + self.saw_change_id = True if self.is_log: if self.commit.change_id: raise ValueError( @@ -397,6 +411,10 @@ class PatchStream: elif commit_tag_match: name = commit_tag_match.group(1) value = commit_tag_match.group(2) + if self.saw_signoff or self.saw_change_id: + self._add_warn( + "Tag 'Commit-%s' should be before sign-off / Change-Id" % + name) if name == 'notes': self._add_to_commit(name) self.skip_blank = True @@ -427,6 +445,7 @@ class PatchStream: # Suppress duplicate signoffs elif signoff_match: + self.saw_signoff = True if (self.is_log or not self.commit or self.commit.CheckDuplicateSignoff(signoff_match.group(1))): out = [line] @@ -527,6 +546,8 @@ class PatchStream: re_fname = re.compile('diff --git a/(.*) b/.*') self._write_message_id(outfd) + self.saw_signoff = False + self.saw_change_id = False while True: line = infd.readline() @@ -637,6 +658,7 @@ def fix_patch(backup_dir, fname, series, cmt): infd = open(fname, 'r', encoding='utf-8') pst = PatchStream(series) pst.commit = cmt + cmt.warn = [] pst.process_stream(infd, outfd) infd.close() outfd.close() diff --git a/tools/patman/test/0001-pci-Correct-cast-for-sandbox.patch b/tools/patman/test/0001-pci-Correct-cast-for-sandbox.patch index 038943c2c9b..1efe0593fd3 100644 --- a/tools/patman/test/0001-pci-Correct-cast-for-sandbox.patch +++ b/tools/patman/test/0001-pci-Correct-cast-for-sandbox.patch @@ -14,7 +14,6 @@ cmd/pci.c:152:11: warning: format ‘%llx’ expects argument of type Fix it with a cast. -Signed-off-by: Simon Glass Commit-changes: 2 - Changes only for this commit @@ -24,6 +23,7 @@ about some things from the first commit END +Signed-off-by: Simon Glass Commit-notes: Some notes about the first commit diff --git a/tools/patman/test/0002-fdt-Correct-cast-for-sandbox-in-fdtdec_setup_mem_siz.patch b/tools/patman/test/0002-fdt-Correct-cast-for-sandbox-in-fdtdec_setup_mem_siz.patch index 56278a6ce9b..616ed4abd86 100644 --- a/tools/patman/test/0002-fdt-Correct-cast-for-sandbox-in-fdtdec_setup_mem_siz.patch +++ b/tools/patman/test/0002-fdt-Correct-cast-for-sandbox-in-fdtdec_setup_mem_siz.patch @@ -14,7 +14,6 @@ lib/fdtdec.c:1203:8: warning: format ‘%llx’ expects argument of type Fix it with a cast. -Signed-off-by: Simon Glass Series-to: u-boot Series-prefix: RFC Series-cc: Stefan Brüns @@ -40,6 +39,7 @@ This is a test of how the cover letter works END +Signed-off-by: Simon Glass --- fs/fat/fat.c | 1 + lib/efi_loader/efi_memory.c | 1 + diff --git a/tools/patman/test/test01.txt b/tools/patman/test/test01.txt index b238a8b4bab..6ef8faf66b8 100644 --- a/tools/patman/test/test01.txt +++ b/tools/patman/test/test01.txt @@ -12,7 +12,6 @@ Date: Sat Apr 15 15:39:08 2017 -0600 Fix it with a cast. - Signed-off-by: Simon Glass Commit-changes: 2 - second revision change @@ -22,6 +21,7 @@ Date: Sat Apr 15 15:39:08 2017 -0600 from the first commit END + Signed-off-by: Simon Glass Commit-notes: Some notes about the first commit @@ -41,7 +41,6 @@ Date: Sat Apr 15 15:39:08 2017 -0600 Fix it with a cast. - Signed-off-by: Simon Glass Series-to: u-boot Series-prefix: RFC Series-cc: Stefan Brüns @@ -67,3 +66,4 @@ Date: Sat Apr 15 15:39:08 2017 -0600 letter works END + Signed-off-by: Simon Glass From patchwork Mon Oct 26 01:04:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387383 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=fCHSNbH8; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGvd4tnrz9sT6 for ; Mon, 26 Oct 2020 12:09:33 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 6D94F8253F; Mon, 26 Oct 2020 02:06:06 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="fCHSNbH8"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id BEE0E824CC; Mon, 26 Oct 2020 02:05:26 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x134.google.com (mail-il1-x134.google.com [IPv6:2607:f8b0:4864:20::134]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 8AD54824C5 for ; Mon, 26 Oct 2020 02:05:22 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x134.google.com with SMTP id y17so6763743ilg.4 for ; Sun, 25 Oct 2020 18:05:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=C5pmi88bhs/DsmjiEszIgyqGkvFuOA14kJ8OAX4AqFA=; b=fCHSNbH8sJYQddHAT8sFbgB/EfCHwPDXQUHuOwHcsh1eFJNNyRD6GXuMrnn9XIcJe8 Q/AiUsRBVR5Z/eN6HxwjgDGqwU+9ZpQ46u/RRxiiZ9O4D6pR+oyZfSK8diQLDwr7prLa NBU7DukQbw+FyAqvLiZOpHIUWKwAXUz6Ur5XE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=C5pmi88bhs/DsmjiEszIgyqGkvFuOA14kJ8OAX4AqFA=; b=SgAXrgmuv/Wt53qAEfb+dyKyJPC4GpCm6TW+cBxFp/k7lUeloxpR/lXJEBziJ/VPgi cB1Qkyl+fZepYqmHzPoPyemCks2ywKCkTz1Th8xryeQ6xJ4iGfUt/YpCQRT10VyHLquA i+V4Wu+mtbECOEW8Y2+uOh+Zx9FrDRAeJ56JBx8+YS3gItDEaBS1jofjFRaA4IhSSWjP FgvwQ46OUoPxS2ikMsQpVfV6DZNYUuyvcntASXWJPQGJU4/U4RdMKvIVhPzPcMbierC7 zQXpv4Z7hi6c0GxRjxNDzBZ+LbXHjfkA13Qtco+FKDZArKnvWC59q0LQtrZGJ4HpfVKQ bfDw== X-Gm-Message-State: AOAM5338g1O3MhSfaxcSMGwBUF9lNlQ1xxTzL6jna1GUVV/cCovKUdFH huzm0jz3x+hsiE6hlzeXhouNEG3s90/XoVja X-Google-Smtp-Source: ABdhPJxkgwU0OgrDM9nntUqULxkX5bDaNHRIUohdIY0u4/9VvY8H4HTFy97Y6Jtitc8KVx3x7km47A== X-Received: by 2002:a92:d6cf:: with SMTP id z15mr9517938ilp.82.1603674321245; Sun, 25 Oct 2020 18:05:21 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:20 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 22/30] patman: Fix spelling of plural for warning Date: Sun, 25 Oct 2020 19:04:34 -0600 Message-Id: <20201026010442.1606893-23-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Tidy up the extra 's' when there is only a single warning. Fix the empty print statement also. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/func_test.py | 5 +++-- tools/patman/patchstream.py | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 5732c674817..702ec407b7f 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -216,10 +216,11 @@ class TestFunctional(unittest.TestCase): os.remove(cc_file) lines = iter(out[0].getvalue().splitlines()) - self.assertIn('1 warnings for', next(lines)) + self.assertIn('1 warning for', next(lines)) self.assertEqual( - "\t Tag 'Commit-notes' should be before sign-off / Change-Id", + "\tTag 'Commit-notes' should be before sign-off / Change-Id", next(lines)) + self.assertEqual('', next(lines)) self.assertEqual('Cleaned %s patches' % len(series.commits), next(lines)) self.assertEqual('Change log missing for v2', next(lines)) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 75b074a0185..b88a546b863 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -687,12 +687,13 @@ def fix_patches(series, fnames): cmt.count = count result = fix_patch(backup_dir, fname, series, cmt) if result: - print('%d warnings for %s:' % (len(result), fname)) + print('%d warning%s for %s:' % + (len(result), 's' if len(result) > 1 else '', fname)) for warn in result: - print('\t', warn) - print + print('\t%s' % warn) + print() count += 1 - print('Cleaned %d patches' % count) + print('Cleaned %d patche%s' % (count, 's' if count > 1 else '')) def insert_cover_letter(fname, series, count): """Inserts a cover letter with the required info into patch 0 From patchwork Mon Oct 26 01:04:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387382 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=nhmAZvz2; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGvS61PJz9sTD for ; Mon, 26 Oct 2020 12:09:24 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id E5E248253C; Mon, 26 Oct 2020 02:06:04 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="nhmAZvz2"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 28624824C3; Mon, 26 Oct 2020 02:05:26 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x129.google.com (mail-il1-x129.google.com [IPv6:2607:f8b0:4864:20::129]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 6A23482495 for ; Mon, 26 Oct 2020 02:05:23 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x129.google.com with SMTP id n5so6738411ile.7 for ; Sun, 25 Oct 2020 18:05:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HcotzKgMdeuMoWAVkHV+hTrul0r8ZEH/D+j3bQgsG7s=; b=nhmAZvz2dwznFsdx2hqpYmS0MKCFHDGqqZUrwFX2jfr0tl3hf8oemuqR/wmfe/yxhR iUjzPP05rbEMCHOCXU/v2/M++kVfWy6GKjkKsSGwEdGGpGnP5I8agJh5Ie9Jbo5EEb1a qcjuNY4lAXgCZkaYDYbqEXdyasNsmLB5W5YaQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HcotzKgMdeuMoWAVkHV+hTrul0r8ZEH/D+j3bQgsG7s=; b=hEDdkYIdK4h1hA6sltTUXh4zpMEQRRamnSw0Bom2LQyyocA+dBHKgWfVybNZEeW0iu mnxKNL8U8b0j9MY97STmeyE6YnPUh/ObZcAJMDlcCtPJS4llbDClGjxL4rp2s06em1kY iH8rR2DAzH0QXDiMfj4VHs03rvP21Bx3N6CaQXFOjeoxgcs2xTeQZXQzb68Z/9P1D2HK pIz2Dl3O7BFr1x0pYJgu6xajOzhOIrdi1UskiJ6el6UEMLn5wbLQbDgoGoXOMcUX5HKK 0kqnV9z2SVgqu25S3RRJglDRkXIeulAIb6OrwHBDp5w/z/ZiTk7GNsc1sDF3dDVEH2Eb d7Rg== X-Gm-Message-State: AOAM530/hrTxdCwmNUSIyyhZ1xVCC7T/I6akbLbc/EavMYMpDxhva1tz So4DHjHnoElUZ/wDBRk1I16JPuw2b5lDj8fc X-Google-Smtp-Source: ABdhPJx/x2iJ9WgPRx5JiXQ4WE2XZvW9coK54ql44Nf9ntv+35bq/V3u1vNaPnEGzGBqmwxFpaSwCA== X-Received: by 2002:a05:6e02:970:: with SMTP id q16mr8878666ilt.69.1603674322147; Sun, 25 Oct 2020 18:05:22 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:21 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 23/30] patman: Don't ignore lines starting with hash Date: Sun, 25 Oct 2020 19:04:35 -0600 Message-Id: <20201026010442.1606893-24-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean These lines can indicate a continuation of an error and should not be ignored. Fix this. Fixes: 666eb15e923 ("patman: Handle checkpatch output with notes and code") Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/checkpatch.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/patman/checkpatch.py b/tools/patman/checkpatch.py index 263bac3fc90..98d962cd50d 100644 --- a/tools/patman/checkpatch.py +++ b/tools/patman/checkpatch.py @@ -95,6 +95,7 @@ def CheckPatch(fname, verbose=False, show_types=False): re_check = re.compile('CHECK:%s (.*)' % type_name) re_file = re.compile('#\d+: FILE: ([^:]*):(\d+):') re_note = re.compile('NOTE: (.*)') + re_new_file = re.compile('new file mode .*') indent = ' ' * 6 for line in result.stdout.splitlines(): if verbose: @@ -111,8 +112,10 @@ def CheckPatch(fname, verbose=False, show_types=False): # Skip lines which quote code if line.startswith(indent): continue - # Skip code quotes and # - if line.startswith('+') or line.startswith('#'): + # Skip code quotes + if line.startswith('+'): + continue + if re_new_file.match(line): continue match = re_stats_full.match(line) if not match: From patchwork Mon Oct 26 01:04:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387384 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=EGrsG73J; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGvp0ZScz9sTK for ; Mon, 26 Oct 2020 12:09:41 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 41D2882543; Mon, 26 Oct 2020 02:06:08 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="EGrsG73J"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5BAF9824CC; Mon, 26 Oct 2020 02:05:27 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x141.google.com (mail-il1-x141.google.com [IPv6:2607:f8b0:4864:20::141]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 3FB50824BB for ; Mon, 26 Oct 2020 02:05:24 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x141.google.com with SMTP id c11so3697116iln.9 for ; Sun, 25 Oct 2020 18:05:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=8sgfmPocRlL6E71LMJMhPd1+DaUWASX2FEb7IJ6IDwk=; b=EGrsG73J9VS8DxnJlvhPydzyx2T3Ln8DcdP+Bemar4VFqQcX/ypttnb8HHOrO6vc2V BUlYEI1ZdKNMEL++Zlqzvjve99zGA7zV003z+3LZnUQApOq4PLrQy9tBdM1Y0Luwwqng In9bPmCWxyEgQuR9//wjqZGAzDR7q6SBDDKBk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8sgfmPocRlL6E71LMJMhPd1+DaUWASX2FEb7IJ6IDwk=; b=B7F2Xt5ZDEH6GnfLQPfE5Qa3jCEcS4Tf/fKbusbBzWPLAKqn8jMzM+r4flMYPTPcM+ rN5x3LozkWD6L3Aq5d6rvvIH86AFlf9ZaM+ANiV35BAgUy2RWRiLiJrI9bfPKoLwrCM8 q5D8tMhlVPBOvkHlEFStzBg4XQwVLqJQzxO0G1PzhaQ8hp3FndYJ3P+mPmkocBSCm1C6 hh+pdkYXw2wx/C8mKA/H7zUJBplCFuM2aNTn23FiAjV2cNsb7cJB6dB3UcgsaG01X1Zw omQ+gGMnMe9WwP3FvUEs0vbBhNOL4UWSWEBClKCGKYK46sjCA5QJP77UnOaOfPJWKmNe eylQ== X-Gm-Message-State: AOAM532jMCdahRyQDrr2KxOdkpdxUE8PsS0KfsfVbkNy+dA9b1P20cR9 GGoNOOVtqw0Hg9NT9WZZ7cxtZbUPBI+ezmBT X-Google-Smtp-Source: ABdhPJzlzxcDJc5PpKWEQFGzOg9KrWpE8ieh2LWInfRTJcdnSnZpMG+Fe3FSz8LBzsti5UnkGxIAhQ== X-Received: by 2002:a92:6410:: with SMTP id y16mr8763083ilb.126.1603674323048; Sun, 25 Oct 2020 18:05:23 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:22 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 24/30] patman: Allow showing a Commit as a string Date: Sun, 25 Oct 2020 19:04:36 -0600 Message-Id: <20201026010442.1606893-25-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Use the subject of the Commit object when printing it out. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/commit.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/patman/commit.py b/tools/patman/commit.py index e49bf87dfc8..5bf2b940299 100644 --- a/tools/patman/commit.py +++ b/tools/patman/commit.py @@ -41,6 +41,9 @@ class Commit: self.rtags = collections.defaultdict(set) self.warn = [] + def __str__(self): + return self.subject + def AddChange(self, version, info): """Add a new change line to the change list for a version. From patchwork Mon Oct 26 01:04:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387386 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=TcfgiQU+; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGvy3PRwz9sTD for ; Mon, 26 Oct 2020 12:09:50 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id C2875824AD; Mon, 26 Oct 2020 02:06:09 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="TcfgiQU+"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 19513824CC; Mon, 26 Oct 2020 02:05:28 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x142.google.com (mail-il1-x142.google.com [IPv6:2607:f8b0:4864:20::142]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 4B0F0824C9 for ; Mon, 26 Oct 2020 02:05:25 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x142.google.com with SMTP id x20so1404397ilj.8 for ; Sun, 25 Oct 2020 18:05:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=IrLYfm/+zqMLz6UVxXAm4ULdwUxpSwUFBi84wJ4tZUk=; b=TcfgiQU+87lnTzIi4xZi2UQJv9cFgNS4jo1GFMREXAs6wUkIIxaiEXrpTCPg4DV1n9 2sIMMBUYvBo5We39LSU8k0hQwAf/7b1EXAa/WhpxfTUFlOv4YOohO1qunu9PbJaf/Qb/ 6Y0YdMnKqYezED/JiBBO/LANAAifPmhX9Y4Z4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IrLYfm/+zqMLz6UVxXAm4ULdwUxpSwUFBi84wJ4tZUk=; b=roQbmWmuikEqYnUuIBMYZmNwdbxhHF8Pwt8Y1cBx9qf7F3NM1rlv80Z6AoqQWDTlLH IEiguzIbqBK3yT/Qi5TmBJn7XkhdvEz2LJJDfU2EQttxcsaRIwrQHn1+zWlZgCTNcqk4 fVBsARB0G7BRG3KylOf9Ivf78Bnbl+F/XJyu0PhF9LQvzA/nUwY3DWeHGsOWMf9ABwJh 6jCN1BvbFie/p/3lNjzXlinDSNh8W3tvF2aOFk+zeDf2V37k++zbA/ql4iXZ4/ZfZCqw 4dPvSBL/M8lP16vFmhMvav4idttEjz6sdjudnab6mOVSNWxs1tTMKM+oy2bQA0XyvLU7 1snw== X-Gm-Message-State: AOAM531ZwJd66tTrYI23THSqALZdemqCG7GP3e3FCjpiXpGzom4qpleZ xPiszlRE5in5nWP+xO8bJJ0fvIi/YHtQWbCJ X-Google-Smtp-Source: ABdhPJzX7zG/BannKKg/ZfdCLmFG21Bz+ydCDD0Y0uPvUNtO7krVQ88FD0F45YwrDU63Pa8IBqa1DA== X-Received: by 2002:a92:9641:: with SMTP id g62mr8011971ilh.166.1603674323859; Sun, 25 Oct 2020 18:05:23 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:23 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 25/30] patman: Improve handling of files Date: Sun, 25 Oct 2020 19:04:37 -0600 Message-Id: <20201026010442.1606893-26-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Sometimes warnings are associated with a file and sometimes with the patch as a whole. Update the regular expression to handle both cases, even in emacs mode. Also add support for detecting new files. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/checkpatch.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tools/patman/checkpatch.py b/tools/patman/checkpatch.py index 98d962cd50d..63a8e37e8c5 100644 --- a/tools/patman/checkpatch.py +++ b/tools/patman/checkpatch.py @@ -93,7 +93,7 @@ def CheckPatch(fname, verbose=False, show_types=False): re_error = re.compile('ERROR:%s (.*)' % type_name) re_warning = re.compile(emacs_prefix + 'WARNING:%s (.*)' % type_name) re_check = re.compile('CHECK:%s (.*)' % type_name) - re_file = re.compile('#\d+: FILE: ([^:]*):(\d+):') + re_file = re.compile('#(\d+): (FILE: ([^:]*):(\d+):)?') re_note = re.compile('NOTE: (.*)') re_new_file = re.compile('new file mode .*') indent = ' ' * 6 @@ -153,8 +153,13 @@ def CheckPatch(fname, verbose=False, show_types=False): item['msg'] = check_match.group(2) item['type'] = 'check' elif file_match: - item['file'] = file_match.group(1) - item['line'] = int(file_match.group(2)) + err_fname = file_match.group(3) + if err_fname: + item['file'] = err_fname + item['line'] = int(file_match.group(4)) + else: + item['file'] = '' + item['line'] = int(file_match.group(1)) elif subject_match: item['file'] = '' item['line'] = None From patchwork Mon Oct 26 01:04:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387387 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=X5vSri4m; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGw71vl6z9sTD for ; Mon, 26 Oct 2020 12:09:59 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 169DD82552; Mon, 26 Oct 2020 02:06:11 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="X5vSri4m"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 4AD37824DA; Mon, 26 Oct 2020 02:05:29 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd30.google.com (mail-io1-xd30.google.com [IPv6:2607:f8b0:4864:20::d30]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 72594824C2 for ; Mon, 26 Oct 2020 02:05:26 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd30.google.com with SMTP id z5so8379524iob.1 for ; Sun, 25 Oct 2020 18:05:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=m9GdrsVF10tlVVcF/LZGFRN7LiWrIX244W9b/rZMO6E=; b=X5vSri4mRgh9/VmV1bUkjc2ydk/0yMbEAN1Abka1RzDEqfOhM8065VG9S75qw3OYyD Y59zUsW859CxeXBj1QvM0GgQl8SLC+DJyVcsaFALDJJbltiU4R1I7oekX2myOcaFHwKz nxlN5Lr2MmhQn7D+HK5GE3m5Tucw/iIA/We6I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=m9GdrsVF10tlVVcF/LZGFRN7LiWrIX244W9b/rZMO6E=; b=i7MwITD3+rUVUMD6Pa7/gTBCofyiyQlH3nnqSZ+nIhuuzztUEaycCgGy2T4xHXjEIL fpFRMw165vTQBEA+30NknSSmDUmZgAiTioi1LZ07fairT0PgmmAdJ92w499J7yL5meJr nESgoYvRUsPlhEcvTvlcJF1COvJPqBJ7xANUvES1Aq2rDlDmC83cQ7inNH/pJYx9ya6z XNQ8ZO699k0Eio6m8s9cOyyHBx37iA0CdSLb7xW23IE/FVYgMeTBGOhZHkyFKG89eBID EThpufGv+wcZdxyxWIlt50mazGyaEVQwlp8HwLJFV5S5tpxCvL61WIL6S0IO5XKEhw3q wLug== X-Gm-Message-State: AOAM532yushequriw6O4iHiXwCAdsDqaNXt19wambo/J5tm4do1+HukR sa+eNZauAzqZp4bo/T8twTkfRhojRiQfJVyr X-Google-Smtp-Source: ABdhPJzzdTZZ4FQz/v6mIcju9jBOHNH7BQtx+ub75z8CPBo6TPIi+q16cZfemGQeOup5T3hiyb5K6g== X-Received: by 2002:a05:6638:2603:: with SMTP id m3mr2158942jat.43.1603674325198; Sun, 25 Oct 2020 18:05:25 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:24 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 26/30] patman: Detect missing upstream in CountCommitsToBranch Date: Sun, 25 Oct 2020 19:04:38 -0600 Message-Id: <20201026010442.1606893-27-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean At present if we fail to find the upstream then the error output is piped to wc, resulting in bogus results. Avoid the pipe and check the output directly. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/func_test.py | 19 +++++++++++++++++++ tools/patman/gitutil.py | 10 +++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 702ec407b7f..56181f8bbaa 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -610,3 +610,22 @@ Series-changes: 2 self.assertEqual( ["Tag 'Series-changes' should be before sign-off / Change-Id"], pstrm.commit.warn) + + @unittest.skipIf(not HAVE_PYGIT2, 'Missing python3-pygit2') + def testNoUpstream(self): + """Test CountCommitsToBranch when there is no upstream""" + repo = self.make_git_tree() + target = repo.lookup_reference('refs/heads/base') + self.repo.checkout(target, strategy=pygit2.GIT_CHECKOUT_FORCE) + + # Check that it can detect the current branch + try: + orig_dir = os.getcwd() + os.chdir(self.gitdir) + with self.assertRaises(ValueError) as exc: + gitutil.CountCommitsToBranch(None) + self.assertIn( + "Failed to determine upstream: fatal: no upstream configured for branch 'base'", + str(exc.exception)) + finally: + os.chdir(orig_dir) diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py index 27a0a9fbc1f..3a2366bcf59 100644 --- a/tools/patman/gitutil.py +++ b/tools/patman/gitutil.py @@ -66,9 +66,13 @@ def CountCommitsToBranch(branch): rev_range = '%s..%s' % (us, branch) else: rev_range = '@{upstream}..' - pipe = [LogCmd(rev_range, oneline=True), ['wc', '-l']] - stdout = command.RunPipe(pipe, capture=True, oneline=True).stdout - patch_count = int(stdout) + pipe = [LogCmd(rev_range, oneline=True)] + result = command.RunPipe(pipe, capture=True, capture_stderr=True, + oneline=True, raise_on_error=False) + if result.return_code: + raise ValueError('Failed to determine upstream: %s' % + result.stderr.strip()) + patch_count = len(result.stdout.splitlines()) return patch_count def NameRevision(commit_hash): From patchwork Mon Oct 26 01:04:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387390 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=HiyTN8+T; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGwV3JWFz9sTD for ; Mon, 26 Oct 2020 12:10:18 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 717E78254E; Mon, 26 Oct 2020 02:06:14 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="HiyTN8+T"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 2F923824C3; Mon, 26 Oct 2020 02:05:34 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x142.google.com (mail-il1-x142.google.com [IPv6:2607:f8b0:4864:20::142]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 5A3FC824C3 for ; Mon, 26 Oct 2020 02:05:28 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x142.google.com with SMTP id y17so6763863ilg.4 for ; Sun, 25 Oct 2020 18:05:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vspGoe42kEVGx5NnRtRwai2Umac3rj0/lwRZ8X+bebc=; b=HiyTN8+TtUKKUNIUFA4uIMav/3MeSia2CvXY/c9COFnMmAMoCrfUiQypzHhEl/ohru DfoqOd5nu+E7AxKWLl0ulOou3ELKf4IUby4rPTsdFJeiKYnOZDDOnq8WyQXQ23NoBfUO PcZjiQfX0D6xKigevKTjtZg7vWg7tGtygExWI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vspGoe42kEVGx5NnRtRwai2Umac3rj0/lwRZ8X+bebc=; b=Bp6GBghxw7NnviximQ/bqKrTA2nIFZbCdWQzA1dbVimwgwoQDXadLv6O/gEDIJ3h8c AdWr50WWjXScUFAAaXHJZc9FLZYmacEP1lyGaYgwJn1lZC2vTLjyusze4kXLnXhjZqxB IUZ3zdoid5/dO9uwxS5zhl1xyi7eQ4LCh0SQb07Ih3urvMcxmN0a6LuLKxjHvJtIhLIR P5UwfZulCn5u9WHpMs4EQVjjyHve9cNFINqEBWHuUn0ejGoHoIk7knLni+T4XmJnsoU5 0AgEVpbNmSAvCSLgsqa/juj0qEw+udOyqcRNuF5uZGeQSPLEilI+l7tk/yMahymBi7Uf qUrA== X-Gm-Message-State: AOAM533Qz4Ccyr9EeeGa/34JP2pq8iHJFmK1Cjx8ueajYHN64nxmJ3DO 5QHPaN/xN4UJbkyhuE/LkoRtKxBVXsBfPGby X-Google-Smtp-Source: ABdhPJxWxK1W/AkVop/Izu9jsqIH0dUgYMLaZIgw251UcYwq2U/rYJGqauHqd+kluk0k0o9s+5xPSA== X-Received: by 2002:a92:badd:: with SMTP id t90mr9804359ill.167.1603674326136; Sun, 25 Oct 2020 18:05:26 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:25 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 27/30] patman: Support checking for review tags in patchwork Date: Sun, 25 Oct 2020 19:04:39 -0600 Message-Id: <20201026010442.1606893-28-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Before sending out a new version of a series for review, it is important to add any review tags (e.g. Reviewed-by, Acked-by) collected by patchwork. Otherwise people waste time reviewing the same patch repeatedly, become frustrated and stop reviewing your patches. To help with this, add a new 'status' subcommand that checks patchwork for review tags, showing those which are not present in the local branch. This allows users to see what new review tags have been received and then add them. Sample output: $ patman status 1 Subject 1 Reviewed-by: Joe Bloggs 2 Subject 2 Tested-by: Lord Edmund Blackaddër Reviewed-by: Fred Bloggs + Reviewed-by: Mary Bloggs 1 new response available in patchwork The '+' indicates a new tag. Colours are used to make it easier to read. Signed-off-by: Simon Glass --- Changes in v2: - Adjust the algorithm to handle patch/commit mismatch - Correct Python style problems - Use REST API instead of web pages tools/patman/README | 34 ++++ tools/patman/control.py | 46 +++++ tools/patman/func_test.py | 315 +++++++++++++++++++++++++++++++++ tools/patman/main.py | 18 ++ tools/patman/status.py | 356 ++++++++++++++++++++++++++++++++++++++ tools/patman/terminal.py | 21 ++- 6 files changed, 784 insertions(+), 6 deletions(-) create mode 100644 tools/patman/status.py diff --git a/tools/patman/README b/tools/patman/README index 54036e1de4a..db941b9d0b4 100644 --- a/tools/patman/README +++ b/tools/patman/README @@ -11,6 +11,8 @@ This tool is a Python script which: - Runs the patches through checkpatch.pl and its own checks - Optionally emails them out to selected people +It also shows review tags from Patchwork so you can update your local patches. + It is intended to automate patch creation and make it a less error-prone process. It is useful for U-Boot and Linux work so far, since it uses the checkpatch.pl script. @@ -353,6 +355,38 @@ These people will get the cover letter even if they are not on the To/Cc list for any of the patches. +Patchwork Integration +===================== + +Patman has a very basic integration with Patchwork. If you point patman to +your series on patchwork it can show you what new reviews have appears since +you sent your series. + +To set this up, add a Series-link tag to one of the commits in your series +(see above). + +Then you can type + + patman status + +and patman will show you each patch and what review tags have been collected, +for example: + +... + 21 x86: mtrr: Update the command to use the new mtrr + Reviewed-by: Wolfgang Wallner + + Reviewed-by: Bin Meng + 22 x86: mtrr: Restructure so command execution is in + Reviewed-by: Wolfgang Wallner + + Reviewed-by: Bin Meng +... + +This shows that patch 21 and 22 were sent out with one review but have since +attracted another review each. If the series needs changes, you can update +these commits with the new review tag before sending the next version of the +series. + + Example Work Flow ================= diff --git a/tools/patman/control.py b/tools/patman/control.py index 6555a4018a4..09542401983 100644 --- a/tools/patman/control.py +++ b/tools/patman/control.py @@ -175,3 +175,49 @@ def send(args): its_a_go, args.ignore_bad_tags, args.add_maintainers, args.limit, args.dry_run, args.in_reply_to, args.thread, args.smtp_server) + +def patchwork_status(branch, count, start, end): + """Check the status of patches in patchwork + + This finds the series in patchwork using the Series-link tag, checks for new + comments / review tags and displays them + + Args: + branch (str): Branch to create patches from (None = current) + count (int): Number of patches to produce, or -1 to produce patches for + the current branch back to the upstream commit + start (int): Start partch to use (0=first / top of branch) + end (int): End patch to use (0=last one in series, 1=one before that, + etc.) + + Raises: + ValueError: if the branch has no Series-link value + """ + if count == -1: + # Work out how many patches to send if we can + count = (gitutil.CountCommitsToBranch(branch) - start) + + series = patchstream.GetMetaData(branch, start, count - end) + warnings = 0 + for cmt in series.commits: + if cmt.warn: + print('%d warnings for %s:' % (len(cmt.warn), cmt.hash)) + for warn in cmt.warn: + print('\t', warn) + warnings += 1 + print + if warnings: + raise ValueError('Please fix warnings before running status') + links = series.get('links') + if not links: + raise ValueError("Branch has no Series-links value") + + # Find the link without a version number (we don't support versions yet) + found = [link for link in links.split() if not ':' in link] + if not found: + raise ValueError('Series-links has no current version (without :)') + + # Import this here to avoid failing on other commands if the dependencies + # are not present + from patman import status + status.check_patchwork_status(series, found[0]) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 56181f8bbaa..0d38cb21c01 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -13,10 +13,13 @@ import sys import tempfile import unittest + +from patman.commit import Commit from patman import control from patman import gitutil from patman import patchstream from patman.patchstream import PatchStream +from patman.series import Series from patman import settings from patman import terminal from patman import tools @@ -25,6 +28,7 @@ from patman.test_util import capture_sys_output try: import pygit2 HAVE_PYGIT2 = True + from patman import status except ModuleNotFoundError: HAVE_PYGIT2 = False @@ -36,6 +40,8 @@ class TestFunctional(unittest.TestCase): fred = 'Fred Bloggs ' joe = 'Joe Bloggs ' mary = 'Mary Bloggs ' + commits = None + patches = None def setUp(self): self.tmpdir = tempfile.mkdtemp(prefix='patman.') @@ -44,6 +50,7 @@ class TestFunctional(unittest.TestCase): def tearDown(self): shutil.rmtree(self.tmpdir) + terminal.SetPrintTestMode(False) @staticmethod def _get_path(fname): @@ -629,3 +636,311 @@ Series-changes: 2 str(exc.exception)) finally: os.chdir(orig_dir) + + @staticmethod + def _fake_patchwork(subpath): + """Fake Patchwork server for the function below + + This handles accessing a series, providing a list consisting of a + single patch + """ + re_series = re.match(r'series/(\d*)/$', subpath) + if re_series: + series_num = re_series.group(1) + if series_num == '1234': + return {'patches': [ + {'id': '1', 'name': 'Some patch'}]} + raise ValueError('Fake Patchwork does not understand: %s' % subpath) + + @unittest.skipIf(not HAVE_PYGIT2, 'Missing python3-pygit2') + def testStatusMismatch(self): + """Test Patchwork patches not matching the series""" + series = Series() + + with capture_sys_output() as (_, err): + status.collect_patches(series, 1234, self._fake_patchwork) + self.assertIn('Warning: Patchwork reports 1 patches, series has 0', + err.getvalue()) + + @unittest.skipIf(not HAVE_PYGIT2, 'Missing python3-pygit2') + def testStatusReadPatch(self): + """Test handling a single patch in Patchwork""" + series = Series() + series.commits = [Commit('abcd')] + + patches = status.collect_patches(series, 1234, self._fake_patchwork) + self.assertEqual(1, len(patches)) + patch = patches[0] + self.assertEqual('1', patch.id) + self.assertEqual('Some patch', patch.raw_subject) + + @unittest.skipIf(not HAVE_PYGIT2, 'Missing python3-pygit2') + def testParseSubject(self): + """Test parsing of the patch subject""" + patch = status.Patch('1') + + # Simple patch not in a series + patch.parse_subject('Testing') + self.assertEqual('Testing', patch.raw_subject) + self.assertEqual('Testing', patch.subject) + self.assertEqual(1, patch.seq) + self.assertEqual(1, patch.count) + self.assertEqual(None, patch.prefix) + self.assertEqual(None, patch.version) + + # First patch in a series + patch.parse_subject('[1/2] Testing') + self.assertEqual('[1/2] Testing', patch.raw_subject) + self.assertEqual('Testing', patch.subject) + self.assertEqual(1, patch.seq) + self.assertEqual(2, patch.count) + self.assertEqual(None, patch.prefix) + self.assertEqual(None, patch.version) + + # Second patch in a series + patch.parse_subject('[2/2] Testing') + self.assertEqual('Testing', patch.subject) + self.assertEqual(2, patch.seq) + self.assertEqual(2, patch.count) + self.assertEqual(None, patch.prefix) + self.assertEqual(None, patch.version) + + # RFC patch + patch.parse_subject('[RFC,3/7] Testing') + self.assertEqual('Testing', patch.subject) + self.assertEqual(3, patch.seq) + self.assertEqual(7, patch.count) + self.assertEqual('RFC', patch.prefix) + self.assertEqual(None, patch.version) + + # Version patch + patch.parse_subject('[v2,3/7] Testing') + self.assertEqual('Testing', patch.subject) + self.assertEqual(3, patch.seq) + self.assertEqual(7, patch.count) + self.assertEqual(None, patch.prefix) + self.assertEqual('v2', patch.version) + + # All fields + patch.parse_subject('[RESEND,v2,3/7] Testing') + self.assertEqual('Testing', patch.subject) + self.assertEqual(3, patch.seq) + self.assertEqual(7, patch.count) + self.assertEqual('RESEND', patch.prefix) + self.assertEqual('v2', patch.version) + + # RFC only + patch.parse_subject('[RESEND] Testing') + self.assertEqual('Testing', patch.subject) + self.assertEqual(1, patch.seq) + self.assertEqual(1, patch.count) + self.assertEqual('RESEND', patch.prefix) + self.assertEqual(None, patch.version) + + @unittest.skipIf(not HAVE_PYGIT2, 'Missing python3-pygit2') + def testCompareSeries(self): + """Test operation of compare_with_series()""" + commit1 = Commit('abcd') + commit1.subject = 'Subject 1' + commit2 = Commit('ef12') + commit2.subject = 'Subject 2' + commit3 = Commit('3456') + commit3.subject = 'Subject 2' + + patch1 = status.Patch('1') + patch1.subject = 'Subject 1' + patch2 = status.Patch('2') + patch2.subject = 'Subject 2' + patch3 = status.Patch('3') + patch3.subject = 'Subject 2' + + series = Series() + series.commits = [commit1] + patches = [patch1] + patch_for_commit, commit_for_patch, warnings = ( + status.compare_with_series(series, patches)) + self.assertEqual(1, len(patch_for_commit)) + self.assertEqual(patch1, patch_for_commit[0]) + self.assertEqual(1, len(commit_for_patch)) + self.assertEqual(commit1, commit_for_patch[0]) + + series.commits = [commit1] + patches = [patch1, patch2] + patch_for_commit, commit_for_patch, warnings = ( + status.compare_with_series(series, patches)) + self.assertEqual(1, len(patch_for_commit)) + self.assertEqual(patch1, patch_for_commit[0]) + self.assertEqual(1, len(commit_for_patch)) + self.assertEqual(commit1, commit_for_patch[0]) + self.assertEqual(["Cannot find commit for patch 2 ('Subject 2')"], + warnings) + + series.commits = [commit1, commit2] + patches = [patch1] + patch_for_commit, commit_for_patch, warnings = ( + status.compare_with_series(series, patches)) + self.assertEqual(1, len(patch_for_commit)) + self.assertEqual(patch1, patch_for_commit[0]) + self.assertEqual(1, len(commit_for_patch)) + self.assertEqual(commit1, commit_for_patch[0]) + self.assertEqual(["Cannot find patch for commit 2 ('Subject 2')"], + warnings) + + series.commits = [commit1, commit2, commit3] + patches = [patch1, patch2] + patch_for_commit, commit_for_patch, warnings = ( + status.compare_with_series(series, patches)) + self.assertEqual(2, len(patch_for_commit)) + self.assertEqual(patch1, patch_for_commit[0]) + self.assertEqual(patch2, patch_for_commit[1]) + self.assertEqual(1, len(commit_for_patch)) + self.assertEqual(commit1, commit_for_patch[0]) + self.assertEqual(["Cannot find patch for commit 3 ('Subject 2')", + "Multiple commits match patch 2 ('Subject 2'):\n" + ' Subject 2\n Subject 2'], + warnings) + + series.commits = [commit1, commit2] + patches = [patch1, patch2, patch3] + patch_for_commit, commit_for_patch, warnings = ( + status.compare_with_series(series, patches)) + self.assertEqual(1, len(patch_for_commit)) + self.assertEqual(patch1, patch_for_commit[0]) + self.assertEqual(2, len(commit_for_patch)) + self.assertEqual(commit1, commit_for_patch[0]) + self.assertEqual(["Multiple patches match commit 2 ('Subject 2'):\n" + ' Subject 2\n Subject 2', + "Cannot find commit for patch 3 ('Subject 2')"], + warnings) + + def _fake_patchwork2(self, subpath): + """Fake Patchwork server for the function below + + This handles accessing series, patches and comments, providing the data + in self.patches to the caller + """ + re_series = re.match(r'series/(\d*)/$', subpath) + re_patch = re.match(r'patches/(\d*)/$', subpath) + re_comments = re.match(r'patches/(\d*)/comments/$', subpath) + if re_series: + series_num = re_series.group(1) + if series_num == '1234': + return {'patches': self.patches} + elif re_patch: + patch_num = int(re_patch.group(1)) + patch = self.patches[patch_num - 1] + return patch + elif re_comments: + patch_num = int(re_comments.group(1)) + patch = self.patches[patch_num - 1] + return patch.comments + raise ValueError('Fake Patchwork does not understand: %s' % subpath) + + @unittest.skipIf(not HAVE_PYGIT2, 'Missing python3-pygit2') + def testFindNewResponses(self): + """Test operation of find_new_responses()""" + commit1 = Commit('abcd') + commit1.subject = 'Subject 1' + commit2 = Commit('ef12') + commit2.subject = 'Subject 2' + + patch1 = status.Patch('1') + patch1.parse_subject('[1/2] Subject 1') + patch1.name = patch1.raw_subject + patch1.content = 'This is my patch content' + comment1a = {'content': 'Reviewed-by: %s\n' % self.joe} + + patch1.comments = [comment1a] + + patch2 = status.Patch('2') + patch2.parse_subject('[2/2] Subject 2') + patch2.name = patch2.raw_subject + patch2.content = 'Some other patch content' + comment2a = { + 'content': 'Reviewed-by: %s\nTested-by: %s\n' % + (self.mary, self.leb)} + comment2b = {'content': 'Reviewed-by: %s' % self.fred} + patch2.comments = [comment2a, comment2b] + + # This test works by setting up commits and patch for use by the fake + # Rest API function _fake_patchwork2(). It calls various functions in + # the status module after setting up tags in the commits, checking that + # things behaves as expected + self.commits = [commit1, commit2] + self.patches = [patch1, patch2] + count = 2 + new_rtag_list = [None] * count + + # Check that the tags are picked up on the first patch + status.find_new_responses(new_rtag_list, 0, commit1, patch1, + self._fake_patchwork2) + self.assertEqual(new_rtag_list[0], {'Reviewed-by': {self.joe}}) + + # Now the second patch + status.find_new_responses(new_rtag_list, 1, commit2, patch2, + self._fake_patchwork2) + self.assertEqual(new_rtag_list[1], { + 'Reviewed-by': {self.mary, self.fred}, + 'Tested-by': {self.leb}}) + + # Now add some tags to the commit, which means they should not appear as + # 'new' tags when scanning comments + new_rtag_list = [None] * count + commit1.rtags = {'Reviewed-by': {self.joe}} + status.find_new_responses(new_rtag_list, 0, commit1, patch1, + self._fake_patchwork2) + self.assertEqual(new_rtag_list[0], {}) + + # For the second commit, add Ed and Fred, so only Mary should be left + commit2.rtags = { + 'Tested-by': {self.leb}, + 'Reviewed-by': {self.fred}} + status.find_new_responses(new_rtag_list, 1, commit2, patch2, + self._fake_patchwork2) + self.assertEqual(new_rtag_list[1], {'Reviewed-by': {self.mary}}) + + # Check that the output patches expectations: + # 1 Subject 1 + # Reviewed-by: Joe Bloggs + # 2 Subject 2 + # Tested-by: Lord Edmund Blackaddër + # Reviewed-by: Fred Bloggs + # + Reviewed-by: Mary Bloggs + # 1 new response available in patchwork + + series = Series() + series.commits = [commit1, commit2] + terminal.SetPrintTestMode() + status.check_patchwork_status(series, '1234', self._fake_patchwork2) + lines = iter(terminal.GetPrintTestLines()) + col = terminal.Color() + self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), + next(lines)) + self.assertEqual( + terminal.PrintLine(' Reviewed-by: ', col.GREEN, newline=False, + bright=False), + next(lines)) + self.assertEqual(terminal.PrintLine(self.joe, col.WHITE, bright=False), + next(lines)) + + self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.BLUE), + next(lines)) + self.assertEqual( + terminal.PrintLine(' Tested-by: ', col.GREEN, newline=False, + bright=False), + next(lines)) + self.assertEqual(terminal.PrintLine(self.leb, col.WHITE, bright=False), + next(lines)) + self.assertEqual( + terminal.PrintLine(' Reviewed-by: ', col.GREEN, newline=False, + bright=False), + next(lines)) + self.assertEqual(terminal.PrintLine(self.fred, col.WHITE, bright=False), + next(lines)) + self.assertEqual( + terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), + next(lines)) + self.assertEqual(terminal.PrintLine(self.mary, col.WHITE), + next(lines)) + self.assertEqual(terminal.PrintLine( + '1 new response available in patchwork', None), next(lines)) diff --git a/tools/patman/main.py b/tools/patman/main.py index d1a43c44fcd..7f4ae1125a1 100755 --- a/tools/patman/main.py +++ b/tools/patman/main.py @@ -90,6 +90,10 @@ test_parser.add_argument('testname', type=str, default=None, nargs='?', help="Specify the test to run") AddCommonArgs(test_parser) +status = subparsers.add_parser('status', + help='Check status of patches in patchwork') +AddCommonArgs(status) + # Parse options twice: first to get the project and second to handle # defaults properly (which depends on project). argv = sys.argv[1:] @@ -157,3 +161,17 @@ elif args.cmd == 'send': else: control.send(args) + +# Check status of patches in patchwork +elif args.cmd == 'status': + ret_code = 0 + try: + control.patchwork_status(args.branch, args.count, args.start, args.end) + except Exception as e: + terminal.Print('patman: %s: %s' % (type(e).__name__, e), + colour=terminal.Color.RED) + if args.debug: + print() + traceback.print_exc() + ret_code = 1 + sys.exit(ret_code) diff --git a/tools/patman/status.py b/tools/patman/status.py new file mode 100644 index 00000000000..f41b2d4c776 --- /dev/null +++ b/tools/patman/status.py @@ -0,0 +1,356 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright 2020 Google LLC +# +"""Talks to the patchwork service to figure out what patches have been reviewed +and commented on. +""" + +import collections +import concurrent.futures +from itertools import repeat +import re +import requests + +from patman.patchstream import PatchStream +from patman import terminal +from patman import tout + +# Patches which are part of a multi-patch series are shown with a prefix like +# [prefix, version, sequence], for example '[RFC, v2, 3/5]'. All but the last +# part is optional. This decodes the string into groups. For single patches +# the [] part is not present: +# Groups: (ignore, ignore, ignore, prefix, version, sequence, subject) +RE_PATCH = re.compile(r'(\[(((.*),)?(.*),)?(.*)\]\s)?(.*)$') + +# This decodes the sequence string into a patch number and patch count +RE_SEQ = re.compile(r'(\d+)/(\d+)') + +def to_int(vals): + """Convert a list of strings into integers, using 0 if not an integer + + Args: + vals (list): List of strings + + Returns: + list: List of integers, one for each input string + """ + out = [int(val) if val.isdigit() else 0 for val in vals] + return out + + +class Patch(dict): + """Models a patch in patchwork + + This class records information obtained from patchwork + + Some of this information comes from the 'Patch' column: + + [RFC,v2,1/3] dm: Driver and uclass changes for tiny-dm + + This shows the prefix, version, seq, count and subject. + + The other properties come from other columns in the display. + + Properties: + pid (str): ID of the patch (typically an integer) + seq (int): Sequence number within series (1=first) parsed from sequence + string + count (int): Number of patches in series, parsed from sequence string + raw_subject (str): Entire subject line, e.g. + "[1/2,v2] efi_loader: Sort header file ordering" + prefix (str): Prefix string or None (e.g. 'RFC') + version (str): Version string or None (e.g. 'v2') + raw_subject (str): Raw patch subject + subject (str): Patch subject with [..] part removed (same as commit + subject) + """ + def __init__(self, pid): + super().__init__() + self.id = pid # Use 'id' to match what the Rest API provides + self.seq = None + self.count = None + self.prefix = None + self.version = None + self.raw_subject = None + self.subject = None + + # These make us more like a dictionary + def __setattr__(self, name, value): + self[name] = value + + def __getattr__(self, name): + return self[name] + + def __hash__(self): + return hash(frozenset(self.items())) + + def __str__(self): + return self.raw_subject + + def parse_subject(self, raw_subject): + """Parse the subject of a patch into its component parts + + See RE_PATCH for details. The parsed info is placed into seq, count, + prefix, version, subject + + Args: + raw_subject (str): Subject string to parse + + Raises: + ValueError: the subject cannot be parsed + """ + self.raw_subject = raw_subject.strip() + mat = RE_PATCH.search(raw_subject.strip()) + if not mat: + raise ValueError("Cannot parse subject '%s'" % raw_subject) + self.prefix, self.version, seq_info, self.subject = mat.groups()[3:] + mat_seq = RE_SEQ.match(seq_info) if seq_info else False + if mat_seq is None: + self.version = seq_info + seq_info = None + if self.version and not self.version.startswith('v'): + self.prefix = self.version + self.version = None + if seq_info: + if mat_seq: + self.seq = int(mat_seq.group(1)) + self.count = int(mat_seq.group(2)) + else: + self.seq = 1 + self.count = 1 + +def compare_with_series(series, patches): + """Compare a list of patches with a series it came from + + This prints any problems as warnings + + Args: + series (Series): Series to compare against + patches (:type: list of Patch): list of Patch objects to compare with + + Returns: + tuple + dict: + key: Commit number (0...n-1) + value: Patch object for that commit + dict: + key: Patch number (0...n-1) + value: Commit object for that patch + """ + # Check the names match + warnings = [] + patch_for_commit = {} + all_patches = set(patches) + for seq, cmt in enumerate(series.commits): + pmatch = [p for p in all_patches if p.subject == cmt.subject] + if len(pmatch) == 1: + patch_for_commit[seq] = pmatch[0] + all_patches.remove(pmatch[0]) + elif len(pmatch) > 1: + warnings.append("Multiple patches match commit %d ('%s'):\n %s" % + (seq + 1, cmt.subject, + '\n '.join([p.subject for p in pmatch]))) + else: + warnings.append("Cannot find patch for commit %d ('%s')" % + (seq + 1, cmt.subject)) + + + # Check the names match + commit_for_patch = {} + all_commits = set(series.commits) + for seq, patch in enumerate(patches): + cmatch = [c for c in all_commits if c.subject == patch.subject] + if len(cmatch) == 1: + commit_for_patch[seq] = cmatch[0] + all_commits.remove(cmatch[0]) + elif len(cmatch) > 1: + warnings.append("Multiple commits match patch %d ('%s'):\n %s" % + (seq + 1, patch.subject, + '\n '.join([c.subject for c in cmatch]))) + else: + warnings.append("Cannot find commit for patch %d ('%s')" % + (seq + 1, patch.subject)) + + return patch_for_commit, commit_for_patch, warnings + +def call_rest_api(subpath): + """Call the patchwork API and return the result as JSON + + Args: + subpath (str): URL subpath to use + + Returns: + dict: Json result + + Raises: + ValueError: the URL could not be read + """ + url = 'https://patchwork.ozlabs.org/api/1.2/%s' % subpath + response = requests.get(url) + if response.status_code != 200: + raise ValueError("Could not read URL '%s'" % url) + return response.json() + +def collect_patches(series, series_id, rest_api=call_rest_api): + """Collect patch information about a series from patchwork + + Uses the Patchwork REST API to collect information provided by patchwork + about the status of each patch. + + Args: + series (Series): Series object corresponding to the local branch + containing the series + series_id (str): Patch series ID number + rest_api (function): API function to call to access Patchwork, for + testing + + Returns: + list: List of patches sorted by sequence number, each a Patch object + + Raises: + ValueError: if the URL could not be read or the web page does not follow + the expected structure + """ + data = rest_api('series/%s/' % series_id) + + # Get all the rows, which are patches + patch_dict = data['patches'] + count = len(patch_dict) + num_commits = len(series.commits) + if count != num_commits: + tout.Warning('Warning: Patchwork reports %d patches, series has %d' % + (count, num_commits)) + + patches = [] + + # Work through each row (patch) one at a time, collecting the information + warn_count = 0 + for pw_patch in patch_dict: + patch = Patch(pw_patch['id']) + patch.parse_subject(pw_patch['name']) + patches.append(patch) + if warn_count > 1: + tout.Warning(' (total of %d warnings)' % warn_count) + + # Sort patches by patch number + patches = sorted(patches, key=lambda x: x.seq) + return patches + +def find_new_responses(new_rtag_list, seq, cmt, patch, rest_api=call_rest_api): + """Find new rtags collected by patchwork that we don't know about + + This is designed to be run in parallel, once for each commit/patch + + Args: + new_rtag_list (list): New rtags are written to new_rtag_list[seq] + list, each a dict: + key: Response tag (e.g. 'Reviewed-by') + value: Set of people who gave that response, each a name/email + string + seq (int): Position in new_rtag_list to update + cmt (Commit): Commit object for this commit + patch (Patch): Corresponding Patch object for this patch + rest_api (function): API function to call to access Patchwork, for + testing + """ + if not patch: + return + + # Get the content for the patch email itself as well as all comments + data = rest_api('patches/%s/' % patch.id) + pstrm = PatchStream.process_text(data['content'], True) + + rtags = collections.defaultdict(set) + for response, people in pstrm.commit.rtags.items(): + rtags[response].update(people) + + data = rest_api('patches/%s/comments/' % patch.id) + + for comment in data: + pstrm = PatchStream.process_text(comment['content'], True) + for response, people in pstrm.commit.rtags.items(): + rtags[response].update(people) + + # Find the tags that are not in the commit + new_rtags = collections.defaultdict(set) + base_rtags = cmt.rtags + for tag, people in rtags.items(): + for who in people: + is_new = (tag not in base_rtags or + who not in base_rtags[tag]) + if is_new: + new_rtags[tag].add(who) + new_rtag_list[seq] = new_rtags + +def show_responses(rtags, indent, is_new): + """Show rtags collected + + Args: + rtags (dict): review tags to show + key: Response tag (e.g. 'Reviewed-by') + value: Set of people who gave that response, each a name/email string + indent (str): Indentation string to write before each line + is_new (bool): True if this output should be highlighted + + Returns: + int: Number of review tags displayed + """ + col = terminal.Color() + count = 0 + for tag, people in rtags.items(): + for who in people: + terminal.Print(indent + '%s %s: ' % ('+' if is_new else ' ', tag), + newline=False, colour=col.GREEN, bright=is_new) + terminal.Print(who, colour=col.WHITE, bright=is_new) + count += 1 + return count + +def check_patchwork_status(series, series_id, rest_api=call_rest_api): + """Check the status of a series on Patchwork + + This finds review tags and comments for a series in Patchwork, displaying + them to show what is new compared to the local series. + + Args: + series (Series): Series object for the existing branch + series_id (str): Patch series ID number + rest_api (function): API function to call to access Patchwork, for + testing + """ + patches = collect_patches(series, series_id, rest_api) + col = terminal.Color() + count = len(series.commits) + new_rtag_list = [None] * count + + patch_for_commit, _, warnings = compare_with_series(series, patches) + for warn in warnings: + tout.Warning(warn) + + patch_list = [patch_for_commit.get(c) for c in range(len(series.commits))] + + with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor: + futures = executor.map( + find_new_responses, repeat(new_rtag_list), range(count), + series.commits, patch_list, repeat(rest_api)) + for fresponse in futures: + if fresponse: + raise fresponse.exception() + + num_to_add = 0 + for seq, cmt in enumerate(series.commits): + patch = patch_for_commit.get(seq) + if not patch: + continue + terminal.Print('%3d %s' % (patch.seq, patch.subject[:50]), + colour=col.BLUE) + cmt = series.commits[seq] + base_rtags = cmt.rtags + new_rtags = new_rtag_list[seq] + + indent = ' ' * 2 + show_responses(base_rtags, indent, False) + num_to_add += show_responses(new_rtags, indent, True) + + terminal.Print("%d new response%s available in patchwork" % + (num_to_add, 's' if num_to_add != 1 else '')) diff --git a/tools/patman/terminal.py b/tools/patman/terminal.py index 60dbce3ce1f..9be03b3a6fd 100644 --- a/tools/patman/terminal.py +++ b/tools/patman/terminal.py @@ -34,14 +34,22 @@ class PrintLine: newline: True to output a newline after the text colour: Text colour to use """ - def __init__(self, text, newline, colour): + def __init__(self, text, colour, newline=True, bright=True): self.text = text self.newline = newline self.colour = colour + self.bright = bright + + def __eq__(self, other): + return (self.text == other.text and + self.newline == other.newline and + self.colour == other.colour and + self.bright == other.bright) def __str__(self): - return 'newline=%s, colour=%s, text=%s' % (self.newline, self.colour, - self.text) + return ("newline=%s, colour=%s, bright=%d, text='%s'" % + (self.newline, self.colour, self.bright, self.text)) + def CalcAsciiLen(text): """Calculate the length of a string, ignoring any ANSI sequences @@ -136,7 +144,7 @@ def Print(text='', newline=True, colour=None, limit_to_line=False, bright=True): global last_print_len if print_test_mode: - print_test_list.append(PrintLine(text, newline, colour)) + print_test_list.append(PrintLine(text, colour, newline, bright)) else: if colour: col = Color() @@ -159,11 +167,12 @@ def PrintClear(): print('\r%s\r' % (' '* last_print_len), end='', flush=True) last_print_len = None -def SetPrintTestMode(): +def SetPrintTestMode(enable=True): """Go into test mode, where all printing is recorded""" global print_test_mode - print_test_mode = True + print_test_mode = enable + GetPrintTestLines() def GetPrintTestLines(): """Get a list of all lines output through Print() From patchwork Mon Oct 26 01:04:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387388 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=cdVo83vG; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGwJ3pfwz9sT6 for ; Mon, 26 Oct 2020 12:10:08 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id C05EE82557; Mon, 26 Oct 2020 02:06:12 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="cdVo83vG"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 6B9E9824EC; Mon, 26 Oct 2020 02:05:32 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x141.google.com (mail-il1-x141.google.com [IPv6:2607:f8b0:4864:20::141]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 818E7824D5 for ; Mon, 26 Oct 2020 02:05:28 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x141.google.com with SMTP id n5so6738546ile.7 for ; Sun, 25 Oct 2020 18:05:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=EwsjkYmCla+8uofWIWouReZ0z1t4Rj5jtipR81KIOrs=; b=cdVo83vGdbcvxxzVvxhSiPw0a6ajWELGqtZYP8pvN78Iynf6Vt2ZC0eqwwuqvBdglo hFk+ZYUwxEjWFYFsD0vtNmpGSm+V5847+mdKNwZIg4Xvh6r7vKwOkHgF2vCipsPGvw8v XxhcYUihCh91a5Tp715ICWTkJ13sEQBuUzwu0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EwsjkYmCla+8uofWIWouReZ0z1t4Rj5jtipR81KIOrs=; b=k/pW3IECpm+k2pxVcIblunTXQvJuFAAC+LN43Y3Da0z4HhdYKTzK39josXL074B95j l/rT6Xe0rR47L6GpPzR4uGbRkpm/aty/eN081+388793xv6eq9nyB4T1u3xaIOF1A7Xg bvIaGgvuT4ouwd48gDNkbOTB+yuB2RPdK8zMzhzoh53YwCLejxucoLvsvqovtldjA0/n HSsJZ5THtIq0WV0ATc1P+LW8jiaTy0JUwudX4zuzxZm7sVjNlrEbBy3GaKaGizKJqstK 3LOYbVdcyI1M1LvaHIpAkL20m0QS0arL624/wGcSQ3G9jHiLFm1WwB2x1U36ffELBQYD 2fBA== X-Gm-Message-State: AOAM5300IO1+9XQAAd0ozzdpOkGDsgHneEVO1RiY5QQprwhXCVygXyPh 6Z1J6xfWQNh6VqTeaaufk7uDttxX7oKVJ59B X-Google-Smtp-Source: ABdhPJx98/kweAC18XEAriwyFM9FoTy3A6JszGMwZoJKYi/dNrqj+wEGYmU4uwBSQI1RlSM7bABUYA== X-Received: by 2002:a92:8506:: with SMTP id f6mr7166080ilh.175.1603674326993; Sun, 25 Oct 2020 18:05:26 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:26 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 28/30] patman: Support updating a branch with review tags Date: Sun, 25 Oct 2020 19:04:40 -0600 Message-Id: <20201026010442.1606893-29-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean It is tedious to add review tags into the local branch and errors can sometimes be made. Add an option to create a new branch with the review tags obtained from patchwork. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/README | 17 ++++++- tools/patman/control.py | 9 ++-- tools/patman/func_test.py | 100 +++++++++++++++++++++++++++++++++++++- tools/patman/main.py | 7 ++- tools/patman/status.py | 89 +++++++++++++++++++++++++++++++-- 5 files changed, 210 insertions(+), 12 deletions(-) diff --git a/tools/patman/README b/tools/patman/README index db941b9d0b4..d99bfb3127b 100644 --- a/tools/patman/README +++ b/tools/patman/README @@ -11,11 +11,13 @@ This tool is a Python script which: - Runs the patches through checkpatch.pl and its own checks - Optionally emails them out to selected people -It also shows review tags from Patchwork so you can update your local patches. +It also has some Patchwork features: +- shows review tags from Patchwork so you can update your local patches +- pulls these down into a new branch on request It is intended to automate patch creation and make it a less error-prone process. It is useful for U-Boot and Linux work so far, -since it uses the checkpatch.pl script. +since they use the checkpatch.pl script. It is configured almost entirely by tags it finds in your commits. This means that you can work on a number of different branches at @@ -386,6 +388,17 @@ attracted another review each. If the series needs changes, you can update these commits with the new review tag before sending the next version of the series. +To automatically pull into these tags into a new branch, use the -d option: + + patman status -d mtrr4 + +This will create a new 'mtrr4' branch which is the same as your current branch +but has the new review tags in it. You can check that this worked with: + + patman -b mtrr4 status + +which should show that there are no new responses compared to this new branch. + Example Work Flow ================= diff --git a/tools/patman/control.py b/tools/patman/control.py index 09542401983..5ccf46570bd 100644 --- a/tools/patman/control.py +++ b/tools/patman/control.py @@ -176,11 +176,11 @@ def send(args): args.limit, args.dry_run, args.in_reply_to, args.thread, args.smtp_server) -def patchwork_status(branch, count, start, end): +def patchwork_status(branch, count, start, end, dest_branch, force): """Check the status of patches in patchwork This finds the series in patchwork using the Series-link tag, checks for new - comments / review tags and displays them + review tags, displays then and creates a new branch with the review tags. Args: branch (str): Branch to create patches from (None = current) @@ -189,6 +189,9 @@ def patchwork_status(branch, count, start, end): start (int): Start partch to use (0=first / top of branch) end (int): End patch to use (0=last one in series, 1=one before that, etc.) + dest_branch (str): Name of new branch to create with the updated tags + (None to not create a branch) + force (bool): With dest_branch, force overwriting an existing branch Raises: ValueError: if the branch has no Series-link value @@ -220,4 +223,4 @@ def patchwork_status(branch, count, start, end): # Import this here to avoid failing on other commands if the dependencies # are not present from patman import status - status.check_patchwork_status(series, found[0]) + status.check_patchwork_status(series, found[0], branch, dest_branch, force) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 0d38cb21c01..873cb31202b 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -911,7 +911,8 @@ Series-changes: 2 series = Series() series.commits = [commit1, commit2] terminal.SetPrintTestMode() - status.check_patchwork_status(series, '1234', self._fake_patchwork2) + status.check_patchwork_status(series, '1234', None, None, False, + self._fake_patchwork2) lines = iter(terminal.GetPrintTestLines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), @@ -943,4 +944,99 @@ Series-changes: 2 self.assertEqual(terminal.PrintLine(self.mary, col.WHITE), next(lines)) self.assertEqual(terminal.PrintLine( - '1 new response available in patchwork', None), next(lines)) + '1 new response available in patchwork (use -d to write them to a new branch)', + None), next(lines)) + + def _fake_patchwork3(self, subpath): + """Fake Patchwork server for the function below + + This handles accessing series, patches and comments, providing the data + in self.patches to the caller + """ + re_series = re.match(r'series/(\d*)/$', subpath) + re_patch = re.match(r'patches/(\d*)/$', subpath) + re_comments = re.match(r'patches/(\d*)/comments/$', subpath) + if re_series: + series_num = re_series.group(1) + if series_num == '1234': + return {'patches': self.patches} + elif re_patch: + patch_num = int(re_patch.group(1)) + patch = self.patches[patch_num - 1] + return patch + elif re_comments: + patch_num = int(re_comments.group(1)) + patch = self.patches[patch_num - 1] + return patch.comments + raise ValueError('Fake Patchwork does not understand: %s' % subpath) + + @unittest.skipIf(not HAVE_PYGIT2, 'Missing python3-pygit2') + def testCreateBranch(self): + """Test operation of create_branch()""" + repo = self.make_git_tree() + branch = 'first' + dest_branch = 'first2' + count = 2 + gitdir = os.path.join(self.gitdir, '.git') + + # Set up the test git tree. We use branch 'first' which has two commits + # in it + series = patchstream.get_metadata_for_list(branch, gitdir, count) + self.assertEqual(2, len(series.commits)) + + patch1 = status.Patch('1') + patch1.parse_subject('[1/2] %s' % series.commits[0].subject) + patch1.name = patch1.raw_subject + patch1.content = 'This is my patch content' + comment1a = {'content': 'Reviewed-by: %s\n' % self.joe} + + patch1.comments = [comment1a] + + patch2 = status.Patch('2') + patch2.parse_subject('[2/2] %s' % series.commits[1].subject) + patch2.name = patch2.raw_subject + patch2.content = 'Some other patch content' + comment2a = { + 'content': 'Reviewed-by: %s\nTested-by: %s\n' % + (self.mary, self.leb)} + comment2b = { + 'content': 'Reviewed-by: %s' % self.fred} + patch2.comments = [comment2a, comment2b] + + # This test works by setting up patches for use by the fake Rest API + # function _fake_patchwork3(). The fake patch comments above should + # result in new review tags that are collected and added to the commits + # created in the destination branch. + self.patches = [patch1, patch2] + count = 2 + + # Expected output: + # 1 i2c: I2C things + # + Reviewed-by: Joe Bloggs + # 2 spi: SPI fixes + # + Reviewed-by: Fred Bloggs + # + Reviewed-by: Mary Bloggs + # + Tested-by: Lord Edmund Blackaddër + # 4 new responses available in patchwork + # 4 responses added from patchwork into new branch 'first2' + # + + terminal.SetPrintTestMode() + status.check_patchwork_status(series, '1234', branch, dest_branch, + False, self._fake_patchwork3, repo) + lines = terminal.GetPrintTestLines() + self.assertEqual(12, len(lines)) + self.assertEqual( + "4 responses added from patchwork into new branch 'first2'", + lines[11].text) + + # Check that the destination branch has the new tags + new_series = patchstream.get_metadata_for_list(dest_branch, gitdir, + count) + self.assertEqual( + {'Reviewed-by': {self.joe}}, + new_series.commits[0].rtags) + self.assertEqual( + {'Tested-by': {self.leb}, + 'Reviewed-by': {self.fred, self.mary}}, + new_series.commits[1].rtags) diff --git a/tools/patman/main.py b/tools/patman/main.py index 7f4ae1125a1..8f139a6e3ba 100755 --- a/tools/patman/main.py +++ b/tools/patman/main.py @@ -92,6 +92,10 @@ AddCommonArgs(test_parser) status = subparsers.add_parser('status', help='Check status of patches in patchwork') +status.add_argument('-d', '--dest-branch', type=str, + help='Name of branch to create with collected responses') +status.add_argument('-f', '--force', action='store_true', + help='Force overwriting an existing branch') AddCommonArgs(status) # Parse options twice: first to get the project and second to handle @@ -166,7 +170,8 @@ elif args.cmd == 'send': elif args.cmd == 'status': ret_code = 0 try: - control.patchwork_status(args.branch, args.count, args.start, args.end) + control.patchwork_status(args.branch, args.count, args.start, args.end, + args.dest_branch, args.force) except Exception as e: terminal.Print('patman: %s: %s' % (type(e).__name__, e), colour=terminal.Color.RED) diff --git a/tools/patman/status.py b/tools/patman/status.py index f41b2d4c776..52f401e7a40 100644 --- a/tools/patman/status.py +++ b/tools/patman/status.py @@ -3,13 +3,16 @@ # Copyright 2020 Google LLC # """Talks to the patchwork service to figure out what patches have been reviewed -and commented on. +and commented on. Allows creation of a new branch based on the old but with the +review tags collected from patchwork. """ import collections import concurrent.futures from itertools import repeat import re + +import pygit2 import requests from patman.patchstream import PatchStream @@ -306,7 +309,72 @@ def show_responses(rtags, indent, is_new): count += 1 return count -def check_patchwork_status(series, series_id, rest_api=call_rest_api): +def create_branch(series, new_rtag_list, branch, dest_branch, overwrite, + repo=None): + """Create a new branch with review tags added + + Args: + series (Series): Series object for the existing branch + new_rtag_list (list): List of review tags to add, one for each commit, + each a dict: + key: Response tag (e.g. 'Reviewed-by') + value: Set of people who gave that response, each a name/email + string + branch (str): Existing branch to update + dest_branch (str): Name of new branch to create + overwrite (bool): True to force overwriting dest_branch if it exists + repo (pygit2.Repository): Repo to use (use None unless testing) + + Returns: + int: Total number of review tags added across all commits + + Raises: + ValueError: if the destination branch name is the same as the original + branch, or it already exists and @overwrite is False + """ + if branch == dest_branch: + raise ValueError( + 'Destination branch must not be the same as the original branch') + if not repo: + repo = pygit2.Repository('.') + count = len(series.commits) + new_br = repo.branches.get(dest_branch) + if new_br: + if not overwrite: + raise ValueError("Branch '%s' already exists (-f to overwrite)" % + dest_branch) + new_br.delete() + if not branch: + branch = 'HEAD' + target = repo.revparse_single('%s~%d' % (branch, count)) + repo.branches.local.create(dest_branch, target) + + num_added = 0 + for seq in range(count): + parent = repo.branches.get(dest_branch) + cherry = repo.revparse_single('%s~%d' % (branch, count - seq - 1)) + + repo.merge_base(cherry.oid, parent.target) + base_tree = cherry.parents[0].tree + + index = repo.merge_trees(base_tree, parent, cherry) + tree_id = index.write_tree(repo) + + lines = [] + if new_rtag_list[seq]: + for tag, people in new_rtag_list[seq].items(): + for who in people: + lines.append('%s: %s' % (tag, who)) + num_added += 1 + message = cherry.message.rstrip() + '\n' + '\n'.join(lines) + + repo.create_commit( + parent.name, cherry.author, cherry.committer, message, tree_id, + [parent.target]) + return num_added + +def check_patchwork_status(series, series_id, branch, dest_branch, force, + rest_api=call_rest_api, test_repo=None): """Check the status of a series on Patchwork This finds review tags and comments for a series in Patchwork, displaying @@ -315,8 +383,12 @@ def check_patchwork_status(series, series_id, rest_api=call_rest_api): Args: series (Series): Series object for the existing branch series_id (str): Patch series ID number + branch (str): Existing branch to update, or None + dest_branch (str): Name of new branch to create, or None + force (bool): True to force overwriting dest_branch if it exists rest_api (function): API function to call to access Patchwork, for testing + test_repo (pygit2.Repository): Repo to use (use None unless testing) """ patches = collect_patches(series, series_id, rest_api) col = terminal.Color() @@ -352,5 +424,14 @@ def check_patchwork_status(series, series_id, rest_api=call_rest_api): show_responses(base_rtags, indent, False) num_to_add += show_responses(new_rtags, indent, True) - terminal.Print("%d new response%s available in patchwork" % - (num_to_add, 's' if num_to_add != 1 else '')) + terminal.Print("%d new response%s available in patchwork%s" % + (num_to_add, 's' if num_to_add != 1 else '', + '' if dest_branch + else ' (use -d to write them to a new branch)')) + + if dest_branch: + num_added = create_branch(series, new_rtag_list, branch, + dest_branch, force, test_repo) + terminal.Print( + "%d response%s added from patchwork into new branch '%s'" % + (num_added, 's' if num_added != 1 else '', dest_branch)) From patchwork Mon Oct 26 01:04:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387391 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=JzH5Khwx; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGwh6P38z9sVS for ; Mon, 26 Oct 2020 12:10:28 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id C10608255C; Mon, 26 Oct 2020 02:06:15 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="JzH5Khwx"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 48387824EE; Mon, 26 Oct 2020 02:05:35 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x12d.google.com (mail-il1-x12d.google.com [IPv6:2607:f8b0:4864:20::12d]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 664E9824A8 for ; Mon, 26 Oct 2020 02:05:29 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x12d.google.com with SMTP id q1so6752733ilt.6 for ; Sun, 25 Oct 2020 18:05:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SXZ5g81lpeVc1vCdVhsmoyEwY2ywwamflm68E4FR6F8=; b=JzH5KhwxKMfcYtX6z0yT0u03hYmWNqpF0OpO/PKbxElDu4LErVfoR+C+vQxN0GgvHY Y2i9xDpgCG86SmRSwtz+qsvmJki+nRrqzK6Zh7M84dnnasBuO3UmgIXqi/F4VZ+YuXqO aNr4NmCvKFdn2F1OhWn33pYs2LpdaGuqUdhAw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SXZ5g81lpeVc1vCdVhsmoyEwY2ywwamflm68E4FR6F8=; b=j6Ur55wxcEEc7JDI24Dzp8W///MSw8AxboP0ovd8Cx0hOmA0EPDIthuI7MlTzymK98 pBinLNTH6y7bSUin8+OH504o/78wcMpOJ3+ZcgOGnFmGhXefUKKnzIoLuZxkg5ar3mmT gMquj7xoYYcSLa37nTgQbDsuT51qttcxaFlEZZU2zQlvAs9DzMRQWp3EXIZsuRwnmcEI gCv3FFKODtV9n9VS+1stjoG/4OKU2TIb5rqrNFn0wN1rltgySi1HNNeiPW9HAhCMTaDE aniDEgBt41c+OCEB9Lfg315Aj8Z/Dzr/ohkl5GHSMVW6q0IZVSLmDrXEVxzLW4T0Y5nk f7AQ== X-Gm-Message-State: AOAM533OiaAs4ApGJbbxcnwUWAirFrPaBcpxWn8EHqYjstjt+83U87Ve 69AeEkxTQ6oWZMS2egQj0tEkepzbuYzpwNTt X-Google-Smtp-Source: ABdhPJxlpDV0fp3l6EKW1R/4RzMOu9Ffn46gefkRFNO6tOMH7gb/9kh5aiSSHeX2DqyRveu2Y8Wh0A== X-Received: by 2002:a05:6e02:c:: with SMTP id h12mr9415507ilr.177.1603674328012; Sun, 25 Oct 2020 18:05:28 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:27 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 29/30] patman: Support parsing of review snippets Date: Sun, 25 Oct 2020 19:04:41 -0600 Message-Id: <20201026010442.1606893-30-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean Add support for parsing the contents of a patchwork 'patch' web page containing comments received from reviewers. This allows patman to show these comments in a simple 'snippets' format. A snippet is some quoted code plus some unquoted comments below it. Each review is from a unique person/email and can produce multiple snippets, one for each part of the code that attracts a comment. Show the file and line-number info at the top of each snippet if available. Signed-off-by: Simon Glass --- (no changes since v1) tools/patman/func_test.py | 83 ++++++++++++++++++++++++++++++++++++ tools/patman/patchstream.py | 84 +++++++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 873cb31202b..0ddd908de1f 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -1040,3 +1040,86 @@ Series-changes: 2 {'Tested-by': {self.leb}, 'Reviewed-by': {self.fred, self.mary}}, new_series.commits[1].rtags) + + def testParseSnippets(self): + """Test parsing of review snippets""" + text = '''Hi Fred, + +This is a comment from someone. + +Something else + +On some recent date, Fred wrote: +> This is why I wrote the patch +> so here it is + +Now a comment about the commit message +A little more to say + +Even more + +> diff --git a/file.c b/file.c +> Some more code +> Code line 2 +> Code line 3 +> Code line 4 +> Code line 5 +> Code line 6 +> Code line 7 +> Code line 8 +> Code line 9 + +And another comment + +> @@ -153,8 +143,13 @@ def CheckPatch(fname, show_types=False): +> further down on the file +> and more code +> +Addition here +> +Another addition here +> codey +> more codey + +and another thing in same file + +> @@ -253,8 +243,13 @@ +> with no function context + +one more thing + +> diff --git a/tools/patman/main.py b/tools/patman/main.py +> +line of code +now a very long comment in a different file +line2 +line3 +line4 +line5 +line6 +line7 +line8 +''' + pstrm = PatchStream.process_text(text, True) + self.assertEqual([], pstrm.commit.warn) + + # We expect to the filename and up to 5 lines of code context before + # each comment. The 'On xxx wrote:' bit should be removed. + self.assertEqual( + [['Hi Fred,', + 'This is a comment from someone.', + 'Something else'], + ['> This is why I wrote the patch', + '> so here it is', + 'Now a comment about the commit message', + 'A little more to say', 'Even more'], + ['> File: file.c', '> Code line 5', '> Code line 6', + '> Code line 7', '> Code line 8', '> Code line 9', + 'And another comment'], + ['> File: file.c', + '> Line: 153 / 143: def CheckPatch(fname, show_types=False):', + '> and more code', '> +Addition here', '> +Another addition here', + '> codey', '> more codey', 'and another thing in same file'], + ['> File: file.c', '> Line: 253 / 243', + '> with no function context', 'one more thing'], + ['> File: tools/patman/main.py', '> +line of code', + 'now a very long comment in a different file', + 'line2', 'line3', 'line4', 'line5', 'line6', 'line7', 'line8']], + pstrm.snippets) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index b88a546b863..0b344614c70 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -4,11 +4,13 @@ """Handles parsing a stream of commits/emails from 'git log' or other source""" +import collections import datetime import io import math import os import re +import queue import shutil import tempfile @@ -51,6 +53,12 @@ RE_SPACE_BEFORE_TAB = re.compile('^[+].* \t') # Match indented lines for changes RE_LEADING_WHITESPACE = re.compile(r'^\s') +# Detect a 'diff' line +RE_DIFF = re.compile(r'^>.*diff --git a/(.*) b/(.*)$') + +# Detect a context line, like '> @@ -153,8 +153,13 @@ CheckPatch +RE_LINE = re.compile(r'>.*@@ \-(\d+),\d+ \+(\d+),\d+ @@ *(.*)') + # States we can be in - can we use range() and still have comments? STATE_MSG_HEADER = 0 # Still in the message header STATE_PATCH_SUBJECT = 1 # In patch subject (first line of log for a commit) @@ -81,6 +89,14 @@ class PatchStream: self.blank_count = 0 # Number of blank lines stored up self.state = STATE_MSG_HEADER # What state are we in? self.commit = None # Current commit + self.snippets = [] # List of unquoted test blocks + self.cur_diff = None # Last 'diff' line seen (str) + self.cur_line = None # Last context (@@) line seen (str) + self.recent_diff= None # 'diff' line for current snippet (str) + self.recent_line= None # '@@' line for current snippet (str) + self.recent_quoted = collections.deque([], 5) + self.recent_unquoted = queue.Queue() + self.was_quoted = None self.saw_signoff = False # Found sign-off line for this commit self.saw_change_id = False # Found Change-Id for this commit @@ -180,6 +196,9 @@ class PatchStream: self.saw_signoff = False self.saw_change_id = False + self.cur_diff = None + self.recent_diff = None + self.recent_line = None def _parse_version(self, value, line): """Parse a version from a *-changes tag @@ -214,6 +233,47 @@ class PatchStream: self.commit.AddChange(self.change_version, change) self.change_lines = [] + def _finalise_snippet(self): + """Finish off a snippet and add it to the list + + This is called when we get to the end of a snippet, i.e. the we enter + the next block of quoted text: + + This is a comment from someone. + + Something else + + > Now we have some code <----- end of snippet + > more code + + Now a comment about the above code + + This adds the snippet to our list + """ + quoted_lines = [] + while self.recent_quoted: + quoted_lines.append(self.recent_quoted.popleft()) + unquoted_lines = [] + valid = False + while not self.recent_unquoted.empty(): + text = self.recent_unquoted.get() + if not (text.startswith('On ') and text.endswith('wrote:')): + unquoted_lines.append(text) + if text: + valid = True + if valid: + lines = [] + if self.recent_diff: + lines.append('> File: %s' % self.recent_diff) + if self.recent_line: + out = '> Line: %s / %s' % self.recent_line[:2] + if self.recent_line[2]: + out += ': %s' % self.recent_line[2] + lines.append(out) + lines += quoted_lines + unquoted_lines + if lines: + self.snippets.append(lines) + def process_line(self, line): """Process a single line of a patch file or commit log @@ -259,6 +319,8 @@ class PatchStream: cover_match = RE_COVER.match(line) signoff_match = RE_SIGNOFF.match(line) leading_whitespace_match = RE_LEADING_WHITESPACE.match(line) + diff_match = RE_DIFF.match(line) + line_match = RE_LINE.match(line) tag_match = None if self.state == STATE_PATCH_HEADER: tag_match = RE_TAG.match(line) @@ -462,6 +524,27 @@ class PatchStream: out = [line] self.linenum += 1 self.skip_blank = False + + if diff_match: + self.cur_diff = diff_match.group(1) + + # If this is quoted, keep recent lines + if not diff_match and self.linenum > 1 and line: + if line.startswith('>'): + if not self.was_quoted: + self._finalise_snippet() + self.recent_line = None + if not line_match: + self.recent_quoted.append(line) + self.was_quoted = True + self.recent_diff = self.cur_diff + else: + self.recent_unquoted.put(line) + self.was_quoted = False + + if line_match: + self.recent_line = line_match.groups() + if self.state == STATE_DIFFS: pass @@ -485,6 +568,7 @@ class PatchStream: def finalise(self): """Close out processing of this patch stream""" + self._finalise_snippet() self._finalise_change() self._close_commit() if self.lines_after_test: From patchwork Mon Oct 26 01:04:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1387392 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=KJDDoB9Q; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CKGwt5RJxz9sTf for ; Mon, 26 Oct 2020 12:10:38 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 287438248F; Mon, 26 Oct 2020 02:06:30 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="KJDDoB9Q"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 1C203824F7; Mon, 26 Oct 2020 02:05:37 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-il1-x132.google.com (mail-il1-x132.google.com [IPv6:2607:f8b0:4864:20::132]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id BCA01824E1 for ; Mon, 26 Oct 2020 02:05:30 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x132.google.com with SMTP id k1so6746630ilc.10 for ; Sun, 25 Oct 2020 18:05:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lwPL7IDkUQN5GHIer6qmpCtU054mcfjBStCc1H0Ze8s=; b=KJDDoB9QY9CNZNx+cibyB7lb7sHy3BM+Tu5VIy7AM3dICysG7aMLFtF0r6wrc3C8PR Rbcs4PAP7o0YxlzxmjszUeX60f8o2YVrN+rd4OzYwMWhhG7znlCJ7c69VHR8JS+K9Y+h GJtRmkeMVLqnYG0rldesdwI/P4c1nwbWizZgY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lwPL7IDkUQN5GHIer6qmpCtU054mcfjBStCc1H0Ze8s=; b=nTU/AfYq1q7V3xSYiOWSkhDlYfKnq6KdIwnKBqJWNX2HqlZ0I7T+elLifDx/TuSs1M mUIN1s+F5HaWiY4rQ+sFKmyJb4zAz4sPnVNQ+1M4Qn7YCU4lCJzgLSQ7jUkg6dDGy9s+ hOB0xt74I78RqAQh6vAyW8+sA76j1kXBCpmnyVyzqGHcgMPGrrn8736hDijHicM7JcO7 l0SuGvvqSIeoA7HSxTEpdHPYYomME4Q67ShbUpxOdNyQa+TSMVkzksJrQi3xenYh4mRd KrTS5ykQ+rafsztHzyuGVD3ZRSfZ/2/TfTBhyGCzMd6/UuWdjpIQVGH+SHry0ECHI0nd Lhxw== X-Gm-Message-State: AOAM530R/uy4btJV6/tuC/3LqKXU9QTi/RHCqn+/UGqua9ztG/X3SCjt D4k0xAgqykksU6EU8c9kUKH5PUjIvLlNtpym X-Google-Smtp-Source: ABdhPJzNBs8ih38YlyW6nByQuwTn770um5qWy72dnbzAGk7oKnR6tof2T8R+XrLrywW7RhnvFAUh5A== X-Received: by 2002:a92:5f5b:: with SMTP id t88mr9663293ilb.170.1603674329073; Sun, 25 Oct 2020 18:05:29 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id a6sm5231162ili.11.2020.10.25.18.05.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 18:05:28 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Doug Anderson , patchwork@lists.ozlabs.org, Simon Glass Subject: [PATCH v2 30/30] patman: Support listing comments from patchwork Date: Sun, 25 Oct 2020 19:04:42 -0600 Message-Id: <20201026010442.1606893-31-sjg@chromium.org> X-Mailer: git-send-email 2.29.0.rc2.309.g374f81d7ae-goog In-Reply-To: <20201026010442.1606893-1-sjg@chromium.org> References: <20201026010442.1606893-1-sjg@chromium.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean While reviewing feedback it is helpful to see the review comments on the command line to check that each has been addressed. Add an option to support that. Update the workflow documentation to describe the new features. Signed-off-by: Simon Glass --- Changes in v2: - Many changes to the whole series, including new patches - Use of REST API instead of the web site tools/patman/README | 36 +++++-- tools/patman/control.py | 11 ++- tools/patman/func_test.py | 186 +++++++++++++++++++++++++++++++++--- tools/patman/main.py | 5 +- tools/patman/patchstream.py | 7 +- tools/patman/status.py | 59 ++++++++++-- 6 files changed, 268 insertions(+), 36 deletions(-) diff --git a/tools/patman/README b/tools/patman/README index d99bfb3127b..79a9830208a 100644 --- a/tools/patman/README +++ b/tools/patman/README @@ -14,6 +14,7 @@ This tool is a Python script which: It also has some Patchwork features: - shows review tags from Patchwork so you can update your local patches - pulls these down into a new branch on request +- lists comments received on a series It is intended to automate patch creation and make it a less error-prone process. It is useful for U-Boot and Linux work so far, @@ -399,6 +400,8 @@ but has the new review tags in it. You can check that this worked with: which should show that there are no new responses compared to this new branch. +There is also a -C option to list the comments received for each patch. + Example Work Flow ================= @@ -483,17 +486,33 @@ people on the list don't see your secret info. Of course patches often attract comments and you need to make some updates. Let's say one person sent comments and you get an Acked-by: on one patch. Also, the patch on the list that you were waiting for has been merged, -so you can drop your wip commit. So you resync with upstream: +so you can drop your wip commit. + +Take a look on patchwork and find out the URL of the series. This will be +something like http://patchwork.ozlabs.org/project/uboot/list/?series=187331 +Add this to a tag in your top commit: + + Series-link: http://patchwork.ozlabs.org/project/uboot/list/?series=187331 + +You can use then patman to collect the Acked-by tag to the correct commit, +creating a new 'version 2' branch for us-cmd: + + patman status -d us-cmd2 + git checkout us-cmd2 + +You can look at the comments in Patchwork or with: + + patman status -C + +Then you can resync with upstream: git fetch origin (or whatever upstream is called) git rebase origin/master -and use git rebase -i to edit the commits, dropping the wip one. You add -the ack tag to one commit: - - Acked-by: Heiko Schocher +and use git rebase -i to edit the commits, dropping the wip one. -update the Series-cc: in the top commit: +Then update the Series-cc: in the top commit to add the person who reviewed +the v1 series: Series-cc: bfin, marex, Heiko Schocher @@ -532,7 +551,9 @@ so to send them: and it will create and send the version 2 series. -General points: + +General points +============== 1. When you change back to the us-cmd branch days or weeks later all your information is still there, safely stored in the commits. You don't need @@ -612,3 +633,4 @@ a bad thing. Simon Glass v1, v2, 19-Oct-11 revised v3 24-Nov-11 +revised v4 Independence Day 2020, with Patchwork integration diff --git a/tools/patman/control.py b/tools/patman/control.py index 5ccf46570bd..b11580c9df6 100644 --- a/tools/patman/control.py +++ b/tools/patman/control.py @@ -176,11 +176,13 @@ def send(args): args.limit, args.dry_run, args.in_reply_to, args.thread, args.smtp_server) -def patchwork_status(branch, count, start, end, dest_branch, force): +def patchwork_status(branch, count, start, end, dest_branch, force, + show_comments): """Check the status of patches in patchwork This finds the series in patchwork using the Series-link tag, checks for new - review tags, displays then and creates a new branch with the review tags. + comments and review tags, displays then and creates a new branch with the + review tags. Args: branch (str): Branch to create patches from (None = current) @@ -192,6 +194,8 @@ def patchwork_status(branch, count, start, end, dest_branch, force): dest_branch (str): Name of new branch to create with the updated tags (None to not create a branch) force (bool): With dest_branch, force overwriting an existing branch + show_comments (bool): True to display snippets from the comments + provided by reviewers Raises: ValueError: if the branch has no Series-link value @@ -223,4 +227,5 @@ def patchwork_status(branch, count, start, end, dest_branch, force): # Import this here to avoid failing on other commands if the dependencies # are not present from patman import status - status.check_patchwork_status(series, found[0], branch, dest_branch, force) + status.check_patchwork_status(series, found[0], branch, dest_branch, force, + show_comments) diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 0ddd908de1f..04bbb88e8cd 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -870,15 +870,16 @@ Series-changes: 2 self.patches = [patch1, patch2] count = 2 new_rtag_list = [None] * count + review_list = [None, None] # Check that the tags are picked up on the first patch - status.find_new_responses(new_rtag_list, 0, commit1, patch1, - self._fake_patchwork2) + status.find_new_responses(new_rtag_list, review_list, 0, commit1, + patch1, self._fake_patchwork2) self.assertEqual(new_rtag_list[0], {'Reviewed-by': {self.joe}}) # Now the second patch - status.find_new_responses(new_rtag_list, 1, commit2, patch2, - self._fake_patchwork2) + status.find_new_responses(new_rtag_list, review_list, 1, commit2, + patch2, self._fake_patchwork2) self.assertEqual(new_rtag_list[1], { 'Reviewed-by': {self.mary, self.fred}, 'Tested-by': {self.leb}}) @@ -887,16 +888,16 @@ Series-changes: 2 # 'new' tags when scanning comments new_rtag_list = [None] * count commit1.rtags = {'Reviewed-by': {self.joe}} - status.find_new_responses(new_rtag_list, 0, commit1, patch1, - self._fake_patchwork2) + status.find_new_responses(new_rtag_list, review_list, 0, commit1, + patch1, self._fake_patchwork2) self.assertEqual(new_rtag_list[0], {}) # For the second commit, add Ed and Fred, so only Mary should be left commit2.rtags = { 'Tested-by': {self.leb}, 'Reviewed-by': {self.fred}} - status.find_new_responses(new_rtag_list, 1, commit2, patch2, - self._fake_patchwork2) + status.find_new_responses(new_rtag_list, review_list, 1, commit2, + patch2, self._fake_patchwork2) self.assertEqual(new_rtag_list[1], {'Reviewed-by': {self.mary}}) # Check that the output patches expectations: @@ -911,7 +912,7 @@ Series-changes: 2 series = Series() series.commits = [commit1, commit2] terminal.SetPrintTestMode() - status.check_patchwork_status(series, '1234', None, None, False, + status.check_patchwork_status(series, '1234', None, None, False, False, self._fake_patchwork2) lines = iter(terminal.GetPrintTestLines()) col = terminal.Color() @@ -927,16 +928,16 @@ Series-changes: 2 self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.BLUE), next(lines)) self.assertEqual( - terminal.PrintLine(' Tested-by: ', col.GREEN, newline=False, + terminal.PrintLine(' Reviewed-by: ', col.GREEN, newline=False, bright=False), next(lines)) - self.assertEqual(terminal.PrintLine(self.leb, col.WHITE, bright=False), + self.assertEqual(terminal.PrintLine(self.fred, col.WHITE, bright=False), next(lines)) self.assertEqual( - terminal.PrintLine(' Reviewed-by: ', col.GREEN, newline=False, + terminal.PrintLine(' Tested-by: ', col.GREEN, newline=False, bright=False), next(lines)) - self.assertEqual(terminal.PrintLine(self.fred, col.WHITE, bright=False), + self.assertEqual(terminal.PrintLine(self.leb, col.WHITE, bright=False), next(lines)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), @@ -1023,7 +1024,7 @@ Series-changes: 2 terminal.SetPrintTestMode() status.check_patchwork_status(series, '1234', branch, dest_branch, - False, self._fake_patchwork3, repo) + False, False, self._fake_patchwork3, repo) lines = terminal.GetPrintTestLines() self.assertEqual(12, len(lines)) self.assertEqual( @@ -1041,6 +1042,7 @@ Series-changes: 2 'Reviewed-by': {self.fred, self.mary}}, new_series.commits[1].rtags) + @unittest.skipIf(not HAVE_PYGIT2, 'Missing python3-pygit2') def testParseSnippets(self): """Test parsing of review snippets""" text = '''Hi Fred, @@ -1123,3 +1125,159 @@ line8 'now a very long comment in a different file', 'line2', 'line3', 'line4', 'line5', 'line6', 'line7', 'line8']], pstrm.snippets) + + @unittest.skipIf(not HAVE_PYGIT2, 'Missing python3-pygit2') + def testReviewSnippets(self): + """Test showing of review snippets""" + def _to_submitter(who): + m_who = re.match('(.*) <(.*)>', who) + return { + 'name': m_who.group(1), + 'email': m_who.group(2) + } + + commit1 = Commit('abcd') + commit1.subject = 'Subject 1' + commit2 = Commit('ef12') + commit2.subject = 'Subject 2' + + patch1 = status.Patch('1') + patch1.parse_subject('[1/2] Subject 1') + patch1.name = patch1.raw_subject + patch1.content = 'This is my patch content' + comment1a = {'submitter': _to_submitter(self.joe), + 'content': '''Hi Fred, + +On some date Fred wrote: + +> diff --git a/file.c b/file.c +> Some code +> and more code + +Here is my comment above the above... + + +Reviewed-by: %s +''' % self.joe} + + patch1.comments = [comment1a] + + patch2 = status.Patch('2') + patch2.parse_subject('[2/2] Subject 2') + patch2.name = patch2.raw_subject + patch2.content = 'Some other patch content' + comment2a = { + 'content': 'Reviewed-by: %s\nTested-by: %s\n' % + (self.mary, self.leb)} + comment2b = {'submitter': _to_submitter(self.fred), + 'content': '''Hi Fred, + +On some date Fred wrote: + +> diff --git a/tools/patman/commit.py b/tools/patman/commit.py +> @@ -41,6 +41,9 @@ class Commit: +> self.rtags = collections.defaultdict(set) +> self.warn = [] +> +> + def __str__(self): +> + return self.subject +> + +> def AddChange(self, version, info): +> """Add a new change line to the change list for a version. +> +A comment + +Reviewed-by: %s +''' % self.fred} + patch2.comments = [comment2a, comment2b] + + # This test works by setting up commits and patch for use by the fake + # Rest API function _fake_patchwork2(). It calls various functions in + # the status module after setting up tags in the commits, checking that + # things behaves as expected + self.commits = [commit1, commit2] + self.patches = [patch1, patch2] + + # Check that the output patches expectations: + # 1 Subject 1 + # Reviewed-by: Joe Bloggs + # 2 Subject 2 + # Tested-by: Lord Edmund Blackaddër + # Reviewed-by: Fred Bloggs + # + Reviewed-by: Mary Bloggs + # 1 new response available in patchwork + + series = Series() + series.commits = [commit1, commit2] + terminal.SetPrintTestMode() + status.check_patchwork_status(series, '1234', None, None, False, True, + self._fake_patchwork2) + lines = iter(terminal.GetPrintTestLines()) + col = terminal.Color() + self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), + next(lines)) + self.assertEqual( + terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), + next(lines)) + self.assertEqual(terminal.PrintLine(self.joe, col.WHITE), next(lines)) + + self.assertEqual(terminal.PrintLine('Review: %s' % self.joe, col.RED), + next(lines)) + self.assertEqual(terminal.PrintLine(' Hi Fred,', None), next(lines)) + self.assertEqual(terminal.PrintLine('', None), next(lines)) + self.assertEqual(terminal.PrintLine(' > File: file.c', col.MAGENTA), + next(lines)) + self.assertEqual(terminal.PrintLine(' > Some code', col.MAGENTA), + next(lines)) + self.assertEqual(terminal.PrintLine(' > and more code', col.MAGENTA), + next(lines)) + self.assertEqual(terminal.PrintLine( + ' Here is my comment above the above...', None), next(lines)) + self.assertEqual(terminal.PrintLine('', None), next(lines)) + + self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.BLUE), + next(lines)) + self.assertEqual( + terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), + next(lines)) + self.assertEqual(terminal.PrintLine(self.fred, col.WHITE), + next(lines)) + self.assertEqual( + terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), + next(lines)) + self.assertEqual(terminal.PrintLine(self.mary, col.WHITE), + next(lines)) + self.assertEqual( + terminal.PrintLine(' + Tested-by: ', col.GREEN, newline=False), + next(lines)) + self.assertEqual(terminal.PrintLine(self.leb, col.WHITE), + next(lines)) + + self.assertEqual(terminal.PrintLine('Review: %s' % self.fred, col.RED), + next(lines)) + self.assertEqual(terminal.PrintLine(' Hi Fred,', None), next(lines)) + self.assertEqual(terminal.PrintLine('', None), next(lines)) + self.assertEqual(terminal.PrintLine( + ' > File: tools/patman/commit.py', col.MAGENTA), next(lines)) + self.assertEqual(terminal.PrintLine( + ' > Line: 41 / 41: class Commit:', col.MAGENTA), next(lines)) + self.assertEqual(terminal.PrintLine( + ' > + return self.subject', col.MAGENTA), next(lines)) + self.assertEqual(terminal.PrintLine( + ' > +', col.MAGENTA), next(lines)) + self.assertEqual( + terminal.PrintLine(' > def AddChange(self, version, info):', + col.MAGENTA), + next(lines)) + self.assertEqual(terminal.PrintLine( + ' > """Add a new change line to the change list for a version.', + col.MAGENTA), next(lines)) + self.assertEqual(terminal.PrintLine( + ' >', col.MAGENTA), next(lines)) + self.assertEqual(terminal.PrintLine( + ' A comment', None), next(lines)) + self.assertEqual(terminal.PrintLine('', None), next(lines)) + + self.assertEqual(terminal.PrintLine( + '4 new responses available in patchwork (use -d to write them to a new branch)', + None), next(lines)) diff --git a/tools/patman/main.py b/tools/patman/main.py index 8f139a6e3ba..c7f425522b2 100755 --- a/tools/patman/main.py +++ b/tools/patman/main.py @@ -92,6 +92,8 @@ AddCommonArgs(test_parser) status = subparsers.add_parser('status', help='Check status of patches in patchwork') +status.add_argument('-C', '--show-comments', action='store_true', + help='Show comments from each patch') status.add_argument('-d', '--dest-branch', type=str, help='Name of branch to create with collected responses') status.add_argument('-f', '--force', action='store_true', @@ -171,7 +173,8 @@ elif args.cmd == 'status': ret_code = 0 try: control.patchwork_status(args.branch, args.count, args.start, args.end, - args.dest_branch, args.force) + args.dest_branch, args.force, + args.show_comments) except Exception as e: terminal.Print('patman: %s: %s' % (type(e).__name__, e), colour=terminal.Color.RED) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 0b344614c70..798c96d9163 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -89,11 +89,12 @@ class PatchStream: self.blank_count = 0 # Number of blank lines stored up self.state = STATE_MSG_HEADER # What state are we in? self.commit = None # Current commit - self.snippets = [] # List of unquoted test blocks + # List of unquoted test blocks, each a list of str lines + self.snippets = [] self.cur_diff = None # Last 'diff' line seen (str) self.cur_line = None # Last context (@@) line seen (str) - self.recent_diff= None # 'diff' line for current snippet (str) - self.recent_line= None # '@@' line for current snippet (str) + self.recent_diff = None # 'diff' line for current snippet (str) + self.recent_line = None # '@@' line for current snippet (str) self.recent_quoted = collections.deque([], 5) self.recent_unquoted = queue.Queue() self.was_quoted = None diff --git a/tools/patman/status.py b/tools/patman/status.py index 52f401e7a40..fe48daed508 100644 --- a/tools/patman/status.py +++ b/tools/patman/status.py @@ -3,8 +3,9 @@ # Copyright 2020 Google LLC # """Talks to the patchwork service to figure out what patches have been reviewed -and commented on. Allows creation of a new branch based on the old but with the -review tags collected from patchwork. +and commented on. Provides a way to display review tags and comments. +Allows creation of a new branch based on the old but with the review tags +collected from patchwork. """ import collections @@ -123,6 +124,25 @@ class Patch(dict): self.seq = 1 self.count = 1 + +class Review: + """Represents a single review email collected in Patchwork + + Patches can attract multiple reviews. Each consists of an author/date and + a variable number of 'snippets', which are groups of quoted and unquoted + text. + """ + def __init__(self, meta, snippets): + """Create new Review object + + Args: + meta (str): Text containing review author and date + snippets (list): List of snippets in th review, each a list of text + lines + """ + self.meta = ' : '.join([line for line in meta.splitlines() if line]) + self.snippets = snippets + def compare_with_series(series, patches): """Compare a list of patches with a series it came from @@ -240,7 +260,8 @@ def collect_patches(series, series_id, rest_api=call_rest_api): patches = sorted(patches, key=lambda x: x.seq) return patches -def find_new_responses(new_rtag_list, seq, cmt, patch, rest_api=call_rest_api): +def find_new_responses(new_rtag_list, review_list, seq, cmt, patch, + rest_api=call_rest_api): """Find new rtags collected by patchwork that we don't know about This is designed to be run in parallel, once for each commit/patch @@ -251,6 +272,9 @@ def find_new_responses(new_rtag_list, seq, cmt, patch, rest_api=call_rest_api): key: Response tag (e.g. 'Reviewed-by') value: Set of people who gave that response, each a name/email string + review_list (list): New reviews are written to review_list[seq] + list, each a + List of reviews for the patch, each a Review seq (int): Position in new_rtag_list to update cmt (Commit): Commit object for this commit patch (Patch): Corresponding Patch object for this patch @@ -270,8 +294,13 @@ def find_new_responses(new_rtag_list, seq, cmt, patch, rest_api=call_rest_api): data = rest_api('patches/%s/comments/' % patch.id) + reviews = [] for comment in data: pstrm = PatchStream.process_text(comment['content'], True) + if pstrm.snippets: + submitter = comment['submitter'] + person = '%s <%s>' % (submitter['name'], submitter['email']) + reviews.append(Review(person, pstrm.snippets)) for response, people in pstrm.commit.rtags.items(): rtags[response].update(people) @@ -285,6 +314,7 @@ def find_new_responses(new_rtag_list, seq, cmt, patch, rest_api=call_rest_api): if is_new: new_rtags[tag].add(who) new_rtag_list[seq] = new_rtags + review_list[seq] = reviews def show_responses(rtags, indent, is_new): """Show rtags collected @@ -301,8 +331,9 @@ def show_responses(rtags, indent, is_new): """ col = terminal.Color() count = 0 - for tag, people in rtags.items(): - for who in people: + for tag in sorted(rtags.keys()): + people = rtags[tag] + for who in sorted(people): terminal.Print(indent + '%s %s: ' % ('+' if is_new else ' ', tag), newline=False, colour=col.GREEN, bright=is_new) terminal.Print(who, colour=col.WHITE, bright=is_new) @@ -374,7 +405,8 @@ def create_branch(series, new_rtag_list, branch, dest_branch, overwrite, return num_added def check_patchwork_status(series, series_id, branch, dest_branch, force, - rest_api=call_rest_api, test_repo=None): + show_comments, rest_api=call_rest_api, + test_repo=None): """Check the status of a series on Patchwork This finds review tags and comments for a series in Patchwork, displaying @@ -386,6 +418,7 @@ def check_patchwork_status(series, series_id, branch, dest_branch, force, branch (str): Existing branch to update, or None dest_branch (str): Name of new branch to create, or None force (bool): True to force overwriting dest_branch if it exists + show_comments (bool): True to show the comments on each patch rest_api (function): API function to call to access Patchwork, for testing test_repo (pygit2.Repository): Repo to use (use None unless testing) @@ -394,6 +427,7 @@ def check_patchwork_status(series, series_id, branch, dest_branch, force, col = terminal.Color() count = len(series.commits) new_rtag_list = [None] * count + review_list = [None] * count patch_for_commit, _, warnings = compare_with_series(series, patches) for warn in warnings: @@ -403,8 +437,8 @@ def check_patchwork_status(series, series_id, branch, dest_branch, force, with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor: futures = executor.map( - find_new_responses, repeat(new_rtag_list), range(count), - series.commits, patch_list, repeat(rest_api)) + find_new_responses, repeat(new_rtag_list), repeat(review_list), + range(count), series.commits, patch_list, repeat(rest_api)) for fresponse in futures: if fresponse: raise fresponse.exception() @@ -423,6 +457,15 @@ def check_patchwork_status(series, series_id, branch, dest_branch, force, indent = ' ' * 2 show_responses(base_rtags, indent, False) num_to_add += show_responses(new_rtags, indent, True) + if show_comments: + for review in review_list[seq]: + terminal.Print('Review: %s' % review.meta, colour=col.RED) + for snippet in review.snippets: + for line in snippet: + quoted = line.startswith('>') + terminal.Print(' %s' % line, + colour=col.MAGENTA if quoted else None) + terminal.Print() terminal.Print("%d new response%s available in patchwork%s" % (num_to_add, 's' if num_to_add != 1 else '',