16 Commits

Author SHA1 Message Date
2f6a3780f3 updated go.mod 2023-05-23 11:01:19 +00:00
2241e5ec7a updating go.mod to match mirror repository 2023-05-23 10:52:09 +00:00
Ralph Slooten
e8c7298c9c Merge tag '0.2.1' into develop
Release 0.2.1
2023-02-25 23:08:28 +13:00
Ralph Slooten
bb18d90d0e Merge branch 'release/0.2.1' 2023-02-25 23:08:26 +13:00
Ralph Slooten
90240fef3b Remove darwin 386 builds 2023-02-25 23:07:06 +13:00
Ralph Slooten
2b1b34a4e0 Merge tag '0.2.1' into develop
Release 0.2.1
2023-02-25 23:05:27 +13:00
Ralph Slooten
529ea6971c Merge branch 'release/0.2.1' 2023-02-25 23:05:23 +13:00
Ralph Slooten
4fa6fed8c9 0.2.1 2023-02-25 23:05:01 +13:00
Ralph Slooten
745bed1273 Update core modules 2023-02-25 23:04:02 +13:00
Ralph Slooten
d3cd263300 Fix typo 2022-04-22 22:48:04 +12:00
Ralph Slooten
88af2a0a0c Merge tag '0.2.0' into develop
Release 0.2.0
2019-12-13 23:13:14 +13:00
Ralph Slooten
fbb22582d1 Merge branch 'release/0.2.0' 2019-12-13 23:13:12 +13:00
Ralph Slooten
adac20101d 0.2.0 2019-12-13 23:12:57 +13:00
Ralph Slooten
521f3f24c1 Add threaded option 2019-12-13 22:21:00 +13:00
Ralph Slooten
3f9f09880c Update changelog 2019-11-03 19:21:18 +13:00
Ralph Slooten
eadd535e4c Merge tag '0.1.0' into develop
Release 0.1.0
2019-11-03 19:18:39 +13:00
6 changed files with 90 additions and 25 deletions

View File

@@ -1,6 +1,16 @@
# Changelog
## [dev]
## [0.2.1]
- Update core modules
## [0.2.0]
- Add threaded option (`-t`) to use all CPU cores
## [0.1.0]
- Switch to go mods - go (>= 1.11 required)
- Switch to axllent/semver for app updating

View File

@@ -20,4 +20,4 @@ release:
$(call build,linux,arm)
$(call build,linux,arm64)
$(call build,darwin,amd64)
$(call build,darwin,386)
$(call build,darwin,arm64)

View File

@@ -35,6 +35,7 @@ Options:
-m, --max string downscale to a maximum width & height in pixels (<width>x<height>)
-o, --out string output directory (default overwrites original)
-p, --preserve preserve file modification times (default true)
-t, --threaded run multi-threaded (use all CPU cores)
-u, --update update to latest release
-v, --version show version number
-h, --help show help

12
go.mod
View File

@@ -1,10 +1,12 @@
module github.com/axllent/goptimize
module git.sdf.org/kashifshah/goptimize
go 1.13
go 1.20
require (
github.com/axllent/ghru v1.1.3
github.com/disintegration/imaging v1.6.1
github.com/axllent/ghru v1.2.1
github.com/disintegration/imaging v1.6.2
github.com/spf13/pflag v1.0.5
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8
golang.org/x/image v0.5.0
)
require github.com/axllent/semver v0.0.1 // indirect

39
go.sum
View File

@@ -1,12 +1,35 @@
github.com/axllent/ghru v1.1.3 h1:n0jYsuqCYaHHAR6DraXZl8hpBY4j0XV47y5Lyym/jGo=
github.com/axllent/ghru v1.1.3/go.mod h1:rFvMhcO1UAv2Cv6bXscS8EOc7qqNpfe8ZLp23utzs88=
github.com/axllent/semver v0.0.0-20191103011746-394cefa91ee9 h1:LHNcCfePzgC/agAJs5a/5K3hFo8uW04bEdDKDkoX4do=
github.com/axllent/semver v0.0.0-20191103011746-394cefa91ee9/go.mod h1:2xSPzvG8n9mRfdtxSvWvfTfQGWfHsMsHO1iZnKATMSc=
github.com/disintegration/imaging v1.6.1 h1:JnBbK6ECIZb1NsWIikP9pd8gIlTIRx7fuDNpU9fsxOE=
github.com/disintegration/imaging v1.6.1/go.mod h1:xuIt+sRxDFrHS0drzXUlCJthkJ8k7lkkUojDSR247MQ=
github.com/axllent/ghru v1.2.1 h1:PuJQQeILJJ42O9nvjTwObWQGZDyZ9/F71st9jNAqgoU=
github.com/axllent/ghru v1.2.1/go.mod h1:YgznIILRJpnII5x8N080q/G8Milzk3sy9Sh4dV1eGQw=
github.com/axllent/semver v0.0.1 h1:QqF+KSGxgj8QZzSXAvKFqjGWE5792ksOnQhludToK8E=
github.com/axllent/semver v0.0.1/go.mod h1:2xSPzvG8n9mRfdtxSvWvfTfQGWfHsMsHO1iZnKATMSc=
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI=
golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

49
main.go
View File

@@ -5,7 +5,9 @@ import (
"os"
"os/exec"
"regexp"
"runtime"
"strconv"
"sync"
"github.com/axllent/ghru"
"github.com/spf13/pflag"
@@ -22,6 +24,7 @@ var (
optipng string
pngquant string
gifsicle string
threads = 1
version = "dev"
)
@@ -42,22 +45,23 @@ func main() {
fmt.Printf(" %s -o out/ -q 90 -m 1600x1600 *.jpg\n", os.Args[0])
fmt.Println("\nDetected optimizers:")
if err := displayDelectedOptimizer("jpegtran ", jpegtran); err != nil {
displayDelectedOptimizer("jpegoptim", jpegoptim)
if err := displayDetectedOptimizer("jpegtran ", jpegtran); err != nil {
displayDetectedOptimizer("jpegoptim", jpegoptim)
}
displayDelectedOptimizer("optipng ", optipng)
displayDelectedOptimizer("pngquant ", pngquant)
displayDelectedOptimizer("gifsicle ", gifsicle)
displayDetectedOptimizer("optipng ", optipng)
displayDetectedOptimizer("pngquant ", pngquant)
displayDetectedOptimizer("gifsicle ", gifsicle)
}
var maxSizes string
var update, showversion, showhelp bool
var multiThreaded, update, showversion, showhelp bool
flag.IntVarP(&quality, "quality", "q", 75, "quality, JPEG only")
flag.StringVarP(&maxSizes, "max", "m", "", "downscale to a maximum width & height in pixels (<width>x<height>)")
flag.StringVarP(&outputDir, "out", "o", "", "output directory (default overwrites original)")
flag.BoolVarP(&preserveModTimes, "preserve", "p", true, "preserve file modification times")
flag.BoolVarP(&update, "update", "u", false, "update to latest release")
flag.BoolVarP(&multiThreaded, "threaded", "t", false, "run multi-threaded (use all CPU cores)")
flag.BoolVarP(&showversion, "version", "v", false, "show version number")
flag.BoolVarP(&showhelp, "help", "h", false, "show help")
@@ -137,13 +141,38 @@ func main() {
}
}
for _, img := range args {
Goptimize(img)
if multiThreaded {
threads = runtime.NumCPU()
}
processChan := make(chan string)
wg := &sync.WaitGroup{} // Signal to main goroutine that worker goroutines are working/done working
wg.Add(threads)
for i := 0; i < threads; i++ {
go func() {
for nextFile := range processChan {
Goptimize(nextFile)
}
// Channel was closed, so we finished this goroutine.
wg.Done() // Let main goroutine know we are done.
}()
}
for _, img := range args {
processChan <- img
}
// Close the channel. This tells the worker goroutines that they can be done.
close(processChan)
// Wait for all worker goroutines to finish processing the IPs
wg.Wait()
}
// displayDelectedOptimizer prints whether the optimizer was found
func displayDelectedOptimizer(name, bin string) error {
// displayDetectedOptimizer prints whether the optimizer was found
func displayDetectedOptimizer(name, bin string) error {
exe, err := exec.LookPath(bin)
if err != nil {
return err