From f09515867d9062d6d7b9c7a0ee731f85fdb2050a Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Thu, 16 Aug 2018 01:53:53 -0400 Subject: [PATCH 01/41] #157: clean BOM, allowing CSV files to display correctly --- Gopkg.toml | 4 ++++ pkg/gui/view_helpers.go | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Gopkg.toml b/Gopkg.toml index a47fe5e93..ea5472df0 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -40,3 +40,7 @@ [[constraint]] name = "gopkg.in/src-d/go-git.v4" revision = "43d17e14b714665ab5bc2ecc220b6740779d733f" + +[[constraint]] + branch = "master" + name = "https://github.com/spkg/bom" diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index 331e27975..3f6f1ac4d 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -7,6 +7,7 @@ import ( "time" "github.com/jesseduffield/gocui" + "github.com/spkg/bom" ) var cyclableViews = []string{"files", "branches", "commits", "stash"} @@ -191,7 +192,7 @@ func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) error { return nil } v.Clear() - fmt.Fprint(v, s) + fmt.Fprint(v, bom.Clean(s)) v.Wrap = true return nil }) From 3a31b84d1ab8a99ae04ebb6c17ca26710182b724 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Thu, 16 Aug 2018 02:00:34 -0400 Subject: [PATCH 02/41] add BOM test generator --- test/repos/bom.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 test/repos/bom.sh diff --git a/test/repos/bom.sh b/test/repos/bom.sh new file mode 100644 index 000000000..f198e8c29 --- /dev/null +++ b/test/repos/bom.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -ex; rm -rf repo; mkdir repo; cd repo + +git init + +cat <> bomtest.txt A,B,C,D,E +F,G,H,I,J +K,L,M,N,O +P,Q,R,S,T +U,V,W,X,Y +Z,1,2,3,4 +EOT From 74d81ae0806c87da8b9e504dd581c574e7396ee3 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Thu, 16 Aug 2018 07:10:25 -0400 Subject: [PATCH 03/41] [rebase] Fix errors; update dependencies Argument must be []byte not string Don't commit bomtest.txt --- Gopkg.lock | 97 ++++++---------------- Gopkg.toml | 2 +- pkg/gui/view_helpers.go | 2 +- test/repos/bom.sh | 3 +- vendor/github.com/spkg/bom/LICENSE.md | 21 +++++ vendor/github.com/spkg/bom/bom.go | 39 +++++++++ vendor/github.com/spkg/bom/discard_go14.go | 12 +++ vendor/github.com/spkg/bom/discard_go15.go | 10 +++ 8 files changed, 113 insertions(+), 73 deletions(-) create mode 100644 vendor/github.com/spkg/bom/LICENSE.md create mode 100644 vendor/github.com/spkg/bom/bom.go create mode 100644 vendor/github.com/spkg/bom/discard_go14.go create mode 100644 vendor/github.com/spkg/bom/discard_go15.go diff --git a/Gopkg.lock b/Gopkg.lock index 7b167c7d8..288f8ba4d 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,23 +2,18 @@ [[projects]] - digest = "1:b2339e83ce9b5c4f79405f949429a7f68a9a904fed903c672aac1e7ceb7f5f02" name = "github.com/Sirupsen/logrus" packages = ["."] - pruneopts = "NUT" revision = "3e01752db0189b9157070a0e1668a620f9a85da2" version = "v1.0.6" [[projects]] - digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" name = "github.com/davecgh/go-spew" packages = ["spew"] - pruneopts = "NUT" revision = "346938d642f2ec3594ed81d874461961cd0faa76" version = "v1.1.0" [[projects]] - digest = "1:de4a74b504df31145ffa8ca0c4edbffa2f3eb7f466753962184611b618fa5981" name = "github.com/emirpasic/gods" packages = [ "containers", @@ -26,148 +21,133 @@ "lists/arraylist", "trees", "trees/binaryheap", - "utils", + "utils" ] - pruneopts = "NUT" revision = "f6c17b524822278a87e3b3bd809fec33b51f5b46" version = "v1.9.0" [[projects]] - digest = "1:ade392a843b2035effb4b4a2efa2c3bab3eb29b992e98bacf9c898b0ecb54e45" name = "github.com/fatih/color" packages = ["."] - pruneopts = "NUT" revision = "5b77d2a35fb0ede96d138fc9a99f5c9b6aef11b4" version = "v1.7.0" [[projects]] branch = "master" - digest = "1:4a8ed9b8cf22bd03bee5d74179fa06a282e4a73b6de949f7a865ff56cd2537e0" name = "github.com/golang-collections/collections" packages = ["stack"] - pruneopts = "NUT" revision = "604e922904d35e97f98a774db7881f049cd8d970" [[projects]] branch = "master" - digest = "1:62fe3a7ea2050ecbd753a71889026f83d73329337ada66325cbafd5dea5f713d" name = "github.com/jbenet/go-context" packages = ["io"] - pruneopts = "NUT" revision = "d14ea06fba99483203c19d92cfcd13ebe73135f4" [[projects]] branch = "master" - digest = "1:c9a848b0484a72da2dae28957b4f67501fe27fa38bc73f4713e454353c0a4a60" name = "github.com/jesseduffield/gocui" packages = ["."] - pruneopts = "NUT" revision = "432b7f6215f81ef1aaa1b2d9b69887822923cf79" [[projects]] - digest = "1:8021af4dcbd531ae89433c8c3a6520e51064114aaf8eb1724c3cf911c497c9ba" + name = "github.com/jesseduffield/lazygit" + packages = [ + "pkg/app", + "pkg/commands", + "pkg/config", + "pkg/git", + "pkg/gui", + "pkg/utils" + ] + revision = "db140842f3c10921153b3e19e66dd72b39fa00f8" + version = "v0.1.61" + +[[projects]] name = "github.com/kevinburke/ssh_config" packages = ["."] - pruneopts = "NUT" revision = "9fc7bb800b555d63157c65a904c86a2cc7b4e795" version = "0.4" [[projects]] - digest = "1:08c231ec84231a7e23d67e4b58f975e1423695a32467a362ee55a803f9de8061" name = "github.com/mattn/go-colorable" packages = ["."] - pruneopts = "NUT" revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" version = "v0.0.9" [[projects]] - digest = "1:bc4f7eec3b7be8c6cb1f0af6c1e3333d5bb71072951aaaae2f05067b0803f287" name = "github.com/mattn/go-isatty" packages = ["."] - pruneopts = "NUT" revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" version = "v0.0.3" [[projects]] - digest = "1:cb591533458f6eb6e2c1065ff3eac6b50263d7847deb23fc9f79b25bc608970e" name = "github.com/mattn/go-runewidth" packages = ["."] - pruneopts = "NUT" revision = "9e777a8366cce605130a531d2cd6363d07ad7317" version = "v0.0.2" [[projects]] - digest = "1:a25c9a6b41e100f4ce164db80260f2b687095ba9d8b46a1d6072d3686cc020db" name = "github.com/mgutz/str" packages = ["."] - pruneopts = "NUT" revision = "968bf66e3da857419e4f6e71b2d5c9ae95682dc4" version = "v1.2.0" [[projects]] branch = "master" - digest = "1:a4df73029d2c42fabcb6b41e327d2f87e685284ec03edf76921c267d9cfc9c23" name = "github.com/mitchellh/go-homedir" packages = ["."] - pruneopts = "NUT" revision = "58046073cbffe2f25d425fe1331102f55cf719de" [[projects]] branch = "master" - digest = "1:34d9354c2c5d916c05864327553047df59fc10e86ff1f408e4136eba0a25a5ec" name = "github.com/nsf/termbox-go" packages = ["."] - pruneopts = "NUT" revision = "5c94acc5e6eb520f1bcd183974e01171cc4c23b3" [[projects]] - digest = "1:cf254277d898b713195cc6b4a3fac8bf738b9f1121625df27843b52b267eec6c" name = "github.com/pelletier/go-buffruneio" packages = ["."] - pruneopts = "NUT" revision = "c37440a7cf42ac63b919c752ca73a85067e05992" version = "v0.2.0" [[projects]] - digest = "1:d917313f309bda80d27274d53985bc65651f81a5b66b820749ac7f8ef061fd04" name = "github.com/sergi/go-diff" packages = ["diffmatchpatch"] - pruneopts = "NUT" revision = "1744e2970ca51c86172c8190fadad617561ed6e7" version = "v1.0.0" [[projects]] - digest = "1:ccca1dcd18bc54e23b517a3c5babeff2e3924a7d8fc1932162225876cfe4bfb0" + branch = "master" + name = "github.com/spkg/bom" + packages = ["."] + revision = "59b7046e48ad6bac800c5e1dd5142282cbfcf154" + +[[projects]] name = "github.com/src-d/gcfg" packages = [ ".", "scanner", "token", - "types", + "types" ] - pruneopts = "NUT" revision = "f187355171c936ac84a82793659ebb4936bc1c23" version = "v1.3.0" [[projects]] - digest = "1:cd5ffc5bda4e0296ab3e4de90dbb415259c78e45e7fab13694b14cde8ab74541" name = "github.com/tcnksm/go-gitconfig" packages = ["."] - pruneopts = "NUT" revision = "d154598bacbf4501c095a309753c5d4af66caa81" version = "v0.1.2" [[projects]] - digest = "1:3148cb3478c26a92b4c1a18abb9428234b281e278af6267840721a24b6cbc6a3" name = "github.com/xanzy/ssh-agent" packages = ["."] - pruneopts = "NUT" revision = "640f0ab560aeb89d523bb6ac322b1244d5c3796c" version = "v0.2.0" [[projects]] branch = "master" - digest = "1:dfcb1b2db354cafa48fc3cdafe4905a08bec4a9757919ab07155db0ca23855b4" name = "golang.org/x/crypto" packages = [ "cast5", @@ -186,32 +166,26 @@ "ssh", "ssh/agent", "ssh/knownhosts", - "ssh/terminal", + "ssh/terminal" ] - pruneopts = "NUT" revision = "de0752318171da717af4ce24d0a2e8626afaeb11" [[projects]] branch = "master" - digest = "1:76ee51c3f468493aff39dbacc401e8831fbb765104cbf613b89bef01cf4bad70" name = "golang.org/x/net" packages = ["context"] - pruneopts = "NUT" revision = "c39426892332e1bb5ec0a434a079bf82f5d30c54" [[projects]] branch = "master" - digest = "1:ec76a40fbfda0c329ee58f4e3b14b4279a939efce89eca020e934e2e5234eddd" name = "golang.org/x/sys" packages = [ "unix", - "windows", + "windows" ] - pruneopts = "NUT" revision = "98c5dad5d1a0e8a73845ecc8897d0bd56586511d" [[projects]] - digest = "1:8029e9743749d4be5bc9f7d42ea1659471767860f0cdc34d37c3111bd308a295" name = "golang.org/x/text" packages = [ "internal/gen", @@ -219,28 +193,24 @@ "internal/ucd", "transform", "unicode/cldr", - "unicode/norm", + "unicode/norm" ] - pruneopts = "NUT" revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" version = "v0.3.0" [[projects]] - digest = "1:47a697b155f5214ff14e68e39ce9c2e8d93e1fb035ae5ba7e247d044e0ce64e3" name = "gopkg.in/src-d/go-billy.v4" packages = [ ".", "helper/chroot", "helper/polyfill", "osfs", - "util", + "util" ] - pruneopts = "NUT" revision = "83cf655d40b15b427014d7875d10850f96edba14" version = "v4.2.0" [[projects]] - digest = "1:e66078da2bd6e53c72518d7f6ae0c3c8c7f34c0df12c39435ce34a6bce165525" name = "gopkg.in/src-d/go-git.v4" packages = [ ".", @@ -282,32 +252,19 @@ "utils/merkletrie/filesystem", "utils/merkletrie/index", "utils/merkletrie/internal/frame", - "utils/merkletrie/noder", + "utils/merkletrie/noder" ] - pruneopts = "NUT" revision = "43d17e14b714665ab5bc2ecc220b6740779d733f" [[projects]] - digest = "1:b233ad4ec87ac916e7bf5e678e98a2cb9e8b52f6de6ad3e11834fc7a71b8e3bf" name = "gopkg.in/warnings.v0" packages = ["."] - pruneopts = "NUT" revision = "ec4a0fea49c7b46c2aeb0b51aac55779c607e52b" version = "v0.1.2" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - input-imports = [ - "github.com/Sirupsen/logrus", - "github.com/davecgh/go-spew/spew", - "github.com/fatih/color", - "github.com/golang-collections/collections/stack", - "github.com/jesseduffield/gocui", - "github.com/mgutz/str", - "github.com/tcnksm/go-gitconfig", - "gopkg.in/src-d/go-git.v4", - "gopkg.in/src-d/go-git.v4/plumbing", - ] + inputs-digest = "3f40b7e57ce53b6c2b95ff995adab776197c0e110228dc1befef0d14dcefd229" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index ea5472df0..1f0b03cee 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -43,4 +43,4 @@ [[constraint]] branch = "master" - name = "https://github.com/spkg/bom" + name = "github.com/spkg/bom" diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index 3f6f1ac4d..c13ac24a7 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -192,7 +192,7 @@ func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) error { return nil } v.Clear() - fmt.Fprint(v, bom.Clean(s)) + fmt.Fprint(v, bom.Clean([]byte(s))) v.Wrap = true return nil }) diff --git a/test/repos/bom.sh b/test/repos/bom.sh index f198e8c29..9599f80e6 100644 --- a/test/repos/bom.sh +++ b/test/repos/bom.sh @@ -3,7 +3,8 @@ set -ex; rm -rf repo; mkdir repo; cd repo git init -cat <> bomtest.txt A,B,C,D,E +cat <> bomtest.txt +A,B,C,D,E F,G,H,I,J K,L,M,N,O P,Q,R,S,T diff --git a/vendor/github.com/spkg/bom/LICENSE.md b/vendor/github.com/spkg/bom/LICENSE.md new file mode 100644 index 000000000..931b189e4 --- /dev/null +++ b/vendor/github.com/spkg/bom/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 John Jeffery + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/spkg/bom/bom.go b/vendor/github.com/spkg/bom/bom.go new file mode 100644 index 000000000..93b811c6d --- /dev/null +++ b/vendor/github.com/spkg/bom/bom.go @@ -0,0 +1,39 @@ +// Package bom is used to clean up UTF-8 Byte Order Marks. +package bom + +import ( + "bufio" + "io" +) + +const ( + bom0 = 0xef + bom1 = 0xbb + bom2 = 0xbf +) + +// Clean returns b with the 3 byte BOM stripped off the front if it is present. +// If the BOM is not present, then b is returned. +func Clean(b []byte) []byte { + if len(b) >= 3 && + b[0] == bom0 && + b[1] == bom1 && + b[2] == bom2 { + return b[3:] + } + return b +} + +// NewReader returns an io.Reader that will skip over initial UTF-8 byte order marks. +func NewReader(r io.Reader) io.Reader { + buf := bufio.NewReader(r) + b, err := buf.Peek(3) + if err != nil { + // not enough bytes + return buf + } + if b[0] == bom0 && b[1] == bom1 && b[2] == bom2 { + discardBytes(buf, 3) + } + return buf +} diff --git a/vendor/github.com/spkg/bom/discard_go14.go b/vendor/github.com/spkg/bom/discard_go14.go new file mode 100644 index 000000000..782cd0624 --- /dev/null +++ b/vendor/github.com/spkg/bom/discard_go14.go @@ -0,0 +1,12 @@ +// +build !go1.5 + +package bom + +import "bufio" + +func discardBytes(buf *bufio.Reader, n int) { + // cannot use the buf.Discard method as it was introduced in Go 1.5 + for i := 0; i < n; i++ { + buf.ReadByte() + } +} diff --git a/vendor/github.com/spkg/bom/discard_go15.go b/vendor/github.com/spkg/bom/discard_go15.go new file mode 100644 index 000000000..2d17d5c5e --- /dev/null +++ b/vendor/github.com/spkg/bom/discard_go15.go @@ -0,0 +1,10 @@ +// +build go1.5 + +package bom + +import "bufio" + +func discardBytes(buf *bufio.Reader, n int) { + // the Discard method was introduced in Go 1.5 + buf.Discard(n) +} From 018b43163ced1646f45eae7ad0438800e6fbe489 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Sat, 18 Aug 2018 02:20:10 -0400 Subject: [PATCH 04/41] synchronize deps --- Gopkg.lock | 136 +++++++++++++++++------------------------------------ 1 file changed, 44 insertions(+), 92 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 17bc8748c..f13823275 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -9,14 +9,11 @@ [[projects]] branch = "master" - digest = "1:cd7ba2b29e93e2a8384e813dfc80ebb0f85d9214762e6ca89bb55a58092eab87" name = "github.com/cloudfoundry/jibber_jabber" packages = ["."] - pruneopts = "NUT" revision = "bcc4c8345a21301bf47c032ff42dd1aae2fe3027" [[projects]] - digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" name = "github.com/davecgh/go-spew" packages = ["spew"] revision = "346938d642f2ec3594ed81d874461961cd0faa76" @@ -42,10 +39,8 @@ version = "v1.7.0" [[projects]] - digest = "1:1b91ae0dc69a41d4c2ed23ea5cffb721ea63f5037ca4b81e6d6771fbb8f45129" name = "github.com/fsnotify/fsnotify" packages = ["."] - pruneopts = "NUT" revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" version = "v1.4.7" @@ -57,7 +52,6 @@ [[projects]] branch = "master" - digest = "1:11c6c696067d3127ecf332b10f89394d386d9083f82baf71f40f2da31841a009" name = "github.com/hashicorp/hcl" packages = [ ".", @@ -69,14 +63,12 @@ "hcl/token", "json/parser", "json/scanner", - "json/token", + "json/token" ] - pruneopts = "NUT" revision = "ef8a98b0bbce4a65b5aa4c368430a80ddc533168" [[projects]] branch = "master" - digest = "1:62fe3a7ea2050ecbd753a71889026f83d73329337ada66325cbafd5dea5f713d" name = "github.com/jbenet/go-context" packages = ["io"] revision = "d14ea06fba99483203c19d92cfcd13ebe73135f4" @@ -95,10 +87,11 @@ "pkg/config", "pkg/git", "pkg/gui", + "pkg/i18n", "pkg/utils" ] - revision = "db140842f3c10921153b3e19e66dd72b39fa00f8" - version = "v0.1.61" + revision = "3f5c1a4243f350390f6ff9553da1c84745fc2bd7" + version = "v0.1.66" [[projects]] name = "github.com/kevinburke/ssh_config" @@ -107,15 +100,12 @@ version = "0.4" [[projects]] - digest = "1:d244f8666a838fe6ad70ec8fe77f50ebc29fdc3331a2729ba5886bef8435d10d" name = "github.com/magiconair/properties" packages = ["."] - pruneopts = "NUT" revision = "c2353362d570a7bfa228149c62842019201cfb71" version = "v1.8.0" [[projects]] - digest = "1:08c231ec84231a7e23d67e4b58f975e1423695a32467a362ee55a803f9de8061" name = "github.com/mattn/go-colorable" packages = ["."] revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" @@ -147,21 +137,17 @@ [[projects]] branch = "master" - digest = "1:5fe20cfe4ef484c237cec9f947b2a6fa90bad4b8610fd014f0e4211e13d82d5d" name = "github.com/mitchellh/mapstructure" packages = ["."] - pruneopts = "NUT" revision = "f15292f7a699fcc1a38a80977f80a046874ba8ac" [[projects]] - digest = "1:2c34c77bf3ec848da26e48af58fc511ed52750961fa848399d122882b8890928" name = "github.com/nicksnyder/go-i18n" packages = [ "v2/i18n", "v2/internal", - "v2/internal/plural", + "v2/internal/plural" ] - pruneopts = "NUT" revision = "a16b91a3ba80db3a2301c70d1d302d42251c9079" version = "v2.0.0-beta.5" @@ -178,20 +164,55 @@ version = "v0.2.0" [[projects]] - digest = "1:51ea800cff51752ff68e12e04106f5887b4daec6f9356721238c28019f0b42db" name = "github.com/pelletier/go-toml" packages = ["."] - pruneopts = "NUT" revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" version = "v1.2.0" [[projects]] - digest = "1:d917313f309bda80d27274d53985bc65651f81a5b66b820749ac7f8ef061fd04" name = "github.com/sergi/go-diff" packages = ["diffmatchpatch"] revision = "1744e2970ca51c86172c8190fadad617561ed6e7" version = "v1.0.0" +[[projects]] + name = "github.com/shibukawa/configdir" + packages = ["."] + revision = "e180dbdc8da04c4fa04272e875ce64949f38bd3e" + +[[projects]] + name = "github.com/spf13/afero" + packages = [ + ".", + "mem" + ] + revision = "787d034dfe70e44075ccc060d346146ef53270ad" + version = "v1.1.1" + +[[projects]] + name = "github.com/spf13/cast" + packages = ["."] + revision = "8965335b8c7107321228e3e3702cab9832751bac" + version = "v1.2.0" + +[[projects]] + branch = "master" + name = "github.com/spf13/jwalterweatherman" + packages = ["."] + revision = "14d3d4c518341bea657dd8a226f5121c0ff8c9f2" + +[[projects]] + name = "github.com/spf13/pflag" + packages = ["."] + revision = "9a97c102cda95a86cec2345a6f09f55a939babf5" + version = "v1.0.2" + +[[projects]] + name = "github.com/spf13/viper" + packages = ["."] + revision = "907c19d40d9a6c9bb55f040ff4ae45271a4754b9" + version = "v1.1.0" + [[projects]] branch = "master" name = "github.com/spkg/bom" @@ -199,57 +220,6 @@ revision = "59b7046e48ad6bac800c5e1dd5142282cbfcf154" [[projects]] - digest = "1:41618aee8828e62dfe62d44f579c06892d0e98907d1c6d5bcd83bfe8536ec5a3" - name = "github.com/shibukawa/configdir" - packages = ["."] - pruneopts = "NUT" - revision = "e180dbdc8da04c4fa04272e875ce64949f38bd3e" - -[[projects]] - digest = "1:330e9062b308ac597e28485699c02223bd052437a6eed32a173c9227dcb9d95a" - name = "github.com/spf13/afero" - packages = [ - ".", - "mem", - ] - pruneopts = "NUT" - revision = "787d034dfe70e44075ccc060d346146ef53270ad" - version = "v1.1.1" - -[[projects]] - digest = "1:3fa7947ca83b98ae553590d993886e845a4bff19b7b007e869c6e0dd3b9da9cd" - name = "github.com/spf13/cast" - packages = ["."] - pruneopts = "NUT" - revision = "8965335b8c7107321228e3e3702cab9832751bac" - version = "v1.2.0" - -[[projects]] - branch = "master" - digest = "1:f29f83301ed096daed24a90f4af591b7560cb14b9cc3e1827abbf04db7269ab5" - name = "github.com/spf13/jwalterweatherman" - packages = ["."] - pruneopts = "NUT" - revision = "14d3d4c518341bea657dd8a226f5121c0ff8c9f2" - -[[projects]] - digest = "1:e3707aeaccd2adc89eba6c062fec72116fe1fc1ba71097da85b4d8ae1668a675" - name = "github.com/spf13/pflag" - packages = ["."] - pruneopts = "NUT" - revision = "9a97c102cda95a86cec2345a6f09f55a939babf5" - version = "v1.0.2" - -[[projects]] - digest = "1:454979540e2a1582f375a17c106cf4e11e3bcac4baffb4af23e515c87f87de13" - name = "github.com/spf13/viper" - packages = ["."] - pruneopts = "NUT" - revision = "907c19d40d9a6c9bb55f040ff4ae45271a4754b9" - version = "v1.1.0" - -[[projects]] - digest = "1:ccca1dcd18bc54e23b517a3c5babeff2e3924a7d8fc1932162225876cfe4bfb0" name = "github.com/src-d/gcfg" packages = [ ".", @@ -312,7 +282,6 @@ revision = "98c5dad5d1a0e8a73845ecc8897d0bd56586511d" [[projects]] - digest = "1:a95288ef1ef4dfad6cba7fe30843e1683f71bc28c912ca1ba3f6a539d44db739" name = "golang.org/x/text" packages = [ "internal/gen", @@ -392,31 +361,14 @@ version = "v0.1.2" [[projects]] - digest = "1:7c95b35057a0ff2e19f707173cc1a947fa43a6eb5c4d300d196ece0334046082" name = "gopkg.in/yaml.v2" packages = ["."] - pruneopts = "NUT" revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" version = "v2.2.1" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - input-imports = [ - "github.com/Sirupsen/logrus", - "github.com/cloudfoundry/jibber_jabber", - "github.com/davecgh/go-spew/spew", - "github.com/fatih/color", - "github.com/golang-collections/collections/stack", - "github.com/jesseduffield/gocui", - "github.com/mgutz/str", - "github.com/nicksnyder/go-i18n/v2/i18n", - "github.com/shibukawa/configdir", - "github.com/spf13/viper", - "github.com/tcnksm/go-gitconfig", - "golang.org/x/text/language", - "gopkg.in/src-d/go-git.v4", - "gopkg.in/src-d/go-git.v4/plumbing", - ] + inputs-digest = "5f2c359c480939c540907b265eb58d98dd1bb892e44b21e93cba861d79100203" solver-name = "gps-cdcl" solver-version = 1 From cdc6d45fa49097ccae25ccdf55512387f9f79ac9 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Sun, 19 Aug 2018 02:19:19 -0400 Subject: [PATCH 05/41] view_helpers.go: replace \r with \r\n --- pkg/gui/view_helpers.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index b870508b1..f6b567911 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -218,7 +218,9 @@ func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) error { return nil } v.Clear() - fmt.Fprint(v, bom.Clean([]byte(s))) + output := string(bom.Clean([]byte(s))) + strings.Replace(output, "\r", "\r\n", -1) + fmt.Fprint(v, output) v.Wrap = true return nil }) From b46d174f706a5a66307111a55eabf1b64dd39c12 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Sun, 19 Aug 2018 02:21:33 -0400 Subject: [PATCH 06/41] view_helpers.go: don't ignore return value --- pkg/gui/view_helpers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index f6b567911..5a46fc383 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -219,7 +219,7 @@ func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) error { } v.Clear() output := string(bom.Clean([]byte(s))) - strings.Replace(output, "\r", "\r\n", -1) + output = strings.Replace(output, "\r", "\r\n", -1) fmt.Fprint(v, output) v.Wrap = true return nil From cea736e6e92bb0c37b61af15da9c261b79eb3c9b Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Sun, 19 Aug 2018 07:20:50 -0400 Subject: [PATCH 07/41] Factor out into NormalizeLinefeeds; add tests --- pkg/gui/view_helpers.go | 4 ++-- pkg/utils/utils.go | 6 ++++++ pkg/utils/utils_test.go | 34 ++++++++++++++++++++++++++++++++++ test/repos/bom.sh | 12 ++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 pkg/utils/utils_test.go diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index 5a46fc383..c99609e3a 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -7,6 +7,7 @@ import ( "time" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/utils" "github.com/spkg/bom" ) @@ -218,8 +219,7 @@ func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) error { return nil } v.Clear() - output := string(bom.Clean([]byte(s))) - output = strings.Replace(output, "\r", "\r\n", -1) + output := utils.NormalizeLinefeeds(string(bom.Clean([]byte(s)))) fmt.Fprint(v, output) v.Wrap = true return nil diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 68438246a..d53ddc6dd 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -63,3 +63,9 @@ func TrimTrailingNewline(str string) string { } return str } + +func NormalizeLinefeeds(str string) string { + str = strings.Replace(str, "\r\n", "\n", -1) + str = strings.Replace(str, "\r", "\n", -1) + return str +} diff --git a/pkg/utils/utils_test.go b/pkg/utils/utils_test.go new file mode 100644 index 000000000..3a9f6817b --- /dev/null +++ b/pkg/utils/utils_test.go @@ -0,0 +1,34 @@ +package utils + +import "testing" + +var testCases = []struct { + Input []byte + Expected []byte +}{ + { + // \r\n + Input: []byte{97, 115, 100, 102, 13, 10}, + Expected: []byte{97, 115, 100, 102, 10}, + }, + { + // \r + Input: []byte{97, 115, 100, 102, 13}, + Expected: []byte{97, 115, 100, 102, 10}, + }, + { + // \n + Input: []byte{97, 115, 100, 102, 10}, + Expected: []byte{97, 115, 100, 102, 10}, + }, + +} + +func TestNormalizeLinefeeds(t *testing.T) { + + for _, tc := range testCases { + if NormalizeLinefeeds(string(tc.Input)) != string(tc.Expected) { + t.Error("Error") + } + } +} diff --git a/test/repos/bom.sh b/test/repos/bom.sh index 9599f80e6..e8642491a 100644 --- a/test/repos/bom.sh +++ b/test/repos/bom.sh @@ -3,6 +3,18 @@ set -ex; rm -rf repo; mkdir repo; cd repo git init +cat <> windowslf.txt +asdf +asdf +EOT + +unix2dos windowslf.txt + +cat <> linuxlf.txt +asdf +asdf +EOT + cat <> bomtest.txt A,B,C,D,E F,G,H,I,J From 766197de9dd19fe743b21efe751c52db3e99aa3e Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Sun, 19 Aug 2018 08:48:03 -0400 Subject: [PATCH 08/41] NormalizeLinefeeds removes rather than converts Window/Mac style lf's --- pkg/gui/view_helpers.go | 3 ++- pkg/utils/utils.go | 5 +++-- pkg/utils/utils_test.go | 20 ++++++++++---------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index c99609e3a..d6d10c780 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -219,7 +219,8 @@ func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) error { return nil } v.Clear() - output := utils.NormalizeLinefeeds(string(bom.Clean([]byte(s)))) + output := string(bom.Clean([]byte(s))) + output = utils.NormalizeLinefeeds(s) fmt.Fprint(v, output) v.Wrap = true return nil diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 37e76d78a..f56ea8884 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -64,9 +64,10 @@ func TrimTrailingNewline(str string) string { return str } +// NormalizeLinefeeds - Removes all Windows and Mac style line feeds func NormalizeLinefeeds(str string) string { - str = strings.Replace(str, "\r\n", "\n", -1) - str = strings.Replace(str, "\r", "\n", -1) + str = strings.Replace(str, "\r\n", "", -1) + str = strings.Replace(str, "\r", "", -1) return str } diff --git a/pkg/utils/utils_test.go b/pkg/utils/utils_test.go index 3a9f6817b..22a9c82dc 100644 --- a/pkg/utils/utils_test.go +++ b/pkg/utils/utils_test.go @@ -3,32 +3,32 @@ package utils import "testing" var testCases = []struct { - Input []byte + Input []byte Expected []byte }{ { // \r\n - Input: []byte{97, 115, 100, 102, 13, 10}, - Expected: []byte{97, 115, 100, 102, 10}, + Input: []byte{97, 115, 100, 102, 13, 10}, + Expected: []byte{97, 115, 100, 102}, }, { // \r - Input: []byte{97, 115, 100, 102, 13}, - Expected: []byte{97, 115, 100, 102, 10}, + Input: []byte{97, 115, 100, 102, 13}, + Expected: []byte{97, 115, 100, 102}, }, { // \n - Input: []byte{97, 115, 100, 102, 10}, + Input: []byte{97, 115, 100, 102, 10}, Expected: []byte{97, 115, 100, 102, 10}, }, - } func TestNormalizeLinefeeds(t *testing.T) { - for _, tc := range testCases { - if NormalizeLinefeeds(string(tc.Input)) != string(tc.Expected) { - t.Error("Error") + input := NormalizeLinefeeds(string(tc.Input)) + expected := string(tc.Expected) + if input != expected { + t.Error("Expected " + expected + ", got " + input) } } } From e8b12a086c94f29b8fdcd1b2197b332834e13ca6 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Sun, 19 Aug 2018 08:52:08 -0400 Subject: [PATCH 09/41] Fix ineffectual assignment --- pkg/gui/view_helpers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index d6d10c780..dc669146b 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -220,7 +220,7 @@ func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) error { } v.Clear() output := string(bom.Clean([]byte(s))) - output = utils.NormalizeLinefeeds(s) + output = utils.NormalizeLinefeeds(output) fmt.Fprint(v, output) v.Wrap = true return nil From fbfa48f0fcd2b537c98daa79352a0e224a480937 Mon Sep 17 00:00:00 2001 From: Anthony HAMON Date: Sat, 18 Aug 2018 09:27:47 +0200 Subject: [PATCH 10/41] update circleci * define release worflow when a tag is created * add dep install * run tests with coverage * add goreleaser --- .circleci/config.yml | 51 +++++++++++++++++++++++++++++--------------- .gitignore | 3 ++- test.sh | 14 ++++++++++++ 3 files changed, 50 insertions(+), 18 deletions(-) create mode 100755 test.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index c5f520b70..939adc60e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,26 +1,43 @@ -# Golang CircleCI 2.0 configuration file -# -# Check https://circleci.com/docs/2.0/language-go/ for more details version: 2 jobs: build: docker: - # specify the version - - image: circleci/golang:1.9 + - image: circleci/golang:1.10 - # Specify service dependencies here if necessary - # CircleCI maintains a library of pre-built images - # documented at https://circleci.com/docs/2.0/circleci-images/ - # - image: circleci/postgres:9.4 - - #### TEMPLATE_NOTE: go expects specific checkout path representing url - #### expecting it in the form of - #### /go/src/github.com/circleci/go-tool - #### /go/src/bitbucket.org/circleci/go-tool working_directory: /go/src/github.com/jesseduffield/lazygit steps: - checkout + - run: + name: Run tests + command: | + ./test.sh + - run: + name: Push on codecov result + command: | + bash <(curl -s https://codecov.io/bash) - # specify any bash command here prefixed with `run: ` - - run: go test -v ./... - - run: bash <(curl -s https://codecov.io/bash) + release: + docker: + - image: circleci/golang:1.10 + working_directory: /go/src/github.com/jesseduffield/lazygit + steps: + - checkout + - run: + name: Run gorelease + command: | + curl -sL https://git.io/goreleaser | bash + +workflows: + version: 2 + build: + jobs: + - build + release: + jobs: + - release: + context: org-global + filters: + tags: + only: /v[0-9]+(\.[0-9]+)*/ + branches: + ignore: /.*/ diff --git a/.gitignore b/.gitignore index 304a2356f..f759e8a06 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ TODO.md # Tests test/repos/repo +coverage.txt # Binaries -lazygit \ No newline at end of file +lazygit diff --git a/test.sh b/test.sh new file mode 100755 index 000000000..a92243cf7 --- /dev/null +++ b/test.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $( find ./* -maxdepth 10 ! -path "./vendor*" ! -path "./.git*" -type d); do + if ls $d/*.go &> /dev/null; then + go test -v -race -coverprofile=profile.out -covermode=atomic $d + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi + fi +done From bbf7a9d790a114b2a1de0b1b0992a72049ecd2f3 Mon Sep 17 00:00:00 2001 From: Anthony HAMON Date: Sat, 18 Aug 2018 09:30:26 +0200 Subject: [PATCH 11/41] add various badges * golangci (https://golangci.com) * circleci (https://circleci.com/) * codecov.io (https://codecov.io) * godoc * tag release --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6b85ffbe1..28fe9c399 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# lazygit [![Go Report Card](https://goreportcard.com/badge/github.com/jesseduffield/lazygit)](https://goreportcard.com/report/github.com/jesseduffield/lazygit) +# lazygit [![CircleCI](https://circleci.com/gh/jesseduffield/lazygit.svg?style=svg)](https://circleci.com/gh/jesseduffield/lazygit) [![codecov](https://codecov.io/gh/jesseduffield/lazygit/branch/master/graph/badge.svg)](https://codecov.io/gh/jesseduffield/lazygit) [![Go Report Card](https://goreportcard.com/badge/github.com/jesseduffield/lazygit)](https://goreportcard.com/report/github.com/jesseduffield/lazygit) [![GolangCI](https://golangci.com/badges/github.com/jesseduffield/lazygit.svg)](https://golangci.com) [![GoDoc](https://godoc.org/github.com/jesseduffield/lazygit?status.svg)](http://godoc.org/github.com/jesseduffield/lazygit) [![GitHub tag](https://img.shields.io/github/tag/jesseduffield/lazygit.svg)]() A simple terminal UI for git commands, written in Go with the [gocui](https://github.com/jroimartin/gocui "gocui") library. From bb86a3ff7c0b0436e06f5b84cf5abf3a707cf22d Mon Sep 17 00:00:00 2001 From: Anthony HAMON Date: Sun, 19 Aug 2018 10:43:45 +0200 Subject: [PATCH 12/41] update github template --- .github/ISSUE_TEMPLATE/bug_report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 1a96635a3..b10cb5f37 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,6 +23,7 @@ If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - OS: [e.g. Windows] - Lazygit Version [e.g. v0.1.45] + - The last commit id if you built project from sources (run : ```git-rev parse HEAD```) **Additional context** Add any other context about the problem here. From 108815c790bc92e96ddf53ec3cf5b5afc71fd2b4 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Sun, 19 Aug 2018 23:31:26 -0400 Subject: [PATCH 13/41] Add missing brace --- pkg/utils/utils_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/utils/utils_test.go b/pkg/utils/utils_test.go index ffc753fd4..047ed9fb9 100644 --- a/pkg/utils/utils_test.go +++ b/pkg/utils/utils_test.go @@ -110,4 +110,5 @@ func TestNormalizeLinefeeds(t *testing.T) { if input != expected { t.Error("Expected " + expected + ", got " + input) } + } } From f1a4a7e1ff6499adf512ecd1b623f77a61ad8d5f Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Sun, 19 Aug 2018 23:34:58 -0400 Subject: [PATCH 14/41] synchronize deps --- Gopkg.lock | 38 +------------------------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index c94fb69ad..6efc5a34e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -79,20 +79,6 @@ packages = ["."] revision = "432b7f6215f81ef1aaa1b2d9b69887822923cf79" -[[projects]] - name = "github.com/jesseduffield/lazygit" - packages = [ - "pkg/app", - "pkg/commands", - "pkg/config", - "pkg/git", - "pkg/gui", - "pkg/i18n", - "pkg/utils" - ] - revision = "3f5c1a4243f350390f6ff9553da1c84745fc2bd7" - version = "v0.1.66" - [[projects]] name = "github.com/kevinburke/ssh_config" packages = ["."] @@ -170,15 +156,12 @@ version = "v1.2.0" [[projects]] - digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" name = "github.com/pmezard/go-difflib" packages = ["difflib"] - pruneopts = "NUT" revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" [[projects]] - digest = "1:d917313f309bda80d27274d53985bc65651f81a5b66b820749ac7f8ef061fd04" name = "github.com/sergi/go-diff" packages = ["diffmatchpatch"] revision = "1744e2970ca51c86172c8190fadad617561ed6e7" @@ -240,15 +223,12 @@ version = "v1.3.0" [[projects]] - digest = "1:bacb8b590716ab7c33f2277240972c9582d389593ee8d66fc10074e0508b8126" name = "github.com/stretchr/testify" packages = ["assert"] - pruneopts = "NUT" revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686" version = "v1.2.2" [[projects]] - digest = "1:cd5ffc5bda4e0296ab3e4de90dbb415259c78e45e7fab13694b14cde8ab74541" name = "github.com/tcnksm/go-gitconfig" packages = ["."] revision = "d154598bacbf4501c095a309753c5d4af66caa81" @@ -387,22 +367,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - input-imports = [ - "github.com/Sirupsen/logrus", - "github.com/cloudfoundry/jibber_jabber", - "github.com/davecgh/go-spew/spew", - "github.com/fatih/color", - "github.com/golang-collections/collections/stack", - "github.com/jesseduffield/gocui", - "github.com/mgutz/str", - "github.com/nicksnyder/go-i18n/v2/i18n", - "github.com/shibukawa/configdir", - "github.com/spf13/viper", - "github.com/stretchr/testify/assert", - "github.com/tcnksm/go-gitconfig", - "golang.org/x/text/language", - "gopkg.in/src-d/go-git.v4", - "gopkg.in/src-d/go-git.v4/plumbing", - ] + inputs-digest = "52d66c52c1720308d826a43918b77f13a47f5cc782e315cf84a8a7f7aa6baa73" solver-name = "gps-cdcl" solver-version = 1 From 5dd049eb821f25573ba63b70dc7c08587444f5f8 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Sun, 19 Aug 2018 23:39:57 -0400 Subject: [PATCH 15/41] Convert test to use new library --- pkg/utils/utils_test.go | 51 +++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/pkg/utils/utils_test.go b/pkg/utils/utils_test.go index 047ed9fb9..2d5a25fcd 100644 --- a/pkg/utils/utils_test.go +++ b/pkg/utils/utils_test.go @@ -82,33 +82,30 @@ func TestTrimTrailingNewline(t *testing.T) { } } -var testCases = []struct { - Input []byte - Expected []byte -}{ - { - // \r\n - Input: []byte{97, 115, 100, 102, 13, 10}, - Expected: []byte{97, 115, 100, 102}, - }, - { - // \r - Input: []byte{97, 115, 100, 102, 13}, - Expected: []byte{97, 115, 100, 102}, - }, - { - // \n - Input: []byte{97, 115, 100, 102, 10}, - Expected: []byte{97, 115, 100, 102, 10}, - }, -} - func TestNormalizeLinefeeds(t *testing.T) { - for _, tc := range testCases { - input := NormalizeLinefeeds(string(tc.Input)) - expected := string(tc.Expected) - if input != expected { - t.Error("Expected " + expected + ", got " + input) - } + type scenario struct { + byteArray []byte + expected []byte + } + var scenarios = []scenario{ + { + // \r\n + []byte{97, 115, 100, 102, 13, 10}, + []byte{97, 115, 100, 102}, + }, + { + // \r + []byte{97, 115, 100, 102, 13}, + []byte{97, 115, 100, 102}, + }, + { + // \n + []byte{97, 115, 100, 102, 10}, + []byte{97, 115, 100, 102, 10}, + }, + } + + for _, s := range scenarios { + assert.EqualValues(t, string(s.expected), NormalizeLinefeeds(string(s.byteArray))) } } From 8e3df6b981c8d501fcaecf6689aa7f78c25920fa Mon Sep 17 00:00:00 2001 From: Rob Bast Date: Wed, 15 Aug 2018 15:02:01 +0200 Subject: [PATCH 16/41] add option to force delete given branch --- docs/Keybindings.md | 1 + pkg/commands/git.go | 10 ++++++++-- pkg/gui/branches_panel.go | 13 +++++++++++-- pkg/gui/keybindings.go | 1 + pkg/i18n/dutch.go | 3 +++ pkg/i18n/english.go | 3 +++ 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/docs/Keybindings.md b/docs/Keybindings.md index 2a1b1817f..37fb523a2 100644 --- a/docs/Keybindings.md +++ b/docs/Keybindings.md @@ -44,6 +44,7 @@ c: checkout by name n: new branch d: delete branch + D: force delete branch ## Commits Panel: diff --git a/pkg/commands/git.go b/pkg/commands/git.go index 557e6a8c0..45219b5c0 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -223,8 +223,14 @@ func (c *GitCommand) NewBranch(name string) error { } // DeleteBranch delete branch -func (c *GitCommand) DeleteBranch(branch string) error { - return c.OSCommand.RunCommand("git branch -d " + branch) +func (c *GitCommand) DeleteBranch(branch string, force bool) error { + var command string + if force { + command = "git branch -D " + } else { + command = "git branch -d " + } + return c.OSCommand.RunCommand(command + branch) } // ListStash list stash diff --git a/pkg/gui/branches_panel.go b/pkg/gui/branches_panel.go index 67e0ceb07..886b4c493 100644 --- a/pkg/gui/branches_panel.go +++ b/pkg/gui/branches_panel.go @@ -62,20 +62,28 @@ func (gui *Gui) handleNewBranch(g *gocui.Gui, v *gocui.View) error { } func (gui *Gui) handleDeleteBranch(g *gocui.Gui, v *gocui.View) error { + gui.deleteBranch(g, v, false) +} + +func (gui *Gui) handleForceDeleteBranch(g *gocui.Gui, v *gocui.View) error { + gui.deleteBranch(g, v, true) +} + +func (gui *Gui) deleteBranch(g *gocui.Gui, v *gocui.View, force bool) error { checkedOutBranch := gui.State.Branches[0] selectedBranch := gui.getSelectedBranch(v) if checkedOutBranch.Name == selectedBranch.Name { return gui.createErrorPanel(g, gui.Tr.SLocalize("CantDeleteCheckOutBranch")) } + title := gui.Tr.SLocalize("DeleteBranch") message := gui.Tr.TemplateLocalize( "DeleteBranchMessage", Teml{ "selectedBranchName": selectedBranch.Name, }, ) - title := gui.Tr.SLocalize("DeleteBranch") return gui.createConfirmationPanel(g, v, title, message, func(g *gocui.Gui, v *gocui.View) error { - if err := gui.GitCommand.DeleteBranch(selectedBranch.Name); err != nil { + if err := gui.GitCommand.DeleteBranch(selectedBranch.Name, force); err != nil { return gui.createErrorPanel(g, err.Error()) } return gui.refreshSidePanels(g) @@ -108,6 +116,7 @@ func (gui *Gui) renderBranchesOptions(g *gocui.Gui) error { "c": gui.Tr.SLocalize("checkoutByName"), "n": gui.Tr.SLocalize("newBranch"), "d": gui.Tr.SLocalize("deleteBranch"), + "D": gui.Tr.SLocalize("forceDeleteBranch"), "← → ↑ ↓": gui.Tr.SLocalize("navigate"), }) } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index 68cccda6b..e0351b88e 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -57,6 +57,7 @@ func (gui *Gui) keybindings(g *gocui.Gui) error { {ViewName: "branches", Key: 'F', Modifier: gocui.ModNone, Handler: gui.handleForceCheckout}, {ViewName: "branches", Key: 'n', Modifier: gocui.ModNone, Handler: gui.handleNewBranch}, {ViewName: "branches", Key: 'd', Modifier: gocui.ModNone, Handler: gui.handleDeleteBranch}, + {ViewName: "branches", Key: 'D', Modifier: gocui.ModNone, Handler: gui.handleForceDeleteBranch}, {ViewName: "branches", Key: 'm', Modifier: gocui.ModNone, Handler: gui.handleMerge}, {ViewName: "commits", Key: 's', Modifier: gocui.ModNone, Handler: gui.handleCommitSquashDown}, {ViewName: "commits", Key: 'r', Modifier: gocui.ModNone, Handler: gui.handleRenameCommit}, diff --git a/pkg/i18n/dutch.go b/pkg/i18n/dutch.go index 60133e662..a02c7c4bc 100644 --- a/pkg/i18n/dutch.go +++ b/pkg/i18n/dutch.go @@ -151,6 +151,9 @@ func addDutch(i18nObject *i18n.Bundle) error { }, &i18n.Message{ ID: "deleteBranch", Other: "verwijder branch", + }, &i18n.Message{ + ID: "forceDeleteBranch", + Other: "verwijder branch (forceer)", }, &i18n.Message{ ID: "NoBranchesThisRepo", Other: "Geen branches voor deze repo", diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index bebe9b282..db51fcdc4 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -159,6 +159,9 @@ func addEnglish(i18nObject *i18n.Bundle) error { }, &i18n.Message{ ID: "deleteBranch", Other: "delete branch", + }, &i18n.Message{ + ID: "forceDeleteBranch", + Other: "delete branch (force)", }, &i18n.Message{ ID: "NoBranchesThisRepo", Other: "No branches for this repo", From 3c0fb9b32461ae2fe4e71eeeda95583bd64a812a Mon Sep 17 00:00:00 2001 From: Anthony HAMON Date: Mon, 20 Aug 2018 08:53:13 +0200 Subject: [PATCH 17/41] add tests to i18n package --- pkg/i18n/i18n_test.go | 86 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 pkg/i18n/i18n_test.go diff --git a/pkg/i18n/i18n_test.go b/pkg/i18n/i18n_test.go new file mode 100644 index 000000000..3fec62456 --- /dev/null +++ b/pkg/i18n/i18n_test.go @@ -0,0 +1,86 @@ +package i18n + +import ( + "os" + "testing" + + "github.com/nicksnyder/go-i18n/v2/i18n" + + "github.com/Sirupsen/logrus" + "github.com/stretchr/testify/assert" +) + +func TestNewLocalizer(t *testing.T) { + type scenario struct { + setup func() + test func(*Localizer, error) + teardown func() + } + + LCALL := os.Getenv("LC_ALL") + LANG := os.Getenv("LANG") + + scenarios := []scenario{ + { + func() { + os.Setenv("LC_ALL", "") + os.Setenv("LANG", "") + }, + func(l *Localizer, err error) { + assert.EqualValues(t, "C", l.GetLanguage()) + }, + func() { + os.Setenv("LC_ALL", LCALL) + os.Setenv("LANG", LANG) + }, + }, + { + func() { + os.Setenv("LC_ALL", "whatever") + os.Setenv("LANG", "whatever") + }, + func(l *Localizer, err error) { + assert.NoError(t, err) + + assert.EqualValues(t, "whatever", l.GetLanguage()) + assert.Equal(t, "Diff", l.Localize(&i18n.LocalizeConfig{ + DefaultMessage: &i18n.Message{ + ID: "DiffTitle", + }, + })) + assert.Equal(t, "Diff", l.SLocalize("DiffTitle")) + assert.Equal(t, "Are you sure you want delete the branch test ?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) + }, + func() { + os.Setenv("LC_ALL", LCALL) + os.Setenv("LANG", LANG) + }, + }, + { + func() { + os.Setenv("LC_ALL", "nl") + }, + func(l *Localizer, err error) { + assert.NoError(t, err) + + assert.EqualValues(t, "nl", l.GetLanguage()) + assert.Equal(t, "Diff", l.Localize(&i18n.LocalizeConfig{ + DefaultMessage: &i18n.Message{ + ID: "DiffTitle", + }, + })) + assert.Equal(t, "Diff", l.SLocalize("DiffTitle")) + assert.Equal(t, "Weet je zeker dat je test branch wil verwijderen?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) + }, + func() { + os.Setenv("LC_ALL", LCALL) + }, + }, + } + + for _, s := range scenarios { + s.setup() + s.test(NewLocalizer(logrus.New())) + s.teardown() + } +} From 37029f7db3678f6659589e9ed983eea381e037bc Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Mon, 20 Aug 2018 20:52:32 +1000 Subject: [PATCH 18/41] support empty version string --- pkg/gui/gui.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 1e7b6156b..66777b3a6 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -141,14 +141,15 @@ func max(a, b int) int { func (gui *Gui) layout(g *gocui.Gui) error { g.Highlight = true width, height := g.Size() + version := gui.Config.GetVersion() leftSideWidth := width / 3 statusFilesBoundary := 2 filesBranchesBoundary := 2 * height / 5 // height - 20 commitsBranchesBoundary := 3 * height / 5 // height - 10 commitsStashBoundary := height - 5 // height - 5 + optionsVersionBoundary := width - max(len(version), 1) minimumHeight := 16 minimumWidth := 10 - version := gui.Config.GetVersion() panelSpacing := 1 if OverlappingEdges { @@ -227,7 +228,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { v.FgColor = gocui.ColorWhite } - if v, err := g.SetView("options", -1, optionsTop, width-len(version)-2, optionsTop+2, 0); err != nil { + if v, err := g.SetView("options", -1, optionsTop, optionsVersionBoundary-1, optionsTop+2, 0); err != nil { if err != gocui.ErrUnknownView { return err } @@ -249,8 +250,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { commitMessageView.Editable = true } } - - if v, err := g.SetView("version", width-len(version)-1, optionsTop, width, optionsTop+2, 0); err != nil { + if v, err := g.SetView("version", optionsVersionBoundary-1, optionsTop, width, optionsTop+2, 0); err != nil { if err != gocui.ErrUnknownView { return err } From 45fea837713e3f471813596209cd78398df115fc Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Mon, 20 Aug 2018 09:16:35 -0400 Subject: [PATCH 19/41] Convert \r\n to \n; don't depend on unix2dos --- pkg/utils/utils.go | 2 +- pkg/utils/utils_test.go | 7 ++++++- test/repos/bom.sh | 6 ++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index f56ea8884..511de1af1 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -66,7 +66,7 @@ func TrimTrailingNewline(str string) string { // NormalizeLinefeeds - Removes all Windows and Mac style line feeds func NormalizeLinefeeds(str string) string { - str = strings.Replace(str, "\r\n", "", -1) + str = strings.Replace(str, "\r\n", "\n", -1) str = strings.Replace(str, "\r", "", -1) return str } diff --git a/pkg/utils/utils_test.go b/pkg/utils/utils_test.go index 2d5a25fcd..46b264945 100644 --- a/pkg/utils/utils_test.go +++ b/pkg/utils/utils_test.go @@ -91,7 +91,12 @@ func TestNormalizeLinefeeds(t *testing.T) { { // \r\n []byte{97, 115, 100, 102, 13, 10}, - []byte{97, 115, 100, 102}, + []byte{97, 115, 100, 102, 10}, + }, + { + // bash\r\nblah + []byte{97, 115, 100, 102, 13, 10, 97, 115, 100, 102}, + []byte{97, 115, 100, 102, 10, 97, 115, 100, 102}, }, { // \r diff --git a/test/repos/bom.sh b/test/repos/bom.sh index e8642491a..190f501a1 100644 --- a/test/repos/bom.sh +++ b/test/repos/bom.sh @@ -4,12 +4,10 @@ set -ex; rm -rf repo; mkdir repo; cd repo git init cat <> windowslf.txt -asdf -asdf +asdf +asdf EOT -unix2dos windowslf.txt - cat <> linuxlf.txt asdf asdf From 483b4d939d334d87efefe7cc435a765194a41308 Mon Sep 17 00:00:00 2001 From: Dawid Dziurla Date: Mon, 20 Aug 2018 15:21:05 +0200 Subject: [PATCH 20/41] fix testPath for debian packaging --- pkg/test/test.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/test/test.go b/pkg/test/test.go index 7bdbd4c10..ff133a655 100644 --- a/pkg/test/test.go +++ b/pkg/test/test.go @@ -4,6 +4,7 @@ import ( "errors" "os" "os/exec" + "path/filepath" "github.com/jesseduffield/lazygit/pkg/utils" ) @@ -11,7 +12,14 @@ import ( // GenerateRepo generates a repo from test/repos and changes the directory to be // inside the newly made repo func GenerateRepo(filename string) error { - testPath := utils.GetProjectRoot() + "/test/repos/" + reposDir := "/test/repos/" + testPath := utils.GetProjectRoot() + reposDir + + // workaround for debian packaging + if _, err := os.Stat(testPath); os.IsNotExist(err) { + cwd, _ := os.Getwd() + testPath = filepath.Dir(filepath.Dir(cwd)) + reposDir + } if err := os.Chdir(testPath); err != nil { return err } From e4070ccb4f2de10f873561a0794bbae1a0513a29 Mon Sep 17 00:00:00 2001 From: Anthony HAMON Date: Mon, 20 Aug 2018 21:04:04 +0200 Subject: [PATCH 21/41] rewrite language detection, rewrite tests --- pkg/app/app.go | 5 +-- pkg/i18n/i18n.go | 53 ++++++++++++++++-------------- pkg/i18n/i18n_test.go | 75 ++++++++++++++++++++----------------------- 3 files changed, 65 insertions(+), 68 deletions(-) diff --git a/pkg/app/app.go b/pkg/app/app.go index aaa925e53..20a97276e 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -51,10 +51,7 @@ func NewApp(config config.AppConfigurer) (*App, error) { return app, err } - app.Tr, err = i18n.NewLocalizer(app.Log) - if err != nil { - return app, err - } + app.Tr = i18n.NewLocalizer(app.Log) app.GitCommand, err = commands.NewGitCommand(app.Log, app.OSCommand) if err != nil { diff --git a/pkg/i18n/i18n.go b/pkg/i18n/i18n.go index e209d55c5..e46cb3fcb 100644 --- a/pkg/i18n/i18n.go +++ b/pkg/i18n/i18n.go @@ -18,33 +18,12 @@ type Localizer struct { } // NewLocalizer creates a new Localizer -func NewLocalizer(log *logrus.Logger) (*Localizer, error) { +func NewLocalizer(log *logrus.Logger) *Localizer { + userLang := detectLanguage(jibber_jabber.DetectLanguage) - // detect the user's language - userLang, err := jibber_jabber.DetectLanguage() - if err != nil { - if err.Error() != "Could not detect Language" { - return nil, err - } - userLang = "C" - } log.Info("language: " + userLang) - // create a i18n bundle that can be used to add translations and other things - i18nBundle := &i18n.Bundle{DefaultLanguage: language.English} - - addBundles(log, i18nBundle) - - // return the new localizer that can be used to translate text - i18nLocalizer := i18n.NewLocalizer(i18nBundle, userLang) - - localizer := &Localizer{ - i18nLocalizer: i18nLocalizer, - language: userLang, - Log: log, - } - - return localizer, nil + return setupLocalizer(log, userLang) } // Localize handels the translations @@ -96,3 +75,29 @@ func addBundles(log *logrus.Logger, i18nBundle *i18n.Bundle) { } } + +// detectLanguage extracts user language from environment +func detectLanguage(langDetector func() (string, error)) string { + if userLang, err := langDetector(); err == nil { + return userLang + } + + return "C" +} + +// setupLocalizer creates a new localizer using given userLang +func setupLocalizer(log *logrus.Logger, userLang string) *Localizer { + // create a i18n bundle that can be used to add translations and other things + i18nBundle := &i18n.Bundle{DefaultLanguage: language.English} + + addBundles(log, i18nBundle) + + // return the new localizer that can be used to translate text + i18nLocalizer := i18n.NewLocalizer(i18nBundle, userLang) + + return &Localizer{ + i18nLocalizer: i18nLocalizer, + language: userLang, + Log: log, + } +} diff --git a/pkg/i18n/i18n_test.go b/pkg/i18n/i18n_test.go index 3fec62456..481a40863 100644 --- a/pkg/i18n/i18n_test.go +++ b/pkg/i18n/i18n_test.go @@ -1,7 +1,7 @@ package i18n import ( - "os" + "fmt" "testing" "github.com/nicksnyder/go-i18n/v2/i18n" @@ -11,38 +11,46 @@ import ( ) func TestNewLocalizer(t *testing.T) { - type scenario struct { - setup func() - test func(*Localizer, error) - teardown func() - } + assert.NotNil(t, NewLocalizer(logrus.New())) +} - LCALL := os.Getenv("LC_ALL") - LANG := os.Getenv("LANG") +func TestDetectLanguage(t *testing.T) { + type scenario struct { + langDetector func() (string, error) + expected string + } scenarios := []scenario{ { - func() { - os.Setenv("LC_ALL", "") - os.Setenv("LANG", "") - }, - func(l *Localizer, err error) { - assert.EqualValues(t, "C", l.GetLanguage()) - }, - func() { - os.Setenv("LC_ALL", LCALL) - os.Setenv("LANG", LANG) + func() (string, error) { + return "", fmt.Errorf("An error occurred") }, + "C", }, { - func() { - os.Setenv("LC_ALL", "whatever") - os.Setenv("LANG", "whatever") + func() (string, error) { + return "en", nil }, - func(l *Localizer, err error) { - assert.NoError(t, err) + "en", + }, + } - assert.EqualValues(t, "whatever", l.GetLanguage()) + for _, s := range scenarios { + assert.EqualValues(t, s.expected, detectLanguage(s.langDetector)) + } +} + +func TestLocalizer(t *testing.T) { + type scenario struct { + userLang string + test func(*Localizer) + } + + scenarios := []scenario{ + { + "C", + func(l *Localizer) { + assert.EqualValues(t, "C", l.GetLanguage()) assert.Equal(t, "Diff", l.Localize(&i18n.LocalizeConfig{ DefaultMessage: &i18n.Message{ ID: "DiffTitle", @@ -51,18 +59,10 @@ func TestNewLocalizer(t *testing.T) { assert.Equal(t, "Diff", l.SLocalize("DiffTitle")) assert.Equal(t, "Are you sure you want delete the branch test ?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) }, - func() { - os.Setenv("LC_ALL", LCALL) - os.Setenv("LANG", LANG) - }, }, { - func() { - os.Setenv("LC_ALL", "nl") - }, - func(l *Localizer, err error) { - assert.NoError(t, err) - + "nl", + func(l *Localizer) { assert.EqualValues(t, "nl", l.GetLanguage()) assert.Equal(t, "Diff", l.Localize(&i18n.LocalizeConfig{ DefaultMessage: &i18n.Message{ @@ -72,15 +72,10 @@ func TestNewLocalizer(t *testing.T) { assert.Equal(t, "Diff", l.SLocalize("DiffTitle")) assert.Equal(t, "Weet je zeker dat je test branch wil verwijderen?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) }, - func() { - os.Setenv("LC_ALL", LCALL) - }, }, } for _, s := range scenarios { - s.setup() - s.test(NewLocalizer(logrus.New())) - s.teardown() + s.test(setupLocalizer(logrus.New(), s.userLang)) } } From 4972a4c21828220c60b6ca2d62be43930a639884 Mon Sep 17 00:00:00 2001 From: Anthony HAMON Date: Mon, 20 Aug 2018 21:18:15 +0200 Subject: [PATCH 22/41] rewrite addBundles --- pkg/i18n/i18n.go | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/pkg/i18n/i18n.go b/pkg/i18n/i18n.go index e46cb3fcb..bb97cc9a0 100644 --- a/pkg/i18n/i18n.go +++ b/pkg/i18n/i18n.go @@ -61,19 +61,18 @@ func (l *Localizer) GetLanguage() string { // add translation file(s) func addBundles(log *logrus.Logger, i18nBundle *i18n.Bundle) { - err := addPolish(i18nBundle) - if err != nil { - log.Fatal(err) - } - err = addDutch(i18nBundle) - if err != nil { - log.Fatal(err) - } - err = addEnglish(i18nBundle) - if err != nil { - log.Fatal(err) + fs := []func(*i18n.Bundle) error{ + addPolish, + addDutch, + addEnglish, } + for _, f := range fs { + if err := f(i18nBundle); err != nil { + log.Fatal(err) + + } + } } // detectLanguage extracts user language from environment From d35eaa062b79f7954a3c34ba8dbda0db142693c5 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Tue, 21 Aug 2018 12:57:19 +1000 Subject: [PATCH 23/41] remove org-global context in circle ci config --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 939adc60e..0eef1a409 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -35,7 +35,6 @@ workflows: release: jobs: - release: - context: org-global filters: tags: only: /v[0-9]+(\.[0-9]+)*/ From 9b63887867220562fcef7a84c5e388c2e55da6a4 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Tue, 21 Aug 2018 13:27:27 +1000 Subject: [PATCH 24/41] add colored borders example image --- docs/resources/colored-border-example.png | Bin 0 -> 90126 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/resources/colored-border-example.png diff --git a/docs/resources/colored-border-example.png b/docs/resources/colored-border-example.png new file mode 100644 index 0000000000000000000000000000000000000000..06bb7bf8b82d8006703117c0ef48ad6b3841487b GIT binary patch literal 90126 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%0A*ITg4_7L}PvYJEUG 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 XU>33MV1nx#@JmKQQM^?2Q^5ZR$*^8) literal 0 HcmV?d00001 From d6ee41358751e97b746785c80d7ba60d35b2ce07 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Tue, 21 Aug 2018 13:42:17 +1000 Subject: [PATCH 25/41] Update Config.md --- docs/Config.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/Config.md b/docs/Config.md index e6e2c3974..7e657adc4 100644 --- a/docs/Config.md +++ b/docs/Config.md @@ -37,3 +37,7 @@ The available attributes are: - bold - reverse # useful for high-contrast - underline + +## Example Coloring: + +![border example](/docs/resources/colored-border-example.png) From 042c83387e51c03ca48427a9e8678c389cbbc887 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Tue, 21 Aug 2018 17:41:18 +1000 Subject: [PATCH 26/41] make bom.sh executable for easier testing --- test/repos/bom.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 test/repos/bom.sh diff --git a/test/repos/bom.sh b/test/repos/bom.sh old mode 100644 new mode 100755 From 810540edfad0736a294efede7664038134f5b5a0 Mon Sep 17 00:00:00 2001 From: Rob Bast Date: Tue, 21 Aug 2018 11:32:17 +0200 Subject: [PATCH 27/41] add return --- pkg/gui/branches_panel.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/gui/branches_panel.go b/pkg/gui/branches_panel.go index 886b4c493..e0b947f13 100644 --- a/pkg/gui/branches_panel.go +++ b/pkg/gui/branches_panel.go @@ -62,11 +62,11 @@ func (gui *Gui) handleNewBranch(g *gocui.Gui, v *gocui.View) error { } func (gui *Gui) handleDeleteBranch(g *gocui.Gui, v *gocui.View) error { - gui.deleteBranch(g, v, false) + return gui.deleteBranch(g, v, false) } func (gui *Gui) handleForceDeleteBranch(g *gocui.Gui, v *gocui.View) error { - gui.deleteBranch(g, v, true) + return gui.deleteBranch(g, v, true) } func (gui *Gui) deleteBranch(g *gocui.Gui, v *gocui.View, force bool) error { From 5f6b61d28c86676fec311ec94edad977343e48bd Mon Sep 17 00:00:00 2001 From: Rob Bast Date: Tue, 21 Aug 2018 12:06:42 +0200 Subject: [PATCH 28/41] adjust translation(s) for forced branch deletion --- pkg/gui/branches_panel.go | 7 ++++++- pkg/i18n/dutch.go | 5 ++++- pkg/i18n/english.go | 5 ++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/pkg/gui/branches_panel.go b/pkg/gui/branches_panel.go index e0b947f13..9d4f467bf 100644 --- a/pkg/gui/branches_panel.go +++ b/pkg/gui/branches_panel.go @@ -76,8 +76,13 @@ func (gui *Gui) deleteBranch(g *gocui.Gui, v *gocui.View, force bool) error { return gui.createErrorPanel(g, gui.Tr.SLocalize("CantDeleteCheckOutBranch")) } title := gui.Tr.SLocalize("DeleteBranch") + if force { + messageId := "ForceDeleteBranchMessage" + } else { + messageId := "DeleteBranchMessage" + } message := gui.Tr.TemplateLocalize( - "DeleteBranchMessage", + messageId, Teml{ "selectedBranchName": selectedBranch.Name, }, diff --git a/pkg/i18n/dutch.go b/pkg/i18n/dutch.go index a02c7c4bc..a5bf897b5 100644 --- a/pkg/i18n/dutch.go +++ b/pkg/i18n/dutch.go @@ -132,7 +132,10 @@ func addDutch(i18nObject *i18n.Bundle) error { Other: "Verwijder branch", }, &i18n.Message{ ID: "DeleteBranchMessage", - Other: "Weet je zeker dat je {{.selectedBranchName}} branch wil verwijderen?", + Other: "Weet je zeker dat je branch {{.selectedBranchName}} wil verwijderen?", + }, &i18n.Message{ + ID: "DeleteBranchMessage", + Other: "Weet je zeker dat je branch {{.selectedBranchName}} geforceerd wil verwijderen?", }, &i18n.Message{ ID: "CantMergeBranchIntoItself", Other: "Je kan niet een branch in zichzelf mergen", diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index db51fcdc4..55f6c5bc3 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -140,7 +140,10 @@ func addEnglish(i18nObject *i18n.Bundle) error { Other: "Delete Branch", }, &i18n.Message{ ID: "DeleteBranchMessage", - Other: "Are you sure you want delete the branch {{.selectedBranchName}} ?", + Other: "Are you sure you want to delete the branch {{.selectedBranchName}} ?", + }, &i18n.Message{ + ID: "ForceDeleteBranchMessage", + Other: "Are you sure you want to force delete the branch {{.selectedBranchName}} ?", }, &i18n.Message{ ID: "CantMergeBranchIntoItself", Other: "You cannot merge a branch into itself", From 182e47511626fb01e05b2abcaa589604648959d5 Mon Sep 17 00:00:00 2001 From: Rob Bast Date: Tue, 21 Aug 2018 12:09:13 +0200 Subject: [PATCH 29/41] correct variable assignment --- pkg/gui/branches_panel.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/gui/branches_panel.go b/pkg/gui/branches_panel.go index 9d4f467bf..df4dcff78 100644 --- a/pkg/gui/branches_panel.go +++ b/pkg/gui/branches_panel.go @@ -76,10 +76,11 @@ func (gui *Gui) deleteBranch(g *gocui.Gui, v *gocui.View, force bool) error { return gui.createErrorPanel(g, gui.Tr.SLocalize("CantDeleteCheckOutBranch")) } title := gui.Tr.SLocalize("DeleteBranch") + var messageId string if force { - messageId := "ForceDeleteBranchMessage" + messageId = "ForceDeleteBranchMessage" } else { - messageId := "DeleteBranchMessage" + messageId = "DeleteBranchMessage" } message := gui.Tr.TemplateLocalize( messageId, From dc911906b3ded868074549717bdf653dd6ddb7a8 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Tue, 21 Aug 2018 06:36:20 -0400 Subject: [PATCH 30/41] Esc will quit when not in popup, fixes #197 --- pkg/gui/gui.go | 5 ++++- pkg/gui/keybindings.go | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 66777b3a6..3e0bd9936 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -363,5 +363,8 @@ func (gui *Gui) RunWithSubprocesses() { } func (gui *Gui) quit(g *gocui.Gui, v *gocui.View) error { - return gocui.ErrQuit + if v.Name() != "commitMessage" && v.Name() != "confirmation" { + return gocui.ErrQuit + } + return nil } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index 68cccda6b..d09ed64b1 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -16,6 +16,7 @@ func (gui *Gui) keybindings(g *gocui.Gui) error { bindings := []Binding{ {ViewName: "", Key: 'q', Modifier: gocui.ModNone, Handler: gui.quit}, {ViewName: "", Key: gocui.KeyCtrlC, Modifier: gocui.ModNone, Handler: gui.quit}, + {ViewName: "", Key: gocui.KeyEsc, Modifier: gocui.ModNone, Handler: gui.quit}, {ViewName: "", Key: gocui.KeyPgup, Modifier: gocui.ModNone, Handler: gui.scrollUpMain}, {ViewName: "", Key: gocui.KeyPgdn, Modifier: gocui.ModNone, Handler: gui.scrollDownMain}, {ViewName: "", Key: gocui.KeyCtrlU, Modifier: gocui.ModNone, Handler: gui.scrollUpMain}, From 646c205227f1d07e098e674bfafc848800adea1c Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Tue, 21 Aug 2018 07:50:37 -0400 Subject: [PATCH 31/41] s/quit/escape, don't use special handling for views --- pkg/gui/gui.go | 7 ++----- pkg/gui/keybindings.go | 6 +++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 3e0bd9936..d07c7afee 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -362,9 +362,6 @@ func (gui *Gui) RunWithSubprocesses() { } } -func (gui *Gui) quit(g *gocui.Gui, v *gocui.View) error { - if v.Name() != "commitMessage" && v.Name() != "confirmation" { - return gocui.ErrQuit - } - return nil +func (gui *Gui) escape(g *gocui.Gui, v *gocui.View) error { + return gocui.ErrQuit } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index d09ed64b1..f0f2538b2 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -14,9 +14,9 @@ type Binding struct { func (gui *Gui) keybindings(g *gocui.Gui) error { bindings := []Binding{ - {ViewName: "", Key: 'q', Modifier: gocui.ModNone, Handler: gui.quit}, - {ViewName: "", Key: gocui.KeyCtrlC, Modifier: gocui.ModNone, Handler: gui.quit}, - {ViewName: "", Key: gocui.KeyEsc, Modifier: gocui.ModNone, Handler: gui.quit}, + {ViewName: "", Key: 'q', Modifier: gocui.ModNone, Handler: gui.escape}, + {ViewName: "", Key: gocui.KeyCtrlC, Modifier: gocui.ModNone, Handler: gui.escape}, + {ViewName: "", Key: gocui.KeyEsc, Modifier: gocui.ModNone, Handler: gui.escape}, {ViewName: "", Key: gocui.KeyPgup, Modifier: gocui.ModNone, Handler: gui.scrollUpMain}, {ViewName: "", Key: gocui.KeyPgdn, Modifier: gocui.ModNone, Handler: gui.scrollDownMain}, {ViewName: "", Key: gocui.KeyCtrlU, Modifier: gocui.ModNone, Handler: gui.scrollUpMain}, From cd4063c7630395ab91d8a47ee86025dda823f6e8 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Tue, 21 Aug 2018 08:54:51 -0400 Subject: [PATCH 32/41] s/escape/quit --- pkg/commands/git.go | 4 ++-- pkg/gui/files_panel.go | 23 ++++++++++++----------- pkg/gui/gui.go | 2 +- pkg/gui/keybindings.go | 6 +++--- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/pkg/commands/git.go b/pkg/commands/git.go index bf9aa6646..65e457b6f 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -270,12 +270,12 @@ func (c *GitCommand) Pull() error { } // Push push to a branch -func (c *GitCommand) Push(branchName string, force bool) error { +func (c *GitCommand) Push(branchName string, force bool) (*exec.Cmd, error) { forceFlag := "" if force { forceFlag = "--force-with-lease " } - return c.OSCommand.RunCommand("git push " + forceFlag + "-u origin " + branchName) + return c.OSCommand.PrepareSubProcess(c.OSCommand.Platform.shell, c.OSCommand.Platform.shellArg, "git push " + forceFlag + "-u origin " + branchName) } // SquashPreviousTwoCommits squashes a commit down to the one below it diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 5791a9d15..0b921ca0d 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -364,17 +364,18 @@ func (gui *Gui) pushWithForceFlag(currentView *gocui.View, force bool) error { if err := gui.createMessagePanel(gui.g, currentView, "", gui.Tr.SLocalize("PushWait")); err != nil { return err } - go func() { - branchName := gui.State.Branches[0].Name - if err := gui.GitCommand.Push(branchName, force); err != nil { - _ = gui.createErrorPanel(gui.g, err.Error()) - } else { - _ = gui.closeConfirmationPrompt(gui.g) - _ = gui.refreshCommits(gui.g) - _ = gui.refreshStatus(gui.g) - } - }() - return nil + branchName := gui.State.Branches[0].Name + sub, err := gui.GitCommand.Push(branchName, force) + if err != nil { + _ = gui.createErrorPanel(gui.g, err.Error()) + } + if sub != nil { + gui.SubProcess = sub + return gui.Errors.ErrSubProcess + } + _ = gui.closeConfirmationPrompt(gui.g) + _ = gui.refreshStatus(gui.g) + return gui.refreshCommits(gui.g) } func (gui *Gui) pushFiles(g *gocui.Gui, v *gocui.View) error { diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index d07c7afee..66777b3a6 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -362,6 +362,6 @@ func (gui *Gui) RunWithSubprocesses() { } } -func (gui *Gui) escape(g *gocui.Gui, v *gocui.View) error { +func (gui *Gui) quit(g *gocui.Gui, v *gocui.View) error { return gocui.ErrQuit } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index f0f2538b2..d09ed64b1 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -14,9 +14,9 @@ type Binding struct { func (gui *Gui) keybindings(g *gocui.Gui) error { bindings := []Binding{ - {ViewName: "", Key: 'q', Modifier: gocui.ModNone, Handler: gui.escape}, - {ViewName: "", Key: gocui.KeyCtrlC, Modifier: gocui.ModNone, Handler: gui.escape}, - {ViewName: "", Key: gocui.KeyEsc, Modifier: gocui.ModNone, Handler: gui.escape}, + {ViewName: "", Key: 'q', Modifier: gocui.ModNone, Handler: gui.quit}, + {ViewName: "", Key: gocui.KeyCtrlC, Modifier: gocui.ModNone, Handler: gui.quit}, + {ViewName: "", Key: gocui.KeyEsc, Modifier: gocui.ModNone, Handler: gui.quit}, {ViewName: "", Key: gocui.KeyPgup, Modifier: gocui.ModNone, Handler: gui.scrollUpMain}, {ViewName: "", Key: gocui.KeyPgdn, Modifier: gocui.ModNone, Handler: gui.scrollDownMain}, {ViewName: "", Key: gocui.KeyCtrlU, Modifier: gocui.ModNone, Handler: gui.scrollUpMain}, From eff931a1387dc042b77701ece91e4028bb15aeda Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Tue, 21 Aug 2018 09:00:16 -0400 Subject: [PATCH 33/41] Update gocui fork --- Gopkg.lock | 2 +- vendor/github.com/jesseduffield/gocui/gui.go | 28 ++++++++++++++----- .../jesseduffield/gocui/keybinding.go | 3 -- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 6efc5a34e..9c715f884 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -77,7 +77,7 @@ branch = "master" name = "github.com/jesseduffield/gocui" packages = ["."] - revision = "432b7f6215f81ef1aaa1b2d9b69887822923cf79" + revision = "76a959bb4b0df223fd046b96b68f0162dd609e4b" [[projects]] name = "github.com/kevinburke/ssh_config" diff --git a/vendor/github.com/jesseduffield/gocui/gui.go b/vendor/github.com/jesseduffield/gocui/gui.go index 28a52d1cd..24ff49808 100644 --- a/vendor/github.com/jesseduffield/gocui/gui.go +++ b/vendor/github.com/jesseduffield/gocui/gui.go @@ -653,17 +653,31 @@ func (g *Gui) onKey(ev *termbox.Event) error { // execKeybindings executes the keybinding handlers that match the passed view // and event. The value of matched is true if there is a match and no errors. func (g *Gui) execKeybindings(v *View, ev *termbox.Event) (matched bool, err error) { - matched = false + var globalKb *keybinding for _, kb := range g.keybindings { if kb.handler == nil { continue } - if kb.matchKeypress(Key(ev.Key), ev.Ch, Modifier(ev.Mod)) && kb.matchView(v) { - if err := kb.handler(g, v); err != nil { - return false, err - } - matched = true + if !kb.matchKeypress(Key(ev.Key), ev.Ch, Modifier(ev.Mod)) { + continue + } + if kb.matchView(v) { + return g.execKeybinding(v, kb) + } + if kb.viewName == "" { + globalKb = kb } } - return matched, nil + if globalKb != nil { + return g.execKeybinding(v, globalKb) + } + return false, nil +} + +// execKeybinding executes a given keybinding +func (g *Gui) execKeybinding(v *View, kb *keybinding) (bool, error) { + if err := kb.handler(g, v); err != nil { + return false, err + } + return true, nil } diff --git a/vendor/github.com/jesseduffield/gocui/keybinding.go b/vendor/github.com/jesseduffield/gocui/keybinding.go index 7efdb75c6..82d1acc9f 100644 --- a/vendor/github.com/jesseduffield/gocui/keybinding.go +++ b/vendor/github.com/jesseduffield/gocui/keybinding.go @@ -38,9 +38,6 @@ func (kb *keybinding) matchView(v *View) bool { if v.Editable == true && kb.ch != 0 { return false } - if kb.viewName == "" { - return true - } return v != nil && kb.viewName == v.name } From 924a9bb2c98e6931ac4638ae42d79edbf2136756 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Tue, 21 Aug 2018 10:55:33 -0400 Subject: [PATCH 34/41] Fix typos causing tests to fail --- pkg/i18n/dutch.go | 2 +- pkg/i18n/i18n_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/i18n/dutch.go b/pkg/i18n/dutch.go index a5bf897b5..68e7c82bd 100644 --- a/pkg/i18n/dutch.go +++ b/pkg/i18n/dutch.go @@ -134,7 +134,7 @@ func addDutch(i18nObject *i18n.Bundle) error { ID: "DeleteBranchMessage", Other: "Weet je zeker dat je branch {{.selectedBranchName}} wil verwijderen?", }, &i18n.Message{ - ID: "DeleteBranchMessage", + ID: "ForceDeleteBranchMessage", Other: "Weet je zeker dat je branch {{.selectedBranchName}} geforceerd wil verwijderen?", }, &i18n.Message{ ID: "CantMergeBranchIntoItself", diff --git a/pkg/i18n/i18n_test.go b/pkg/i18n/i18n_test.go index 481a40863..549b58077 100644 --- a/pkg/i18n/i18n_test.go +++ b/pkg/i18n/i18n_test.go @@ -57,7 +57,7 @@ func TestLocalizer(t *testing.T) { }, })) assert.Equal(t, "Diff", l.SLocalize("DiffTitle")) - assert.Equal(t, "Are you sure you want delete the branch test ?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) + assert.Equal(t, "Are you sure you want to delete the branch test ?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) }, }, { @@ -70,7 +70,7 @@ func TestLocalizer(t *testing.T) { }, })) assert.Equal(t, "Diff", l.SLocalize("DiffTitle")) - assert.Equal(t, "Weet je zeker dat je test branch wil verwijderen?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) + assert.Equal(t, "Weet je zeker dat je branch test wil verwijderen?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) }, }, } From 810155ef2f8c1e34c3f67aa95dbde9dcb342bb8a Mon Sep 17 00:00:00 2001 From: Anthony HAMON Date: Tue, 21 Aug 2018 08:40:51 +0200 Subject: [PATCH 35/41] fix documentation and reference issues --- pkg/commands/os.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/commands/os.go b/pkg/commands/os.go index 9756d619d..18ff93cc6 100644 --- a/pkg/commands/os.go +++ b/pkg/commands/os.go @@ -175,7 +175,8 @@ func (c *OSCommand) Unquote(message string) string { return message } -func (C *OSCommand) AppendLineToFile(filename, line string) error { +// AppendLineToFile adds a new line in file +func (c *OSCommand) AppendLineToFile(filename, line string) error { f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600) if err != nil { return err From 37681627ab46bc97af6cffcc812dadfe98c0852b Mon Sep 17 00:00:00 2001 From: Anthony HAMON Date: Tue, 21 Aug 2018 08:41:31 +0200 Subject: [PATCH 36/41] remove useless check --- pkg/config/app_config.go | 10 ++-------- pkg/test/test.go | 6 ++---- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/pkg/config/app_config.go b/pkg/config/app_config.go index 9f258d4a6..aa56365e3 100644 --- a/pkg/config/app_config.go +++ b/pkg/config/app_config.go @@ -121,10 +121,7 @@ func LoadUserConfigFromFile(v *viper.Viper) error { folder = configDirs.QueryFolderContainsFile("config.yml") } v.AddConfigPath(folder.Path) - if err := v.MergeInConfig(); err != nil { - return err - } - return nil + return v.MergeInConfig() } // InsertToUserConfig adds a key/value pair to the user's config and saves it @@ -139,10 +136,7 @@ func (c *AppConfig) InsertToUserConfig(key, value string) error { return err } v.Set(key, value) - if err := v.WriteConfig(); err != nil { - return err - } - return nil + return v.WriteConfig() } func getDefaultConfig() []byte { diff --git a/pkg/test/test.go b/pkg/test/test.go index 7bdbd4c10..b5da22903 100644 --- a/pkg/test/test.go +++ b/pkg/test/test.go @@ -18,8 +18,6 @@ func GenerateRepo(filename string) error { if output, err := exec.Command("bash", filename).CombinedOutput(); err != nil { return errors.New(string(output)) } - if err := os.Chdir(testPath + "repo"); err != nil { - return err - } - return nil + + return os.Chdir(testPath + "repo") } From bee4d98f5248ca5bb8319c22ec6f04fc752d79d0 Mon Sep 17 00:00:00 2001 From: remyabel <41764622+remyabel@users.noreply.github.com> Date: Tue, 21 Aug 2018 21:27:20 -0400 Subject: [PATCH 37/41] Remove space before punctuation --- pkg/i18n/i18n_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/i18n/i18n_test.go b/pkg/i18n/i18n_test.go index 549b58077..5c2ca6419 100644 --- a/pkg/i18n/i18n_test.go +++ b/pkg/i18n/i18n_test.go @@ -57,7 +57,7 @@ func TestLocalizer(t *testing.T) { }, })) assert.Equal(t, "Diff", l.SLocalize("DiffTitle")) - assert.Equal(t, "Are you sure you want to delete the branch test ?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) + assert.Equal(t, "Are you sure you want to delete the branch test?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) }, }, { From 3e8ef0d12d394bdd2437ecb0084cea2985de01be Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Wed, 22 Aug 2018 11:27:45 -0400 Subject: [PATCH 38/41] Remove space before punctuation --- pkg/i18n/english.go | 4 ++-- pkg/i18n/i18n_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 2269ffb9f..38fbac4cb 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -140,10 +140,10 @@ func addEnglish(i18nObject *i18n.Bundle) error { Other: "Delete Branch", }, &i18n.Message{ ID: "DeleteBranchMessage", - Other: "Are you sure you want to delete the branch {{.selectedBranchName}} ?", + Other: "Are you sure you want to delete the branch {{.selectedBranchName}}?", }, &i18n.Message{ ID: "ForceDeleteBranchMessage", - Other: "Are you sure you want to force delete the branch {{.selectedBranchName}} ?", + Other: "Are you sure you want to force delete the branch {{.selectedBranchName}}?", }, &i18n.Message{ ID: "CantMergeBranchIntoItself", Other: "You cannot merge a branch into itself", diff --git a/pkg/i18n/i18n_test.go b/pkg/i18n/i18n_test.go index 549b58077..5c2ca6419 100644 --- a/pkg/i18n/i18n_test.go +++ b/pkg/i18n/i18n_test.go @@ -57,7 +57,7 @@ func TestLocalizer(t *testing.T) { }, })) assert.Equal(t, "Diff", l.SLocalize("DiffTitle")) - assert.Equal(t, "Are you sure you want to delete the branch test ?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) + assert.Equal(t, "Are you sure you want to delete the branch test?", l.TemplateLocalize("DeleteBranchMessage", Teml{"selectedBranchName": "test"})) }, }, { From 110ff38c0d4a40ff450086480fe8ebe0fd2ed61d Mon Sep 17 00:00:00 2001 From: Tommy Nguyen Date: Wed, 22 Aug 2018 11:34:16 -0400 Subject: [PATCH 39/41] Remove accidentally checked in code --- pkg/commands/git.go | 4 ++-- pkg/gui/files_panel.go | 23 +++++++++++------------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/pkg/commands/git.go b/pkg/commands/git.go index 65e457b6f..bf9aa6646 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -270,12 +270,12 @@ func (c *GitCommand) Pull() error { } // Push push to a branch -func (c *GitCommand) Push(branchName string, force bool) (*exec.Cmd, error) { +func (c *GitCommand) Push(branchName string, force bool) error { forceFlag := "" if force { forceFlag = "--force-with-lease " } - return c.OSCommand.PrepareSubProcess(c.OSCommand.Platform.shell, c.OSCommand.Platform.shellArg, "git push " + forceFlag + "-u origin " + branchName) + return c.OSCommand.RunCommand("git push " + forceFlag + "-u origin " + branchName) } // SquashPreviousTwoCommits squashes a commit down to the one below it diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 0b921ca0d..5791a9d15 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -364,18 +364,17 @@ func (gui *Gui) pushWithForceFlag(currentView *gocui.View, force bool) error { if err := gui.createMessagePanel(gui.g, currentView, "", gui.Tr.SLocalize("PushWait")); err != nil { return err } - branchName := gui.State.Branches[0].Name - sub, err := gui.GitCommand.Push(branchName, force) - if err != nil { - _ = gui.createErrorPanel(gui.g, err.Error()) - } - if sub != nil { - gui.SubProcess = sub - return gui.Errors.ErrSubProcess - } - _ = gui.closeConfirmationPrompt(gui.g) - _ = gui.refreshStatus(gui.g) - return gui.refreshCommits(gui.g) + go func() { + branchName := gui.State.Branches[0].Name + if err := gui.GitCommand.Push(branchName, force); err != nil { + _ = gui.createErrorPanel(gui.g, err.Error()) + } else { + _ = gui.closeConfirmationPrompt(gui.g) + _ = gui.refreshCommits(gui.g) + _ = gui.refreshStatus(gui.g) + } + }() + return nil } func (gui *Gui) pushFiles(g *gocui.Gui, v *gocui.View) error { From bcbeec1a56963451d402179752bc9696b5c37eba Mon Sep 17 00:00:00 2001 From: Dawid Dziurla Date: Thu, 23 Aug 2018 14:22:03 +0200 Subject: [PATCH 40/41] Sirupsen -> sirupsen --- Gopkg.lock | 2 +- pkg/app/app.go | 2 +- pkg/commands/git.go | 2 +- pkg/commands/git_test.go | 2 +- pkg/commands/os.go | 2 +- pkg/git/branch_list_builder.go | 2 +- pkg/gui/gui.go | 2 +- pkg/i18n/i18n.go | 2 +- pkg/i18n/i18n_test.go | 2 +- vendor/github.com/{Sirupsen => sirupsen}/logrus/LICENSE | 0 vendor/github.com/{Sirupsen => sirupsen}/logrus/alt_exit.go | 0 vendor/github.com/{Sirupsen => sirupsen}/logrus/doc.go | 0 vendor/github.com/{Sirupsen => sirupsen}/logrus/entry.go | 0 vendor/github.com/{Sirupsen => sirupsen}/logrus/exported.go | 0 vendor/github.com/{Sirupsen => sirupsen}/logrus/formatter.go | 0 vendor/github.com/{Sirupsen => sirupsen}/logrus/hooks.go | 0 .../github.com/{Sirupsen => sirupsen}/logrus/json_formatter.go | 0 vendor/github.com/{Sirupsen => sirupsen}/logrus/logger.go | 0 vendor/github.com/{Sirupsen => sirupsen}/logrus/logrus.go | 0 vendor/github.com/{Sirupsen => sirupsen}/logrus/terminal_bsd.go | 0 .../{Sirupsen => sirupsen}/logrus/terminal_check_appengine.go | 0 .../logrus/terminal_check_notappengine.go | 0 .../github.com/{Sirupsen => sirupsen}/logrus/terminal_linux.go | 0 .../github.com/{Sirupsen => sirupsen}/logrus/text_formatter.go | 0 vendor/github.com/{Sirupsen => sirupsen}/logrus/writer.go | 0 25 files changed, 9 insertions(+), 9 deletions(-) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/LICENSE (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/alt_exit.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/doc.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/entry.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/exported.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/formatter.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/hooks.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/json_formatter.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/logger.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/logrus.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/terminal_bsd.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/terminal_check_appengine.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/terminal_check_notappengine.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/terminal_linux.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/text_formatter.go (100%) rename vendor/github.com/{Sirupsen => sirupsen}/logrus/writer.go (100%) diff --git a/Gopkg.lock b/Gopkg.lock index 6efc5a34e..c274ffb38 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,7 +2,7 @@ [[projects]] - name = "github.com/Sirupsen/logrus" + name = "github.com/sirupsen/logrus" packages = ["."] revision = "3e01752db0189b9157070a0e1668a620f9a85da2" version = "v1.0.6" diff --git a/pkg/app/app.go b/pkg/app/app.go index 20a97276e..102ab4146 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -5,7 +5,7 @@ import ( "io/ioutil" "os" - "github.com/Sirupsen/logrus" + "github.com/sirupsen/logrus" "github.com/jesseduffield/lazygit/pkg/commands" "github.com/jesseduffield/lazygit/pkg/config" "github.com/jesseduffield/lazygit/pkg/gui" diff --git a/pkg/commands/git.go b/pkg/commands/git.go index ed42ae28c..14f3a433a 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -7,7 +7,7 @@ import ( "os/exec" "strings" - "github.com/Sirupsen/logrus" + "github.com/sirupsen/logrus" "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazygit/pkg/utils" gitconfig "github.com/tcnksm/go-gitconfig" diff --git a/pkg/commands/git_test.go b/pkg/commands/git_test.go index 9c2a64330..c930f76eb 100644 --- a/pkg/commands/git_test.go +++ b/pkg/commands/git_test.go @@ -5,7 +5,7 @@ import ( "strings" "testing" - "github.com/Sirupsen/logrus" + "github.com/sirupsen/logrus" "github.com/jesseduffield/lazygit/pkg/test" ) diff --git a/pkg/commands/os.go b/pkg/commands/os.go index 18ff93cc6..1eef36151 100644 --- a/pkg/commands/os.go +++ b/pkg/commands/os.go @@ -11,7 +11,7 @@ import ( "github.com/mgutz/str" - "github.com/Sirupsen/logrus" + "github.com/sirupsen/logrus" gitconfig "github.com/tcnksm/go-gitconfig" ) diff --git a/pkg/git/branch_list_builder.go b/pkg/git/branch_list_builder.go index 869e05c98..37421d5b6 100644 --- a/pkg/git/branch_list_builder.go +++ b/pkg/git/branch_list_builder.go @@ -7,7 +7,7 @@ import ( "github.com/jesseduffield/lazygit/pkg/commands" "github.com/jesseduffield/lazygit/pkg/utils" - "github.com/Sirupsen/logrus" + "github.com/sirupsen/logrus" "gopkg.in/src-d/go-git.v4/plumbing" ) diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 66777b3a6..3d9c7b617 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -15,7 +15,7 @@ import ( // "strings" - "github.com/Sirupsen/logrus" + "github.com/sirupsen/logrus" "github.com/golang-collections/collections/stack" "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazygit/pkg/commands" diff --git a/pkg/i18n/i18n.go b/pkg/i18n/i18n.go index bb97cc9a0..898a13906 100644 --- a/pkg/i18n/i18n.go +++ b/pkg/i18n/i18n.go @@ -1,7 +1,7 @@ package i18n import ( - "github.com/Sirupsen/logrus" + "github.com/sirupsen/logrus" "github.com/cloudfoundry/jibber_jabber" "github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/text/language" diff --git a/pkg/i18n/i18n_test.go b/pkg/i18n/i18n_test.go index 5c2ca6419..5eeddb907 100644 --- a/pkg/i18n/i18n_test.go +++ b/pkg/i18n/i18n_test.go @@ -6,7 +6,7 @@ import ( "github.com/nicksnyder/go-i18n/v2/i18n" - "github.com/Sirupsen/logrus" + "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" ) diff --git a/vendor/github.com/Sirupsen/logrus/LICENSE b/vendor/github.com/sirupsen/logrus/LICENSE similarity index 100% rename from vendor/github.com/Sirupsen/logrus/LICENSE rename to vendor/github.com/sirupsen/logrus/LICENSE diff --git a/vendor/github.com/Sirupsen/logrus/alt_exit.go b/vendor/github.com/sirupsen/logrus/alt_exit.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/alt_exit.go rename to vendor/github.com/sirupsen/logrus/alt_exit.go diff --git a/vendor/github.com/Sirupsen/logrus/doc.go b/vendor/github.com/sirupsen/logrus/doc.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/doc.go rename to vendor/github.com/sirupsen/logrus/doc.go diff --git a/vendor/github.com/Sirupsen/logrus/entry.go b/vendor/github.com/sirupsen/logrus/entry.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/entry.go rename to vendor/github.com/sirupsen/logrus/entry.go diff --git a/vendor/github.com/Sirupsen/logrus/exported.go b/vendor/github.com/sirupsen/logrus/exported.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/exported.go rename to vendor/github.com/sirupsen/logrus/exported.go diff --git a/vendor/github.com/Sirupsen/logrus/formatter.go b/vendor/github.com/sirupsen/logrus/formatter.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/formatter.go rename to vendor/github.com/sirupsen/logrus/formatter.go diff --git a/vendor/github.com/Sirupsen/logrus/hooks.go b/vendor/github.com/sirupsen/logrus/hooks.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/hooks.go rename to vendor/github.com/sirupsen/logrus/hooks.go diff --git a/vendor/github.com/Sirupsen/logrus/json_formatter.go b/vendor/github.com/sirupsen/logrus/json_formatter.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/json_formatter.go rename to vendor/github.com/sirupsen/logrus/json_formatter.go diff --git a/vendor/github.com/Sirupsen/logrus/logger.go b/vendor/github.com/sirupsen/logrus/logger.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/logger.go rename to vendor/github.com/sirupsen/logrus/logger.go diff --git a/vendor/github.com/Sirupsen/logrus/logrus.go b/vendor/github.com/sirupsen/logrus/logrus.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/logrus.go rename to vendor/github.com/sirupsen/logrus/logrus.go diff --git a/vendor/github.com/Sirupsen/logrus/terminal_bsd.go b/vendor/github.com/sirupsen/logrus/terminal_bsd.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/terminal_bsd.go rename to vendor/github.com/sirupsen/logrus/terminal_bsd.go diff --git a/vendor/github.com/Sirupsen/logrus/terminal_check_appengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/terminal_check_appengine.go rename to vendor/github.com/sirupsen/logrus/terminal_check_appengine.go diff --git a/vendor/github.com/Sirupsen/logrus/terminal_check_notappengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/terminal_check_notappengine.go rename to vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go diff --git a/vendor/github.com/Sirupsen/logrus/terminal_linux.go b/vendor/github.com/sirupsen/logrus/terminal_linux.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/terminal_linux.go rename to vendor/github.com/sirupsen/logrus/terminal_linux.go diff --git a/vendor/github.com/Sirupsen/logrus/text_formatter.go b/vendor/github.com/sirupsen/logrus/text_formatter.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/text_formatter.go rename to vendor/github.com/sirupsen/logrus/text_formatter.go diff --git a/vendor/github.com/Sirupsen/logrus/writer.go b/vendor/github.com/sirupsen/logrus/writer.go similarity index 100% rename from vendor/github.com/Sirupsen/logrus/writer.go rename to vendor/github.com/sirupsen/logrus/writer.go From ee7f88e12366ed9176aa1a1c6f71bd87a8967279 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Sat, 25 Aug 2018 09:13:29 +1000 Subject: [PATCH 41/41] ignore global rune keybindings when in editable view --- Gopkg.lock | 139 ++++++++++++++++--- vendor/github.com/jesseduffield/gocui/gui.go | 2 +- 2 files changed, 122 insertions(+), 19 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 876ea675e..bf05a0041 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1,25 +1,24 @@ # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. -[[projects]] - name = "github.com/sirupsen/logrus" - packages = ["."] - revision = "3e01752db0189b9157070a0e1668a620f9a85da2" - version = "v1.0.6" - [[projects]] branch = "master" + digest = "1:cd7ba2b29e93e2a8384e813dfc80ebb0f85d9214762e6ca89bb55a58092eab87" name = "github.com/cloudfoundry/jibber_jabber" packages = ["."] + pruneopts = "NUT" revision = "bcc4c8345a21301bf47c032ff42dd1aae2fe3027" [[projects]] + digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" name = "github.com/davecgh/go-spew" packages = ["spew"] + pruneopts = "NUT" revision = "346938d642f2ec3594ed81d874461961cd0faa76" version = "v1.1.0" [[projects]] + digest = "1:de4a74b504df31145ffa8ca0c4edbffa2f3eb7f466753962184611b618fa5981" name = "github.com/emirpasic/gods" packages = [ "containers", @@ -27,31 +26,39 @@ "lists/arraylist", "trees", "trees/binaryheap", - "utils" + "utils", ] + pruneopts = "NUT" revision = "f6c17b524822278a87e3b3bd809fec33b51f5b46" version = "v1.9.0" [[projects]] + digest = "1:ade392a843b2035effb4b4a2efa2c3bab3eb29b992e98bacf9c898b0ecb54e45" name = "github.com/fatih/color" packages = ["."] + pruneopts = "NUT" revision = "5b77d2a35fb0ede96d138fc9a99f5c9b6aef11b4" version = "v1.7.0" [[projects]] + digest = "1:1b91ae0dc69a41d4c2ed23ea5cffb721ea63f5037ca4b81e6d6771fbb8f45129" name = "github.com/fsnotify/fsnotify" packages = ["."] + pruneopts = "NUT" revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" version = "v1.4.7" [[projects]] branch = "master" + digest = "1:4a8ed9b8cf22bd03bee5d74179fa06a282e4a73b6de949f7a865ff56cd2537e0" name = "github.com/golang-collections/collections" packages = ["stack"] + pruneopts = "NUT" revision = "604e922904d35e97f98a774db7881f049cd8d970" [[projects]] branch = "master" + digest = "1:11c6c696067d3127ecf332b10f89394d386d9083f82baf71f40f2da31841a009" name = "github.com/hashicorp/hcl" packages = [ ".", @@ -63,185 +70,249 @@ "hcl/token", "json/parser", "json/scanner", - "json/token" + "json/token", ] + pruneopts = "NUT" revision = "ef8a98b0bbce4a65b5aa4c368430a80ddc533168" [[projects]] branch = "master" + digest = "1:62fe3a7ea2050ecbd753a71889026f83d73329337ada66325cbafd5dea5f713d" name = "github.com/jbenet/go-context" packages = ["io"] + pruneopts = "NUT" revision = "d14ea06fba99483203c19d92cfcd13ebe73135f4" [[projects]] branch = "master" + digest = "1:f774b11ae458cae2d10b94ef66ef00ba1c57f1971dd0e5534ac743cbe574f6d4" name = "github.com/jesseduffield/gocui" packages = ["."] - revision = "76a959bb4b0df223fd046b96b68f0162dd609e4b" + pruneopts = "NUT" + revision = "7818a0f93387d1037cbd06f69323d9f8d068af7c" [[projects]] + digest = "1:8021af4dcbd531ae89433c8c3a6520e51064114aaf8eb1724c3cf911c497c9ba" name = "github.com/kevinburke/ssh_config" packages = ["."] + pruneopts = "NUT" revision = "9fc7bb800b555d63157c65a904c86a2cc7b4e795" version = "0.4" [[projects]] + digest = "1:d244f8666a838fe6ad70ec8fe77f50ebc29fdc3331a2729ba5886bef8435d10d" name = "github.com/magiconair/properties" packages = ["."] + pruneopts = "NUT" revision = "c2353362d570a7bfa228149c62842019201cfb71" version = "v1.8.0" [[projects]] + digest = "1:08c231ec84231a7e23d67e4b58f975e1423695a32467a362ee55a803f9de8061" name = "github.com/mattn/go-colorable" packages = ["."] + pruneopts = "NUT" revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" version = "v0.0.9" [[projects]] + digest = "1:bc4f7eec3b7be8c6cb1f0af6c1e3333d5bb71072951aaaae2f05067b0803f287" name = "github.com/mattn/go-isatty" packages = ["."] + pruneopts = "NUT" revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" version = "v0.0.3" [[projects]] + digest = "1:cb591533458f6eb6e2c1065ff3eac6b50263d7847deb23fc9f79b25bc608970e" name = "github.com/mattn/go-runewidth" packages = ["."] + pruneopts = "NUT" revision = "9e777a8366cce605130a531d2cd6363d07ad7317" version = "v0.0.2" [[projects]] + digest = "1:a25c9a6b41e100f4ce164db80260f2b687095ba9d8b46a1d6072d3686cc020db" name = "github.com/mgutz/str" packages = ["."] + pruneopts = "NUT" revision = "968bf66e3da857419e4f6e71b2d5c9ae95682dc4" version = "v1.2.0" [[projects]] branch = "master" + digest = "1:a4df73029d2c42fabcb6b41e327d2f87e685284ec03edf76921c267d9cfc9c23" name = "github.com/mitchellh/go-homedir" packages = ["."] + pruneopts = "NUT" revision = "58046073cbffe2f25d425fe1331102f55cf719de" [[projects]] branch = "master" + digest = "1:5fe20cfe4ef484c237cec9f947b2a6fa90bad4b8610fd014f0e4211e13d82d5d" name = "github.com/mitchellh/mapstructure" packages = ["."] + pruneopts = "NUT" revision = "f15292f7a699fcc1a38a80977f80a046874ba8ac" [[projects]] + digest = "1:2c34c77bf3ec848da26e48af58fc511ed52750961fa848399d122882b8890928" name = "github.com/nicksnyder/go-i18n" packages = [ "v2/i18n", "v2/internal", - "v2/internal/plural" + "v2/internal/plural", ] + pruneopts = "NUT" revision = "a16b91a3ba80db3a2301c70d1d302d42251c9079" version = "v2.0.0-beta.5" [[projects]] branch = "master" + digest = "1:34d9354c2c5d916c05864327553047df59fc10e86ff1f408e4136eba0a25a5ec" name = "github.com/nsf/termbox-go" packages = ["."] + pruneopts = "NUT" revision = "5c94acc5e6eb520f1bcd183974e01171cc4c23b3" [[projects]] + digest = "1:cf254277d898b713195cc6b4a3fac8bf738b9f1121625df27843b52b267eec6c" name = "github.com/pelletier/go-buffruneio" packages = ["."] + pruneopts = "NUT" revision = "c37440a7cf42ac63b919c752ca73a85067e05992" version = "v0.2.0" [[projects]] + digest = "1:51ea800cff51752ff68e12e04106f5887b4daec6f9356721238c28019f0b42db" name = "github.com/pelletier/go-toml" packages = ["."] + pruneopts = "NUT" revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" version = "v1.2.0" [[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" name = "github.com/pmezard/go-difflib" packages = ["difflib"] + pruneopts = "NUT" revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" [[projects]] + digest = "1:d917313f309bda80d27274d53985bc65651f81a5b66b820749ac7f8ef061fd04" name = "github.com/sergi/go-diff" packages = ["diffmatchpatch"] + pruneopts = "NUT" revision = "1744e2970ca51c86172c8190fadad617561ed6e7" version = "v1.0.0" [[projects]] + digest = "1:41618aee8828e62dfe62d44f579c06892d0e98907d1c6d5bcd83bfe8536ec5a3" name = "github.com/shibukawa/configdir" packages = ["."] + pruneopts = "NUT" revision = "e180dbdc8da04c4fa04272e875ce64949f38bd3e" [[projects]] + digest = "1:b2339e83ce9b5c4f79405f949429a7f68a9a904fed903c672aac1e7ceb7f5f02" + name = "github.com/sirupsen/logrus" + packages = ["."] + pruneopts = "NUT" + revision = "3e01752db0189b9157070a0e1668a620f9a85da2" + version = "v1.0.6" + +[[projects]] + digest = "1:330e9062b308ac597e28485699c02223bd052437a6eed32a173c9227dcb9d95a" name = "github.com/spf13/afero" packages = [ ".", - "mem" + "mem", ] + pruneopts = "NUT" revision = "787d034dfe70e44075ccc060d346146ef53270ad" version = "v1.1.1" [[projects]] + digest = "1:3fa7947ca83b98ae553590d993886e845a4bff19b7b007e869c6e0dd3b9da9cd" name = "github.com/spf13/cast" packages = ["."] + pruneopts = "NUT" revision = "8965335b8c7107321228e3e3702cab9832751bac" version = "v1.2.0" [[projects]] branch = "master" + digest = "1:f29f83301ed096daed24a90f4af591b7560cb14b9cc3e1827abbf04db7269ab5" name = "github.com/spf13/jwalterweatherman" packages = ["."] + pruneopts = "NUT" revision = "14d3d4c518341bea657dd8a226f5121c0ff8c9f2" [[projects]] + digest = "1:e3707aeaccd2adc89eba6c062fec72116fe1fc1ba71097da85b4d8ae1668a675" name = "github.com/spf13/pflag" packages = ["."] + pruneopts = "NUT" revision = "9a97c102cda95a86cec2345a6f09f55a939babf5" version = "v1.0.2" [[projects]] + digest = "1:454979540e2a1582f375a17c106cf4e11e3bcac4baffb4af23e515c87f87de13" name = "github.com/spf13/viper" packages = ["."] + pruneopts = "NUT" revision = "907c19d40d9a6c9bb55f040ff4ae45271a4754b9" version = "v1.1.0" [[projects]] branch = "master" + digest = "1:0e9a5ac14bcc11f205031a671b28c7e05cb88b2ebbe06f383c1ab0b2c12c7cb5" name = "github.com/spkg/bom" packages = ["."] + pruneopts = "NUT" revision = "59b7046e48ad6bac800c5e1dd5142282cbfcf154" [[projects]] + digest = "1:ccca1dcd18bc54e23b517a3c5babeff2e3924a7d8fc1932162225876cfe4bfb0" name = "github.com/src-d/gcfg" packages = [ ".", "scanner", "token", - "types" + "types", ] + pruneopts = "NUT" revision = "f187355171c936ac84a82793659ebb4936bc1c23" version = "v1.3.0" [[projects]] + digest = "1:bacb8b590716ab7c33f2277240972c9582d389593ee8d66fc10074e0508b8126" name = "github.com/stretchr/testify" packages = ["assert"] + pruneopts = "NUT" revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686" version = "v1.2.2" [[projects]] + digest = "1:cd5ffc5bda4e0296ab3e4de90dbb415259c78e45e7fab13694b14cde8ab74541" name = "github.com/tcnksm/go-gitconfig" packages = ["."] + pruneopts = "NUT" revision = "d154598bacbf4501c095a309753c5d4af66caa81" version = "v0.1.2" [[projects]] + digest = "1:3148cb3478c26a92b4c1a18abb9428234b281e278af6267840721a24b6cbc6a3" name = "github.com/xanzy/ssh-agent" packages = ["."] + pruneopts = "NUT" revision = "640f0ab560aeb89d523bb6ac322b1244d5c3796c" version = "v0.2.0" [[projects]] branch = "master" + digest = "1:dfcb1b2db354cafa48fc3cdafe4905a08bec4a9757919ab07155db0ca23855b4" name = "golang.org/x/crypto" packages = [ "cast5", @@ -260,26 +331,32 @@ "ssh", "ssh/agent", "ssh/knownhosts", - "ssh/terminal" + "ssh/terminal", ] + pruneopts = "NUT" revision = "de0752318171da717af4ce24d0a2e8626afaeb11" [[projects]] branch = "master" + digest = "1:76ee51c3f468493aff39dbacc401e8831fbb765104cbf613b89bef01cf4bad70" name = "golang.org/x/net" packages = ["context"] + pruneopts = "NUT" revision = "c39426892332e1bb5ec0a434a079bf82f5d30c54" [[projects]] branch = "master" + digest = "1:ec76a40fbfda0c329ee58f4e3b14b4279a939efce89eca020e934e2e5234eddd" name = "golang.org/x/sys" packages = [ "unix", - "windows" + "windows", ] + pruneopts = "NUT" revision = "98c5dad5d1a0e8a73845ecc8897d0bd56586511d" [[projects]] + digest = "1:a95288ef1ef4dfad6cba7fe30843e1683f71bc28c912ca1ba3f6a539d44db739" name = "golang.org/x/text" packages = [ "internal/gen", @@ -289,24 +366,28 @@ "language", "transform", "unicode/cldr", - "unicode/norm" + "unicode/norm", ] + pruneopts = "NUT" revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" version = "v0.3.0" [[projects]] + digest = "1:47a697b155f5214ff14e68e39ce9c2e8d93e1fb035ae5ba7e247d044e0ce64e3" name = "gopkg.in/src-d/go-billy.v4" packages = [ ".", "helper/chroot", "helper/polyfill", "osfs", - "util" + "util", ] + pruneopts = "NUT" revision = "83cf655d40b15b427014d7875d10850f96edba14" version = "v4.2.0" [[projects]] + digest = "1:e66078da2bd6e53c72518d7f6ae0c3c8c7f34c0df12c39435ce34a6bce165525" name = "gopkg.in/src-d/go-git.v4" packages = [ ".", @@ -348,25 +429,47 @@ "utils/merkletrie/filesystem", "utils/merkletrie/index", "utils/merkletrie/internal/frame", - "utils/merkletrie/noder" + "utils/merkletrie/noder", ] + pruneopts = "NUT" revision = "43d17e14b714665ab5bc2ecc220b6740779d733f" [[projects]] + digest = "1:b233ad4ec87ac916e7bf5e678e98a2cb9e8b52f6de6ad3e11834fc7a71b8e3bf" name = "gopkg.in/warnings.v0" packages = ["."] + pruneopts = "NUT" revision = "ec4a0fea49c7b46c2aeb0b51aac55779c607e52b" version = "v0.1.2" [[projects]] + digest = "1:7c95b35057a0ff2e19f707173cc1a947fa43a6eb5c4d300d196ece0334046082" name = "gopkg.in/yaml.v2" packages = ["."] + pruneopts = "NUT" revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" version = "v2.2.1" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "52d66c52c1720308d826a43918b77f13a47f5cc782e315cf84a8a7f7aa6baa73" + input-imports = [ + "github.com/cloudfoundry/jibber_jabber", + "github.com/davecgh/go-spew/spew", + "github.com/fatih/color", + "github.com/golang-collections/collections/stack", + "github.com/jesseduffield/gocui", + "github.com/mgutz/str", + "github.com/nicksnyder/go-i18n/v2/i18n", + "github.com/shibukawa/configdir", + "github.com/sirupsen/logrus", + "github.com/spf13/viper", + "github.com/spkg/bom", + "github.com/stretchr/testify/assert", + "github.com/tcnksm/go-gitconfig", + "golang.org/x/text/language", + "gopkg.in/src-d/go-git.v4", + "gopkg.in/src-d/go-git.v4/plumbing", + ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/vendor/github.com/jesseduffield/gocui/gui.go b/vendor/github.com/jesseduffield/gocui/gui.go index 24ff49808..26ba79bd6 100644 --- a/vendor/github.com/jesseduffield/gocui/gui.go +++ b/vendor/github.com/jesseduffield/gocui/gui.go @@ -664,7 +664,7 @@ func (g *Gui) execKeybindings(v *View, ev *termbox.Event) (matched bool, err err if kb.matchView(v) { return g.execKeybinding(v, kb) } - if kb.viewName == "" { + if kb.viewName == "" && (!v.Editable || kb.ch == 0) { globalKb = kb } }