From patchwork Wed Mar 8 15:36:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Arun Isaac X-Patchwork-Id: 47794 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 6354516E34; Wed, 8 Mar 2023 15:38:43 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id 3360A16E0D for ; Wed, 8 Mar 2023 15:38:42 +0000 (GMT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZvrj-0006IQ-0N; Wed, 08 Mar 2023 10:38:07 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZvrf-0006GC-HH for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:03 -0500 Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZvre-000431-TZ for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pZvre-0007p0-Ok for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#61645] [mumi v3 1/4] client: Add CLI client to search for issues. Resent-From: Arun Isaac Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 08 Mar 2023 15:38:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 61645 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 61645@debbugs.gnu.org, Ludovic =?utf-8?q?Court=C3=A8s?= Cc: Ricardo Wurmus , Arun Isaac Received: via spool by 61645-submit@debbugs.gnu.org id=B61645.167828985929994 (code B ref 61645); Wed, 08 Mar 2023 15:38:02 +0000 Received: (at 61645) by debbugs.gnu.org; 8 Mar 2023 15:37:39 +0000 Received: from localhost ([127.0.0.1]:49955 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pZvrG-0007nd-Oi for submit@debbugs.gnu.org; Wed, 08 Mar 2023 10:37:39 -0500 Received: from mugam.systemreboot.net ([139.59.75.54]:56572) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pZvrB-0007n5-3S for 61645@debbugs.gnu.org; Wed, 08 Mar 2023 10:37:37 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=systemreboot.net; s=default; h=Content-Transfer-Encoding:Content-Type: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=bqXGycyjUiMhKVUhLViu+Zbvj38z59DLmq+GIFZaPOo=; b=WGM/rn2xLuNm/FEJyiMlrdPxuH IoCRS1l4SzVqVQhEfkY02IavrBqCVNTnmZkAnIh2UKzWJGMAAxSjLI1R0B/rAU8v6hSK2eU6mYE3R 5zNjgXb54CxJXvFigh1YceFzlyfJx6GsGnJYuUVsbt96VPJTj7mpUT3jLka+mpL56yJGmr47VeIq0 DPOLmOn2Z9++kn2jSQy7DC434a2st54bWyVnYdcLqC4Ke+WAqNpOi9sdMf/agOInjCjlBNRQFuwS1 qKe7PjFWdG2Rfn24WrSqg8PzLBz0777XXrCG10sr2IvU4jKvl8P+a8Wl4xZLuvEZJeJSyB5EwAfvu u4aC40+w==; Received: from [192.168.2.1] (port=6222 helo=localhost.localdomain) by systemreboot.net with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1pZvr0-0006Dd-1c; Wed, 08 Mar 2023 21:07:23 +0530 From: Arun Isaac Date: Wed, 8 Mar 2023 15:36:55 +0000 Message-Id: <20230308153658.19929-2-arunisaac@systemreboot.net> X-Mailer: git-send-email 2.39.1 In-Reply-To: <87r0tzgyok.fsf@systemreboot.net> References: <87r0tzgyok.fsf@systemreboot.net> MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org X-getmail-retrieved-from-mailbox: Patches * mumi/client.scm: New file. * scripts/mumi.in: Import (mumi client). (show-mumi-usage): Document search subcommand. (main): Add search subcommand. * Makefile.am (SOURCES): Add mumi/client.scm. --- Makefile.am | 1 + mumi/client.scm | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ scripts/mumi.in | 8 +++- 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 mumi/client.scm diff --git a/Makefile.am b/Makefile.am index 8182fc3..a8c11a1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -49,6 +49,7 @@ SOURCES = \ mumi/messages.scm \ mumi/jobs.scm \ mumi/send-email.scm \ + mumi/client.scm \ mumi/config.scm \ mumi/debbugs.scm \ mumi/test-utils.scm \ diff --git a/mumi/client.scm b/mumi/client.scm new file mode 100644 index 0000000..e4a0123 --- /dev/null +++ b/mumi/client.scm @@ -0,0 +1,108 @@ +;;; mumi -- Mediocre, uh, mail interface +;;; Copyright © 2023 Arun Isaac +;;; +;;; This file is part of mumi. +;;; +;;; mumi is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or +;;; (at your option) any later version. +;;; +;;; mumi is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with mumi. If not, see . + +(define-module (mumi client) + #:use-module (srfi srfi-19) + #:use-module (srfi srfi-43) + #:use-module (term ansi-color) + #:use-module (web uri) + #:use-module (kolam http) + #:use-module (mumi config) + #:use-module (mumi web view utils) + #:export (search)) + +(define (git-top-level) + "Return the top-level directory of the current git repository." + (let loop ((curdir (getcwd))) + (cond + ((file-exists? (string-append curdir "/.git")) + curdir) + ((string=? curdir "/") + (error "No git top level found")) + (else + (loop (dirname curdir)))))) + +(define (client-config-directory) + "Return client configuration directory." + (string-append (git-top-level) "/.mumi")) + +(define (client-config key) + "Return client configuration value corresponding to KEY." + (or (assq-ref (call-with-input-file (string-append (client-config-directory) + "/config") + read) + key) + (case key + ((mumi-scheme) 'https) + (else (format (current-error-port) + "Key '~a not configured for mumi client.~%" + key))))) + +(define (graphql-endpoint) + "Return GraphQL endpoint." + (uri->string + (build-uri (client-config 'mumi-scheme) + #:host (client-config 'mumi-host) + #:path "/graphql"))) + +(define (iso8601->date str) + "Convert ISO-8601 date/time+zone string to date object." + (string->date str "~Y-~m-~dT~H:~M:~S~z")) + +(define (list-issue issue) + "List issue described by ISSUE association list." + (display (colorize-string + (string-append "#" + (number->string (assoc-ref issue "number"))) + 'YELLOW)) + (display " ") + (unless (assoc-ref issue "open") + (display (colorize-string "✓" 'BOLD 'GREEN)) + (display " ")) + (display (colorize-string + (assoc-ref issue "title") + 'MAGENTA 'UNDERLINE)) + (newline) + (display (string-append + "opened " + (colorize-string (time->string + (iso8601->date (assoc-ref issue "date"))) + 'CYAN) + " by " + (colorize-string + (let ((submitter (assoc-ref issue "submitter"))) + (if (eq? (assoc-ref submitter "name") 'null) + (assoc-ref submitter "address") + (assoc-ref submitter "name"))) + 'CYAN))) + (newline)) + +(define (search query) + "Search for issues with QUERY and list results." + (vector-for-each (lambda (_ issue) + (list-issue issue)) + (assoc-ref + (graphql-http-get (graphql-endpoint) + `(document + (query (#(issues #:search ,query) + number + title + open + date + (submitter name address))))) + "issues"))) diff --git a/scripts/mumi.in b/scripts/mumi.in index 755dfb3..9b61729 100644 --- a/scripts/mumi.in +++ b/scripts/mumi.in @@ -4,7 +4,7 @@ !# ;;; mumi -- Mediocre, uh, mail interface ;;; Copyright © 2016, 2017, 2019, 2020 Ricardo Wurmus -;;; Copyright © 2018, 2021 Arun Isaac +;;; Copyright © 2018, 2021, 2023 Arun Isaac ;;; ;;; This file is part of mumi. ;;; @@ -26,6 +26,7 @@ (system repl server) (ice-9 match) (ice-9 format) + ((mumi client) #:prefix client:) (mumi config) ((mumi debbugs) #:select (extract-bug-numbers)) @@ -116,6 +117,9 @@ (define (show-mumi-usage) (format (current-error-port) " + `mumi search QUERY': + search mumi for issues. + `mumi web [--address=address] [--port=port] [--listen-repl[=port]] [--disable-mailer]': start the application web server. @@ -132,6 +136,8 @@ (exit 1)) (match (cdr (program-arguments)) + (("search" . query-strings) + (client:search (string-join query-strings))) (("mailer" . rest) (let* ((opts (parse-options rest)) (sender (assoc-ref opts 'sender)) From patchwork Wed Mar 8 15:36:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arun Isaac X-Patchwork-Id: 47795 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 5C8D516E34; Wed, 8 Mar 2023 15:38:46 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id 60C0816E0D for ; Wed, 8 Mar 2023 15:38:45 +0000 (GMT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZvrg-0006Ge-Kh; Wed, 08 Mar 2023 10:38:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZvre-0006G3-Q2 for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:02 -0500 Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZvre-00042s-Hx for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pZvre-0007ot-DT for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#61645] [mumi v3 2/4] client: Support checking in to a specific issue. Resent-From: Arun Isaac Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 08 Mar 2023 15:38:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 61645 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 61645@debbugs.gnu.org, Ludovic =?utf-8?q?Court=C3=A8s?= Cc: Ricardo Wurmus , Arun Isaac Received: via spool by 61645-submit@debbugs.gnu.org id=B61645.167828985429964 (code B ref 61645); Wed, 08 Mar 2023 15:38:02 +0000 Received: (at 61645) by debbugs.gnu.org; 8 Mar 2023 15:37:34 +0000 Received: from localhost ([127.0.0.1]:49951 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pZvrC-0007nD-5w for submit@debbugs.gnu.org; Wed, 08 Mar 2023 10:37:34 -0500 Received: from mugam.systemreboot.net ([139.59.75.54]:56570) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pZvrA-0007n4-AC for 61645@debbugs.gnu.org; Wed, 08 Mar 2023 10:37:33 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=systemreboot.net; s=default; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=zqjBxZLKjzVcf7jJ/h7Vxxu0CTLxSp+UU4Rw2xK8GiQ=; b=BTmc4qO3xjMhs/0JDJzR4Lek2G cyS9j7dp1WCer8fjUUXLNp022zn54lVQI7wZiFu/TsjAAiwM0XNW8ZoD5d4MtgIeMom4lzITCl6Wv XUK7tRC+p5O3UcoQxmJK3Re/o9HCaehy5+/e1L1dHGk4sgCi/5pDyaapE9kd9EbfWBpdQzhChrleu HNzPozyCZ1p0BumW3N37n6Shy2IchNcGwsluML2mlUj8z8qegw14PkxMXpWX2v7CuF2nbiiNfu0to NPUePA07ENg2IjAU5B7A8UT5zZTRW0h75u6sLznB1xWtMwLbaVvEk/9ncPSySSnZRThrHuhZHlsQw Ld2D5Akg==; Received: from [192.168.2.1] (port=6222 helo=localhost.localdomain) by systemreboot.net with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1pZvr4-0006Dd-2F; Wed, 08 Mar 2023 21:07:27 +0530 From: Arun Isaac Date: Wed, 8 Mar 2023 15:36:56 +0000 Message-Id: <20230308153658.19929-3-arunisaac@systemreboot.net> X-Mailer: git-send-email 2.39.1 In-Reply-To: <87r0tzgyok.fsf@systemreboot.net> References: <87r0tzgyok.fsf@systemreboot.net> MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org X-getmail-retrieved-from-mailbox: Patches * mumi/client.scm: Import (srfi srfi-26). (current-issue-file, current-issue-number): New functions. (print-current-issue, set-current-issue!, clear-current-issue!): New public functions. * scripts/mumi.in (show-mumi-usage): Document current and new subcommands. (main): Add current and new subcommands. --- mumi/client.scm | 48 +++++++++++++++++++++++++++++++++++++++++++++++- scripts/mumi.in | 20 ++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/mumi/client.scm b/mumi/client.scm index e4a0123..ae3a0a9 100644 --- a/mumi/client.scm +++ b/mumi/client.scm @@ -18,13 +18,17 @@ (define-module (mumi client) #:use-module (srfi srfi-19) + #:use-module (srfi srfi-26) #:use-module (srfi srfi-43) #:use-module (term ansi-color) #:use-module (web uri) #:use-module (kolam http) #:use-module (mumi config) #:use-module (mumi web view utils) - #:export (search)) + #:export (search + print-current-issue + set-current-issue! + clear-current-issue!)) (define (git-top-level) "Return the top-level directory of the current git repository." @@ -106,3 +110,45 @@ date (submitter name address))))) "issues"))) + +(define (current-issue-file) + "Return path to current issue number file." + (string-append (client-config-directory) "/current-issue")) + +(define (current-issue-number) + "Return current issue number." + (let ((issue-file (current-issue-file))) + (and (file-exists? issue-file) + (call-with-input-file issue-file + read)))) + +(define (print-current-issue) + "Print current issue." + (let ((issue-number (current-issue-number))) + (if issue-number + (list-issue + (assoc-ref + (graphql-http-get (graphql-endpoint) + `(document + (query (#(issue #:number ,issue-number) + number + title + open + date + (submitter name address))))) + "issue")) + (begin + (format (current-error-port) "No current issue!~%") + (exit #f))))) + +(define (set-current-issue! issue-number) + "Set current issue number." + ;; TODO: Write file atomically. + (call-with-output-file (current-issue-file) + (cut write issue-number <>))) + +(define (clear-current-issue!) + "Clear current issue." + (let ((issue-file (current-issue-file))) + (when (file-exists? issue-file) + (delete-file issue-file)))) diff --git a/scripts/mumi.in b/scripts/mumi.in index 9b61729..dfd082d 100644 --- a/scripts/mumi.in +++ b/scripts/mumi.in @@ -120,6 +120,12 @@ `mumi search QUERY': search mumi for issues. + `mumi current [ISSUE-NUMBER]': + print or set current issue. + + `mumi new': + clear current issue presumably to open a new one. + `mumi web [--address=address] [--port=port] [--listen-repl[=port]] [--disable-mailer]': start the application web server. @@ -138,6 +144,20 @@ (match (cdr (program-arguments)) (("search" . query-strings) (client:search (string-join query-strings))) + (("current") + (client:print-current-issue)) + (("current" issue-number-string) + (let ((issue-number (string->number issue-number-string))) + (if issue-number + (client:set-current-issue! issue-number) + (begin + (format (current-error-port) + "Invalid issue number `~a'~%" + issue-number-string) + (exit #f)))) + (client:print-current-issue)) + (("new") + (client:clear-current-issue!)) (("mailer" . rest) (let* ((opts (parse-options rest)) (sender (assoc-ref opts 'sender)) From patchwork Wed Mar 8 15:36:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Arun Isaac X-Patchwork-Id: 47797 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 8358816E34; Wed, 8 Mar 2023 15:38:52 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id CD5F716E0D for ; Wed, 8 Mar 2023 15:38:50 +0000 (GMT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZvrh-0006HC-KK; Wed, 08 Mar 2023 10:38:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZvrf-0006GE-Rs for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:03 -0500 Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZvrf-00043J-8r for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:03 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pZvrf-0007p7-4l for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:03 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#61645] [mumi v3 3/4] client: Support sending email to issues. Resent-From: Arun Isaac Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 08 Mar 2023 15:38:03 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 61645 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 61645@debbugs.gnu.org, Ludovic =?utf-8?q?Court=C3=A8s?= Cc: Ricardo Wurmus , Arun Isaac Received: via spool by 61645-submit@debbugs.gnu.org id=B61645.167828986130009 (code B ref 61645); Wed, 08 Mar 2023 15:38:03 +0000 Received: (at 61645) by debbugs.gnu.org; 8 Mar 2023 15:37:41 +0000 Received: from localhost ([127.0.0.1]:49957 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pZvrH-0007nj-Ky for submit@debbugs.gnu.org; Wed, 08 Mar 2023 10:37:41 -0500 Received: from mugam.systemreboot.net ([139.59.75.54]:56586) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pZvrD-0007nN-Tz for 61645@debbugs.gnu.org; Wed, 08 Mar 2023 10:37:37 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=systemreboot.net; s=default; h=Content-Transfer-Encoding:Content-Type: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=iYyN7nvntcyHU5E3F1yGomnxbUMT68d9iLn7jn7IvKM=; b=qHVPU8gPDMUdAHl1nMeOKrYlIT OkM6TkXAUwVVzSytFbSrerhyGURvsska9ajF4SXYB52OcmEnDYh1k0/VBvn7ngu6+QqxaybV04Wzs poM63fpq6jSJ9Txzo/5XlWuYuKsaYvXD98rfDGaUpzgqqepsLWvG1kU029tNE1KU+wE+VLLoyiRt+ HxWInJdp1ZsJexR5aLfr5JVbN2avWCD4D89CTmyxTYotYN3aZi9xQ+OlxOutw97W4AqQSvn7Uz52V s9kFlyZlkz7gCc50z41GDdPmPloF0dlWCCpB4riFFkATmkteT56iSjd7s9geY3XUZoP+jUdEUG/pE FFkIzzLA==; Received: from [192.168.2.1] (port=6222 helo=localhost.localdomain) by systemreboot.net with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1pZvr7-0006Dd-33; Wed, 08 Mar 2023 21:07:31 +0530 From: Arun Isaac Date: Wed, 8 Mar 2023 15:36:57 +0000 Message-Id: <20230308153658.19929-4-arunisaac@systemreboot.net> X-Mailer: git-send-email 2.39.1 In-Reply-To: <87r0tzgyok.fsf@systemreboot.net> References: <87r0tzgyok.fsf@systemreboot.net> MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org X-getmail-retrieved-from-mailbox: Patches * mumi/client.scm: Import (rnrs io ports), (srfi srfi-71), (srfi srfi-171), (ice-9 match), (ice-9 popen), (web client), (web response) and (email email). (issue-number-of-message, call-with-input-pipe, git-send-email): New functions. (send-email): New public function. * scripts/mumi.in (show-mumi-usage): Document send-email subcommand. (main): Add send-email subcommand. * tests/client.scm: New file. * Makefile.am (SCM_TESTS): Add tests/client.scm. --- Makefile.am | 1 + mumi/client.scm | 112 +++++++++++++++++++++++++++++++++++++++++++- scripts/mumi.in | 5 ++ tests/client.scm | 118 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 tests/client.scm diff --git a/Makefile.am b/Makefile.am index a8c11a1..86ba4f0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -58,6 +58,7 @@ SOURCES = \ TEST_EXTENSIONS = .scm SCM_TESTS = \ + tests/client.scm \ tests/debbugs.scm \ tests/xapian.scm diff --git a/mumi/client.scm b/mumi/client.scm index ae3a0a9..b8d588b 100644 --- a/mumi/client.scm +++ b/mumi/client.scm @@ -17,18 +17,27 @@ ;;; along with mumi. If not, see . (define-module (mumi client) + #:use-module (rnrs io ports) #:use-module (srfi srfi-19) #:use-module (srfi srfi-26) #:use-module (srfi srfi-43) + #:use-module (srfi srfi-71) + #:use-module (srfi srfi-171) + #:use-module (ice-9 match) + #:use-module (ice-9 popen) #:use-module (term ansi-color) + #:use-module (web client) + #:use-module (web response) #:use-module (web uri) + #:use-module (email email) #:use-module (kolam http) #:use-module (mumi config) #:use-module (mumi web view utils) #:export (search print-current-issue set-current-issue! - clear-current-issue!)) + clear-current-issue! + send-email)) (define (git-top-level) "Return the top-level directory of the current git repository." @@ -152,3 +161,104 @@ (let ((issue-file (current-issue-file))) (when (file-exists? issue-file) (delete-file issue-file)))) + +(define* (issue-number-of-message message-id #:optional (retries 15)) + "Return issue number that MESSAGE-ID belongs to. Retry RETRIES number +of times with an interval of 60 seconds between retries." + ;; TODO: Re-implement this using our GraphQL endpoint once it + ;; supports retrieving the issue from a message ID. Later, + ;; re-implement this using a GraphQL subscription when kolam + ;; supports it. + (define (poll-issue-number-of-message message-id) + (let ((response _ (http-get (build-uri (client-config 'mumi-scheme) + #:host (client-config 'mumi-host) + #:path (string-append "/msgid/" message-id))))) + (and (>= (response-code response) 300) + (< (response-code response) 400) + (match (split-and-decode-uri-path + (uri-path (response-location response))) + (("issue" issue-number) + (string->number issue-number)))))) + + (let loop ((i retries)) + (if (zero? i) + (begin + (format (current-error-port) + "Mail not acknowledged by issue tracker. Giving up.~%") + (exit #f)) + (or (poll-issue-number-of-message message-id) + (begin + (let ((retry-interval 60)) + (format (current-error-port) + "Server has not yet received our email. Will retry in ~a seconds. ~a retries remaining.~%" + retry-interval (1- i)) + (sleep retry-interval)) + (loop (1- i))))))) + +(define (call-with-input-pipe command proc) + "Call PROC with input pipe to COMMAND. COMMAND is a list of program +arguments." + (match command + ((prog args ...) + (let ((port #f)) + (dynamic-wind + (lambda () + (set! port (apply open-pipe* OPEN_READ prog args))) + (cut proc port) + (cut close-pipe port)))))) + +(define (git-send-email to patches) + "Send PATCHES using git send-email to the TO address and return the +message ID of the first email sent." + (let ((command (cons* "git" "send-email" + (string-append "--to=" to) + patches))) + (display (string-join command)) + (newline) + (call-with-input-pipe command + (lambda (port) + ;; FIXME: This messes up the order of stdout and stderr. + (let ((message-id + ;; Read till you get the Message ID. + (port-transduce (tlog (lambda (_ line) + (display line) + (newline))) + (rany (lambda (line) + (and (string-prefix-ci? "Message-ID:" line) + (assq-ref + (parse-email-headers + (string-append line "\n")) + 'message-id)))) + get-line + port))) + ;; Pass through the rest. + (display (get-string-all port)) + message-id))))) + +(define (send-email patches) + "Send PATCHES via email." + (if (current-issue-number) + ;; If an issue is current, send patches to that issue's email + ;; address. + (git-send-email (string-append (number->string (current-issue-number)) + "@" + (client-config 'debbugs-host)) + patches) + (match patches + ;; If it's a single patch, send it to the patch email address + ;; and be done with it + ((patch) + (git-send-email (client-config 'patch-email-address) + (list patch))) + ;; Else, send first patch to the patch email address and get an + ;; issue number. Then, send the remaining patches to that + ;; issue's email address. + ((first-patch other-patches ...) + (git-send-email + (string-append (number->string + (issue-number-of-message + (git-send-email (client-config 'patch-email-address) + (list first-patch)))) + "@" + (client-config 'debbugs-host)) + other-patches))))) diff --git a/scripts/mumi.in b/scripts/mumi.in index dfd082d..2295328 100644 --- a/scripts/mumi.in +++ b/scripts/mumi.in @@ -126,6 +126,9 @@ `mumi new': clear current issue presumably to open a new one. + `mumi send-email': + send patches to debbugs. + `mumi web [--address=address] [--port=port] [--listen-repl[=port]] [--disable-mailer]': start the application web server. @@ -158,6 +161,8 @@ (client:print-current-issue)) (("new") (client:clear-current-issue!)) + (("send-email" . patches) + (client:send-email patches)) (("mailer" . rest) (let* ((opts (parse-options rest)) (sender (assoc-ref opts 'sender)) diff --git a/tests/client.scm b/tests/client.scm new file mode 100644 index 0000000..fb03713 --- /dev/null +++ b/tests/client.scm @@ -0,0 +1,118 @@ +;;; mumi -- Mediocre, uh, mail interface +;;; Copyright © 2023 Arun Isaac +;;; +;;; This program is free software: you can redistribute it and/or +;;; modify it under the terms of the GNU Affero General Public License +;;; as published by the Free Software Foundation, either version 3 of +;;; the License, or (at your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; Affero General Public License for more details. +;;; +;;; You should have received a copy of the GNU Affero General Public +;;; License along with this program. If not, see +;;; . + +(use-modules (srfi srfi-26) + (srfi srfi-64) + (ice-9 match)) + +(define (with-variable variable value thunk) + "Set VARIABLE to VALUE, run THUNK and restore the old value of +VARIABLE. Return the value returned by THUNK." + (let ((old-value (variable-ref variable))) + (dynamic-wind + (cut variable-set! variable value) + thunk + (cut variable-set! variable old-value)))) + +(define (with-variables variable-bindings thunk) + "Set VARIABLE-BINDINGS, run THUNK and restore the old values of the +variables. Return the value returned by THUNK. VARIABLE-BINDINGS is a +list of pairs mapping variables to their values." + (match variable-bindings + (((variable . value) tail ...) + (with-variable variable value + (cut with-variables tail thunk))) + (() (thunk)))) + +(define-syntax-rule (var@@ module-name variable-name) + (module-variable (resolve-module 'module-name) + 'variable-name)) + +(define (trace-calls function-variable thunk) + "Run THUNK and return a list of argument lists FUNCTION-VARIABLE is +called with." + (let ((args-list (list))) + (with-variable function-variable (lambda args + (set! args-list + (cons args args-list))) + thunk) + (reverse args-list))) + +(define client-config-stub + (cons (var@@ (mumi client) client-config) + (lambda (key) + (case key + ((debbugs-host) "example.com") + ((patch-email-address) "foo@patches.com") + (else (error "Key unimplemented in stub" key)))))) + +(test-begin "client") + +(test-equal "send patches to new issue" + '(("git" "send-email" "--to=foo@patches.com" "foo.patch") + ("git" "send-email" "--to=12345@example.com" "bar.patch" "foobar.patch")) + (map (match-lambda + ((command _) command)) + (trace-calls (var@@ (mumi client) call-with-input-pipe) + (lambda () + (with-variables (list (cons (var@@ (mumi client) issue-number-of-message) + (const 12345)) + client-config-stub) + (cut (@@ (mumi client) send-email) + (list "foo.patch" "bar.patch" "foobar.patch"))))))) + +(test-equal "send patches to existing issue" + '(("git" "send-email" "--to=12345@example.com" "foo.patch" "bar.patch" "foobar.patch")) + (map (match-lambda + ((command _) command)) + (trace-calls (var@@ (mumi client) call-with-input-pipe) + (lambda () + (with-variables (list (cons (var@@ (mumi client) current-issue-number) + (const 12345)) + client-config-stub) + (cut (@@ (mumi client) send-email) + (list "foo.patch" "bar.patch" "foobar.patch"))))))) + +(test-equal "send single patch to new issue" + '(("git" "send-email" "--to=foo@patches.com" "foo.patch")) + (map (match-lambda + ((command _) command)) + (trace-calls (var@@ (mumi client) call-with-input-pipe) + (lambda () + (with-variables (list (cons (var@@ (mumi client) issue-number-of-message) + (lambda _ + (error "Do not poll server for issue number"))) + client-config-stub) + (cut (@@ (mumi client) send-email) + (list "foo.patch"))))))) + +(test-equal "send single patch to existing issue" + '(("git" "send-email" "--to=12345@example.com" "foo.patch")) + (map (match-lambda + ((command _) command)) + (trace-calls (var@@ (mumi client) call-with-input-pipe) + (lambda () + (with-variables (list (cons (var@@ (mumi client) current-issue-number) + (const 12345)) + (cons (var@@ (mumi client) issue-number-of-message) + (lambda _ + (error "Do not poll server for issue number"))) + client-config-stub) + (cut (@@ (mumi client) send-email) + (list "foo.patch"))))))) + +(test-end "client") From patchwork Wed Mar 8 15:36:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arun Isaac X-Patchwork-Id: 47796 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id C8F0B16E3A; Wed, 8 Mar 2023 15:38:46 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id 8A1C516E0D for ; Wed, 8 Mar 2023 15:38:46 +0000 (GMT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZvrg-0006HA-Si; Wed, 08 Mar 2023 10:38:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZvrg-0006GN-7a for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:04 -0500 Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZvrf-00043Q-N0 for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:03 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pZvrf-0007pF-Iq for guix-patches@gnu.org; Wed, 08 Mar 2023 10:38:03 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#61645] [mumi v3 4/4] Set only GUILE_LOAD_PATH when running tests. Resent-From: Arun Isaac Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 08 Mar 2023 15:38:03 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 61645 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 61645@debbugs.gnu.org, Ludovic =?utf-8?q?Court=C3=A8s?= Cc: Ricardo Wurmus , Arun Isaac Received: via spool by 61645-submit@debbugs.gnu.org id=B61645.167828986230018 (code B ref 61645); Wed, 08 Mar 2023 15:38:03 +0000 Received: (at 61645) by debbugs.gnu.org; 8 Mar 2023 15:37:42 +0000 Received: from localhost ([127.0.0.1]:49960 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pZvrK-0007o5-7Q for submit@debbugs.gnu.org; Wed, 08 Mar 2023 10:37:42 -0500 Received: from mugam.systemreboot.net ([139.59.75.54]:37698) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pZvrH-0007ne-Qj for 61645@debbugs.gnu.org; Wed, 08 Mar 2023 10:37:40 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=systemreboot.net; s=default; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=UNFIp3aOBo/ZZhAskDFz4Zb96VJNpg7MB2/xqtimruI=; b=WlAo0I4UD0Uj4aBjKnFQSIQZ6B 9wSk2NbxG0C+naOx1HmRAp60YRy9iXC4dzOgdLLD037cRwIWjevbp7Jd/0voj98oBWEtGPQGg45d+ 8vENS1PrCKs4Jnzxgp0zqVFHQUcW5O9Ui/0E8p4I0tyGJX8Ti6kMmlgJqYeNqXUh4KhBtylSQigra 6qxKpjL9lU2vqY1FckmkwCI7UEkp3ELV6vI62abWllXQS/hlU8LaRXBAqxyAxE9Z/QFtFVmmbDMOh r3gmWXQYutl7Srw9MO++zZmcl94ANqaB60u/JiMq9nISWLLcEmO5nfAvocOPZ8EaT2aazEO+RlJIu CzlLn3Jg==; Received: from [192.168.2.1] (port=6222 helo=localhost.localdomain) by systemreboot.net with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1pZvrB-0006Dd-2a; Wed, 08 Mar 2023 21:07:34 +0530 From: Arun Isaac Date: Wed, 8 Mar 2023 15:36:58 +0000 Message-Id: <20230308153658.19929-5-arunisaac@systemreboot.net> X-Mailer: git-send-email 2.39.1 In-Reply-To: <87r0tzgyok.fsf@systemreboot.net> References: <87r0tzgyok.fsf@systemreboot.net> MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org X-getmail-retrieved-from-mailbox: Patches Somehow, the stubs in tests/client.scm do not work when compiled modules are found. This could be a guile bug. * Makefile.am (SCM_LOG_DRIVER): Do not use pre-inst-env. Set only the load path. --- Makefile.am | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 86ba4f0..3e57e63 100644 --- a/Makefile.am +++ b/Makefile.am @@ -70,8 +70,7 @@ EXTRA_DIST += $(TESTS) \ AM_TESTS_ENVIRONMENT = abs_top_srcdir="$(abs_top_srcdir)" GUILE_AUTO_COMPILE=0 SCM_LOG_DRIVER = \ - $(top_builddir)/pre-inst-env \ - $(GUILE) --no-auto-compile -e main \ + $(GUILE) --no-auto-compile -L $(top_srcdir) -e main \ $(top_srcdir)/build-aux/test-driver.scm AM_SCM_LOG_DRIVER_FLAGS = --brief=yes