[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:
parent
c11db35aec
commit
cbe7f5296e
4 changed files with 62 additions and 11 deletions
|
@ -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 a new issue