Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.0 KiB
79 lines
2.0 KiB
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' |
|
)
|
|
|