mirror of
https://github.com/go-gitea/gitea.git
synced 2026-09-24 13:25:01 +09:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f301a8aa1a | |||
| b0cc5ccd17 | |||
| 159f74040c | |||
| af29b8182c | |||
| 9d6817f9c0 |
@@ -276,6 +276,9 @@ Gitea or set your environment appropriately.`, "")
|
|||||||
lastline = 0
|
lastline = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
return fail(ctx, "Hook failed: stdin read error", "scanner error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
if count > 0 {
|
if count > 0 {
|
||||||
hookOptions.OldCommitIDs = oldCommitIDs[:count]
|
hookOptions.OldCommitIDs = oldCommitIDs[:count]
|
||||||
@@ -415,6 +418,11 @@ Gitea or set your environment appropriately.`, "")
|
|||||||
count = 0
|
count = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
_ = dWriter.Close()
|
||||||
|
hookPrintResults(results)
|
||||||
|
return fail(ctx, "Hook failed: stdin read error", "scanner error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
if wasEmpty && masterPushed {
|
if wasEmpty && masterPushed {
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ func Test_CalcCommitStatus(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &git_model.CommitStatus{
|
expected: &git_model.CommitStatus{
|
||||||
State: commitstatus.CommitStatusPending,
|
State: commitstatus.CommitStatusFailure,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -59,6 +59,10 @@ func IsDefaultBranchWorkflow(triggedEvent webhook_module.HookEventType) bool {
|
|||||||
// Github "issues" event
|
// Github "issues" event
|
||||||
// https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#issues
|
// https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#issues
|
||||||
return true
|
return true
|
||||||
|
case webhook_module.HookEventWorkflowRun:
|
||||||
|
// GitHub "workflow_run" event
|
||||||
|
// https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -61,16 +61,17 @@ type CommitStatusStates []CommitStatusState //nolint:revive // export stutter
|
|||||||
// According to https://docs.github.com/en/rest/commits/statuses?apiVersion=2022-11-28#get-the-combined-status-for-a-specific-reference
|
// According to https://docs.github.com/en/rest/commits/statuses?apiVersion=2022-11-28#get-the-combined-status-for-a-specific-reference
|
||||||
// > Additionally, a combined state is returned. The state is one of:
|
// > Additionally, a combined state is returned. The state is one of:
|
||||||
// > failure if any of the contexts report as error or failure
|
// > failure if any of the contexts report as error or failure
|
||||||
|
// > failure if any of the contexts report as warning (Gitea specific behavior)
|
||||||
// > pending if there are no statuses or a context is pending
|
// > pending if there are no statuses or a context is pending
|
||||||
// > success if the latest status for all contexts is success
|
// > success if the latest status for all contexts is success
|
||||||
func (css CommitStatusStates) Combine() CommitStatusState {
|
func (css CommitStatusStates) Combine() CommitStatusState {
|
||||||
successCnt := 0
|
successCnt := 0
|
||||||
for _, state := range css {
|
for _, state := range css {
|
||||||
switch {
|
switch {
|
||||||
case state.IsError() || state.IsFailure():
|
case state.IsError() || state.IsFailure() || state.IsWarning():
|
||||||
return CommitStatusFailure
|
return CommitStatusFailure
|
||||||
case state.IsPending():
|
case state.IsPending():
|
||||||
case state.IsSuccess() || state.IsWarning() || state.IsSkipped():
|
case state.IsSuccess() || state.IsSkipped():
|
||||||
successCnt++
|
successCnt++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ func TestCombine(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "warning",
|
name: "warning",
|
||||||
states: CommitStatusStates{CommitStatusWarning},
|
states: CommitStatusStates{CommitStatusWarning},
|
||||||
expected: CommitStatusSuccess,
|
expected: CommitStatusFailure,
|
||||||
},
|
},
|
||||||
// 2 states
|
// 2 states
|
||||||
{
|
{
|
||||||
@@ -62,7 +62,7 @@ func TestCombine(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "pending and warning",
|
name: "pending and warning",
|
||||||
states: CommitStatusStates{CommitStatusPending, CommitStatusWarning},
|
states: CommitStatusStates{CommitStatusPending, CommitStatusWarning},
|
||||||
expected: CommitStatusPending,
|
expected: CommitStatusFailure,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "success and error",
|
name: "success and error",
|
||||||
@@ -77,7 +77,7 @@ func TestCombine(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "success and warning",
|
name: "success and warning",
|
||||||
states: CommitStatusStates{CommitStatusSuccess, CommitStatusWarning},
|
states: CommitStatusStates{CommitStatusSuccess, CommitStatusWarning},
|
||||||
expected: CommitStatusSuccess,
|
expected: CommitStatusFailure,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "error and failure",
|
name: "error and failure",
|
||||||
@@ -98,7 +98,7 @@ func TestCombine(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "pending, success and warning",
|
name: "pending, success and warning",
|
||||||
states: CommitStatusStates{CommitStatusPending, CommitStatusSuccess, CommitStatusWarning},
|
states: CommitStatusStates{CommitStatusPending, CommitStatusSuccess, CommitStatusWarning},
|
||||||
expected: CommitStatusPending,
|
expected: CommitStatusFailure,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "pending, success and error",
|
name: "pending, success and error",
|
||||||
@@ -133,7 +133,7 @@ func TestCombine(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "success, warning and skipped",
|
name: "success, warning and skipped",
|
||||||
states: CommitStatusStates{CommitStatusSuccess, CommitStatusWarning, CommitStatusSkipped},
|
states: CommitStatusStates{CommitStatusSuccess, CommitStatusWarning, CommitStatusSkipped},
|
||||||
expected: CommitStatusSuccess,
|
expected: CommitStatusFailure,
|
||||||
},
|
},
|
||||||
// All success
|
// All success
|
||||||
{
|
{
|
||||||
@@ -181,12 +181,12 @@ func TestCombine(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "mixed states with all success",
|
name: "mixed states with all success",
|
||||||
states: CommitStatusStates{CommitStatusSuccess, CommitStatusSuccess, CommitStatusPending, CommitStatusWarning},
|
states: CommitStatusStates{CommitStatusSuccess, CommitStatusSuccess, CommitStatusPending, CommitStatusWarning},
|
||||||
expected: CommitStatusPending,
|
expected: CommitStatusFailure,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "all success with warning",
|
name: "all success with warning",
|
||||||
states: CommitStatusStates{CommitStatusSuccess, CommitStatusSuccess, CommitStatusSuccess, CommitStatusWarning},
|
states: CommitStatusStates{CommitStatusSuccess, CommitStatusSuccess, CommitStatusSuccess, CommitStatusWarning},
|
||||||
expected: CommitStatusSuccess,
|
expected: CommitStatusFailure,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -347,27 +347,6 @@ func (c *Commit) GetFileContent(filename string, limit int) (string, error) {
|
|||||||
return string(bytes), nil
|
return string(bytes), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetBranchName gets the closest branch name (as returned by 'git name-rev --name-only')
|
|
||||||
func (c *Commit) GetBranchName() (string, error) {
|
|
||||||
cmd := gitcmd.NewCommand("name-rev")
|
|
||||||
if DefaultFeatures().CheckVersionAtLeast("2.13.0") {
|
|
||||||
cmd.AddArguments("--exclude", "refs/tags/*")
|
|
||||||
}
|
|
||||||
cmd.AddArguments("--name-only", "--no-undefined").AddDynamicArguments(c.ID.String())
|
|
||||||
data, _, err := cmd.RunStdString(c.repo.Ctx, &gitcmd.RunOpts{Dir: c.repo.Path})
|
|
||||||
if err != nil {
|
|
||||||
// handle special case where git can not describe commit
|
|
||||||
if strings.Contains(err.Error(), "cannot describe") {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
// name-rev commitID output will be "master" or "master~12"
|
|
||||||
return strings.SplitN(strings.TrimSpace(data), "~", 2)[0], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommitFileStatus represents status of files in a commit.
|
// CommitFileStatus represents status of files in a commit.
|
||||||
type CommitFileStatus struct {
|
type CommitFileStatus struct {
|
||||||
Added []string
|
Added []string
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/templates"
|
"code.gitea.io/gitea/modules/templates"
|
||||||
shared "code.gitea.io/gitea/routers/web/shared/secrets"
|
shared "code.gitea.io/gitea/routers/web/shared/secrets"
|
||||||
@@ -74,7 +73,6 @@ func Secrets(ctx *context.Context) {
|
|||||||
ctx.Data["Title"] = ctx.Tr("actions.actions")
|
ctx.Data["Title"] = ctx.Tr("actions.actions")
|
||||||
ctx.Data["PageType"] = "secrets"
|
ctx.Data["PageType"] = "secrets"
|
||||||
ctx.Data["PageIsSharedSettingsSecrets"] = true
|
ctx.Data["PageIsSharedSettingsSecrets"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
sCtx, err := getSecretsCtx(ctx)
|
sCtx, err := getSecretsCtx(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -321,7 +321,6 @@ func loadAccountData(ctx *context.Context) {
|
|||||||
ctx.Data["Emails"] = emails
|
ctx.Data["Emails"] = emails
|
||||||
ctx.Data["ActivationsPending"] = pendingActivation
|
ctx.Data["ActivationsPending"] = pendingActivation
|
||||||
ctx.Data["CanAddEmails"] = !pendingActivation || !setting.Service.RegisterEmailConfirm
|
ctx.Data["CanAddEmails"] = !pendingActivation || !setting.Service.RegisterEmailConfirm
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
if setting.Service.UserDeleteWithCommentsMaxTime != 0 {
|
if setting.Service.UserDeleteWithCommentsMaxTime != 0 {
|
||||||
ctx.Data["UserDeleteWithCommentsMaxTime"] = setting.Service.UserDeleteWithCommentsMaxTime.String()
|
ctx.Data["UserDeleteWithCommentsMaxTime"] = setting.Service.UserDeleteWithCommentsMaxTime.String()
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import (
|
|||||||
|
|
||||||
auth_model "code.gitea.io/gitea/models/auth"
|
auth_model "code.gitea.io/gitea/models/auth"
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/templates"
|
"code.gitea.io/gitea/modules/templates"
|
||||||
"code.gitea.io/gitea/modules/util"
|
"code.gitea.io/gitea/modules/util"
|
||||||
@@ -27,7 +26,6 @@ const (
|
|||||||
func Applications(ctx *context.Context) {
|
func Applications(ctx *context.Context) {
|
||||||
ctx.Data["Title"] = ctx.Tr("settings.applications")
|
ctx.Data["Title"] = ctx.Tr("settings.applications")
|
||||||
ctx.Data["PageIsSettingsApplications"] = true
|
ctx.Data["PageIsSettingsApplications"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
loadApplicationsData(ctx)
|
loadApplicationsData(ctx)
|
||||||
|
|
||||||
@@ -39,7 +37,6 @@ func ApplicationsPost(ctx *context.Context) {
|
|||||||
form := web.GetForm(ctx).(*forms.NewAccessTokenForm)
|
form := web.GetForm(ctx).(*forms.NewAccessTokenForm)
|
||||||
ctx.Data["Title"] = ctx.Tr("settings")
|
ctx.Data["Title"] = ctx.Tr("settings")
|
||||||
ctx.Data["PageIsSettingsApplications"] = true
|
ctx.Data["PageIsSettingsApplications"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
_ = ctx.Req.ParseForm()
|
_ = ctx.Req.ParseForm()
|
||||||
var scopeNames []string
|
var scopeNames []string
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ package setting
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/templates"
|
"code.gitea.io/gitea/modules/templates"
|
||||||
shared_user "code.gitea.io/gitea/routers/web/shared/user"
|
shared_user "code.gitea.io/gitea/routers/web/shared/user"
|
||||||
@@ -20,7 +19,6 @@ const (
|
|||||||
func BlockedUsers(ctx *context.Context) {
|
func BlockedUsers(ctx *context.Context) {
|
||||||
ctx.Data["Title"] = ctx.Tr("user.block.list")
|
ctx.Data["Title"] = ctx.Tr("user.block.list")
|
||||||
ctx.Data["PageIsSettingsBlockedUsers"] = true
|
ctx.Data["PageIsSettingsBlockedUsers"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
shared_user.BlockedUsers(ctx, ctx.Doer)
|
shared_user.BlockedUsers(ctx, ctx.Doer)
|
||||||
if ctx.Written() {
|
if ctx.Written() {
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ func Keys(ctx *context.Context) {
|
|||||||
ctx.Data["DisableSSH"] = setting.SSH.Disabled
|
ctx.Data["DisableSSH"] = setting.SSH.Disabled
|
||||||
ctx.Data["BuiltinSSH"] = setting.SSH.StartBuiltinServer
|
ctx.Data["BuiltinSSH"] = setting.SSH.StartBuiltinServer
|
||||||
ctx.Data["AllowPrincipals"] = setting.SSH.AuthorizedPrincipalsEnabled
|
ctx.Data["AllowPrincipals"] = setting.SSH.AuthorizedPrincipalsEnabled
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
loadKeysData(ctx)
|
loadKeysData(ctx)
|
||||||
|
|
||||||
@@ -50,7 +49,6 @@ func KeysPost(ctx *context.Context) {
|
|||||||
ctx.Data["DisableSSH"] = setting.SSH.Disabled
|
ctx.Data["DisableSSH"] = setting.SSH.Disabled
|
||||||
ctx.Data["BuiltinSSH"] = setting.SSH.StartBuiltinServer
|
ctx.Data["BuiltinSSH"] = setting.SSH.StartBuiltinServer
|
||||||
ctx.Data["AllowPrincipals"] = setting.SSH.AuthorizedPrincipalsEnabled
|
ctx.Data["AllowPrincipals"] = setting.SSH.AuthorizedPrincipalsEnabled
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
if ctx.HasError() {
|
if ctx.HasError() {
|
||||||
loadKeysData(ctx)
|
loadKeysData(ctx)
|
||||||
@@ -341,5 +339,4 @@ func loadKeysData(ctx *context.Context) {
|
|||||||
|
|
||||||
ctx.Data["VerifyingID"] = ctx.FormString("verify_gpg")
|
ctx.Data["VerifyingID"] = ctx.FormString("verify_gpg")
|
||||||
ctx.Data["VerifyingFingerprint"] = ctx.FormString("verify_ssh")
|
ctx.Data["VerifyingFingerprint"] = ctx.FormString("verify_ssh")
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ const (
|
|||||||
func Packages(ctx *context.Context) {
|
func Packages(ctx *context.Context) {
|
||||||
ctx.Data["Title"] = ctx.Tr("packages.title")
|
ctx.Data["Title"] = ctx.Tr("packages.title")
|
||||||
ctx.Data["PageIsSettingsPackages"] = true
|
ctx.Data["PageIsSettingsPackages"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
shared.SetPackagesContext(ctx, ctx.Doer)
|
shared.SetPackagesContext(ctx, ctx.Doer)
|
||||||
|
|
||||||
@@ -35,7 +34,6 @@ func Packages(ctx *context.Context) {
|
|||||||
func PackagesRuleAdd(ctx *context.Context) {
|
func PackagesRuleAdd(ctx *context.Context) {
|
||||||
ctx.Data["Title"] = ctx.Tr("packages.title")
|
ctx.Data["Title"] = ctx.Tr("packages.title")
|
||||||
ctx.Data["PageIsSettingsPackages"] = true
|
ctx.Data["PageIsSettingsPackages"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
shared.SetRuleAddContext(ctx)
|
shared.SetRuleAddContext(ctx)
|
||||||
|
|
||||||
@@ -45,7 +43,6 @@ func PackagesRuleAdd(ctx *context.Context) {
|
|||||||
func PackagesRuleEdit(ctx *context.Context) {
|
func PackagesRuleEdit(ctx *context.Context) {
|
||||||
ctx.Data["Title"] = ctx.Tr("packages.title")
|
ctx.Data["Title"] = ctx.Tr("packages.title")
|
||||||
ctx.Data["PageIsSettingsPackages"] = true
|
ctx.Data["PageIsSettingsPackages"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
shared.SetRuleEditContext(ctx, ctx.Doer)
|
shared.SetRuleEditContext(ctx, ctx.Doer)
|
||||||
|
|
||||||
@@ -55,7 +52,6 @@ func PackagesRuleEdit(ctx *context.Context) {
|
|||||||
func PackagesRuleAddPost(ctx *context.Context) {
|
func PackagesRuleAddPost(ctx *context.Context) {
|
||||||
ctx.Data["Title"] = ctx.Tr("settings")
|
ctx.Data["Title"] = ctx.Tr("settings")
|
||||||
ctx.Data["PageIsSettingsPackages"] = true
|
ctx.Data["PageIsSettingsPackages"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
shared.PerformRuleAddPost(
|
shared.PerformRuleAddPost(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -68,7 +64,6 @@ func PackagesRuleAddPost(ctx *context.Context) {
|
|||||||
func PackagesRuleEditPost(ctx *context.Context) {
|
func PackagesRuleEditPost(ctx *context.Context) {
|
||||||
ctx.Data["Title"] = ctx.Tr("packages.title")
|
ctx.Data["Title"] = ctx.Tr("packages.title")
|
||||||
ctx.Data["PageIsSettingsPackages"] = true
|
ctx.Data["PageIsSettingsPackages"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
shared.PerformRuleEditPost(
|
shared.PerformRuleEditPost(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -81,7 +76,6 @@ func PackagesRuleEditPost(ctx *context.Context) {
|
|||||||
func PackagesRulePreview(ctx *context.Context) {
|
func PackagesRulePreview(ctx *context.Context) {
|
||||||
ctx.Data["Title"] = ctx.Tr("packages.title")
|
ctx.Data["Title"] = ctx.Tr("packages.title")
|
||||||
ctx.Data["PageIsSettingsPackages"] = true
|
ctx.Data["PageIsSettingsPackages"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
shared.SetRulePreviewContext(ctx, ctx.Doer)
|
shared.SetRulePreviewContext(ctx, ctx.Doer)
|
||||||
|
|
||||||
|
|||||||
@@ -49,8 +49,6 @@ func Profile(ctx *context.Context) {
|
|||||||
ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice()
|
ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice()
|
||||||
ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx)
|
ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx)
|
||||||
|
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
ctx.HTML(http.StatusOK, tplSettingsProfile)
|
ctx.HTML(http.StatusOK, tplSettingsProfile)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +58,6 @@ func ProfilePost(ctx *context.Context) {
|
|||||||
ctx.Data["PageIsSettingsProfile"] = true
|
ctx.Data["PageIsSettingsProfile"] = true
|
||||||
ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice()
|
ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice()
|
||||||
ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx)
|
ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx)
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
if ctx.HasError() {
|
if ctx.HasError() {
|
||||||
ctx.HTML(http.StatusOK, tplSettingsProfile)
|
ctx.HTML(http.StatusOK, tplSettingsProfile)
|
||||||
@@ -200,7 +197,6 @@ func DeleteAvatar(ctx *context.Context) {
|
|||||||
func Organization(ctx *context.Context) {
|
func Organization(ctx *context.Context) {
|
||||||
ctx.Data["Title"] = ctx.Tr("settings.organization")
|
ctx.Data["Title"] = ctx.Tr("settings.organization")
|
||||||
ctx.Data["PageIsSettingsOrganization"] = true
|
ctx.Data["PageIsSettingsOrganization"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
opts := organization.FindOrgOptions{
|
opts := organization.FindOrgOptions{
|
||||||
ListOptions: db.ListOptions{
|
ListOptions: db.ListOptions{
|
||||||
@@ -232,7 +228,6 @@ func Organization(ctx *context.Context) {
|
|||||||
func Repos(ctx *context.Context) {
|
func Repos(ctx *context.Context) {
|
||||||
ctx.Data["Title"] = ctx.Tr("settings.repos")
|
ctx.Data["Title"] = ctx.Tr("settings.repos")
|
||||||
ctx.Data["PageIsSettingsRepos"] = true
|
ctx.Data["PageIsSettingsRepos"] = true
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
ctx.Data["allowAdopt"] = ctx.IsUserSiteAdmin() || setting.Repository.AllowAdoptionOfUnadoptedRepositories
|
ctx.Data["allowAdopt"] = ctx.IsUserSiteAdmin() || setting.Repository.AllowAdoptionOfUnadoptedRepositories
|
||||||
ctx.Data["allowDelete"] = ctx.IsUserSiteAdmin() || setting.Repository.AllowDeleteOfUnadoptedRepositories
|
ctx.Data["allowDelete"] = ctx.IsUserSiteAdmin() || setting.Repository.AllowDeleteOfUnadoptedRepositories
|
||||||
|
|
||||||
@@ -340,7 +335,6 @@ func Appearance(ctx *context.Context) {
|
|||||||
ctx.Data["Title"] = ctx.Tr("settings.appearance")
|
ctx.Data["Title"] = ctx.Tr("settings.appearance")
|
||||||
ctx.Data["PageIsSettingsAppearance"] = true
|
ctx.Data["PageIsSettingsAppearance"] = true
|
||||||
ctx.Data["AllThemes"] = webtheme.GetAvailableThemes()
|
ctx.Data["AllThemes"] = webtheme.GetAvailableThemes()
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
var hiddenCommentTypes *big.Int
|
var hiddenCommentTypes *big.Int
|
||||||
val, err := user_model.GetUserSetting(ctx, ctx.Doer.ID, user_model.SettingsKeyHiddenCommentTypes)
|
val, err := user_model.GetUserSetting(ctx, ctx.Doer.ID, user_model.SettingsKeyHiddenCommentTypes)
|
||||||
|
|||||||
@@ -156,5 +156,4 @@ func loadSecurityData(ctx *context.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
ctx.Data["OpenIDs"] = openid
|
ctx.Data["OpenIDs"] = openid
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,17 @@ import (
|
|||||||
|
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
"code.gitea.io/gitea/modules/json"
|
"code.gitea.io/gitea/modules/json"
|
||||||
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/services/context"
|
"code.gitea.io/gitea/services/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func SettingsCtxData(ctx *context.Context) {
|
||||||
|
ctx.Data["PageIsUserSettings"] = true
|
||||||
|
ctx.Data["EnablePackages"] = setting.Packages.Enabled
|
||||||
|
ctx.Data["EnableNotifyMail"] = setting.Service.EnableNotifyMail
|
||||||
|
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
||||||
|
}
|
||||||
|
|
||||||
func UpdatePreferences(ctx *context.Context) {
|
func UpdatePreferences(ctx *context.Context) {
|
||||||
type preferencesForm struct {
|
type preferencesForm struct {
|
||||||
CodeViewShowFileTree bool `json:"codeViewShowFileTree"`
|
CodeViewShowFileTree bool `json:"codeViewShowFileTree"`
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
|
||||||
"code.gitea.io/gitea/models/webhook"
|
"code.gitea.io/gitea/models/webhook"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/templates"
|
"code.gitea.io/gitea/modules/templates"
|
||||||
@@ -25,7 +24,6 @@ func Webhooks(ctx *context.Context) {
|
|||||||
ctx.Data["BaseLink"] = setting.AppSubURL + "/user/settings/hooks"
|
ctx.Data["BaseLink"] = setting.AppSubURL + "/user/settings/hooks"
|
||||||
ctx.Data["BaseLinkNew"] = setting.AppSubURL + "/user/settings/hooks"
|
ctx.Data["BaseLinkNew"] = setting.AppSubURL + "/user/settings/hooks"
|
||||||
ctx.Data["Description"] = ctx.Tr("settings.hooks.desc")
|
ctx.Data["Description"] = ctx.Tr("settings.hooks.desc")
|
||||||
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
|
|
||||||
|
|
||||||
ws, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{OwnerID: ctx.Doer.ID})
|
ws, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{OwnerID: ctx.Doer.ID})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
+1
-1
@@ -682,7 +682,7 @@ func registerWebRoutes(m *web.Router) {
|
|||||||
m.Get("", user_setting.BlockedUsers)
|
m.Get("", user_setting.BlockedUsers)
|
||||||
m.Post("", web.Bind(forms.BlockUserForm{}), user_setting.BlockedUsersPost)
|
m.Post("", web.Bind(forms.BlockUserForm{}), user_setting.BlockedUsersPost)
|
||||||
})
|
})
|
||||||
}, reqSignIn, ctxDataSet("PageIsUserSettings", true, "EnablePackages", setting.Packages.Enabled, "EnableNotifyMail", setting.Service.EnableNotifyMail))
|
}, reqSignIn, user_setting.SettingsCtxData)
|
||||||
|
|
||||||
m.Group("/user", func() {
|
m.Group("/user", func() {
|
||||||
m.Get("/activate", auth.Activate)
|
m.Get("/activate", auth.Activate)
|
||||||
|
|||||||
@@ -36,14 +36,27 @@ func StopEndlessTasks(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func notifyWorkflowJobStatusUpdate(ctx context.Context, jobs []*actions_model.ActionRunJob) {
|
func notifyWorkflowJobStatusUpdate(ctx context.Context, jobs []*actions_model.ActionRunJob) {
|
||||||
if len(jobs) > 0 {
|
if len(jobs) == 0 {
|
||||||
CreateCommitStatus(ctx, jobs...)
|
return
|
||||||
for _, job := range jobs {
|
}
|
||||||
_ = job.LoadAttributes(ctx)
|
|
||||||
notify_service.WorkflowJobStatusUpdate(ctx, job.Run.Repo, job.Run.TriggerUser, job, nil)
|
CreateCommitStatus(ctx, jobs...)
|
||||||
|
|
||||||
|
runs := make(map[int64]*actions_model.ActionRun, len(jobs))
|
||||||
|
for _, job := range jobs {
|
||||||
|
if err := job.LoadAttributes(ctx); err != nil {
|
||||||
|
log.Error("Failed to load job attributes: %v", err)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
job := jobs[0]
|
|
||||||
notify_service.WorkflowRunStatusUpdate(ctx, job.Run.Repo, job.Run.TriggerUser, job.Run)
|
notify_service.WorkflowJobStatusUpdate(ctx, job.Run.Repo, job.Run.TriggerUser, job, nil)
|
||||||
|
if _, ok := runs[job.RunID]; !ok {
|
||||||
|
runs[job.RunID] = job.Run
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, run := range runs {
|
||||||
|
notify_service.WorkflowRunStatusUpdate(ctx, run.Repo, run.TriggerUser, run)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -816,12 +816,14 @@ func (n *actionsNotifier) WorkflowRunStatusUpdate(ctx context.Context, repo *rep
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
newNotifyInput(repo, sender, webhook_module.HookEventWorkflowRun).WithPayload(&api.WorkflowRunPayload{
|
newNotifyInput(repo, sender, webhook_module.HookEventWorkflowRun).
|
||||||
Action: status,
|
WithRef(git.RefNameFromBranch(repo.DefaultBranch).String()).
|
||||||
Workflow: convertedWorkflow,
|
WithPayload(&api.WorkflowRunPayload{
|
||||||
WorkflowRun: convertedRun,
|
Action: status,
|
||||||
Organization: org,
|
Workflow: convertedWorkflow,
|
||||||
Repo: convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm_model.AccessModeOwner}),
|
WorkflowRun: convertedRun,
|
||||||
Sender: convert.ToUser(ctx, sender, nil),
|
Organization: org,
|
||||||
}).Notify(ctx)
|
Repo: convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm_model.AccessModeOwner}),
|
||||||
|
Sender: convert.ToUser(ctx, sender, nil),
|
||||||
|
}).Notify(ctx)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -390,14 +390,12 @@ func ToActionWorkflowJob(ctx context.Context, repo *repo_model.Repository, task
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getActionWorkflowEntry(ctx context.Context, repo *repo_model.Repository, commit *git.Commit, folder string, entry *git.TreeEntry) *api.ActionWorkflow {
|
func getActionWorkflowEntry(ctx context.Context, repo *repo_model.Repository, commit *git.Commit, branchName, folder string, entry *git.TreeEntry) *api.ActionWorkflow {
|
||||||
cfgUnit := repo.MustGetUnit(ctx, unit.TypeActions)
|
cfgUnit := repo.MustGetUnit(ctx, unit.TypeActions)
|
||||||
cfg := cfgUnit.ActionsConfig()
|
cfg := cfgUnit.ActionsConfig()
|
||||||
|
|
||||||
defaultBranch, _ := commit.GetBranchName()
|
|
||||||
|
|
||||||
workflowURL := fmt.Sprintf("%s/actions/workflows/%s", repo.APIURL(), util.PathEscapeSegments(entry.Name()))
|
workflowURL := fmt.Sprintf("%s/actions/workflows/%s", repo.APIURL(), util.PathEscapeSegments(entry.Name()))
|
||||||
workflowRepoURL := fmt.Sprintf("%s/src/branch/%s/%s/%s", repo.HTMLURL(ctx), util.PathEscapeSegments(defaultBranch), util.PathEscapeSegments(folder), util.PathEscapeSegments(entry.Name()))
|
workflowRepoURL := fmt.Sprintf("%s/src/branch/%s/%s/%s", repo.HTMLURL(ctx), util.PathEscapeSegments(branchName), util.PathEscapeSegments(folder), util.PathEscapeSegments(entry.Name()))
|
||||||
badgeURL := fmt.Sprintf("%s/actions/workflows/%s/badge.svg?branch=%s", repo.HTMLURL(ctx), util.PathEscapeSegments(entry.Name()), url.QueryEscape(repo.DefaultBranch))
|
badgeURL := fmt.Sprintf("%s/actions/workflows/%s/badge.svg?branch=%s", repo.HTMLURL(ctx), util.PathEscapeSegments(entry.Name()), url.QueryEscape(repo.DefaultBranch))
|
||||||
|
|
||||||
// See https://docs.github.com/en/rest/actions/workflows?apiVersion=2022-11-28#get-a-workflow
|
// See https://docs.github.com/en/rest/actions/workflows?apiVersion=2022-11-28#get-a-workflow
|
||||||
@@ -462,21 +460,26 @@ func ListActionWorkflows(ctx context.Context, gitrepo *git.Repository, repo *rep
|
|||||||
|
|
||||||
workflows := make([]*api.ActionWorkflow, len(entries))
|
workflows := make([]*api.ActionWorkflow, len(entries))
|
||||||
for i, entry := range entries {
|
for i, entry := range entries {
|
||||||
workflows[i] = getActionWorkflowEntry(ctx, repo, defaultBranchCommit, folder, entry)
|
workflows[i] = getActionWorkflowEntry(ctx, repo, defaultBranchCommit, repo.DefaultBranch, folder, entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
return workflows, nil
|
return workflows, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetActionWorkflow(ctx context.Context, gitrepo *git.Repository, repo *repo_model.Repository, workflowID string) (*api.ActionWorkflow, error) {
|
func GetActionWorkflow(ctx context.Context, gitrepo *git.Repository, repo *repo_model.Repository, workflowID string) (*api.ActionWorkflow, error) {
|
||||||
entries, err := ListActionWorkflows(ctx, gitrepo, repo)
|
defaultBranchCommit, err := gitrepo.GetBranchCommit(repo.DefaultBranch)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
folder, entries, err := actions.ListWorkflows(defaultBranchCommit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, entry := range entries {
|
for _, entry := range entries {
|
||||||
if entry.ID == workflowID {
|
if entry.Name() == workflowID {
|
||||||
return entry, nil
|
return getActionWorkflowEntry(ctx, repo, defaultBranchCommit, repo.DefaultBranch, folder, entry), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,8 +60,8 @@ func TestPullCreate_CommitStatus(t *testing.T) {
|
|||||||
commitstatus.CommitStatusPending,
|
commitstatus.CommitStatusPending,
|
||||||
commitstatus.CommitStatusError,
|
commitstatus.CommitStatusError,
|
||||||
commitstatus.CommitStatusFailure,
|
commitstatus.CommitStatusFailure,
|
||||||
commitstatus.CommitStatusSuccess,
|
|
||||||
commitstatus.CommitStatusWarning,
|
commitstatus.CommitStatusWarning,
|
||||||
|
commitstatus.CommitStatusSuccess,
|
||||||
}
|
}
|
||||||
|
|
||||||
statesIcons := map[commitstatus.CommitStatusState]string{
|
statesIcons := map[commitstatus.CommitStatusState]string{
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
actions_model "code.gitea.io/gitea/models/actions"
|
||||||
auth_model "code.gitea.io/gitea/models/auth"
|
auth_model "code.gitea.io/gitea/models/auth"
|
||||||
"code.gitea.io/gitea/models/perm"
|
"code.gitea.io/gitea/models/perm"
|
||||||
"code.gitea.io/gitea/models/repo"
|
"code.gitea.io/gitea/models/repo"
|
||||||
@@ -1150,6 +1151,10 @@ func Test_WebhookWorkflowRun(t *testing.T) {
|
|||||||
testWorkflowRunEventsOnCancellingAbandonedRun(t, webhookData, false)
|
testWorkflowRunEventsOnCancellingAbandonedRun(t, webhookData, false)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "WorkflowRunOnStoppingEndlessTasksForMultipleRuns",
|
||||||
|
testFunc: testWorkflowRunOnStoppingEndlessTasksForMultipleRuns,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, obj := range testCases {
|
for _, obj := range testCases {
|
||||||
t.Run(obj.name, func(t *testing.T) {
|
t.Run(obj.name, func(t *testing.T) {
|
||||||
@@ -1586,6 +1591,84 @@ jobs:
|
|||||||
assert.Equal(t, "user2/"+repoName, webhookData.payloads[1].Repo.FullName)
|
assert.Equal(t, "user2/"+repoName, webhookData.payloads[1].Repo.FullName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testWorkflowRunOnStoppingEndlessTasksForMultipleRuns(t *testing.T, webhookData *workflowRunWebhook) {
|
||||||
|
defer test.MockVariableValue(&setting.Actions.EndlessTaskTimeout, time.Second)()
|
||||||
|
|
||||||
|
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
|
session := loginUser(t, "user2")
|
||||||
|
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
|
||||||
|
|
||||||
|
repoName := "test-workflow-run-stop-endless-tasks"
|
||||||
|
testRepo := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: createActionsTestRepo(t, token, repoName, false).ID})
|
||||||
|
|
||||||
|
testAPICreateWebhookForRepo(t, session, "user2", repoName, webhookData.URL, "workflow_run")
|
||||||
|
|
||||||
|
runners := make([]*mockRunner, 2)
|
||||||
|
for i := range runners {
|
||||||
|
runners[i] = newMockRunner()
|
||||||
|
runners[i].registerAsRepoRunner(t, "user2", repoName, fmt.Sprintf("mock-runner-%d", i), []string{"ubuntu-latest"}, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
workflowPath1 := ".gitea/workflows/endless-1.yml"
|
||||||
|
workflowPath2 := ".gitea/workflows/endless-2.yml"
|
||||||
|
workflowContent1 := `name: endless-1
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- '.gitea/workflows/endless-1.yml'
|
||||||
|
jobs:
|
||||||
|
job-1:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- run: echo 'job-1'
|
||||||
|
`
|
||||||
|
workflowContent2 := `name: endless-2
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- '.gitea/workflows/endless-2.yml'
|
||||||
|
jobs:
|
||||||
|
job-2:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- run: echo 'job-2'
|
||||||
|
`
|
||||||
|
|
||||||
|
opts1 := getWorkflowCreateFileOptions(user2, testRepo.DefaultBranch, "create "+workflowPath1, workflowContent1)
|
||||||
|
createWorkflowFile(t, token, "user2", repoName, workflowPath1, opts1)
|
||||||
|
opts2 := getWorkflowCreateFileOptions(user2, testRepo.DefaultBranch, "create "+workflowPath2, workflowContent2)
|
||||||
|
createWorkflowFile(t, token, "user2", repoName, workflowPath2, opts2)
|
||||||
|
|
||||||
|
task1 := runners[0].fetchTask(t)
|
||||||
|
task2 := runners[1].fetchTask(t)
|
||||||
|
_, job1, _ := getTaskAndJobAndRunByTaskID(t, task1.Id)
|
||||||
|
_, job2, _ := getTaskAndJobAndRunByTaskID(t, task2.Id)
|
||||||
|
require.NotEqual(t, job1.RunID, job2.RunID)
|
||||||
|
|
||||||
|
initialRunEventsLen := len(webhookData.payloads)
|
||||||
|
|
||||||
|
time.Sleep(2 * time.Second)
|
||||||
|
|
||||||
|
require.NoError(t, actions.StopEndlessTasks(t.Context()))
|
||||||
|
|
||||||
|
require.Len(t, webhookData.payloads, initialRunEventsLen+2)
|
||||||
|
|
||||||
|
var completedRunIDs []int64
|
||||||
|
for _, payload := range webhookData.payloads[initialRunEventsLen:] {
|
||||||
|
assert.Equal(t, "completed", payload.Action)
|
||||||
|
assert.Equal(t, "completed", payload.WorkflowRun.Status)
|
||||||
|
completedRunIDs = append(completedRunIDs, payload.WorkflowRun.ID)
|
||||||
|
}
|
||||||
|
assert.Len(t, completedRunIDs, 2)
|
||||||
|
assert.Contains(t, completedRunIDs, job1.RunID)
|
||||||
|
assert.Contains(t, completedRunIDs, job2.RunID)
|
||||||
|
|
||||||
|
run1 := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: job1.RunID})
|
||||||
|
run2 := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: job2.RunID})
|
||||||
|
assert.Equal(t, actions_model.StatusFailure, run1.Status)
|
||||||
|
assert.Equal(t, actions_model.StatusFailure, run2.Status)
|
||||||
|
}
|
||||||
|
|
||||||
func testWebhookWorkflowRun(t *testing.T, webhookData *workflowRunWebhook) {
|
func testWebhookWorkflowRun(t *testing.T, webhookData *workflowRunWebhook) {
|
||||||
// 1. create a new webhook with special webhook for repo1
|
// 1. create a new webhook with special webhook for repo1
|
||||||
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
|
|||||||
Reference in New Issue
Block a user