Merge branch 'main' into lunny/milestone_order_due_date

This commit is contained in:
6543 2025-09-07 09:47:15 +02:00 committed by GitHub
commit 4666bc17e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
101 changed files with 2079 additions and 2037 deletions

2
.gitignore vendored
View File

@ -74,11 +74,11 @@ cpu.out
/tests/*.ini
/tests/**/*.git/**/*.sample
/node_modules
/tools/node_modules
/.venv
/yarn.lock
/yarn-error.log
/npm-debug.log*
/.pnpm-store
/public/assets/js
/public/assets/css
/public/assets/fonts

View File

@ -18,6 +18,9 @@ RUN apk --no-cache add \
&& npm install -g pnpm@10 \
&& rm -rf /var/cache/apk/*
# workaround for node >= 22.18.0 on alpine 3.22. Remove when upgrading to alpine 3.23
COPY --from=docker.io/node:22-alpine3.22 /usr/local/bin/node /usr/local/bin/node
# Setup repo
COPY . ${GOPATH}/src/code.gitea.io/gitea
WORKDIR ${GOPATH}/src/code.gitea.io/gitea

View File

@ -18,6 +18,9 @@ RUN apk --no-cache add \
&& npm install -g pnpm@10 \
&& rm -rf /var/cache/apk/*
# workaround for node >= 22.18.0 on alpine 3.22. Remove when upgrading to alpine 3.23
COPY --from=docker.io/node:22-alpine3.22 /usr/local/bin/node /usr/local/bin/node
# Setup repo
COPY . ${GOPATH}/src/code.gitea.io/gitea
WORKDIR ${GOPATH}/src/code.gitea.io/gitea

View File

@ -63,3 +63,4 @@ hiifong <i@hiif.ong> (@hiifong)
metiftikci <metiftikci@hotmail.com> (@metiftikci)
Christopher Homberger <christopher.homberger@web.de> (@ChristopherHX)
Tobias Balle-Petersen <tobiasbp@gmail.com> (@tobiasbp)
TheFox <thefox0x7@gmail.com> (@TheFox0x7)

View File

@ -31,7 +31,7 @@ GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.8.0
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.4.0
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.15
MISSPELL_PACKAGE ?= github.com/golangci/misspell/cmd/misspell@v0.7.0
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.32.3
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@717e3cb29becaaf00e56953556c6d80f8a01b286
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1
@ -127,7 +127,7 @@ GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list code.gitea.io/gitea/models/m
MIGRATE_TEST_PACKAGES ?= $(shell $(GO) list code.gitea.io/gitea/models/migrations/...)
WEBPACK_SOURCES := $(shell find web_src/js web_src/css -type f)
WEBPACK_CONFIGS := webpack.config.js tailwind.config.js
WEBPACK_CONFIGS := webpack.config.ts tailwind.config.ts
WEBPACK_DEST := public/assets/js/index.js public/assets/css/index.css
WEBPACK_DEST_ENTRIES := public/assets/js public/assets/css public/assets/fonts
@ -153,9 +153,9 @@ TAR_EXCLUDES := .git data indexers queues log node_modules $(EXECUTABLE) $(DIST)
GO_DIRS := build cmd models modules routers services tests
WEB_DIRS := web_src/js web_src/css
ESLINT_FILES := web_src/js tools *.js *.ts *.cjs tests/e2e
ESLINT_FILES := web_src/js tools *.ts *.cjs tests/e2e
STYLELINT_FILES := web_src/css web_src/js/components/*.vue
SPELLCHECK_FILES := $(GO_DIRS) $(WEB_DIRS) templates options/locale/locale_en-US.ini .github $(filter-out CHANGELOG.md, $(wildcard *.go *.js *.md *.yml *.yaml *.toml)) $(filter-out tools/misspellings.csv, $(wildcard tools/*))
SPELLCHECK_FILES := $(GO_DIRS) $(WEB_DIRS) templates options/locale/locale_en-US.ini .github $(filter-out CHANGELOG.md, $(wildcard *.go *.md *.yml *.yaml *.toml)) $(filter-out tools/misspellings.csv, $(wildcard tools/*))
EDITORCONFIG_FILES := templates .github/workflows options/locale/locale_en-US.ini
GO_SOURCES := $(wildcard *.go)
@ -230,7 +230,7 @@ node-check:
.PHONY: clean-all
clean-all: clean ## delete backend, frontend and integration files
rm -rf $(WEBPACK_DEST_ENTRIES) node_modules tools/node_modules
rm -rf $(WEBPACK_DEST_ENTRIES) node_modules
.PHONY: clean
clean: ## delete backend and integration files
@ -407,7 +407,7 @@ lint-actions: ## lint action workflow files
.PHONY: lint-templates
lint-templates: .venv node_modules ## lint template files
@node tools/lint-templates-svg.js
@node tools/lint-templates-svg.ts
@uv run --frozen djlint $(shell find templates -type f -iname '*.tmpl')
.PHONY: lint-yaml
@ -421,7 +421,7 @@ watch: ## watch everything and continuously rebuild
.PHONY: watch-frontend
watch-frontend: node-check node_modules ## watch frontend files and continuously rebuild
@rm -rf $(WEBPACK_DEST_ENTRIES)
NODE_ENV=development pnpm exec webpack --watch --progress
NODE_ENV=development pnpm exec webpack --watch --progress --disable-interpret
.PHONY: watch-backend
watch-backend: go-check ## watch backend files and continuously rebuild
@ -847,10 +847,6 @@ node_modules: pnpm-lock.yaml
pnpm install --frozen-lockfile
@touch node_modules
tools/node_modules: tools/package.json
cd tools && pnpm install
@touch tools/node_modules
.venv: uv.lock
uv sync
@touch .venv
@ -881,13 +877,13 @@ $(WEBPACK_DEST): $(WEBPACK_SOURCES) $(WEBPACK_CONFIGS) pnpm-lock.yaml
@$(MAKE) -s node-check node_modules
@rm -rf $(WEBPACK_DEST_ENTRIES)
@echo "Running webpack..."
@BROWSERSLIST_IGNORE_OLD_DATA=true pnpm exec webpack
@BROWSERSLIST_IGNORE_OLD_DATA=true pnpm exec webpack --disable-interpret
@touch $(WEBPACK_DEST)
.PHONY: svg
svg: node-check | node_modules ## build svg files
rm -rf $(SVG_DEST_DIR)
node tools/generate-svg.js
node tools/generate-svg.ts
.PHONY: svg-check
svg-check: svg
@ -925,8 +921,8 @@ generate-gitignore: ## update gitignore files
$(GO) run build/generate-gitignores.go
.PHONY: generate-images
generate-images: | node_modules tools/node_modules ## generate images (requires cairo development packages)
cd tools && node generate-images.js $(TAGS)
generate-images: | node_modules ## generate images
cd tools && node generate-images.ts $(TAGS)
.PHONY: generate-manpage
generate-manpage: ## generate manpage

2
go.mod
View File

@ -1,6 +1,6 @@
module code.gitea.io/gitea
go 1.24.6
go 1.25.1
// rfc5280 said: "The serial number is an integer assigned by the CA to each certificate."
// But some CAs use negative serial number, just relax the check. related:

View File

@ -105,15 +105,13 @@ func testLocker(t *testing.T, locker Locker) {
require.NoError(t, err)
wg := &sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
wg.Go(func() {
started := time.Now()
release, err := locker.Lock(t.Context(), "test") // should be blocked for seconds
defer release()
assert.Greater(t, time.Since(started), time.Second)
assert.NoError(t, err)
}()
})
time.Sleep(2 * time.Second)
release()

View File

@ -62,11 +62,9 @@ func TestConnLogger(t *testing.T) {
}
expected := fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.Filename, event.Line, event.Caller, strings.ToUpper(event.Level.String())[0], event.MsgSimpleText)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
wg.Go(func() {
listenReadAndClose(t, l, expected)
}()
})
logger.SendLogEvent(&event)
wg.Wait()

View File

@ -153,11 +153,7 @@ func resetIdleTicker(t *time.Ticker, dur time.Duration) {
// doStartNewWorker starts a new worker for the queue, the worker reads from worker's channel and handles the items.
func (q *WorkerPoolQueue[T]) doStartNewWorker(wp *workerGroup[T]) {
wp.wg.Add(1)
go func() {
defer wp.wg.Done()
wp.wg.Go(func() {
log.Debug("Queue %q starts new worker", q.GetName())
defer log.Debug("Queue %q stops idle worker", q.GetName())
@ -192,7 +188,7 @@ func (q *WorkerPoolQueue[T]) doStartNewWorker(wp *workerGroup[T]) {
q.workerNumMu.Unlock()
}
}
}()
})
}
// doFlush flushes the queue: it tries to read all items from the queue and handles them.

View File

@ -6,20 +6,32 @@ package structs
import "time"
type Activity struct {
ID int64 `json:"id"`
// The unique identifier of the activity
ID int64 `json:"id"`
// The ID of the user who receives/sees this activity
UserID int64 `json:"user_id"` // Receiver user
// the type of action
//
// enum: create_repo,rename_repo,star_repo,watch_repo,commit_repo,create_issue,create_pull_request,transfer_repo,push_tag,comment_issue,merge_pull_request,close_issue,reopen_issue,close_pull_request,reopen_pull_request,delete_tag,delete_branch,mirror_sync_push,mirror_sync_create,mirror_sync_delete,approve_pull_request,reject_pull_request,comment_pull,publish_release,pull_review_dismissed,pull_request_ready_for_review,auto_merge_pull_request
OpType string `json:"op_type"`
ActUserID int64 `json:"act_user_id"`
ActUser *User `json:"act_user"`
RepoID int64 `json:"repo_id"`
Repo *Repository `json:"repo"`
CommentID int64 `json:"comment_id"`
Comment *Comment `json:"comment"`
RefName string `json:"ref_name"`
IsPrivate bool `json:"is_private"`
Content string `json:"content"`
Created time.Time `json:"created"`
OpType string `json:"op_type"`
// The ID of the user who performed the action
ActUserID int64 `json:"act_user_id"`
// The user who performed the action
ActUser *User `json:"act_user"`
// The ID of the repository associated with the activity
RepoID int64 `json:"repo_id"`
// The repository associated with the activity
Repo *Repository `json:"repo"`
// The ID of the comment associated with the activity (if applicable)
CommentID int64 `json:"comment_id"`
// The comment associated with the activity (if applicable)
Comment *Comment `json:"comment"`
// The name of the git reference (branch/tag) associated with the activity
RefName string `json:"ref_name"`
// Whether this activity is from a private repository
IsPrivate bool `json:"is_private"`
// Additional content or details about the activity
Content string `json:"content"`
// The date and time when the activity occurred
Created time.Time `json:"created"`
}

View File

@ -5,5 +5,6 @@ package structs
// ActivityPub type
type ActivityPub struct {
// Context defines the JSON-LD context for ActivityPub
Context string `json:"@context"`
}

View File

@ -8,6 +8,7 @@ import "time"
// CreateUserOption create user options
type CreateUserOption struct {
// The authentication source ID to associate with the user
SourceID int64 `json:"source_id"`
// identifier of the user, provided by the external authenticator (if configured)
// default: empty
@ -15,15 +16,21 @@ type CreateUserOption struct {
// username of the user
// required: true
Username string `json:"username" binding:"Required;Username;MaxSize(40)"`
// The full display name of the user
FullName string `json:"full_name" binding:"MaxSize(100)"`
// required: true
// swagger:strfmt email
Email string `json:"email" binding:"Required;Email;MaxSize(254)"`
Password string `json:"password" binding:"MaxSize(255)"`
MustChangePassword *bool `json:"must_change_password"`
SendNotify bool `json:"send_notify"`
Restricted *bool `json:"restricted"`
Visibility string `json:"visibility" binding:"In(,public,limited,private)"`
Email string `json:"email" binding:"Required;Email;MaxSize(254)"`
// The plain text password for the user
Password string `json:"password" binding:"MaxSize(255)"`
// Whether the user must change password on first login
MustChangePassword *bool `json:"must_change_password"`
// Whether to send welcome notification email to the user
SendNotify bool `json:"send_notify"`
// Whether the user has restricted access privileges
Restricted *bool `json:"restricted"`
// User visibility level: public, limited, or private
Visibility string `json:"visibility" binding:"In(,public,limited,private)"`
// For explicitly setting the user creation timestamp. Useful when users are
// migrated from other systems. When omitted, the user's creation timestamp
@ -34,26 +41,43 @@ type CreateUserOption struct {
// EditUserOption edit user options
type EditUserOption struct {
// required: true
// The authentication source ID to associate with the user
SourceID int64 `json:"source_id"`
// identifier of the user, provided by the external authenticator (if configured)
// default: empty
// required: true
LoginName string `json:"login_name" binding:"Required"`
// swagger:strfmt email
Email *string `json:"email" binding:"MaxSize(254)"`
FullName *string `json:"full_name" binding:"MaxSize(100)"`
Password string `json:"password" binding:"MaxSize(255)"`
MustChangePassword *bool `json:"must_change_password"`
Website *string `json:"website" binding:"OmitEmpty;ValidUrl;MaxSize(255)"`
Location *string `json:"location" binding:"MaxSize(50)"`
Description *string `json:"description" binding:"MaxSize(255)"`
Active *bool `json:"active"`
Admin *bool `json:"admin"`
AllowGitHook *bool `json:"allow_git_hook"`
AllowImportLocal *bool `json:"allow_import_local"`
MaxRepoCreation *int `json:"max_repo_creation"`
ProhibitLogin *bool `json:"prohibit_login"`
AllowCreateOrganization *bool `json:"allow_create_organization"`
Restricted *bool `json:"restricted"`
Visibility string `json:"visibility" binding:"In(,public,limited,private)"`
// The email address of the user
Email *string `json:"email" binding:"MaxSize(254)"`
// The full display name of the user
FullName *string `json:"full_name" binding:"MaxSize(100)"`
// The plain text password for the user
Password string `json:"password" binding:"MaxSize(255)"`
// Whether the user must change password on next login
MustChangePassword *bool `json:"must_change_password"`
// The user's personal website URL
Website *string `json:"website" binding:"OmitEmpty;ValidUrl;MaxSize(255)"`
// The user's location or address
Location *string `json:"location" binding:"MaxSize(50)"`
// The user's personal description or bio
Description *string `json:"description" binding:"MaxSize(255)"`
// Whether the user account is active
Active *bool `json:"active"`
// Whether the user has administrator privileges
Admin *bool `json:"admin"`
// Whether the user can use Git hooks
AllowGitHook *bool `json:"allow_git_hook"`
// Whether the user can import local repositories
AllowImportLocal *bool `json:"allow_import_local"`
// Maximum number of repositories the user can create
MaxRepoCreation *int `json:"max_repo_creation"`
// Whether the user is prohibited from logging in
ProhibitLogin *bool `json:"prohibit_login"`
// Whether the user can create organizations
AllowCreateOrganization *bool `json:"allow_create_organization"`
// Whether the user has restricted access privileges
Restricted *bool `json:"restricted"`
// User visibility level: public, limited, or private
Visibility string `json:"visibility" binding:"In(,public,limited,private)"`
}

View File

@ -10,18 +10,26 @@ import (
// Attachment a generic attachment
// swagger:model
type Attachment struct {
ID int64 `json:"id"`
Name string `json:"name"`
Size int64 `json:"size"`
DownloadCount int64 `json:"download_count"`
// ID is the unique identifier for the attachment
ID int64 `json:"id"`
// Name is the filename of the attachment
Name string `json:"name"`
// Size is the file size in bytes
Size int64 `json:"size"`
// DownloadCount is the number of times the attachment has been downloaded
DownloadCount int64 `json:"download_count"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
UUID string `json:"uuid"`
DownloadURL string `json:"browser_download_url"`
// Created is the time when the attachment was uploaded
Created time.Time `json:"created_at"`
// UUID is the unique identifier for the attachment file
UUID string `json:"uuid"`
// DownloadURL is the URL to download the attachment
DownloadURL string `json:"browser_download_url"`
}
// EditAttachmentOptions options for editing attachments
// swagger:model
type EditAttachmentOptions struct {
// Name is the new filename for the attachment
Name string `json:"name"`
}

View File

@ -7,9 +7,14 @@ import "time"
// Cron represents a Cron task
type Cron struct {
Name string `json:"name"`
Schedule string `json:"schedule"`
Next time.Time `json:"next"`
Prev time.Time `json:"prev"`
ExecTimes int64 `json:"exec_times"`
// The name of the cron task
Name string `json:"name"`
// The cron schedule expression (e.g., "0 0 * * *")
Schedule string `json:"schedule"`
// The next scheduled execution time
Next time.Time `json:"next"`
// The previous execution time
Prev time.Time `json:"prev"`
// The total number of times this cron task has been executed
ExecTimes int64 `json:"exec_times"`
}

View File

@ -5,12 +5,19 @@ package structs
// GitBlobResponse represents a git blob
type GitBlobResponse struct {
Content *string `json:"content"`
// The content of the git blob (may be base64 encoded)
Content *string `json:"content"`
// The encoding used for the content (e.g., "base64")
Encoding *string `json:"encoding"`
URL string `json:"url"`
SHA string `json:"sha"`
Size int64 `json:"size"`
// The URL to access this git blob
URL string `json:"url"`
// The SHA hash of the git blob
SHA string `json:"sha"`
// The size of the git blob in bytes
Size int64 `json:"size"`
LfsOid *string `json:"lfs_oid,omitempty"`
LfsSize *int64 `json:"lfs_size,omitempty"`
// The LFS object ID if this blob is stored in LFS
LfsOid *string `json:"lfs_oid,omitempty"`
// The size of the LFS object if this blob is stored in LFS
LfsSize *int64 `json:"lfs_size,omitempty"`
}

View File

@ -5,9 +5,12 @@ package structs
// GitHook represents a Git repository hook
type GitHook struct {
Name string `json:"name"`
IsActive bool `json:"is_active"`
Content string `json:"content,omitempty"`
// Name is the name of the Git hook
Name string `json:"name"`
// IsActive indicates if the hook is active
IsActive bool `json:"is_active"`
// Content contains the script content of the hook
Content string `json:"content,omitempty"`
}
// GitHookList represents a list of Git hooks
@ -15,5 +18,6 @@ type GitHookList []*GitHook
// EditGitHookOption options when modifying one Git hook
type EditGitHookOption struct {
// Content is the new script content for the hook
Content string `json:"content"`
}

View File

@ -17,17 +17,27 @@ var ErrInvalidReceiveHook = errors.New("Invalid JSON payload received over webho
// Hook a hook is a web hook when one repository changed
type Hook struct {
ID int64 `json:"id"`
Type string `json:"type"`
BranchFilter string `json:"branch_filter"`
URL string `json:"-"`
Config map[string]string `json:"config"`
Events []string `json:"events"`
AuthorizationHeader string `json:"authorization_header"`
Active bool `json:"active"`
// The unique identifier of the webhook
ID int64 `json:"id"`
// The type of the webhook (e.g., gitea, slack, discord)
Type string `json:"type"`
// Branch filter pattern to determine which branches trigger the webhook
BranchFilter string `json:"branch_filter"`
// The URL of the webhook endpoint (hidden in JSON)
URL string `json:"-"`
// Configuration settings for the webhook
Config map[string]string `json:"config"`
// List of events that trigger this webhook
Events []string `json:"events"`
// Authorization header to include in webhook requests
AuthorizationHeader string `json:"authorization_header"`
// Whether the webhook is active and will be triggered
Active bool `json:"active"`
// swagger:strfmt date-time
// The date and time when the webhook was last updated
Updated time.Time `json:"updated_at"`
// swagger:strfmt date-time
// The date and time when the webhook was created
Created time.Time `json:"created_at"`
}
@ -42,23 +52,34 @@ type CreateHookOptionConfig map[string]string
type CreateHookOption struct {
// required: true
// enum: dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist
// The type of the webhook to create
Type string `json:"type" binding:"Required"`
// required: true
Config CreateHookOptionConfig `json:"config" binding:"Required"`
Events []string `json:"events"`
BranchFilter string `json:"branch_filter" binding:"GlobPattern"`
AuthorizationHeader string `json:"authorization_header"`
// Configuration settings for the webhook
Config CreateHookOptionConfig `json:"config" binding:"Required"`
// List of events that will trigger this webhook
Events []string `json:"events"`
// Branch filter pattern to determine which branches trigger the webhook
BranchFilter string `json:"branch_filter" binding:"GlobPattern"`
// Authorization header to include in webhook requests
AuthorizationHeader string `json:"authorization_header"`
// default: false
// Whether the webhook should be active upon creation
Active bool `json:"active"`
}
// EditHookOption options when modify one hook
type EditHookOption struct {
Config map[string]string `json:"config"`
Events []string `json:"events"`
BranchFilter string `json:"branch_filter" binding:"GlobPattern"`
AuthorizationHeader string `json:"authorization_header"`
Active *bool `json:"active"`
// Configuration settings for the webhook
Config map[string]string `json:"config"`
// List of events that trigger this webhook
Events []string `json:"events"`
// Branch filter pattern to determine which branches trigger the webhook
BranchFilter string `json:"branch_filter" binding:"GlobPattern"`
// Authorization header to include in webhook requests
AuthorizationHeader string `json:"authorization_header"`
// Whether the webhook is active and will be triggered
Active *bool `json:"active"`
}
// Payloader payload is some part of one hook
@ -82,26 +103,40 @@ type PayloadUser struct {
// PayloadCommit represents a commit
type PayloadCommit struct {
// sha1 hash of the commit
ID string `json:"id"`
Message string `json:"message"`
URL string `json:"url"`
Author *PayloadUser `json:"author"`
Committer *PayloadUser `json:"committer"`
ID string `json:"id"`
// The commit message
Message string `json:"message"`
// The URL to view this commit
URL string `json:"url"`
// The author of the commit
Author *PayloadUser `json:"author"`
// The committer of the commit
Committer *PayloadUser `json:"committer"`
// GPG verification information for the commit
Verification *PayloadCommitVerification `json:"verification"`
// swagger:strfmt date-time
// The timestamp when the commit was made
Timestamp time.Time `json:"timestamp"`
Added []string `json:"added"`
Removed []string `json:"removed"`
Modified []string `json:"modified"`
// List of files added in this commit
Added []string `json:"added"`
// List of files removed in this commit
Removed []string `json:"removed"`
// List of files modified in this commit
Modified []string `json:"modified"`
}
// PayloadCommitVerification represents the GPG verification of a commit
type PayloadCommitVerification struct {
Verified bool `json:"verified"`
Reason string `json:"reason"`
Signature string `json:"signature"`
Signer *PayloadUser `json:"signer"`
Payload string `json:"payload"`
// Whether the commit signature is verified
Verified bool `json:"verified"`
// The reason for the verification status
Reason string `json:"reason"`
// The GPG signature of the commit
Signature string `json:"signature"`
// The user who signed the commit
Signer *PayloadUser `json:"signer"`
// The signed payload content
Payload string `json:"payload"`
}
var (
@ -119,11 +154,16 @@ var (
// CreatePayload represents a payload information of create event.
type CreatePayload struct {
Sha string `json:"sha"`
Ref string `json:"ref"`
RefType string `json:"ref_type"`
Repo *Repository `json:"repository"`
Sender *User `json:"sender"`
// The SHA hash of the created reference
Sha string `json:"sha"`
// The full name of the created reference
Ref string `json:"ref"`
// The type of reference created (branch or tag)
RefType string `json:"ref_type"`
// The repository where the reference was created
Repo *Repository `json:"repository"`
// The user who created the reference
Sender *User `json:"sender"`
}
// JSONPayload return payload information
@ -161,11 +201,16 @@ const (
// DeletePayload represents delete payload
type DeletePayload struct {
Ref string `json:"ref"`
RefType string `json:"ref_type"`
PusherType PusherType `json:"pusher_type"`
Repo *Repository `json:"repository"`
Sender *User `json:"sender"`
// The name of the deleted reference
Ref string `json:"ref"`
// The type of reference deleted (branch or tag)
RefType string `json:"ref_type"`
// The type of entity that performed the deletion
PusherType PusherType `json:"pusher_type"`
// The repository where the reference was deleted
Repo *Repository `json:"repository"`
// The user who deleted the reference
Sender *User `json:"sender"`
}
// JSONPayload implements Payload
@ -175,9 +220,12 @@ func (p *DeletePayload) JSONPayload() ([]byte, error) {
// ForkPayload represents fork payload
type ForkPayload struct {
// The forked repository (the new fork)
Forkee *Repository `json:"forkee"`
Repo *Repository `json:"repository"`
Sender *User `json:"sender"`
// The original repository that was forked
Repo *Repository `json:"repository"`
// The user who created the fork
Sender *User `json:"sender"`
}
// JSONPayload implements Payload
@ -197,14 +245,22 @@ const (
// IssueCommentPayload represents a payload information of issue comment event.
type IssueCommentPayload struct {
Action HookIssueCommentAction `json:"action"`
Issue *Issue `json:"issue"`
PullRequest *PullRequest `json:"pull_request,omitempty"`
Comment *Comment `json:"comment"`
Changes *ChangesPayload `json:"changes,omitempty"`
Repository *Repository `json:"repository"`
Sender *User `json:"sender"`
IsPull bool `json:"is_pull"`
// The action performed on the comment (created, edited, deleted)
Action HookIssueCommentAction `json:"action"`
// The issue that the comment belongs to
Issue *Issue `json:"issue"`
// The pull request if the comment is on a pull request
PullRequest *PullRequest `json:"pull_request,omitempty"`
// The comment that was acted upon
Comment *Comment `json:"comment"`
// Changes made to the comment (for edit actions)
Changes *ChangesPayload `json:"changes,omitempty"`
// The repository containing the issue/pull request
Repository *Repository `json:"repository"`
// The user who performed the action
Sender *User `json:"sender"`
// Whether this comment is on a pull request
IsPull bool `json:"is_pull"`
}
// JSONPayload implements Payload
@ -224,10 +280,14 @@ const (
// ReleasePayload represents a payload information of release event.
type ReleasePayload struct {
Action HookReleaseAction `json:"action"`
Release *Release `json:"release"`
Repository *Repository `json:"repository"`
Sender *User `json:"sender"`
// The action performed on the release (published, updated, deleted)
Action HookReleaseAction `json:"action"`
// The release that was acted upon
Release *Release `json:"release"`
// The repository containing the release
Repository *Repository `json:"repository"`
// The user who performed the action
Sender *User `json:"sender"`
}
// JSONPayload implements Payload
@ -237,16 +297,26 @@ func (p *ReleasePayload) JSONPayload() ([]byte, error) {
// PushPayload represents a payload information of push event.
type PushPayload struct {
Ref string `json:"ref"`
Before string `json:"before"`
After string `json:"after"`
CompareURL string `json:"compare_url"`
Commits []*PayloadCommit `json:"commits"`
TotalCommits int `json:"total_commits"`
HeadCommit *PayloadCommit `json:"head_commit"`
Repo *Repository `json:"repository"`
Pusher *User `json:"pusher"`
Sender *User `json:"sender"`
// The full name of the pushed reference
Ref string `json:"ref"`
// The SHA of the most recent commit before the push
Before string `json:"before"`
// The SHA of the most recent commit after the push
After string `json:"after"`
// URL to compare the changes in this push
CompareURL string `json:"compare_url"`
// List of commits included in the push
Commits []*PayloadCommit `json:"commits"`
// Total number of commits in the push
TotalCommits int `json:"total_commits"`
// The most recent commit in the push
HeadCommit *PayloadCommit `json:"head_commit"`
// The repository that was pushed to
Repo *Repository `json:"repository"`
// The user who performed the push
Pusher *User `json:"pusher"`
// The user who triggered the webhook
Sender *User `json:"sender"`
}
// JSONPayload FIXME
@ -313,13 +383,20 @@ const (
// IssuePayload represents the payload information that is sent along with an issue event.
type IssuePayload struct {
Action HookIssueAction `json:"action"`
Index int64 `json:"number"`
Changes *ChangesPayload `json:"changes,omitempty"`
Issue *Issue `json:"issue"`
Repository *Repository `json:"repository"`
Sender *User `json:"sender"`
CommitID string `json:"commit_id"`
// The action performed on the issue
Action HookIssueAction `json:"action"`
// The index number of the issue
Index int64 `json:"number"`
// Changes made to the issue (for edit actions)
Changes *ChangesPayload `json:"changes,omitempty"`
// The issue that was acted upon
Issue *Issue `json:"issue"`
// The repository containing the issue
Repository *Repository `json:"repository"`
// The user who performed the action
Sender *User `json:"sender"`
// The commit ID related to the issue action
CommitID string `json:"commit_id"`
}
// JSONPayload encodes the IssuePayload to JSON, with an indentation of two spaces.
@ -329,27 +406,40 @@ func (p *IssuePayload) JSONPayload() ([]byte, error) {
// ChangesFromPayload FIXME
type ChangesFromPayload struct {
// The previous value before the change
From string `json:"from"`
}
// ChangesPayload represents the payload information of issue change
type ChangesPayload struct {
// Changes made to the title
Title *ChangesFromPayload `json:"title,omitempty"`
Body *ChangesFromPayload `json:"body,omitempty"`
Ref *ChangesFromPayload `json:"ref,omitempty"`
// Changes made to the body/description
Body *ChangesFromPayload `json:"body,omitempty"`
// Changes made to the reference
Ref *ChangesFromPayload `json:"ref,omitempty"`
}
// PullRequestPayload represents a payload information of pull request event.
type PullRequestPayload struct {
Action HookIssueAction `json:"action"`
Index int64 `json:"number"`
Changes *ChangesPayload `json:"changes,omitempty"`
PullRequest *PullRequest `json:"pull_request"`
RequestedReviewer *User `json:"requested_reviewer"`
Repository *Repository `json:"repository"`
Sender *User `json:"sender"`
CommitID string `json:"commit_id"`
Review *ReviewPayload `json:"review"`
// The action performed on the pull request
Action HookIssueAction `json:"action"`
// The index number of the pull request
Index int64 `json:"number"`
// Changes made to the pull request (for edit actions)
Changes *ChangesPayload `json:"changes,omitempty"`
// The pull request that was acted upon
PullRequest *PullRequest `json:"pull_request"`
// The reviewer that was requested (for review request actions)
RequestedReviewer *User `json:"requested_reviewer"`
// The repository containing the pull request
Repository *Repository `json:"repository"`
// The user who performed the action
Sender *User `json:"sender"`
// The commit ID related to the pull request action
CommitID string `json:"commit_id"`
// The review information (for review actions)
Review *ReviewPayload `json:"review"`
}
// JSONPayload FIXME
@ -359,7 +449,9 @@ func (p *PullRequestPayload) JSONPayload() ([]byte, error) {
// ReviewPayload FIXME
type ReviewPayload struct {
Type string `json:"type"`
// The type of review (approved, rejected, comment)
Type string `json:"type"`
// The content/body of the review
Content string `json:"content"`
}
@ -377,11 +469,16 @@ const (
// WikiPayload payload for repository webhooks
type WikiPayload struct {
Action HookWikiAction `json:"action"`
Repository *Repository `json:"repository"`
Sender *User `json:"sender"`
Page string `json:"page"`
Comment string `json:"comment"`
// The action performed on the wiki page
Action HookWikiAction `json:"action"`
// The repository containing the wiki
Repository *Repository `json:"repository"`
// The user who performed the action
Sender *User `json:"sender"`
// The name of the wiki page
Page string `json:"page"`
// The comment/commit message for the wiki change
Comment string `json:"comment"`
}
// JSONPayload JSON representation of the payload
@ -401,10 +498,14 @@ const (
// RepositoryPayload payload for repository webhooks
type RepositoryPayload struct {
Action HookRepoAction `json:"action"`
Repository *Repository `json:"repository"`
Organization *User `json:"organization"`
Sender *User `json:"sender"`
// The action performed on the repository
Action HookRepoAction `json:"action"`
// The repository that was acted upon
Repository *Repository `json:"repository"`
// The organization that owns the repository (if applicable)
Organization *User `json:"organization"`
// The user who performed the action
Sender *User `json:"sender"`
}
// JSONPayload JSON representation of the payload
@ -424,11 +525,16 @@ const (
// PackagePayload represents a package payload
type PackagePayload struct {
Action HookPackageAction `json:"action"`
Repository *Repository `json:"repository"`
Package *Package `json:"package"`
Organization *Organization `json:"organization"`
Sender *User `json:"sender"`
// The action performed on the package
Action HookPackageAction `json:"action"`
// The repository associated with the package
Repository *Repository `json:"repository"`
// The package that was acted upon
Package *Package `json:"package"`
// The organization that owns the package (if applicable)
Organization *Organization `json:"organization"`
// The user who performed the action
Sender *User `json:"sender"`
}
// JSONPayload implements Payload
@ -438,11 +544,16 @@ func (p *PackagePayload) JSONPayload() ([]byte, error) {
// WorkflowDispatchPayload represents a workflow dispatch payload
type WorkflowDispatchPayload struct {
Workflow string `json:"workflow"`
Ref string `json:"ref"`
Inputs map[string]any `json:"inputs"`
Repository *Repository `json:"repository"`
Sender *User `json:"sender"`
// The name or path of the workflow file
Workflow string `json:"workflow"`
// The git reference (branch, tag, or commit SHA) to run the workflow on
Ref string `json:"ref"`
// Input parameters for the workflow dispatch event
Inputs map[string]any `json:"inputs"`
// The repository containing the workflow
Repository *Repository `json:"repository"`
// The user who triggered the workflow dispatch
Sender *User `json:"sender"`
}
// JSONPayload implements Payload
@ -453,18 +564,29 @@ func (p *WorkflowDispatchPayload) JSONPayload() ([]byte, error) {
// CommitStatusPayload represents a payload information of commit status event.
type CommitStatusPayload struct {
// TODO: add Branches per https://docs.github.com/en/webhooks/webhook-events-and-payloads#status
Commit *PayloadCommit `json:"commit"`
Context string `json:"context"`
// The commit that the status is associated with
Commit *PayloadCommit `json:"commit"`
// The context/identifier for this status check
Context string `json:"context"`
// swagger:strfmt date-time
CreatedAt time.Time `json:"created_at"`
Description string `json:"description"`
ID int64 `json:"id"`
Repo *Repository `json:"repository"`
Sender *User `json:"sender"`
SHA string `json:"sha"`
State string `json:"state"`
TargetURL string `json:"target_url"`
// The date and time when the status was created
CreatedAt time.Time `json:"created_at"`
// A short description of the status
Description string `json:"description"`
// The unique identifier of the status
ID int64 `json:"id"`
// The repository containing the commit
Repo *Repository `json:"repository"`
// The user who created the status
Sender *User `json:"sender"`
// The SHA hash of the commit
SHA string `json:"sha"`
// The state of the status (pending, success, error, failure)
State string `json:"state"`
// The target URL to associate with this status
TargetURL string `json:"target_url"`
// swagger:strfmt date-time
// The date and time when the status was last updated
UpdatedAt *time.Time `json:"updated_at"`
}
@ -475,13 +597,20 @@ func (p *CommitStatusPayload) JSONPayload() ([]byte, error) {
// WorkflowRunPayload represents a payload information of workflow run event.
type WorkflowRunPayload struct {
Action string `json:"action"`
Workflow *ActionWorkflow `json:"workflow"`
WorkflowRun *ActionWorkflowRun `json:"workflow_run"`
PullRequest *PullRequest `json:"pull_request,omitempty"`
Organization *Organization `json:"organization,omitempty"`
Repo *Repository `json:"repository"`
Sender *User `json:"sender"`
// The action performed on the workflow run
Action string `json:"action"`
// The workflow definition
Workflow *ActionWorkflow `json:"workflow"`
// The workflow run that was acted upon
WorkflowRun *ActionWorkflowRun `json:"workflow_run"`
// The pull request associated with the workflow run (if applicable)
PullRequest *PullRequest `json:"pull_request,omitempty"`
// The organization that owns the repository (if applicable)
Organization *Organization `json:"organization,omitempty"`
// The repository containing the workflow
Repo *Repository `json:"repository"`
// The user who triggered the workflow run
Sender *User `json:"sender"`
}
// JSONPayload implements Payload
@ -491,12 +620,18 @@ func (p *WorkflowRunPayload) JSONPayload() ([]byte, error) {
// WorkflowJobPayload represents a payload information of workflow job event.
type WorkflowJobPayload struct {
Action string `json:"action"`
WorkflowJob *ActionWorkflowJob `json:"workflow_job"`
PullRequest *PullRequest `json:"pull_request,omitempty"`
Organization *Organization `json:"organization,omitempty"`
Repo *Repository `json:"repository"`
Sender *User `json:"sender"`
// The action performed on the workflow job
Action string `json:"action"`
// The workflow job that was acted upon
WorkflowJob *ActionWorkflowJob `json:"workflow_job"`
// The pull request associated with the workflow job (if applicable)
PullRequest *PullRequest `json:"pull_request,omitempty"`
// The organization that owns the repository (if applicable)
Organization *Organization `json:"organization,omitempty"`
// The repository containing the workflow
Repo *Repository `json:"repository"`
// The user who triggered the workflow job
Sender *User `json:"sender"`
}
// JSONPayload implements Payload

View File

@ -9,15 +9,24 @@ import (
// Comment represents a comment on a commit or issue
type Comment struct {
ID int64 `json:"id"`
HTMLURL string `json:"html_url"`
PRURL string `json:"pull_request_url"`
IssueURL string `json:"issue_url"`
Poster *User `json:"user"`
OriginalAuthor string `json:"original_author"`
OriginalAuthorID int64 `json:"original_author_id"`
Body string `json:"body"`
Attachments []*Attachment `json:"assets"`
// ID is the unique identifier for the comment
ID int64 `json:"id"`
// HTMLURL is the web URL for viewing the comment
HTMLURL string `json:"html_url"`
// PRURL is the API URL for the pull request (if applicable)
PRURL string `json:"pull_request_url"`
// IssueURL is the API URL for the issue
IssueURL string `json:"issue_url"`
// Poster is the user who posted the comment
Poster *User `json:"user"`
// OriginalAuthor is the original author name (for imported comments)
OriginalAuthor string `json:"original_author"`
// OriginalAuthorID is the original author ID (for imported comments)
OriginalAuthorID int64 `json:"original_author_id"`
// Body contains the comment text content
Body string `json:"body"`
// Attachments contains files attached to the comment
Attachments []*Attachment `json:"assets"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
@ -27,25 +36,34 @@ type Comment struct {
// CreateIssueCommentOption options for creating a comment on an issue
type CreateIssueCommentOption struct {
// required:true
// Body is the comment text content
Body string `json:"body" binding:"Required"`
}
// EditIssueCommentOption options for editing a comment
type EditIssueCommentOption struct {
// required: true
// Body is the updated comment text content
Body string `json:"body" binding:"Required"`
}
// TimelineComment represents a timeline comment (comment of any type) on a commit or issue
type TimelineComment struct {
ID int64 `json:"id"`
// ID is the unique identifier for the timeline comment
ID int64 `json:"id"`
// Type indicates the type of timeline event
Type string `json:"type"`
HTMLURL string `json:"html_url"`
PRURL string `json:"pull_request_url"`
// HTMLURL is the web URL for viewing the comment
HTMLURL string `json:"html_url"`
// PRURL is the API URL for the pull request (if applicable)
PRURL string `json:"pull_request_url"`
// IssueURL is the API URL for the issue
IssueURL string `json:"issue_url"`
Poster *User `json:"user"`
Body string `json:"body"`
// Poster is the user who created the timeline event
Poster *User `json:"user"`
// Body contains the timeline event content
Body string `json:"body"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
// swagger:strfmt date-time

View File

@ -7,27 +7,33 @@ package structs
// Label a label to an issue or a pr
// swagger:model
type Label struct {
ID int64 `json:"id"`
// ID is the unique identifier for the label
ID int64 `json:"id"`
// Name is the display name of the label
Name string `json:"name"`
// example: false
Exclusive bool `json:"exclusive"`
// example: false
IsArchived bool `json:"is_archived"`
// example: 00aabb
Color string `json:"color"`
Color string `json:"color"`
// Description provides additional context about the label's purpose
Description string `json:"description"`
URL string `json:"url"`
// URL is the API endpoint for accessing this label
URL string `json:"url"`
}
// CreateLabelOption options for creating a label
type CreateLabelOption struct {
// required:true
// Name is the display name for the new label
Name string `json:"name" binding:"Required"`
// example: false
Exclusive bool `json:"exclusive"`
// required:true
// example: #00aabb
Color string `json:"color" binding:"Required"`
Color string `json:"color" binding:"Required"`
// Description provides additional context about the label's purpose
Description string `json:"description"`
// example: false
IsArchived bool `json:"is_archived"`
@ -35,11 +41,13 @@ type CreateLabelOption struct {
// EditLabelOption options for editing a label
type EditLabelOption struct {
// Name is the new display name for the label
Name *string `json:"name"`
// example: false
Exclusive *bool `json:"exclusive"`
// example: #00aabb
Color *string `json:"color"`
Color *string `json:"color"`
// Description provides additional context about the label's purpose
Description *string `json:"description"`
// example: false
IsArchived *bool `json:"is_archived"`
@ -54,10 +62,12 @@ type IssueLabelsOption struct {
// LabelTemplate info of a Label template
type LabelTemplate struct {
// Name is the display name of the label template
Name string `json:"name"`
// example: false
Exclusive bool `json:"exclusive"`
// example: 00aabb
Color string `json:"color"`
Color string `json:"color"`
// Description provides additional context about the label template's purpose
Description string `json:"description"`
}

View File

@ -9,12 +9,18 @@ import (
// Milestone milestone is a collection of issues on one repository
type Milestone struct {
ID int64 `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
State StateType `json:"state"`
OpenIssues int `json:"open_issues"`
ClosedIssues int `json:"closed_issues"`
// ID is the unique identifier for the milestone
ID int64 `json:"id"`
// Title is the title of the milestone
Title string `json:"title"`
// Description provides details about the milestone
Description string `json:"description"`
// State indicates if the milestone is open or closed
State StateType `json:"state"`
// OpenIssues is the number of open issues in this milestone
OpenIssues int `json:"open_issues"`
// ClosedIssues is the number of closed issues in this milestone
ClosedIssues int `json:"closed_issues"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
@ -27,18 +33,26 @@ type Milestone struct {
// CreateMilestoneOption options for creating a milestone
type CreateMilestoneOption struct {
Title string `json:"title"`
// Title is the title of the new milestone
Title string `json:"title"`
// Description provides details about the milestone
Description string `json:"description"`
// swagger:strfmt date-time
// Deadline is the due date for the milestone
Deadline *time.Time `json:"due_on"`
// enum: open,closed
// State indicates the initial state of the milestone
State string `json:"state"`
}
// EditMilestoneOption options for editing a milestone
type EditMilestoneOption struct {
Title string `json:"title"`
Description *string `json:"description"`
State *string `json:"state"`
Deadline *time.Time `json:"due_on"`
// Title is the updated title of the milestone
Title string `json:"title"`
// Description provides updated details about the milestone
Description *string `json:"description"`
// State indicates the updated state of the milestone
State *string `json:"state"`
// Deadline is the updated due date for the milestone
Deadline *time.Time `json:"due_on"`
}

View File

@ -9,13 +9,17 @@ import (
// EditReactionOption contain the reaction type
type EditReactionOption struct {
// The reaction content (e.g., emoji or reaction type)
Reaction string `json:"content"`
}
// Reaction contain one reaction
type Reaction struct {
User *User `json:"user"`
// The user who created the reaction
User *User `json:"user"`
// The reaction content (e.g., emoji or reaction type)
Reaction string `json:"content"`
// swagger:strfmt date-time
// The date and time when the reaction was created
Created time.Time `json:"created_at"`
}

View File

@ -10,13 +10,20 @@ import (
// StopWatch represent a running stopwatch
type StopWatch struct {
// swagger:strfmt date-time
Created time.Time `json:"created"`
Seconds int64 `json:"seconds"`
Duration string `json:"duration"`
IssueIndex int64 `json:"issue_index"`
IssueTitle string `json:"issue_title"`
RepoOwnerName string `json:"repo_owner_name"`
RepoName string `json:"repo_name"`
// Created is the time when the stopwatch was started
Created time.Time `json:"created"`
// Seconds is the total elapsed time in seconds
Seconds int64 `json:"seconds"`
// Duration is a human-readable duration string
Duration string `json:"duration"`
// IssueIndex is the index number of the associated issue
IssueIndex int64 `json:"issue_index"`
// IssueTitle is the title of the associated issue
IssueTitle string `json:"issue_title"`
// RepoOwnerName is the name of the repository owner
RepoOwnerName string `json:"repo_owner_name"`
// RepoName is the name of the repository
RepoName string `json:"repo_name"`
}
// StopWatches represent a list of stopwatches

View File

@ -20,6 +20,7 @@ type AddTimeOption struct {
// TrackedTime worked time for an issue / pr
type TrackedTime struct {
// ID is the unique identifier for the tracked time entry
ID int64 `json:"id"`
// swagger:strfmt date-time
Created time.Time `json:"created"`
@ -30,8 +31,9 @@ type TrackedTime struct {
// username of the user
UserName string `json:"user_name"`
// deprecated (only for backwards compatibility)
IssueID int64 `json:"issue_id"`
Issue *Issue `json:"issue"`
IssueID int64 `json:"issue_id"`
// Issue contains the associated issue information
Issue *Issue `json:"issue"`
}
// TrackedTimeList represents a list of tracked times

View File

@ -10,55 +10,72 @@ import (
// LFSLock represent a lock
// for use with the locks API.
type LFSLock struct {
ID string `json:"id"`
Path string `json:"path"`
LockedAt time.Time `json:"locked_at"`
Owner *LFSLockOwner `json:"owner"`
// The unique identifier of the lock
ID string `json:"id"`
// The file path that is locked
Path string `json:"path"`
// The timestamp when the lock was created
LockedAt time.Time `json:"locked_at"`
// The owner of the lock
Owner *LFSLockOwner `json:"owner"`
}
// LFSLockOwner represent a lock owner
// for use with the locks API.
type LFSLockOwner struct {
// The name of the lock owner
Name string `json:"name"`
}
// LFSLockRequest contains the path of the lock to create
// https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md#create-lock
type LFSLockRequest struct {
// The file path to lock
Path string `json:"path"`
}
// LFSLockResponse represent a lock created
// https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md#create-lock
type LFSLockResponse struct {
// The created lock
Lock *LFSLock `json:"lock"`
}
// LFSLockList represent a list of lock requested
// https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md#list-locks
type LFSLockList struct {
// The list of locks
Locks []*LFSLock `json:"locks"`
Next string `json:"next_cursor,omitempty"`
// The cursor for pagination to the next set of results
Next string `json:"next_cursor,omitempty"`
}
// LFSLockListVerify represent a list of lock verification requested
// https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md#list-locks-for-verification
type LFSLockListVerify struct {
Ours []*LFSLock `json:"ours"`
// Locks owned by the requesting user
Ours []*LFSLock `json:"ours"`
// Locks owned by other users
Theirs []*LFSLock `json:"theirs"`
Next string `json:"next_cursor,omitempty"`
// The cursor for pagination to the next set of results
Next string `json:"next_cursor,omitempty"`
}
// LFSLockError contains information on the error that occurs
type LFSLockError struct {
Message string `json:"message"`
Lock *LFSLock `json:"lock,omitempty"`
Documentation string `json:"documentation_url,omitempty"`
RequestID string `json:"request_id,omitempty"`
// The error message
Message string `json:"message"`
// The lock related to the error, if any
Lock *LFSLock `json:"lock,omitempty"`
// URL to documentation about the error
Documentation string `json:"documentation_url,omitempty"`
// The request ID for debugging purposes
RequestID string `json:"request_id,omitempty"`
}
// LFSLockDeleteRequest contains params of a delete request
// https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md#delete-lock
type LFSLockDeleteRequest struct {
// Whether to force delete the lock even if not owned by the requester
Force bool `json:"force"`
}

View File

@ -7,24 +7,35 @@ import "time"
// CreatePushMirrorOption represents need information to create a push mirror of a repository.
type CreatePushMirrorOption struct {
RemoteAddress string `json:"remote_address"`
// The remote repository URL to push to
RemoteAddress string `json:"remote_address"`
// The username for authentication with the remote repository
RemoteUsername string `json:"remote_username"`
// The password for authentication with the remote repository
RemotePassword string `json:"remote_password"`
Interval string `json:"interval"`
SyncOnCommit bool `json:"sync_on_commit"`
// The sync interval for automatic updates
Interval string `json:"interval"`
// Whether to sync on every commit
SyncOnCommit bool `json:"sync_on_commit"`
}
// PushMirror represents information of a push mirror
// swagger:model
type PushMirror struct {
RepoName string `json:"repo_name"`
RemoteName string `json:"remote_name"`
// The name of the source repository
RepoName string `json:"repo_name"`
// The name of the remote in the git configuration
RemoteName string `json:"remote_name"`
// The remote repository URL being mirrored to
RemoteAddress string `json:"remote_address"`
// swagger:strfmt date-time
CreatedUnix time.Time `json:"created"`
// swagger:strfmt date-time
LastUpdateUnix *time.Time `json:"last_update"`
LastError string `json:"last_error"`
Interval string `json:"interval"`
SyncOnCommit bool `json:"sync_on_commit"`
// The last error message encountered during sync
LastError string `json:"last_error"`
// The sync interval for automatic updates
Interval string `json:"interval"`
// Whether to sync on every commit
SyncOnCommit bool `json:"sync_on_commit"`
}

View File

@ -5,13 +5,17 @@ package structs
// SearchResults results of a successful search
type SearchResults struct {
OK bool `json:"ok"`
// OK indicates if the search was successful
OK bool `json:"ok"`
// Data contains the repository search results
Data []*Repository `json:"data"`
}
// SearchError error of a failed search
type SearchError struct {
OK bool `json:"ok"`
// OK indicates the search status (always false for errors)
OK bool `json:"ok"`
// Error contains the error message
Error string `json:"error"`
}
@ -73,33 +77,46 @@ type MarkdownRender string
// ServerVersion wraps the version of the server
type ServerVersion struct {
// Version is the server version string
Version string `json:"version"`
}
// GitignoreTemplateInfo name and text of a gitignore template
type GitignoreTemplateInfo struct {
Name string `json:"name"`
// Name is the name of the gitignore template
Name string `json:"name"`
// Source contains the content of the gitignore template
Source string `json:"source"`
}
// LicensesListEntry is used for the API
type LicensesTemplateListEntry struct {
Key string `json:"key"`
// Key is the unique identifier for the license template
Key string `json:"key"`
// Name is the display name of the license
Name string `json:"name"`
URL string `json:"url"`
// URL is the reference URL for the license
URL string `json:"url"`
}
// LicensesInfo contains information about a License
type LicenseTemplateInfo struct {
Key string `json:"key"`
Name string `json:"name"`
URL string `json:"url"`
// Key is the unique identifier for the license template
Key string `json:"key"`
// Name is the display name of the license
Name string `json:"name"`
// URL is the reference URL for the license
URL string `json:"url"`
// Implementation contains license implementation details
Implementation string `json:"implementation"`
Body string `json:"body"`
// Body contains the full text of the license
Body string `json:"body"`
}
// APIError is an api error with a message
type APIError struct {
// Message contains the error description
Message string `json:"message"`
URL string `json:"url"`
// URL contains the documentation URL for this error
URL string `json:"url"`
}

View File

@ -5,39 +5,58 @@ package structs
// NodeInfo contains standardized way of exposing metadata about a server running one of the distributed social networks
type NodeInfo struct {
Version string `json:"version"`
Software NodeInfoSoftware `json:"software"`
Protocols []string `json:"protocols"`
Services NodeInfoServices `json:"services"`
OpenRegistrations bool `json:"openRegistrations"`
Usage NodeInfoUsage `json:"usage"`
Metadata struct{} `json:"metadata"`
// Version specifies the schema version
Version string `json:"version"`
// Software contains information about the server software
Software NodeInfoSoftware `json:"software"`
// Protocols lists the protocols supported by this server
Protocols []string `json:"protocols"`
// Services contains third party services this server can connect to
Services NodeInfoServices `json:"services"`
// OpenRegistrations indicates if new user registrations are accepted
OpenRegistrations bool `json:"openRegistrations"`
// Usage contains server usage statistics
Usage NodeInfoUsage `json:"usage"`
// Metadata contains free form key value pairs for software specific values
Metadata struct{} `json:"metadata"`
}
// NodeInfoSoftware contains Metadata about server software in use
type NodeInfoSoftware struct {
Name string `json:"name"`
Version string `json:"version"`
// Name is the canonical name of this server software
Name string `json:"name"`
// Version is the version of this server software
Version string `json:"version"`
// Repository is the URL to the source code repository
Repository string `json:"repository"`
Homepage string `json:"homepage"`
// Homepage is the URL to the homepage of this server software
Homepage string `json:"homepage"`
}
// NodeInfoServices contains the third party sites this server can connect to via their application API
type NodeInfoServices struct {
Inbound []string `json:"inbound"`
// Inbound lists services that can deliver content to this server
Inbound []string `json:"inbound"`
// Outbound lists services this server can deliver content to
Outbound []string `json:"outbound"`
}
// NodeInfoUsage contains usage statistics for this server
type NodeInfoUsage struct {
Users NodeInfoUsageUsers `json:"users"`
LocalPosts int `json:"localPosts,omitempty"`
LocalComments int `json:"localComments,omitempty"`
// Users contains user statistics
Users NodeInfoUsageUsers `json:"users"`
// LocalPosts is the total amount of posts made by users local to this server
LocalPosts int `json:"localPosts,omitempty"`
// LocalComments is the total amount of comments made by users local to this server
LocalComments int `json:"localComments,omitempty"`
}
// NodeInfoUsageUsers contains statistics about the users of this server
type NodeInfoUsageUsers struct {
Total int `json:"total,omitempty"`
// Total is the total amount of users on this server
Total int `json:"total,omitempty"`
// ActiveHalfyear is the amount of users that signed in at least once in the last 180 days
ActiveHalfyear int `json:"activeHalfyear,omitempty"`
ActiveMonth int `json:"activeMonth,omitempty"`
// ActiveMonth is the amount of users that signed in at least once in the last 30 days
ActiveMonth int `json:"activeMonth,omitempty"`
}

View File

@ -9,28 +9,43 @@ import (
// NotificationThread expose Notification on API
type NotificationThread struct {
ID int64 `json:"id"`
Repository *Repository `json:"repository"`
Subject *NotificationSubject `json:"subject"`
Unread bool `json:"unread"`
Pinned bool `json:"pinned"`
UpdatedAt time.Time `json:"updated_at"`
URL string `json:"url"`
// ID is the unique identifier for the notification thread
ID int64 `json:"id"`
// Repository is the repository associated with the notification
Repository *Repository `json:"repository"`
// Subject contains details about the notification subject
Subject *NotificationSubject `json:"subject"`
// Unread indicates if the notification has been read
Unread bool `json:"unread"`
// Pinned indicates if the notification is pinned
Pinned bool `json:"pinned"`
// UpdatedAt is the time when the notification was last updated
UpdatedAt time.Time `json:"updated_at"`
// URL is the API URL for this notification thread
URL string `json:"url"`
}
// NotificationSubject contains the notification subject (Issue/Pull/Commit)
type NotificationSubject struct {
Title string `json:"title"`
URL string `json:"url"`
LatestCommentURL string `json:"latest_comment_url"`
HTMLURL string `json:"html_url"`
LatestCommentHTMLURL string `json:"latest_comment_html_url"`
Type NotifySubjectType `json:"type" binding:"In(Issue,Pull,Commit,Repository)"`
State StateType `json:"state"`
// Title is the title of the notification subject
Title string `json:"title"`
// URL is the API URL for the notification subject
URL string `json:"url"`
// LatestCommentURL is the API URL for the latest comment
LatestCommentURL string `json:"latest_comment_url"`
// HTMLURL is the web URL for the notification subject
HTMLURL string `json:"html_url"`
// LatestCommentHTMLURL is the web URL for the latest comment
LatestCommentHTMLURL string `json:"latest_comment_html_url"`
// Type indicates the type of the notification subject
Type NotifySubjectType `json:"type" binding:"In(Issue,Pull,Commit,Repository)"`
// State indicates the current state of the notification subject
State StateType `json:"state"`
}
// NotificationCount number of unread notifications
type NotificationCount struct {
// New is the number of unread notifications
New int64 `json:"new"`
}

View File

@ -5,16 +5,26 @@ package structs
// Organization represents an organization
type Organization struct {
ID int64 `json:"id"`
Name string `json:"name"`
FullName string `json:"full_name"`
Email string `json:"email"`
AvatarURL string `json:"avatar_url"`
Description string `json:"description"`
Website string `json:"website"`
Location string `json:"location"`
Visibility string `json:"visibility"`
RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access"`
// The unique identifier of the organization
ID int64 `json:"id"`
// The name of the organization
Name string `json:"name"`
// The full display name of the organization
FullName string `json:"full_name"`
// The email address of the organization
Email string `json:"email"`
// The URL of the organization's avatar
AvatarURL string `json:"avatar_url"`
// The description of the organization
Description string `json:"description"`
// The website URL of the organization
Website string `json:"website"`
// The location of the organization
Location string `json:"location"`
// The visibility level of the organization (public, limited, private)
Visibility string `json:"visibility"`
// Whether repository administrators can change team access
RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access"`
// username of the organization
// deprecated
UserName string `json:"username"`
@ -22,10 +32,15 @@ type Organization struct {
// OrganizationPermissions list different users permissions on an organization
type OrganizationPermissions struct {
IsOwner bool `json:"is_owner"`
IsAdmin bool `json:"is_admin"`
CanWrite bool `json:"can_write"`
CanRead bool `json:"can_read"`
// Whether the user is an owner of the organization
IsOwner bool `json:"is_owner"`
// Whether the user is an admin of the organization
IsAdmin bool `json:"is_admin"`
// Whether the user can write to the organization
CanWrite bool `json:"can_write"`
// Whether the user can read the organization
CanRead bool `json:"can_read"`
// Whether the user can create repositories in the organization
CanCreateRepository bool `json:"can_create_repository"`
}
@ -33,31 +48,43 @@ type OrganizationPermissions struct {
type CreateOrgOption struct {
// username of the organization
// required: true
UserName string `json:"username" binding:"Required;Username;MaxSize(40)"`
FullName string `json:"full_name" binding:"MaxSize(100)"`
Email string `json:"email" binding:"MaxSize(255)"`
UserName string `json:"username" binding:"Required;Username;MaxSize(40)"`
// The full display name of the organization
FullName string `json:"full_name" binding:"MaxSize(100)"`
// The email address of the organization
Email string `json:"email" binding:"MaxSize(255)"`
// The description of the organization
Description string `json:"description" binding:"MaxSize(255)"`
Website string `json:"website" binding:"ValidUrl;MaxSize(255)"`
Location string `json:"location" binding:"MaxSize(50)"`
// The website URL of the organization
Website string `json:"website" binding:"ValidUrl;MaxSize(255)"`
// The location of the organization
Location string `json:"location" binding:"MaxSize(50)"`
// possible values are `public` (default), `limited` or `private`
// enum: public,limited,private
Visibility string `json:"visibility" binding:"In(,public,limited,private)"`
RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access"`
Visibility string `json:"visibility" binding:"In(,public,limited,private)"`
// Whether repository administrators can change team access
RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access"`
}
// TODO: make EditOrgOption fields optional after https://gitea.com/go-chi/binding/pulls/5 got merged
// EditOrgOption options for editing an organization
type EditOrgOption struct {
FullName string `json:"full_name" binding:"MaxSize(100)"`
Email string `json:"email" binding:"MaxSize(255)"`
// The full display name of the organization
FullName string `json:"full_name" binding:"MaxSize(100)"`
// The email address of the organization
Email string `json:"email" binding:"MaxSize(255)"`
// The description of the organization
Description string `json:"description" binding:"MaxSize(255)"`
Website string `json:"website" binding:"ValidUrl;MaxSize(255)"`
Location string `json:"location" binding:"MaxSize(50)"`
// The website URL of the organization
Website string `json:"website" binding:"ValidUrl;MaxSize(255)"`
// The location of the organization
Location string `json:"location" binding:"MaxSize(50)"`
// possible values are `public`, `limited` or `private`
// enum: public,limited,private
Visibility string `json:"visibility" binding:"In(,public,limited,private)"`
RepoAdminChangeTeamAccess *bool `json:"repo_admin_change_team_access"`
Visibility string `json:"visibility" binding:"In(,public,limited,private)"`
// Whether repository administrators can change team access
RepoAdminChangeTeamAccess *bool `json:"repo_admin_change_team_access"`
}
// RenameOrgOption options when renaming an organization

View File

@ -5,5 +5,6 @@ package structs
// AddOrgMembershipOption add user to organization options
type AddOrgMembershipOption struct {
// Role is the role to assign to the organization member
Role string `json:"role" binding:"Required"`
}

View File

@ -6,49 +6,61 @@ package structs
// Team represents a team in an organization
type Team struct {
ID int64 `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Organization *Organization `json:"organization"`
IncludesAllRepositories bool `json:"includes_all_repositories"`
// The unique identifier of the team
ID int64 `json:"id"`
// The name of the team
Name string `json:"name"`
// The description of the team
Description string `json:"description"`
// The organization that the team belongs to
Organization *Organization `json:"organization"`
// Whether the team has access to all repositories in the organization
IncludesAllRepositories bool `json:"includes_all_repositories"`
// enum: none,read,write,admin,owner
Permission string `json:"permission"`
// example: ["repo.code","repo.issues","repo.ext_issues","repo.wiki","repo.pulls","repo.releases","repo.projects","repo.ext_wiki"]
// Deprecated: This variable should be replaced by UnitsMap and will be dropped in later versions.
Units []string `json:"units"`
// example: {"repo.code":"read","repo.issues":"write","repo.ext_issues":"none","repo.wiki":"admin","repo.pulls":"owner","repo.releases":"none","repo.projects":"none","repo.ext_wiki":"none"}
UnitsMap map[string]string `json:"units_map"`
CanCreateOrgRepo bool `json:"can_create_org_repo"`
UnitsMap map[string]string `json:"units_map"`
// Whether the team can create repositories in the organization
CanCreateOrgRepo bool `json:"can_create_org_repo"`
}
// CreateTeamOption options for creating a team
type CreateTeamOption struct {
// required: true
Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(255)"`
Description string `json:"description" binding:"MaxSize(255)"`
IncludesAllRepositories bool `json:"includes_all_repositories"`
Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(255)"`
// The description of the team
Description string `json:"description" binding:"MaxSize(255)"`
// Whether the team has access to all repositories in the organization
IncludesAllRepositories bool `json:"includes_all_repositories"`
// enum: read,write,admin
Permission string `json:"permission"`
// example: ["repo.actions","repo.code","repo.issues","repo.ext_issues","repo.wiki","repo.ext_wiki","repo.pulls","repo.releases","repo.projects","repo.ext_wiki"]
// Deprecated: This variable should be replaced by UnitsMap and will be dropped in later versions.
Units []string `json:"units"`
// example: {"repo.actions","repo.packages","repo.code":"read","repo.issues":"write","repo.ext_issues":"none","repo.wiki":"admin","repo.pulls":"owner","repo.releases":"none","repo.projects":"none","repo.ext_wiki":"none"}
UnitsMap map[string]string `json:"units_map"`
CanCreateOrgRepo bool `json:"can_create_org_repo"`
UnitsMap map[string]string `json:"units_map"`
// Whether the team can create repositories in the organization
CanCreateOrgRepo bool `json:"can_create_org_repo"`
}
// EditTeamOption options for editing a team
type EditTeamOption struct {
// required: true
Name string `json:"name" binding:"AlphaDashDot;MaxSize(255)"`
Description *string `json:"description" binding:"MaxSize(255)"`
IncludesAllRepositories *bool `json:"includes_all_repositories"`
Name string `json:"name" binding:"AlphaDashDot;MaxSize(255)"`
// The description of the team
Description *string `json:"description" binding:"MaxSize(255)"`
// Whether the team has access to all repositories in the organization
IncludesAllRepositories *bool `json:"includes_all_repositories"`
// enum: read,write,admin
Permission string `json:"permission"`
// example: ["repo.code","repo.issues","repo.ext_issues","repo.wiki","repo.pulls","repo.releases","repo.projects","repo.ext_wiki"]
// Deprecated: This variable should be replaced by UnitsMap and will be dropped in later versions.
Units []string `json:"units"`
// example: {"repo.code":"read","repo.issues":"write","repo.ext_issues":"none","repo.wiki":"admin","repo.pulls":"owner","repo.releases":"none","repo.projects":"none","repo.ext_wiki":"none"}
UnitsMap map[string]string `json:"units_map"`
CanCreateOrgRepo *bool `json:"can_create_org_repo"`
UnitsMap map[string]string `json:"units_map"`
// Whether the team can create repositories in the organization
CanCreateOrgRepo *bool `json:"can_create_org_repo"`
}

View File

@ -9,25 +9,41 @@ import (
// Package represents a package
type Package struct {
ID int64 `json:"id"`
Owner *User `json:"owner"`
// The unique identifier of the package
ID int64 `json:"id"`
// The owner of the package
Owner *User `json:"owner"`
// The repository that contains this package
Repository *Repository `json:"repository"`
Creator *User `json:"creator"`
Type string `json:"type"`
Name string `json:"name"`
Version string `json:"version"`
HTMLURL string `json:"html_url"`
// The user who created this package
Creator *User `json:"creator"`
// The type of the package (e.g., npm, maven, docker)
Type string `json:"type"`
// The name of the package
Name string `json:"name"`
// The version of the package
Version string `json:"version"`
// The HTML URL to view the package
HTMLURL string `json:"html_url"`
// swagger:strfmt date-time
// The date and time when the package was created
CreatedAt time.Time `json:"created_at"`
}
// PackageFile represents a package file
type PackageFile struct {
ID int64 `json:"id"`
Size int64 `json:"size"`
Name string `json:"name"`
HashMD5 string `json:"md5"`
HashSHA1 string `json:"sha1"`
// The unique identifier of the package file
ID int64 `json:"id"`
// The size of the package file in bytes
Size int64 `json:"size"`
// The name of the package file
Name string `json:"name"`
// The MD5 hash of the package file
HashMD5 string `json:"md5"`
// The SHA1 hash of the package file
HashSHA1 string `json:"sha1"`
// The SHA256 hash of the package file
HashSHA256 string `json:"sha256"`
// The SHA512 hash of the package file
HashSHA512 string `json:"sha512"`
}

View File

@ -9,45 +9,75 @@ import (
// PullRequest represents a pull request
type PullRequest struct {
ID int64 `json:"id"`
URL string `json:"url"`
Index int64 `json:"number"`
Poster *User `json:"user"`
Title string `json:"title"`
Body string `json:"body"`
Labels []*Label `json:"labels"`
Milestone *Milestone `json:"milestone"`
Assignee *User `json:"assignee"`
Assignees []*User `json:"assignees"`
RequestedReviewers []*User `json:"requested_reviewers"`
RequestedReviewersTeams []*Team `json:"requested_reviewers_teams"`
State StateType `json:"state"`
Draft bool `json:"draft"`
IsLocked bool `json:"is_locked"`
Comments int `json:"comments"`
// The unique identifier of the pull request
ID int64 `json:"id"`
// The API URL of the pull request
URL string `json:"url"`
// The pull request number
Index int64 `json:"number"`
// The user who created the pull request
Poster *User `json:"user"`
// The title of the pull request
Title string `json:"title"`
// The description body of the pull request
Body string `json:"body"`
// The labels attached to the pull request
Labels []*Label `json:"labels"`
// The milestone associated with the pull request
Milestone *Milestone `json:"milestone"`
// The primary assignee of the pull request
Assignee *User `json:"assignee"`
// The list of users assigned to the pull request
Assignees []*User `json:"assignees"`
// The users requested to review the pull request
RequestedReviewers []*User `json:"requested_reviewers"`
// The teams requested to review the pull request
RequestedReviewersTeams []*Team `json:"requested_reviewers_teams"`
// The current state of the pull request
State StateType `json:"state"`
// Whether the pull request is a draft
Draft bool `json:"draft"`
// Whether the pull request conversation is locked
IsLocked bool `json:"is_locked"`
// The number of comments on the pull request
Comments int `json:"comments"`
// number of review comments made on the diff of a PR review (not including comments on commits or issues in a PR)
ReviewComments int `json:"review_comments,omitempty"`
Additions *int `json:"additions,omitempty"`
Deletions *int `json:"deletions,omitempty"`
// The number of lines added in the pull request
Additions *int `json:"additions,omitempty"`
// The number of lines deleted in the pull request
Deletions *int `json:"deletions,omitempty"`
// The number of files changed in the pull request
ChangedFiles *int `json:"changed_files,omitempty"`
HTMLURL string `json:"html_url"`
DiffURL string `json:"diff_url"`
// The HTML URL to view the pull request
HTMLURL string `json:"html_url"`
// The URL to download the diff patch
DiffURL string `json:"diff_url"`
// The URL to download the patch file
PatchURL string `json:"patch_url"`
// Whether the pull request can be merged
Mergeable bool `json:"mergeable"`
// Whether the pull request has been merged
HasMerged bool `json:"merged"`
// swagger:strfmt date-time
Merged *time.Time `json:"merged_at"`
MergedCommitID *string `json:"merge_commit_sha"`
MergedBy *User `json:"merged_by"`
AllowMaintainerEdit bool `json:"allow_maintainer_edit"`
Merged *time.Time `json:"merged_at"`
// The SHA of the merge commit
MergedCommitID *string `json:"merge_commit_sha"`
// The user who merged the pull request
MergedBy *User `json:"merged_by"`
// Whether maintainers can edit the pull request
AllowMaintainerEdit bool `json:"allow_maintainer_edit"`
Base *PRBranchInfo `json:"base"`
Head *PRBranchInfo `json:"head"`
MergeBase string `json:"merge_base"`
// Information about the base branch
Base *PRBranchInfo `json:"base"`
// Information about the head branch
Head *PRBranchInfo `json:"head"`
// The merge base commit SHA
MergeBase string `json:"merge_base"`
// swagger:strfmt date-time
Deadline *time.Time `json:"due_date"`
@ -59,65 +89,103 @@ type PullRequest struct {
// swagger:strfmt date-time
Closed *time.Time `json:"closed_at"`
// The pin order for the pull request
PinOrder int `json:"pin_order"`
}
// PRBranchInfo information about a branch
type PRBranchInfo struct {
Name string `json:"label"`
Ref string `json:"ref"`
Sha string `json:"sha"`
RepoID int64 `json:"repo_id"`
// The display name of the branch
Name string `json:"label"`
// The git reference of the branch
Ref string `json:"ref"`
// The commit SHA of the branch head
Sha string `json:"sha"`
// The unique identifier of the repository
RepoID int64 `json:"repo_id"`
// The repository information
Repository *Repository `json:"repo"`
}
// ListPullRequestsOptions options for listing pull requests
type ListPullRequestsOptions struct {
Page int `json:"page"`
// The page number for pagination
Page int `json:"page"`
// The state filter for pull requests
State string `json:"state"`
}
// CreatePullRequestOption options when creating a pull request
type CreatePullRequestOption struct {
Head string `json:"head" binding:"Required"`
Base string `json:"base" binding:"Required"`
Title string `json:"title" binding:"Required"`
Body string `json:"body"`
Assignee string `json:"assignee"`
// The head branch for the pull request, it could be a branch name on the base repository or
// a form like `<username>:<branch>` which refers to the user's fork repository's branch.
Head string `json:"head" binding:"Required"`
// The base branch for the pull request
Base string `json:"base" binding:"Required"`
// The title of the pull request
Title string `json:"title" binding:"Required"`
// The description body of the pull request
Body string `json:"body"`
// The primary assignee username
Assignee string `json:"assignee"`
// The list of assignee usernames
Assignees []string `json:"assignees"`
Milestone int64 `json:"milestone"`
Labels []int64 `json:"labels"`
// The milestone ID to assign to the pull request
Milestone int64 `json:"milestone"`
// The list of label IDs to assign to the pull request
Labels []int64 `json:"labels"`
// swagger:strfmt date-time
Deadline *time.Time `json:"due_date"`
Reviewers []string `json:"reviewers"`
TeamReviewers []string `json:"team_reviewers"`
Deadline *time.Time `json:"due_date"`
// The list of reviewer usernames
Reviewers []string `json:"reviewers"`
// The list of team reviewer names
TeamReviewers []string `json:"team_reviewers"`
}
// EditPullRequestOption options when modify pull request
type EditPullRequestOption struct {
Title string `json:"title"`
Body *string `json:"body"`
Base string `json:"base"`
Assignee string `json:"assignee"`
// The new title for the pull request
Title string `json:"title"`
// The new description body for the pull request
Body *string `json:"body"`
// The new base branch for the pull request
Base string `json:"base"`
// The new primary assignee username
Assignee string `json:"assignee"`
// The new list of assignee usernames
Assignees []string `json:"assignees"`
Milestone int64 `json:"milestone"`
Labels []int64 `json:"labels"`
State *string `json:"state"`
// The new milestone ID for the pull request
Milestone int64 `json:"milestone"`
// The new list of label IDs for the pull request
Labels []int64 `json:"labels"`
// The new state for the pull request
State *string `json:"state"`
// swagger:strfmt date-time
Deadline *time.Time `json:"due_date"`
RemoveDeadline *bool `json:"unset_due_date"`
AllowMaintainerEdit *bool `json:"allow_maintainer_edit"`
Deadline *time.Time `json:"due_date"`
// Whether to remove the current deadline
RemoveDeadline *bool `json:"unset_due_date"`
// Whether to allow maintainer edits
AllowMaintainerEdit *bool `json:"allow_maintainer_edit"`
}
// ChangedFile store information about files affected by the pull request
type ChangedFile struct {
Filename string `json:"filename"`
// The name of the changed file
Filename string `json:"filename"`
// The previous filename if the file was renamed
PreviousFilename string `json:"previous_filename,omitempty"`
Status string `json:"status"`
Additions int `json:"additions"`
Deletions int `json:"deletions"`
Changes int `json:"changes"`
HTMLURL string `json:"html_url,omitempty"`
ContentsURL string `json:"contents_url,omitempty"`
RawURL string `json:"raw_url,omitempty"`
// The status of the file change (added, modified, deleted, etc.)
Status string `json:"status"`
// The number of lines added to the file
Additions int `json:"additions"`
// The number of lines deleted from the file
Deletions int `json:"deletions"`
// The total number of changes to the file
Changes int `json:"changes"`
// The HTML URL to view the file changes
HTMLURL string `json:"html_url,omitempty"`
// The API URL to get the file contents
ContentsURL string `json:"contents_url,omitempty"`
// The raw URL to download the file
RawURL string `json:"raw_url,omitempty"`
}

View File

@ -42,7 +42,9 @@ type PullReview struct {
// swagger:strfmt date-time
Updated time.Time `json:"updated_at"`
HTMLURL string `json:"html_url"`
// HTMLURL is the web URL for viewing the review
HTMLURL string `json:"html_url"`
// HTMLPullURL is the web URL for the pull request
HTMLPullURL string `json:"pull_request_url"`
}

View File

@ -9,44 +9,70 @@ import (
// Release represents a repository release
type Release struct {
ID int64 `json:"id"`
TagName string `json:"tag_name"`
Target string `json:"target_commitish"`
Title string `json:"name"`
Note string `json:"body"`
URL string `json:"url"`
HTMLURL string `json:"html_url"`
TarURL string `json:"tarball_url"`
ZipURL string `json:"zipball_url"`
UploadURL string `json:"upload_url"`
IsDraft bool `json:"draft"`
IsPrerelease bool `json:"prerelease"`
// The unique identifier of the release
ID int64 `json:"id"`
// The name of the git tag associated with the release
TagName string `json:"tag_name"`
// The target commitish for the release
Target string `json:"target_commitish"`
// The display title of the release
Title string `json:"name"`
// The release notes or description
Note string `json:"body"`
// The API URL of the release
URL string `json:"url"`
// The HTML URL to view the release
HTMLURL string `json:"html_url"`
// The URL to download the tarball archive
TarURL string `json:"tarball_url"`
// The URL to download the zip archive
ZipURL string `json:"zipball_url"`
// The URL template for uploading release assets
UploadURL string `json:"upload_url"`
// Whether the release is a draft
IsDraft bool `json:"draft"`
// Whether the release is a prerelease
IsPrerelease bool `json:"prerelease"`
// swagger:strfmt date-time
CreatedAt time.Time `json:"created_at"`
// swagger:strfmt date-time
PublishedAt time.Time `json:"published_at"`
Publisher *User `json:"author"`
PublishedAt time.Time `json:"published_at"`
// The user who published the release
Publisher *User `json:"author"`
// The files attached to the release
Attachments []*Attachment `json:"assets"`
}
// CreateReleaseOption options when creating a release
type CreateReleaseOption struct {
// required: true
TagName string `json:"tag_name" binding:"Required"`
TagMessage string `json:"tag_message"`
Target string `json:"target_commitish"`
Title string `json:"name"`
Note string `json:"body"`
IsDraft bool `json:"draft"`
IsPrerelease bool `json:"prerelease"`
TagName string `json:"tag_name" binding:"Required"`
// The message for the git tag
TagMessage string `json:"tag_message"`
// The target commitish for the release
Target string `json:"target_commitish"`
// The display title of the release
Title string `json:"name"`
// The release notes or description
Note string `json:"body"`
// Whether to create the release as a draft
IsDraft bool `json:"draft"`
// Whether to mark the release as a prerelease
IsPrerelease bool `json:"prerelease"`
}
// EditReleaseOption options when editing a release
type EditReleaseOption struct {
TagName string `json:"tag_name"`
Target string `json:"target_commitish"`
Title string `json:"name"`
Note string `json:"body"`
IsDraft *bool `json:"draft"`
IsPrerelease *bool `json:"prerelease"`
// The new name of the git tag
TagName string `json:"tag_name"`
// The new target commitish for the release
Target string `json:"target_commitish"`
// The new display title of the release
Title string `json:"name"`
// The new release notes or description
Note string `json:"body"`
// Whether to change the draft status
IsDraft *bool `json:"draft"`
// Whether to change the prerelease status
IsPrerelease *bool `json:"prerelease"`
}

View File

@ -9,16 +9,26 @@ import (
// ActionTask represents a ActionTask
type ActionTask struct {
ID int64 `json:"id"`
Name string `json:"name"`
HeadBranch string `json:"head_branch"`
HeadSHA string `json:"head_sha"`
RunNumber int64 `json:"run_number"`
Event string `json:"event"`
// ID is the unique identifier for the action task
ID int64 `json:"id"`
// Name is the name of the workflow
Name string `json:"name"`
// HeadBranch is the branch that triggered the workflow
HeadBranch string `json:"head_branch"`
// HeadSHA is the commit SHA that triggered the workflow
HeadSHA string `json:"head_sha"`
// RunNumber is the sequential number of the workflow run
RunNumber int64 `json:"run_number"`
// Event is the type of event that triggered the workflow
Event string `json:"event"`
// DisplayTitle is the display title for the workflow run
DisplayTitle string `json:"display_title"`
Status string `json:"status"`
WorkflowID string `json:"workflow_id"`
URL string `json:"url"`
// Status indicates the current status of the workflow run
Status string `json:"status"`
// WorkflowID is the identifier of the workflow
WorkflowID string `json:"workflow_id"`
// URL is the API URL for this workflow run
URL string `json:"url"`
// swagger:strfmt date-time
CreatedAt time.Time `json:"created_at"`
// swagger:strfmt date-time
@ -29,8 +39,10 @@ type ActionTask struct {
// ActionTaskResponse returns a ActionTask
type ActionTaskResponse struct {
Entries []*ActionTask `json:"workflow_runs"`
TotalCount int64 `json:"total_count"`
// Entries contains the list of workflow runs
Entries []*ActionTask `json:"workflow_runs"`
// TotalCount is the total number of workflow runs
TotalCount int64 `json:"total_count"`
}
// CreateActionWorkflowDispatch represents the payload for triggering a workflow dispatch event
@ -45,17 +57,24 @@ type CreateActionWorkflowDispatch struct {
// ActionWorkflow represents a ActionWorkflow
type ActionWorkflow struct {
ID string `json:"id"`
Name string `json:"name"`
Path string `json:"path"`
// ID is the unique identifier for the workflow
ID string `json:"id"`
// Name is the name of the workflow
Name string `json:"name"`
// Path is the file path of the workflow
Path string `json:"path"`
// State indicates if the workflow is active or disabled
State string `json:"state"`
// swagger:strfmt date-time
CreatedAt time.Time `json:"created_at"`
// swagger:strfmt date-time
UpdatedAt time.Time `json:"updated_at"`
URL string `json:"url"`
HTMLURL string `json:"html_url"`
BadgeURL string `json:"badge_url"`
// URL is the API URL for this workflow
URL string `json:"url"`
// HTMLURL is the web URL for viewing the workflow
HTMLURL string `json:"html_url"`
// BadgeURL is the URL for the workflow badge
BadgeURL string `json:"badge_url"`
// swagger:strfmt date-time
DeletedAt time.Time `json:"deleted_at"`
}

View File

@ -9,22 +9,33 @@ import (
// Branch represents a repository branch
type Branch struct {
Name string `json:"name"`
Commit *PayloadCommit `json:"commit"`
Protected bool `json:"protected"`
RequiredApprovals int64 `json:"required_approvals"`
EnableStatusCheck bool `json:"enable_status_check"`
StatusCheckContexts []string `json:"status_check_contexts"`
UserCanPush bool `json:"user_can_push"`
UserCanMerge bool `json:"user_can_merge"`
EffectiveBranchProtectionName string `json:"effective_branch_protection_name"`
// Name is the branch name
Name string `json:"name"`
// Commit contains the latest commit information for this branch
Commit *PayloadCommit `json:"commit"`
// Protected indicates if the branch is protected
Protected bool `json:"protected"`
// RequiredApprovals is the number of required approvals for pull requests
RequiredApprovals int64 `json:"required_approvals"`
// EnableStatusCheck indicates if status checks are enabled
EnableStatusCheck bool `json:"enable_status_check"`
// StatusCheckContexts contains the list of required status check contexts
StatusCheckContexts []string `json:"status_check_contexts"`
// UserCanPush indicates if the current user can push to this branch
UserCanPush bool `json:"user_can_push"`
// UserCanMerge indicates if the current user can merge to this branch
UserCanMerge bool `json:"user_can_merge"`
// EffectiveBranchProtectionName is the name of the effective branch protection rule
EffectiveBranchProtectionName string `json:"effective_branch_protection_name"`
}
// BranchProtection represents a branch protection for a repository
type BranchProtection struct {
// Deprecated: true
BranchName string `json:"branch_name"`
RuleName string `json:"rule_name"`
BranchName string `json:"branch_name"`
// RuleName is the name of the branch protection rule
RuleName string `json:"rule_name"`
// Priority is the priority of this branch protection rule
Priority int64 `json:"priority"`
EnablePush bool `json:"enable_push"`
EnablePushWhitelist bool `json:"enable_push_whitelist"`

View File

@ -6,12 +6,16 @@ package structs
// AddCollaboratorOption options when adding a user as a collaborator of a repository
type AddCollaboratorOption struct {
// enum: read,write,admin
// Permission level to grant the collaborator
Permission *string `json:"permission"`
}
// RepoCollaboratorPermission to get repository permission for a collaborator
type RepoCollaboratorPermission struct {
// Permission level of the collaborator
Permission string `json:"permission"`
RoleName string `json:"role_name"`
User *User `json:"user"`
// RoleName is the name of the permission role
RoleName string `json:"role_name"`
// User information of the collaborator
User *User `json:"user"`
}

View File

@ -10,64 +10,90 @@ import (
// Identity for a person's identity like an author or committer
type Identity struct {
// Name is the person's name
Name string `json:"name" binding:"MaxSize(100)"`
// swagger:strfmt email
// Email is the person's email address
Email string `json:"email" binding:"MaxSize(254)"`
}
// CommitMeta contains meta information of a commit in terms of API.
type CommitMeta struct {
// URL is the API URL for the commit
URL string `json:"url"`
// SHA is the commit SHA hash
SHA string `json:"sha"`
// swagger:strfmt date-time
// Created is the time when the commit was created
Created time.Time `json:"created"`
}
// CommitUser contains information of a user in the context of a commit.
type CommitUser struct {
Identity
// Date is the commit date in string format
Date string `json:"date"`
}
// RepoCommit contains information of a commit in the context of a repository.
type RepoCommit struct {
URL string `json:"url"`
Author *CommitUser `json:"author"`
Committer *CommitUser `json:"committer"`
Message string `json:"message"`
Tree *CommitMeta `json:"tree"`
// URL is the API URL for the commit
URL string `json:"url"`
// Author contains the commit author information
Author *CommitUser `json:"author"`
// Committer contains the commit committer information
Committer *CommitUser `json:"committer"`
// Message is the commit message
Message string `json:"message"`
// Tree contains the tree information for the commit
Tree *CommitMeta `json:"tree"`
// Verification contains commit signature verification information
Verification *PayloadCommitVerification `json:"verification"`
}
// CommitStats is statistics for a RepoCommit
type CommitStats struct {
Total int `json:"total"`
// Total is the total number of lines changed
Total int `json:"total"`
// Additions is the number of lines added
Additions int `json:"additions"`
// Deletions is the number of lines deleted
Deletions int `json:"deletions"`
}
// Commit contains information generated from a Git commit.
type Commit struct {
*CommitMeta
HTMLURL string `json:"html_url"`
RepoCommit *RepoCommit `json:"commit"`
Author *User `json:"author"`
Committer *User `json:"committer"`
Parents []*CommitMeta `json:"parents"`
Files []*CommitAffectedFiles `json:"files"`
Stats *CommitStats `json:"stats"`
// HTMLURL is the web URL for viewing the commit
HTMLURL string `json:"html_url"`
// RepoCommit contains the commit information
RepoCommit *RepoCommit `json:"commit"`
// Author is the GitHub/Gitea user who authored the commit
Author *User `json:"author"`
// Committer is the GitHub/Gitea user who committed the commit
Committer *User `json:"committer"`
// Parents contains the parent commit information
Parents []*CommitMeta `json:"parents"`
// Files contains information about files affected by the commit
Files []*CommitAffectedFiles `json:"files"`
// Stats contains statistics about the commit changes
Stats *CommitStats `json:"stats"`
}
// CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE
type CommitDateOptions struct {
// swagger:strfmt date-time
// Author is the author date for the commit
Author time.Time `json:"author"`
// swagger:strfmt date-time
// Committer is the committer date for the commit
Committer time.Time `json:"committer"`
}
// CommitAffectedFiles store information about files affected by the commit
type CommitAffectedFiles struct {
// Filename is the path of the affected file
Filename string `json:"filename"`
Status string `json:"status"`
// Status indicates how the file was affected (added, modified, deleted)
Status string `json:"status"`
}

View File

@ -104,83 +104,117 @@ type ApplyDiffPatchFileOptions struct {
// FileLinksResponse contains the links for a repo's file
type FileLinksResponse struct {
Self *string `json:"self"`
GitURL *string `json:"git"`
// Self is the API URL for this file
Self *string `json:"self"`
// GitURL is the Git API URL for this file
GitURL *string `json:"git"`
// HTMLURL is the web URL for this file
HTMLURL *string `json:"html"`
}
type ContentsExtResponse struct {
FileContents *ContentsResponse `json:"file_contents,omitempty"`
DirContents []*ContentsResponse `json:"dir_contents,omitempty"`
// FileContents contains file information when the path represents a file
FileContents *ContentsResponse `json:"file_contents,omitempty"`
// DirContents contains directory listing when the path represents a directory
DirContents []*ContentsResponse `json:"dir_contents,omitempty"`
}
// ContentsResponse contains information about a repo's entry's (dir, file, symlink, submodule) metadata and content
type ContentsResponse struct {
// Name is the file or directory name
Name string `json:"name"`
// Path is the full path to the file or directory
Path string `json:"path"`
SHA string `json:"sha"`
// SHA is the Git blob or tree SHA
SHA string `json:"sha"`
// LastCommitSHA is the SHA of the last commit that affected this file
LastCommitSHA *string `json:"last_commit_sha,omitempty"`
// swagger:strfmt date-time
LastCommitterDate *time.Time `json:"last_committer_date,omitempty"`
// swagger:strfmt date-time
LastAuthorDate *time.Time `json:"last_author_date,omitempty"`
LastCommitMessage *string `json:"last_commit_message,omitempty"`
LastAuthorDate *time.Time `json:"last_author_date,omitempty"`
// LastCommitMessage is the message of the last commit that affected this file
LastCommitMessage *string `json:"last_commit_message,omitempty"`
// `type` will be `file`, `dir`, `symlink`, or `submodule`
Type string `json:"type"`
Size int64 `json:"size"`
// Size is the file size in bytes
Size int64 `json:"size"`
// `encoding` is populated when `type` is `file`, otherwise null
Encoding *string `json:"encoding"`
// `content` is populated when `type` is `file`, otherwise null
Content *string `json:"content"`
// `target` is populated when `type` is `symlink`, otherwise null
Target *string `json:"target"`
URL *string `json:"url"`
HTMLURL *string `json:"html_url"`
GitURL *string `json:"git_url"`
Target *string `json:"target"`
// URL is the API URL for this file or directory
URL *string `json:"url"`
// HTMLURL is the web URL for this file or directory
HTMLURL *string `json:"html_url"`
// GitURL is the Git API URL for this blob or tree
GitURL *string `json:"git_url"`
// DownloadURL is the direct download URL for this file
DownloadURL *string `json:"download_url"`
// `submodule_git_url` is populated when `type` is `submodule`, otherwise null
SubmoduleGitURL *string `json:"submodule_git_url"`
Links *FileLinksResponse `json:"_links"`
SubmoduleGitURL *string `json:"submodule_git_url"`
// Links contains related URLs for this file or directory
Links *FileLinksResponse `json:"_links"`
LfsOid *string `json:"lfs_oid,omitempty"`
LfsSize *int64 `json:"lfs_size,omitempty"`
// LfsOid is the Git LFS object ID if this file is stored in LFS
LfsOid *string `json:"lfs_oid,omitempty"`
// LfsSize is the file size if this file is stored in LFS
LfsSize *int64 `json:"lfs_size,omitempty"`
}
// FileCommitResponse contains information generated from a Git commit for a repo's file.
type FileCommitResponse struct {
CommitMeta
HTMLURL string `json:"html_url"`
Author *CommitUser `json:"author"`
Committer *CommitUser `json:"committer"`
Parents []*CommitMeta `json:"parents"`
Message string `json:"message"`
Tree *CommitMeta `json:"tree"`
// HTMLURL is the web URL for viewing this commit
HTMLURL string `json:"html_url"`
// Author is the commit author information
Author *CommitUser `json:"author"`
// Committer is the commit committer information
Committer *CommitUser `json:"committer"`
// Parents contains parent commit metadata
Parents []*CommitMeta `json:"parents"`
// Message is the commit message
Message string `json:"message"`
// Tree contains the tree metadata for this commit
Tree *CommitMeta `json:"tree"`
}
// FileResponse contains information about a repo's file
type FileResponse struct {
Content *ContentsResponse `json:"content"`
Commit *FileCommitResponse `json:"commit"`
// Content contains the file content and metadata
Content *ContentsResponse `json:"content"`
// Commit contains the commit information for this file operation
Commit *FileCommitResponse `json:"commit"`
// Verification contains the commit signature verification information
Verification *PayloadCommitVerification `json:"verification"`
}
// FilesResponse contains information about multiple files from a repo
type FilesResponse struct {
Files []*ContentsResponse `json:"files"`
Commit *FileCommitResponse `json:"commit"`
// Files contains the list of file contents and metadata
Files []*ContentsResponse `json:"files"`
// Commit contains the commit information for this file operation
Commit *FileCommitResponse `json:"commit"`
// Verification contains the commit signature verification information
Verification *PayloadCommitVerification `json:"verification"`
}
// FileDeleteResponse contains information about a repo's file that was deleted
type FileDeleteResponse struct {
Content any `json:"content"` // to be set to nil
Commit *FileCommitResponse `json:"commit"`
// Content is always null for delete operations
Content any `json:"content"` // to be set to nil
// Commit contains the commit information for this delete operation
Commit *FileCommitResponse `json:"commit"`
// Verification contains the commit signature verification information
Verification *PayloadCommitVerification `json:"verification"`
}
// GetFilesOptions options for retrieving metadate and content of multiple files
type GetFilesOptions struct {
// Files is the list of file paths to retrieve
Files []string `json:"files" binding:"Required"`
}

View File

@ -9,15 +9,24 @@ import (
// DeployKey a deploy key
type DeployKey struct {
ID int64 `json:"id"`
KeyID int64 `json:"key_id"`
Key string `json:"key"`
URL string `json:"url"`
Title string `json:"title"`
// ID is the unique identifier for the deploy key
ID int64 `json:"id"`
// KeyID is the associated public key ID
KeyID int64 `json:"key_id"`
// Key contains the actual SSH key content
Key string `json:"key"`
// URL is the API URL for this deploy key
URL string `json:"url"`
// Title is the human-readable name for the key
Title string `json:"title"`
// Fingerprint is the key's fingerprint
Fingerprint string `json:"fingerprint"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
ReadOnly bool `json:"read_only"`
// Created is the time when the deploy key was added
Created time.Time `json:"created_at"`
// ReadOnly indicates if the key has read-only access
ReadOnly bool `json:"read_only"`
// Repository is the repository this deploy key belongs to
Repository *Repository `json:"repository,omitempty"`
}

View File

@ -5,6 +5,8 @@ package structs
// Note contains information related to a git note
type Note struct {
Message string `json:"message"`
Commit *Commit `json:"commit"`
// The content message of the git note
Message string `json:"message"`
// The commit that this note is attached to
Commit *Commit `json:"commit"`
}

View File

@ -5,14 +5,20 @@ package structs
// Reference represents a Git reference.
type Reference struct {
Ref string `json:"ref"`
URL string `json:"url"`
// The name of the Git reference (e.g., refs/heads/main)
Ref string `json:"ref"`
// The URL to access this Git reference
URL string `json:"url"`
// The Git object that this reference points to
Object *GitObject `json:"object"`
}
// GitObject represents a Git object.
type GitObject struct {
// The type of the Git object (e.g., commit, tag, tree, blob)
Type string `json:"type"`
SHA string `json:"sha"`
URL string `json:"url"`
// The SHA hash of the Git object
SHA string `json:"sha"`
// The URL to access this Git object
URL string `json:"url"`
}

View File

@ -7,62 +7,93 @@ import "time"
// Tag represents a repository tag
type Tag struct {
Name string `json:"name"`
Message string `json:"message"`
ID string `json:"id"`
Commit *CommitMeta `json:"commit"`
ZipballURL string `json:"zipball_url,omitempty"`
TarballURL string `json:"tarball_url,omitempty"`
// The name of the tag
Name string `json:"name"`
// The message associated with the tag
Message string `json:"message"`
// The ID (SHA) of the tag
ID string `json:"id"`
// The commit information associated with this tag
Commit *CommitMeta `json:"commit"`
// The URL to download the zipball archive
ZipballURL string `json:"zipball_url,omitempty"`
// The URL to download the tarball archive
TarballURL string `json:"tarball_url,omitempty"`
}
// AnnotatedTag represents an annotated tag
type AnnotatedTag struct {
Tag string `json:"tag"`
SHA string `json:"sha"`
URL string `json:"url"`
Message string `json:"message"`
Tagger *CommitUser `json:"tagger"`
Object *AnnotatedTagObject `json:"object"`
// The name of the annotated tag
Tag string `json:"tag"`
// The SHA hash of the annotated tag
SHA string `json:"sha"`
// The URL to access the annotated tag
URL string `json:"url"`
// The message associated with the annotated tag
Message string `json:"message"`
// The user who created the annotated tag
Tagger *CommitUser `json:"tagger"`
// The object that the annotated tag points to
Object *AnnotatedTagObject `json:"object"`
// The verification information for the annotated tag
Verification *PayloadCommitVerification `json:"verification"`
}
// AnnotatedTagObject contains meta information of the tag object
type AnnotatedTagObject struct {
// The type of the tagged object (e.g., commit, tree)
Type string `json:"type"`
URL string `json:"url"`
SHA string `json:"sha"`
// The URL to access the tagged object
URL string `json:"url"`
// The SHA hash of the tagged object
SHA string `json:"sha"`
}
// CreateTagOption options when creating a tag
type CreateTagOption struct {
// required: true
// The name of the tag to create
TagName string `json:"tag_name" binding:"Required"`
// The message to associate with the tag
Message string `json:"message"`
Target string `json:"target"`
// The target commit SHA or branch name for the tag
Target string `json:"target"`
}
// TagProtection represents a tag protection
type TagProtection struct {
ID int64 `json:"id"`
NamePattern string `json:"name_pattern"`
// The unique identifier of the tag protection
ID int64 `json:"id"`
// The pattern to match tag names for protection
NamePattern string `json:"name_pattern"`
// List of usernames allowed to create/delete protected tags
WhitelistUsernames []string `json:"whitelist_usernames"`
WhitelistTeams []string `json:"whitelist_teams"`
// List of team names allowed to create/delete protected tags
WhitelistTeams []string `json:"whitelist_teams"`
// swagger:strfmt date-time
// The date and time when the tag protection was created
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
// The date and time when the tag protection was last updated
Updated time.Time `json:"updated_at"`
}
// CreateTagProtectionOption options for creating a tag protection
type CreateTagProtectionOption struct {
NamePattern string `json:"name_pattern"`
// The pattern to match tag names for protection
NamePattern string `json:"name_pattern"`
// List of usernames allowed to create/delete protected tags
WhitelistUsernames []string `json:"whitelist_usernames"`
WhitelistTeams []string `json:"whitelist_teams"`
// List of team names allowed to create/delete protected tags
WhitelistTeams []string `json:"whitelist_teams"`
}
// EditTagProtectionOption options for editing a tag protection
type EditTagProtectionOption struct {
NamePattern *string `json:"name_pattern"`
// The pattern to match tag names for protection
NamePattern *string `json:"name_pattern"`
// List of usernames allowed to create/delete protected tags
WhitelistUsernames []string `json:"whitelist_usernames"`
WhitelistTeams []string `json:"whitelist_teams"`
// List of team names allowed to create/delete protected tags
WhitelistTeams []string `json:"whitelist_teams"`
}

View File

@ -9,15 +9,21 @@ import (
// TopicResponse for returning topics
type TopicResponse struct {
ID int64 `json:"id"`
Name string `json:"topic_name"`
RepoCount int `json:"repo_count"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
// The unique identifier of the topic
ID int64 `json:"id"`
// The name of the topic
Name string `json:"topic_name"`
// The number of repositories using this topic
RepoCount int `json:"repo_count"`
// The date and time when the topic was created
Created time.Time `json:"created"`
// The date and time when the topic was last updated
Updated time.Time `json:"updated"`
}
// TopicName a list of repo topic names
type TopicName struct {
// List of topic names
TopicNames []string `json:"topics"`
}

View File

@ -5,20 +5,32 @@ package structs
// GitEntry represents a git tree
type GitEntry struct {
// Path is the file or directory path
Path string `json:"path"`
// Mode is the file mode (permissions)
Mode string `json:"mode"`
// Type indicates if this is a file, directory, or symlink
Type string `json:"type"`
Size int64 `json:"size"`
SHA string `json:"sha"`
URL string `json:"url"`
// Size is the file size in bytes
Size int64 `json:"size"`
// SHA is the Git object SHA
SHA string `json:"sha"`
// URL is the API URL for this tree entry
URL string `json:"url"`
}
// GitTreeResponse returns a git tree
type GitTreeResponse struct {
SHA string `json:"sha"`
URL string `json:"url"`
Entries []GitEntry `json:"tree"`
Truncated bool `json:"truncated"`
Page int `json:"page"`
TotalCount int `json:"total_count"`
// SHA is the tree object SHA
SHA string `json:"sha"`
// URL is the API URL for this tree
URL string `json:"url"`
// Entries contains the tree entries (files and directories)
Entries []GitEntry `json:"tree"`
// Truncated indicates if the response was truncated due to size
Truncated bool `json:"truncated"`
// Page is the current page number for pagination
Page int `json:"page"`
// TotalCount is the total number of entries in the tree
TotalCount int `json:"total_count"`
}

View File

@ -9,10 +9,16 @@ import (
// WatchInfo represents an API watch status of one repository
type WatchInfo struct {
Subscribed bool `json:"subscribed"`
Ignored bool `json:"ignored"`
Reason any `json:"reason"`
CreatedAt time.Time `json:"created_at"`
URL string `json:"url"`
RepositoryURL string `json:"repository_url"`
// Whether the repository is being watched for notifications
Subscribed bool `json:"subscribed"`
// Whether notifications for the repository are ignored
Ignored bool `json:"ignored"`
// The reason for the current watch status
Reason any `json:"reason"`
// The timestamp when the watch status was created
CreatedAt time.Time `json:"created_at"`
// The URL for managing the watch status
URL string `json:"url"`
// The URL of the repository being watched
RepositoryURL string `json:"repository_url"`
}

View File

@ -5,10 +5,14 @@ package structs
// WikiCommit page commit/revision
type WikiCommit struct {
ID string `json:"sha"`
Author *CommitUser `json:"author"`
// The commit SHA hash
ID string `json:"sha"`
// The author of the commit
Author *CommitUser `json:"author"`
// The committer of the commit
Committer *CommitUser `json:"commiter"`
Message string `json:"message"`
// The commit message
Message string `json:"message"`
}
// WikiPage a wiki page
@ -16,16 +20,23 @@ type WikiPage struct {
*WikiPageMetaData
// Page content, base64 encoded
ContentBase64 string `json:"content_base64"`
CommitCount int64 `json:"commit_count"`
Sidebar string `json:"sidebar"`
Footer string `json:"footer"`
// The number of commits that modified this page
CommitCount int64 `json:"commit_count"`
// The sidebar content for the wiki page
Sidebar string `json:"sidebar"`
// The footer content for the wiki page
Footer string `json:"footer"`
}
// WikiPageMetaData wiki page meta information
type WikiPageMetaData struct {
Title string `json:"title"`
HTMLURL string `json:"html_url"`
SubURL string `json:"sub_url"`
// The title of the wiki page
Title string `json:"title"`
// The HTML URL to view the wiki page
HTMLURL string `json:"html_url"`
// The sub URL path for the wiki page
SubURL string `json:"sub_url"`
// The last commit that modified this wiki page
LastCommit *WikiCommit `json:"last_commit"`
}
@ -41,6 +52,8 @@ type CreateWikiPageOptions struct {
// WikiCommitList commit/revision list
type WikiCommitList struct {
// The list of wiki commits
WikiCommits []*WikiCommit `json:"commits"`
Count int64 `json:"count"`
// The total count of commits
Count int64 `json:"count"`
}

View File

@ -5,34 +5,52 @@ package structs
// GeneralRepoSettings contains global repository settings exposed by API
type GeneralRepoSettings struct {
MirrorsDisabled bool `json:"mirrors_disabled"`
HTTPGitDisabled bool `json:"http_git_disabled"`
MigrationsDisabled bool `json:"migrations_disabled"`
StarsDisabled bool `json:"stars_disabled"`
// MirrorsDisabled indicates if repository mirroring is disabled
MirrorsDisabled bool `json:"mirrors_disabled"`
// HTTPGitDisabled indicates if HTTP Git operations are disabled
HTTPGitDisabled bool `json:"http_git_disabled"`
// MigrationsDisabled indicates if repository migrations are disabled
MigrationsDisabled bool `json:"migrations_disabled"`
// StarsDisabled indicates if repository starring is disabled
StarsDisabled bool `json:"stars_disabled"`
// TimeTrackingDisabled indicates if time tracking is disabled
TimeTrackingDisabled bool `json:"time_tracking_disabled"`
LFSDisabled bool `json:"lfs_disabled"`
// LFSDisabled indicates if Git LFS support is disabled
LFSDisabled bool `json:"lfs_disabled"`
}
// GeneralUISettings contains global ui settings exposed by API
type GeneralUISettings struct {
DefaultTheme string `json:"default_theme"`
// DefaultTheme is the default UI theme
DefaultTheme string `json:"default_theme"`
// AllowedReactions contains the list of allowed emoji reactions
AllowedReactions []string `json:"allowed_reactions"`
CustomEmojis []string `json:"custom_emojis"`
// CustomEmojis contains the list of custom emojis
CustomEmojis []string `json:"custom_emojis"`
}
// GeneralAPISettings contains global api settings exposed by it
type GeneralAPISettings struct {
MaxResponseItems int `json:"max_response_items"`
DefaultPagingNum int `json:"default_paging_num"`
DefaultGitTreesPerPage int `json:"default_git_trees_per_page"`
DefaultMaxBlobSize int64 `json:"default_max_blob_size"`
// MaxResponseItems is the maximum number of items returned in API responses
MaxResponseItems int `json:"max_response_items"`
// DefaultPagingNum is the default number of items per page
DefaultPagingNum int `json:"default_paging_num"`
// DefaultGitTreesPerPage is the default number of Git tree items per page
DefaultGitTreesPerPage int `json:"default_git_trees_per_page"`
// DefaultMaxBlobSize is the default maximum blob size for API responses
DefaultMaxBlobSize int64 `json:"default_max_blob_size"`
// DefaultMaxResponseSize is the default maximum response size
DefaultMaxResponseSize int64 `json:"default_max_response_size"`
}
// GeneralAttachmentSettings contains global Attachment settings exposed by API
type GeneralAttachmentSettings struct {
Enabled bool `json:"enabled"`
// Enabled indicates if file attachments are enabled
Enabled bool `json:"enabled"`
// AllowedTypes contains the allowed file types for attachments
AllowedTypes string `json:"allowed_types"`
MaxSize int64 `json:"max_size"`
MaxFiles int `json:"max_files"`
// MaxSize is the maximum size for individual attachments
MaxSize int64 `json:"max_size"`
// MaxFiles is the maximum number of files per attachment
MaxFiles int `json:"max_files"`
}

View File

@ -11,13 +11,20 @@ import (
// CommitStatus holds a single status of a single Commit
type CommitStatus struct {
ID int64 `json:"id"`
State commitstatus.CommitStatusState `json:"status"`
TargetURL string `json:"target_url"`
Description string `json:"description"`
URL string `json:"url"`
Context string `json:"context"`
Creator *User `json:"creator"`
// ID is the unique identifier for the commit status
ID int64 `json:"id"`
// State represents the status state (pending, success, error, failure)
State commitstatus.CommitStatusState `json:"status"`
// TargetURL is the URL to link to for more details
TargetURL string `json:"target_url"`
// Description provides a brief description of the status
Description string `json:"description"`
// URL is the API URL for this status
URL string `json:"url"`
// Context is the unique context identifier for the status
Context string `json:"context"`
// Creator is the user who created the status
Creator *User `json:"creator"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
@ -26,19 +33,30 @@ type CommitStatus struct {
// CombinedStatus holds the combined state of several statuses for a single commit
type CombinedStatus struct {
State commitstatus.CommitStatusState `json:"state"`
SHA string `json:"sha"`
TotalCount int `json:"total_count"`
Statuses []*CommitStatus `json:"statuses"`
Repository *Repository `json:"repository"`
CommitURL string `json:"commit_url"`
URL string `json:"url"`
// State is the overall combined status state
State commitstatus.CommitStatusState `json:"state"`
// SHA is the commit SHA this status applies to
SHA string `json:"sha"`
// TotalCount is the total number of statuses
TotalCount int `json:"total_count"`
// Statuses contains all individual commit statuses
Statuses []*CommitStatus `json:"statuses"`
// Repository is the repository this status belongs to
Repository *Repository `json:"repository"`
// CommitURL is the API URL for the commit
CommitURL string `json:"commit_url"`
// URL is the API URL for this combined status
URL string `json:"url"`
}
// CreateStatusOption holds the information needed to create a new CommitStatus for a Commit
type CreateStatusOption struct {
State commitstatus.CommitStatusState `json:"state"`
TargetURL string `json:"target_url"`
Description string `json:"description"`
Context string `json:"context"`
// State represents the status state to set (pending, success, error, failure)
State commitstatus.CommitStatusState `json:"state"`
// TargetURL is the URL to link to for more details
TargetURL string `json:"target_url"`
// Description provides a brief description of the status
Description string `json:"description"`
// Context is the unique context identifier for the status
Context string `json:"context"`
}

View File

@ -11,13 +11,20 @@ import (
// AccessToken represents an API access token.
// swagger:response AccessToken
type AccessToken struct {
ID int64 `json:"id"`
Name string `json:"name"`
Token string `json:"sha1"`
TokenLastEight string `json:"token_last_eight"`
Scopes []string `json:"scopes"`
Created time.Time `json:"created_at"`
Updated time.Time `json:"last_used_at"`
// The unique identifier of the access token
ID int64 `json:"id"`
// The name of the access token
Name string `json:"name"`
// The SHA1 hash of the access token
Token string `json:"sha1"`
// The last eight characters of the token
TokenLastEight string `json:"token_last_eight"`
// The scopes granted to this access token
Scopes []string `json:"scopes"`
// The timestamp when the token was created
Created time.Time `json:"created_at"`
// The timestamp when the token was last used
Updated time.Time `json:"last_used_at"`
}
// AccessTokenList represents a list of API access token.
@ -35,23 +42,35 @@ type CreateAccessTokenOption struct {
// CreateOAuth2ApplicationOptions holds options to create an oauth2 application
type CreateOAuth2ApplicationOptions struct {
Name string `json:"name" binding:"Required"`
ConfidentialClient bool `json:"confidential_client"`
SkipSecondaryAuthorization bool `json:"skip_secondary_authorization"`
RedirectURIs []string `json:"redirect_uris" binding:"Required"`
// The name of the OAuth2 application
Name string `json:"name" binding:"Required"`
// Whether the client is confidential
ConfidentialClient bool `json:"confidential_client"`
// Whether to skip secondary authorization
SkipSecondaryAuthorization bool `json:"skip_secondary_authorization"`
// The list of allowed redirect URIs
RedirectURIs []string `json:"redirect_uris" binding:"Required"`
}
// OAuth2Application represents an OAuth2 application.
// swagger:response OAuth2Application
type OAuth2Application struct {
ID int64 `json:"id"`
Name string `json:"name"`
ClientID string `json:"client_id"`
ClientSecret string `json:"client_secret"`
ConfidentialClient bool `json:"confidential_client"`
SkipSecondaryAuthorization bool `json:"skip_secondary_authorization"`
RedirectURIs []string `json:"redirect_uris"`
Created time.Time `json:"created"`
// The unique identifier of the OAuth2 application
ID int64 `json:"id"`
// The name of the OAuth2 application
Name string `json:"name"`
// The client ID of the OAuth2 application
ClientID string `json:"client_id"`
// The client secret of the OAuth2 application
ClientSecret string `json:"client_secret"`
// Whether the client is confidential
ConfidentialClient bool `json:"confidential_client"`
// Whether to skip secondary authorization
SkipSecondaryAuthorization bool `json:"skip_secondary_authorization"`
// The list of allowed redirect URIs
RedirectURIs []string `json:"redirect_uris"`
// The timestamp when the application was created
Created time.Time `json:"created"`
}
// OAuth2ApplicationList represents a list of OAuth2 applications.

View File

@ -7,10 +7,14 @@ package structs
// Email an email address belonging to a user
type Email struct {
// swagger:strfmt email
Email string `json:"email"`
Verified bool `json:"verified"`
Primary bool `json:"primary"`
UserID int64 `json:"user_id"`
// The email address
Email string `json:"email"`
// Whether the email address has been verified
Verified bool `json:"verified"`
// Whether this is the primary email address
Primary bool `json:"primary"`
// The unique identifier of the user who owns this email
UserID int64 `json:"user_id"`
// username of the user
UserName string `json:"username"`
}

View File

@ -9,28 +9,43 @@ import (
// GPGKey a user GPG key to sign commit and tag in repository
type GPGKey struct {
ID int64 `json:"id"`
PrimaryKeyID string `json:"primary_key_id"`
KeyID string `json:"key_id"`
PublicKey string `json:"public_key"`
Emails []*GPGKeyEmail `json:"emails"`
SubsKey []*GPGKey `json:"subkeys"`
CanSign bool `json:"can_sign"`
CanEncryptComms bool `json:"can_encrypt_comms"`
CanEncryptStorage bool `json:"can_encrypt_storage"`
CanCertify bool `json:"can_certify"`
Verified bool `json:"verified"`
// The unique identifier of the GPG key
ID int64 `json:"id"`
// The primary key ID of the GPG key
PrimaryKeyID string `json:"primary_key_id"`
// The key ID of the GPG key
KeyID string `json:"key_id"`
// The public key content in armored format
PublicKey string `json:"public_key"`
// List of email addresses associated with this GPG key
Emails []*GPGKeyEmail `json:"emails"`
// List of subkeys of this GPG key
SubsKey []*GPGKey `json:"subkeys"`
// Whether the key can be used for signing
CanSign bool `json:"can_sign"`
// Whether the key can be used for encrypting communications
CanEncryptComms bool `json:"can_encrypt_comms"`
// Whether the key can be used for encrypting storage
CanEncryptStorage bool `json:"can_encrypt_storage"`
// Whether the key can be used for certification
CanCertify bool `json:"can_certify"`
// Whether the GPG key has been verified
Verified bool `json:"verified"`
// swagger:strfmt date-time
// The date and time when the GPG key was created
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
// The date and time when the GPG key expires
Expires time.Time `json:"expires_at"`
}
// GPGKeyEmail an email attached to a GPGKey
// swagger:model GPGKeyEmail
type GPGKeyEmail struct {
Email string `json:"email"`
Verified bool `json:"verified"`
// The email address associated with the GPG key
Email string `json:"email"`
// Whether the email address has been verified
Verified bool `json:"verified"`
}
// CreateGPGKeyOption options create user GPG key
@ -40,7 +55,8 @@ type CreateGPGKeyOption struct {
// required: true
// unique: true
ArmoredKey string `json:"armored_public_key" binding:"Required"`
Signature string `json:"armored_signature,omitempty"`
// An optional armored signature for the GPG key
Signature string `json:"armored_signature,omitempty"`
}
// VerifyGPGKeyOption options verifies user GPG key
@ -48,6 +64,8 @@ type VerifyGPGKeyOption struct {
// An Signature for a GPG key token
//
// required: true
KeyID string `json:"key_id" binding:"Required"`
// The key ID of the GPG key to verify
KeyID string `json:"key_id" binding:"Required"`
// The armored signature to verify the GPG key
Signature string `json:"armored_signature" binding:"Required"`
}

View File

@ -9,15 +9,25 @@ import (
// PublicKey publickey is a user key to push code to repository
type PublicKey struct {
ID int64 `json:"id"`
Key string `json:"key"`
URL string `json:"url,omitempty"`
Title string `json:"title,omitempty"`
// ID is the unique identifier for the public key
ID int64 `json:"id"`
// Key contains the actual SSH public key content
Key string `json:"key"`
// URL is the API URL for this key
URL string `json:"url,omitempty"`
// Title is the human-readable name for the key
Title string `json:"title,omitempty"`
// Fingerprint is the key's fingerprint
Fingerprint string `json:"fingerprint,omitempty"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
Updated time.Time `json:"last_used_at"`
Owner *User `json:"user,omitempty"`
ReadOnly bool `json:"read_only,omitempty"`
KeyType string `json:"key_type,omitempty"`
// Created is the time when the key was added
Created time.Time `json:"created_at"`
// Updated is the time when the key was last used
Updated time.Time `json:"last_used_at"`
// Owner is the user who owns this key
Owner *User `json:"user,omitempty"`
// ReadOnly indicates if the key has read-only access
ReadOnly bool `json:"read_only,omitempty"`
// KeyType indicates the type of the SSH key
KeyType string `json:"key_type,omitempty"`
}

View File

@ -496,6 +496,7 @@ repo.transfer.to_you=vám
repo.collaborator.added.subject=%s vás přidal do %s
repo.collaborator.added.text=Byl jste přidán jako spolupracovník repozitáře:
team_invite.subject=%[1]s vás pozval/a, abyste se připojili k organizaci %[2]s
team_invite.text_1=%[1]s vás pozval/a do týmu %[2]s v organizaci %[3]s.
team_invite.text_2=Pro připojení k týmu klikněte na následující odkaz:

View File

@ -509,6 +509,7 @@ repo.transfer.to_you=dir
repo.collaborator.added.subject=%s hat dich zu %s hinzugefügt
repo.collaborator.added.text=Du wurdest als Mitarbeiter für folgendes Repository hinzugefügt:
team_invite.subject=%[1]s hat dich eingeladen, der Organisation %[2]s beizutreten
team_invite.text_1=%[1]s hat dich eingeladen, dem Team %[2]s in der Organisation %[3]s beizutreten.
team_invite.text_2=Bitte klicke auf den folgenden Link, um dem Team beizutreten:

View File

@ -451,6 +451,7 @@ repo.transfer.to_you=εσάς
repo.collaborator.added.subject=%s σας πρόσθεσε στο %s
repo.collaborator.added.text=Έχετε προστεθεί ως συνεργάτης του αποθετηρίου:
team_invite.subject=%[1]s σας προσκάλεσε να συμμετέχετε στον οργανισμό %[2]s
team_invite.text_1=%[1]s σας προσκάλεσε να συμμετέχετε στην ομάδα %[2]s στον οργανισμός %[3]s.
team_invite.text_2=Παρακαλώ κάντε κλικ στον παρακάτω σύνδεσμο για να συμμετάσχετε στην ομάδα:

View File

@ -448,6 +448,7 @@ repo.transfer.to_you=usted
repo.collaborator.added.subject=%s le añadió en %s
repo.collaborator.added.text=Has sido añadido como colaborador del repositorio:
team_invite.subject=%[1]s le ha invitado a unirse a la organización de %[2]s
team_invite.text_1=%[1]s le ha invitado a unirse al equipo %[2]s en la organización %[3]s.
team_invite.text_2=Por favor, haz clic en el siguiente enlace para unirte al equipo:

View File

@ -363,6 +363,7 @@ repo.collaborator.added.subject=%s شما را به پروژه %s اضافه ک
repo.collaborator.added.text=شما به عنوان مشارکت‌کننده در این مخزن اضافه شدید:
[modal]
yes=بله
no=خیر

View File

@ -348,6 +348,7 @@ repo.transfer.to_you=sinä
[modal]
yes=Kyllä
no=Ei

View File

@ -550,6 +550,7 @@ repo.transfer.body=Pour laccepter ou le rejeter, visitez %s ou ignorez-le.
repo.collaborator.added.subject=%s vous a ajouté à %s
repo.collaborator.added.text=Vous avez été ajouté en tant que collaborateur du dépôt :
team_invite.subject=%[1]s vous a invité à rejoindre lorganisation %[2]s
team_invite.text_1=%[1]s vous a invité à rejoindre léquipe %[2]s dans lorganisation %[3]s.
team_invite.text_2=Veuillez cliquer sur le lien suivant pour rejoindre l'équipe :

View File

@ -551,6 +551,7 @@ repo.transfer.body=Chun glacadh leis nó diúltú dó, tabhair cuairt ar %s nó
repo.collaborator.added.subject=Chuir %s le %s tú
repo.collaborator.added.text=Cuireadh tú leis mar chomhoibritheoir stórais:
team_invite.subject=Tá cuireadh tugtha agat ag %[1]s chun dul le heagraíocht %[2]s
team_invite.text_1=Tá cuireadh tugtha ag %[1]s duit chun dul le foireann %[2]s in eagraíocht %[3]s.
team_invite.text_2=Cliceáil ar an nasc seo a leanas le do thoil chun dul isteach san fhoireann:

View File

@ -294,6 +294,7 @@ register_success=Sikeres regisztráció
[modal]
yes=Igen
no=Nem

View File

@ -302,6 +302,7 @@ register_success=Pendaftaran berhasil
[modal]
yes=Ya
no=Tidak

View File

@ -326,6 +326,7 @@ repo.collaborator.added.subject=%s bætti þér við í %s
repo.collaborator.added.text=Þér hefur verið bætt við sem aðila hugbúnaðarsafns:
[modal]
yes=
no=Nei

View File

@ -386,6 +386,7 @@ repo.collaborator.added.subject=%s ti ha aggiunto a %s
repo.collaborator.added.text=Sei stato aggiunto come collaboratore del repository:
[modal]
yes=
no=No

View File

@ -551,6 +551,7 @@ repo.transfer.body=承認または拒否するには %s を開きます。 も
repo.collaborator.added.subject=%s が %s にあなたを追加しました
repo.collaborator.added.text=あなたは次のリポジトリの共同作業者に追加されました:
team_invite.subject=%[1]s さんが %[2]s への参加にあなたを招待しました
team_invite.text_1=%[1]s さんが、組織 %[3]s 内のチーム %[2]s への参加に、あなたを招待しました。
team_invite.text_2=下のリンクをクリックしてチームに参加してください。

View File

@ -278,6 +278,7 @@ register_success=등록 완료
[modal]
yes=
no=아니오

View File

@ -454,6 +454,7 @@ repo.transfer.to_you=Jums
repo.collaborator.added.subject=%s pievienoja Jūs repozitorijam %s
repo.collaborator.added.text=Jūs tikāt pievienots kā līdzstrādnieks repozitorijam:
team_invite.subject=%[1]s uzaicināja Jūs pievienoties organizācijai %[2]s
team_invite.text_1=%[1]s uzaicināja Jūs pievienoties komandai %[2]s organizācijā %[3]s.
team_invite.text_2=Uzspiediet uz šīs saites, lai pievienoties komandai:

View File

@ -385,6 +385,7 @@ repo.collaborator.added.subject=%s heeft jou toegevoegd aan %s
repo.collaborator.added.text=U bent toegevoegd als een medewerker van de repository:
[modal]
yes=Ja
no=Nee

View File

@ -372,6 +372,7 @@ repo.collaborator.added.subject=%s dodał Cię do %s
repo.collaborator.added.text=Zostałeś dodany jako współtwórca repozytorium:
[modal]
yes=Tak
no=Nie

View File

@ -540,6 +540,7 @@ repo.transfer.body=Para o aceitar ou rejeitar visite %s, ou simplesmente o ignor
repo.collaborator.added.subject=%s adicionou você a %s
repo.collaborator.added.text=Você foi adicionado como um colaborador do repositório:
team_invite.subject=%[1]s convidou você para participar da organização %[2]s
team_invite.text_1=%[1]s convidou você para participar da equipe %[2]s na organização %[3]s.
team_invite.text_2=Por favor, clique no seguinte link para se juntar à equipe:

View File

@ -551,6 +551,14 @@ repo.transfer.body=Para o aceitar ou rejeitar, visite %s ou ignore-o, simplesmen
repo.collaborator.added.subject=%s adicionou você a %s
repo.collaborator.added.text=Foi adicionado(a) como colaborador(a) do repositório:
repo.actions.run.failed=A execução falhou
repo.actions.run.succeeded=A execução foi bem sucedida
repo.actions.run.cancelled=A execução foi cancelada
repo.actions.jobs.all_succeeded=Todos os trabalhos foram bem sucedidos
repo.actions.jobs.all_failed=Todos os trabalhos falharam
repo.actions.jobs.some_not_successful=Alguns trabalhos não foram bem sucedidos
repo.actions.jobs.all_cancelled=Todos os trabalhos foram cancelados
team_invite.subject=%[1]s fez-lhe um convite para se juntar à organização %[2]s
team_invite.text_1=%[1]s fez-lhe um convite para se juntar à equipa %[2]s na organização %[3]s.
team_invite.text_2=Clique na ligação seguinte para se juntar à equipa:

View File

@ -449,6 +449,7 @@ repo.transfer.to_you=вам
repo.collaborator.added.subject=%s добавил(а) вас в %s
repo.collaborator.added.text=Вы были добавлены в качестве соавтора репозитория:
team_invite.subject=%[1]s приглашает вас присоединиться к организации %[2]s
team_invite.text_1=%[1]s приглашает вас присоединиться к команде %[2]s в организации %[3]s.
team_invite.text_2=Перейдите по ссылке, чтобы присоединиться к команде:

View File

@ -355,6 +355,7 @@ repo.collaborator.added.subject=%s ඔබව %s ට එකතු කළා
repo.collaborator.added.text=ඔබ ගබඩාවේ සහයෝගිතාකරුවෙකු ලෙස එකතු කර ඇත:
[modal]
yes=ඔව්
no=නැහැ

View File

@ -436,6 +436,7 @@ repo.transfer.to_you=vy
repo.collaborator.added.subject=%s vás pridal do %s
repo.collaborator.added.text=Boli ste pridaný ako spolupracovník repozitára:
team_invite.subject=%[1]s vás pozval/a, aby ste sa pripojili k organizácii %[2]s
team_invite.text_1=%[1]s vás pozval/a, aby ste sa pripojili k tímu %[2]s v organizácii %[3]s.
team_invite.text_2=Ak sa chcete pripojiť k tímu, kliknite na nasledujúci odkaz:

View File

@ -303,6 +303,7 @@ register_success=Registreringen lyckades
[modal]
yes=Ja
no=Nej

View File

@ -533,6 +533,7 @@ repo.transfer.to_you=siz
repo.collaborator.added.subject=%s sizi %s ekledi
repo.collaborator.added.text=Bu depo için katkıcı olarak eklendiniz:
team_invite.subject=%[1]s sizi %[2]s organizasyonuna katılmaya davet etti
team_invite.text_1=%[1]s sizi %[3]s organizasyonundaki %[2]s takımına katılmaya davet etti.
team_invite.text_2=Takıma katılmak lütfen aşağıdaki bağlantıya tıklayın:

View File

@ -503,6 +503,7 @@ repo.transfer.to_you=вам
repo.collaborator.added.subject=%s додав вас до %s
repo.collaborator.added.text=Вас додали як співавтора до сховища:
team_invite.subject=%[1]s запрошує вас приєднатися до організації %[2]s
team_invite.text_1=%[1]s запрошує вас до команди %[2]s в організації %[3]s.
team_invite.text_2=Перейдіть за посиланням, щоб приєднатися до команди:

View File

@ -551,6 +551,7 @@ repo.transfer.body=访问 %s 以接受或拒绝转移,亦可忽略此邮件。
repo.collaborator.added.subject=%s 把您添加到 %s
repo.collaborator.added.text=您已被添加为仓库的协作者:
team_invite.subject=%[1]s 邀请您加入组织 %[2]s
team_invite.text_1=%[1]s 邀请您加入组织 %[3]s 中的团队 %[2]s。
team_invite.text_2=请点击下面的链接加入团队:

View File

@ -158,6 +158,7 @@ register_success=註冊成功
[modal]
yes=確認操作
no=取消操作

View File

@ -494,6 +494,7 @@ repo.transfer.to_you=您
repo.collaborator.added.subject=%s 把您加入到 %s
repo.collaborator.added.text=您已被新增為儲存庫的協作者:
team_invite.subject=%[1]s 邀請您加入組織 %[2]s
team_invite.text_1=%[1]s 邀請您加入組織 %[3]s 中的 %[2]s 團隊
team_invite.text_2=請點擊下方連結加入團隊:

View File

@ -2,8 +2,8 @@
"type": "module",
"packageManager": "pnpm@10.0.0",
"engines": {
"node": ">= 20.0.0",
"pnpm": ">=10.0.0"
"node": ">= 22.18.0",
"pnpm": ">= 10.0.0"
},
"dependencies": {
"@citation-js/core": "0.7.18",
@ -15,6 +15,7 @@
"@github/text-expander-element": "2.9.2",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
"@primer/octicons": "19.15.5",
"@resvg/resvg-wasm": "2.6.2",
"@silverwind/vue3-calendar-heatmap": "2.0.6",
"@techknowlogick/license-checker-webpack-plugin": "0.3.0",
"add-asset-webpack-plugin": "3.0.0",
@ -30,7 +31,6 @@
"dropzone": "6.0.0-beta.2",
"easymde": "2.20.0",
"esbuild-loader": "4.3.0",
"fast-glob": "3.3.3",
"htmx.org": "2.0.6",
"idiomorph": "0.7.3",
"jquery": "3.7.1",
@ -109,7 +109,6 @@
"stylelint-config-recommended": "17.0.0",
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
"stylelint-declaration-strict-value": "1.10.11",
"stylelint-define-config": "16.22.0",
"stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "4.0.0",
"type-fest": "4.41.0",

View File

@ -35,6 +35,9 @@ importers:
'@primer/octicons':
specifier: 19.15.5
version: 19.15.5
'@resvg/resvg-wasm':
specifier: 2.6.2
version: 2.6.2
'@silverwind/vue3-calendar-heatmap':
specifier: 2.0.6
version: 2.0.6(tippy.js@6.3.7)(vue@3.5.18(typescript@5.8.3))
@ -80,9 +83,6 @@ importers:
esbuild-loader:
specifier: 4.3.0
version: 4.3.0(webpack@5.101.0)
fast-glob:
specifier: 3.3.3
version: 3.3.3
htmx.org:
specifier: 2.0.6
version: 2.0.6
@ -312,9 +312,6 @@ importers:
stylelint-declaration-strict-value:
specifier: 1.10.11
version: 1.10.11(stylelint@16.23.1(typescript@5.8.3))
stylelint-define-config:
specifier: 16.22.0
version: 16.22.0(stylelint@16.23.1(typescript@5.8.3))
stylelint-value-no-unknown-custom-properties:
specifier: 6.0.1
version: 6.0.1(stylelint@16.23.1(typescript@5.8.3))
@ -797,6 +794,10 @@ packages:
'@primer/octicons@19.15.5':
resolution: {integrity: sha512-FCXPTlXlHvAS3rRBd1C/xVBYSYzPPwS8tNcUxnvUYK6L4/d+zUy2KExLtzW+L9xKo2z8J9uY+c1VCsNRf+b4MQ==}
'@resvg/resvg-wasm@2.6.2':
resolution: {integrity: sha512-FqALmHI8D4o6lk/LRWDnhw95z5eO+eAa6ORjVg09YRR7BkcM6oPHU9uyC0gtQG5vpFLvgpeU4+zEAz2H8APHNw==}
engines: {node: '>= 10'}
'@rolldown/pluginutils@1.0.0-beta.29':
resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==}
@ -4511,12 +4512,6 @@ packages:
peerDependencies:
stylelint: '>=7 <=16'
stylelint-define-config@16.22.0:
resolution: {integrity: sha512-EEgHRugsryKo7LpenYyd4yLoZon3lHvRAi7WsMaZoRX9GPOkeDXrMga+N4VA4nK4Zus02EQwyYkndNQ64jaB2A==}
engines: {node: '>=18.0.0', npm: '>=9.0.0', pnpm: '>=8.6.0'}
peerDependencies:
stylelint: '>=16.0.0'
stylelint-value-no-unknown-custom-properties@6.0.1:
resolution: {integrity: sha512-N60PTdaTknB35j6D4FhW0GL2LlBRV++bRpXMMldWMQZ240yFQaoltzlLY4lXXs7Z0J5mNUYZQ/gjyVtU2DhCMA==}
engines: {node: '>=18.12.0'}
@ -5481,6 +5476,8 @@ snapshots:
dependencies:
object-assign: 4.1.1
'@resvg/resvg-wasm@2.6.2': {}
'@rolldown/pluginutils@1.0.0-beta.29': {}
'@rollup/plugin-commonjs@22.0.2(rollup@2.79.2)':
@ -9723,11 +9720,6 @@ snapshots:
dependencies:
stylelint: 16.23.1(typescript@5.8.3)
stylelint-define-config@16.22.0(stylelint@16.23.1(typescript@5.8.3)):
dependencies:
csstype: 3.1.3
stylelint: 16.23.1(typescript@5.8.3)
stylelint-value-no-unknown-custom-properties@6.0.1(stylelint@16.23.1(typescript@5.8.3)):
dependencies:
postcss-value-parser: 4.2.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -57,7 +57,7 @@ type (
DiscordPayload struct {
Wait bool `json:"wait"`
Content string `json:"content"`
Username string `json:"username"`
Username string `json:"username,omitempty"`
AvatarURL string `json:"avatar_url,omitempty"`
TTS bool `json:"tts"`
Embeds []DiscordEmbed `json:"embeds"`

View File

@ -1,6 +1,5 @@
// @ts-check
import {defineConfig} from 'stylelint-define-config';
import {fileURLToPath} from 'node:url';
import type {Config} from 'stylelint';
const cssVarFiles = [
fileURLToPath(new URL('web_src/css/base.css', import.meta.url)),
@ -8,7 +7,7 @@ const cssVarFiles = [
fileURLToPath(new URL('web_src/css/themes/theme-gitea-dark.css', import.meta.url)),
];
export default defineConfig({
export default {
extends: 'stylelint-config-recommended',
reportUnscopedDisables: true,
reportNeedlessDisables: true,
@ -124,7 +123,6 @@ export default defineConfig({
'csstools/value-no-unknown-custom-properties': [true, {importFrom: cssVarFiles}],
'declaration-block-no-duplicate-properties': [true, {ignore: ['consecutive-duplicates-with-different-values']}],
'declaration-block-no-redundant-longhand-properties': [true, {ignoreShorthands: ['flex-flow', 'overflow', 'grid-template']}],
// @ts-expect-error - https://github.com/stylelint-types/stylelint-define-config/issues/1
'declaration-property-unit-disallowed-list': {'line-height': ['em']},
'declaration-property-value-disallowed-list': {'word-break': ['break-word']},
'font-family-name-quotes': 'always-where-recommended',
@ -148,4 +146,4 @@ export default defineConfig({
'shorthand-property-no-redundant-values': true,
'value-no-vendor-prefix': [true, {ignoreValues: ['box', 'inline-box']}],
},
});
} satisfies Config;

View File

@ -2,17 +2,18 @@ import {readFileSync} from 'node:fs';
import {env} from 'node:process';
import {parse} from 'postcss';
import plugin from 'tailwindcss/plugin.js';
import type {Config} from 'tailwindcss';
const isProduction = env.NODE_ENV !== 'development';
function extractRootVars(css) {
function extractRootVars(css: string) {
const root = parse(css);
const vars = new Set();
const vars = new Set<string>();
root.walkRules((rule) => {
if (rule.selector !== ':root') return;
rule.each((decl) => {
if (decl.value && decl.prop.startsWith('--')) {
vars.add(decl.prop.substring(2));
rule.each((node) => {
if (node.type === 'decl' && node.value && node.prop.startsWith('--')) {
vars.add(node.prop.substring(2));
}
});
});
@ -120,4 +121,4 @@ export default {
});
}),
],
};
} satisfies Config;

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,10 @@
#!/usr/bin/env node
import {loadSVGFromString, Canvas, Rect, util} from 'fabric/node'; // eslint-disable-line import-x/no-unresolved
import {initWasm, Resvg} from '@resvg/resvg-wasm';
import {optimize} from 'svgo';
import {readFile, writeFile} from 'node:fs/promises';
import {argv, exit} from 'node:process';
function doExit(err) {
if (err) console.error(err);
exit(err ? 1 : 0);
}
async function generate(svg, path, {size, bg}) {
async function generate(svg: string, path: string, {size, bg}: {size: number, bg?: boolean}) {
const outputFile = new URL(path, import.meta.url);
if (String(outputFile).endsWith('.svg')) {
@ -19,7 +14,9 @@ async function generate(svg, path, {size, bg}) {
'removeDimensions',
{
name: 'addAttributesToSVGElement',
params: {attributes: [{width: size}, {height: size}]},
params: {
attributes: [{width: String(size)}, {height: String(size)}],
},
},
],
});
@ -27,37 +24,23 @@ async function generate(svg, path, {size, bg}) {
return;
}
const {objects, options} = await loadSVGFromString(svg);
const canvas = new Canvas();
canvas.setDimensions({width: size, height: size});
const ctx = canvas.getContext('2d');
ctx.scale(options.width ? (size / options.width) : 1, options.height ? (size / options.height) : 1);
if (bg) {
canvas.add(new Rect({
left: 0,
top: 0,
height: size * (1 / (size / options.height)),
width: size * (1 / (size / options.width)),
fill: 'white',
}));
}
canvas.add(util.groupSVGElements(objects, options));
canvas.renderAll();
let png = Buffer.from([]);
for await (const chunk of canvas.createPNGStream()) {
png = Buffer.concat([png, chunk]);
}
await writeFile(outputFile, png);
const resvgJS = new Resvg(svg, {
fitTo: {
mode: 'width',
value: size,
},
...(bg && {background: 'white'}),
});
const renderedImage = resvgJS.render();
const pngBytes = renderedImage.asPng();
await writeFile(outputFile, Buffer.from(pngBytes));
}
async function main() {
const gitea = argv.slice(2).includes('gitea');
const logoSvg = await readFile(new URL('../assets/logo.svg', import.meta.url), 'utf8');
const faviconSvg = await readFile(new URL('../assets/favicon.svg', import.meta.url), 'utf8');
await initWasm(await readFile(new URL(import.meta.resolve('@resvg/resvg-wasm/index_bg.wasm'))));
await Promise.all([
generate(logoSvg, '../public/assets/img/logo.svg', {size: 32}),
@ -71,7 +54,8 @@ async function main() {
}
try {
doExit(await main());
await main();
} catch (err) {
doExit(err);
console.error(err);
exit(1);
}

View File

@ -1,27 +1,29 @@
#!/usr/bin/env node
import fastGlob from 'fast-glob';
import {optimize} from 'svgo';
import {parse} from 'node:path';
import {dirname, parse} from 'node:path';
import {globSync, writeFileSync} from 'node:fs';
import {readFile, writeFile, mkdir} from 'node:fs/promises';
import {fileURLToPath} from 'node:url';
import {exit} from 'node:process';
import * as fs from 'node:fs';
import type {Manifest} from 'material-icon-theme';
const glob = (pattern) => fastGlob.sync(pattern, {
cwd: fileURLToPath(new URL('..', import.meta.url)),
absolute: true,
});
const glob = (pattern: string) => globSync(pattern, {cwd: dirname(import.meta.dirname)});
async function processAssetsSvgFile(file, {prefix, fullName} = {}) {
type Opts = {
prefix?: string,
fullName?: string,
};
async function processAssetsSvgFile(path: string, {prefix, fullName}: Opts = {}) {
let name = fullName;
if (!name) {
name = parse(file).name;
name = parse(path).name;
if (prefix) name = `${prefix}-${name}`;
if (prefix === 'octicon') name = name.replace(/-[0-9]+$/, ''); // chop of '-16' on octicons
}
// Set the `xmlns` attribute so that the files are displayable in standalone documents
// The svg backend module will strip the attribute during startup for inline display
const {data} = optimize(await readFile(file, 'utf8'), {
const {data} = optimize(await readFile(path, 'utf8'), {
plugins: [
{name: 'preset-default'},
{name: 'removeDimensions'},
@ -41,16 +43,16 @@ async function processAssetsSvgFile(file, {prefix, fullName} = {}) {
await writeFile(fileURLToPath(new URL(`../public/assets/img/svg/${name}.svg`, import.meta.url)), data);
}
function processAssetsSvgFiles(pattern, opts) {
return glob(pattern).map((file) => processAssetsSvgFile(file, opts));
function processAssetsSvgFiles(pattern: string, opts: Opts = {}) {
return glob(pattern).map((path) => processAssetsSvgFile(path, opts));
}
async function processMaterialFileIcons() {
const files = glob('node_modules/material-icon-theme/icons/*.svg');
const svgSymbols = {};
for (const file of files) {
const paths = glob('node_modules/material-icon-theme/icons/*.svg');
const svgSymbols: Record<string, string> = {};
for (const path of paths) {
// remove all unnecessary attributes, only keep "viewBox"
const {data} = optimize(await readFile(file, 'utf8'), {
const {data} = optimize(await readFile(path, 'utf8'), {
plugins: [
{name: 'preset-default'},
{name: 'removeDimensions'},
@ -58,16 +60,16 @@ async function processMaterialFileIcons() {
{name: 'removeAttrs', params: {attrs: 'xml:space', elemSeparator: ','}},
],
});
const svgName = parse(file).name;
const svgName = parse(path).name;
// intentionally use single quote here to avoid escaping
svgSymbols[svgName] = data.replace(/"/g, `'`);
}
fs.writeFileSync(fileURLToPath(new URL(`../options/fileicon/material-icon-svgs.json`, import.meta.url)), JSON.stringify(svgSymbols, null, 2));
writeFileSync(fileURLToPath(new URL(`../options/fileicon/material-icon-svgs.json`, import.meta.url)), JSON.stringify(svgSymbols, null, 2));
const vscodeExtensionsJson = await readFile(fileURLToPath(new URL(`generate-svg-vscode-extensions.json`, import.meta.url)));
const vscodeExtensions = JSON.parse(vscodeExtensionsJson);
const iconRulesJson = await readFile(fileURLToPath(new URL(`../node_modules/material-icon-theme/dist/material-icons.json`, import.meta.url)));
const iconRules = JSON.parse(iconRulesJson);
const vscodeExtensionsJson = await readFile(fileURLToPath(new URL(`generate-svg-vscode-extensions.json`, import.meta.url)), 'utf8');
const vscodeExtensions = JSON.parse(vscodeExtensionsJson) as Record<string, string>;
const iconRulesJson = await readFile(fileURLToPath(new URL(`../node_modules/material-icon-theme/dist/material-icons.json`, import.meta.url)), 'utf8');
const iconRules = JSON.parse(iconRulesJson) as Manifest;
// The rules are from VSCode material-icon-theme, we need to adjust them to our needs
// 1. We only use lowercase filenames to match (it should be good enough for most cases and more efficient)
// 2. We do not have a "Language ID" system:
@ -91,7 +93,7 @@ async function processMaterialFileIcons() {
}
}
const iconRulesPretty = JSON.stringify(iconRules, null, 2);
fs.writeFileSync(fileURLToPath(new URL(`../options/fileicon/material-icon-rules.json`, import.meta.url)), iconRulesPretty);
writeFileSync(fileURLToPath(new URL(`../options/fileicon/material-icon-rules.json`, import.meta.url)), iconRulesPretty);
}
async function main() {

View File

@ -1,11 +1,10 @@
#!/usr/bin/env node
import {readdirSync, readFileSync} from 'node:fs';
import {readdirSync, readFileSync, globSync} from 'node:fs';
import {parse, relative} from 'node:path';
import {fileURLToPath} from 'node:url';
import {exit} from 'node:process';
import fastGlob from 'fast-glob';
const knownSvgs = new Set();
const knownSvgs = new Set<string>();
for (const file of readdirSync(new URL('../public/assets/img/svg', import.meta.url))) {
knownSvgs.add(parse(file).name);
}
@ -13,7 +12,7 @@ for (const file of readdirSync(new URL('../public/assets/img/svg', import.meta.u
const rootPath = fileURLToPath(new URL('..', import.meta.url));
let hadErrors = false;
for (const file of fastGlob.sync(fileURLToPath(new URL('../templates/**/*.tmpl', import.meta.url)))) {
for (const file of globSync(fileURLToPath(new URL('../templates/**/*.tmpl', import.meta.url)))) {
const content = readFileSync(file, 'utf8');
for (const [_, name] of content.matchAll(/svg ["'`]([^"'`]+)["'`]/g)) {
if (!knownSvgs.has(name)) {

View File

@ -1,21 +0,0 @@
{
"name": "gitea-tools",
"version": "1.0.0",
"description": "Build tools for Gitea",
"type": "module",
"private": true,
"dependencies": {
"fabric": "^6.7.1",
"svgo": "^4.0.0",
"fast-glob": "^3.3.3"
},
"optionalDependencies": {
"canvas": "^3.2.0"
},
"pnpm": {
"onlyBuiltDependencies": ["canvas"],
"overrides": {
"canvas": "3.2.0"
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -41,6 +41,7 @@
"types": [
"vitest/globals",
"./web_src/js/globals.d.ts",
"./types.d.ts",
],
}
}

9
types.d.ts vendored Normal file
View File

@ -0,0 +1,9 @@
declare module 'add-asset-webpack-plugin' {
const plugin: any;
export = plugin
}
declare module '@techknowlogick/license-checker-webpack-plugin' {
const plugin: any;
export = plugin
}

View File

@ -1,3 +1,5 @@
import type {Config} from 'updates';
export default {
exclude: [
'@mcaptcha/vanilla-glue', // breaking changes in rc versions need to be handled
@ -11,4 +13,4 @@ export default {
'eslint-plugin-vitest', // need to migrate to eslint flat config first
'tailwindcss', // need to migrate
],
};
} satisfies Config;

Some files were not shown because too many files have changed in this diff Show More