OSDN Git Service

fix make release for windows (#512)
authorYongfeng LI <wliyongfeng@gmail.com>
Mon, 2 Apr 2018 06:39:38 +0000 (14:39 +0800)
committerGitHub <noreply@github.com>
Mon, 2 Apr 2018 06:39:38 +0000 (14:39 +0800)
vendor/github.com/inconshreveable/mousetrap.a [deleted file]
vendor/github.com/inconshreveable/mousetrap/LICENSE [new file with mode: 0644]
vendor/github.com/inconshreveable/mousetrap/README.md [new file with mode: 0644]
vendor/github.com/inconshreveable/mousetrap/trap_others.go [new file with mode: 0644]
vendor/github.com/inconshreveable/mousetrap/trap_windows.go [new file with mode: 0644]
vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go [new file with mode: 0644]

diff --git a/vendor/github.com/inconshreveable/mousetrap.a b/vendor/github.com/inconshreveable/mousetrap.a
deleted file mode 100644 (file)
index 5d3fbef..0000000
Binary files a/vendor/github.com/inconshreveable/mousetrap.a and /dev/null differ
diff --git a/vendor/github.com/inconshreveable/mousetrap/LICENSE b/vendor/github.com/inconshreveable/mousetrap/LICENSE
new file mode 100644 (file)
index 0000000..5f0d1fb
--- /dev/null
@@ -0,0 +1,13 @@
+Copyright 2014 Alan Shreve
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/vendor/github.com/inconshreveable/mousetrap/README.md b/vendor/github.com/inconshreveable/mousetrap/README.md
new file mode 100644 (file)
index 0000000..7a950d1
--- /dev/null
@@ -0,0 +1,23 @@
+# mousetrap
+
+mousetrap is a tiny library that answers a single question.
+
+On a Windows machine, was the process invoked by someone double clicking on
+the executable file while browsing in explorer?
+
+### Motivation
+
+Windows developers unfamiliar with command line tools will often "double-click"
+the executable for a tool. Because most CLI tools print the help and then exit
+when invoked without arguments, this is often very frustrating for those users.
+
+mousetrap provides a way to detect these invocations so that you can provide
+more helpful behavior and instructions on how to run the CLI tool. To see what
+this looks like, both from an organizational and a technical perspective, see
+https://inconshreveable.com/09-09-2014/sweat-the-small-stuff/
+
+### The interface
+
+The library exposes a single interface:
+
+    func StartedByExplorer() (bool)
diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_others.go b/vendor/github.com/inconshreveable/mousetrap/trap_others.go
new file mode 100644 (file)
index 0000000..9d2d8a4
--- /dev/null
@@ -0,0 +1,15 @@
+// +build !windows
+
+package mousetrap
+
+// StartedByExplorer returns true if the program was invoked by the user
+// double-clicking on the executable from explorer.exe
+//
+// It is conservative and returns false if any of the internal calls fail.
+// It does not guarantee that the program was run from a terminal. It only can tell you
+// whether it was launched from explorer.exe
+//
+// On non-Windows platforms, it always returns false.
+func StartedByExplorer() bool {
+       return false
+}
diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_windows.go b/vendor/github.com/inconshreveable/mousetrap/trap_windows.go
new file mode 100644 (file)
index 0000000..336142a
--- /dev/null
@@ -0,0 +1,98 @@
+// +build windows
+// +build !go1.4
+
+package mousetrap
+
+import (
+       "fmt"
+       "os"
+       "syscall"
+       "unsafe"
+)
+
+const (
+       // defined by the Win32 API
+       th32cs_snapprocess uintptr = 0x2
+)
+
+var (
+       kernel                   = syscall.MustLoadDLL("kernel32.dll")
+       CreateToolhelp32Snapshot = kernel.MustFindProc("CreateToolhelp32Snapshot")
+       Process32First           = kernel.MustFindProc("Process32FirstW")
+       Process32Next            = kernel.MustFindProc("Process32NextW")
+)
+
+// ProcessEntry32 structure defined by the Win32 API
+type processEntry32 struct {
+       dwSize              uint32
+       cntUsage            uint32
+       th32ProcessID       uint32
+       th32DefaultHeapID   int
+       th32ModuleID        uint32
+       cntThreads          uint32
+       th32ParentProcessID uint32
+       pcPriClassBase      int32
+       dwFlags             uint32
+       szExeFile           [syscall.MAX_PATH]uint16
+}
+
+func getProcessEntry(pid int) (pe *processEntry32, err error) {
+       snapshot, _, e1 := CreateToolhelp32Snapshot.Call(th32cs_snapprocess, uintptr(0))
+       if snapshot == uintptr(syscall.InvalidHandle) {
+               err = fmt.Errorf("CreateToolhelp32Snapshot: %v", e1)
+               return
+       }
+       defer syscall.CloseHandle(syscall.Handle(snapshot))
+
+       var processEntry processEntry32
+       processEntry.dwSize = uint32(unsafe.Sizeof(processEntry))
+       ok, _, e1 := Process32First.Call(snapshot, uintptr(unsafe.Pointer(&processEntry)))
+       if ok == 0 {
+               err = fmt.Errorf("Process32First: %v", e1)
+               return
+       }
+
+       for {
+               if processEntry.th32ProcessID == uint32(pid) {
+                       pe = &processEntry
+                       return
+               }
+
+               ok, _, e1 = Process32Next.Call(snapshot, uintptr(unsafe.Pointer(&processEntry)))
+               if ok == 0 {
+                       err = fmt.Errorf("Process32Next: %v", e1)
+                       return
+               }
+       }
+}
+
+func getppid() (pid int, err error) {
+       pe, err := getProcessEntry(os.Getpid())
+       if err != nil {
+               return
+       }
+
+       pid = int(pe.th32ParentProcessID)
+       return
+}
+
+// StartedByExplorer returns true if the program was invoked by the user double-clicking
+// on the executable from explorer.exe
+//
+// It is conservative and returns false if any of the internal calls fail.
+// It does not guarantee that the program was run from a terminal. It only can tell you
+// whether it was launched from explorer.exe
+func StartedByExplorer() bool {
+       ppid, err := getppid()
+       if err != nil {
+               return false
+       }
+
+       pe, err := getProcessEntry(ppid)
+       if err != nil {
+               return false
+       }
+
+       name := syscall.UTF16ToString(pe.szExeFile[:])
+       return name == "explorer.exe"
+}
diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go b/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go
new file mode 100644 (file)
index 0000000..9a28e57
--- /dev/null
@@ -0,0 +1,46 @@
+// +build windows
+// +build go1.4
+
+package mousetrap
+
+import (
+       "os"
+       "syscall"
+       "unsafe"
+)
+
+func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) {
+       snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0)
+       if err != nil {
+               return nil, err
+       }
+       defer syscall.CloseHandle(snapshot)
+       var procEntry syscall.ProcessEntry32
+       procEntry.Size = uint32(unsafe.Sizeof(procEntry))
+       if err = syscall.Process32First(snapshot, &procEntry); err != nil {
+               return nil, err
+       }
+       for {
+               if procEntry.ProcessID == uint32(pid) {
+                       return &procEntry, nil
+               }
+               err = syscall.Process32Next(snapshot, &procEntry)
+               if err != nil {
+                       return nil, err
+               }
+       }
+}
+
+// StartedByExplorer returns true if the program was invoked by the user double-clicking
+// on the executable from explorer.exe
+//
+// It is conservative and returns false if any of the internal calls fail.
+// It does not guarantee that the program was run from a terminal. It only can tell you
+// whether it was launched from explorer.exe
+func StartedByExplorer() bool {
+       pe, err := getProcessEntry(os.Getppid())
+       if err != nil {
+               return false
+       }
+       return "explorer.exe" == syscall.UTF16ToString(pe.ExeFile[:])
+}