Git-Trees API (#5403)
	
		
	
				
					
				
			* Git-Trees API * update vendor'd libs * added comments to exported function and formatted. * make fmt * update per @lafirks feedbacktokarchuk/v1.17
							parent
							
								
									f17524bd0c
								
							
						
					
					
						commit
						d5d847e5c4
					
				@ -0,0 +1,92 @@ | 
				
			||||
// Copyright 2018 The Gitea Authors. All rights reserved.
 | 
				
			||||
// Use of this source code is governed by a MIT-style
 | 
				
			||||
// license that can be found in the LICENSE file.
 | 
				
			||||
 | 
				
			||||
package repo | 
				
			||||
 | 
				
			||||
import ( | 
				
			||||
	"fmt" | 
				
			||||
	"strings" | 
				
			||||
 | 
				
			||||
	"code.gitea.io/git" | 
				
			||||
	"code.gitea.io/gitea/modules/context" | 
				
			||||
	"code.gitea.io/gitea/modules/setting" | 
				
			||||
	"code.gitea.io/sdk/gitea" | 
				
			||||
) | 
				
			||||
 | 
				
			||||
// GetTree get the tree of a repository.
 | 
				
			||||
func GetTree(ctx *context.APIContext) { | 
				
			||||
	sha := ctx.Params("sha") | 
				
			||||
	if len(sha) == 0 { | 
				
			||||
		ctx.Error(400, "sha not provided", nil) | 
				
			||||
		return | 
				
			||||
	} | 
				
			||||
	tree := GetTreeBySHA(ctx, sha) | 
				
			||||
	if tree != nil { | 
				
			||||
		ctx.JSON(200, tree) | 
				
			||||
	} else { | 
				
			||||
		ctx.Error(400, "sha invalid", nil) | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// GetTreeBySHA get the GitTreeResponse of a repository using a sha hash.
 | 
				
			||||
func GetTreeBySHA(ctx *context.APIContext, sha string) *gitea.GitTreeResponse { | 
				
			||||
	gitTree, err := ctx.Repo.GitRepo.GetTree(sha) | 
				
			||||
	if err != nil || gitTree == nil { | 
				
			||||
		return nil | 
				
			||||
	} | 
				
			||||
	tree := new(gitea.GitTreeResponse) | 
				
			||||
	repoID := strings.TrimRight(setting.AppURL, "/") + "/api/v1/repos/" + ctx.Repo.Repository.Owner.Name + "/" + ctx.Repo.Repository.Name | 
				
			||||
	tree.SHA = gitTree.ID.String() | 
				
			||||
	tree.URL = repoID + "/git/trees/" + tree.SHA | 
				
			||||
	var entries git.Entries | 
				
			||||
	if ctx.QueryBool("recursive") { | 
				
			||||
		entries, err = gitTree.ListEntriesRecursive() | 
				
			||||
	} else { | 
				
			||||
		entries, err = gitTree.ListEntries() | 
				
			||||
	} | 
				
			||||
	if err != nil { | 
				
			||||
		return tree | 
				
			||||
	} | 
				
			||||
	repoIDLen := len(repoID) | 
				
			||||
 | 
				
			||||
	// 51 is len(sha1) + len("/git/blobs/"). 40 + 11.
 | 
				
			||||
	blobURL := make([]byte, repoIDLen+51) | 
				
			||||
	copy(blobURL[:], repoID) | 
				
			||||
	copy(blobURL[repoIDLen:], "/git/blobs/") | 
				
			||||
 | 
				
			||||
	// 51 is len(sha1) + len("/git/trees/"). 40 + 11.
 | 
				
			||||
	treeURL := make([]byte, repoIDLen+51) | 
				
			||||
	copy(treeURL[:], repoID) | 
				
			||||
	copy(treeURL[repoIDLen:], "/git/trees/") | 
				
			||||
 | 
				
			||||
	// 40 is the size of the sha1 hash in hexadecimal format.
 | 
				
			||||
	copyPos := len(treeURL) - 40 | 
				
			||||
 | 
				
			||||
	if len(entries) > 1000 { | 
				
			||||
		tree.Entries = make([]gitea.GitEntry, 1000) | 
				
			||||
	} else { | 
				
			||||
		tree.Entries = make([]gitea.GitEntry, len(entries)) | 
				
			||||
	} | 
				
			||||
	for e := range entries { | 
				
			||||
		if e > 1000 { | 
				
			||||
			tree.Truncated = true | 
				
			||||
			break | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		tree.Entries[e].Path = entries[e].Name() | 
				
			||||
		tree.Entries[e].Mode = fmt.Sprintf("%06x", entries[e].Mode()) | 
				
			||||
		tree.Entries[e].Type = string(entries[e].Type) | 
				
			||||
		tree.Entries[e].Size = entries[e].Size() | 
				
			||||
		tree.Entries[e].SHA = entries[e].ID.String() | 
				
			||||
 | 
				
			||||
		if entries[e].IsDir() { | 
				
			||||
			copy(treeURL[copyPos:], entries[e].ID.String()) | 
				
			||||
			tree.Entries[e].URL = string(treeURL[:]) | 
				
			||||
		} else { | 
				
			||||
			copy(blobURL[copyPos:], entries[e].ID.String()) | 
				
			||||
			tree.Entries[e].URL = string(blobURL[:]) | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
	return tree | 
				
			||||
} | 
				
			||||
@ -0,0 +1,39 @@ | 
				
			||||
// Copyright 2018 The Gitea Authors. All rights reserved.
 | 
				
			||||
// Use of this source code is governed by a MIT-style
 | 
				
			||||
// license that can be found in the LICENSE file.
 | 
				
			||||
 | 
				
			||||
package gitea | 
				
			||||
 | 
				
			||||
import ( | 
				
			||||
	"fmt" | 
				
			||||
) | 
				
			||||
 | 
				
			||||
// GitEntry represents a git tree
 | 
				
			||||
type GitEntry struct { | 
				
			||||
	Path string `json:"path"` | 
				
			||||
	Mode string `json:"mode"` | 
				
			||||
	Type string `json:"type"` | 
				
			||||
	Size int64  `json:"size"` | 
				
			||||
	SHA  string `json:"sha"` | 
				
			||||
	URL  string `json:"url"` | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// GitTreeResponse returns a git tree
 | 
				
			||||
type GitTreeResponse struct { | 
				
			||||
	SHA       string     `json:"sha"` | 
				
			||||
	URL       string     `json:"url"` | 
				
			||||
	Entries   []GitEntry `json:"tree"` | 
				
			||||
	Truncated bool       `json:"truncated"` | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// GetTrees downloads a file of repository, ref can be branch/tag/commit.
 | 
				
			||||
// e.g.: ref -> master, tree -> macaron.go(no leading slash)
 | 
				
			||||
func (c *Client) GetTrees(user, repo, ref string, recursive bool) (*GitTreeResponse, error) { | 
				
			||||
	var trees GitTreeResponse | 
				
			||||
	var path = fmt.Sprintf("/repos/%s/%s/git/trees/%s", user, repo, ref) | 
				
			||||
	if recursive { | 
				
			||||
		path += "?recursive=1" | 
				
			||||
	} | 
				
			||||
	err := c.getParsedResponse("GET", path, nil, nil, &trees) | 
				
			||||
	return &trees, err | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue