From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 56B75C433F5 for ; Tue, 11 Jan 2022 19:51:42 +0000 (UTC) Received: from localhost ([::1]:45044 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7NBF-0006Q5-AE for qemu-devel@archiver.kernel.org; Tue, 11 Jan 2022 14:51:41 -0500 Received: from eggs.gnu.org ([209.51.188.92]:43532) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7N8t-0005Bo-Cd for qemu-devel@nongnu.org; Tue, 11 Jan 2022 14:49:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:51496) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7N8q-0007YB-KU for qemu-devel@nongnu.org; Tue, 11 Jan 2022 14:49:14 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1641930551; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=ytUCwR1PIjzIdt92s93nHEsK5XGwfdfuE7qr437QVFg=; b=X4UZ/ULQ32L+ZJtOXHz0odc/g7WCqauydfNpBOwl/OjpqeKnbXf2TRql4lkG5WXiTXaVrF 6+TtzNr17kbtUI9i2vBsNNVg0fj55I5jyRHVM38axLtQdipaL0VgjH/+5JcrejnZleTawT GVYs29uS/NgWbsoPVxdNnfql3tqFGQs= Received: from mail-ua1-f71.google.com (mail-ua1-f71.google.com [209.85.222.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-116-KCt7B4MCPoGr_aVs7bevEw-1; Tue, 11 Jan 2022 14:49:08 -0500 X-MC-Unique: KCt7B4MCPoGr_aVs7bevEw-1 Received: by mail-ua1-f71.google.com with SMTP id t14-20020ab0550e000000b00305905ffc31so149169uaa.16 for ; Tue, 11 Jan 2022 11:49:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=ytUCwR1PIjzIdt92s93nHEsK5XGwfdfuE7qr437QVFg=; b=1i3B0BGa4Y7WiHC4n6iXopkvlmSRjyWbRP703919DyhuH9BZEsp7Z9H+M3a9SO7rk/ l06q1YNF8K4fHgvDWjn3q4wg5ddUQqkOaFhudaJCkum7V2sKbTN7hdv9phe0KVEvpaLF oEX2U3eoP8r/Y/ePPx7hA1xi+UO3/3FMHk7XvJ/PyZ8/pIw4ObTFFkUN3w7sca2TssPO wGdBRQ4VpEELrVG5awVymD3UgBXQMQ1oFxyrlW2Q+nK6VwrETK6PBZAhKRIqr4mnagGa kJ2nvtaIZA0uhmvsh1nM6aset11JqKPbLHrOS0CsPUQtq6ahOrgj/Q0IvT8pT5sWFF5Q y5zA== X-Gm-Message-State: AOAM533IxhyZZnA2ZkYMeJ3P8lKqjlqZ3OCIEWiMSi24GnhU2HlhBTcS C/mZekWZpICJ5kaVfy59ccI8X4wq04URhX6ytKSOOkYHDSf0zLzFBcJaWOxhJ+ZEUmHnsyoon6q Zvb5HFSEjFhHaZ4aEIiOJd19xAdsw6sk= X-Received: by 2002:a1f:2d8a:: with SMTP id t132mr2964794vkt.3.1641930547899; Tue, 11 Jan 2022 11:49:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJxR02WDolAUDB5gOdCE5bKSXxlbKIJAYcOw6kFbYeWZrrHTx3LuqnUAJpQm6N9UE9TYfNJnBp5MBluDSQMDbTM= X-Received: by 2002:a1f:2d8a:: with SMTP id t132mr2964780vkt.3.1641930547635; Tue, 11 Jan 2022 11:49:07 -0800 (PST) MIME-Version: 1.0 References: <20211215210634.3779791-1-jsnow@redhat.com> <20211215210634.3779791-18-jsnow@redhat.com> In-Reply-To: From: John Snow Date: Tue, 11 Jan 2022 14:48:55 -0500 Message-ID: Subject: Re: [RFC qemu.qmp PATCH 17/24] Makefile: add build and publish targets To: =?UTF-8?Q?Daniel_P=2E_Berrang=C3=A9?= Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jsnow@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/alternative; boundary="00000000000009c49c05d553bf27" Received-SPF: pass client-ip=170.10.133.124; envelope-from=jsnow@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -33 X-Spam_score: -3.4 X-Spam_bar: --- X-Spam_report: (-3.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.595, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Eduardo Habkost , Beraldo Leal , qemu-devel , Wainer dos Santos Moschetta , Gerd Hoffmann , Cleber Rosa Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" --00000000000009c49c05d553bf27 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, Dec 17, 2021 at 8:46 AM Daniel P. Berrang=C3=A9 wrote: > On Thu, Dec 16, 2021 at 06:35:23PM -0500, John Snow wrote: > > On Thu, Dec 16, 2021 at 5:48 AM Daniel P. Berrang=C3=A9 > > wrote: > > > > > On Wed, Dec 15, 2021 at 04:06:27PM -0500, John Snow wrote: > > > > Signed-off-by: John Snow > > > > --- > > > > Makefile | 32 ++++++++++++++++++++++++++++++++ > > > > 1 file changed, 32 insertions(+) > > > > > > > > diff --git a/Makefile b/Makefile > > > > index 97d737a..81bfca8 100644 > > > > --- a/Makefile > > > > +++ b/Makefile > > > > @@ -110,3 +110,35 @@ distclean: clean > > > > rm -f .coverage .coverage.* > > > > rm -rf htmlcov/ > > > > rm -rf test-results/ > > > > + > > > > +.PHONY: pristine > > > > +pristine: > > > > + @git diff-files --quiet --ignore-submodules -- || \ > > > > + (echo "You have unstaged changes."; exit 1) > > > > + @git diff-index --cached --quiet HEAD --ignore-submodules -- > || \ > > > > + (echo "Your index contains uncommitted changes."; exi= t > 1) > > > > + @[ -z "$(shell git ls-files -o)" ] || \ > > > > + (echo "You have untracked files: $(shell git ls-files > > > -o)"; exit 1) > > > > + > > > > +dist: setup.cfg setup.py Makefile README.rst > > > > + python3 -m build > > > > + @touch dist > > > > + > > > > +.PHONY: pre-publish > > > > +pre-publish: pristine dist > > > > + @git describe --exact-match 2>/dev/null || \ > > > > + (echo -e "\033[0;31mThere is no annotated tag for thi= s > > > commit.\033[0m"; exit 1) > > > > + python3 -m twine check --strict dist/* > > > > + git push -v --atomic --follow-tags --dry-run > > > > + > > > > +.PHONY: publish > > > > +publish: pre-publish > > > > + # Set the username via TWINE_USERNAME. > > > > + # Set the password via TWINE_PASSWORD. > > > > + # Set the pkg repository via TWINE_REPOSITORY. > > > > + python3 -m twine upload --verbose dist/* > > > > + git push -v --atomic --follow-tags > > > > + > > > > +.PHONY: publish-test > > > > +publish-test: pre-publish > > > > + python3 -m twine upload --verbose -r testpypi dist/* > > > > > > It doesn't feel very pythonic to have a makefile in the project. > > > > > > If we want some helpers for publishing releases, I would have > > > expected to see a python script eg scripts/publish.py > > > > > > > > Eh, Python folks use Makefiles too. I've been using these little Makefi= le > > targets for hobby things for a while and I had them laying around and > ready > > to go. I have no strong need to "upgrade" to python scripts for these > right > > now, unless there's some extra features you want to see. > > Using make means you have to worry about portability across different > impls of make and different impls of shell. Using python means your > python project is portable to anywhere that python runs. I still like the idea of using a Makefile as a "canonical menu of things you can do in this directory", but there's probably room for interactive error checking and so on with the TWINE_USERNAME / TWINE_PASSWORD / TWINE_REPOSITORY environment variables in a python script. I'll look into it as a follow-up, if that's fine. (I'm worried it's a lot of polish and effort on a maintainers-only interface that only I will likely use for at least the next year or two.) Ultimately, what's likely to happen here is that I will generate some oauth tokens with publish permissions and a hypothetical user would set e.g. TWINE_USERNAME to "__token__", and the password would be "pypi-tokengoeshere". Using the "keyring" python package, we could attempt to fetch stored values from a session keyring, falling back to an interactive prompt if they're unset. --js --00000000000009c49c05d553bf27 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


=
On Fri, Dec 17, 2021 at 8:46 AM Danie= l P. Berrang=C3=A9 <berrange@redh= at.com> wrote:
On Thu, Dec 16, 2021 at 06:35:23PM -0500, John Snow wrote:
> On Thu, Dec 16, 2021 at 5:48 AM Daniel P. Berrang=C3=A9 <berrange@redhat.com><= br> > wrote:
>
> > On Wed, Dec 15, 2021 at 04:06:27PM -0500, John Snow wrote:
> > > Signed-off-by: John Snow <jsnow@redhat.com>
> > > ---
> > >=C2=A0 Makefile | 32 ++++++++++++++++++++++++++++++++
> > >=C2=A0 1 file changed, 32 insertions(+)
> > >
> > > diff --git a/Makefile b/Makefile
> > > index 97d737a..81bfca8 100644
> > > --- a/Makefile
> > > +++ b/Makefile
> > > @@ -110,3 +110,35 @@ distclean: clean
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0rm -f .coverage .coverage.*
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0rm -rf htmlcov/
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0rm -rf test-results/
> > > +
> > > +.PHONY: pristine
> > > +pristine:
> > > +=C2=A0 =C2=A0 =C2=A0@git diff-files --quiet --ignore-submod= ules -- || \
> > > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(echo "= ;You have unstaged changes."; exit 1)
> > > +=C2=A0 =C2=A0 =C2=A0@git diff-index --cached --quiet HEAD -= -ignore-submodules -- || \
> > > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(echo "= ;Your index contains uncommitted changes."; exit 1)
> > > +=C2=A0 =C2=A0 =C2=A0@[ -z "$(shell git ls-files -o)&qu= ot; ] || \
> > > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(echo "= ;You have untracked files: $(shell git ls-files
> > -o)"; exit 1)
> > > +
> > > +dist: setup.cfg setup.py Makefile README.rst
> > > +=C2=A0 =C2=A0 =C2=A0python3 -m build
> > > +=C2=A0 =C2=A0 =C2=A0@touch dist
> > > +
> > > +.PHONY: pre-publish
> > > +pre-publish: pristine dist
> > > +=C2=A0 =C2=A0 =C2=A0@git describe --exact-match 2>/dev/n= ull || \
> > > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(echo -e &q= uot;\033[0;31mThere is no annotated tag for this
> > commit.\033[0m"; exit 1)
> > > +=C2=A0 =C2=A0 =C2=A0python3 -m twine check --strict dist/*<= br> > > > +=C2=A0 =C2=A0 =C2=A0git push -v --atomic --follow-tags --dr= y-run
> > > +
> > > +.PHONY: publish
> > > +publish: pre-publish
> > > +=C2=A0 =C2=A0 =C2=A0# Set the username via TWINE_USERNAME.<= br> > > > +=C2=A0 =C2=A0 =C2=A0# Set the password via TWINE_PASSWORD.<= br> > > > +=C2=A0 =C2=A0 =C2=A0# Set the pkg repository via TWINE_REPO= SITORY.
> > > +=C2=A0 =C2=A0 =C2=A0python3 -m twine upload --verbose dist/= *
> > > +=C2=A0 =C2=A0 =C2=A0git push -v --atomic --follow-tags
> > > +
> > > +.PHONY: publish-test
> > > +publish-test: pre-publish
> > > +=C2=A0 =C2=A0 =C2=A0python3 -m twine upload --verbose -r te= stpypi dist/*
> >
> > It doesn't feel very pythonic to have a makefile in the proje= ct.
> >
> > If we want some helpers for publishing releases, I would have
> > expected to see a python script=C2=A0 eg scripts/publish.py
> >
> >
> Eh, Python folks use Makefiles too. I've been using these little M= akefile
> targets for hobby things for a while and I had them laying around and = ready
> to go. I have no strong need to "upgrade" to python scripts = for these right
> now, unless there's some extra features you want to see.

Using make means you have to worry about portability across different
impls of make and different impls of shell. Using python means your
python project is portable to anywhere that python runs.
<= br>
I still like the idea of using a Makefile as a "canonica= l menu of things you can do in this directory", but there's probab= ly room for interactive error checking and so on with the TWINE_USERNAME / = TWINE_PASSWORD / TWINE_REPOSITORY environment variables in a python script.= I'll look into it as a follow-up, if that's fine. (I'm worried= it's a lot of polish and effort on a maintainers-only interface that o= nly I will likely use for at least the next year or two.)

Ultimately, what's likely to happen here is that I will generate some = oauth tokens with publish permissions and a hypothetical user would set e.g= . TWINE_USERNAME to "__token__", and the password would be "= pypi-tokengoeshere". Using the "keyring" python package, we = could attempt to fetch stored values from a session keyring, falling back t= o an interactive prompt if they're unset.

= --js
--00000000000009c49c05d553bf27--