-
-
Notifications
You must be signed in to change notification settings - Fork 5.9k
Add GitHub API compatibility for workflow runs filtering #34894
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 4 commits
18546ed
aeaa2c1
722ac05
695496c
1b9b410
0a17b7a
ac87911
6b074cb
3e0c740
aff4e64
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,6 +5,7 @@ package actions | |
|
||
import ( | ||
"context" | ||
"time" | ||
|
||
"code.gitea.io/gitea/models/db" | ||
repo_model "code.gitea.io/gitea/models/repo" | ||
|
@@ -64,15 +65,19 @@ func (runs RunList) LoadRepos(ctx context.Context) error { | |
|
||
type FindRunOptions struct { | ||
db.ListOptions | ||
RepoID int64 | ||
OwnerID int64 | ||
WorkflowID string | ||
Ref string // the commit/tag/… that caused this workflow | ||
TriggerUserID int64 | ||
TriggerEvent webhook_module.HookEventType | ||
Approved bool // not util.OptionalBool, it works only when it's true | ||
Status []Status | ||
CommitSHA string | ||
RepoID int64 | ||
OwnerID int64 | ||
WorkflowID string | ||
Ref string // the commit/tag/... that caused this workflow | ||
TriggerUserID int64 | ||
TriggerEvent webhook_module.HookEventType | ||
Approved bool // not util.OptionalBool, it works only when it's true | ||
Status []Status | ||
CommitSHA string | ||
CreatedAfter time.Time | ||
CreatedBefore time.Time | ||
ExcludePullRequests bool | ||
CheckSuiteID int64 | ||
} | ||
|
||
func (opts FindRunOptions) ToConds() builder.Cond { | ||
|
@@ -101,6 +106,18 @@ func (opts FindRunOptions) ToConds() builder.Cond { | |
if opts.CommitSHA != "" { | ||
cond = cond.And(builder.Eq{"`action_run`.commit_sha": opts.CommitSHA}) | ||
} | ||
if !opts.CreatedAfter.IsZero() { | ||
cond = cond.And(builder.Gte{"`action_run`.created": opts.CreatedAfter}) | ||
} | ||
if !opts.CreatedBefore.IsZero() { | ||
cond = cond.And(builder.Lte{"`action_run`.created": opts.CreatedBefore}) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The same as above. |
||
} | ||
if opts.ExcludePullRequests { | ||
cond = cond.And(builder.Neq{"`action_run`.trigger_event": webhook_module.HookEventPullRequest}) | ||
} | ||
if opts.CheckSuiteID > 0 { | ||
cond = cond.And(builder.Eq{"`action_run`.check_suite_id": opts.CheckSuiteID}) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is no such column at the moment. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So, take that out, that small part of the GitHub API compatibility won't exist, but it's a pretty minor aspect, I think? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It seem that this PR is written by AI, and the non-existing column is caused by AI hallucination? We need to make sure every line you proposed to change should be fully understood and has a clear meaning, I think? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To be clear: AI is good, I also use AI. I mean: I think we shouldn't keep the non-existing column in code, we need to leave a clear comment for this case. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, yeah - for sure. So, remove it and leave a comment somewhere ... noticeable that the API is compatible except for this field. I'll get to work on that. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. OK, I think I got a little screwy with the commits, but all the changes seem to be there again. I left the |
||
} | ||
return cond | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
// Copyright 2025 The Gitea Authors. All rights reserved. | ||
// SPDX-License-Identifier: MIT | ||
|
||
package actions | ||
|
||
import ( | ||
"testing" | ||
"time" | ||
|
||
"code.gitea.io/gitea/modules/webhook" | ||
|
||
"github.com/stretchr/testify/assert" | ||
"xorm.io/builder" | ||
) | ||
|
||
func TestFindRunOptions_ToConds_ExcludePullRequests(t *testing.T) { | ||
// Test when ExcludePullRequests is true | ||
opts := FindRunOptions{ | ||
ExcludePullRequests: true, | ||
} | ||
cond := opts.ToConds() | ||
|
||
// Convert the condition to SQL for assertion | ||
sql, args, err := builder.ToSQL(cond) | ||
assert.NoError(t, err) | ||
// The condition should contain the trigger_event not equal to pull_request | ||
assert.Contains(t, sql, "`action_run`.trigger_event<>") | ||
assert.Contains(t, args, webhook.HookEventPullRequest) | ||
} | ||
|
||
func TestFindRunOptions_ToConds_CheckSuiteID(t *testing.T) { | ||
// Test when CheckSuiteID is set | ||
const testSuiteID int64 = 12345 | ||
opts := FindRunOptions{ | ||
CheckSuiteID: testSuiteID, | ||
} | ||
cond := opts.ToConds() | ||
|
||
// Convert the condition to SQL for assertion | ||
sql, args, err := builder.ToSQL(cond) | ||
assert.NoError(t, err) | ||
// The condition should contain the check_suite_id equal to the test value | ||
assert.Contains(t, sql, "`action_run`.check_suite_id=") | ||
assert.Contains(t, args, testSuiteID) | ||
} | ||
|
||
func TestFindRunOptions_ToConds_CreatedDateRange(t *testing.T) { | ||
// Test when CreatedAfter and CreatedBefore are set | ||
startDate := time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC) | ||
endDate := time.Date(2023, 12, 31, 23, 59, 59, 0, time.UTC) | ||
|
||
opts := FindRunOptions{ | ||
CreatedAfter: startDate, | ||
CreatedBefore: endDate, | ||
} | ||
cond := opts.ToConds() | ||
|
||
// Convert the condition to SQL for assertion | ||
sql, args, err := builder.ToSQL(cond) | ||
assert.NoError(t, err) | ||
// The condition should contain created >= startDate and created <= endDate | ||
assert.Contains(t, sql, "`action_run`.created>=") | ||
assert.Contains(t, sql, "`action_run`.created<=") | ||
assert.Contains(t, args, startDate) | ||
assert.Contains(t, args, endDate) | ||
} | ||
|
||
func TestFindRunOptions_ToConds_CreatedAfterOnly(t *testing.T) { | ||
// Test when only CreatedAfter is set | ||
startDate := time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC) | ||
|
||
opts := FindRunOptions{ | ||
CreatedAfter: startDate, | ||
} | ||
cond := opts.ToConds() | ||
|
||
// Convert the condition to SQL for assertion | ||
sql, args, err := builder.ToSQL(cond) | ||
assert.NoError(t, err) | ||
// The condition should contain created >= startDate | ||
assert.Contains(t, sql, "`action_run`.created>=") | ||
assert.Contains(t, args, startDate) | ||
// But should not contain created <= endDate | ||
assert.NotContains(t, sql, "`action_run`.created<=") | ||
} | ||
|
||
func TestFindRunOptions_ToConds_CreatedBeforeOnly(t *testing.T) { | ||
// Test when only CreatedBefore is set | ||
endDate := time.Date(2023, 12, 31, 23, 59, 59, 0, time.UTC) | ||
|
||
opts := FindRunOptions{ | ||
CreatedBefore: endDate, | ||
} | ||
cond := opts.ToConds() | ||
|
||
// Convert the condition to SQL for assertion | ||
sql, args, err := builder.ToSQL(cond) | ||
assert.NoError(t, err) | ||
// The condition should contain created <= endDate | ||
assert.Contains(t, sql, "`action_run`.created<=") | ||
assert.Contains(t, args, endDate) | ||
// But should not contain created >= startDate | ||
assert.NotContains(t, sql, "`action_run`.created>=") | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this will work. It should be
opts.CreatedAfter.Unix()
.