-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsegment-git.go
89 lines (77 loc) · 2.46 KB
/
segment-git.go
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
// Copyright 2016-2018, psh project Authors.
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with this
// work for additional information regarding copyright ownership. The ASF
// licenses this file to you 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.
package psh
import (
"bytes"
"fmt"
"os/exec"
"strings"
)
const (
// SegmentGitBackground is the background color to use
SegmentGitBackground = 148 // #afd700
// SegmentGitBackgroundR ...
SegmentGitBackgroundR = 160
// SegmentGitBackgroundG ...
SegmentGitBackgroundG = 180
// SegmentGitBackgroundB ...
SegmentGitBackgroundB = 117
// SegmentGitForeground is the foreground color to use
SegmentGitForeground = 0 // #000000
)
// SegmentGit implements the git SCM partial of the prompt.
//
// It renders the current branch if the folder contains a repository.
//
// TODO:
// * git rev-parse --show-toplevel : shows root of the repo
// * git status --porcelain -b : shows conmplete status of the repo
type SegmentGit struct {
Data []byte
}
// NewSegmentGit creates an instace of SegmentGit type.
func NewSegmentGit() *SegmentGit {
segment := &SegmentGit{}
return segment
}
// Compile collects the data for this segment.
func (s *SegmentGit) Compile() {
currentBranch := getCurrentBranch()
s.Data = []byte(currentBranch)
}
// Render renders the segment results.
func (s *SegmentGit) Render() []byte {
var b bytes.Buffer
if len(s.Data) != 0 {
b.Write(SetTrueColorBackground(SegmentGitBackgroundR, SegmentGitBackgroundG, SegmentGitBackgroundB))
fmt.Fprint(&b, " ")
b.Write(SetForeground(SegmentGitForeground))
b.Write(s.Data)
b.Write(ResetForeground())
fmt.Fprint(&b, " ")
}
return b.Bytes()
}
func getCurrentBranch() string {
command := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD")
commandOut, err := command.Output()
if err != nil {
return ""
}
currentBranch := strings.Trim(string(commandOut), "\n")
return currentBranch
}