diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e486e49..4ecf920 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -6,9 +6,6 @@ on: - main pull_request: -permissions: - contents: read - jobs: test: name: Test @@ -18,9 +15,9 @@ jobs: os: [ubuntu-latest, macos-latest, windows-latest] steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v2 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v2 with: go-version: 1.x - name: Test diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2ec95ca..a232aa3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -5,24 +5,28 @@ on: tags: - 'v*' -permissions: - contents: write - jobs: release: name: Release runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v2 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v2 with: go-version: 1.x - name: Cross build run: make cross - name: Create Release - uses: ncipollo/release-action@v1 + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - name: Release ${{ github.ref_name }} - artifacts: 'goxz/*' + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + - name: Upload + run: make upload + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index aa8e677..6fc9147 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,4 @@ # Changelog -## [v0.1.6](https://github.com/itchyny/mmv/compare/v0.1.5..v0.1.6) (2023-04-26) -* Remove dependency on shell for splitting EDITOR with spaces. - -## [v0.1.5](https://github.com/itchyny/mmv/compare/v0.1.4..v0.1.5) (2023-04-09) -* Support EDITOR with spaces in the editor path. - ## [v0.1.4](https://github.com/itchyny/mmv/compare/v0.1.3..v0.1.4) (2021-09-18) * Release `arm64` artifacts. diff --git a/LICENSE b/LICENSE index 3e03a16..d6d8af2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2020-2023 itchyny +Copyright (c) 2020-2021 itchyny Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Makefile b/Makefile index 6301fb1..91cf1d9 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ BIN := mmv VERSION := $$(make -s show-version) VERSION_PATH := cmd/$(BIN) -CURRENT_REVISION = $(shell git rev-parse --short HEAD) -BUILD_LDFLAGS = "-s -w -X main.revision=$(CURRENT_REVISION)" +CURRENT_REVISION := $(shell git rev-parse --short HEAD) +BUILD_LDFLAGS := "-s -w -X main.revision=$(CURRENT_REVISION)" GOBIN ?= $(shell go env GOPATH)/bin .PHONY: all @@ -14,18 +14,19 @@ build: .PHONY: install install: - go install -ldflags=$(BUILD_LDFLAGS) ./cmd/$(BIN) + go install -ldflags=$(BUILD_LDFLAGS) ./... .PHONY: show-version show-version: $(GOBIN)/gobump - @gobump show -r "$(VERSION_PATH)" + @gobump show -r $(VERSION_PATH) $(GOBIN)/gobump: @go install github.com/x-motemen/gobump/cmd/gobump@latest .PHONY: cross cross: $(GOBIN)/goxz CREDITS - goxz -n $(BIN) -pv=v$(VERSION) -build-ldflags=$(BUILD_LDFLAGS) ./cmd/$(BIN) + goxz -n $(BIN) -pv=v$(VERSION) -arch=amd64,arm64 \ + -build-ldflags=$(BUILD_LDFLAGS) ./cmd/$(BIN) $(GOBIN)/goxz: go install github.com/Songmu/goxz/cmd/goxz@latest @@ -44,7 +45,7 @@ test: build .PHONY: lint lint: $(GOBIN)/staticcheck go vet ./... - staticcheck -checks all ./... + staticcheck ./... $(GOBIN)/staticcheck: go install honnef.co/go/tools/cmd/staticcheck@latest @@ -56,9 +57,21 @@ clean: .PHONY: bump bump: $(GOBIN)/gobump - test -z "$$(git status --porcelain || echo .)" - test "$$(git branch --show-current)" = "main" +ifneq ($(shell git status --porcelain),) + $(error git workspace is dirty) +endif +ifneq ($(shell git rev-parse --abbrev-ref HEAD),main) + $(error current branch is not main) +endif @gobump up -w "$(VERSION_PATH)" git commit -am "bump up version to $(VERSION)" git tag "v$(VERSION)" - git push --atomic origin main tag "v$(VERSION)" + git push origin main + git push origin "refs/tags/v$(VERSION)" + +.PHONY: upload +upload: $(GOBIN)/ghr + ghr "v$(VERSION)" goxz + +$(GOBIN)/ghr: + go install github.com/tcnksm/ghr@latest diff --git a/cmd/mmv/main.go b/cmd/mmv/main.go index 6e854c4..8aed5bb 100644 --- a/cmd/mmv/main.go +++ b/cmd/mmv/main.go @@ -4,12 +4,14 @@ import ( "errors" "flag" "fmt" + "io/ioutil" + "math/rand" "os" "os/exec" "runtime" "strings" + "time" - "github.com/kballard/go-shellquote" _ "github.com/mattn/getwild" "github.com/mattn/go-tty" @@ -18,10 +20,14 @@ import ( const name = "mmv" -const version = "0.1.6" +const version = "0.1.4" var revision = "HEAD" +func init() { + rand.Seed(time.Now().UnixNano()) +} + func main() { os.Exit(run(os.Args[1:])) } @@ -80,7 +86,7 @@ func rename(args []string) error { xs[src] = true } - f, err := os.CreateTemp("", name+"-") + f, err := ioutil.TempFile("", name+"-") if err != nil { return err } @@ -103,10 +109,7 @@ func rename(args []string) error { if editor == "" { editor = "vi" } - editorWithArgs, err := shellquote.Split(editor) - if err != nil { - return fmt.Errorf("%s: %s", err, editor) - } + editorWithArgs := strings.Fields(editor) editorWithArgs = append(editorWithArgs, f.Name()) cmd := exec.Command(editorWithArgs[0], editorWithArgs[1:]...) @@ -117,7 +120,7 @@ func rename(args []string) error { return fmt.Errorf("abort renames: %s", err) } - cnt, err := os.ReadFile(f.Name()) + cnt, err := ioutil.ReadFile(f.Name()) if err != nil { return err } diff --git a/go.mod b/go.mod index f7b9d35..5074b50 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,10 @@ module github.com/itchyny/mmv -go 1.20 +go 1.16 require ( - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/mattn/getwild v0.0.2-0.20200919000855-c2e221927ad6 - github.com/mattn/go-tty v0.0.4 -) - -require ( - github.com/mattn/go-isatty v0.0.18 // indirect - golang.org/x/sys v0.7.0 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-tty v0.0.3 + golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 // indirect ) diff --git a/go.sum b/go.sum index 2933528..d3d6e10 100644 --- a/go.sum +++ b/go.sum @@ -1,18 +1,17 @@ -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/mattn/getwild v0.0.2-0.20200919000855-c2e221927ad6 h1:uWR+2CTTaHQzDS/DApbJ2H8UEPQl90atrKtczXj2xcs= github.com/mattn/getwild v0.0.2-0.20200919000855-c2e221927ad6/go.mod h1:AG+GKQydHp7iLJn+VV+D7y8LeYs5bQ0Xz4fmKd5o1Sg= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-tty v0.0.4 h1:NVikla9X8MN0SQAqCYzpGyXv0jY7MNl3HOWD2dkle7E= -github.com/mattn/go-tty v0.0.4/go.mod h1:u5GGXBtZU6RQoKV8gY5W6UhMudbR5vXnUe7j3pxse28= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-tty v0.0.3 h1:5OfyWorkyO7xP52Mq7tB36ajHDG5OHrmBGIS/DtakQI= +github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/mmv.go b/mmv.go index bd5ba36..4b6fae9 100644 --- a/mmv.go +++ b/mmv.go @@ -1,11 +1,10 @@ -// Package mmv provides a method to rename multiple files. package mmv import ( - "crypto/rand" - "encoding/base64" + "math/rand" "os" "path/filepath" + "strconv" "strings" ) @@ -251,12 +250,8 @@ func buildRenames(files map[string]string) ([]rename, error) { // create a temporary path where there is no file currently func temporaryPath(dir string) (string, error) { - bs := make([]byte, 16) for i := 0; i < 256; i++ { - if _, err := rand.Read(bs); err != nil { - return "", err - } - path := filepath.Join(dir, base64.RawURLEncoding.EncodeToString(bs)) + path := filepath.Join(dir, strconv.FormatUint(rand.Uint64()|1<<60, 16)) if _, err := os.Stat(path); err != nil && os.IsNotExist(err) { return path, nil } diff --git a/mmv_test.go b/mmv_test.go index f8d93ce..8f0177c 100644 --- a/mmv_test.go +++ b/mmv_test.go @@ -1,6 +1,7 @@ package mmv import ( + "io/ioutil" "os" "path/filepath" "reflect" @@ -384,9 +385,9 @@ func TestRename(t *testing.T) { } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - dir, err := os.MkdirTemp("", "mmv-") + dir, err := ioutil.TempDir("", "mmv-") if err != nil { - t.Fatalf("os.MkdirTemp returned an error: %s", err) + t.Fatalf("ioutil.TempDir returned an error: %s", err) } t.Cleanup(func() { os.RemoveAll(dir) }) if err := os.Chdir(dir); err != nil { @@ -422,7 +423,7 @@ func setupFiles(contents map[string]string) error { return err } } - if err := os.WriteFile(f, []byte(cnt), 0o600); err != nil { + if err := ioutil.WriteFile(f, []byte(cnt), 0o600); err != nil { return err } } @@ -431,7 +432,7 @@ func setupFiles(contents map[string]string) error { func fileContents(dir string) map[string]string { m := make(map[string]string) - fis, _ := os.ReadDir(dir) + fis, _ := ioutil.ReadDir(dir) for _, fi := range fis { if fi.IsDir() { for k, v := range fileContents(filepath.Join(dir, fi.Name())) { @@ -439,7 +440,7 @@ func fileContents(dir string) map[string]string { } } else { path := filepath.Join(dir, fi.Name()) - cnt, _ := os.ReadFile(path) + cnt, _ := ioutil.ReadFile(path) m[filepath.ToSlash(path)] = string(cnt) } }