Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ffa65e2103 | ||
| ccee62712b |
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
SOURCES/go-rpm-macros-3.6.0.tar.gz
|
||||
SOURCES/go-rpm-macros-3.8.1.tar.bz2
|
||||
SOURCES/golist-0.10.4-vendor.tar.xz
|
||||
SOURCES/golist-0.10.4.tar.gz
|
||||
|
||||
@ -1,2 +1,3 @@
|
||||
9db262bd1b5acd1c3490d55b839819a878e6659c SOURCES/go-rpm-macros-3.6.0.tar.gz
|
||||
5b4090f510c9aad55f858c58b6b42870f048e4db SOURCES/go-rpm-macros-3.8.1.tar.bz2
|
||||
bd3d0d5f4f5f00be280ac571e734022af4d9d80b SOURCES/golist-0.10.4-vendor.tar.xz
|
||||
4a105131658d029fe0b2d312b078a056748af2b4 SOURCES/golist-0.10.4.tar.gz
|
||||
|
||||
@ -1,322 +0,0 @@
|
||||
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, "-"), "-")
|
||||
+}
|
||||
+
|
||||
@ -1,6 +1,5 @@
|
||||
%global forgeurl https://pagure.io/go-rpm-macros
|
||||
Version: 3.6.0
|
||||
%forgemeta
|
||||
%global forgeurl https://gitlab.com/fedora/sigs/go/go-rpm-macros
|
||||
Version: 3.8.1
|
||||
|
||||
#https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/51
|
||||
%global _spectemplatedir %{_datadir}/rpmdevtools/fedora
|
||||
@ -37,14 +36,19 @@ Version: 3.6.0
|
||||
ExclusiveArch: %{golang_arches} %{gccgo_arches}
|
||||
|
||||
Name: go-rpm-macros
|
||||
Release: 7%{?dist}
|
||||
Release: 1%{?dist}
|
||||
Summary: Build-stage rpm automation for Go packages
|
||||
|
||||
License: GPLv3+
|
||||
URL: %{forgeurl}
|
||||
Source0: %{forgesource}
|
||||
Source0: %{forgeurl}/-/archive/%{version}/go-rpm-macros-%{version}.tar.bz2
|
||||
%if 0%{?bundle_golist}
|
||||
Source1: https://pagure.io/golist/archive/v%{golist_version}/golist-%{golist_version}.tar.gz
|
||||
# vendored dependency tarball, to create:
|
||||
# tar xf golist-%%{golist_version}.tar.gz ; pushd golist-%%{golist_version} ; \
|
||||
# go mod init %%{golist_goipath} && go mod tidy && go mod vendor && \
|
||||
# tar Jcf ../golist-%%{golist_version}-vendor.tar.xz go.mod go.sum vendor/ ; popd
|
||||
Source2: golist-%{golist_version}-vendor.tar.xz
|
||||
%endif
|
||||
|
||||
Requires: go-srpm-macros = %{version}-%{release}
|
||||
@ -71,10 +75,6 @@ Provides: compiler(go-compiler) = 1
|
||||
Obsoletes: go-compilers-gcc-go-compiler < %{version}-%{release}
|
||||
%endif
|
||||
|
||||
# Replace golang-github-urfave-cli with a minimal
|
||||
# command line parser backend to bootstrap golist
|
||||
# without dependencies.
|
||||
Patch1: golist-bootstrap-cli-no-vendor.patch
|
||||
# Add libexec to PATH in order to launch golist in every script
|
||||
Patch2: 0001-Add-libexec-to-path-for-EPEL9-golist.patch
|
||||
|
||||
@ -131,7 +131,7 @@ This package contains documented rpm spec templates showcasing how to use the
|
||||
macros provided by go-rpm-macros to create Go packages.
|
||||
|
||||
%prep
|
||||
%forgesetup
|
||||
%autosetup -N
|
||||
|
||||
%writevars -f rpm/macros.d/macros.go-srpm golang_arches golang_arches_future gccgo_arches gopath
|
||||
for template in templates/rpm/*\.spec ; do
|
||||
@ -143,22 +143,21 @@ done
|
||||
# unpack golist and patch
|
||||
%if 0%{?bundle_golist}
|
||||
# Add libexec to PATH
|
||||
%patch2 -p1
|
||||
%patch -P 2 -p1
|
||||
tar -xf %{SOURCE1}
|
||||
tar -C %{golist_builddir} -xf %{SOURCE2}
|
||||
pushd %{golist_builddir}
|
||||
%patch1 -p1
|
||||
popd
|
||||
cp %{golist_builddir}/LICENSE LICENSE-golist
|
||||
%endif
|
||||
|
||||
%patch3 -p1
|
||||
%patch4 -p1
|
||||
%patch -P 3 -p1
|
||||
%patch -P 4 -p1
|
||||
|
||||
%build
|
||||
# build golist
|
||||
%if 0%{?bundle_golist}
|
||||
pushd %{golist_builddir}
|
||||
go mod init %{golist_goipath} && go mod tidy
|
||||
for cmd in cmd/* ; do
|
||||
%gobuild -o bin/$(basename $cmd) ./$cmd
|
||||
done
|
||||
@ -226,7 +225,7 @@ sed -i "s,golist ,%{golist_execdir}/golist ,g" \
|
||||
%files
|
||||
%license LICENSE.txt
|
||||
%if %{defined bundle_golist}
|
||||
%license LICENSE-golist
|
||||
%license LICENSE-golist %{golist_builddir}/vendor/modules.txt
|
||||
%endif
|
||||
%doc README.md
|
||||
%{_bindir}/*
|
||||
@ -263,6 +262,30 @@ sed -i "s,golist ,%{golist_execdir}/golist ,g" \
|
||||
%{_rpmluadir}/fedora/srpm/*.lua
|
||||
|
||||
%changelog
|
||||
* Wed Oct 01 2025 Alejandro Sáez <asm@redhat.com> - 3.8.1-1
|
||||
- Update to 3.8.1
|
||||
- Changed the forgeurl to gitlab
|
||||
- Resolves: RHEL-112845
|
||||
|
||||
* Tue Apr 15 2025 Alejandro Sáez <asm@redhat.com> - 3.6.0-11
|
||||
- Bump release for el9 to avoid clash with el9_6 build
|
||||
- Related: RHEL-86067
|
||||
- Related: RHEL-7366
|
||||
|
||||
* Fri Apr 11 2025 Alejandro Sáez <asm@redhat.com> - 3.6.0-10
|
||||
- Fix malformed patch macros
|
||||
- Related: RHEL-86067
|
||||
- Related: RHEL-7366
|
||||
|
||||
* Fri Apr 04 2025 Alejandro Sáez <asm@redhat.com> - 3.6.0-9
|
||||
- Add patches back again
|
||||
- Resolves: RHEL-86067
|
||||
- Related: RHEL-7366
|
||||
|
||||
* Thu Apr 03 2025 Alejandro Sáez <asm@redhat.com> - 3.6.0-8
|
||||
- Add full golist implementation
|
||||
- Resolves: RHEL-7366
|
||||
|
||||
* Wed Nov 13 2024 Alejandro Sáez <asm@redhat.com>
|
||||
- Revert go-rpm-templates to noarch
|
||||
- Resolves: RHEL-67300
|
||||
|
||||
Loading…
Reference in New Issue
Block a user