forked from toolshed/abra
		
	We were running behind and there were quite some deprecations to update. This was mostly in the upstream copy/pasta package but seems quite minimal.
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package terminfo
 | 
						|
 | 
						|
import (
 | 
						|
	"os"
 | 
						|
	"os/user"
 | 
						|
	"path"
 | 
						|
	"strings"
 | 
						|
	"sync"
 | 
						|
)
 | 
						|
 | 
						|
// termCache is the terminfo cache.
 | 
						|
var termCache = struct {
 | 
						|
	db map[string]*Terminfo
 | 
						|
	sync.RWMutex
 | 
						|
}{
 | 
						|
	db: make(map[string]*Terminfo),
 | 
						|
}
 | 
						|
 | 
						|
// Load follows the behavior described in terminfo(5) to find correct the
 | 
						|
// terminfo file using the name, reads the file and then returns a Terminfo
 | 
						|
// struct that describes the file.
 | 
						|
func Load(name string) (*Terminfo, error) {
 | 
						|
	if name == "" {
 | 
						|
		return nil, ErrEmptyTermName
 | 
						|
	}
 | 
						|
	termCache.RLock()
 | 
						|
	ti, ok := termCache.db[name]
 | 
						|
	termCache.RUnlock()
 | 
						|
	if ok {
 | 
						|
		return ti, nil
 | 
						|
	}
 | 
						|
	var checkDirs []string
 | 
						|
	// check $TERMINFO
 | 
						|
	if dir := os.Getenv("TERMINFO"); dir != "" {
 | 
						|
		checkDirs = append(checkDirs, dir)
 | 
						|
	}
 | 
						|
	// check $HOME/.terminfo
 | 
						|
	u, err := user.Current()
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	checkDirs = append(checkDirs, path.Join(u.HomeDir, ".terminfo"))
 | 
						|
	// check $TERMINFO_DIRS
 | 
						|
	if dirs := os.Getenv("TERMINFO_DIRS"); dirs != "" {
 | 
						|
		checkDirs = append(checkDirs, strings.Split(dirs, ":")...)
 | 
						|
	}
 | 
						|
	// check fallback directories
 | 
						|
	checkDirs = append(checkDirs, "/etc/terminfo", "/lib/terminfo", "/usr/share/terminfo")
 | 
						|
	for _, dir := range checkDirs {
 | 
						|
		ti, err = Open(dir, name)
 | 
						|
		if err != nil && err != ErrFileNotFound && !os.IsNotExist(err) {
 | 
						|
			return nil, err
 | 
						|
		} else if err == nil {
 | 
						|
			return ti, nil
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return nil, ErrDatabaseDirectoryNotFound
 | 
						|
}
 | 
						|
 | 
						|
// LoadFromEnv loads the terminal info based on the name contained in
 | 
						|
// environment variable TERM.
 | 
						|
func LoadFromEnv() (*Terminfo, error) {
 | 
						|
	return Load(os.Getenv("TERM"))
 | 
						|
}
 |