Errorlint sweep + minor linter tweaks (#1796)

* Replace error assertions with Go 1.13 style

Use `errors.As(..)` over type assertions. This enables better use of
wrapped errors in the future, and lets us pass some errorlint checks
in the process.

The rewrite is entirely mechanical, and uses a standard idiom for
doing so.

* Use Go 1.13's errors.Is(..)

Rather than directly checking for error equality, use errors.Is(..).

This protects against error wrapping issues in the future.

Even though something like sql.ErrNoRows doesn't need the wrapping, do
so anyway, for the sake of consistency throughout the code base.

The change almost lets us pass the `errorlint` Go checker except for
a missing case in `js.go` which is to be handled separately; it isn't
mechanical, like these changes are.

* Remove goconst

goconst isn't a useful linter in many cases, because it's false positive
rate is high. It's 100% for the current code base.

* Avoid direct comparison of errors in recover()

Assert that we are catching an error from recover(). If we are,
check that the error caught matches errStop.

* Enable the "errorlint" checker

Configure the checker to avoid checking for errorf wraps. These are
often false positives since the suggestion is to blanket wrap errors
with %w, and that exposes the underlying API which you might not want
to do.

The other warnings are good however, and with the current patch stack,
the code base passes all these checks as well.

* Configure rowserrcheck

The project uses sqlx. Configure rowserrcheck to include said package.

* Mechanically rewrite a large set of errors

Mechanically search for errors that look like

    fmt.Errorf("...%s", err.Error())

and rewrite those into

    fmt.Errorf("...%v", err)

The `fmt` package is error-aware and knows how to call err.Error()
itself.

The rationale is that this is more idiomatic Go; it paves the
way for using error wrapping later with %w in some sites.

This patch only addresses the entirely mechanical rewriting caught by
a project-side search/replace. There are more individual sites not
addressed by this patch.
This commit is contained in:
SmallCoccinelle
2021-10-12 05:03:08 +02:00
committed by GitHub
parent 38384f2c60
commit c6f6205e4f
46 changed files with 176 additions and 143 deletions

View File

@@ -20,13 +20,13 @@ linters:
# Linters added by the stash project # Linters added by the stash project
# - bodyclose # - bodyclose
- dogsled - dogsled
# - errorlint - errorlint
# - exhaustive # - exhaustive
- exportloopref - exportloopref
# - goconst
# - gocritic # - gocritic
# - goerr113 # - goerr113
- gofmt - gofmt
# - gomnd
# - gosec # - gosec
# - ifshort # - ifshort
- misspell - misspell
@@ -41,6 +41,13 @@ linters-settings:
gofmt: gofmt:
simplify: false simplify: false
errorlint:
# Disable errorf because there are false positives, where you don't want to wrap
# an error.
errorf: false
asserts: true
comparison: true
revive: revive:
ignore-generated-header: true ignore-generated-header: true
severity: error severity: error
@@ -80,3 +87,7 @@ linters-settings:
disabled: true disabled: true
- name: unreachable-code - name: unreachable-code
- name: redefines-builtin-id - name: redefines-builtin-id
rowserrcheck:
packages:
- github.com/jmoiron/sqlx

View File

@@ -1,6 +1,7 @@
package api package api
import ( import (
"errors"
"net" "net"
"net/http" "net/http"
"net/url" "net/url"
@@ -39,7 +40,7 @@ func authenticateHandler() func(http.Handler) http.Handler {
userID, err := manager.GetInstance().SessionStore.Authenticate(w, r) userID, err := manager.GetInstance().SessionStore.Authenticate(w, r)
if err != nil { if err != nil {
if err != session.ErrUnauthorized { if errors.Is(err, session.ErrUnauthorized) {
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
_, err = w.Write([]byte(err.Error())) _, err = w.Write([]byte(err.Error()))
if err != nil { if err != nil {
@@ -55,16 +56,18 @@ func authenticateHandler() func(http.Handler) http.Handler {
} }
if err := session.CheckAllowPublicWithoutAuth(c, r); err != nil { if err := session.CheckAllowPublicWithoutAuth(c, r); err != nil {
switch err := err.(type) { var externalAccess session.ExternalAccessError
case session.ExternalAccessError: var untrustedProxy session.UntrustedProxyError
securityActivateTripwireAccessedFromInternetWithoutAuth(c, err, w) switch {
case errors.As(err, &externalAccess):
securityActivateTripwireAccessedFromInternetWithoutAuth(c, externalAccess, w)
return return
case session.UntrustedProxyError: case errors.As(err, &untrustedProxy):
logger.Warnf("Rejected request from untrusted proxy: %s", net.IP(err).String()) logger.Warnf("Rejected request from untrusted proxy: %v", net.IP(untrustedProxy))
w.WriteHeader(http.StatusForbidden) w.WriteHeader(http.StatusForbidden)
return return
default: default:
logger.Errorf("Error checking external access security: %s", err.Error()) logger.Errorf("Error checking external access security: %v", err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

View File

@@ -229,7 +229,7 @@ func Start(uiBox embed.FS, loginUIBox embed.FS) {
tlsConfig, err := makeTLSConfig(c) tlsConfig, err := makeTLSConfig(c)
if err != nil { if err != nil {
// assume we don't want to start with a broken TLS configuration // assume we don't want to start with a broken TLS configuration
panic(fmt.Errorf("error loading TLS config: %s", err.Error())) panic(fmt.Errorf("error loading TLS config: %v", err))
} }
server := &http.Server{ server := &http.Server{
@@ -296,7 +296,7 @@ func makeTLSConfig(c *config.Instance) (*tls.Config, error) {
certs := make([]tls.Certificate, 1) certs := make([]tls.Certificate, 1)
certs[0], err = tls.X509KeyPair(cert, key) certs[0], err = tls.X509KeyPair(cert, key)
if err != nil { if err != nil {
return nil, fmt.Errorf("error parsing key pair: %s", err.Error()) return nil, fmt.Errorf("error parsing key pair: %v", err)
} }
tlsConfig := &tls.Config{ tlsConfig := &tls.Config{
Certificates: certs, Certificates: certs,

View File

@@ -2,6 +2,7 @@ package api
import ( import (
"embed" "embed"
"errors"
"fmt" "fmt"
"html/template" "html/template"
"net/http" "net/http"
@@ -60,7 +61,7 @@ func handleLogin(loginUIBox embed.FS) http.HandlerFunc {
} }
err := manager.GetInstance().SessionStore.Login(w, r) err := manager.GetInstance().SessionStore.Login(w, r)
if err == session.ErrInvalidCredentials { if errors.Is(err, session.ErrInvalidCredentials) {
// redirect back to the login page with an error // redirect back to the login page with an error
redirectToLogin(loginUIBox, w, url, "Username or password is invalid") redirectToLogin(loginUIBox, w, url, "Username or password is invalid")
return return

View File

@@ -2,6 +2,7 @@ package database
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"strings" "strings"
@@ -21,7 +22,7 @@ func createImagesChecksumIndex() error {
return WithTxn(func(tx *sqlx.Tx) error { return WithTxn(func(tx *sqlx.Tx) error {
row := tx.QueryRow("SELECT 1 AS found FROM sqlite_master WHERE type = 'index' AND name = 'images_checksum_unique'") row := tx.QueryRow("SELECT 1 AS found FROM sqlite_master WHERE type = 'index' AND name = 'images_checksum_unique'")
err := row.Err() err := row.Err()
if err != nil && err != sql.ErrNoRows { if err != nil && !errors.Is(err, sql.ErrNoRows) {
return err return err
} }
@@ -55,7 +56,7 @@ func createImagesChecksumIndex() error {
} }
err = tx.Select(&result, "SELECT checksum FROM images GROUP BY checksum HAVING COUNT(1) > 1") err = tx.Select(&result, "SELECT checksum FROM images GROUP BY checksum HAVING COUNT(1) > 1")
if err != nil && err != sql.ErrNoRows { if err != nil && !errors.Is(err, sql.ErrNoRows) {
logger.Errorf("Unable to determine non-unique image checksums: %s", err) logger.Errorf("Unable to determine non-unique image checksums: %s", err)
return nil return nil
} }

View File

@@ -63,13 +63,13 @@ func Initialize(databasePath string) error {
dbPath = databasePath dbPath = databasePath
if err := getDatabaseSchemaVersion(); err != nil { if err := getDatabaseSchemaVersion(); err != nil {
return fmt.Errorf("error getting database schema version: %s", err.Error()) return fmt.Errorf("error getting database schema version: %v", err)
} }
if databaseSchemaVersion == 0 { if databaseSchemaVersion == 0 {
// new database, just run the migrations // new database, just run the migrations
if err := RunMigrations(); err != nil { if err := RunMigrations(); err != nil {
return fmt.Errorf("error running initial schema migrations: %s", err.Error()) return fmt.Errorf("error running initial schema migrations: %v", err)
} }
// RunMigrations calls Initialise. Just return // RunMigrations calls Initialise. Just return
return nil return nil
@@ -298,7 +298,7 @@ func registerCustomDriver() {
}) })
if err != nil { if err != nil {
return fmt.Errorf("error registering natural sort collation: %s", err.Error()) return fmt.Errorf("error registering natural sort collation: %v", err)
} }
return nil return nil

View File

@@ -78,7 +78,7 @@ func (i *Importer) populateStudio() error {
if i.Input.Studio != "" { if i.Input.Studio != "" {
studio, err := i.StudioWriter.FindByName(i.Input.Studio, false) studio, err := i.StudioWriter.FindByName(i.Input.Studio, false)
if err != nil { if err != nil {
return fmt.Errorf("error finding studio by name: %s", err.Error()) return fmt.Errorf("error finding studio by name: %v", err)
} }
if studio == nil { if studio == nil {
@@ -147,7 +147,7 @@ func (i *Importer) populatePerformers() error {
if i.MissingRefBehaviour == models.ImportMissingRefEnumCreate { if i.MissingRefBehaviour == models.ImportMissingRefEnumCreate {
createdPerformers, err := i.createPerformers(missingPerformers) createdPerformers, err := i.createPerformers(missingPerformers)
if err != nil { if err != nil {
return fmt.Errorf("error creating gallery performers: %s", err.Error()) return fmt.Errorf("error creating gallery performers: %v", err)
} }
performers = append(performers, createdPerformers...) performers = append(performers, createdPerformers...)
@@ -203,7 +203,7 @@ func (i *Importer) populateTags() error {
if i.MissingRefBehaviour == models.ImportMissingRefEnumCreate { if i.MissingRefBehaviour == models.ImportMissingRefEnumCreate {
createdTags, err := i.createTags(missingTags) createdTags, err := i.createTags(missingTags)
if err != nil { if err != nil {
return fmt.Errorf("error creating gallery tags: %s", err.Error()) return fmt.Errorf("error creating gallery tags: %v", err)
} }
tags = append(tags, createdTags...) tags = append(tags, createdTags...)
@@ -242,7 +242,7 @@ func (i *Importer) PostImport(id int) error {
} }
if err := i.ReaderWriter.UpdatePerformers(id, performerIDs); err != nil { if err := i.ReaderWriter.UpdatePerformers(id, performerIDs); err != nil {
return fmt.Errorf("failed to associate performers: %s", err.Error()) return fmt.Errorf("failed to associate performers: %v", err)
} }
} }
@@ -252,7 +252,7 @@ func (i *Importer) PostImport(id int) error {
tagIDs = append(tagIDs, t.ID) tagIDs = append(tagIDs, t.ID)
} }
if err := i.ReaderWriter.UpdateTags(id, tagIDs); err != nil { if err := i.ReaderWriter.UpdateTags(id, tagIDs); err != nil {
return fmt.Errorf("failed to associate tags: %s", err.Error()) return fmt.Errorf("failed to associate tags: %v", err)
} }
} }
@@ -280,7 +280,7 @@ func (i *Importer) FindExistingID() (*int, error) {
func (i *Importer) Create() (*int, error) { func (i *Importer) Create() (*int, error) {
created, err := i.ReaderWriter.Create(i.gallery) created, err := i.ReaderWriter.Create(i.gallery)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating gallery: %s", err.Error()) return nil, fmt.Errorf("error creating gallery: %v", err)
} }
id := created.ID id := created.ID
@@ -292,7 +292,7 @@ func (i *Importer) Update(id int) error {
gallery.ID = id gallery.ID = id
_, err := i.ReaderWriter.Update(gallery) _, err := i.ReaderWriter.Update(gallery)
if err != nil { if err != nil {
return fmt.Errorf("error updating existing gallery: %s", err.Error()) return fmt.Errorf("error updating existing gallery: %v", err)
} }
return nil return nil

View File

@@ -75,7 +75,7 @@ func GetStudioName(reader models.StudioReader, image *models.Image) (string, err
// func GetGalleryChecksum(reader models.GalleryReader, image *models.Image) (string, error) { // func GetGalleryChecksum(reader models.GalleryReader, image *models.Image) (string, error) {
// gallery, err := reader.FindByImageID(image.ID) // gallery, err := reader.FindByImageID(image.ID)
// if err != nil { // if err != nil {
// return "", fmt.Errorf("error getting image gallery: %s", err.Error()) // return "", fmt.Errorf("error getting image gallery: %v", err)
// } // }
// if gallery != nil { // if gallery != nil {

View File

@@ -86,7 +86,7 @@ func (i *Importer) populateStudio() error {
if i.Input.Studio != "" { if i.Input.Studio != "" {
studio, err := i.StudioWriter.FindByName(i.Input.Studio, false) studio, err := i.StudioWriter.FindByName(i.Input.Studio, false)
if err != nil { if err != nil {
return fmt.Errorf("error finding studio by name: %s", err.Error()) return fmt.Errorf("error finding studio by name: %v", err)
} }
if studio == nil { if studio == nil {
@@ -131,7 +131,7 @@ func (i *Importer) populateGalleries() error {
for _, checksum := range i.Input.Galleries { for _, checksum := range i.Input.Galleries {
gallery, err := i.GalleryWriter.FindByChecksum(checksum) gallery, err := i.GalleryWriter.FindByChecksum(checksum)
if err != nil { if err != nil {
return fmt.Errorf("error finding gallery: %s", err.Error()) return fmt.Errorf("error finding gallery: %v", err)
} }
if gallery == nil { if gallery == nil {
@@ -179,7 +179,7 @@ func (i *Importer) populatePerformers() error {
if i.MissingRefBehaviour == models.ImportMissingRefEnumCreate { if i.MissingRefBehaviour == models.ImportMissingRefEnumCreate {
createdPerformers, err := i.createPerformers(missingPerformers) createdPerformers, err := i.createPerformers(missingPerformers)
if err != nil { if err != nil {
return fmt.Errorf("error creating image performers: %s", err.Error()) return fmt.Errorf("error creating image performers: %v", err)
} }
performers = append(performers, createdPerformers...) performers = append(performers, createdPerformers...)
@@ -232,7 +232,7 @@ func (i *Importer) PostImport(id int) error {
} }
if err := i.ReaderWriter.UpdateGalleries(id, galleryIDs); err != nil { if err := i.ReaderWriter.UpdateGalleries(id, galleryIDs); err != nil {
return fmt.Errorf("failed to associate galleries: %s", err.Error()) return fmt.Errorf("failed to associate galleries: %v", err)
} }
} }
@@ -243,7 +243,7 @@ func (i *Importer) PostImport(id int) error {
} }
if err := i.ReaderWriter.UpdatePerformers(id, performerIDs); err != nil { if err := i.ReaderWriter.UpdatePerformers(id, performerIDs); err != nil {
return fmt.Errorf("failed to associate performers: %s", err.Error()) return fmt.Errorf("failed to associate performers: %v", err)
} }
} }
@@ -253,7 +253,7 @@ func (i *Importer) PostImport(id int) error {
tagIDs = append(tagIDs, t.ID) tagIDs = append(tagIDs, t.ID)
} }
if err := i.ReaderWriter.UpdateTags(id, tagIDs); err != nil { if err := i.ReaderWriter.UpdateTags(id, tagIDs); err != nil {
return fmt.Errorf("failed to associate tags: %s", err.Error()) return fmt.Errorf("failed to associate tags: %v", err)
} }
} }
@@ -284,7 +284,7 @@ func (i *Importer) FindExistingID() (*int, error) {
func (i *Importer) Create() (*int, error) { func (i *Importer) Create() (*int, error) {
created, err := i.ReaderWriter.Create(i.image) created, err := i.ReaderWriter.Create(i.image)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating image: %s", err.Error()) return nil, fmt.Errorf("error creating image: %v", err)
} }
id := created.ID id := created.ID
@@ -298,7 +298,7 @@ func (i *Importer) Update(id int) error {
i.ID = id i.ID = id
_, err := i.ReaderWriter.UpdateFull(image) _, err := i.ReaderWriter.UpdateFull(image)
if err != nil { if err != nil {
return fmt.Errorf("error updating existing image: %s", err.Error()) return fmt.Errorf("error updating existing image: %v", err)
} }
return nil return nil
@@ -327,7 +327,7 @@ func importTags(tagWriter models.TagReaderWriter, names []string, missingRefBeha
if missingRefBehaviour == models.ImportMissingRefEnumCreate { if missingRefBehaviour == models.ImportMissingRefEnumCreate {
createdTags, err := createTags(tagWriter, missingTags) createdTags, err := createTags(tagWriter, missingTags)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating tags: %s", err.Error()) return nil, fmt.Errorf("error creating tags: %v", err)
} }
tags = append(tags, createdTags...) tags = append(tags, createdTags...)

View File

@@ -1,6 +1,7 @@
package config package config
import ( import (
"errors"
"fmt" "fmt"
"net" "net"
"os" "os"
@@ -85,7 +86,8 @@ func initConfig(flags flagStruct) error {
err := viper.ReadInConfig() // Find and read the config file err := viper.ReadInConfig() // Find and read the config file
// if not found, assume its a new system // if not found, assume its a new system
if _, isMissing := err.(viper.ConfigFileNotFoundError); isMissing { var notFoundErr viper.ConfigFileNotFoundError
if errors.As(err, &notFoundErr) {
instance.isNewSystem = true instance.isNewSystem = true
return nil return nil
} else if err != nil { } else if err != nil {

View File

@@ -25,7 +25,7 @@ func performImport(i importer, duplicateBehaviour models.ImportDuplicateEnum) er
name := i.Name() name := i.Name()
existing, err := i.FindExistingID() existing, err := i.FindExistingID()
if err != nil { if err != nil {
return fmt.Errorf("error finding existing objects: %s", err.Error()) return fmt.Errorf("error finding existing objects: %v", err)
} }
var id int var id int
@@ -41,13 +41,13 @@ func performImport(i importer, duplicateBehaviour models.ImportDuplicateEnum) er
// must be overwriting // must be overwriting
id = *existing id = *existing
if err := i.Update(id); err != nil { if err := i.Update(id); err != nil {
return fmt.Errorf("error updating existing object: %s", err.Error()) return fmt.Errorf("error updating existing object: %v", err)
} }
} else { } else {
// creating // creating
createdID, err := i.Create() createdID, err := i.Create()
if err != nil { if err != nil {
return fmt.Errorf("error creating object: %s", err.Error()) return fmt.Errorf("error creating object: %v", err)
} }
id = *createdID id = *createdID

View File

@@ -302,19 +302,19 @@ func (s *singleton) Setup(input models.SetupInput) error {
configDir := filepath.Dir(input.ConfigLocation) configDir := filepath.Dir(input.ConfigLocation)
if exists, _ := utils.DirExists(configDir); !exists { if exists, _ := utils.DirExists(configDir); !exists {
if err := os.Mkdir(configDir, 0755); err != nil { if err := os.Mkdir(configDir, 0755); err != nil {
return fmt.Errorf("abc: %s", err.Error()) return fmt.Errorf("abc: %v", err)
} }
} }
// create the generated directory if it does not exist // create the generated directory if it does not exist
if exists, _ := utils.DirExists(input.GeneratedLocation); !exists { if exists, _ := utils.DirExists(input.GeneratedLocation); !exists {
if err := os.Mkdir(input.GeneratedLocation, 0755); err != nil { if err := os.Mkdir(input.GeneratedLocation, 0755); err != nil {
return fmt.Errorf("error creating generated directory: %s", err.Error()) return fmt.Errorf("error creating generated directory: %v", err)
} }
} }
if err := utils.Touch(input.ConfigLocation); err != nil { if err := utils.Touch(input.ConfigLocation); err != nil {
return fmt.Errorf("error creating config file: %s", err.Error()) return fmt.Errorf("error creating config file: %v", err)
} }
s.Config.SetConfigFile(input.ConfigLocation) s.Config.SetConfigFile(input.ConfigLocation)
@@ -324,12 +324,12 @@ func (s *singleton) Setup(input models.SetupInput) error {
s.Config.Set(config.Database, input.DatabaseFile) s.Config.Set(config.Database, input.DatabaseFile)
s.Config.Set(config.Stash, input.Stashes) s.Config.Set(config.Stash, input.Stashes)
if err := s.Config.Write(); err != nil { if err := s.Config.Write(); err != nil {
return fmt.Errorf("error writing configuration file: %s", err.Error()) return fmt.Errorf("error writing configuration file: %v", err)
} }
// initialise the database // initialise the database
if err := s.PostInit(); err != nil { if err := s.PostInit(); err != nil {
return fmt.Errorf("error initializing the database: %s", err.Error()) return fmt.Errorf("error initializing the database: %v", err)
} }
s.Config.FinalizeSetup() s.Config.FinalizeSetup()

View File

@@ -663,7 +663,7 @@ func (s *singleton) StashBoxBatchPerformerTag(ctx context.Context, input models.
performers, err = performerQuery.FindByStashIDStatus(false, box.Endpoint) performers, err = performerQuery.FindByStashIDStatus(false, box.Endpoint)
} }
if err != nil { if err != nil {
return fmt.Errorf("error querying performers: %s", err.Error()) return fmt.Errorf("error querying performers: %v", err)
} }
for _, performer := range performers { for _, performer := range performers {

View File

@@ -194,7 +194,7 @@ func GetSceneFileContainer(scene *models.Scene) (ffmpeg.Container, error) {
// shouldn't happen, fallback to ffprobe // shouldn't happen, fallback to ffprobe
tmpVideoFile, err := ffmpeg.NewVideoFile(GetInstance().FFProbePath, scene.Path, false) tmpVideoFile, err := ffmpeg.NewVideoFile(GetInstance().FFProbePath, scene.Path, false)
if err != nil { if err != nil {
return ffmpeg.Container(""), fmt.Errorf("error reading video file: %s", err.Error()) return ffmpeg.Container(""), fmt.Errorf("error reading video file: %v", err)
} }
container = ffmpeg.MatchContainer(tmpVideoFile.Container, scene.Path) container = ffmpeg.MatchContainer(tmpVideoFile.Container, scene.Path)

View File

@@ -24,7 +24,7 @@ func ValidateModifyStudio(studio models.StudioPartial, qb models.StudioReader) e
currentStudio, err := qb.Find(int(currentParentID.Int64)) currentStudio, err := qb.Find(int(currentParentID.Int64))
if err != nil { if err != nil {
return fmt.Errorf("error finding parent studio: %s", err.Error()) return fmt.Errorf("error finding parent studio: %v", err)
} }
currentParentID = currentStudio.ParentID currentParentID = currentStudio.ParentID

View File

@@ -73,19 +73,19 @@ func (j *autoTagJob) autoTagSpecific(ctx context.Context, progress *job.Progress
if performerCount == 1 && performerIds[0] == wildcard { if performerCount == 1 && performerIds[0] == wildcard {
performerCount, err = performerQuery.Count() performerCount, err = performerQuery.Count()
if err != nil { if err != nil {
return fmt.Errorf("error getting performer count: %s", err.Error()) return fmt.Errorf("error getting performer count: %v", err)
} }
} }
if studioCount == 1 && studioIds[0] == wildcard { if studioCount == 1 && studioIds[0] == wildcard {
studioCount, err = studioQuery.Count() studioCount, err = studioQuery.Count()
if err != nil { if err != nil {
return fmt.Errorf("error getting studio count: %s", err.Error()) return fmt.Errorf("error getting studio count: %v", err)
} }
} }
if tagCount == 1 && tagIds[0] == wildcard { if tagCount == 1 && tagIds[0] == wildcard {
tagCount, err = tagQuery.Count() tagCount, err = tagQuery.Count()
if err != nil { if err != nil {
return fmt.Errorf("error getting tag count: %s", err.Error()) return fmt.Errorf("error getting tag count: %v", err)
} }
} }
@@ -122,7 +122,7 @@ func (j *autoTagJob) autoTagPerformers(ctx context.Context, progress *job.Progre
var err error var err error
performers, err = performerQuery.All() performers, err = performerQuery.All()
if err != nil { if err != nil {
return fmt.Errorf("error querying performers: %s", err.Error()) return fmt.Errorf("error querying performers: %v", err)
} }
} else { } else {
performerIdInt, err := strconv.Atoi(performerId) performerIdInt, err := strconv.Atoi(performerId)
@@ -188,7 +188,7 @@ func (j *autoTagJob) autoTagStudios(ctx context.Context, progress *job.Progress,
var err error var err error
studios, err = studioQuery.All() studios, err = studioQuery.All()
if err != nil { if err != nil {
return fmt.Errorf("error querying studios: %s", err.Error()) return fmt.Errorf("error querying studios: %v", err)
} }
} else { } else {
studioIdInt, err := strconv.Atoi(studioId) studioIdInt, err := strconv.Atoi(studioId)
@@ -259,7 +259,7 @@ func (j *autoTagJob) autoTagTags(ctx context.Context, progress *job.Progress, pa
var err error var err error
tags, err = tagQuery.All() tags, err = tagQuery.All()
if err != nil { if err != nil {
return fmt.Errorf("error querying tags: %s", err.Error()) return fmt.Errorf("error querying tags: %v", err)
} }
} else { } else {
tagIdInt, err := strconv.Atoi(tagId) tagIdInt, err := strconv.Atoi(tagId)

View File

@@ -4,6 +4,7 @@ import (
"archive/zip" "archive/zip"
"context" "context"
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"io" "io"
"os" "os"
@@ -239,7 +240,7 @@ func (t *ImportTask) ImportStudios(ctx context.Context) {
if err := t.txnManager.WithTxn(ctx, func(r models.Repository) error { if err := t.txnManager.WithTxn(ctx, func(r models.Repository) error {
return t.ImportStudio(studioJSON, pendingParent, r.Studio()) return t.ImportStudio(studioJSON, pendingParent, r.Studio())
}); err != nil { }); err != nil {
if err == studio.ErrParentStudioNotExist { if errors.Is(err, studio.ErrParentStudioNotExist) {
// add to the pending parent list so that it is created after the parent // add to the pending parent list so that it is created after the parent
s := pendingParent[studioJSON.ParentStudio] s := pendingParent[studioJSON.ParentStudio]
s = append(s, studioJSON) s = append(s, studioJSON)
@@ -391,7 +392,8 @@ func (t *ImportTask) ImportTags(ctx context.Context) {
if err := t.txnManager.WithTxn(ctx, func(r models.Repository) error { if err := t.txnManager.WithTxn(ctx, func(r models.Repository) error {
return t.ImportTag(tagJSON, pendingParent, false, r.Tag()) return t.ImportTag(tagJSON, pendingParent, false, r.Tag())
}); err != nil { }); err != nil {
if parentError, ok := err.(tag.ParentTagNotExistError); ok { var parentError tag.ParentTagNotExistError
if errors.As(err, &parentError) {
pendingParent[parentError.MissingParent()] = append(pendingParent[parentError.MissingParent()], tagJSON) pendingParent[parentError.MissingParent()] = append(pendingParent[parentError.MissingParent()], tagJSON)
continue continue
} }
@@ -433,7 +435,8 @@ func (t *ImportTask) ImportTag(tagJSON *jsonschema.Tag, pendingParent map[string
for _, childTagJSON := range pendingParent[tagJSON.Name] { for _, childTagJSON := range pendingParent[tagJSON.Name] {
if err := t.ImportTag(childTagJSON, pendingParent, fail, readerWriter); err != nil { if err := t.ImportTag(childTagJSON, pendingParent, fail, readerWriter); err != nil {
if parentError, ok := err.(tag.ParentTagNotExistError); ok { var parentError tag.ParentTagNotExistError
if errors.As(err, &parentError) {
pendingParent[parentError.MissingParent()] = append(pendingParent[parentError.MissingParent()], tagJSON) pendingParent[parentError.MissingParent()] = append(pendingParent[parentError.MissingParent()], tagJSON)
continue continue
} }

View File

@@ -128,7 +128,7 @@ func (j *ScanJob) Execute(ctx context.Context, progress *job.Progress) {
return nil return nil
}) })
if err == stoppingErr { if errors.Is(err, stoppingErr) {
logger.Info("Stopping due to user request") logger.Info("Stopping due to user request")
break break
} }
@@ -206,7 +206,7 @@ func (j *ScanJob) neededScan(ctx context.Context, paths []*models.StashConfig) (
return nil return nil
}) })
if err == timeoutErr { if errors.Is(err, timeoutErr) {
// timeout should return nil counts // timeout should return nil counts
return nil, nil return nil, nil
} }

View File

@@ -46,7 +46,7 @@ func ToJSON(reader models.MovieReader, studioReader models.StudioReader, movie *
if movie.StudioID.Valid { if movie.StudioID.Valid {
studio, err := studioReader.Find(int(movie.StudioID.Int64)) studio, err := studioReader.Find(int(movie.StudioID.Int64))
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting movie studio: %s", err.Error()) return nil, fmt.Errorf("error getting movie studio: %v", err)
} }
if studio != nil { if studio != nil {
@@ -56,7 +56,7 @@ func ToJSON(reader models.MovieReader, studioReader models.StudioReader, movie *
frontImage, err := reader.GetFrontImage(movie.ID) frontImage, err := reader.GetFrontImage(movie.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting movie front image: %s", err.Error()) return nil, fmt.Errorf("error getting movie front image: %v", err)
} }
if len(frontImage) > 0 { if len(frontImage) > 0 {
@@ -65,7 +65,7 @@ func ToJSON(reader models.MovieReader, studioReader models.StudioReader, movie *
backImage, err := reader.GetBackImage(movie.ID) backImage, err := reader.GetBackImage(movie.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting movie back image: %s", err.Error()) return nil, fmt.Errorf("error getting movie back image: %v", err)
} }
if len(backImage) > 0 { if len(backImage) > 0 {

View File

@@ -31,13 +31,13 @@ func (i *Importer) PreImport() error {
if len(i.Input.FrontImage) > 0 { if len(i.Input.FrontImage) > 0 {
_, i.frontImageData, err = utils.ProcessBase64Image(i.Input.FrontImage) _, i.frontImageData, err = utils.ProcessBase64Image(i.Input.FrontImage)
if err != nil { if err != nil {
return fmt.Errorf("invalid front_image: %s", err.Error()) return fmt.Errorf("invalid front_image: %v", err)
} }
} }
if len(i.Input.BackImage) > 0 { if len(i.Input.BackImage) > 0 {
_, i.backImageData, err = utils.ProcessBase64Image(i.Input.BackImage) _, i.backImageData, err = utils.ProcessBase64Image(i.Input.BackImage)
if err != nil { if err != nil {
return fmt.Errorf("invalid back_image: %s", err.Error()) return fmt.Errorf("invalid back_image: %v", err)
} }
} }
@@ -74,7 +74,7 @@ func (i *Importer) populateStudio() error {
if i.Input.Studio != "" { if i.Input.Studio != "" {
studio, err := i.StudioWriter.FindByName(i.Input.Studio, false) studio, err := i.StudioWriter.FindByName(i.Input.Studio, false)
if err != nil { if err != nil {
return fmt.Errorf("error finding studio by name: %s", err.Error()) return fmt.Errorf("error finding studio by name: %v", err)
} }
if studio == nil { if studio == nil {
@@ -118,7 +118,7 @@ func (i *Importer) createStudio(name string) (int, error) {
func (i *Importer) PostImport(id int) error { func (i *Importer) PostImport(id int) error {
if len(i.frontImageData) > 0 { if len(i.frontImageData) > 0 {
if err := i.ReaderWriter.UpdateImages(id, i.frontImageData, i.backImageData); err != nil { if err := i.ReaderWriter.UpdateImages(id, i.frontImageData, i.backImageData); err != nil {
return fmt.Errorf("error setting movie images: %s", err.Error()) return fmt.Errorf("error setting movie images: %v", err)
} }
} }
@@ -147,7 +147,7 @@ func (i *Importer) FindExistingID() (*int, error) {
func (i *Importer) Create() (*int, error) { func (i *Importer) Create() (*int, error) {
created, err := i.ReaderWriter.Create(i.movie) created, err := i.ReaderWriter.Create(i.movie)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating movie: %s", err.Error()) return nil, fmt.Errorf("error creating movie: %v", err)
} }
id := created.ID id := created.ID
@@ -159,7 +159,7 @@ func (i *Importer) Update(id int) error {
movie.ID = id movie.ID = id
_, err := i.ReaderWriter.UpdateFull(movie) _, err := i.ReaderWriter.UpdateFull(movie)
if err != nil { if err != nil {
return fmt.Errorf("error updating existing movie: %s", err.Error()) return fmt.Errorf("error updating existing movie: %v", err)
} }
return nil return nil

View File

@@ -84,7 +84,7 @@ func ToJSON(reader models.PerformerReader, performer *models.Performer) (*jsonsc
image, err := reader.GetImage(performer.ID) image, err := reader.GetImage(performer.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting performers image: %s", err.Error()) return nil, fmt.Errorf("error getting performers image: %v", err)
} }
if len(image) > 0 { if len(image) > 0 {

View File

@@ -34,7 +34,7 @@ func (i *Importer) PreImport() error {
if len(i.Input.Image) > 0 { if len(i.Input.Image) > 0 {
_, i.imageData, err = utils.ProcessBase64Image(i.Input.Image) _, i.imageData, err = utils.ProcessBase64Image(i.Input.Image)
if err != nil { if err != nil {
return fmt.Errorf("invalid image: %s", err.Error()) return fmt.Errorf("invalid image: %v", err)
} }
} }
@@ -78,7 +78,7 @@ func importTags(tagWriter models.TagReaderWriter, names []string, missingRefBeha
if missingRefBehaviour == models.ImportMissingRefEnumCreate { if missingRefBehaviour == models.ImportMissingRefEnumCreate {
createdTags, err := createTags(tagWriter, missingTags) createdTags, err := createTags(tagWriter, missingTags)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating tags: %s", err.Error()) return nil, fmt.Errorf("error creating tags: %v", err)
} }
tags = append(tags, createdTags...) tags = append(tags, createdTags...)
@@ -113,13 +113,13 @@ func (i *Importer) PostImport(id int) error {
tagIDs = append(tagIDs, t.ID) tagIDs = append(tagIDs, t.ID)
} }
if err := i.ReaderWriter.UpdateTags(id, tagIDs); err != nil { if err := i.ReaderWriter.UpdateTags(id, tagIDs); err != nil {
return fmt.Errorf("failed to associate tags: %s", err.Error()) return fmt.Errorf("failed to associate tags: %v", err)
} }
} }
if len(i.imageData) > 0 { if len(i.imageData) > 0 {
if err := i.ReaderWriter.UpdateImage(id, i.imageData); err != nil { if err := i.ReaderWriter.UpdateImage(id, i.imageData); err != nil {
return fmt.Errorf("error setting performer image: %s", err.Error()) return fmt.Errorf("error setting performer image: %v", err)
} }
} }
@@ -148,7 +148,7 @@ func (i *Importer) FindExistingID() (*int, error) {
func (i *Importer) Create() (*int, error) { func (i *Importer) Create() (*int, error) {
created, err := i.ReaderWriter.Create(i.performer) created, err := i.ReaderWriter.Create(i.performer)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating performer: %s", err.Error()) return nil, fmt.Errorf("error creating performer: %v", err)
} }
id := created.ID id := created.ID
@@ -160,7 +160,7 @@ func (i *Importer) Update(id int) error {
performer.ID = id performer.ID = id
_, err := i.ReaderWriter.UpdateFull(performer) _, err := i.ReaderWriter.UpdateFull(performer)
if err != nil { if err != nil {
return fmt.Errorf("error updating existing performer: %s", err.Error()) return fmt.Errorf("error updating existing performer: %v", err)
} }
return nil return nil

View File

@@ -190,7 +190,7 @@ func AddTag(client *graphql.Client) error {
log.Infof("Adding tag to scene %v", scene.ID) log.Infof("Adding tag to scene %v", scene.ID)
err = client.Mutate(context.Background(), &m, vars) err = client.Mutate(context.Background(), &m, vars)
if err != nil { if err != nil {
return fmt.Errorf("Error mutating scene: %s", err.Error()) return fmt.Errorf("Error mutating scene: %v", err)
} }
return nil return nil
@@ -225,7 +225,7 @@ func RemoveTag(client *graphql.Client) error {
err = client.Mutate(context.Background(), &m, vars) err = client.Mutate(context.Background(), &m, vars)
if err != nil { if err != nil {
return fmt.Errorf("Error destroying tag: %s", err.Error()) return fmt.Errorf("Error destroying tag: %v", err)
} }
return nil return nil

View File

@@ -97,7 +97,7 @@ func (t *jsPluginTask) Start() error {
t.waitGroup.Done() t.waitGroup.Done()
if caught := recover(); caught != nil { if caught := recover(); caught != nil {
if caught == errStop { if err, ok := caught.(error); ok && errors.Is(err, errStop) {
// TODO - log this // TODO - log this
return return
} }

View File

@@ -43,7 +43,7 @@ func (t *rawPluginTask) Start() error {
stdin, err := cmd.StdinPipe() stdin, err := cmd.StdinPipe()
if err != nil { if err != nil {
return fmt.Errorf("error getting plugin process stdin: %s", err.Error()) return fmt.Errorf("error getting plugin process stdin: %v", err)
} }
go func() { go func() {
@@ -68,7 +68,7 @@ func (t *rawPluginTask) Start() error {
t.waitGroup.Add(1) t.waitGroup.Add(1)
t.done = make(chan bool, 1) t.done = make(chan bool, 1)
if err = cmd.Start(); err != nil { if err = cmd.Start(); err != nil {
return fmt.Errorf("error running plugin: %s", err.Error()) return fmt.Errorf("error running plugin: %v", err)
} }
go t.handlePluginStderr(t.plugin.Name, stderr) go t.handlePluginStderr(t.plugin.Name, stderr)

View File

@@ -58,7 +58,7 @@ func ToBasicJSON(reader models.SceneReader, scene *models.Scene) (*jsonschema.Sc
cover, err := reader.GetCover(scene.ID) cover, err := reader.GetCover(scene.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting scene cover: %s", err.Error()) return nil, fmt.Errorf("error getting scene cover: %v", err)
} }
if len(cover) > 0 { if len(cover) > 0 {
@@ -136,7 +136,7 @@ func GetStudioName(reader models.StudioReader, scene *models.Scene) (string, err
func GetTagNames(reader models.TagReader, scene *models.Scene) ([]string, error) { func GetTagNames(reader models.TagReader, scene *models.Scene) ([]string, error) {
tags, err := reader.FindBySceneID(scene.ID) tags, err := reader.FindBySceneID(scene.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting scene tags: %s", err.Error()) return nil, fmt.Errorf("error getting scene tags: %v", err)
} }
return getTagNames(tags), nil return getTagNames(tags), nil
@@ -175,7 +175,7 @@ func GetDependentTagIDs(tags models.TagReader, markerReader models.SceneMarkerRe
ret = utils.IntAppendUnique(ret, smm.PrimaryTagID) ret = utils.IntAppendUnique(ret, smm.PrimaryTagID)
smmt, err := tags.FindBySceneMarkerID(smm.ID) smmt, err := tags.FindBySceneMarkerID(smm.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid tags for scene marker: %s", err.Error()) return nil, fmt.Errorf("invalid tags for scene marker: %v", err)
} }
for _, smmtt := range smmt { for _, smmtt := range smmt {
@@ -191,14 +191,14 @@ func GetDependentTagIDs(tags models.TagReader, markerReader models.SceneMarkerRe
func GetSceneMoviesJSON(movieReader models.MovieReader, sceneReader models.SceneReader, scene *models.Scene) ([]jsonschema.SceneMovie, error) { func GetSceneMoviesJSON(movieReader models.MovieReader, sceneReader models.SceneReader, scene *models.Scene) ([]jsonschema.SceneMovie, error) {
sceneMovies, err := sceneReader.GetMovies(scene.ID) sceneMovies, err := sceneReader.GetMovies(scene.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting scene movies: %s", err.Error()) return nil, fmt.Errorf("error getting scene movies: %v", err)
} }
var results []jsonschema.SceneMovie var results []jsonschema.SceneMovie
for _, sceneMovie := range sceneMovies { for _, sceneMovie := range sceneMovies {
movie, err := movieReader.Find(sceneMovie.MovieID) movie, err := movieReader.Find(sceneMovie.MovieID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting movie: %s", err.Error()) return nil, fmt.Errorf("error getting movie: %v", err)
} }
if movie.Name.Valid { if movie.Name.Valid {
@@ -234,7 +234,7 @@ func GetDependentMovieIDs(sceneReader models.SceneReader, scene *models.Scene) (
func GetSceneMarkersJSON(markerReader models.SceneMarkerReader, tagReader models.TagReader, scene *models.Scene) ([]jsonschema.SceneMarker, error) { func GetSceneMarkersJSON(markerReader models.SceneMarkerReader, tagReader models.TagReader, scene *models.Scene) ([]jsonschema.SceneMarker, error) {
sceneMarkers, err := markerReader.FindBySceneID(scene.ID) sceneMarkers, err := markerReader.FindBySceneID(scene.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting scene markers: %s", err.Error()) return nil, fmt.Errorf("error getting scene markers: %v", err)
} }
var results []jsonschema.SceneMarker var results []jsonschema.SceneMarker
@@ -242,12 +242,12 @@ func GetSceneMarkersJSON(markerReader models.SceneMarkerReader, tagReader models
for _, sceneMarker := range sceneMarkers { for _, sceneMarker := range sceneMarkers {
primaryTag, err := tagReader.Find(sceneMarker.PrimaryTagID) primaryTag, err := tagReader.Find(sceneMarker.PrimaryTagID)
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid primary tag for scene marker: %s", err.Error()) return nil, fmt.Errorf("invalid primary tag for scene marker: %v", err)
} }
sceneMarkerTags, err := tagReader.FindBySceneMarkerID(sceneMarker.ID) sceneMarkerTags, err := tagReader.FindBySceneMarkerID(sceneMarker.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid tags for scene marker: %s", err.Error()) return nil, fmt.Errorf("invalid tags for scene marker: %v", err)
} }
sceneMarkerJSON := jsonschema.SceneMarker{ sceneMarkerJSON := jsonschema.SceneMarker{

View File

@@ -59,7 +59,7 @@ func (i *Importer) PreImport() error {
if len(i.Input.Cover) > 0 { if len(i.Input.Cover) > 0 {
_, i.coverImageData, err = utils.ProcessBase64Image(i.Input.Cover) _, i.coverImageData, err = utils.ProcessBase64Image(i.Input.Cover)
if err != nil { if err != nil {
return fmt.Errorf("invalid cover image: %s", err.Error()) return fmt.Errorf("invalid cover image: %v", err)
} }
} }
@@ -138,7 +138,7 @@ func (i *Importer) populateStudio() error {
if i.Input.Studio != "" { if i.Input.Studio != "" {
studio, err := i.StudioWriter.FindByName(i.Input.Studio, false) studio, err := i.StudioWriter.FindByName(i.Input.Studio, false)
if err != nil { if err != nil {
return fmt.Errorf("error finding studio by name: %s", err.Error()) return fmt.Errorf("error finding studio by name: %v", err)
} }
if studio == nil { if studio == nil {
@@ -238,7 +238,7 @@ func (i *Importer) populatePerformers() error {
if i.MissingRefBehaviour == models.ImportMissingRefEnumCreate { if i.MissingRefBehaviour == models.ImportMissingRefEnumCreate {
createdPerformers, err := i.createPerformers(missingPerformers) createdPerformers, err := i.createPerformers(missingPerformers)
if err != nil { if err != nil {
return fmt.Errorf("error creating scene performers: %s", err.Error()) return fmt.Errorf("error creating scene performers: %v", err)
} }
performers = append(performers, createdPerformers...) performers = append(performers, createdPerformers...)
@@ -274,7 +274,7 @@ func (i *Importer) populateMovies() error {
for _, inputMovie := range i.Input.Movies { for _, inputMovie := range i.Input.Movies {
movie, err := i.MovieWriter.FindByName(inputMovie.MovieName, false) movie, err := i.MovieWriter.FindByName(inputMovie.MovieName, false)
if err != nil { if err != nil {
return fmt.Errorf("error finding scene movie: %s", err.Error()) return fmt.Errorf("error finding scene movie: %v", err)
} }
if movie == nil { if movie == nil {
@@ -285,7 +285,7 @@ func (i *Importer) populateMovies() error {
if i.MissingRefBehaviour == models.ImportMissingRefEnumCreate { if i.MissingRefBehaviour == models.ImportMissingRefEnumCreate {
movie, err = i.createMovie(inputMovie.MovieName) movie, err = i.createMovie(inputMovie.MovieName)
if err != nil { if err != nil {
return fmt.Errorf("error creating scene movie: %s", err.Error()) return fmt.Errorf("error creating scene movie: %v", err)
} }
} }
@@ -341,7 +341,7 @@ func (i *Importer) populateTags() error {
func (i *Importer) PostImport(id int) error { func (i *Importer) PostImport(id int) error {
if len(i.coverImageData) > 0 { if len(i.coverImageData) > 0 {
if err := i.ReaderWriter.UpdateCover(id, i.coverImageData); err != nil { if err := i.ReaderWriter.UpdateCover(id, i.coverImageData); err != nil {
return fmt.Errorf("error setting scene images: %s", err.Error()) return fmt.Errorf("error setting scene images: %v", err)
} }
} }
@@ -352,7 +352,7 @@ func (i *Importer) PostImport(id int) error {
} }
if err := i.ReaderWriter.UpdateGalleries(id, galleryIDs); err != nil { if err := i.ReaderWriter.UpdateGalleries(id, galleryIDs); err != nil {
return fmt.Errorf("failed to associate galleries: %s", err.Error()) return fmt.Errorf("failed to associate galleries: %v", err)
} }
} }
@@ -363,7 +363,7 @@ func (i *Importer) PostImport(id int) error {
} }
if err := i.ReaderWriter.UpdatePerformers(id, performerIDs); err != nil { if err := i.ReaderWriter.UpdatePerformers(id, performerIDs); err != nil {
return fmt.Errorf("failed to associate performers: %s", err.Error()) return fmt.Errorf("failed to associate performers: %v", err)
} }
} }
@@ -372,7 +372,7 @@ func (i *Importer) PostImport(id int) error {
i.movies[index].SceneID = id i.movies[index].SceneID = id
} }
if err := i.ReaderWriter.UpdateMovies(id, i.movies); err != nil { if err := i.ReaderWriter.UpdateMovies(id, i.movies); err != nil {
return fmt.Errorf("failed to associate movies: %s", err.Error()) return fmt.Errorf("failed to associate movies: %v", err)
} }
} }
@@ -382,7 +382,7 @@ func (i *Importer) PostImport(id int) error {
tagIDs = append(tagIDs, t.ID) tagIDs = append(tagIDs, t.ID)
} }
if err := i.ReaderWriter.UpdateTags(id, tagIDs); err != nil { if err := i.ReaderWriter.UpdateTags(id, tagIDs); err != nil {
return fmt.Errorf("failed to associate tags: %s", err.Error()) return fmt.Errorf("failed to associate tags: %v", err)
} }
} }
@@ -419,7 +419,7 @@ func (i *Importer) FindExistingID() (*int, error) {
func (i *Importer) Create() (*int, error) { func (i *Importer) Create() (*int, error) {
created, err := i.ReaderWriter.Create(i.scene) created, err := i.ReaderWriter.Create(i.scene)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating scene: %s", err.Error()) return nil, fmt.Errorf("error creating scene: %v", err)
} }
id := created.ID id := created.ID
@@ -433,7 +433,7 @@ func (i *Importer) Update(id int) error {
i.ID = id i.ID = id
_, err := i.ReaderWriter.UpdateFull(scene) _, err := i.ReaderWriter.UpdateFull(scene)
if err != nil { if err != nil {
return fmt.Errorf("error updating existing scene: %s", err.Error()) return fmt.Errorf("error updating existing scene: %v", err)
} }
return nil return nil
@@ -462,7 +462,7 @@ func importTags(tagWriter models.TagReaderWriter, names []string, missingRefBeha
if missingRefBehaviour == models.ImportMissingRefEnumCreate { if missingRefBehaviour == models.ImportMissingRefEnumCreate {
createdTags, err := createTags(tagWriter, missingTags) createdTags, err := createTags(tagWriter, missingTags)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating tags: %s", err.Error()) return nil, fmt.Errorf("error creating tags: %v", err)
} }
tags = append(tags, createdTags...) tags = append(tags, createdTags...)

View File

@@ -70,7 +70,7 @@ func (i *MarkerImporter) PostImport(id int) error {
tagIDs = append(tagIDs, t.ID) tagIDs = append(tagIDs, t.ID)
} }
if err := i.ReaderWriter.UpdateTags(id, tagIDs); err != nil { if err := i.ReaderWriter.UpdateTags(id, tagIDs); err != nil {
return fmt.Errorf("failed to associate tags: %s", err.Error()) return fmt.Errorf("failed to associate tags: %v", err)
} }
} }
@@ -101,7 +101,7 @@ func (i *MarkerImporter) FindExistingID() (*int, error) {
func (i *MarkerImporter) Create() (*int, error) { func (i *MarkerImporter) Create() (*int, error) {
created, err := i.ReaderWriter.Create(i.marker) created, err := i.ReaderWriter.Create(i.marker)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating marker: %s", err.Error()) return nil, fmt.Errorf("error creating marker: %v", err)
} }
id := created.ID id := created.ID
@@ -113,7 +113,7 @@ func (i *MarkerImporter) Update(id int) error {
marker.ID = id marker.ID = id
_, err := i.ReaderWriter.Update(marker) _, err := i.ReaderWriter.Update(marker)
if err != nil { if err != nil {
return fmt.Errorf("error updating existing marker: %s", err.Error()) return fmt.Errorf("error updating existing marker: %v", err)
} }
return nil return nil

View File

@@ -588,7 +588,8 @@ func (c *mappedScraperAttrConfig) UnmarshalYAML(unmarshal func(interface{}) erro
// try unmarshalling into a string first // try unmarshalling into a string first
if err := unmarshal(&c.Selector); err != nil { if err := unmarshal(&c.Selector); err != nil {
// if it's a type error then we try to unmarshall to the full object // if it's a type error then we try to unmarshall to the full object
if _, ok := err.(*yaml.TypeError); !ok { var typeErr *yaml.TypeError
if !errors.As(err, &typeErr) {
return err return err
} }

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"github.com/stashapp/stash/pkg/models" "github.com/stashapp/stash/pkg/models"
@@ -75,7 +76,7 @@ func (qb *galleryQueryBuilder) Destroy(id int) error {
func (qb *galleryQueryBuilder) Find(id int) (*models.Gallery, error) { func (qb *galleryQueryBuilder) Find(id int) (*models.Gallery, error) {
var ret models.Gallery var ret models.Gallery
if err := qb.get(id, &ret); err != nil { if err := qb.get(id, &ret); err != nil {
if err == sql.ErrNoRows { if errors.Is(err, sql.ErrNoRows) {
return nil, nil return nil, nil
} }
return nil, err return nil, err

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"github.com/stashapp/stash/pkg/models" "github.com/stashapp/stash/pkg/models"
@@ -145,7 +146,7 @@ func (qb *imageQueryBuilder) FindMany(ids []int) ([]*models.Image, error) {
func (qb *imageQueryBuilder) find(id int) (*models.Image, error) { func (qb *imageQueryBuilder) find(id int) (*models.Image, error) {
var ret models.Image var ret models.Image
if err := qb.get(id, &ret); err != nil { if err := qb.get(id, &ret); err != nil {
if err == sql.ErrNoRows { if errors.Is(err, sql.ErrNoRows) {
return nil, nil return nil, nil
} }
return nil, err return nil, err

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"github.com/stashapp/stash/pkg/models" "github.com/stashapp/stash/pkg/models"
@@ -58,7 +59,7 @@ func (qb *movieQueryBuilder) Destroy(id int) error {
func (qb *movieQueryBuilder) Find(id int) (*models.Movie, error) { func (qb *movieQueryBuilder) Find(id int) (*models.Movie, error) {
var ret models.Movie var ret models.Movie
if err := qb.get(id, &ret); err != nil { if err := qb.get(id, &ret); err != nil {
if err == sql.ErrNoRows { if errors.Is(err, sql.ErrNoRows) {
return nil, nil return nil, nil
} }
return nil, err return nil, err

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"strings" "strings"
@@ -84,7 +85,7 @@ func (qb *performerQueryBuilder) Destroy(id int) error {
func (qb *performerQueryBuilder) Find(id int) (*models.Performer, error) { func (qb *performerQueryBuilder) Find(id int) (*models.Performer, error) {
var ret models.Performer var ret models.Performer
if err := qb.get(id, &ret); err != nil { if err := qb.get(id, &ret); err != nil {
if err == sql.ErrNoRows { if errors.Is(err, sql.ErrNoRows) {
return nil, nil return nil, nil
} }
return nil, err return nil, err

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"reflect" "reflect"
"strings" "strings"
@@ -132,7 +133,7 @@ func (r *repository) runCountQuery(query string, args []interface{}) (int, error
}{0} }{0}
// Perform query and fetch result // Perform query and fetch result
if err := r.tx.Get(&result, query, args...); err != nil && err != sql.ErrNoRows { if err := r.tx.Get(&result, query, args...); err != nil && !errors.Is(err, sql.ErrNoRows) {
return 0, err return 0, err
} }
@@ -144,7 +145,7 @@ func (r *repository) runIdsQuery(query string, args []interface{}) ([]int, error
Int int `db:"id"` Int int `db:"id"`
} }
if err := r.tx.Select(&result, query, args...); err != nil && err != sql.ErrNoRows { if err := r.tx.Select(&result, query, args...); err != nil && !errors.Is(err, sql.ErrNoRows) {
return []int{}, err return []int{}, err
} }
@@ -162,7 +163,7 @@ func (r *repository) runSumQuery(query string, args []interface{}) (float64, err
}{0} }{0}
// Perform query and fetch result // Perform query and fetch result
if err := r.tx.Get(&result, query, args...); err != nil && err != sql.ErrNoRows { if err := r.tx.Get(&result, query, args...); err != nil && !errors.Is(err, sql.ErrNoRows) {
return 0, err return 0, err
} }
@@ -172,7 +173,7 @@ func (r *repository) runSumQuery(query string, args []interface{}) (float64, err
func (r *repository) queryFunc(query string, args []interface{}, f func(rows *sqlx.Rows) error) error { func (r *repository) queryFunc(query string, args []interface{}, f func(rows *sqlx.Rows) error) error {
rows, err := r.tx.Queryx(query, args...) rows, err := r.tx.Queryx(query, args...)
if err != nil && err != sql.ErrNoRows { if err != nil && !errors.Is(err, sql.ErrNoRows) {
return err return err
} }
defer rows.Close() defer rows.Close()
@@ -193,7 +194,7 @@ func (r *repository) queryFunc(query string, args []interface{}, f func(rows *sq
func (r *repository) query(query string, args []interface{}, out objectList) error { func (r *repository) query(query string, args []interface{}, out objectList) error {
rows, err := r.tx.Queryx(query, args...) rows, err := r.tx.Queryx(query, args...)
if err != nil && err != sql.ErrNoRows { if err != nil && !errors.Is(err, sql.ErrNoRows) {
return err return err
} }
defer rows.Close() defer rows.Close()
@@ -216,7 +217,7 @@ func (r *repository) query(query string, args []interface{}, out objectList) err
func (r *repository) querySimple(query string, args []interface{}, out interface{}) error { func (r *repository) querySimple(query string, args []interface{}, out interface{}) error {
rows, err := r.tx.Queryx(query, args...) rows, err := r.tx.Queryx(query, args...)
if err != nil && err != sql.ErrNoRows { if err != nil && !errors.Is(err, sql.ErrNoRows) {
return err return err
} }
defer rows.Close() defer rows.Close()

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"github.com/stashapp/stash/pkg/models" "github.com/stashapp/stash/pkg/models"
@@ -72,7 +73,7 @@ func (qb *savedFilterQueryBuilder) Destroy(id int) error {
func (qb *savedFilterQueryBuilder) Find(id int) (*models.SavedFilter, error) { func (qb *savedFilterQueryBuilder) Find(id int) (*models.SavedFilter, error) {
var ret models.SavedFilter var ret models.SavedFilter
if err := qb.get(id, &ret); err != nil { if err := qb.get(id, &ret); err != nil {
if err == sql.ErrNoRows { if errors.Is(err, sql.ErrNoRows) {
return nil, nil return nil, nil
} }
return nil, err return nil, err

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"strconv" "strconv"
"strings" "strings"
@@ -215,7 +216,7 @@ func (qb *sceneQueryBuilder) FindMany(ids []int) ([]*models.Scene, error) {
func (qb *sceneQueryBuilder) find(id int) (*models.Scene, error) { func (qb *sceneQueryBuilder) find(id int) (*models.Scene, error) {
var ret models.Scene var ret models.Scene
if err := qb.get(id, &ret); err != nil { if err := qb.get(id, &ret); err != nil {
if err == sql.ErrNoRows { if errors.Is(err, sql.ErrNoRows) {
return nil, nil return nil, nil
} }
return nil, err return nil, err

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"github.com/stashapp/stash/pkg/database" "github.com/stashapp/stash/pkg/database"
@@ -271,7 +272,7 @@ func (qb *sceneMarkerQueryBuilder) querySceneMarkers(query string, args []interf
func (qb *sceneMarkerQueryBuilder) queryMarkerStringsResultType(query string, args []interface{}) ([]*models.MarkerStringsResultType, error) { func (qb *sceneMarkerQueryBuilder) queryMarkerStringsResultType(query string, args []interface{}) ([]*models.MarkerStringsResultType, error) {
rows, err := database.DB.Queryx(query, args...) rows, err := database.DB.Queryx(query, args...)
if err != nil && err != sql.ErrNoRows { if err != nil && !errors.Is(err, sql.ErrNoRows) {
return nil, err return nil, err
} }
defer rows.Close() defer rows.Close()

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"github.com/stashapp/stash/pkg/models" "github.com/stashapp/stash/pkg/models"
) )
@@ -47,7 +48,7 @@ func (qb *scrapedItemQueryBuilder) Find(id int) (*models.ScrapedItem, error) {
func (qb *scrapedItemQueryBuilder) find(id int) (*models.ScrapedItem, error) { func (qb *scrapedItemQueryBuilder) find(id int) (*models.ScrapedItem, error) {
var ret models.ScrapedItem var ret models.ScrapedItem
if err := qb.get(id, &ret); err != nil { if err := qb.get(id, &ret); err != nil {
if err == sql.ErrNoRows { if errors.Is(err, sql.ErrNoRows) {
return nil, nil return nil, nil
} }
return nil, err return nil, err

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"math/rand" "math/rand"
"regexp" "regexp"
@@ -228,7 +229,7 @@ func getCountCriterionClause(primaryTable, joinTable, primaryFK string, criterio
func getImage(tx dbi, query string, args ...interface{}) ([]byte, error) { func getImage(tx dbi, query string, args ...interface{}) ([]byte, error) {
rows, err := tx.Queryx(query, args...) rows, err := tx.Queryx(query, args...)
if err != nil && err != sql.ErrNoRows { if err != nil && !errors.Is(err, sql.ErrNoRows) {
return nil, err return nil, err
} }
defer rows.Close() defer rows.Close()

View File

@@ -2,6 +2,7 @@ package sqlite
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"strings" "strings"
@@ -68,7 +69,7 @@ func (qb *studioQueryBuilder) Destroy(id int) error {
func (qb *studioQueryBuilder) Find(id int) (*models.Studio, error) { func (qb *studioQueryBuilder) Find(id int) (*models.Studio, error) {
var ret models.Studio var ret models.Studio
if err := qb.get(id, &ret); err != nil { if err := qb.get(id, &ret); err != nil {
if err == sql.ErrNoRows { if errors.Is(err, sql.ErrNoRows) {
return nil, nil return nil, nil
} }
return nil, err return nil, err

View File

@@ -87,7 +87,7 @@ func (qb *tagQueryBuilder) Destroy(id int) error {
func (qb *tagQueryBuilder) Find(id int) (*models.Tag, error) { func (qb *tagQueryBuilder) Find(id int) (*models.Tag, error) {
var ret models.Tag var ret models.Tag
if err := qb.get(id, &ret); err != nil { if err := qb.get(id, &ret); err != nil {
if err == sql.ErrNoRows { if errors.Is(err, sql.ErrNoRows) {
return nil, nil return nil, nil
} }
return nil, err return nil, err

View File

@@ -36,7 +36,7 @@ func (t *transaction) Begin() error {
var err error var err error
t.tx, err = database.DB.BeginTxx(t.Ctx, nil) t.tx, err = database.DB.BeginTxx(t.Ctx, nil)
if err != nil { if err != nil {
return fmt.Errorf("error starting transaction: %s", err.Error()) return fmt.Errorf("error starting transaction: %v", err)
} }
return nil return nil
@@ -49,7 +49,7 @@ func (t *transaction) Rollback() error {
err := t.tx.Rollback() err := t.tx.Rollback()
if err != nil { if err != nil {
return fmt.Errorf("error rolling back transaction: %s", err.Error()) return fmt.Errorf("error rolling back transaction: %v", err)
} }
t.tx = nil t.tx = nil
@@ -63,7 +63,7 @@ func (t *transaction) Commit() error {
err := t.tx.Commit() err := t.tx.Commit()
if err != nil { if err != nil {
return fmt.Errorf("error committing transaction: %s", err.Error()) return fmt.Errorf("error committing transaction: %v", err)
} }
t.tx = nil t.tx = nil

View File

@@ -30,7 +30,7 @@ func ToJSON(reader models.StudioReader, studio *models.Studio) (*jsonschema.Stud
if studio.ParentID.Valid { if studio.ParentID.Valid {
parent, err := reader.Find(int(studio.ParentID.Int64)) parent, err := reader.Find(int(studio.ParentID.Int64))
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting parent studio: %s", err.Error()) return nil, fmt.Errorf("error getting parent studio: %v", err)
} }
if parent != nil { if parent != nil {
@@ -44,14 +44,14 @@ func ToJSON(reader models.StudioReader, studio *models.Studio) (*jsonschema.Stud
aliases, err := reader.GetAliases(studio.ID) aliases, err := reader.GetAliases(studio.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting studio aliases: %s", err.Error()) return nil, fmt.Errorf("error getting studio aliases: %v", err)
} }
newStudioJSON.Aliases = aliases newStudioJSON.Aliases = aliases
image, err := reader.GetImage(studio.ID) image, err := reader.GetImage(studio.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting studio image: %s", err.Error()) return nil, fmt.Errorf("error getting studio image: %v", err)
} }
if len(image) > 0 { if len(image) > 0 {

View File

@@ -42,7 +42,7 @@ func (i *Importer) PreImport() error {
if len(i.Input.Image) > 0 { if len(i.Input.Image) > 0 {
_, i.imageData, err = utils.ProcessBase64Image(i.Input.Image) _, i.imageData, err = utils.ProcessBase64Image(i.Input.Image)
if err != nil { if err != nil {
return fmt.Errorf("invalid image: %s", err.Error()) return fmt.Errorf("invalid image: %v", err)
} }
} }
@@ -53,7 +53,7 @@ func (i *Importer) populateParentStudio() error {
if i.Input.ParentStudio != "" { if i.Input.ParentStudio != "" {
studio, err := i.ReaderWriter.FindByName(i.Input.ParentStudio, false) studio, err := i.ReaderWriter.FindByName(i.Input.ParentStudio, false)
if err != nil { if err != nil {
return fmt.Errorf("error finding studio by name: %s", err.Error()) return fmt.Errorf("error finding studio by name: %v", err)
} }
if studio == nil { if studio == nil {
@@ -97,12 +97,12 @@ func (i *Importer) createParentStudio(name string) (int, error) {
func (i *Importer) PostImport(id int) error { func (i *Importer) PostImport(id int) error {
if len(i.imageData) > 0 { if len(i.imageData) > 0 {
if err := i.ReaderWriter.UpdateImage(id, i.imageData); err != nil { if err := i.ReaderWriter.UpdateImage(id, i.imageData); err != nil {
return fmt.Errorf("error setting studio image: %s", err.Error()) return fmt.Errorf("error setting studio image: %v", err)
} }
} }
if err := i.ReaderWriter.UpdateAliases(id, i.Input.Aliases); err != nil { if err := i.ReaderWriter.UpdateAliases(id, i.Input.Aliases); err != nil {
return fmt.Errorf("error setting tag aliases: %s", err.Error()) return fmt.Errorf("error setting tag aliases: %v", err)
} }
return nil return nil
@@ -130,7 +130,7 @@ func (i *Importer) FindExistingID() (*int, error) {
func (i *Importer) Create() (*int, error) { func (i *Importer) Create() (*int, error) {
created, err := i.ReaderWriter.Create(i.studio) created, err := i.ReaderWriter.Create(i.studio)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating studio: %s", err.Error()) return nil, fmt.Errorf("error creating studio: %v", err)
} }
id := created.ID id := created.ID
@@ -142,7 +142,7 @@ func (i *Importer) Update(id int) error {
studio.ID = id studio.ID = id
_, err := i.ReaderWriter.UpdateFull(studio) _, err := i.ReaderWriter.UpdateFull(studio)
if err != nil { if err != nil {
return fmt.Errorf("error updating existing studio: %s", err.Error()) return fmt.Errorf("error updating existing studio: %v", err)
} }
return nil return nil

View File

@@ -18,14 +18,14 @@ func ToJSON(reader models.TagReader, tag *models.Tag) (*jsonschema.Tag, error) {
aliases, err := reader.GetAliases(tag.ID) aliases, err := reader.GetAliases(tag.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting tag aliases: %s", err.Error()) return nil, fmt.Errorf("error getting tag aliases: %v", err)
} }
newTagJSON.Aliases = aliases newTagJSON.Aliases = aliases
image, err := reader.GetImage(tag.ID) image, err := reader.GetImage(tag.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting tag image: %s", err.Error()) return nil, fmt.Errorf("error getting tag image: %v", err)
} }
if len(image) > 0 { if len(image) > 0 {
@@ -34,7 +34,7 @@ func ToJSON(reader models.TagReader, tag *models.Tag) (*jsonschema.Tag, error) {
parents, err := reader.FindByChildTagID(tag.ID) parents, err := reader.FindByChildTagID(tag.ID)
if err != nil { if err != nil {
return nil, fmt.Errorf("error getting parents: %s", err.Error()) return nil, fmt.Errorf("error getting parents: %v", err)
} }
newTagJSON.Parents = GetNames(parents) newTagJSON.Parents = GetNames(parents)

View File

@@ -40,7 +40,7 @@ func (i *Importer) PreImport() error {
if len(i.Input.Image) > 0 { if len(i.Input.Image) > 0 {
_, i.imageData, err = utils.ProcessBase64Image(i.Input.Image) _, i.imageData, err = utils.ProcessBase64Image(i.Input.Image)
if err != nil { if err != nil {
return fmt.Errorf("invalid image: %s", err.Error()) return fmt.Errorf("invalid image: %v", err)
} }
} }
@@ -50,12 +50,12 @@ func (i *Importer) PreImport() error {
func (i *Importer) PostImport(id int) error { func (i *Importer) PostImport(id int) error {
if len(i.imageData) > 0 { if len(i.imageData) > 0 {
if err := i.ReaderWriter.UpdateImage(id, i.imageData); err != nil { if err := i.ReaderWriter.UpdateImage(id, i.imageData); err != nil {
return fmt.Errorf("error setting tag image: %s", err.Error()) return fmt.Errorf("error setting tag image: %v", err)
} }
} }
if err := i.ReaderWriter.UpdateAliases(id, i.Input.Aliases); err != nil { if err := i.ReaderWriter.UpdateAliases(id, i.Input.Aliases); err != nil {
return fmt.Errorf("error setting tag aliases: %s", err.Error()) return fmt.Errorf("error setting tag aliases: %v", err)
} }
parents, err := i.getParents() parents, err := i.getParents()
@@ -64,7 +64,7 @@ func (i *Importer) PostImport(id int) error {
} }
if err := i.ReaderWriter.UpdateParentTags(id, parents); err != nil { if err := i.ReaderWriter.UpdateParentTags(id, parents); err != nil {
return fmt.Errorf("error setting parents: %s", err.Error()) return fmt.Errorf("error setting parents: %v", err)
} }
return nil return nil
@@ -92,7 +92,7 @@ func (i *Importer) FindExistingID() (*int, error) {
func (i *Importer) Create() (*int, error) { func (i *Importer) Create() (*int, error) {
created, err := i.ReaderWriter.Create(i.tag) created, err := i.ReaderWriter.Create(i.tag)
if err != nil { if err != nil {
return nil, fmt.Errorf("error creating tag: %s", err.Error()) return nil, fmt.Errorf("error creating tag: %v", err)
} }
id := created.ID id := created.ID
@@ -104,7 +104,7 @@ func (i *Importer) Update(id int) error {
tag.ID = id tag.ID = id
_, err := i.ReaderWriter.UpdateFull(tag) _, err := i.ReaderWriter.UpdateFull(tag)
if err != nil { if err != nil {
return fmt.Errorf("error updating existing tag: %s", err.Error()) return fmt.Errorf("error updating existing tag: %v", err)
} }
return nil return nil
@@ -115,7 +115,7 @@ func (i *Importer) getParents() ([]int, error) {
for _, parent := range i.Input.Parents { for _, parent := range i.Input.Parents {
tag, err := i.ReaderWriter.FindByName(parent, false) tag, err := i.ReaderWriter.FindByName(parent, false)
if err != nil { if err != nil {
return nil, fmt.Errorf("error finding parent by name: %s", err.Error()) return nil, fmt.Errorf("error finding parent by name: %v", err)
} }
if tag == nil { if tag == nil {