diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6aebed1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +SOURCES/go-rpm-macros-3.0.9.tar.gz +SOURCES/golist-0.10.1.tar.gz diff --git a/.go-rpm-macros.metadata b/.go-rpm-macros.metadata new file mode 100644 index 0000000..93786de --- /dev/null +++ b/.go-rpm-macros.metadata @@ -0,0 +1,2 @@ +013899032cc1bcad52bb1fd4effe383e2afb7105 SOURCES/go-rpm-macros-3.0.9.tar.gz +bf428b2ba15f68df39e3da7647ccfdeb8beedd3b SOURCES/golist-0.10.1.tar.gz diff --git a/SOURCES/golist-bootstrap-cli-no-vendor.patch b/SOURCES/golist-bootstrap-cli-no-vendor.patch new file mode 100644 index 0000000..e8bc793 --- /dev/null +++ b/SOURCES/golist-bootstrap-cli-no-vendor.patch @@ -0,0 +1,322 @@ +diff --git a/cmd/golist/golist.go b/cmd/golist/golist.go +index ee028ae..e9c038d 100644 +--- a/cmd/golist/golist.go ++++ b/cmd/golist/golist.go +@@ -11,9 +11,8 @@ import ( + "strings" + "text/template" + +- "github.com/urfave/cli" +- + "pagure.io/golist/pkg/util" ++ "pagure.io/golist/pkg/cli" + ) + + var ( +@@ -100,7 +99,6 @@ func main() { + } + + app.Action = func(c *cli.Context) error { +- + if len(c.StringSlice("package-path")) == 0 { + return fmt.Errorf("--package-path is not set") + } +diff --git a/pkg/cli/cli.go b/pkg/cli/cli.go +new file mode 100644 +index 0000000..ec91056 +--- /dev/null ++++ b/pkg/cli/cli.go +@@ -0,0 +1,293 @@ ++package cli ++ ++/* golist uses a very small portion of functionality ++ from github.com/urfave/cli. This module provides ++ minimal substitute API implementations for only the ++ core functionality used by golist, for the purpose of ++ bootstrapping golist without additional dependencies. ++*/ ++ ++import ( ++ "strings" ++ "fmt" ++ "os" ++) ++ ++type String string ++type StringSlice []string ++type Bool bool ++ ++type Flag interface { ++ name() string ++ usage() string ++} ++ ++type BoolFlag struct { ++ Name string ++ Usage string ++ Value bool ++} ++ ++type StringFlag struct { ++ Name string ++ Usage string ++ Value string ++} ++ ++type StringSliceFlag struct { ++ Name string ++ Usage string ++ Value *StringSlice ++} ++ ++type App struct { ++ Name string ++ Usage string ++ Version string ++ Flags []Flag ++ Action func(*Context) error ++ ++} ++ ++func NewApp() App { ++ var a App ++ return a ++} ++ ++func (a *App) Run(osArgs []string) error { ++ c, err := newContext(a.Flags, osArgs) ++ if err != nil { ++ return err ++ } ++ if c.Bool("help") { ++ a.PrintHelp() ++ os.Exit(0) ++ } ++ return a.Action(c) ++} ++ ++func (a *App) PrintHelp() { ++ maxNameLen := 0 ++ for _, flag := range a.Flags { ++ length := len(flag.name()) ++ if length > maxNameLen { ++ maxNameLen = length ++ } ++ } ++ fmtSpec := "%-" + fmt.Sprintf("%v", maxNameLen + 6) + "s\t%s\n" ++ fmt.Printf("%s - %s\n", a.Name, a.Usage) ++ fmt.Printf("Options:\n") ++ for _, flag := range a.Flags { ++ flagNameSlice := append([]string{canonicalName(flag)}, alternateNames(flag)...) ++ for i, _ := range flagNameSlice { ++ if len(flagNameSlice[i]) > 1 { ++ flagNameSlice[i] = fmt.Sprintf("--%s", flagNameSlice[i]) ++ } else { ++ flagNameSlice[i] = fmt.Sprintf("-%s", flagNameSlice[i]) ++ } ++ } ++ flagNameStr := strings.Join(flagNameSlice, ", ") ++ switch flag.(type) { ++ case StringFlag: ++ flagNameStr = fmt.Sprintf(" %s value", flagNameStr) ++ case StringSliceFlag: ++ flagNameStr = fmt.Sprintf(" %s value", flagNameStr) ++ case BoolFlag: ++ flagNameStr = fmt.Sprintf(" %s", flagNameStr) ++ } ++ fmt.Printf(fmtSpec, flagNameStr, flag.usage()) ++ } ++} ++ ++ ++type Context struct { ++ flagValues map[string]interface{} ++ flagDecls map[string]Flag ++ altFlags map[string]string ++ positionalArgs []string ++} ++ ++func (c *Context) Bool(flag string) bool { ++ iface, ok := c.flagDecls[flag] ++ if !ok { ++ panic("undefined flag" + flag) ++ } ++ switch iface.(type) { ++ case BoolFlag: ++ break ++ default: ++ panic("flag type mismatch - expected BoolFlag, got: " + flag) ++ } ++ val, ok := c.flagValues[flag] ++ if !ok { ++ return iface.(BoolFlag).Value ++ } ++ return val.(bool) ++} ++ ++func (c *Context) String(flag string) string { ++ iface, ok := c.flagDecls[flag] ++ if !ok { ++ panic("undefined flag" + flag) ++ } ++ switch iface.(type) { ++ case StringFlag: ++ break ++ default: ++ panic("flag type mismatch - expected StringFlag, got: " + flag) ++ } ++ val, ok:= c.flagValues[flag] ++ if !ok { ++ return iface.(StringFlag).Value ++ } ++ return val.(string) ++} ++ ++func (c *Context) StringSlice(flag string) []string { ++ iface, ok := c.flagDecls[flag]; ++ if !ok { ++ panic("undefined flag" + flag) ++ } ++ switch iface.(type) { ++ case StringSliceFlag: ++ break ++ default: ++ panic("flag type mismatch - expected StringSliceFlag, got: " + flag) ++ } ++ val, ok := c.flagValues[flag] ++ if !ok { ++ val = iface.(StringSliceFlag).Value ++ if val != nil { ++ return []string{} ++ } ++ } ++ return val.([]string) ++} ++ ++// Create a hash mapping from flag names to declarations ++// and alt names to flag names. ++func (c *Context) setupFlags(flagDecls []Flag) error { ++ helpFlag := BoolFlag { ++ Name: "help, h", ++ Usage: "Show help message", ++ } ++ flagDecls = append(flagDecls, helpFlag) ++ for _, flag := range flagDecls { ++ flagName := canonicalName(flag) ++ if _, ok:= c.flagDecls[flagName]; ok { ++ return fmt.Errorf("cannot redeclare flag: %s", flagName) ++ } ++ c.flagDecls[flagName] = flag ++ altFlagNames := alternateNames(flag) ++ for _, altName := range altFlagNames { ++ c.altFlags[altName] = flagName ++ } ++ } ++ return nil ++} ++ ++func (c *Context) parseArgs(osArgs []string) error { ++ // process command line arguments as a stream of tokens. ++ // operations consume the first token in the stream until ++ // the stream is empty. ++ argStream := osArgs ++ for len(argStream) > 0 { ++ arg := argStream[0] ++ if ! isFlag(arg) { ++ argStream = argStream[1:] ++ c.positionalArgs = append(c.positionalArgs, arg) ++ ++ } else { ++ arg = trimFlag(arg) ++ if _, ok:= c.altFlags[arg]; ok { ++ arg = c.altFlags[arg] ++ } ++ iface, ok := c.flagDecls[arg] ++ if !ok { ++ return fmt.Errorf("unexpected argument: %v", arg) ++ } ++ switch flag := iface.(type) { ++ case StringFlag: ++ argStream = argStream[1:] ++ if len(argStream) == 0 { ++ return fmt.Errorf("expected value for argument: %v", arg) ++ } ++ if isFlag(argStream[0]) { ++ return fmt.Errorf("unexpected flag: %v", arg) ++ } ++ c.flagValues[arg] = argStream[0] ++ case StringSliceFlag: ++ argStream = argStream[1:] ++ if len (argStream) == 0 { ++ return fmt.Errorf("expected value for argument: %v", arg) ++ } ++ if isFlag(argStream[0]) { ++ return fmt.Errorf("unexpected flag: %v", arg) ++ } ++ c.flagValues[arg] = make([]string, 0) ++ c.flagValues[arg] = append(c.flagValues[arg].([]string), argStream[0]) ++ argStream = argStream[1:] ++ for len(argStream) > 0 && ! isFlag(argStream[0]) { ++ c.flagValues[arg] = append(c.flagValues[arg].([]string), argStream[0]) ++ argStream = argStream[1:] ++ } ++ case BoolFlag: ++ argStream = argStream[1:] ++ c.flagValues[canonicalName(flag)] = true ++ default: ++ return fmt.Errorf("unexpected flag: %v", arg) ++ } ++ } ++ } ++ return nil ++} ++ ++func newContext(flags []Flag, osArgs []string) (*Context, error) { ++ var c Context ++ c.flagValues = make(map[string]interface{}) ++ c.flagDecls = make(map[string]Flag) ++ c.altFlags = make(map[string]string) ++ c.altFlags = make(map[string]string) ++ if err := c.setupFlags(flags); err != nil { ++ return nil, err ++ } ++ if err := c.parseArgs(osArgs); err != nil { ++ return nil, err ++ } ++ return &c, nil ++} ++ ++func (f StringFlag) name() string {return f.Name} ++func (f StringFlag) usage() string {return f.Usage} ++func (f BoolFlag) name() string {return f.Name} ++func (f BoolFlag) usage() string {return f.Usage} ++func (f StringSliceFlag) name() string {return f.Name} ++func (f StringSliceFlag) usage() string {return f.Usage} ++ ++// takes a Flag with a comma delimited string ++// of flag names and returns the first one ++func canonicalName(flag Flag) string { ++ flagNames := strings.Split(flag.name(), ",") ++ return strings.TrimSpace(flagNames[0]) ++} ++ ++// takes a Flag with a comma delimited string ++// of flag names and returns them as a string slice ++// with the canonical (first) flag ommitted ++func alternateNames(flag Flag) []string { ++ flagNames := strings.Split(flag.name(), ",") ++ altNames := flagNames[1:] ++ for i, _ := range altNames { ++ altNames[i] = strings.TrimSpace(altNames[i]) ++ } ++ return altNames ++} ++ ++func isFlag(arg string) bool { ++ return strings.HasPrefix(arg, "-") ++} ++ ++func trimFlag(arg string) string { ++ return strings.Trim(strings.Trim(arg, "-"), "-") ++} ++ diff --git a/SOURCES/update-default-gobuild-args.patch b/SOURCES/update-default-gobuild-args.patch new file mode 100644 index 0000000..2ca10c9 --- /dev/null +++ b/SOURCES/update-default-gobuild-args.patch @@ -0,0 +1,50 @@ +diff --git a/rpm/macros.d/macros.go-compilers-golang b/rpm/macros.d/macros.go-compilers-golang +index b0ab4c4..942549f 100644 +--- a/rpm/macros.d/macros.go-compilers-golang ++++ b/rpm/macros.d/macros.go-compilers-golang +@@ -20,6 +20,8 @@ + # + # SPDX-License-Identifier: GPL-3.0-or-later + ++%gocompilerflags -buildmode pie -compiler gc ++ + # This *must* be all on one line, as it will be used in shell + # assignments. eg + # +@@ -29,22 +31,33 @@ + # + # %make GOBUILDFLAGS="%gobuildflags" + # +-%gobuildflags() %{expand:%{gocompilerflags} -tags=\\"rpm_crashtraceback \\" -ldflags \\"${LDFLAGS:-}%{?currentgoldflags} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '%__global_ldflags %{?__golang_extldflags}'\\" -a -v -x} ++%gobuildflags() %{expand:%{gocompilerflags} -tags=\\"rpm_crashtraceback ${BUILDTAGS:-} libtrust_openssl\\" -ldflags \\"-linkmode=external -compressdwarf=false ${LDFLAGS:-}%{?currentgoldflags} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '%__global_ldflags %{?__golang_extldflags}'\\" -a -v -x} ++%_gobuildflags_internal() %{expand:%{gocompilerflags} -tags="rpm_crashtraceback ${BUILDTAGS:-} libtrust_openssl" -ldflags "-linkmode=external -compressdwarf=false ${LDFLAGS:-}%{?currentgoldflags} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '%__global_ldflags %{?__golang_extldflags}'" -a -v -x} + + # Turn off Go modules + %gomodulesmode GO111MODULE=off + + # Define commands for building + # BUILD_ID can be generated for golang build no matter of debuginfo ++ ++%_gobuild_cmd CGO_CPPFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector-all" go build %{_gobuildflags_internal} ++%gobuild_compat_el8(o:) %{expand:%{_gobuild_cmd} %{?**};} + %gobuild(o:) %{expand: + # https://bugzilla.redhat.com/show_bug.cgi?id=995136#c12 + %global _dwz_low_mem_die_limit 0 + %{?gobuilddir:GOPATH="%{gobuilddir}:${GOPATH:+${GOPATH}:}%{?gopath}"} %{?gomodulesmode} \\ +- go build %{?gocompilerflags} -tags="rpm_crashtraceback ${BUILDTAGS:-}" -ldflags "${LDFLAGS:-}%{?currentgoldflags} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '%__global_ldflags %{?__golang_extldflags}'" -a -v -x %{?**}; ++ %{_gobuild_cmd} %{?**}; + } + ${workroot}${GOPATH:+:${GOPATH}} + + # Define commands for testing + %gotestflags %{gocompilerflags} + %gotestextldflags %__global_ldflags %{?__golang_extldflags} +-%gotest() %{?gomodulesmode} go test %{gotestflags} -ldflags "${LDFLAGS:-}%{?currentgoldflags} -extldflags '%{gotestextldflags}'" %{?**}; ++ ++%_gotest_cmd %{?gomodulesmode} go test %{gotestflags} -ldflags "${LDFLAGS:-}%{?currentgoldflags} -extldflags '%{gotestextldflags}'" ++%gotest_compat_el8(o:) %{expand:%{_gotest_cmd} %{?**};} ++%gotest(o:) %{expand: ++ %{?gobuilddir:GOPATH="%{gobuilddir}:${GOPATH:+${GOPATH}:}%{?gopath}"} %{?gomodulesmode} \\ ++ %{_gotest_cmd} %{?**}; ++} ++ diff --git a/SPECS/go-rpm-macros.spec b/SPECS/go-rpm-macros.spec new file mode 100644 index 0000000..6c5c694 --- /dev/null +++ b/SPECS/go-rpm-macros.spec @@ -0,0 +1,292 @@ +%global forgeurl https://pagure.io/go-rpm-macros +Version: 3.0.9 +%forgemeta + +#https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/51 +%global _spectemplatedir %{_datadir}/rpmdevtools/fedora +%global _docdir_fmt %{name} + +# Master definition that will be written to macro files +%global golang_arches %{ix86} x86_64 %{arm} aarch64 ppc64le s390x +%global gccgo_arches %{mips} +%if 0%{?rhel} >= 9 +%global golang_arches x86_64 aarch64 ppc64le s390x +%endif +# Go sources can contain arch-specific files and our macros will package the +# correct files for each architecture. Therefore, move gopath to _libdir and +# make Go devel packages archful +%global gopath %{_datadir}/gocode + +# whether to bundle golist or require it as a dependency +%global bundle_golist 1 + +%if 0%{?bundle_golist} +# do not create debuginfo packages when we add a build section +%global debug_package %{nil} +%global golist_version 0.10.1 +%global golist_builddir %{_builddir}/golist-%{golist_version}/_build +%global golist_goipath pagure.io/golist +# where to bundle the golist executable +%global golist_execdir %{_libexecdir}/go-rpm-macros/ +# define gobuild to avoid this package requiring itself to build +%define gobuild(o:) GO111MODULE=off go build -buildmode pie -compiler gc -tags="rpm_crashtraceback ${BUILDTAGS:-}" -ldflags "${LDFLAGS:-} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld '" -a -v %{?**}; +%endif + +ExclusiveArch: %{golang_arches} %{gccgo_arches} + +Name: go-rpm-macros +Release: 9%{?dist} +Summary: Build-stage rpm automation for Go packages + +License: GPLv3+ +URL: %{forgeurl} +Source0: %{forgesource} +%if 0%{?bundle_golist} +Source1: https://pagure.io/golist/archive/v%{golist_version}/golist-%{golist_version}.tar.gz +%endif + +Requires: go-srpm-macros = %{version}-%{release} +Requires: go-filesystem = %{version}-%{release} + +%if 0%{?bundle_golist} +BuildRequires: golang +%else +Requires: golist +%endif + +%ifarch %{golang_arches} +Requires: golang +Provides: compiler(golang) +Provides: compiler(go-compiler) = 2 +Obsoletes: go-compilers-golang-compiler < %{version}-%{release} +%endif + +%ifarch %{gccgo_arches} +Requires: gcc-go +Provides: compiler(gcc-go) +Provides: compiler(go-compiler) = 1 +Obsoletes: go-compilers-gcc-go-compiler < %{version}-%{release} +%endif + +Patch0: update-default-gobuild-args.patch +# Replace golang-github-urfave-cli with a minimal +# command line parser backend to bootstrap golist +# without dependencies. +Patch1: golist-bootstrap-cli-no-vendor.patch + +%description +This package provides build-stage rpm automation to simplify the creation of Go +language (golang) packages. + +It does not need to be included in the default build root: go-srpm-macros will +pull it in for Go packages only. + +%package -n go-srpm-macros +Summary: Source-stage rpm automation for Go packages +BuildArch: noarch +Requires: redhat-rpm-config + +%description -n go-srpm-macros +This package provides SRPM-stage rpm automation to simplify the creation of Go +language (golang) packages. + +It limits itself to the automation subset required to create Go SRPM packages +and needs to be included in the default build root. + +The rest of the automation is provided by the go-rpm-macros package, that +go-srpm-macros will pull in for Go packages only. + +%package -n go-filesystem +Summary: Directories used by Go packages +License: Public Domain + +%description -n go-filesystem +This package contains the basic directory layout used by Go packages. + +%package -n go-rpm-templates +Summary: RPM spec templates for Go packages +License: MIT +BuildArch: noarch +Requires: go-rpm-macros = %{version}-%{release} +#https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/51 +#Requires: redhat-rpm-templates + +%description -n go-rpm-templates +This package contains documented rpm spec templates showcasing how to use the +macros provided by go-rpm-macros to create Go packages. + +%prep +%forgesetup + +%patch0 -p1 + +%writevars -f rpm/macros.d/macros.go-srpm golang_arches gccgo_arches gopath +for template in templates/rpm/*\.spec ; do + target=$(echo "${template}" | sed "s|^\(.*\)\.spec$|\1-bare.spec|g") + grep -v '^#' "${template}" > "${target}" + touch -r "${template}" "${target}" +done + +# unpack golist and patch +%if 0%{?bundle_golist} +pushd %{_builddir} +tar -xf %{_sourcedir}/golist-%{golist_version}.tar.gz +cd golist-%{golist_version} +%patch1 -p1 +cp %{_builddir}/golist-%{golist_version}/LICENSE %{_builddir}/go-rpm-macros-%{version}/LICENSE-golist +popd + +# create directory structure for a Go build +if [[ ! -e %{golist_builddir}/bin ]]; then + install -m 0755 -vd %{golist_builddir}/bin + export GOPATH=%{golist_builddir}:${GOPATH:+${GOPATH}:}/usr/share/gocode +fi +if [[ ! -e %{golist_builddir}/src/%{golist_goipath} ]]; then + install -m 0755 -vd %{golist_builddir}/src/pagure.io + ln -sf $(dirname %{golist_builddir}) %{golist_builddir}/src/%{golist_goipath} + +fi +%endif + +%build +# build golist +%if 0%{?bundle_golist} +pushd %{golist_builddir}/src/%{golist_goipath} +export GOPATH=%{golist_builddir}:${GOPATH:+${GOPATH}:}/usr/share/gocode +for cmd in cmd/* ; do + %gobuild -o %{golist_builddir}/bin/$(basename $cmd) %{golist_goipath}/$cmd +done +popd +%endif + +%install +# Some of those probably do not work with gcc-go right now +# This is not intentional, but mips is not a primary Fedora architecture +# Patches and PRs are welcome + +install -m 0755 -vd %{buildroot}%{gopath}/src + +install -m 0755 -vd %{buildroot}%{_spectemplatedir} + +if ls templates/rpm/*\.spec; then + install -m 0644 -vp templates/rpm/*spec \ + %{buildroot}%{_spectemplatedir} +fi + +install -m 0755 -vd %{buildroot}%{_bindir} +install -m 0755 bin/* %{buildroot}%{_bindir} + +install -m 0755 -vd %{buildroot}%{rpmmacrodir} +install -m 0644 -vp rpm/macros.d/macros.go-* \ + %{buildroot}%{rpmmacrodir} +install -m 0755 -vd %{buildroot}%{_rpmluadir}/fedora/srpm +install -m 0644 -vp rpm/lua/srpm/*lua \ + %{buildroot}%{_rpmluadir}/fedora/srpm +install -m 0755 -vd %{buildroot}%{_rpmluadir}/fedora/rpm +install -m 0644 -vp rpm/lua/rpm/*lua \ + %{buildroot}%{_rpmluadir}/fedora/rpm +install -m 0755 -vd %{buildroot}%{_rpmconfigdir}/fileattrs +install -m 0644 -vp rpm/fileattrs/*.attr \ + %{buildroot}%{_rpmconfigdir}/fileattrs/ +install -m 0755 -vp rpm/*\.{prov,deps} \ + %{buildroot}%{_rpmconfigdir}/ + +%ifarch %{golang_arches} +install -m 0644 -vp rpm/macros.d/macros.go-compilers-golang \ + %{buildroot}%{_rpmconfigdir}/macros.d/macros.go-compiler-golang +%endif + +%ifarch %{gccgo_arches} +install -m 0644 -vp rpm/macros.d/macros.go-compilers-gcc \ + %{buildroot}%{_rpmconfigdir}/macros.d/macros.go-compiler-gcc +%endif + +# install golist +%if 0%{?bundle_golist} +install -m 0755 -vd %{buildroot}%{golist_execdir} +install -m 0755 -vp %{golist_builddir}/bin/* %{buildroot}%{golist_execdir}/ +sed -i "s,golist,%{golist_execdir}/golist,g" %{buildroot}%{_bindir}/go-rpm-integration +%endif + +%files +%license LICENSE.txt LICENSE-golist +%doc README.md +%{_bindir}/* +%{_rpmconfigdir}/fileattrs/*.attr +%{_rpmconfigdir}/*.prov +%{_rpmconfigdir}/*.deps +%{_rpmconfigdir}/macros.d/macros.go-rpm* +%{_rpmconfigdir}/macros.d/macros.go-compiler* +%{_rpmluadir}/fedora/rpm/*.lua +# package golist +%if 0%{?bundle_golist} +%{golist_execdir}/golist +%endif + +%files -n go-srpm-macros +%license LICENSE.txt +%doc README.md +%{_rpmconfigdir}/macros.d/macros.go-srpm +%{_rpmluadir}/fedora/srpm/*.lua + +%files -n go-filesystem +%dir %{gopath} +%dir %{gopath}/src + +%files -n go-rpm-templates +%license LICENSE-templates.txt +%doc README.md +# https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/51 +%dir %{dirname:%{_spectemplatedir}} +%dir %{_spectemplatedir} +%{_spectemplatedir}/*.spec + +%changelog +* Tue Jan 18 2022 David Benoit 3.0.9-9 +- Delete remove-fedora-dependency-automation.patch +- Bundle golist in /usr/libexec +- Related: rhbz#2043107 + +* Mon Aug 09 2021 Mohan Boddu +- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags + Related: rhbz#1991688 + +* Tue Aug 03 2021 David Benoit 3.0.9-7 +- Escape quotation marks in gobuildflags +- Resolves: rhbz#1988717 + +* Tue Jul 27 2021 David Benoit 3.0.9-6 +- Remove arch conditional on gocompilerflags +- Related: rhbz#1982298 + +* Fri Jul 23 2021 David Benoit 3.0.9-5 +- Remove fedora-specific Go dependency automation macros +- Remove dependency on golist +- Temporarily remove incompatible template spec files +- Update gobuild flags +- Resolves: rhbz#1982298 + +* Thu Apr 15 2021 Mohan Boddu +- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 + +* Thu Feb 11 2021 Jeff Law - 3.0.9-3 +- Drop 32 bit arches in EL 9 (originally from Petr Sabata) + +* Tue Jan 26 2021 Fedora Release Engineering - 3.0.9-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Thu Aug 13 2020 Neal Gompa - 3.0.9-1 +- Update to 3.0.9 + +* Mon Jul 27 2020 Fedora Release Engineering - 3.0.8-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Tue Jan 28 2020 Fedora Release Engineering - 3.0.8-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Jul 25 2019 Fedora Release Engineering - 3.0.8-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Wed Jun 05 2019 Nicolas Mailhot +- 3.0.8-3 +- initial Fedora import, for golist 0.10.0 and redhat-rpm-config 130