From 47024e030b087dd9959f01cf969c22506ffa6dfa Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 3 Aug 2019 10:44:59 +1200 Subject: [PATCH 01/10] Add update/version to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5d66c0d..739e7c3 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,8 @@ Options: pngquant binary (default "pngquant") -q int quality - JPEG only (default 75) + -u update to latest release + -v show version number ``` From 8e5e7b60985ec8b3e3080f3b26aaefe79087195c Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 3 Aug 2019 10:45:44 +1200 Subject: [PATCH 02/10] New line --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 36dd102..67e0e04 100644 --- a/main.go +++ b/main.go @@ -88,7 +88,7 @@ func main() { fmt.Println(err) os.Exit(1) } - fmt.Printf("Updated %s to version %s", os.Args[0], rel) + fmt.Printf("Updated %s to version %s\n", os.Args[0], rel) return } From d2a591a6d9c26e7fa68d1aeb995ce11ee6988d70 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 3 Aug 2019 11:15:54 +1200 Subject: [PATCH 03/10] Add a TODO --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 739e7c3..bcbc608 100644 --- a/README.md +++ b/README.md @@ -56,3 +56,12 @@ Options: - `./goptimize -m 800x800 *` - optimize and downscale all image files to a maximum size of 800x800px - `./goptimize -m 1200x0 image.jpg` - optimize and downscale a JPG file to a maximum size of width of 1200px - `./goptimize -o out/ image.jpg` - optimize a JPG file and save it to `out/` + + + +## TODO + +Some ideas for the future: + +- Dry run +- Option to copy exif data (how?) From 120e5fefdee3b65d5eeea57f07133f6dfd144191 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 3 Aug 2019 14:22:52 +1200 Subject: [PATCH 04/10] Fix typo --- goptimize.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goptimize.go b/goptimize.go index 999c0ec..52608df 100644 --- a/goptimize.go +++ b/goptimize.go @@ -166,7 +166,7 @@ func Goptimize(file string) { defer out.Close() if _, err := io.Copy(out, tmpFile); err != nil { - fmt.Printf("Error ovewriting original file: %v\n", err) + fmt.Printf("Error overwriting original file: %v\n", err) return } From 5df486c53ee2556e40ba4333f88ac1de93056a5e Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 3 Aug 2019 19:21:42 +1200 Subject: [PATCH 05/10] Add all deps to Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b536deb..08d7a4b 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ build = echo "\n\nBuilding $(1)-$(2)" && GOOS=$(1) GOARCH=$(2) go build ${LDFLAG && bzip2 dist/goptimize_${VERSION}_$(1)_$(2) goptimize: *.go - go get github.com/disintegration/imaging + go get github.com/disintegration/imaging golang.org/x/image/bmp golang.org/x/image/tiff github.com/axllent/gitrel go build ${LDFLAGS} -o goptimize rm -rf /tmp/go-* From 36e9b4c8fac49e3640c514c85a6b91c040949bbf Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Fri, 23 Aug 2019 19:17:56 +1200 Subject: [PATCH 06/10] Typo --- goptimize.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goptimize.go b/goptimize.go index 52608df..60049e6 100644 --- a/goptimize.go +++ b/goptimize.go @@ -32,7 +32,7 @@ func Goptimize(file string) { return } - // open original, rotate if neccesary + // open original, rotate if necessary src, err := imaging.Open(file, imaging.AutoOrientation(true)) if err != nil { From 97fa6c94c5b12bd2430887c07978ac335ddeb7c4 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 24 Aug 2019 23:17:55 +1200 Subject: [PATCH 07/10] Switch to pflag --- CHANGELOG.md | 5 +++++ Makefile | 3 ++- goptimize.go | 14 +++++++------- main.go | 32 ++++++++++++++++++++++---------- 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b318eb6..89f5a32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [dev] + +- Switch to [pflag](https://github.com/spf13/pflag) for better flag management + + ## [0.0.1] - Initial release diff --git a/Makefile b/Makefile index 08d7a4b..623867a 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ build = echo "\n\nBuilding $(1)-$(2)" && GOOS=$(1) GOARCH=$(2) go build ${LDFLAG && bzip2 dist/goptimize_${VERSION}_$(1)_$(2) goptimize: *.go - go get github.com/disintegration/imaging golang.org/x/image/bmp golang.org/x/image/tiff github.com/axllent/gitrel + go get github.com/disintegration/imaging golang.org/x/image/bmp golang.org/x/image/tiff github.com/axllent/gitrel github.com/spf13/pflag go build ${LDFLAGS} -o goptimize rm -rf /tmp/go-* @@ -16,6 +16,7 @@ clean: release: mkdir -p dist rm -f dist/goptimize_${VERSION}_* + go get github.com/disintegration/imaging golang.org/x/image/bmp golang.org/x/image/tiff github.com/axllent/gitrel github.com/spf13/pflag $(call build,linux,amd64) $(call build,linux,386) $(call build,linux,arm) diff --git a/goptimize.go b/goptimize.go index 60049e6..8f56c0d 100644 --- a/goptimize.go +++ b/goptimize.go @@ -116,19 +116,19 @@ func Goptimize(file string) { if format.String() == "JPEG" { // run one or the other, running both has no advantage if jpegtran != "" { - RunOptimiser(tmpFilename, true, jpegtran, "-optimize", "-outfile") + RunOptimizer(tmpFilename, true, jpegtran, "-optimize", "-outfile") } else if jpegoptim != "" { - RunOptimiser(tmpFilename, false, jpegoptim, "-f", "-s", "-o") + RunOptimizer(tmpFilename, false, jpegoptim, "-f", "-s", "-o") } } else if format.String() == "PNG" { if pngquant != "" { - RunOptimiser(tmpFilename, true, pngquant, "-f", "--output") + RunOptimizer(tmpFilename, true, pngquant, "-f", "--output") } if optipng != "" { - RunOptimiser(tmpFilename, true, optipng, "-out") + RunOptimizer(tmpFilename, true, optipng, "-out") } } else if format.String() == "GIF" && gifsicle != "" { - RunOptimiser(tmpFilename, true, gifsicle, "-o") + RunOptimizer(tmpFilename, true, gifsicle, "-o") } // re-open modified temporary file @@ -215,9 +215,9 @@ func Goptimize(file string) { } -// RunOptimiser will run the specified command on a copy of the temporary file, +// RunOptimizer will run the specified command on a copy of the temporary file, // and overwrite it if the output is smaller than the original -func RunOptimiser(src string, outFileArg bool, args ...string) { +func RunOptimizer(src string, outFileArg bool, args ...string) { // create a new temp file tmpFile, err := ioutil.TempFile(os.TempDir(), "Goptimized-") diff --git a/main.go b/main.go index 67e0e04..65197d2 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,6 @@ package main import ( - "flag" "fmt" "os" "os/exec" @@ -9,6 +8,7 @@ import ( "strconv" "github.com/axllent/gitrel" + "github.com/spf13/pflag" ) var ( @@ -26,11 +26,15 @@ var ( ) func main() { + // set up new flag instance + flag := pflag.NewFlagSet(os.Args[0], pflag.ExitOnError) + // set the default help flag.Usage = func() { fmt.Println("Goptimize - downscales and optimizes images") fmt.Printf("\nUsage: %s [options] \n", os.Args[0]) fmt.Println("\nOptions:") + flag.SortFlags = false flag.PrintDefaults() fmt.Println("\nExamples:") fmt.Printf(" %s image.png\n", os.Args[0]) @@ -47,14 +51,15 @@ func main() { } var maxSizes string - var update, showversion bool + var update, showversion, showhelp bool - flag.IntVar(&quality, "q", 75, "quality - JPEG only") - flag.StringVar(&outputDir, "o", "", "output directory (default overwrites original)") - flag.BoolVar(&preserveModTimes, "p", true, "preserve file modification times") - flag.StringVar(&maxSizes, "m", "", "downscale to a maximum width & height in pixels (x)") - flag.BoolVar(&update, "u", false, "update to latest release") - flag.BoolVar(&showversion, "v", false, "show version number") + flag.IntVarP(&quality, "quality", "q", 75, "quality - JPEG only") + flag.StringVarP(&maxSizes, "max", "m", "", "downscale to a maximum width & height in pixels (x)") + 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(&showversion, "version", "v", false, "show version number") + flag.BoolVarP(&showhelp, "help", "h", false, "show help") // third-party optimizers flag.StringVar(&gifsicle, "gifsicle", "gifsicle", "gifsicle binary") @@ -63,8 +68,10 @@ func main() { flag.StringVar(&optipng, "optipng", "optipng", "optipng binary") flag.StringVar(&pngquant, "pngquant", "pngquant", "pngquant binary") - // parse flags - flag.Parse() + flag.SortFlags = false + + // parse args excluding os.Args[0] + flag.Parse(os.Args[1:]) // detect optimizer paths gifsicle, _ = exec.LookPath(gifsicle) @@ -73,6 +80,11 @@ func main() { optipng, _ = exec.LookPath(optipng) pngquant, _ = exec.LookPath(pngquant) + if showhelp { + flag.Usage() + os.Exit(1) + } + if showversion { fmt.Println(fmt.Sprintf("Version: %s", version)) latest, _, _, err := gitrel.Latest("axllent/goptimize", "goptimize") From 0c000fe2629b6b74b1fd49f6c978d82eb760cba3 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 24 Aug 2019 23:22:19 +1200 Subject: [PATCH 08/10] Reorder flags --- main.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 65197d2..848d51e 100644 --- a/main.go +++ b/main.go @@ -53,7 +53,7 @@ func main() { var maxSizes string var update, showversion, showhelp bool - flag.IntVarP(&quality, "quality", "q", 75, "quality - JPEG only") + flag.IntVarP(&quality, "quality", "q", 75, "quality, JPEG only") flag.StringVarP(&maxSizes, "max", "m", "", "downscale to a maximum width & height in pixels (x)") flag.StringVarP(&outputDir, "out", "o", "", "output directory (default overwrites original)") flag.BoolVarP(&preserveModTimes, "preserve", "p", true, "preserve file modification times") @@ -62,11 +62,11 @@ func main() { flag.BoolVarP(&showhelp, "help", "h", false, "show help") // third-party optimizers - flag.StringVar(&gifsicle, "gifsicle", "gifsicle", "gifsicle binary") - flag.StringVar(&jpegoptim, "jpegoptim", "jpegoptim", "jpegoptim binary") flag.StringVar(&jpegtran, "jpegtran", "jpegtran", "jpegtran binary") - flag.StringVar(&optipng, "optipng", "optipng", "optipng binary") + flag.StringVar(&jpegoptim, "jpegoptim", "jpegoptim", "jpegoptim binary") + flag.StringVar(&gifsicle, "gifsicle", "gifsicle", "gifsicle binary") flag.StringVar(&pngquant, "pngquant", "pngquant", "pngquant binary") + flag.StringVar(&optipng, "optipng", "optipng", "optipng binary") flag.SortFlags = false From b157fcd72b68eb460162e37e6d561132de5834c3 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 24 Aug 2019 23:26:24 +1200 Subject: [PATCH 09/10] Update README --- README.md | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index bcbc608..1ea9c1d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Goptimizer - downscales and optimizes images -Goptimizer is a commandline utility written in Golang. It downscales and optimize existing images JPEG, PNG and Gif files. +Goptimizer is a commandline utility written in Golang. It downscales and optimizes JPEG, PNG and Gif files. -Image downscaling is done within Goptimize (`-m x`, see [Usage](#usage-options)), however optimization is done using the following additional tools (if they are installed): +Image downscaling/rotation is done within goptimize (`-m x`, see [Usage](#usage-options)), however optimization is done using the following additional tools (if they are installed): - jpegoptim - jpegtran (`libjpeg-turbo-progs`) @@ -28,25 +28,18 @@ It will also preserve (by default) the file's original modification times (`-p=f Usage: ./goptimize [options] Options: - -gifsicle string - gifsicle binary (default "gifsicle") - -jpegoptim string - jpegoptim binary (default "jpegoptim") - -jpegtran string - jpegtran binary (default "jpegtran") - -m string - downscale to a maximum width & height in pixels (x) - -o string - output directory (default overwrites original) - -optipng string - optipng binary (default "optipng") - -p preserve file modification times (default true) - -pngquant string - pngquant binary (default "pngquant") - -q int - quality - JPEG only (default 75) - -u update to latest release - -v show version number + -q, --quality int quality, JPEG only (default 75) + -m, --max string downscale to a maximum width & height in pixels (x) + -o, --out string output directory (default overwrites original) + -p, --preserve preserve file modification times (default true) + -u, --update update to latest release + -v, --version show version number + -h, --help show help + --jpegtran string jpegtran binary (default "jpegtran") + --jpegoptim string jpegoptim binary (default "jpegoptim") + --gifsicle string gifsicle binary (default "gifsicle") + --pngquant string pngquant binary (default "pngquant") + --optipng string optipng binary (default "optipng") ``` From 8362617920b0c2230a396a2db16604c1930189f4 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 24 Aug 2019 23:29:25 +1200 Subject: [PATCH 10/10] Add installation instructions --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 1ea9c1d..acb37b2 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,13 @@ Options: - `./goptimize -o out/ image.jpg` - optimize a JPG file and save it to `out/` +## Install + +Download the appropriate binary from the [releases](https://github.com/axllent/goptimize/releases/latest), or if you have golang installed +``` +go get github.com/axllent/goptimize +``` + ## TODO