mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 08:21:11 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
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'
 | 
						|
)
 |