aboutsummaryrefslogtreecommitdiff
path: root/pkg/prompt/pwd.go
blob: 77642c6a76da1963edb7dba44195cccd93f4a76c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*******************************************************************************
*
* Copyright 2017 Stefan Majewsky <majewsky@gmx.net>
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
*******************************************************************************/

package prompt

import (
	"os"
	"path/filepath"
	"strings"
)

//Directory contains all data about a directory that the prompt needs.
type Directory struct {
	Path        string
	DisplayPath string
	InBuildTree bool
	InRepoTree  bool
	// RepoRootPath string
	// LastAccessiblePath string
}

//CurrentDirectory prepares a Directory struct for the current working
//directory.
func CurrentDirectory() Directory {
	cwd, err := os.Getwd()
	if err != nil {
		cwd = filepath.Clean(os.Getenv("PWD"))
	}
	return NewDirectory(cwd)
}

//NewDirectory prepares a Directory struct for the given path.
func NewDirectory(path string) (dir Directory) {
	dir.Path = path
	dir.DisplayPath = path

	//display tag if below /x/build
	if buildPath := os.Getenv("BUILD_ROOT"); buildPath != "" {
		rel, _ := filepath.Rel(buildPath, dir.DisplayPath)
		if !strings.HasPrefix(rel, "..") && rel != "." {
			dir.InBuildTree = true
			dir.DisplayPath = filepath.Join("/", rel)
		}
	}

	//display tag if below /x/src
	if gopath := os.Getenv("GOPATH"); gopath != "" {
		repoPath := filepath.Join(gopath, "src")
		rel, _ := filepath.Rel(repoPath, dir.DisplayPath)
		if !strings.HasPrefix(rel, "..") && rel != "." {
			dir.InRepoTree = true
			dir.DisplayPath = rel
		}
	}

	dir.stripHomeDirFromDisplay()
	return
}

//This part can benefit from a "return" in the middle, so it's in a separate function.
func (dir *Directory) stripHomeDirFromDisplay() {
	if !strings.HasPrefix(dir.DisplayPath, "/") {
		return
	}

	homePath := os.Getenv("HOME")
	if homePath == "" {
		return
	}

	rel, _ := filepath.Rel(homePath, dir.DisplayPath)
	if rel == "." {
		//do not display an empty DisplayPath if tags are displayed
		if dir.InBuildTree || dir.InRepoTree {
			return
		}
		rel = ""
	}
	if !strings.HasPrefix(rel, "..") {
		dir.DisplayPath = rel
	}
}

func getDirectoryField(dir Directory) string {
	if dir.DisplayPath == "" {
		return ""
	}

	txt := withColor("1;36", dir.DisplayPath)
	if dir.InRepoTree {
		txt = withType("repo", txt)
	}
	if dir.InBuildTree {
		txt = withType("build", txt)
	}
	return txt
}