| package git |
| |
| import "fmt" |
| import "bytes" |
| |
| // 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] |
| } |
| |
| // IsClean returns true if all the files aren't 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' |
| ) |