diff options
author | Unknwon <u@gogs.io> | 2017-02-28 22:58:52 -0500 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2017-02-28 22:58:52 -0500 |
commit | e08161a3021236d8249a3b426967666b916f7d1e (patch) | |
tree | 647b867b51b25609ae826ca3c5a6389d77c79322 /vendor/github.com/gogits | |
parent | 341eafcf0490a1cb1d9f1e407c8194685d34c26c (diff) |
hook: fix can’t be executed while run as service on Windows (#4207)
Diffstat (limited to 'vendor/github.com/gogits')
-rw-r--r-- | vendor/github.com/gogits/minwinsvc/LICENSE | 20 | ||||
-rw-r--r-- | vendor/github.com/gogits/minwinsvc/README.md | 18 | ||||
-rw-r--r-- | vendor/github.com/gogits/minwinsvc/minwinsvc.go | 18 | ||||
-rw-r--r-- | vendor/github.com/gogits/minwinsvc/svc_other.go | 11 | ||||
-rw-r--r-- | vendor/github.com/gogits/minwinsvc/svc_windows.go | 72 |
5 files changed, 139 insertions, 0 deletions
diff --git a/vendor/github.com/gogits/minwinsvc/LICENSE b/vendor/github.com/gogits/minwinsvc/LICENSE new file mode 100644 index 00000000..fce91b4e --- /dev/null +++ b/vendor/github.com/gogits/minwinsvc/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2015 Daniel Theophanes + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. diff --git a/vendor/github.com/gogits/minwinsvc/README.md b/vendor/github.com/gogits/minwinsvc/README.md new file mode 100644 index 00000000..260dceea --- /dev/null +++ b/vendor/github.com/gogits/minwinsvc/README.md @@ -0,0 +1,18 @@ +### Minimal windows service stub + +Programs designed to run from most *nix style operating systems +can import this package to enable running programs as services without modifying +them. + +``` +import _ "github.com/kardianos/minwinsvc" +``` + +If you need more control over the exit behavior, set +``` +minwinsvc.SetOnExit(func() { + // Do something. + // Within 10 seconds call: + os.Exit(0) +}) +``` diff --git a/vendor/github.com/gogits/minwinsvc/minwinsvc.go b/vendor/github.com/gogits/minwinsvc/minwinsvc.go new file mode 100644 index 00000000..057ba7f9 --- /dev/null +++ b/vendor/github.com/gogits/minwinsvc/minwinsvc.go @@ -0,0 +1,18 @@ +// Copyright 2015 Daniel Theophanes. +// Use of this source code is governed by a zlib-style +// license that can be found in the LICENSE file.package service + +// Minimal non-invasive windows only service stub. +// +// Import to allow running as a windows service. +// import _ "github.com/kardianos/minwinsvc" +// This will detect if running as a windows service +// and install required callbacks for windows. +package minwinsvc + +// SetOnExit sets the function to be called when the windows service +// requests an exit. If this is not called, or if it is called where +// f == nil, then it defaults to calling "os.Exit(0)". +func SetOnExit(f func()) { + setOnExit(f) +} diff --git a/vendor/github.com/gogits/minwinsvc/svc_other.go b/vendor/github.com/gogits/minwinsvc/svc_other.go new file mode 100644 index 00000000..197d3002 --- /dev/null +++ b/vendor/github.com/gogits/minwinsvc/svc_other.go @@ -0,0 +1,11 @@ +// Copyright 2015 Daniel Theophanes. +// Use of this source code is governed by a zlib-style +// license that can be found in the LICENSE file.package service + +//+build !windows + +package minwinsvc + +func setOnExit(f func()) { + // Nothing. +} diff --git a/vendor/github.com/gogits/minwinsvc/svc_windows.go b/vendor/github.com/gogits/minwinsvc/svc_windows.go new file mode 100644 index 00000000..e79755fa --- /dev/null +++ b/vendor/github.com/gogits/minwinsvc/svc_windows.go @@ -0,0 +1,72 @@ +// Copyright 2015 Daniel Theophanes. +// Use of this source code is governed by a zlib-style +// license that can be found in the LICENSE file.package service + +//+build windows + +package minwinsvc + +import ( + "os" + "sync" + + "golang.org/x/sys/windows/svc" +) + +var ( + onExit func() + guard sync.Mutex +) + +func init() { + interactive, err := svc.IsAnInteractiveSession() + if err != nil { + panic(err) + } + // While run as Windows service, it is not an interactive session, + // but we don't want hook execute to be treated as service, e.g. gogs.exe hook pre-receive. + if interactive || len(os.Getenv("SSH_ORIGINAL_COMMAND")) > 0 { + return + } + go func() { + _ = svc.Run("", runner{}) + + guard.Lock() + f := onExit + guard.Unlock() + + // Don't hold this lock in user code. + if f != nil { + f() + } + // Make sure we exit. + os.Exit(0) + }() +} + +func setOnExit(f func()) { + guard.Lock() + onExit = f + guard.Unlock() +} + +type runner struct{} + +func (runner) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (bool, uint32) { + const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown + changes <- svc.Status{State: svc.StartPending} + + changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} + for { + c := <-r + switch c.Cmd { + case svc.Interrogate: + changes <- c.CurrentStatus + case svc.Stop, svc.Shutdown: + changes <- svc.Status{State: svc.StopPending} + return false, 0 + } + } + + return false, 0 +} |