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'
 | |
| )
 | |
| 
 |