80 lines
2 KiB
Go
80 lines
2 KiB
Go
|
package git
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"fmt"
|
||
|
"path/filepath"
|
||
|
)
|
||
|
|
||
|
// Status represents the current status of a Worktree.
|
||
|
// The key of the map is the path of the file.
|
||
|
type Status map[string]*FileStatus
|
||
|
|
||
|
// File returns the FileStatus for a given path, if the FileStatus doesn't
|
||
|
// exists a new FileStatus is added to the map using the path as key.
|
||
|
func (s Status) File(path string) *FileStatus {
|
||
|
if _, ok := (s)[path]; !ok {
|
||
|
s[path] = &FileStatus{Worktree: Untracked, Staging: Untracked}
|
||
|
}
|
||
|
|
||
|
return s[path]
|
||
|
}
|
||
|
|
||
|
// IsUntracked checks if file for given path is 'Untracked'
|
||
|
func (s Status) IsUntracked(path string) bool {
|
||
|
stat, ok := (s)[filepath.ToSlash(path)]
|
||
|
return ok && stat.Worktree == Untracked
|
||
|
}
|
||
|
|
||
|
// IsClean returns true if all the files are in Unmodified status.
|
||
|
func (s Status) IsClean() bool {
|
||
|
for _, status := range s {
|
||
|
if status.Worktree != Unmodified || status.Staging != Unmodified {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
func (s Status) String() string {
|
||
|
buf := bytes.NewBuffer(nil)
|
||
|
for path, status := range s {
|
||
|
if status.Staging == Unmodified && status.Worktree == Unmodified {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if status.Staging == Renamed {
|
||
|
path = fmt.Sprintf("%s -> %s", path, status.Extra)
|
||
|
}
|
||
|
|
||
|
fmt.Fprintf(buf, "%c%c %s\n", status.Staging, status.Worktree, path)
|
||
|
}
|
||
|
|
||
|
return buf.String()
|
||
|
}
|
||
|
|
||
|
// FileStatus contains the status of a file in the worktree
|
||
|
type FileStatus struct {
|
||
|
// Staging is the status of a file in the staging area
|
||
|
Staging StatusCode
|
||
|
// Worktree is the status of a file in the worktree
|
||
|
Worktree StatusCode
|
||
|
// Extra contains extra information, such as the previous name in a rename
|
||
|
Extra string
|
||
|
}
|
||
|
|
||
|
// StatusCode status code of a file in the Worktree
|
||
|
type StatusCode byte
|
||
|
|
||
|
const (
|
||
|
Unmodified StatusCode = ' '
|
||
|
Untracked StatusCode = '?'
|
||
|
Modified StatusCode = 'M'
|
||
|
Added StatusCode = 'A'
|
||
|
Deleted StatusCode = 'D'
|
||
|
Renamed StatusCode = 'R'
|
||
|
Copied StatusCode = 'C'
|
||
|
UpdatedButUnmerged StatusCode = 'U'
|
||
|
)
|