mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 02:46:04 +01:00 
			
		
		
		
	
				
					committed by
					
						 techknowlogick
						techknowlogick
					
				
			
			
				
	
			
			
			
						parent
						
							3d91bb2f2d
						
					
				
				
					commit
					ecefa9e724
				
			
							
								
								
									
										4
									
								
								Gopkg.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								Gopkg.lock
									
									
									
										generated
									
									
									
								
							| @@ -3,11 +3,11 @@ | ||||
|  | ||||
| [[projects]] | ||||
|   branch = "master" | ||||
|   digest = "1:ab875622908a804a327a95a1701002b150806a3c5406df51ec231eac16d3a1ca" | ||||
|   digest = "1:8a6c3c311918c0f08fa2899feae2c938a9bf22b51378e3720d63b80aca4e80aa" | ||||
|   name = "code.gitea.io/git" | ||||
|   packages = ["."] | ||||
|   pruneopts = "NUT" | ||||
|   revision = "389d3c803e12a30dffcbb54a15c2242521bc4333" | ||||
|   revision = "d04f81a6f8979be39da165fc034447a805071b97" | ||||
|  | ||||
| [[projects]] | ||||
|   branch = "master" | ||||
|   | ||||
							
								
								
									
										32
									
								
								integrations/api_repo_git_commits_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								integrations/api_repo_git_commits_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| // Copyright 2019 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 integrations | ||||
|  | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"testing" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| ) | ||||
|  | ||||
| func TestAPIReposGitCommits(t *testing.T) { | ||||
| 	prepareTestEnv(t) | ||||
| 	user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) | ||||
| 	// Login as User2. | ||||
| 	session := loginUser(t, user.Name) | ||||
| 	token := getTokenForLoggedInUser(t, session) | ||||
|  | ||||
| 	for _, ref := range [...]string{ | ||||
| 		"commits/master", // Branch | ||||
| 		"commits/v1.1",   // Tag | ||||
| 	} { | ||||
| 		req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/%s?token="+token, user.Name, ref) | ||||
| 		session.MakeRequest(t, req, http.StatusOK) | ||||
| 	} | ||||
|  | ||||
| 	// Test getting non-existent refs | ||||
| 	req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/commits/unknown?token="+token, user.Name) | ||||
| 	session.MakeRequest(t, req, http.StatusNotFound) | ||||
| } | ||||
| @@ -617,6 +617,9 @@ func RegisterRoutes(m *macaron.Macaron) { | ||||
| 					m.Get("/statuses", repo.GetCommitStatusesByRef) | ||||
| 				}, reqRepoReader(models.UnitTypeCode)) | ||||
| 				m.Group("/git", func() { | ||||
| 					m.Group("/commits", func() { | ||||
| 						m.Get("/:sha", repo.GetSingleCommit) | ||||
| 					}) | ||||
| 					m.Get("/refs", repo.GetGitAllRefs) | ||||
| 					m.Get("/refs/*", repo.GetGitRefs) | ||||
| 					m.Combo("/trees/:sha", context.RepoRef()).Get(repo.GetTree) | ||||
|   | ||||
							
								
								
									
										119
									
								
								routers/api/v1/repo/commits.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								routers/api/v1/repo/commits.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | ||||
| // Copyright 2018 The Gogs Authors. All rights reserved. | ||||
| // Copyright 2019 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 ( | ||||
| 	"time" | ||||
|  | ||||
| 	"code.gitea.io/git" | ||||
| 	api "code.gitea.io/sdk/gitea" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
| ) | ||||
|  | ||||
| // GetSingleCommit get a commit via | ||||
| func GetSingleCommit(ctx *context.APIContext) { | ||||
| 	// swagger:operation GET /repos/{owner}/{repo}/git/commits/{sha} repository repoGetSingleCommit | ||||
| 	// --- | ||||
| 	// summary: Get a single commit from a repository | ||||
| 	// produces: | ||||
| 	// - application/json | ||||
| 	// parameters: | ||||
| 	// - name: owner | ||||
| 	//   in: path | ||||
| 	//   description: owner of the repo | ||||
| 	//   type: string | ||||
| 	//   required: true | ||||
| 	// - name: repo | ||||
| 	//   in: path | ||||
| 	//   description: name of the repo | ||||
| 	//   type: string | ||||
| 	//   required: true | ||||
| 	// - name: sha | ||||
| 	//   in: path | ||||
| 	//   description: the commit hash | ||||
| 	//   type: string | ||||
| 	//   required: true | ||||
| 	// responses: | ||||
| 	//   "200": | ||||
| 	//     "$ref": "#/responses/Commit" | ||||
| 	//   "404": | ||||
| 	//     "$ref": "#/responses/notFound" | ||||
|  | ||||
| 	gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath()) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("OpenRepository", err) | ||||
| 		return | ||||
| 	} | ||||
| 	commit, err := gitRepo.GetCommit(ctx.Params(":sha")) | ||||
| 	if err != nil { | ||||
| 		ctx.NotFoundOrServerError("GetCommit", git.IsErrNotExist, err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Retrieve author and committer information | ||||
| 	var apiAuthor, apiCommitter *api.User | ||||
| 	author, err := models.GetUserByEmail(commit.Author.Email) | ||||
| 	if err != nil && !models.IsErrUserNotExist(err) { | ||||
| 		ctx.ServerError("Get user by author email", err) | ||||
| 		return | ||||
| 	} else if err == nil { | ||||
| 		apiAuthor = author.APIFormat() | ||||
| 	} | ||||
| 	// Save one query if the author is also the committer | ||||
| 	if commit.Committer.Email == commit.Author.Email { | ||||
| 		apiCommitter = apiAuthor | ||||
| 	} else { | ||||
| 		committer, err := models.GetUserByEmail(commit.Committer.Email) | ||||
| 		if err != nil && !models.IsErrUserNotExist(err) { | ||||
| 			ctx.ServerError("Get user by committer email", err) | ||||
| 			return | ||||
| 		} else if err == nil { | ||||
| 			apiCommitter = committer.APIFormat() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Retrieve parent(s) of the commit | ||||
| 	apiParents := make([]*api.CommitMeta, commit.ParentCount()) | ||||
| 	for i := 0; i < commit.ParentCount(); i++ { | ||||
| 		sha, _ := commit.ParentID(i) | ||||
| 		apiParents[i] = &api.CommitMeta{ | ||||
| 			URL: ctx.Repo.Repository.APIURL() + "/git/commits/" + sha.String(), | ||||
| 			SHA: sha.String(), | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	ctx.JSON(200, &api.Commit{ | ||||
| 		CommitMeta: &api.CommitMeta{ | ||||
| 			URL: setting.AppURL + ctx.Link[1:], | ||||
| 			SHA: commit.ID.String(), | ||||
| 		}, | ||||
| 		HTMLURL: ctx.Repo.Repository.HTMLURL() + "/commits/" + commit.ID.String(), | ||||
| 		RepoCommit: &api.RepoCommit{ | ||||
| 			URL: setting.AppURL + ctx.Link[1:], | ||||
| 			Author: &api.CommitUser{ | ||||
| 				Name:  commit.Author.Name, | ||||
| 				Email: commit.Author.Email, | ||||
| 				Date:  commit.Author.When.Format(time.RFC3339), | ||||
| 			}, | ||||
| 			Committer: &api.CommitUser{ | ||||
| 				Name:  commit.Committer.Name, | ||||
| 				Email: commit.Committer.Email, | ||||
| 				Date:  commit.Committer.When.Format(time.RFC3339), | ||||
| 			}, | ||||
| 			Message: commit.Summary(), | ||||
| 			Tree: &api.CommitMeta{ | ||||
| 				URL: ctx.Repo.Repository.APIURL() + "/trees/" + commit.ID.String(), | ||||
| 				SHA: commit.ID.String(), | ||||
| 			}, | ||||
| 		}, | ||||
| 		Author:    apiAuthor, | ||||
| 		Committer: apiCommitter, | ||||
| 		Parents:   apiParents, | ||||
| 	}) | ||||
| } | ||||
| @@ -140,3 +140,10 @@ type swaggerGitTreeResponse struct { | ||||
| 	//in: body | ||||
| 	Body api.GitTreeResponse `json:"body"` | ||||
| } | ||||
|  | ||||
| // Commit | ||||
| // swagger:response Commit | ||||
| type swaggerCommit struct { | ||||
| 	//in: body | ||||
| 	Body api.Commit `json:"body"` | ||||
| } | ||||
|   | ||||
| @@ -1622,6 +1622,49 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "/repos/{owner}/{repo}/git/commits/{sha}": { | ||||
|       "get": { | ||||
|         "produces": [ | ||||
|           "application/json" | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "repository" | ||||
|         ], | ||||
|         "summary": "Get a single commit from a repository", | ||||
|         "operationId": "repoGetSingleCommit", | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "type": "string", | ||||
|             "description": "owner of the repo", | ||||
|             "name": "owner", | ||||
|             "in": "path", | ||||
|             "required": true | ||||
|           }, | ||||
|           { | ||||
|             "type": "string", | ||||
|             "description": "name of the repo", | ||||
|             "name": "repo", | ||||
|             "in": "path", | ||||
|             "required": true | ||||
|           }, | ||||
|           { | ||||
|             "type": "string", | ||||
|             "description": "the commit hash", | ||||
|             "name": "sha", | ||||
|             "in": "path", | ||||
|             "required": true | ||||
|           } | ||||
|         ], | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "$ref": "#/responses/Commit" | ||||
|           }, | ||||
|           "404": { | ||||
|             "$ref": "#/responses/notFound" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "/repos/{owner}/{repo}/git/refs": { | ||||
|       "get": { | ||||
|         "produces": [ | ||||
| @@ -6174,6 +6217,75 @@ | ||||
|       }, | ||||
|       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" | ||||
|     }, | ||||
|     "Commit": { | ||||
|       "type": "object", | ||||
|       "title": "Commit contains information generated from a Git commit.", | ||||
|       "properties": { | ||||
|         "author": { | ||||
|           "$ref": "#/definitions/User" | ||||
|         }, | ||||
|         "commit": { | ||||
|           "$ref": "#/definitions/RepoCommit" | ||||
|         }, | ||||
|         "committer": { | ||||
|           "$ref": "#/definitions/User" | ||||
|         }, | ||||
|         "html_url": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "HTMLURL" | ||||
|         }, | ||||
|         "parents": { | ||||
|           "type": "array", | ||||
|           "items": { | ||||
|             "$ref": "#/definitions/CommitMeta" | ||||
|           }, | ||||
|           "x-go-name": "Parents" | ||||
|         }, | ||||
|         "sha": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "SHA" | ||||
|         }, | ||||
|         "url": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "URL" | ||||
|         } | ||||
|       }, | ||||
|       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" | ||||
|     }, | ||||
|     "CommitMeta": { | ||||
|       "type": "object", | ||||
|       "title": "CommitMeta contains meta information of a commit in terms of API.", | ||||
|       "properties": { | ||||
|         "sha": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "SHA" | ||||
|         }, | ||||
|         "url": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "URL" | ||||
|         } | ||||
|       }, | ||||
|       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" | ||||
|     }, | ||||
|     "CommitUser": { | ||||
|       "type": "object", | ||||
|       "title": "CommitUser contains information of a user in the context of a commit.", | ||||
|       "properties": { | ||||
|         "date": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "Date" | ||||
|         }, | ||||
|         "email": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "Email" | ||||
|         }, | ||||
|         "name": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "Name" | ||||
|         } | ||||
|       }, | ||||
|       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" | ||||
|     }, | ||||
|     "CreateEmailOption": { | ||||
|       "description": "CreateEmailOption options when creating email addresses", | ||||
|       "type": "object", | ||||
| @@ -7952,6 +8064,30 @@ | ||||
|       }, | ||||
|       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" | ||||
|     }, | ||||
|     "RepoCommit": { | ||||
|       "type": "object", | ||||
|       "title": "RepoCommit contains information of a commit in the context of a repository.", | ||||
|       "properties": { | ||||
|         "author": { | ||||
|           "$ref": "#/definitions/CommitUser" | ||||
|         }, | ||||
|         "committer": { | ||||
|           "$ref": "#/definitions/CommitUser" | ||||
|         }, | ||||
|         "message": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "Message" | ||||
|         }, | ||||
|         "tree": { | ||||
|           "$ref": "#/definitions/CommitMeta" | ||||
|         }, | ||||
|         "url": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "URL" | ||||
|         } | ||||
|       }, | ||||
|       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" | ||||
|     }, | ||||
|     "Repository": { | ||||
|       "description": "Repository represents a repository", | ||||
|       "type": "object", | ||||
| @@ -8382,6 +8518,12 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "Commit": { | ||||
|       "description": "Commit", | ||||
|       "schema": { | ||||
|         "$ref": "#/definitions/Commit" | ||||
|       } | ||||
|     }, | ||||
|     "DeployKey": { | ||||
|       "description": "DeployKey", | ||||
|       "schema": { | ||||
|   | ||||
							
								
								
									
										52
									
								
								vendor/code.gitea.io/git/commit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								vendor/code.gitea.io/git/commit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,4 +1,5 @@ | ||||
| // Copyright 2015 The Gogs Authors. All rights reserved. | ||||
| // 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. | ||||
|  | ||||
| @@ -9,6 +10,7 @@ import ( | ||||
| 	"bytes" | ||||
| 	"container/list" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| @@ -279,6 +281,56 @@ func (c *Commit) GetSubModule(entryname string) (*SubModule, error) { | ||||
| 	return nil, nil | ||||
| } | ||||
|  | ||||
| // CommitFileStatus represents status of files in a commit. | ||||
| type CommitFileStatus struct { | ||||
| 	Added    []string | ||||
| 	Removed  []string | ||||
| 	Modified []string | ||||
| } | ||||
|  | ||||
| // NewCommitFileStatus creates a CommitFileStatus | ||||
| func NewCommitFileStatus() *CommitFileStatus { | ||||
| 	return &CommitFileStatus{ | ||||
| 		[]string{}, []string{}, []string{}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // GetCommitFileStatus returns file status of commit in given repository. | ||||
| func GetCommitFileStatus(repoPath, commitID string) (*CommitFileStatus, error) { | ||||
| 	stdout, w := io.Pipe() | ||||
| 	done := make(chan struct{}) | ||||
| 	fileStatus := NewCommitFileStatus() | ||||
| 	go func() { | ||||
| 		scanner := bufio.NewScanner(stdout) | ||||
| 		for scanner.Scan() { | ||||
| 			fields := strings.Fields(scanner.Text()) | ||||
| 			if len(fields) < 2 { | ||||
| 				continue | ||||
| 			} | ||||
|  | ||||
| 			switch fields[0][0] { | ||||
| 			case 'A': | ||||
| 				fileStatus.Added = append(fileStatus.Added, fields[1]) | ||||
| 			case 'D': | ||||
| 				fileStatus.Removed = append(fileStatus.Removed, fields[1]) | ||||
| 			case 'M': | ||||
| 				fileStatus.Modified = append(fileStatus.Modified, fields[1]) | ||||
| 			} | ||||
| 		} | ||||
| 		done <- struct{}{} | ||||
| 	}() | ||||
|  | ||||
| 	stderr := new(bytes.Buffer) | ||||
| 	err := NewCommand("show", "--name-status", "--pretty=format:''", commitID).RunInDirPipeline(repoPath, w, stderr) | ||||
| 	w.Close() // Close writer to exit parsing goroutine | ||||
| 	if err != nil { | ||||
| 		return nil, concatenateError(err, stderr.String()) | ||||
| 	} | ||||
|  | ||||
| 	<-done | ||||
| 	return fileStatus, nil | ||||
| } | ||||
|  | ||||
| // GetFullCommitID returns full length (40) of commit ID by given short SHA in a repository. | ||||
| func GetFullCommitID(repoPath, shortID string) (string, error) { | ||||
| 	if len(shortID) >= 40 { | ||||
|   | ||||
							
								
								
									
										3
									
								
								vendor/code.gitea.io/git/repo_commit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/code.gitea.io/git/repo_commit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -140,6 +140,9 @@ func (repo *Repository) GetCommit(commitID string) (*Commit, error) { | ||||
| 		var err error | ||||
| 		commitID, err = NewCommand("rev-parse", commitID).RunInDir(repo.Path) | ||||
| 		if err != nil { | ||||
| 			if strings.Contains(err.Error(), "unknown revision or path") { | ||||
| 				return nil, ErrNotExist{commitID, ""} | ||||
| 			} | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										16
									
								
								vendor/code.gitea.io/git/submodule.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/code.gitea.io/git/submodule.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -29,13 +29,12 @@ func NewSubModuleFile(c *Commit, refURL, refID string) *SubModuleFile { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // RefURL guesses and returns reference URL. | ||||
| func (sf *SubModuleFile) RefURL(urlPrefix string, parentPath string) string { | ||||
| 	if sf.refURL == "" { | ||||
| func getRefURL(refURL, urlPrefix, parentPath string) string { | ||||
| 	if refURL == "" { | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| 	url := strings.TrimSuffix(sf.refURL, ".git") | ||||
| 	url := strings.TrimSuffix(refURL, ".git") | ||||
|  | ||||
| 	// git://xxx/user/repo | ||||
| 	if strings.HasPrefix(url, "git://") { | ||||
| @@ -67,12 +66,21 @@ func (sf *SubModuleFile) RefURL(urlPrefix string, parentPath string) string { | ||||
| 		if strings.Contains(urlPrefix, url[i+1:j]) { | ||||
| 			return urlPrefix + url[j+1:] | ||||
| 		} | ||||
| 		if strings.HasPrefix(url, "ssh://") || strings.HasPrefix(url, "git+ssh://") { | ||||
| 			k := strings.Index(url[j+1:], "/") | ||||
| 			return "http://" + url[i+1:j] + "/" + url[j+1:][k+1:] | ||||
| 		} | ||||
| 		return "http://" + url[i+1:j] + "/" + url[j+1:] | ||||
| 	} | ||||
|  | ||||
| 	return url | ||||
| } | ||||
|  | ||||
| // RefURL guesses and returns reference URL. | ||||
| func (sf *SubModuleFile) RefURL(urlPrefix string, parentPath string) string { | ||||
| 	return getRefURL(sf.refURL, urlPrefix, parentPath) | ||||
| } | ||||
|  | ||||
| // RefID returns reference ID. | ||||
| func (sf *SubModuleFile) RefID() string { | ||||
| 	return sf.refID | ||||
|   | ||||
							
								
								
									
										22
									
								
								vendor/code.gitea.io/git/tree.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/code.gitea.io/git/tree.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -18,6 +18,9 @@ type Tree struct { | ||||
|  | ||||
| 	entries       Entries | ||||
| 	entriesParsed bool | ||||
|  | ||||
| 	entriesRecursive 	Entries | ||||
| 	entriesRecursiveParsed 	bool | ||||
| } | ||||
|  | ||||
| // NewTree create a new tree according the repository and commit id | ||||
| @@ -67,20 +70,29 @@ func (t *Tree) ListEntries() (Entries, error) { | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	t.entries, err = parseTreeEntries(stdout, t) | ||||
| 	if err == nil { | ||||
| 		t.entriesParsed = true | ||||
| 	} | ||||
|  | ||||
| 	return t.entries, err | ||||
| } | ||||
|  | ||||
| // ListEntriesRecursive returns all entries of current tree recursively including all subtrees | ||||
| func (t *Tree) ListEntriesRecursive() (Entries, error) { | ||||
| 	if t.entriesParsed { | ||||
| 		return t.entries, nil | ||||
| 	if t.entriesRecursiveParsed { | ||||
| 		return t.entriesRecursive, nil | ||||
| 	} | ||||
| 	stdout, err := NewCommand("ls-tree", "-t", "-r", t.ID.String()).RunInDirBytes(t.repo.Path) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	t.entries, err = parseTreeEntries(stdout, t) | ||||
| 	return t.entries, err | ||||
|  | ||||
| 	t.entriesRecursive, err = parseTreeEntries(stdout, t) | ||||
| 	if err == nil { | ||||
| 		t.entriesRecursiveParsed = true | ||||
| 	} | ||||
|  | ||||
| 	return t.entriesRecursive, err | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user