mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 10:56:10 +01:00 
			
		
		
		
	[API] Add affected files of commits to commit struct (#14579)
* Add files affected by a commit to gitea API -- similar to github * Add files affected by a commit to gitea API * Fix stupid error * Fix other stupid typo * Generate swagger tmpl * Comply with convert to git commit refacto * update swagger docs * extend test * format code * Update integrations/api_repo_git_commits_test.go * Update modules/convert/git_commit.go Co-authored-by: Laurent Cahour <laurent.cahour@dont-nod.com> Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
		| @@ -14,6 +14,14 @@ import ( | |||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func compareCommitFiles(t *testing.T, expect []string, files []*api.CommitAffectedFiles) { | ||||||
|  | 	var actual []string | ||||||
|  | 	for i := range files { | ||||||
|  | 		actual = append(actual, files[i].Filename) | ||||||
|  | 	} | ||||||
|  | 	assert.ElementsMatch(t, expect, actual) | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestAPIReposGitCommits(t *testing.T) { | func TestAPIReposGitCommits(t *testing.T) { | ||||||
| 	defer prepareTestEnv(t)() | 	defer prepareTestEnv(t)() | ||||||
| 	user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) | 	user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) | ||||||
| @@ -56,10 +64,13 @@ func TestAPIReposGitCommitList(t *testing.T) { | |||||||
| 	var apiData []api.Commit | 	var apiData []api.Commit | ||||||
| 	DecodeJSON(t, resp, &apiData) | 	DecodeJSON(t, resp, &apiData) | ||||||
|  |  | ||||||
| 	assert.Equal(t, 3, len(apiData)) | 	assert.Len(t, apiData, 3) | ||||||
| 	assert.Equal(t, "69554a64c1e6030f051e5c3f94bfbd773cd6a324", apiData[0].CommitMeta.SHA) | 	assert.EqualValues(t, "69554a64c1e6030f051e5c3f94bfbd773cd6a324", apiData[0].CommitMeta.SHA) | ||||||
| 	assert.Equal(t, "27566bd5738fc8b4e3fef3c5e72cce608537bd95", apiData[1].CommitMeta.SHA) | 	compareCommitFiles(t, []string{"readme.md"}, apiData[0].Files) | ||||||
| 	assert.Equal(t, "5099b81332712fe655e34e8dd63574f503f61811", apiData[2].CommitMeta.SHA) | 	assert.EqualValues(t, "27566bd5738fc8b4e3fef3c5e72cce608537bd95", apiData[1].CommitMeta.SHA) | ||||||
|  | 	compareCommitFiles(t, []string{"readme.md"}, apiData[1].Files) | ||||||
|  | 	assert.EqualValues(t, "5099b81332712fe655e34e8dd63574f503f61811", apiData[2].CommitMeta.SHA) | ||||||
|  | 	compareCommitFiles(t, []string{"readme.md"}, apiData[2].Files) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestAPIReposGitCommitListPage2Empty(t *testing.T) { | func TestAPIReposGitCommitListPage2Empty(t *testing.T) { | ||||||
| @@ -76,7 +87,7 @@ func TestAPIReposGitCommitListPage2Empty(t *testing.T) { | |||||||
| 	var apiData []api.Commit | 	var apiData []api.Commit | ||||||
| 	DecodeJSON(t, resp, &apiData) | 	DecodeJSON(t, resp, &apiData) | ||||||
|  |  | ||||||
| 	assert.Equal(t, 0, len(apiData)) | 	assert.Len(t, apiData, 0) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestAPIReposGitCommitListDifferentBranch(t *testing.T) { | func TestAPIReposGitCommitListDifferentBranch(t *testing.T) { | ||||||
| @@ -93,6 +104,7 @@ func TestAPIReposGitCommitListDifferentBranch(t *testing.T) { | |||||||
| 	var apiData []api.Commit | 	var apiData []api.Commit | ||||||
| 	DecodeJSON(t, resp, &apiData) | 	DecodeJSON(t, resp, &apiData) | ||||||
|  |  | ||||||
| 	assert.Equal(t, 1, len(apiData)) | 	assert.Len(t, apiData, 1) | ||||||
| 	assert.Equal(t, "f27c2b2b03dcab38beaf89b0ab4ff61f6de63441", apiData[0].CommitMeta.SHA) | 	assert.Equal(t, "f27c2b2b03dcab38beaf89b0ab4ff61f6de63441", apiData[0].CommitMeta.SHA) | ||||||
|  | 	compareCommitFiles(t, []string{"readme.md"}, apiData[0].Files) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -131,6 +131,20 @@ func ToCommit(repo *models.Repository, commit *git.Commit, userCache map[string] | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// Retrieve files affected by the commit | ||||||
|  | 	fileStatus, err := git.GetCommitFileStatus(repo.RepoPath(), commit.ID.String()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	affectedFileList := make([]*api.CommitAffectedFiles, 0, len(fileStatus.Added)+len(fileStatus.Removed)+len(fileStatus.Modified)) | ||||||
|  | 	for _, files := range [][]string{fileStatus.Added, fileStatus.Removed, fileStatus.Modified} { | ||||||
|  | 		for _, filename := range files { | ||||||
|  | 			affectedFileList = append(affectedFileList, &api.CommitAffectedFiles{ | ||||||
|  | 				Filename: filename, | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return &api.Commit{ | 	return &api.Commit{ | ||||||
| 		CommitMeta: &api.CommitMeta{ | 		CommitMeta: &api.CommitMeta{ | ||||||
| 			URL: repo.APIURL() + "/git/commits/" + commit.ID.String(), | 			URL: repo.APIURL() + "/git/commits/" + commit.ID.String(), | ||||||
| @@ -162,5 +176,6 @@ func ToCommit(repo *models.Repository, commit *git.Commit, userCache map[string] | |||||||
| 		Author:    apiAuthor, | 		Author:    apiAuthor, | ||||||
| 		Committer: apiCommitter, | 		Committer: apiCommitter, | ||||||
| 		Parents:   apiParents, | 		Parents:   apiParents, | ||||||
|  | 		Files:     affectedFileList, | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -42,11 +42,12 @@ type RepoCommit struct { | |||||||
| // Commit contains information generated from a Git commit. | // Commit contains information generated from a Git commit. | ||||||
| type Commit struct { | type Commit struct { | ||||||
| 	*CommitMeta | 	*CommitMeta | ||||||
| 	HTMLURL    string        `json:"html_url"` | 	HTMLURL    string                 `json:"html_url"` | ||||||
| 	RepoCommit *RepoCommit   `json:"commit"` | 	RepoCommit *RepoCommit            `json:"commit"` | ||||||
| 	Author     *User         `json:"author"` | 	Author     *User                  `json:"author"` | ||||||
| 	Committer  *User         `json:"committer"` | 	Committer  *User                  `json:"committer"` | ||||||
| 	Parents    []*CommitMeta `json:"parents"` | 	Parents    []*CommitMeta          `json:"parents"` | ||||||
|  | 	Files      []*CommitAffectedFiles `json:"files"` | ||||||
| } | } | ||||||
|  |  | ||||||
| // CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE | // CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE | ||||||
| @@ -56,3 +57,8 @@ type CommitDateOptions struct { | |||||||
| 	// swagger:strfmt date-time | 	// swagger:strfmt date-time | ||||||
| 	Committer time.Time `json:"committer"` | 	Committer time.Time `json:"committer"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // CommitAffectedFiles store information about files affected by the commit | ||||||
|  | type CommitAffectedFiles struct { | ||||||
|  | 	Filename string `json:"filename"` | ||||||
|  | } | ||||||
|   | |||||||
| @@ -11821,6 +11821,13 @@ | |||||||
|           "format": "date-time", |           "format": "date-time", | ||||||
|           "x-go-name": "Created" |           "x-go-name": "Created" | ||||||
|         }, |         }, | ||||||
|  |         "files": { | ||||||
|  |           "type": "array", | ||||||
|  |           "items": { | ||||||
|  |             "$ref": "#/definitions/CommitAffectedFiles" | ||||||
|  |           }, | ||||||
|  |           "x-go-name": "Files" | ||||||
|  |         }, | ||||||
|         "html_url": { |         "html_url": { | ||||||
|           "type": "string", |           "type": "string", | ||||||
|           "x-go-name": "HTMLURL" |           "x-go-name": "HTMLURL" | ||||||
| @@ -11843,6 +11850,17 @@ | |||||||
|       }, |       }, | ||||||
|       "x-go-package": "code.gitea.io/gitea/modules/structs" |       "x-go-package": "code.gitea.io/gitea/modules/structs" | ||||||
|     }, |     }, | ||||||
|  |     "CommitAffectedFiles": { | ||||||
|  |       "description": "CommitAffectedFiles store information about files affected by the commit", | ||||||
|  |       "type": "object", | ||||||
|  |       "properties": { | ||||||
|  |         "filename": { | ||||||
|  |           "type": "string", | ||||||
|  |           "x-go-name": "Filename" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "x-go-package": "code.gitea.io/gitea/modules/structs" | ||||||
|  |     }, | ||||||
|     "CommitDateOptions": { |     "CommitDateOptions": { | ||||||
|       "description": "CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE", |       "description": "CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE", | ||||||
|       "type": "object", |       "type": "object", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user