mirror of
https://gitea.com/Sirherobrine23/tea.git
synced 2024-08-23 09:34:07 +00:00
Merge branch 'master' into issue-97/pulls-clean vendor terminal dependency pull/push: provide authentication method automatically select an AuthMethod according to the remote url type. If required, credentials are prompted for login: store username & optional keyfile refactor refactor GetRemote Merge branch 'master' into issue-97/pulls-clean adress code review add --ignore-sha flag When set, the local branch is not matched against the remote sha, but the remote branch name. This makes the command more flexible with diverging branches. add missing error check fix branch-not-found case Merge branch 'master' into issue-97/pulls-clean use directory namespaces for branches & remotes fix TeaCreateBranch() improve method of TeaFindBranch() now only checking .git/refs instead of looking up .git/config which may not list the branch add `tea pulls clean` fixes #97 add copyright to new files make linter happy refactor: use new git functions for old code add `tea pulls checkout` Co-authored-by: Norwin Roosen <git@nroo.de> Co-authored-by: Norwin <git@nroo.de> Reviewed-on: https://gitea.com/gitea/tea/pulls/105 Reviewed-by: 6543 <6543@noreply.gitea.io> Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com>
125 lines
3.2 KiB
Go
125 lines
3.2 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build solaris
|
|
|
|
package terminal // import "golang.org/x/crypto/ssh/terminal"
|
|
|
|
import (
|
|
"golang.org/x/sys/unix"
|
|
"io"
|
|
"syscall"
|
|
)
|
|
|
|
// State contains the state of a terminal.
|
|
type State struct {
|
|
termios unix.Termios
|
|
}
|
|
|
|
// IsTerminal returns whether the given file descriptor is a terminal.
|
|
func IsTerminal(fd int) bool {
|
|
_, err := unix.IoctlGetTermio(fd, unix.TCGETA)
|
|
return err == nil
|
|
}
|
|
|
|
// ReadPassword reads a line of input from a terminal without local echo. This
|
|
// is commonly used for inputting passwords and other sensitive data. The slice
|
|
// returned does not include the \n.
|
|
func ReadPassword(fd int) ([]byte, error) {
|
|
// see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c
|
|
val, err := unix.IoctlGetTermios(fd, unix.TCGETS)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
oldState := *val
|
|
|
|
newState := oldState
|
|
newState.Lflag &^= syscall.ECHO
|
|
newState.Lflag |= syscall.ICANON | syscall.ISIG
|
|
newState.Iflag |= syscall.ICRNL
|
|
err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState)
|
|
|
|
var buf [16]byte
|
|
var ret []byte
|
|
for {
|
|
n, err := syscall.Read(fd, buf[:])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if n == 0 {
|
|
if len(ret) == 0 {
|
|
return nil, io.EOF
|
|
}
|
|
break
|
|
}
|
|
if buf[n-1] == '\n' {
|
|
n--
|
|
}
|
|
ret = append(ret, buf[:n]...)
|
|
if n < len(buf) {
|
|
break
|
|
}
|
|
}
|
|
|
|
return ret, nil
|
|
}
|
|
|
|
// MakeRaw puts the terminal connected to the given file descriptor into raw
|
|
// mode and returns the previous state of the terminal so that it can be
|
|
// restored.
|
|
// see http://cr.illumos.org/~webrev/andy_js/1060/
|
|
func MakeRaw(fd int) (*State, error) {
|
|
termios, err := unix.IoctlGetTermios(fd, unix.TCGETS)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
oldState := State{termios: *termios}
|
|
|
|
termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
|
|
termios.Oflag &^= unix.OPOST
|
|
termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
|
|
termios.Cflag &^= unix.CSIZE | unix.PARENB
|
|
termios.Cflag |= unix.CS8
|
|
termios.Cc[unix.VMIN] = 1
|
|
termios.Cc[unix.VTIME] = 0
|
|
|
|
if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &oldState, nil
|
|
}
|
|
|
|
// Restore restores the terminal connected to the given file descriptor to a
|
|
// previous state.
|
|
func Restore(fd int, oldState *State) error {
|
|
return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios)
|
|
}
|
|
|
|
// GetState returns the current state of a terminal which may be useful to
|
|
// restore the terminal after a signal.
|
|
func GetState(fd int) (*State, error) {
|
|
termios, err := unix.IoctlGetTermios(fd, unix.TCGETS)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &State{termios: *termios}, nil
|
|
}
|
|
|
|
// GetSize returns the dimensions of the given terminal.
|
|
func GetSize(fd int) (width, height int, err error) {
|
|
ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
return int(ws.Col), int(ws.Row), nil
|
|
}
|