summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2020-08-23 22:04:24 +1000
committerJesse Duffield <jessedduffield@gmail.com>2020-08-26 07:53:43 +1000
commitafd669194ad73f85e21d5dfd6d8f0ec26286ca5e (patch)
treeef8cb4305aee51625c7a227a77fb4e6d6ffcf1d3
parent1494a3863da457eb023178fdcc0512d59e73acbe (diff)
use clipboard package to handle clipboard stuff
-rw-r--r--go.mod1
-rw-r--r--go.sum2
-rw-r--r--pkg/commands/os.go10
-rw-r--r--pkg/config/config_default_platform.go3
-rw-r--r--pkg/config/config_linux.go3
-rw-r--r--pkg/config/config_windows.go3
-rw-r--r--vendor/github.com/atotto/clipboard/LICENSE27
-rw-r--r--vendor/github.com/atotto/clipboard/README.md48
-rw-r--r--vendor/github.com/atotto/clipboard/clipboard.go20
-rw-r--r--vendor/github.com/atotto/clipboard/clipboard_darwin.go52
-rw-r--r--vendor/github.com/atotto/clipboard/clipboard_unix.go129
-rw-r--r--vendor/github.com/atotto/clipboard/clipboard_windows.go128
-rw-r--r--vendor/github.com/atotto/clipboard/go.mod1
-rw-r--r--vendor/modules.txt3
14 files changed, 416 insertions, 14 deletions
diff --git a/go.mod b/go.mod
index 57dc13556..8fc96d144 100644
--- a/go.mod
+++ b/go.mod
@@ -3,6 +3,7 @@ module github.com/jesseduffield/lazygit
go 1.14
require (
+ github.com/atotto/clipboard v0.1.2
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21
github.com/creack/pty v1.1.11
github.com/fatih/color v1.7.0
diff --git a/go.sum b/go.sum
index f88e346c4..916aaab07 100644
--- a/go.sum
+++ b/go.sum
@@ -12,6 +12,8 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
+github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY=
+github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
diff --git a/pkg/commands/os.go b/pkg/commands/os.go
index 81ebf951a..74bcd1a78 100644
--- a/pkg/commands/os.go
+++ b/pkg/commands/os.go
@@ -14,6 +14,7 @@ import (
"github.com/go-errors/errors"
+ "github.com/atotto/clipboard"
"github.com/jesseduffield/lazygit/pkg/config"
"github.com/jesseduffield/lazygit/pkg/utils"
"github.com/mgutz/str"
@@ -475,12 +476,5 @@ func RunLineOutputCmd(cmd *exec.Cmd, onLine func(line string) (bool, error)) err
}
func (c *OSCommand) CopyToClipboard(str string) error {
- commandTemplate := c.Config.GetUserConfig().GetString("os.copyToClipboardCommand")
- templateValues := map[string]string{
- "str": c.Quote(str),
- }
-
- command := utils.ResolvePlaceholderString(commandTemplate, templateValues)
-
- return c.RunCommand(command)
+ return clipboard.WriteAll(str)
}
diff --git a/pkg/config/config_default_platform.go b/pkg/config/config_default_platform.go
index 0eccd96ab..df205c0d7 100644
--- a/pkg/config/config_default_platform.go
+++ b/pkg/config/config_default_platform.go
@@ -7,6 +7,5 @@ func GetPlatformDefaultConfig() []byte {
return []byte(
`os:
openCommand: 'open {{filename}}'
- openLinkCommand: 'open {{link}}'
- copyToClipboardCommand: 'bash -c "echo -n {{str}} | pbcopy"'`)
+ openLinkCommand: 'open {{link}}'`)
}
diff --git a/pkg/config/config_linux.go b/pkg/config/config_linux.go
index 8f3223cfc..2dfbdb1c6 100644
--- a/pkg/config/config_linux.go
+++ b/pkg/config/config_linux.go
@@ -5,6 +5,5 @@ func GetPlatformDefaultConfig() []byte {
return []byte(
`os:
openCommand: 'sh -c "xdg-open {{filename}} >/dev/null"'
- openLinkCommand: 'sh -c "xdg-open {{link}} >/dev/null"'
- copyToClipboardCommand: 'bash -c "echo -n {{str}} | xclip -selection clipboard"'`)
+ openLinkCommand: 'sh -c "xdg-open {{link}} >/dev/null"'`)
}
diff --git a/pkg/config/config_windows.go b/pkg/config/config_windows.go
index 0c18272f1..6f6560316 100644
--- a/pkg/config/config_windows.go
+++ b/pkg/config/config_windows.go
@@ -5,6 +5,5 @@ func GetPlatformDefaultConfig() []byte {
return []byte(
`os:
openCommand: 'cmd /c "start "" {{filename}}"'
- openLinkCommand: 'cmd /c "start "" {{link}}"'
- copyToClipboardCommand: 'cmd \c "echo -n {{str}} > /dev/clipboard"'`)
+ openLinkCommand: 'cmd /c "start "" {{link}}"'`)
}
diff --git a/vendor/github.com/atotto/clipboard/LICENSE b/vendor/github.com/atotto/clipboard/LICENSE
new file mode 100644
index 000000000..dee3257b0
--- /dev/null
+++ b/vendor/github.com/atotto/clipboard/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2013 Ato Araki. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of @atotto. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/atotto/clipboard/README.md b/vendor/github.com/atotto/clipboard/README.md
new file mode 100644
index 000000000..41fdd57b8
--- /dev/null
+++ b/vendor/github.com/atotto/clipboard/README.md
@@ -0,0 +1,48 @@
+[![Build Status](https://travis-ci.org/atotto/clipboard.svg?branch=master)](https://travis-ci.org/atotto/clipboard)
+
+[![GoDoc](https://godoc.org/github.com/atotto/clipboard?status.svg)](http://godoc.org/github.com/atotto/clipboard)
+
+# Clipboard for Go
+
+Provide copying and pasting to the Clipboard for Go.
+
+Build:
+
+ $ go get github.com/atotto/clipboard
+
+Platforms:
+
+* OSX
+* Windows 7 (probably work on other Windows)
+* Linux, Unix (requires 'xclip' or 'xsel' command to be installed)
+
+
+Document:
+
+* http://godoc.org/github.com/atotto/clipboard
+
+Notes:
+
+* Text string only
+* UTF-8 text encoding only (no conversion)
+
+TODO:
+
+* Clipboard watcher(?)
+
+## Commands:
+
+paste shell command:
+
+ $ go get github.com/atotto/clipboard/cmd/gopaste
+ $ # example:
+ $ gopaste > document.txt
+
+copy shell command:
+
+ $ go get github.com/atotto/clipboard/cmd/gocopy
+ $ # example:
+ $ cat document.txt | gocopy
+
+
+
diff --git a/vendor/github.com/atotto/clipboard/clipboard.go b/vendor/github.com/atotto/clipboard/clipboard.go
new file mode 100644
index 000000000..d7907d3a7
--- /dev/null
+++ b/vendor/github.com/atotto/clipboard/clipboard.go
@@ -0,0 +1,20 @@
+// Copyright 2013 @atotto. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package clipboard read/write on clipboard
+package clipboard
+
+// ReadAll read string from clipboard
+func ReadAll() (string, error) {
+ return readAll()
+}
+
+// WriteAll write string to clipboard
+func WriteAll(text string) error {
+ return writeAll(text)
+}
+
+// Unsupported might be set true during clipboard init, to help callers decide
+// whether or not to offer clipboard options.
+var Unsupported bool
diff --git a/vendor/github.com/atotto/clipboard/clipboard_darwin.go b/vendor/github.com/atotto/clipboard/clipboard_darwin.go
new file mode 100644
index 000000000..6f33078db
--- /dev/null
+++ b/vendor/github.com/atotto/clipboard/clipboard_darwin.go
@@ -0,0 +1,52 @@
+// Copyright 2013 @atotto. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin
+
+package clipboard
+
+import (
+ "os/exec"
+)
+
+var (
+ pasteCmdArgs = "pbpaste"
+ copyCmdArgs = "pbcopy"
+)
+
+func getPasteCommand() *exec.Cmd {
+ return exec.Command(pasteCmdArgs)
+}
+
+func getCopyCommand() *exec.Cmd {
+ return exec.Command(copyCmdArgs)
+}
+
+func readAll() (string, error) {
+ pasteCmd := getPasteCommand()
+ out, err := pasteCmd.Output()
+ if err != nil {
+ return "", err
+ }
+ return string(out), nil
+}
+
+func writeAll(text string) error {
+ copyCmd := getCopyCommand()
+ in, err := copyCmd.StdinPipe()
+ if err != nil {
+ return err
+ }
+
+ if err := copyCmd.Start(); err != nil {
+ return err
+ }
+ if _, err := in.Write([]byte(text)); err != nil {
+ return err
+ }
+ if err := in.Close(); err != nil {
+ return err
+ }
+ return copyCmd.Wait()
+}
diff --git a/vendor/github.com/atotto/clipboard/clipboard_unix.go b/vendor/github.com/atotto/clipboard/clipboard_unix.go
new file mode 100644
index 000000000..8f5e23c37
--- /dev/null
+++ b/vendor/github.com/atotto/clipboard/clipboard_unix.go
@@ -0,0 +1,129 @@
+// Copyright 2013 @atotto. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build freebsd linux netbsd openbsd solaris dragonfly
+
+package clipboard
+
+import (
+ "errors"
+ "os"
+ "os/exec"
+)
+
+const (
+ xsel = "xsel"
+ xclip = "xclip"
+ wlcopy = "wl-copy"
+ wlpaste = "wl-paste"
+ termuxClipboardGet = "termux-clipboard-get"
+ termuxClipboardSet = "termux-clipboard-set"
+)
+
+var (
+ Primary bool
+
+ pasteCmdArgs []string
+ copyCmdArgs []string
+
+ xselPasteArgs = []string{xsel, "--output", "--clipboard"}
+ xselCopyArgs = []string{xsel, "--input", "--clipboard"}
+
+ xclipPasteArgs = []string{xclip, "-out", "-selection", "clipboard"}
+ xclipCopyArgs = []string{xclip, "-in", "-selection", "clipboard"}
+
+ wlpasteArgs = []string{wlpaste, "--no-newline"}
+ wlcopyArgs = []string{wlcopy}
+
+ termuxPasteArgs = []string{termuxClipboardGet}
+ termuxCopyArgs = []string{termuxClipboardSet}
+
+ missingCommands = errors.New("No clipboard utilities available. Please install xsel, xclip, wl-clipboard or Termux:API add-on for termux-clipboard-get/set.")
+)
+
+func init() {
+ if os.Getenv("WAYLAND_DISPLAY") != "" {
+ pasteCmdArgs = wlpasteArgs;
+ copyCmdArgs = wlcopyArgs;
+
+ if _, err := exec.LookPath(wlcopy); err == nil {
+ if _, err := exec.LookPath(wlpaste); err == nil {
+ return
+ }
+ }
+ }
+
+ pasteCmdArgs = xclipPasteArgs
+ copyCmdArgs = xclipCopyArgs
+
+ if _, err := exec.LookPath(xclip); err == nil {
+ return
+ }
+
+ pasteCmdArgs = xselPasteArgs
+ copyCmdArgs = xselCopyArgs
+
+ if _, err := exec.LookPath(xsel); err == nil {
+ return
+ }
+
+ pasteCmdArgs = termuxPasteArgs
+ copyCmdArgs = termuxCopyArgs
+
+ if _, err := exec.LookPath(termuxClipboardSet); err == nil {
+ if _, err := exec.LookPath(termuxClipboardGet); err == nil {
+ return
+ }
+ }
+
+ Unsupported = true
+}
+
+func getPasteCommand() *exec.Cmd {
+ if Primary {
+ pasteCmdArgs = pasteCmdArgs[:1]
+ }
+ return exec.Command(pasteCmdArgs[0], pasteCmdArgs[1:]...)
+}
+
+func getCopyCommand() *exec.Cmd {
+ if Primary {
+ copyCmdArgs = copyCmdArgs[:1]
+ }
+ return exec.Command(copyCmdArgs[0], copyCmdArgs[1:]...)
+}
+
+func readAll() (string, error) {
+ if Unsupported {
+ return "", missingCommands
+ }
+ pasteCmd := getPasteCommand()
+ out, err := pasteCmd.Output()
+ if err != nil {
+ return "", err
+ }
+ return string(out), nil
+}
+
+func writeAll(text string) error {
+ if Unsupported {
+ return missingCommands
+ }
+ copyCmd := getCopyCommand()
+ in, err := copyCmd.StdinPipe()
+ if err != nil {
+ return err
+ }
+
+ if err := copyCmd.Start(); err != nil {
+ return err
+ }
+ if _, err := in.Write([]byte(text)); err != nil {
+ return err
+ }
+ if err := in.Close(); err != nil {
+ return err
+ }
+ return copyCmd.Wait()
+}
diff --git a/vendor/github.com/atotto/clipboard/clipboard_windows.go b/vendor/github.com/atotto/clipboard/clipboard_windows.go
new file mode 100644
index 000000000..4b4aedb66
--- /dev/null
+++ b/vendor/github.com/atotto/clipboard/clipboard_windows.go
@@ -0,0 +1,128 @@
+// Copyright 2013 @atotto. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build windows
+
+package clipboard
+
+import (
+ "syscall"
+ "time"
+ "unsafe"
+)
+
+const (
+ cfUnicodetext = 13
+ gmemMoveable = 0x0002
+)
+
+var (
+ user32 = syscall.MustLoadDLL("user32")
+ openClipboard = user32.MustFindProc("OpenClipboard")
+ closeClipboard = user32.MustFindProc("CloseClipboard")
+ emptyClipboard = user32.MustFindProc("EmptyClipboard")
+ getClipboardData = user32.MustFindProc("GetClipboardData")
+ setClipboardData = user32.MustFindProc("SetClipboardData")
+
+ kernel32 = syscall.NewLazyDLL("kernel32")
+ globalAlloc = kernel32.NewProc("GlobalAlloc")
+ globalFree = kernel32.NewProc("GlobalFree")
+ globalLock = kernel32.NewProc("GlobalLock")
+ globalUnlock = kernel32.NewProc("GlobalUnlock")
+ lstrcpy = kernel32.NewProc("lstrcpyW")
+)
+
+// waitOpenClipboard opens the clipboard, waiting for up to a second to do so.
+func waitOpenClipboard() error {
+ started := time.Now()
+ limit := started.Add(time.Second)
+ var r uintptr
+ var err error
+ for time.Now().Before(limit) {
+ r, _, err = openClipboard.Call(0)
+ if r != 0 {
+ return nil
+ }
+ time.Sleep(time.Millisecond)
+ }
+ return err
+}
+
+func readAll() (string, error) {
+ err := waitOpenClipboard()
+ if err != nil {
+ return "", err
+ }
+ defer closeClipboard.Call()
+
+ h, _, err := getClipboardData.Call(cfUnicodetext)
+ if h == 0 {
+ return "", err
+ }
+
+ l, _, err := globalLock.Call(h)
+ if l == 0 {
+ return "", err
+ }
+
+ text := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(l))[:])
+
+ r, _, err := globalUnlock.Call(h)
+ if r == 0 {
+ return "", err
+ }
+
+ return text, nil
+}
+
+func writeAll(text string) error {
+ err := waitOpenClipboard()
+ if err != nil {
+ return err
+ }
+ defer closeClipboard.Call()
+
+ r, _, err := emptyClipboard.Call(0)
+ if r == 0 {
+ return err
+ }
+
+ data := syscall.StringToUTF16(text)
+
+ // "If the hMem parameter identifies a memory object, the object must have
+ // been allocated using the function with the GMEM_MOVEABLE flag."
+ h, _, err := globalAlloc.Call(gmemMoveable, uintptr(len(data)*int(unsafe.Sizeof(data[0]))))
+ if h == 0 {
+ return err
+ }
+ defer func() {
+ if h != 0 {
+ globalFree.Call(h)
+ }
+ }()
+
+ l, _, err := globalLock.Call(h)
+ if l == 0 {
+ return err
+ }
+
+ r, _, err = lstrcpy.Call(l, uintptr(unsafe.Pointer(&data[0])))
+ if r == 0 {
+ return err
+ }
+
+ r, _, err = globalUnlock.Call(h)
+ if r == 0 {
+ if err.(syscall.Errno) != 0 {
+ return err
+ }
+ }
+
+ r, _, err = setClipboardData.Call(cfUnicodetext, h)
+ if r == 0 {
+ return err
+ }
+ h = 0 // suppress deferred cleanup
+ return nil
+}
diff --git a/vendor/github.com/atotto/clipboard/go.mod b/vendor/github.com/atotto/clipboard/go.mod
new file mode 100644
index 000000000..68ec980e7
--- /dev/null
+++ b/vendor/github.com/atotto/clipboard/go.mod
@@ -0,0 +1 @@
+module github.com/atotto/clipboard
diff --git a/vendor/modules.txt b/vendor/modules.txt
index b43d422ef..5ae9c351f 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1,3 +1,6 @@
+# github.com/atotto/clipboard v0.1.2
+## explicit
+github.com/atotto/clipboard
# github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21
## explicit
github.com/cloudfoundry/jibber_jabber