diff --git a/Dockerfile b/Dockerfile index df4b7bf4..5e54e5d2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,7 @@ RUN pacman -Syu --overwrite=* --needed --noconfirm \ gcc gnupg libldap go git tar make awk linux-api-headers pacman-contrib && paccache -rfk0 # Dependency for linting +RUN curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b /bin v1.20.0 RUN go get golang.org/x/lint/golint && mv /root/go/bin/golint /bin/ ENV ARCH=$BUILD_ARCH diff --git a/Makefile b/Makefile index f4512174..2e25708d 100644 --- a/Makefile +++ b/Makefile @@ -82,6 +82,11 @@ test-vendor: vendor exit 1; \ fi; +.PHONY: lint +lint: + golangci-lint run + golint -set_exit_status . ./pkg/... + .PHONY: fmt fmt: #go fmt -mod=vendor $(GOFILES) ./... Doesn't work yet but will be supported soon diff --git a/callbacks.go b/callbacks.go index 5e344fec..a55d7307 100644 --- a/callbacks.go +++ b/callbacks.go @@ -25,7 +25,7 @@ func questionCallback(question alpm.QuestionAny) { size := 0 - qp.Providers(alpmHandle).ForEach(func(pkg alpm.Package) error { + _ = qp.Providers(alpmHandle).ForEach(func(pkg alpm.Package) error { size++ return nil }) @@ -36,7 +36,7 @@ func questionCallback(question alpm.QuestionAny) { size = 1 var db string - qp.Providers(alpmHandle).ForEach(func(pkg alpm.Package) error { + _ = qp.Providers(alpmHandle).ForEach(func(pkg alpm.Package) error { thisDB := pkg.DB().Name() if db != thisDB { diff --git a/clean.go b/clean.go index 44589fc3..8b2d3a67 100644 --- a/clean.go +++ b/clean.go @@ -23,7 +23,10 @@ func removeVCSPackage(pkgs []string) { } if updated { - saveVCSInfo() + err := saveVCSInfo() + if err != nil { + fmt.Fprintln(os.Stderr, err) + } } } @@ -42,13 +45,16 @@ func cleanDependencies(removeOptional bool) error { } // CleanRemove sends a full removal command to pacman with the pkgName slice -func cleanRemove(pkgNames []string) (err error) { +func cleanRemove(pkgNames []string) error { if len(pkgNames) == 0 { return nil } arguments := makeArguments() - arguments.addArg("R") + err := arguments.addArg("R") + if err != nil { + return err + } arguments.addTarget(pkgNames...) return show(passToPacman(arguments)) @@ -212,7 +218,9 @@ func cleanAfter(bases []Base) { fmt.Fprintf(os.Stderr, "error resetting %s: %s", base.String(), stderr) } - show(passToGit(dir, "clean", "-fx")) + if err := show(passToGit(dir, "clean", "-fx")); err != nil { + fmt.Fprintln(os.Stderr, err) + } } else { fmt.Printf(bold(cyan("::")+" Deleting (%d/%d): %s\n"), i+1, len(bases), cyan(dir)) if err := os.RemoveAll(dir); err != nil { diff --git a/depCheck.go b/depCheck.go index 64170869..ad19cb5b 100644 --- a/depCheck.go +++ b/depCheck.go @@ -33,7 +33,7 @@ func (dp *depPool) checkInnerConflict(name string, conflict string, conflicts ty } func (dp *depPool) checkForwardConflict(name string, conflict string, conflicts types.MapStringSet) { - dp.LocalDB.PkgCache().ForEach(func(pkg alpm.Package) error { + _ = dp.LocalDB.PkgCache().ForEach(func(pkg alpm.Package) error { if pkg.Name() == name || dp.hasPackage(pkg.Name()) { return nil } @@ -88,7 +88,7 @@ func (dp *depPool) checkInnerConflicts(conflicts types.MapStringSet) { } for _, pkg := range dp.Repo { - pkg.Conflicts().ForEach(func(conflict alpm.Depend) error { + _ = pkg.Conflicts().ForEach(func(conflict alpm.Depend) error { dp.checkInnerConflict(pkg.Name(), conflict.String(), conflicts) return nil }) @@ -103,7 +103,7 @@ func (dp *depPool) checkForwardConflicts(conflicts types.MapStringSet) { } for _, pkg := range dp.Repo { - pkg.Conflicts().ForEach(func(conflict alpm.Depend) error { + _ = pkg.Conflicts().ForEach(func(conflict alpm.Depend) error { dp.checkForwardConflict(pkg.Name(), conflict.String(), conflicts) return nil }) @@ -111,12 +111,12 @@ func (dp *depPool) checkForwardConflicts(conflicts types.MapStringSet) { } func (dp *depPool) checkReverseConflicts(conflicts types.MapStringSet) { - dp.LocalDB.PkgCache().ForEach(func(pkg alpm.Package) error { + _ = dp.LocalDB.PkgCache().ForEach(func(pkg alpm.Package) error { if dp.hasPackage(pkg.Name()) { return nil } - pkg.Conflicts().ForEach(func(conflict alpm.Depend) error { + _ = pkg.Conflicts().ForEach(func(conflict alpm.Depend) error { dp.checkReverseConflict(pkg.Name(), conflict.String(), conflicts) return nil }) @@ -243,7 +243,7 @@ func (dp *depPool) _checkMissing(dep string, stack []string, missing *missing) { repoPkg := dp.findSatisfierRepo(dep) if repoPkg != nil { missing.Good.Set(dep) - repoPkg.Depends().ForEach(func(repoDep alpm.Depend) error { + _ = repoPkg.Depends().ForEach(func(repoDep alpm.Depend) error { if _, err := dp.LocalDB.PkgCache().FindSatisfier(repoDep.String()); err == nil { missing.Good.Set(repoDep.String()) return nil diff --git a/depOrder.go b/depOrder.go index 4e572c5c..786c386f 100644 --- a/depOrder.go +++ b/depOrder.go @@ -6,16 +6,20 @@ import ( rpc "github.com/mikkeloscar/aur" ) +// Base is an AUR base package type Base []*rpc.Pkg +// Pkgbase returns the first base package. func (b Base) Pkgbase() string { return b[0].PackageBase } +// Version returns the first base package version. func (b Base) Version() string { return b[0].Version } +// URLPath returns the first base package URL. func (b Base) URLPath() string { return b[0].URLPath } @@ -94,7 +98,7 @@ func (do *depOrder) orderPkgRepo(pkg *alpm.Package, dp *depPool, runtime bool) { } delete(dp.Repo, pkg.Name()) - pkg.Depends().ForEach(func(dep alpm.Depend) (err error) { + _ = pkg.Depends().ForEach(func(dep alpm.Depend) (err error) { repoPkg := dp.findSatisfierRepo(dep.String()) if repoPkg != nil { do.orderPkgRepo(repoPkg, dp, runtime) diff --git a/depPool.go b/depPool.go index 3f8078c9..cc108fdd 100644 --- a/depPool.go +++ b/depPool.go @@ -138,7 +138,7 @@ func (dp *depPool) ResolveTargets(pkgs []string) error { group := dp.SyncDB.FindGroupPkgs(target.Name) if !group.Empty() { dp.Groups = append(dp.Groups, target.String()) - group.ForEach(func(pkg alpm.Package) error { + _ = group.ForEach(func(pkg alpm.Package) error { dp.Explicit.Set(pkg.Name()) return nil }) @@ -329,7 +329,7 @@ func (dp *depPool) resolveAURPackages(pkgs types.StringSet, explicit bool) error func (dp *depPool) ResolveRepoDependency(pkg *alpm.Package) { dp.Repo[pkg.Name()] = pkg - pkg.Depends().ForEach(func(dep alpm.Depend) (err error) { + _ = pkg.Depends().ForEach(func(dep alpm.Depend) (err error) { //have satisfier in dep tree: skip if dp.hasSatisfier(dep.String()) { return diff --git a/download.go b/download.go index 8a248720..459b808e 100644 --- a/download.go +++ b/download.go @@ -284,7 +284,7 @@ func getPkgbuildsfromABS(pkgs []string, path string) (bool, error) { pkg = db.Pkg(name) } } else { - dbList.ForEach(func(db alpm.DB) error { + _ = dbList.ForEach(func(db alpm.DB) error { if pkg = db.Pkg(name); pkg != nil { return fmt.Errorf("") } diff --git a/install.go b/install.go index 5af98e0c..d1530dda 100644 --- a/install.go +++ b/install.go @@ -171,12 +171,17 @@ func install(parser *arguments) (err error) { if do.HasMake() { switch config.RemoveMake { case "yes": - defer removeMake(do, &err) + defer func() { + err = removeMake(do) + }() + case "no": break default: if continueTask("Remove make dependencies after install?", false) { - defer removeMake(do, &err) + defer func() { + err = removeMake(do) + }() } } } @@ -210,6 +215,7 @@ func install(parser *arguments) (err error) { } if len(toDiff) > 0 { + // TODO: PKGBUILD diffs should not return in case of err. Just print and continue err = showPkgbuildDiffs(toDiff, cloned) if err != nil { return err @@ -224,7 +230,11 @@ func install(parser *arguments) (err error) { if !continueTask(bold(green("Proceed with install?")), true) { return fmt.Errorf("Aborting due to user") } - updatePkgbuildSeenRef(toDiff, cloned) + err = updatePkgbuildSeenRef(toDiff, cloned) + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + } + config.NoConfirm = oldValue } @@ -286,9 +296,15 @@ func install(parser *arguments) (err error) { } depArguments := makeArguments() - depArguments.addArg("D", "asdeps") + err = depArguments.addArg("D", "asdeps") + if err != nil { + return err + } expArguments := makeArguments() - expArguments.addArg("D", "asexplicit") + err = expArguments.addArg("D", "asexplicit") + if err != nil { + return err + } for _, pkg := range do.Repo { if !dp.Explicit.Get(pkg.Name()) && !localNamesCache.Get(pkg.Name()) && !remoteNamesCache.Get(pkg.Name()) { @@ -318,7 +334,7 @@ func install(parser *arguments) (err error) { } } - go completion.Update(alpmHandle, config.AURURL, cacheHome, config.CompletionInterval, false) + go exitOnError(completion.Update(alpmHandle, config.AURURL, cacheHome, config.CompletionInterval, false)) err = downloadPkgbuildsSources(do.Aur, incompatible) if err != nil { @@ -333,9 +349,12 @@ func install(parser *arguments) (err error) { return nil } -func removeMake(do *depOrder, err *error) { +func removeMake(do *depOrder) error { removeArguments := makeArguments() - removeArguments.addArg("R", "u") + err := removeArguments.addArg("R", "u") + if err != nil { + return err + } for _, pkg := range do.getMake() { removeArguments.addTarget(pkg) @@ -343,8 +362,10 @@ func removeMake(do *depOrder, err *error) { oldValue := config.NoConfirm config.NoConfirm = true - *err = show(passToPacman(removeArguments)) + err = show(passToPacman(removeArguments)) config.NoConfirm = oldValue + + return err } func inRepos(syncDB alpm.DBList, pkg string) bool { @@ -678,24 +699,30 @@ func editDiffNumberMenu(bases []Base, installed types.StringSet, diff bool) ([]B } func updatePkgbuildSeenRef(bases []Base, cloned types.StringSet) error { + var errMulti types.MultiError for _, base := range bases { pkg := base.Pkgbase() dir := filepath.Join(config.BuildDir, pkg) if shouldUseGit(dir) { - gitUpdateSeenRef(config.BuildDir, pkg) + err := gitUpdateSeenRef(config.BuildDir, pkg) + if err != nil { + errMulti.Add(err) + } } } - return nil + return errMulti.Return() } func showPkgbuildDiffs(bases []Base, cloned types.StringSet) error { + var errMulti types.MultiError for _, base := range bases { pkg := base.Pkgbase() dir := filepath.Join(config.BuildDir, pkg) if shouldUseGit(dir) { start, err := getLastSeenHash(config.BuildDir, pkg) if err != nil { - return err + errMulti.Add(err) + continue } if cloned.Get(pkg) { @@ -703,7 +730,8 @@ func showPkgbuildDiffs(bases []Base, cloned types.StringSet) error { } else { hasDiff, err := gitHasDiff(config.BuildDir, pkg) if err != nil { - return err + errMulti.Add(err) + continue } if !hasDiff { @@ -720,7 +748,8 @@ func showPkgbuildDiffs(bases []Base, cloned types.StringSet) error { } err = show(passToGit(dir, args...)) if err != nil { - return err + errMulti.Add(err) + continue } } else { args := []string{"diff"} @@ -731,11 +760,15 @@ func showPkgbuildDiffs(bases []Base, cloned types.StringSet) error { } args = append(args, "--no-index", "/var/empty", dir) // git always returns 1. why? I have no idea - show(passToGit(dir, args...)) + err := show(passToGit(dir, args...)) + if err != nil { + errMulti.Add(err) + continue + } } } - return nil + return errMulti.Return() } func editPkgbuilds(bases []Base, srcinfos map[string]*gosrc.Srcinfo) error { @@ -965,14 +998,22 @@ func buildInstallPkgbuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc } if installed { - show(passToMakepkg(dir, "-c", "--nobuild", "--noextract", "--ignorearch")) + err = show(passToMakepkg(dir, "-c", "--nobuild", "--noextract", "--ignorearch")) + if err != nil { + return fmt.Errorf("Error making: %s", err) + } + fmt.Println(cyan(pkg+"-"+version) + bold(" is up to date -- skipping")) continue } } if built { - show(passToMakepkg(dir, "-c", "--nobuild", "--noextract", "--ignorearch")) + err = show(passToMakepkg(dir, "-c", "--nobuild", "--noextract", "--ignorearch")) + if err != nil { + return fmt.Errorf("Error making: %s", err) + } + fmt.Println(bold(yellow(arrow)), cyan(pkg+"-"+version)+bold(" already made -- skipping build")) } else { @@ -1021,9 +1062,15 @@ func buildInstallPkgbuilds(dp *depPool, do *depOrder, srcinfos map[string]*gosrc } depArguments := makeArguments() - depArguments.addArg("D", "asdeps") + err = depArguments.addArg("D", "asdeps") + if err != nil { + return err + } expArguments := makeArguments() - expArguments.addArg("D", "asexplicit") + err = expArguments.addArg("D", "asexplicit") + if err != nil { + return err + } //remotenames: names of all non repo packages on the system _, _, localNames, remoteNames, err := filterPackages() diff --git a/keys_test.go b/keys_test.go index 1b563682..9064acad 100644 --- a/keys_test.go +++ b/keys_test.go @@ -29,7 +29,10 @@ func init() { data = getPgpKey(matches[1]) } w.Header().Set("Content-Type", "application/pgp-keys") - w.Write([]byte(data)) + _, err := w.Write([]byte(data)) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } }) } @@ -54,7 +57,10 @@ func startPgpKeyServer() *http.Server { srv := &http.Server{Addr: fmt.Sprintf("127.0.0.1:%d", gpgServerPort)} go func() { - srv.ListenAndServe() + err := srv.ListenAndServe() + if err != nil { + fmt.Fprintln(os.Stderr, err) + } }() return srv } @@ -70,7 +76,12 @@ func TestImportKeys(t *testing.T) { config.GpgFlags = fmt.Sprintf("--homedir %s --keyserver 127.0.0.1", keyringDir) server := startPgpKeyServer() - defer server.Shutdown(context.TODO()) + defer func() { + err := server.Shutdown(context.TODO()) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + }() casetests := []struct { keys []string @@ -143,7 +154,12 @@ func TestCheckPgpKeys(t *testing.T) { config.GpgFlags = fmt.Sprintf("--homedir %s --keyserver 127.0.0.1", keyringDir) server := startPgpKeyServer() - defer server.Shutdown(context.TODO()) + defer func() { + err := server.Shutdown(context.TODO()) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + }() casetests := []struct { pkgs Base diff --git a/main.go b/main.go index 221561d9..4475adb9 100644 --- a/main.go +++ b/main.go @@ -214,7 +214,10 @@ func main() { exitOnError(initConfig()) exitOnError(cmdArgs.parseCommandLine()) if shouldSaveConfig { - config.saveConfig() + err := config.saveConfig() + if err != nil { + fmt.Fprintln(os.Stderr, err) + } } config.expandEnv() exitOnError(initBuildDir()) diff --git a/parser.go b/parser.go index a6b3eb51..fc3d4a06 100644 --- a/parser.go +++ b/parser.go @@ -757,7 +757,11 @@ func (parser *arguments) parseCommandLine() (err error) { usedNext := false if len(args) < 1 { - parser.parseShortOption("-Syu", "") + _, err = parser.parseShortOption("-Syu", "") + if err != nil { + return + } + } else { for k, arg := range args { var nextArg string diff --git a/pkg/completion/completion.go b/pkg/completion/completion.go index b0ecc39a..a4df5176 100644 --- a/pkg/completion/completion.go +++ b/pkg/completion/completion.go @@ -36,7 +36,10 @@ func Update(alpmHandle *alpm.Handle, aurURL string, cacheDir string, interval in info, err := os.Stat(path) if os.IsNotExist(err) || (interval != -1 && time.Since(info.ModTime()).Hours() >= float64(interval*24)) || force { - os.MkdirAll(filepath.Dir(path), 0755) + errd := os.MkdirAll(filepath.Dir(path), 0755) + if errd != nil { + return errd + } out, errf := os.Create(path) if errf != nil { return errf diff --git a/query.go b/query.go index a52ecba1..1fa77e9e 100644 --- a/query.go +++ b/query.go @@ -265,7 +265,7 @@ func queryRepo(pkgInputN []string) (s repoQuery, err error) { return } - dbList.ForEach(func(db alpm.DB) error { + _ = dbList.ForEach(func(db alpm.DB) error { if len(pkgInputN) == 0 { pkgs := db.PkgCache() s = append(s, pkgs.Slice()...) @@ -353,13 +353,13 @@ func hangingPackages(removeOptional bool) (hanging []string, err error) { safePackages[pkg.Name()] = 0 } - pkg.Provides().ForEach(func(dep alpm.Depend) error { + _ = pkg.Provides().ForEach(func(dep alpm.Depend) error { provides.Add(dep.Name, pkg.Name()) return nil }) return nil } - packages.ForEach(setupResources) + _ = packages.ForEach(setupResources) iterateAgain := true processDependencies := func(pkg alpm.Package) error { @@ -394,20 +394,20 @@ func hangingPackages(removeOptional bool) (hanging []string, err error) { return nil } - pkg.Depends().ForEach(markDependencies) + _ = pkg.Depends().ForEach(markDependencies) if !removeOptional { - pkg.OptionalDepends().ForEach(markDependencies) + _ = pkg.OptionalDepends().ForEach(markDependencies) } return nil } for iterateAgain { iterateAgain = false - packages.ForEach(processDependencies) + _ = packages.ForEach(processDependencies) } // Build list of packages to be removed - packages.ForEach(func(pkg alpm.Package) error { + _ = packages.ForEach(func(pkg alpm.Package) error { if safePackages[pkg.Name()] == 0 { hanging = append(hanging, pkg.Name()) } diff --git a/testdata/travis.sh b/testdata/travis.sh index 8272d6d4..972329d1 100755 --- a/testdata/travis.sh +++ b/testdata/travis.sh @@ -1,35 +1,50 @@ #!/bin/bash -set -evx +#set -evx # Objective of this script is to be the most vendor agnostic possible # It builds and tests yay independently of hardware -export VERSION=$(git describe --long --tags | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g') +VERSION="$(git describe --long --tags | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g')" +export VERSION export ARCH="x86_64" -echo '::set-env name=VERSION::$VERSION' -echo '::set-env name=ARCH::$ARCH' -docker build --build-arg BUILD_ARCH=${ARCH} --target builder_env -t yay-builder_env . -docker build --build-arg BUILD_ARCH=${ARCH} --target builder -t yay-builder . +docker build --build-arg BUILD_ARCH=${ARCH} --target builder_env -t yay-builder_env . || exit $? +docker build --build-arg BUILD_ARCH=${ARCH} --target builder -t yay-builder . || exit $? # Our unit test and packaging container docker run --name yay-go-tests yay-builder_env:latest make test +rc=$? docker rm yay-go-tests -# docker run yay-builder make lint +if [[ $rc != 0 ]]; then + exit $rc +fi + +# Lint project +docker run --name yay-go-lint yay-builder_env:latest make lint +rc=$? +docker rm yay-go-lint + +if [[ $rc != 0 ]]; then + exit $rc +fi # Build image for integration testing -docker build -t yay . - +# docker build -t yay . || exit $? # Do integration testing # TODO # Create a release asset -docker run --name artifact_factory yay-builder make release ARCH=${ARCH} VERSION=${VERSION} +docker run --name artifact_factory yay-builder make release ARCH=${ARCH} VERSION="${VERSION}" +rc=$? +if [[ $rc != 0 ]]; then + docker rm artifact_factory + exit $rc +fi # Copy bin and release to artifacts folder mkdir artifacts -docker cp artifact_factory:/app/yay_${VERSION}_${ARCH}.tar.gz ./artifacts/ +docker cp artifact_factory:/app/yay_"${VERSION}"_${ARCH}.tar.gz ./artifacts/ # Cleanup docker docker rm artifact_factory diff --git a/upgrade.go b/upgrade.go index dfe02553..df66ddde 100644 --- a/upgrade.go +++ b/upgrade.go @@ -302,10 +302,15 @@ func upRepo(local []alpm.Package) (upSlice, error) { return slice, err } - defer alpmHandle.TransRelease() + defer func() { + err = alpmHandle.TransRelease() + }() - alpmHandle.SyncSysupgrade(cmdArgs.existsDouble("u", "sysupgrade")) - alpmHandle.TransGetAdd().ForEach(func(pkg alpm.Package) error { + err = alpmHandle.SyncSysupgrade(cmdArgs.existsDouble("u", "sysupgrade")) + if err != nil { + return slice, err + } + _ = alpmHandle.TransGetAdd().ForEach(func(pkg alpm.Package) error { localVer := "-" if localPkg := localDB.Pkg(pkg.Name()); localPkg != nil { diff --git a/vcs.go b/vcs.go index f777454b..164113e5 100644 --- a/vcs.go +++ b/vcs.go @@ -39,8 +39,15 @@ func createDevelDB() error { bases := getBases(info) toSkip := pkgbuildsToSkip(bases, types.SliceToStringSet(remoteNames)) - downloadPkgbuilds(bases, toSkip, config.BuildDir) - srcinfos, _ := parseSrcinfoFiles(bases, false) + _, err = downloadPkgbuilds(bases, toSkip, config.BuildDir) + if err != nil { + return err + } + + srcinfos, err := parseSrcinfoFiles(bases, false) + if err != nil { + return err + } for _, pkgbuild := range srcinfos { for _, pkg := range pkgbuild.Packages { @@ -134,7 +141,10 @@ func updateVCSData(pkgName string, sources []gosrc.ArchString, mux *sync.Mutex, savedInfo[pkgName] = info fmt.Println(bold(yellow(arrow)) + " Found git repo: " + cyan(url)) - saveVCSInfo() + err := saveVCSInfo() + if err != nil { + fmt.Fprintln(os.Stderr, err) + } mux.Unlock() } @@ -163,7 +173,10 @@ func getCommit(url string, branch string, protocols []string) string { //machine but using http:// instead of git does not hang. //Introduce a time out so this can not hang timer := time.AfterFunc(5*time.Second, func() { - cmd.Process.Kill() + err = cmd.Process.Kill() + if err != nil { + fmt.Fprintln(os.Stderr, err) + } }) err = cmd.Wait()