Post(bindIgnErr(auth.EditRepoFileForm{}), repo.EditFilePost) | Post(bindIgnErr(auth.EditRepoFileForm{}), repo.EditFilePost) | ||||
m.Combo("/_new/*").Get(repo.NewFile). | m.Combo("/_new/*").Get(repo.NewFile). | ||||
Post(bindIgnErr(auth.EditRepoFileForm{}), repo.NewFilePost) | Post(bindIgnErr(auth.EditRepoFileForm{}), repo.NewFilePost) | ||||
m.Post("/preview/*", bindIgnErr(auth.EditPreviewDiffForm{}), repo.DiffPreviewPost) | |||||
m.Post("/_preview/*", bindIgnErr(auth.EditPreviewDiffForm{}), repo.DiffPreviewPost) | |||||
m.Combo("/upload/*").Get(repo.UploadFile). | m.Combo("/upload/*").Get(repo.UploadFile). | ||||
Post(bindIgnErr(auth.UploadRepoFileForm{}), repo.UploadFilePost) | Post(bindIgnErr(auth.UploadRepoFileForm{}), repo.UploadFilePost) | ||||
m.Post("/delete/*", bindIgnErr(auth.DeleteRepoFileForm{}), repo.DeleteFilePost) | |||||
m.Post("/_delete/*", bindIgnErr(auth.DeleteRepoFileForm{}), repo.DeleteFilePost) | |||||
m.Post("/branches", bindIgnErr(auth.NewBranchForm{}), repo.NewBranchPost) | m.Post("/branches", bindIgnErr(auth.NewBranchForm{}), repo.NewBranchPost) | ||||
m.Post("/upload-file", repo.UploadFileToServer) | m.Post("/upload-file", repo.UploadFileToServer) | ||||
m.Post("/upload-remove", bindIgnErr(auth.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer) | m.Post("/upload-remove", bindIgnErr(auth.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer) | ||||
}, reqRepoWriter, context.RepoRef()) | |||||
}, reqRepoWriter, context.RepoRef(), func(ctx *context.Context) { | |||||
if ctx.Repo.IsViewCommit { | |||||
ctx.Handle(404, "", nil) | |||||
return | |||||
} | |||||
}) | |||||
}, reqSignIn, context.RepoAssignment(), repo.MustBeNotBare) | }, reqSignIn, context.RepoAssignment(), repo.MustBeNotBare) | ||||
m.Group("/:username/:reponame", func() { | m.Group("/:username/:reponame", func() { |
return forks, x.Find(&forks, &Repository{ForkID: repo.ID}) | return forks, x.Find(&forks, &Repository{ForkID: repo.ID}) | ||||
} | } | ||||
// ________ .__ __ ___________.__.__ | |||||
// \______ \ ____ | | _____/ |_ ____ \_ _____/|__| | ____ | |||||
// | | \_/ __ \| | _/ __ \ __\/ __ \ | __) | | | _/ __ \ | |||||
// | ` \ ___/| |_\ ___/| | \ ___/ | \ | | |_\ ___/ | |||||
// /_______ /\___ >____/\___ >__| \___ > \___ / |__|____/\___ > | |||||
// \/ \/ \/ \/ \/ \/ | |||||
// | |||||
func (repo *Repository) DeleteRepoFile(doer *User, branch, treeName, message string) (err error) { | |||||
repoWorkingPool.CheckIn(com.ToStr(repo.ID)) | |||||
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID)) | |||||
localPath := repo.LocalCopyPath() | |||||
if err = discardLocalRepoBranchChanges(localPath, branch); err != nil { | |||||
return fmt.Errorf("discardLocalRepoChanges: %v", err) | |||||
} else if err = repo.UpdateLocalCopyBranch(branch); err != nil { | |||||
return fmt.Errorf("UpdateLocalCopyBranch: %v", err) | |||||
} | |||||
filePath := path.Join(localPath, treeName) | |||||
os.Remove(filePath) | |||||
if len(message) == 0 { | |||||
message = "Delete file '" + treeName + "'" | |||||
} | |||||
if err = git.AddChanges(localPath, true); err != nil { | |||||
return fmt.Errorf("AddChanges: %v", err) | |||||
} else if err = git.CommitChanges(localPath, message, doer.NewGitSig()); err != nil { | |||||
return fmt.Errorf("CommitChanges: %v", err) | |||||
} else if err = git.Push(localPath, "origin", branch); err != nil { | |||||
return fmt.Errorf("Push: %v", err) | |||||
} | |||||
return nil | |||||
} | |||||
// ____ ___ .__ .___ ___________.___.__ | // ____ ___ .__ .___ ___________.___.__ | ||||
// | | \______ | | _________ __| _/ \_ _____/| | | ____ ______ | // | | \______ | | _________ __| _/ \_ _____/| | | ____ ______ | ||||
// | | /\____ \| | / _ \__ \ / __ | | __) | | | _/ __ \ / ___/ | // | | /\____ \| | / _ \__ \ / __ | | __) | | | _/ __ \ / ___/ |
return diff, nil | return diff, nil | ||||
} | } | ||||
// ________ .__ __ ___________.__.__ | |||||
// \______ \ ____ | | _____/ |_ ____ \_ _____/|__| | ____ | |||||
// | | \_/ __ \| | _/ __ \ __\/ __ \ | __) | | | _/ __ \ | |||||
// | ` \ ___/| |_\ ___/| | \ ___/ | \ | | |_\ ___/ | |||||
// /_______ /\___ >____/\___ >__| \___ > \___ / |__|____/\___ > | |||||
// \/ \/ \/ \/ \/ \/ | |||||
// | |||||
func (repo *Repository) DeleteRepoFile(doer *User, oldCommitID, branch, treeName, message string) (err error) { | |||||
repoWorkingPool.CheckIn(com.ToStr(repo.ID)) | |||||
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID)) | |||||
localPath := repo.LocalCopyPath() | |||||
if err = discardLocalRepoBranchChanges(localPath, branch); err != nil { | |||||
return fmt.Errorf("discardLocalRepoChanges: %v", err) | |||||
} else if err = repo.UpdateLocalCopyBranch(branch); err != nil { | |||||
return fmt.Errorf("UpdateLocalCopyBranch: %v", err) | |||||
} | |||||
filePath := path.Join(localPath, treeName) | |||||
os.Remove(filePath) | |||||
if len(message) == 0 { | |||||
message = "Delete file '" + treeName + "'" | |||||
} | |||||
if err = git.AddChanges(localPath, true); err != nil { | |||||
return fmt.Errorf("AddChanges: %v", err) | |||||
} else if err = git.CommitChanges(localPath, message, doer.NewGitSig()); err != nil { | |||||
return fmt.Errorf("CommitChanges: %v", err) | |||||
} else if err = git.Push(localPath, "origin", branch); err != nil { | |||||
return fmt.Errorf("Push: %v", err) | |||||
} | |||||
gitRepo, err := git.OpenRepository(repo.RepoPath()) | |||||
if err != nil { | |||||
log.Error(4, "OpenRepository: %v", err) | |||||
return nil | |||||
} | |||||
commit, err := gitRepo.GetBranchCommit(branch) | |||||
if err != nil { | |||||
log.Error(4, "GetBranchCommit [branch: %s]: %v", branch, err) | |||||
return nil | |||||
} | |||||
pushCommits := &PushCommits{ | |||||
Len: 1, | |||||
Commits: []*PushCommit{CommitToPushCommit(commit)}, | |||||
} | |||||
if err := CommitRepoAction(doer.ID, repo.MustOwner().ID, doer.Name, doer.Email, | |||||
repo.ID, repo.MustOwner().Name, repo.Name, git.BRANCH_PREFIX+branch, | |||||
pushCommits, oldCommitID, commit.ID.String()); err != nil { | |||||
log.Error(4, "CommitRepoAction: %v", err) | |||||
return nil | |||||
} | |||||
go HookQueue.Add(repo.ID) | |||||
return nil | |||||
} |
// Copyright 2016 The Gogs 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 ( | |||||
"github.com/gogits/gogs/models" | |||||
"github.com/gogits/gogs/modules/auth" | |||||
"github.com/gogits/gogs/modules/context" | |||||
"github.com/gogits/gogs/modules/log" | |||||
) | |||||
func DeleteFilePost(ctx *context.Context, form auth.DeleteRepoFileForm) { | |||||
branchName := ctx.Repo.BranchName | |||||
treeName := ctx.Repo.TreeName | |||||
if ctx.HasError() { | |||||
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + branchName + "/" + treeName) | |||||
return | |||||
} | |||||
if err := ctx.Repo.Repository.DeleteRepoFile(ctx.User, branchName, treeName, form.CommitSummary); err != nil { | |||||
ctx.Handle(500, "DeleteRepoFile", err) | |||||
return | |||||
} | |||||
// Was successful, so now need to call models.CommitRepoAction() with the new commitID for webhooks and watchers | |||||
if branch, err := ctx.Repo.Repository.GetBranch(branchName); err != nil { | |||||
log.Error(4, "repo.Repository.GetBranch(%s): %v", branchName, err) | |||||
} else if commit, err := branch.GetCommit(); err != nil { | |||||
log.Error(4, "branch.GetCommit(): %v", err) | |||||
} else { | |||||
pc := &models.PushCommits{ | |||||
Len: 1, | |||||
Commits: []*models.PushCommit{models.CommitToPushCommit(commit)}, | |||||
} | |||||
oldCommitID := ctx.Repo.CommitID | |||||
newCommitID := commit.ID.String() | |||||
if err := models.CommitRepoAction(ctx.User.ID, ctx.Repo.Owner.ID, ctx.User.LowerName, ctx.Repo.Owner.Email, | |||||
ctx.Repo.Repository.ID, ctx.Repo.Owner.LowerName, ctx.Repo.Repository.Name, "refs/heads/"+branchName, pc, | |||||
oldCommitID, newCommitID); err != nil { | |||||
log.Error(4, "models.CommitRepoAction(branch = %s): %v", branchName, err) | |||||
} | |||||
models.HookQueue.Add(ctx.Repo.Repository.ID) | |||||
} | |||||
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + branchName) | |||||
} |
) | ) | ||||
func editFile(ctx *context.Context, isNewFile bool) { | func editFile(ctx *context.Context, isNewFile bool) { | ||||
// Don't allow edit a file in a specific commit. | |||||
if ctx.Repo.IsViewCommit { | |||||
ctx.Handle(404, "", nil) | |||||
return | |||||
} | |||||
ctx.Data["PageIsEdit"] = true | ctx.Data["PageIsEdit"] = true | ||||
ctx.Data["IsNewFile"] = isNewFile | ctx.Data["IsNewFile"] = isNewFile | ||||
ctx.Data["RequireHighlightJS"] = true | ctx.Data["RequireHighlightJS"] = true | ||||
ctx.HTML(200, DIFF_PREVIEW) | ctx.HTML(200, DIFF_PREVIEW) | ||||
} | } | ||||
func DeleteFilePost(ctx *context.Context, form auth.DeleteRepoFileForm) { | |||||
branchName := ctx.Repo.BranchName | |||||
treeName := ctx.Repo.TreeName | |||||
if ctx.HasError() { | |||||
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + branchName + "/" + treeName) | |||||
return | |||||
} | |||||
if err := ctx.Repo.Repository.DeleteRepoFile(ctx.User, ctx.Repo.CommitID, branchName, treeName, form.CommitSummary); err != nil { | |||||
ctx.Handle(500, "DeleteRepoFile", err) | |||||
return | |||||
} | |||||
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + branchName) | |||||
} |
rawLink := ctx.Repo.RepoLink + "/raw/" + branchName | rawLink := ctx.Repo.RepoLink + "/raw/" + branchName | ||||
editLink := ctx.Repo.RepoLink + "/_edit/" + branchName | editLink := ctx.Repo.RepoLink + "/_edit/" + branchName | ||||
newFileLink := ctx.Repo.RepoLink + "/_new/" + branchName | newFileLink := ctx.Repo.RepoLink + "/_new/" + branchName | ||||
deleteLink := ctx.Repo.RepoLink + "/delete/" + branchName | |||||
forkLink := setting.AppSubUrl + "/repo/fork/" + strconv.FormatInt(ctx.Repo.Repository.ID, 10) | forkLink := setting.AppSubUrl + "/repo/fork/" + strconv.FormatInt(ctx.Repo.Repository.ID, 10) | ||||
uploadFileLink := ctx.Repo.RepoLink + "/upload/" + branchName | uploadFileLink := ctx.Repo.RepoLink + "/upload/" + branchName | ||||
} | } | ||||
if ctx.Repo.IsWriter() && ctx.Repo.IsViewBranch { | if ctx.Repo.IsWriter() && ctx.Repo.IsViewBranch { | ||||
ctx.Data["FileDeleteLink"] = deleteLink + "/" + treename | |||||
ctx.Data["FileDeleteLinkTooltip"] = ctx.Tr("repo.delete_this_file") | ctx.Data["FileDeleteLinkTooltip"] = ctx.Tr("repo.delete_this_file") | ||||
} else { | } else { | ||||
if !ctx.Repo.IsViewBranch { | if !ctx.Repo.IsViewBranch { | ||||
ctx.Data["LastCommitUser"] = models.ValidateCommitWithEmail(lastCommit) | ctx.Data["LastCommitUser"] = models.ValidateCommitWithEmail(lastCommit) | ||||
if ctx.Repo.IsWriter() && ctx.Repo.IsViewBranch { | if ctx.Repo.IsWriter() && ctx.Repo.IsViewBranch { | ||||
ctx.Data["NewFileLink"] = newFileLink + "/" + treename | ctx.Data["NewFileLink"] = newFileLink + "/" + treename | ||||
if !setting.Repository.Upload.Enabled { | |||||
if setting.Repository.Upload.Enabled { | |||||
ctx.Data["UploadFileLink"] = uploadFileLink + "/" + treename | ctx.Data["UploadFileLink"] = uploadFileLink + "/" + treename | ||||
} | } | ||||
} | } |
<div class="ui top attached tabular menu" data-write="write" data-preview="preview" data-diff="diff"> | <div class="ui top attached tabular menu" data-write="write" data-preview="preview" data-diff="diff"> | ||||
<a class="active item" data-tab="write"><i class="octicon octicon-code"></i> {{.i18n.Tr "repo.edit_file"}}</a> | <a class="active item" data-tab="write"><i class="octicon octicon-code"></i> {{.i18n.Tr "repo.edit_file"}}</a> | ||||
<a class="item" data-tab="preview" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{.RepoLink}}" data-preview-file-modes="{{.PreviewableFileModes}}"><i class="octicon octicon-eye"></i> {{.i18n.Tr "repo.release.preview"}}</a> | <a class="item" data-tab="preview" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{.RepoLink}}" data-preview-file-modes="{{.PreviewableFileModes}}"><i class="octicon octicon-eye"></i> {{.i18n.Tr "repo.release.preview"}}</a> | ||||
<a class="item" data-tab="diff" data-url="{{.RepoLink}}/preview/{{.BranchName}}/{{.TreeName}}" data-context="{{.BranchLink}}"><i class="octicon octicon-diff"></i> {{.i18n.Tr "repo.preview_changes"}}</a> | |||||
<a class="item" data-tab="diff" data-url="{{.RepoLink}}/_preview/{{.BranchName}}/{{.TreeName}}" data-context="{{.BranchLink}}"><i class="octicon octicon-diff"></i> {{.i18n.Tr "repo.preview_changes"}}</a> | |||||
</div> | </div> | ||||
<div class="ui bottom attached active tab segment" data-tab="write"> | <div class="ui bottom attached active tab segment" data-tab="write"> | ||||
<textarea id="edit_area" name="content" data-id="repo-{{.Repository.Name}}-{{.TreeName}}" | <textarea id="edit_area" name="content" data-id="repo-{{.Repository.Name}}-{{.TreeName}}" |
{{else}} | {{else}} | ||||
<i class="octicon btn-octicon octicon-pencil poping up disabled" data-content="{{.FileEditLinkTooltip}}" data-position="bottom center" data-variation="tiny inverted"></i> | <i class="octicon btn-octicon octicon-pencil poping up disabled" data-content="{{.FileEditLinkTooltip}}" data-position="bottom center" data-variation="tiny inverted"></i> | ||||
{{end}} | {{end}} | ||||
{{if .FileDeleteLink}} | |||||
<form id="delete-file-form" class="ui form inline-form" action="{{EscapePound $.FileDeleteLink}}" method="post"> | |||||
{{if and .IsViewBranch .IsRepositoryWriter}} | |||||
<form id="delete-file-form" class="ui form inline-form" action="{{.RepoLink}}/_delete/{{EscapePound .BranchName}}/{{.TreeName}}" method="post"> | |||||
{{.CsrfTokenHtml}} | {{.CsrfTokenHtml}} | ||||
<button onclick="submitDeleteForm()" class="octicon octicon-trashcan btn-octicon btn-octicon-danger poping up" type="button" data-content="{{.FileDeleteLinkTooltip}}" data-position="bottom center" data-variation="tiny inverted"></button> | <button onclick="submitDeleteForm()" class="octicon octicon-trashcan btn-octicon btn-octicon-danger poping up" type="button" data-content="{{.FileDeleteLinkTooltip}}" data-position="bottom center" data-variation="tiny inverted"></button> | ||||
<input type="hidden" id="delete-message" name="commit_message" value=""> | <input type="hidden" id="delete-message" name="commit_message" value=""> |