* Fixes #7152 - Allow create/update/delete message to be empty, use default message * Linting fix * Fix to delete integration tests
This commit is contained in:
parent
462284e2f5
commit
002b597c1f
7 changed files with 104 additions and 27 deletions
|
@ -28,7 +28,7 @@ func getCreateFileOptions() api.CreateFileOptions {
|
||||||
FileOptions: api.FileOptions{
|
FileOptions: api.FileOptions{
|
||||||
BranchName: "master",
|
BranchName: "master",
|
||||||
NewBranchName: "master",
|
NewBranchName: "master",
|
||||||
Message: "Creates new/file.txt",
|
Message: "Making this new file new/file.txt",
|
||||||
Author: api.Identity{
|
Author: api.Identity{
|
||||||
Name: "John Doe",
|
Name: "John Doe",
|
||||||
Email: "johndoe@example.com",
|
Email: "johndoe@example.com",
|
||||||
|
@ -150,6 +150,19 @@ func TestAPICreateFile(t *testing.T) {
|
||||||
assert.EqualValues(t, expectedSHA, fileResponse.Content.SHA)
|
assert.EqualValues(t, expectedSHA, fileResponse.Content.SHA)
|
||||||
assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
|
assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
|
||||||
assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
|
assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
|
||||||
|
assert.EqualValues(t, createFileOptions.Message+"\n", fileResponse.Commit.Message)
|
||||||
|
|
||||||
|
// Test creating a file without a message
|
||||||
|
createFileOptions = getCreateFileOptions()
|
||||||
|
createFileOptions.Message = ""
|
||||||
|
fileID++
|
||||||
|
treePath = fmt.Sprintf("new/file%d.txt", fileID)
|
||||||
|
url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
|
||||||
|
req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
|
||||||
|
resp = session.MakeRequest(t, req, http.StatusCreated)
|
||||||
|
DecodeJSON(t, resp, &fileResponse)
|
||||||
|
expectedMessage := "Add '" + treePath + "'\n"
|
||||||
|
assert.EqualValues(t, expectedMessage, fileResponse.Commit.Message)
|
||||||
|
|
||||||
// Test trying to create a file that already exists, should fail
|
// Test trying to create a file that already exists, should fail
|
||||||
createFileOptions = getCreateFileOptions()
|
createFileOptions = getCreateFileOptions()
|
||||||
|
|
|
@ -23,7 +23,7 @@ func getDeleteFileOptions() *api.DeleteFileOptions {
|
||||||
FileOptions: api.FileOptions{
|
FileOptions: api.FileOptions{
|
||||||
BranchName: "master",
|
BranchName: "master",
|
||||||
NewBranchName: "master",
|
NewBranchName: "master",
|
||||||
Message: "Updates new/file.txt",
|
Message: "Removing the file new/file.txt",
|
||||||
Author: api.Identity{
|
Author: api.Identity{
|
||||||
Name: "John Doe",
|
Name: "John Doe",
|
||||||
Email: "johndoe@example.com",
|
Email: "johndoe@example.com",
|
||||||
|
@ -89,6 +89,20 @@ func TestAPIDeleteFile(t *testing.T) {
|
||||||
DecodeJSON(t, resp, &fileResponse)
|
DecodeJSON(t, resp, &fileResponse)
|
||||||
assert.NotNil(t, fileResponse)
|
assert.NotNil(t, fileResponse)
|
||||||
assert.Nil(t, fileResponse.Content)
|
assert.Nil(t, fileResponse.Content)
|
||||||
|
assert.EqualValues(t, deleteFileOptions.Message+"\n", fileResponse.Commit.Message)
|
||||||
|
|
||||||
|
// Test deleting file without a message
|
||||||
|
fileID++
|
||||||
|
treePath = fmt.Sprintf("delete/file%d.txt", fileID)
|
||||||
|
createFile(user2, repo1, treePath)
|
||||||
|
deleteFileOptions = getDeleteFileOptions()
|
||||||
|
deleteFileOptions.Message = ""
|
||||||
|
url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
|
||||||
|
req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
|
||||||
|
resp = session.MakeRequest(t, req, http.StatusOK)
|
||||||
|
DecodeJSON(t, resp, &fileResponse)
|
||||||
|
expectedMessage := "Delete '" + treePath + "'\n"
|
||||||
|
assert.EqualValues(t, expectedMessage, fileResponse.Commit.Message)
|
||||||
|
|
||||||
// Test deleting a file with the wrong SHA
|
// Test deleting a file with the wrong SHA
|
||||||
fileID++
|
fileID++
|
||||||
|
|
|
@ -25,8 +25,23 @@ func getUpdateFileOptions() *api.UpdateFileOptions {
|
||||||
content := "This is updated text"
|
content := "This is updated text"
|
||||||
contentEncoded := base64.StdEncoding.EncodeToString([]byte(content))
|
contentEncoded := base64.StdEncoding.EncodeToString([]byte(content))
|
||||||
return &api.UpdateFileOptions{
|
return &api.UpdateFileOptions{
|
||||||
DeleteFileOptions: *getDeleteFileOptions(),
|
DeleteFileOptions: api.DeleteFileOptions{
|
||||||
Content: contentEncoded,
|
FileOptions: api.FileOptions{
|
||||||
|
BranchName: "master",
|
||||||
|
NewBranchName: "master",
|
||||||
|
Message: "My update of new/file.txt",
|
||||||
|
Author: api.Identity{
|
||||||
|
Name: "John Doe",
|
||||||
|
Email: "johndoe@example.com",
|
||||||
|
},
|
||||||
|
Committer: api.Identity{
|
||||||
|
Name: "Jane Doe",
|
||||||
|
Email: "janedoe@example.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
SHA: "103ff9234cefeee5ec5361d22b49fbb04d385885",
|
||||||
|
},
|
||||||
|
Content: contentEncoded,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +82,7 @@ func getExpectedFileResponseForUpdate(commitID, treePath string) *api.FileRespon
|
||||||
Email: "johndoe@example.com",
|
Email: "johndoe@example.com",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Message: "Updates README.md\n",
|
Message: "My update of README.md\n",
|
||||||
},
|
},
|
||||||
Verification: &api.PayloadCommitVerification{
|
Verification: &api.PayloadCommitVerification{
|
||||||
Verified: false,
|
Verified: false,
|
||||||
|
@ -140,6 +155,7 @@ func TestAPIUpdateFile(t *testing.T) {
|
||||||
assert.EqualValues(t, expectedSHA, fileResponse.Content.SHA)
|
assert.EqualValues(t, expectedSHA, fileResponse.Content.SHA)
|
||||||
assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
|
assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
|
||||||
assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
|
assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
|
||||||
|
assert.EqualValues(t, updateFileOptions.Message+"\n", fileResponse.Commit.Message)
|
||||||
|
|
||||||
// Test updating a file and renaming it
|
// Test updating a file and renaming it
|
||||||
updateFileOptions = getUpdateFileOptions()
|
updateFileOptions = getUpdateFileOptions()
|
||||||
|
@ -160,6 +176,20 @@ func TestAPIUpdateFile(t *testing.T) {
|
||||||
assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
|
assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
|
||||||
assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
|
assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
|
||||||
|
|
||||||
|
// Test updating a file without a message
|
||||||
|
updateFileOptions = getUpdateFileOptions()
|
||||||
|
updateFileOptions.Message = ""
|
||||||
|
updateFileOptions.BranchName = repo1.DefaultBranch
|
||||||
|
fileID++
|
||||||
|
treePath = fmt.Sprintf("update/file%d.txt", fileID)
|
||||||
|
createFile(user2, repo1, treePath)
|
||||||
|
url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
|
||||||
|
req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
|
||||||
|
resp = session.MakeRequest(t, req, http.StatusOK)
|
||||||
|
DecodeJSON(t, resp, &fileResponse)
|
||||||
|
expectedMessage := "Update '" + treePath + "'\n"
|
||||||
|
assert.EqualValues(t, expectedMessage, fileResponse.Commit.Message)
|
||||||
|
|
||||||
// Test updating a file with the wrong SHA
|
// Test updating a file with the wrong SHA
|
||||||
fileID++
|
fileID++
|
||||||
treePath = fmt.Sprintf("update/file%d.txt", fileID)
|
treePath = fmt.Sprintf("update/file%d.txt", fileID)
|
||||||
|
|
|
@ -24,40 +24,32 @@ func getDeleteRepoFileOptions(repo *models.Repository) *repofiles.DeleteRepoFile
|
||||||
TreePath: "README.md",
|
TreePath: "README.md",
|
||||||
Message: "Deletes README.md",
|
Message: "Deletes README.md",
|
||||||
SHA: "4b4851ad51df6a7d9f25c979345979eaeb5b349f",
|
SHA: "4b4851ad51df6a7d9f25c979345979eaeb5b349f",
|
||||||
Author: nil,
|
Author: &repofiles.IdentityOptions{
|
||||||
Committer: nil,
|
Name: "Bob Smith",
|
||||||
|
Email: "bob@smith.com",
|
||||||
|
},
|
||||||
|
Committer: nil,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getExpectedDeleteFileResponse(u *url.URL) *api.FileResponse {
|
func getExpectedDeleteFileResponse(u *url.URL) *api.FileResponse {
|
||||||
|
// Just returns fields that don't change, i.e. fields with commit SHAs and dates can't be determined
|
||||||
return &api.FileResponse{
|
return &api.FileResponse{
|
||||||
Content: nil,
|
Content: nil,
|
||||||
Commit: &api.FileCommitResponse{
|
Commit: &api.FileCommitResponse{
|
||||||
CommitMeta: api.CommitMeta{
|
|
||||||
URL: u.String() + "api/v1/repos/user2/repo1/git/commits/65f1bf27bc3bf70f64657658635e66094edbcb4d",
|
|
||||||
SHA: "65f1bf27bc3bf70f64657658635e66094edbcb4d",
|
|
||||||
},
|
|
||||||
HTMLURL: u.String() + "user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d",
|
|
||||||
Author: &api.CommitUser{
|
Author: &api.CommitUser{
|
||||||
Identity: api.Identity{
|
Identity: api.Identity{
|
||||||
Name: "user1",
|
Name: "Bob Smith",
|
||||||
Email: "address1@example.com",
|
Email: "bob@smith.com",
|
||||||
},
|
},
|
||||||
Date: "2017-03-19T20:47:59Z",
|
|
||||||
},
|
},
|
||||||
Committer: &api.CommitUser{
|
Committer: &api.CommitUser{
|
||||||
Identity: api.Identity{
|
Identity: api.Identity{
|
||||||
Name: "Ethan Koenig",
|
Name: "Bob Smith",
|
||||||
Email: "ethantkoenig@gmail.com",
|
Email: "bob@smith.com",
|
||||||
},
|
},
|
||||||
Date: "2017-03-19T20:47:59Z",
|
|
||||||
},
|
|
||||||
Parents: []*api.CommitMeta{},
|
|
||||||
Message: "Initial commit\n",
|
|
||||||
Tree: &api.CommitMeta{
|
|
||||||
URL: u.String() + "api/v1/repos/user2/repo1/git/trees/2a2f1d4670728a2e10049e345bd7a276468beab6",
|
|
||||||
SHA: "2a2f1d4670728a2e10049e345bd7a276468beab6",
|
|
||||||
},
|
},
|
||||||
|
Message: "Deletes README.md\n",
|
||||||
},
|
},
|
||||||
Verification: &api.PayloadCommitVerification{
|
Verification: &api.PayloadCommitVerification{
|
||||||
Verified: false,
|
Verified: false,
|
||||||
|
@ -89,7 +81,12 @@ func testDeleteRepoFile(t *testing.T, u *url.URL) {
|
||||||
fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
|
fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
expectedFileResponse := getExpectedDeleteFileResponse(u)
|
expectedFileResponse := getExpectedDeleteFileResponse(u)
|
||||||
assert.EqualValues(t, expectedFileResponse, fileResponse)
|
assert.NotNil(t, fileResponse)
|
||||||
|
assert.Nil(t, fileResponse.Content)
|
||||||
|
assert.EqualValues(t, expectedFileResponse.Commit.Message, fileResponse.Commit.Message)
|
||||||
|
assert.EqualValues(t, expectedFileResponse.Commit.Author.Identity, fileResponse.Commit.Author.Identity)
|
||||||
|
assert.EqualValues(t, expectedFileResponse.Commit.Committer.Identity, fileResponse.Commit.Committer.Identity)
|
||||||
|
assert.EqualValues(t, expectedFileResponse.Verification, fileResponse.Verification)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Verify README.md has been deleted", func(t *testing.T) {
|
t.Run("Verify README.md has been deleted", func(t *testing.T) {
|
||||||
|
@ -124,7 +121,12 @@ func testDeleteRepoFileWithoutBranchNames(t *testing.T, u *url.URL) {
|
||||||
fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
|
fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
expectedFileResponse := getExpectedDeleteFileResponse(u)
|
expectedFileResponse := getExpectedDeleteFileResponse(u)
|
||||||
assert.EqualValues(t, expectedFileResponse, fileResponse)
|
assert.NotNil(t, fileResponse)
|
||||||
|
assert.Nil(t, fileResponse.Content)
|
||||||
|
assert.EqualValues(t, expectedFileResponse.Commit.Message, fileResponse.Commit.Message)
|
||||||
|
assert.EqualValues(t, expectedFileResponse.Commit.Author.Identity, fileResponse.Commit.Author.Identity)
|
||||||
|
assert.EqualValues(t, expectedFileResponse.Commit.Committer.Identity, fileResponse.Commit.Committer.Identity)
|
||||||
|
assert.EqualValues(t, expectedFileResponse.Verification, fileResponse.Verification)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -198,6 +198,11 @@ func DeleteRepoFile(repo *models.Repository, doer *models.User, opts *DeleteRepo
|
||||||
return nil, fmt.Errorf("PushUpdate: %v", err)
|
return nil, fmt.Errorf("PushUpdate: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
commit, err = t.GetCommit(commitHash)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
file, err := GetFileResponseFromCommit(repo, commit, opts.NewBranch, treePath)
|
file, err := GetFileResponseFromCommit(repo, commit, opts.NewBranch, treePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -8,7 +8,7 @@ package structs
|
||||||
// FileOptions options for all file APIs
|
// FileOptions options for all file APIs
|
||||||
type FileOptions struct {
|
type FileOptions struct {
|
||||||
// message (optional) for the commit of this file. if not supplied, a default message will be used
|
// message (optional) for the commit of this file. if not supplied, a default message will be used
|
||||||
Message string `json:"message" binding:"Required"`
|
Message string `json:"message"`
|
||||||
// branch (optional) to base this file from. if not given, the default branch is used
|
// branch (optional) to base this file from. if not given, the default branch is used
|
||||||
BranchName string `json:"branch"`
|
BranchName string `json:"branch"`
|
||||||
// new_branch (optional) will make a new branch from `branch` before creating the file
|
// new_branch (optional) will make a new branch from `branch` before creating the file
|
||||||
|
|
|
@ -204,6 +204,11 @@ func CreateFile(ctx *context.APIContext, apiOpts api.CreateFileOptions) {
|
||||||
Email: apiOpts.Author.Email,
|
Email: apiOpts.Author.Email,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.Message == "" {
|
||||||
|
opts.Message = ctx.Tr("repo.editor.add", opts.TreePath)
|
||||||
|
}
|
||||||
|
|
||||||
if fileResponse, err := createOrUpdateFile(ctx, opts); err != nil {
|
if fileResponse, err := createOrUpdateFile(ctx, opts); err != nil {
|
||||||
ctx.Error(http.StatusInternalServerError, "CreateFile", err)
|
ctx.Error(http.StatusInternalServerError, "CreateFile", err)
|
||||||
} else {
|
} else {
|
||||||
|
@ -264,6 +269,10 @@ func UpdateFile(ctx *context.APIContext, apiOpts api.UpdateFileOptions) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.Message == "" {
|
||||||
|
opts.Message = ctx.Tr("repo.editor.update", opts.TreePath)
|
||||||
|
}
|
||||||
|
|
||||||
if fileResponse, err := createOrUpdateFile(ctx, opts); err != nil {
|
if fileResponse, err := createOrUpdateFile(ctx, opts); err != nil {
|
||||||
ctx.Error(http.StatusInternalServerError, "UpdateFile", err)
|
ctx.Error(http.StatusInternalServerError, "UpdateFile", err)
|
||||||
} else {
|
} else {
|
||||||
|
@ -346,6 +355,10 @@ func DeleteFile(ctx *context.APIContext, apiOpts api.DeleteFileOptions) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.Message == "" {
|
||||||
|
opts.Message = ctx.Tr("repo.editor.delete", opts.TreePath)
|
||||||
|
}
|
||||||
|
|
||||||
if fileResponse, err := repofiles.DeleteRepoFile(ctx.Repo.Repository, ctx.User, opts); err != nil {
|
if fileResponse, err := repofiles.DeleteRepoFile(ctx.Repo.Repository, ctx.User, opts); err != nil {
|
||||||
ctx.Error(http.StatusInternalServerError, "DeleteFile", err)
|
ctx.Error(http.StatusInternalServerError, "DeleteFile", err)
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue