From 8bbf9335e13f4d56fd7008757d4a9ead34e6381c Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Fri, 2 Jun 2017 16:32:15 +0900 Subject: [PATCH] Restructuring: main package in project root --- .gitignore | 4 +- .travis.yml | 11 +-- BUILD.md | 13 ++-- Makefile | 134 +++++++++++++++++++++++++++++++++++++ src/fzf/main.go => main.go | 0 src/Makefile | 119 -------------------------------- src/README.md | 106 ----------------------------- 7 files changed, 144 insertions(+), 243 deletions(-) create mode 100644 Makefile rename src/fzf/main.go => main.go (100%) delete mode 100644 src/Makefile delete mode 100644 src/README.md diff --git a/.gitignore b/.gitignore index 4e88fdf8..61ef4336 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -bin -src/fzf/fzf-* +bin/fzf +target pkg Gemfile.lock .DS_Store diff --git a/.travis.yml b/.travis.yml index 3f2a67f7..915e871b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,13 +16,6 @@ install: - sudo apt-get install -y zsh fish script: | - export GOPATH=~/go - export FZF_BASE=$GOPATH/src/github.com/junegunn/fzf - - mkdir -p $GOPATH/src/github.com/junegunn - ln -s $(pwd) $FZF_BASE - - cd $FZF_BASE/src && make test fzf/fzf-linux_amd64 install && - cd $FZF_BASE/bin && ln -sf fzf-linux_amd64 fzf-$(./fzf --version)-linux_amd64 && - cd $FZF_BASE && yes | ./install && rm -f fzf && + make test install && + ./install --all && tmux new "ruby test/test_go.rb > out && touch ok" && cat out && [ -e ok ] diff --git a/BUILD.md b/BUILD.md index f52f3950..390d8c2e 100644 --- a/BUILD.md +++ b/BUILD.md @@ -10,20 +10,19 @@ Build instructions ### Using Makefile -```sh -# Source files are located in src directory -cd src +Makefile will set up and use its own `$GOPATH` under the project root. -# Build fzf binary for your platform in src/fzf +```sh +# Build fzf binary for your platform in target make # Build fzf binary and copy it to bin directory make install -# Build 32-bit and 64-bit executables and tarballs +# Build 32-bit and 64-bit executables and tarballs in target make release -# Make release archives for all supported platforms +# Make release archives for all supported platforms in target make release-all ``` @@ -33,7 +32,7 @@ Alternatively, you can build fzf directly with `go get` command without manually cloning the repository. ```sh -go get -u github.com/junegunn/fzf/src/fzf +go get -u github.com/junegunn/fzf ``` Third-party libraries used diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..660af461 --- /dev/null +++ b/Makefile @@ -0,0 +1,134 @@ +ifndef GOOS +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Darwin) + GOOS := darwin +else ifeq ($(UNAME_S),Linux) + GOOS := linux +else +$(error "$$GOOS is not defined.") +endif +endif + +ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) +GOPATH := $(ROOT_DIR)/gopath +SRC_LINK := $(GOPATH)/src/github.com/junegunn/fzf/src +VENDOR_LINK := $(GOPATH)/src/github.com/junegunn/fzf/vendor + +GLIDE_YAML := glide.yaml +GLIDE_LOCK := glide.lock +SOURCES := $(wildcard *.go src/*.go src/*/*.go) $(SRC_LINK) $(VENDOR_LINK) $(GLIDE_LOCK) + +BINARY32 := fzf-$(GOOS)_386 +BINARY64 := fzf-$(GOOS)_amd64 +BINARYARM5 := fzf-$(GOOS)_arm5 +BINARYARM6 := fzf-$(GOOS)_arm6 +BINARYARM7 := fzf-$(GOOS)_arm7 +BINARYARM8 := fzf-$(GOOS)_arm8 +VERSION := $(shell awk -F= '/version =/ {print $$2}' src/constants.go | tr -d "\" ") +RELEASE32 := fzf-$(VERSION)-$(GOOS)_386 +RELEASE64 := fzf-$(VERSION)-$(GOOS)_amd64 +RELEASEARM5 := fzf-$(VERSION)-$(GOOS)_arm5 +RELEASEARM6 := fzf-$(VERSION)-$(GOOS)_arm6 +RELEASEARM7 := fzf-$(VERSION)-$(GOOS)_arm7 +RELEASEARM8 := fzf-$(VERSION)-$(GOOS)_arm8 +export GOPATH + +# https://en.wikipedia.org/wiki/Uname +UNAME_M := $(shell uname -m) +ifeq ($(UNAME_M),x86_64) + BINARY := $(BINARY64) +else ifeq ($(UNAME_M),amd64) + BINARY := $(BINARY64) +else ifeq ($(UNAME_M),i686) + BINARY := $(BINARY32) +else ifeq ($(UNAME_M),i386) + BINARY := $(BINARY32) +else ifeq ($(UNAME_M),armv5l) + BINARY := $(BINARYARM5) +else ifeq ($(UNAME_M),armv6l) + BINARY := $(BINARYARM6) +else ifeq ($(UNAME_M),armv7l) + BINARY := $(BINARYARM7) +else +$(error "Build on $(UNAME_M) is not supported, yet.") +endif + +all: target/$(BINARY) + +target: + mkdir -p $@ + +ifeq ($(GOOS),windows) +release: target/$(BINARY32) target/$(BINARY64) + cd target && cp -f $(BINARY32) fzf.exe && zip $(RELEASE32).zip bin/fzf.exe + cd target && cp -f $(BINARY64) fzf.exe && zip $(RELEASE64).zip bin/fzf.exe + cd target && rm -f fzf.exe +else ifeq ($(GOOS),linux) +release: target/$(BINARY32) target/$(BINARY64) target/$(BINARYARM5) target/$(BINARYARM6) target/$(BINARYARM7) target/$(BINARYARM8) + cd target && cp -f $(BINARY32) fzf && tar -czf $(RELEASE32).tgz fzf + cd target && cp -f $(BINARY64) fzf && tar -czf $(RELEASE64).tgz fzf + cd target && cp -f $(BINARYARM5) fzf && tar -czf $(RELEASEARM5).tgz fzf + cd target && cp -f $(BINARYARM6) fzf && tar -czf $(RELEASEARM6).tgz fzf + cd target && cp -f $(BINARYARM7) fzf && tar -czf $(RELEASEARM7).tgz fzf + cd target && cp -f $(BINARYARM8) fzf && tar -czf $(RELEASEARM8).tgz fzf + cd target && rm -f fzf +else +release: target/$(BINARY32) target/$(BINARY64) + cd target && cp -f $(BINARY32) fzf && tar -czf $(RELEASE32).tgz fzf + cd target && cp -f $(BINARY64) fzf && tar -czf $(RELEASE64).tgz fzf + cd target && rm -f fzf +endif + +release-all: clean test + GOOS=darwin make release + GOOS=linux make release + GOOS=freebsd make release + GOOS=openbsd make release + GOOS=windows make release + +$(SRC_LINK): + mkdir -p $(shell dirname $(SRC_LINK)) + ln -s $(ROOT_DIR)/src $(SRC_LINK) + +$(VENDOR_LINK): + mkdir -p $(shell dirname $(VENDOR_LINK)) + ln -s $(ROOT_DIR)/vendor $(VENDOR_LINK) + +$(GLIDE_LOCK): $(GLIDE_YAML) + go get -u github.com/Masterminds/glide && $(GOPATH)/bin/glide install && touch $@ + +test: $(SOURCES) + SHELL=/bin/sh GOOS= go test -v -tags "$(TAGS)" \ + github.com/junegunn/fzf/src \ + github.com/junegunn/fzf/src/algo \ + github.com/junegunn/fzf/src/tui \ + github.com/junegunn/fzf/src/util + +install: bin/fzf + +clean: + rm -rf target + +target/$(BINARY32): $(SOURCES) + GOARCH=386 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $@ + +target/$(BINARY64): $(SOURCES) + GOARCH=amd64 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $@ + +# https://github.com/golang/go/wiki/GoArm +target/$(BINARYARM5): $(SOURCES) + GOARCH=arm GOARM=5 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $@ + +target/$(BINARYARM6): $(SOURCES) + GOARCH=arm GOARM=6 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $@ + +target/$(BINARYARM7): $(SOURCES) + GOARCH=arm GOARM=7 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $@ + +target/$(BINARYARM8): $(SOURCES) + GOARCH=arm64 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $@ + +bin/fzf: target/$(BINARY) | bin + cp -f target/$(BINARY) bin/fzf + +.PHONY: all release release-all test install clean diff --git a/src/fzf/main.go b/main.go similarity index 100% rename from src/fzf/main.go rename to main.go diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index 5205b1c1..00000000 --- a/src/Makefile +++ /dev/null @@ -1,119 +0,0 @@ -ifndef GOOS -UNAME_S := $(shell uname -s) -ifeq ($(UNAME_S),Darwin) - GOOS := darwin -else ifeq ($(UNAME_S),Linux) - GOOS := linux -else -$(error "$$GOOS is not defined.") -endif -endif - -SOURCES := $(wildcard *.go */*.go) -ROOTDIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) -BINDIR := $(shell dirname $(ROOTDIR))/bin -BINARY32 := fzf-$(GOOS)_386 -BINARY64 := fzf-$(GOOS)_amd64 -BINARYARM5 := fzf-$(GOOS)_arm5 -BINARYARM6 := fzf-$(GOOS)_arm6 -BINARYARM7 := fzf-$(GOOS)_arm7 -BINARYARM8 := fzf-$(GOOS)_arm8 -VERSION := $(shell awk -F= '/version =/ {print $$2}' constants.go | tr -d "\" ") -RELEASE32 := fzf-$(VERSION)-$(GOOS)_386 -RELEASE64 := fzf-$(VERSION)-$(GOOS)_amd64 -RELEASEARM5 := fzf-$(VERSION)-$(GOOS)_arm5 -RELEASEARM6 := fzf-$(VERSION)-$(GOOS)_arm6 -RELEASEARM7 := fzf-$(VERSION)-$(GOOS)_arm7 -RELEASEARM8 := fzf-$(VERSION)-$(GOOS)_arm8 - -# https://en.wikipedia.org/wiki/Uname -UNAME_M := $(shell uname -m) -ifeq ($(UNAME_M),x86_64) - BINARY := $(BINARY64) -else ifeq ($(UNAME_M),amd64) - BINARY := $(BINARY64) -else ifeq ($(UNAME_M),i686) - BINARY := $(BINARY32) -else ifeq ($(UNAME_M),i386) - BINARY := $(BINARY32) -else ifeq ($(UNAME_M),armv5l) - BINARY := $(BINARYARM5) -else ifeq ($(UNAME_M),armv6l) - BINARY := $(BINARYARM6) -else ifeq ($(UNAME_M),armv7l) - BINARY := $(BINARYARM7) -else -$(error "Build on $(UNAME_M) is not supported, yet.") -endif - -all: fzf/$(BINARY) - -ifeq ($(GOOS),windows) -release: fzf/$(BINARY32) fzf/$(BINARY64) - cd fzf && cp -f $(BINARY32) fzf.exe && zip $(RELEASE32).zip fzf.exe - cd fzf && cp -f $(BINARY64) fzf.exe && zip $(RELEASE64).zip fzf.exe - cd fzf && rm -f fzf.exe -else ifeq ($(GOOS),linux) -release: fzf/$(BINARY32) fzf/$(BINARY64) fzf/$(BINARYARM5) fzf/$(BINARYARM6) fzf/$(BINARYARM7) fzf/$(BINARYARM8) - cd fzf && cp -f $(BINARY32) fzf && tar -czf $(RELEASE32).tgz fzf - cd fzf && cp -f $(BINARY64) fzf && tar -czf $(RELEASE64).tgz fzf - cd fzf && cp -f $(BINARYARM5) fzf && tar -czf $(RELEASEARM5).tgz fzf - cd fzf && cp -f $(BINARYARM6) fzf && tar -czf $(RELEASEARM6).tgz fzf - cd fzf && cp -f $(BINARYARM7) fzf && tar -czf $(RELEASEARM7).tgz fzf - cd fzf && cp -f $(BINARYARM8) fzf && tar -czf $(RELEASEARM8).tgz fzf - cd fzf && rm -f fzf -else -release: fzf/$(BINARY32) fzf/$(BINARY64) - cd fzf && cp -f $(BINARY32) fzf && tar -czf $(RELEASE32).tgz fzf - cd fzf && cp -f $(BINARY64) fzf && tar -czf $(RELEASE64).tgz fzf - cd fzf && rm -f fzf -endif - -release-all: clean test - GOOS=darwin make release - GOOS=linux make release - GOOS=freebsd make release - GOOS=openbsd make release - GOOS=windows make release - -deps: $(SOURCES) - cd .. && go get -u github.com/Masterminds/glide && $(GOPATH)/bin/glide install - -test: deps - SHELL=/bin/sh GOOS= go test -v -tags "$(TAGS)" ./... - -install: $(BINDIR)/fzf - -uninstall: - rm -f $(BINDIR)/fzf $(BINDIR)/$(BINARY) - -clean: - cd fzf && rm -f fzf-* - -fzf/$(BINARY32): deps - cd fzf && GOARCH=386 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARY32) - -fzf/$(BINARY64): deps - cd fzf && GOARCH=amd64 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARY64) - -# https://github.com/golang/go/wiki/GoArm -fzf/$(BINARYARM5): deps - cd fzf && GOARCH=arm GOARM=5 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARYARM5) - -fzf/$(BINARYARM6): deps - cd fzf && GOARCH=arm GOARM=6 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARYARM6) - -fzf/$(BINARYARM7): deps - cd fzf && GOARCH=arm GOARM=7 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARYARM7) - -fzf/$(BINARYARM8): deps - cd fzf && GOARCH=arm64 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARYARM8) - -$(BINDIR)/fzf: fzf/$(BINARY) | $(BINDIR) - cp -f fzf/$(BINARY) $(BINDIR) - cd $(BINDIR) && ln -sf $(BINARY) fzf - -$(BINDIR): - mkdir -p $@ - -.PHONY: all deps release release-all test install uninstall clean diff --git a/src/README.md b/src/README.md deleted file mode 100644 index ec88ca23..00000000 --- a/src/README.md +++ /dev/null @@ -1,106 +0,0 @@ -fzf in Go -========= - -fzf in go - -This directory contains the source code for the new fzf implementation in -[Go][go]. - -Upgrade from Ruby version -------------------------- - -The install script has been updated to download the right binary for your -system. If you already have installed fzf, simply git-pull the repository and -rerun the install script. - -```sh -cd ~/.fzf -git pull -./install -``` - -Otherwise, follow [the instruction][install] as before. You can also install -fzf using Homebrew if you prefer that way. - -Motivations ------------ - -### No Ruby dependency - -There have always been complaints about fzf being a Ruby script. To make -matters worse, Ruby 2.1 removed ncurses binding from its standard libary. -Because of the change, users running Ruby 2.1 or above are forced to build C -extensions of curses gem to meet the requirement of fzf. The new Go version -will be distributed as an executable binary so it will be much more accessible -and should be easier to setup. - -### Performance - -Many people have been surprised to see how fast fzf is even when it was -written in Ruby. It stays quite responsive even for 100k+ lines, which is -well above the size of the usual input. - -The new Go version, of course, is significantly faster than that. It has all -the performance optimization techniques used in Ruby implementation and more. -It also doesn't suffer from [GIL][gil], so the search performance scales -proportional to the number of CPU cores. On my MacBook Pro (Mid 2012), the new -version was shown to be an order of magnitude faster on certain cases. It also -starts much faster though the difference may not be noticeable. - -Build ------ - -See [BUILD.md](../BUILD.md) - -Test ----- - -Unit tests can be run with `make test`. Integration tests are written in Ruby -script that should be run on tmux. - -```sh -cd src - -# Unit tests -make test - -# Integration tests -ruby ../test/test_go.rb - -# Build binary for the platform -make - -# Install the executable to ../bin directory -make install - -# Make release archives -make release - -# Make release archives for all supported platforms -make release-all -``` - -Third-party libraries used --------------------------- - -- ~[ncurses][ncurses]~ -- [mattn/go-runewidth](https://github.com/mattn/go-runewidth) - - Licensed under [MIT](http://mattn.mit-license.org) -- [mattn/go-shellwords](https://github.com/mattn/go-shellwords) - - Licensed under [MIT](http://mattn.mit-license.org) -- [mattn/go-isatty](https://github.com/mattn/go-isatty) - - Licensed under [MIT](http://mattn.mit-license.org) -- [tcell](https://github.com/gdamore/tcell) - - Licensed under [Apache License 2.0](https://github.com/gdamore/tcell/blob/master/LICENSE) - -License -------- - -[MIT](LICENSE) - -[install]: https://github.com/junegunn/fzf#installation -[go]: https://golang.org/ -[gil]: http://en.wikipedia.org/wiki/Global_Interpreter_Lock -[ncurses]: https://www.gnu.org/software/ncurses/ -[req]: http://golang.org/doc/install -[tcell]: https://github.com/gdamore/tcell