mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 19:38:23 +00:00 
			
		
		
		
	Huge updates!!!!! Be careful to merge!!!!
This commit is contained in:
		| @@ -73,6 +73,14 @@ func (c *Commit) CommitsCount() (int, error) { | ||||
| 	return c.repo.commitsCount(c.Id) | ||||
| } | ||||
|  | ||||
| func (c *Commit) SearchCommits(keyword string) (*list.List, error) { | ||||
| 	return c.repo.searchCommits(c.Id, keyword) | ||||
| } | ||||
|  | ||||
| func (c *Commit) CommitsByRange(page int) (*list.List, error) { | ||||
| 	return c.repo.commitsByRange(c.Id, page) | ||||
| } | ||||
|  | ||||
| func (c *Commit) GetCommitOfRelPath(relPath string) (*Commit, error) { | ||||
| 	return c.repo.getCommitOfRelPath(c.Id, relPath) | ||||
| } | ||||
|   | ||||
| @@ -32,7 +32,18 @@ func (repo *Repository) GetCommitOfBranch(branchName string) (*Commit, error) { | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return repo.GetCommit(commitId) | ||||
| } | ||||
|  | ||||
| func (repo *Repository) GetCommitIdOfTag(tagName string) (string, error) { | ||||
| 	return repo.getCommitIdOfRef("refs/tags/" + tagName) | ||||
| } | ||||
|  | ||||
| func (repo *Repository) GetCommitOfTag(tagName string) (*Commit, error) { | ||||
| 	commitId, err := repo.GetCommitIdOfTag(tagName) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return repo.GetCommit(commitId) | ||||
| } | ||||
|  | ||||
| @@ -212,6 +223,32 @@ func (repo *Repository) commitsBefore(lock *sync.Mutex, l *list.List, parent *li | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (repo *Repository) CommitsCount(commitId string) (int, error) { | ||||
| 	id, err := NewIdFromString(commitId) | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	return repo.commitsCount(id) | ||||
| } | ||||
|  | ||||
| func (repo *Repository) FileCommitsCount(branch, file string) (int, error) { | ||||
| 	stdout, stderr, err := com.ExecCmdDir(repo.Path, "git", "rev-list", "--count", | ||||
| 		branch, "--", file) | ||||
| 	if err != nil { | ||||
| 		return 0, errors.New(stderr) | ||||
| 	} | ||||
| 	return com.StrTo(strings.TrimSpace(stdout)).Int() | ||||
| } | ||||
|  | ||||
| func (repo *Repository) CommitsByFileAndRange(branch, file string, page int) (*list.List, error) { | ||||
| 	stdout, stderr, err := com.ExecCmdDirBytes(repo.Path, "git", "log", branch, | ||||
| 		"--skip="+com.ToStr((page-1)*50), "--max-count=50", prettyLogFormat, "--", file) | ||||
| 	if err != nil { | ||||
| 		return nil, errors.New(string(stderr)) | ||||
| 	} | ||||
| 	return parsePrettyFormatLog(repo, stdout) | ||||
| } | ||||
|  | ||||
| func (repo *Repository) getCommitsBefore(id sha1) (*list.List, error) { | ||||
| 	l := list.New() | ||||
| 	lock := new(sync.Mutex) | ||||
| @@ -219,6 +256,26 @@ func (repo *Repository) getCommitsBefore(id sha1) (*list.List, error) { | ||||
| 	return l, err | ||||
| } | ||||
|  | ||||
| func (repo *Repository) searchCommits(id sha1, keyword string) (*list.List, error) { | ||||
| 	stdout, stderr, err := com.ExecCmdDirBytes(repo.Path, "git", "log", id.String(), "-100", | ||||
| 		"-i", "--grep="+keyword, prettyLogFormat) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} else if len(stderr) > 0 { | ||||
| 		return nil, errors.New(string(stderr)) | ||||
| 	} | ||||
| 	return parsePrettyFormatLog(repo, stdout) | ||||
| } | ||||
|  | ||||
| func (repo *Repository) commitsByRange(id sha1, page int) (*list.List, error) { | ||||
| 	stdout, stderr, err := com.ExecCmdDirBytes(repo.Path, "git", "log", id.String(), | ||||
| 		"--skip="+com.ToStr((page-1)*50), "--max-count=50", prettyLogFormat) | ||||
| 	if err != nil { | ||||
| 		return nil, errors.New(string(stderr)) | ||||
| 	} | ||||
| 	return parsePrettyFormatLog(repo, stdout) | ||||
| } | ||||
|  | ||||
| func (repo *Repository) getCommitOfRelPath(id sha1, relPath string) (*Commit, error) { | ||||
| 	stdout, _, err := com.ExecCmdDir(repo.Path, "git", "log", "-1", prettyLogFormat, id.String(), "--", relPath) | ||||
| 	if err != nil { | ||||
|   | ||||
| @@ -30,6 +30,14 @@ func (repo *Repository) GetTags() ([]string, error) { | ||||
| 	return tags[:len(tags)-1], nil | ||||
| } | ||||
|  | ||||
| func (repo *Repository) CreateTag(tagName, idStr string) error { | ||||
| 	_, stderr, err := com.ExecCmdDir(repo.Path, "git", "tag", tagName, idStr) | ||||
| 	if err != nil { | ||||
| 		return errors.New(stderr) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (repo *Repository) getTag(id sha1) (*Tag, error) { | ||||
| 	if repo.tagCache != nil { | ||||
| 		if t, ok := repo.tagCache[id]; ok { | ||||
|   | ||||
| @@ -44,3 +44,16 @@ func (t *Tree) GetTreeEntryByPath(relpath string) (*TreeEntry, error) { | ||||
| 	} | ||||
| 	return nil, fmt.Errorf("GetTreeEntryByPath: %v", ErrNotExist) | ||||
| } | ||||
|  | ||||
| func (t *Tree) GetBlobByPath(rpath string) (*Blob, error) { | ||||
| 	entry, err := t.GetTreeEntryByPath(rpath) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	if !entry.IsDir() { | ||||
| 		return entry.Blob(), nil | ||||
| 	} | ||||
|  | ||||
| 	return nil, ErrNotExist | ||||
| } | ||||
|   | ||||
| @@ -5,12 +5,33 @@ | ||||
| package git | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"container/list" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| const prettyLogFormat = `--pretty=format:%H` | ||||
|  | ||||
| func parsePrettyFormatLog(repo *Repository, logByts []byte) (*list.List, error) { | ||||
| 	l := list.New() | ||||
| 	if len(logByts) == 0 { | ||||
| 		return l, nil | ||||
| 	} | ||||
|  | ||||
| 	parts := bytes.Split(logByts, []byte{'\n'}) | ||||
|  | ||||
| 	for _, commitId := range parts { | ||||
| 		commit, err := repo.GetCommit(string(commitId)) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		l.PushBack(commit) | ||||
| 	} | ||||
|  | ||||
| 	return l, nil | ||||
| } | ||||
|  | ||||
| func RefEndName(refStr string) string { | ||||
| 	index := strings.LastIndex(refStr, "/") | ||||
| 	if index != -1 { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user