Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bc3bb0f778 | |||
| d955bac72b | |||
| afc470f513 | |||
| 6505840839 | |||
| 7d98098a87 | |||
| 28b9d94658 | |||
| 8d8ecf176a | |||
| 7203628004 | |||
| 36a824be1d | |||
| fcf33d35df | |||
| 358606e235 |
@@ -382,7 +382,7 @@ jobs:
|
|||||||
content = open('CHANGELOG.md').read()
|
content = open('CHANGELOG.md').read()
|
||||||
old = '## [Unreleased]'
|
old = '## [Unreleased]'
|
||||||
new = f'## [Unreleased]\n\n## [{version}] --- {date}'
|
new = f'## [Unreleased]\n\n## [{version}] --- {date}'
|
||||||
content = content.replace(old, new, 1)
|
content = content if ('## [' + version + ']') in content else content.replace(old, new, 1)
|
||||||
open('CHANGELOG.md', 'w').write(content)
|
open('CHANGELOG.md', 'w').write(content)
|
||||||
" "$VERSION" "$DATE"
|
" "$VERSION" "$DATE"
|
||||||
git add CHANGELOG.md
|
git add CHANGELOG.md
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
#
|
#
|
||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: MokoGitea.Workflow
|
||||||
# INGROUP: MokoStandards.CI
|
# INGROUP: MokoStandards.CI
|
||||||
# REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Generic
|
# REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Generic
|
||||||
# PATH: /.mokogitea/workflows/ci-generic.yml
|
# PATH: /.mokogitea/workflows/ci-generic.yml
|
||||||
@@ -131,10 +131,11 @@ jobs:
|
|||||||
test:
|
test:
|
||||||
name: Tests
|
name: Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: lint
|
# Independent job (no `needs: lint`): the Gitea Actions scheduler does not
|
||||||
# Run only when lint succeeded; always() forces evaluation so a skipped
|
# offer the dependent 2nd job of a needs-chain to runners, so it stalls in
|
||||||
# lint (e.g. template repos) skips this job cleanly instead of hanging.
|
# "waiting" and is reaped by ABANDONED_JOB_TIMEOUT. Guard template repos
|
||||||
if: ${{ always() && needs.lint.result == 'success' }}
|
# directly (same condition lint uses) instead of gating on lint's result.
|
||||||
|
if: ${{ !startsWith(github.event.repository.name, 'Template-') }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Check for merge conflict markers
|
- name: Check for merge conflict markers
|
||||||
run: |
|
run: |
|
||||||
CONFLICTS=$(grep -rn '<<<<<<< \|>>>>>>> \|^=======$' --include='*.php' --include='*.xml' --include='*.css' --include='*.js' --include='*.json' --include='*.md' --include='*.yml' --include='*.yaml' --include='*.ini' --include='*.txt' . 2>/dev/null | grep -v '.git/' || true)
|
CONFLICTS=$(grep -rn '<<<<<<< \|>>>>>>> \|^=======$' --exclude-dir='.git' --exclude-dir='.mokogitea' --include='*.php' --include='*.xml' --include='*.css' --include='*.js' --include='*.json' --include='*.md' --include='*.yml' --include='*.yaml' --include='*.ini' --include='*.txt' . 2>/dev/null | grep -v '.git/' || true)
|
||||||
if [ -n "$CONFLICTS" ]; then
|
if [ -n "$CONFLICTS" ]; then
|
||||||
echo "::error::Merge conflict markers found in source files"
|
echo "::error::Merge conflict markers found in source files"
|
||||||
echo "## Conflict Markers Found" >> $GITHUB_STEP_SUMMARY
|
echo "## Conflict Markers Found" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// AddRepoManifestTable creates the repo_manifest table for storing
|
// AddRepoManifestTable creates the repo_manifest table for storing
|
||||||
// mokoplatform manifest settings per repository.
|
// mokocli manifest settings per repository.
|
||||||
func AddRepoManifestTable(x *xorm.Engine) error {
|
func AddRepoManifestTable(x *xorm.Engine) error {
|
||||||
type RepoManifest struct {
|
type RepoManifest struct {
|
||||||
ID int64 `xorm:"pk autoincr"`
|
ID int64 `xorm:"pk autoincr"`
|
||||||
|
|||||||
@@ -15,50 +15,50 @@ func init() {
|
|||||||
db.RegisterModel(new(RepoMetadata))
|
db.RegisterModel(new(RepoMetadata))
|
||||||
}
|
}
|
||||||
|
|
||||||
// RepoMetadata stores mokoplatform metadata settings for a repository.
|
// RepoMetadata stores mokocli metadata settings for a repository.
|
||||||
// These fields correspond to the .mokogitea/manifest.xml schema and are
|
// These first-class fields are the authoritative repository metadata,
|
||||||
// exposed via API for use by Actions workflows and the mokoplatform CLI.
|
// exposed via API for use by Actions workflows and mokocli.
|
||||||
type RepoMetadata struct {
|
type RepoMetadata struct {
|
||||||
ID int64 `xorm:"pk autoincr"`
|
ID int64 `xorm:"pk autoincr"`
|
||||||
RepoID int64 `xorm:"UNIQUE INDEX NOT NULL 'repo_id'"`
|
RepoID int64 `xorm:"UNIQUE INDEX NOT NULL 'repo_id'"`
|
||||||
|
|
||||||
// identity section
|
// identity section
|
||||||
Name string `xorm:"TEXT 'name'"` // project name
|
Name string `xorm:"TEXT 'name'"` // project name
|
||||||
Org string `xorm:"TEXT 'org'"` // organization name
|
Org string `xorm:"TEXT 'org'"` // organization name
|
||||||
Description string `xorm:"TEXT 'description'"` // project description
|
Description string `xorm:"TEXT 'description'"` // project description
|
||||||
LicenseSPDX string `xorm:"VARCHAR(50) 'license_spdx'"` // SPDX identifier, e.g. "GPL-3.0-or-later"
|
LicenseSPDX string `xorm:"VARCHAR(50) 'license_spdx'"` // SPDX identifier, e.g. "GPL-3.0-or-later"
|
||||||
LicenseName string `xorm:"TEXT 'license_name'"` // human-readable license name
|
LicenseName string `xorm:"TEXT 'license_name'"` // human-readable license name
|
||||||
|
|
||||||
// governance section
|
// governance section
|
||||||
Platform string `xorm:"VARCHAR(50) 'platform'"` // go, php, node, python, etc.
|
Platform string `xorm:"VARCHAR(50) 'platform'"` // go, php, node, python, etc.
|
||||||
StandardsVersion string `xorm:"VARCHAR(20) 'standards_version'"` // mokoplatform standards version
|
StandardsVersion string `xorm:"VARCHAR(20) 'standards_version'"` // mokocli standards version
|
||||||
StandardsSource string `xorm:"TEXT 'standards_source'"` // URL to standards repo
|
StandardsSource string `xorm:"TEXT 'standards_source'"` // URL to standards repo
|
||||||
|
|
||||||
// versioning
|
// versioning
|
||||||
VersionPrefix string `xorm:"TEXT 'version_prefix'"` // tag prefix stripped for version display, e.g. "v1.26.1-moko."
|
VersionPrefix string `xorm:"TEXT 'version_prefix'"` // tag prefix stripped for version display, e.g. "v1.26.1-moko."
|
||||||
ElementName string `xorm:"TEXT 'element_name'"` // full element name override, e.g. "pkg_mokowaas" (auto-constructed if empty)
|
ElementName string `xorm:"TEXT 'element_name'"` // full element name override, e.g. "pkg_mokowaas" (auto-constructed if empty)
|
||||||
|
|
||||||
// distribution metadata (used by update server feed generation)
|
// distribution metadata (used by update server feed generation)
|
||||||
Maintainer string `xorm:"TEXT 'maintainer'"` // maintainer/author name
|
Maintainer string `xorm:"TEXT 'maintainer'"` // maintainer/author name
|
||||||
MaintainerURL string `xorm:"TEXT 'maintainer_url'"` // maintainer website
|
MaintainerURL string `xorm:"TEXT 'maintainer_url'"` // maintainer website
|
||||||
InfoURL string `xorm:"TEXT 'info_url'"` // extension info/product page URL
|
InfoURL string `xorm:"TEXT 'info_url'"` // extension info/product page URL
|
||||||
TargetVersion string `xorm:"TEXT 'target_version'"` // target platform version regex, e.g. "(5|6)\..*"
|
TargetVersion string `xorm:"TEXT 'target_version'"` // target platform version regex, e.g. "(5|6)\..*"
|
||||||
PHPMinimum string `xorm:"VARCHAR(20) 'php_minimum'"` // minimum PHP version, e.g. "8.1"
|
PHPMinimum string `xorm:"VARCHAR(20) 'php_minimum'"` // minimum PHP version, e.g. "8.1"
|
||||||
|
|
||||||
// build section
|
// build section
|
||||||
Language string `xorm:"VARCHAR(50) 'language'"` // Go, PHP, TypeScript, etc.
|
Language string `xorm:"VARCHAR(50) 'language'"` // Go, PHP, TypeScript, etc.
|
||||||
ExtensionType string `xorm:"VARCHAR(50) 'extension_type'"` // component, module, plugin, package, template, library, file
|
ExtensionType string `xorm:"VARCHAR(50) 'extension_type'"` // component, module, plugin, package, template, library, file
|
||||||
EntryPoint string `xorm:"TEXT 'entry_point'"` // build entry point path
|
EntryPoint string `xorm:"TEXT 'entry_point'"` // build entry point path
|
||||||
|
|
||||||
// deploy section
|
// deploy section
|
||||||
DeployHost string `xorm:"VARCHAR(255) 'deploy_host'"` // SSH host for deploy
|
DeployHost string `xorm:"VARCHAR(255) 'deploy_host'"` // SSH host for deploy
|
||||||
DeployPort string `xorm:"VARCHAR(10) 'deploy_port'"` // SSH port (default 2918)
|
DeployPort string `xorm:"VARCHAR(10) 'deploy_port'"` // SSH port (default 2918)
|
||||||
DeployUser string `xorm:"VARCHAR(100) 'deploy_user'"` // SSH user
|
DeployUser string `xorm:"VARCHAR(100) 'deploy_user'"` // SSH user
|
||||||
DeployPath string `xorm:"TEXT 'deploy_path'"` // remote path for source/compose
|
DeployPath string `xorm:"TEXT 'deploy_path'"` // remote path for source/compose
|
||||||
DockerImage string `xorm:"VARCHAR(255) 'docker_image'"` // e.g. mokoconsulting/mokogitea
|
DockerImage string `xorm:"VARCHAR(255) 'docker_image'"` // e.g. mokoconsulting/mokogitea
|
||||||
DockerRegistry string `xorm:"VARCHAR(255) 'docker_registry'"` // e.g. git.mokoconsulting.tech
|
DockerRegistry string `xorm:"VARCHAR(255) 'docker_registry'"` // e.g. git.mokoconsulting.tech
|
||||||
ContainerName string `xorm:"VARCHAR(100) 'container_name'"` // Docker container name
|
ContainerName string `xorm:"VARCHAR(100) 'container_name'"` // Docker container name
|
||||||
HealthURL string `xorm:"TEXT 'health_url'"` // health check URL after deploy
|
HealthURL string `xorm:"TEXT 'health_url'"` // health check URL after deploy
|
||||||
|
|
||||||
CreatedUnix timeutil.TimeStamp `xorm:"INDEX CREATED 'created_unix'"`
|
CreatedUnix timeutil.TimeStamp `xorm:"INDEX CREATED 'created_unix'"`
|
||||||
UpdatedUnix timeutil.TimeStamp `xorm:"UPDATED 'updated_unix'"`
|
UpdatedUnix timeutil.TimeStamp `xorm:"UPDATED 'updated_unix'"`
|
||||||
|
|||||||
@@ -2772,7 +2772,7 @@
|
|||||||
"repo.settings.support_url_help": "Shown when downloads are gated. Can point to your wiki, product page, or external support site.",
|
"repo.settings.support_url_help": "Shown when downloads are gated. Can point to your wiki, product page, or external support site.",
|
||||||
"repo.settings.custom_fields": "Custom Fields",
|
"repo.settings.custom_fields": "Custom Fields",
|
||||||
"repo.settings.manifest": "Manifest",
|
"repo.settings.manifest": "Manifest",
|
||||||
"repo.settings.manifest_desc": "Project identity, governance, and build settings from the MokoPlatform manifest. These are accessible via API for Actions workflows and the MokoPlatform CLI.",
|
"repo.settings.manifest_desc": "Project identity, governance, and build settings for the repository. These are accessible via API for Actions workflows and MokoCLI.",
|
||||||
"repo.settings.manifest_identity": "Identity",
|
"repo.settings.manifest_identity": "Identity",
|
||||||
"repo.settings.manifest_name": "Project Name",
|
"repo.settings.manifest_name": "Project Name",
|
||||||
"repo.settings.manifest_element_name": "Element Name",
|
"repo.settings.manifest_element_name": "Element Name",
|
||||||
|
|||||||
@@ -1543,8 +1543,6 @@ func Routes() *web.Router {
|
|||||||
}, reqAnyRepoReader())
|
}, reqAnyRepoReader())
|
||||||
m.Get("/metadata", repo.GetRepoMetadata)
|
m.Get("/metadata", repo.GetRepoMetadata)
|
||||||
m.Put("/metadata", reqToken(), reqAdmin(), repo.UpdateRepoMetadata)
|
m.Put("/metadata", reqToken(), reqAdmin(), repo.UpdateRepoMetadata)
|
||||||
m.Get("/manifest", repo.GetRepoMetadata) // backward compat
|
|
||||||
m.Put("/manifest", reqToken(), reqAdmin(), repo.UpdateRepoMetadata)
|
|
||||||
// MokoGitea badge engine
|
// MokoGitea badge engine
|
||||||
m.Get("/badge/{type}.svg", repo.GetRepoBadge)
|
m.Get("/badge/{type}.svg", repo.GetRepoBadge)
|
||||||
m.Get("/issue_templates", reqRepoReader(unit.TypeCode), context.ReferencesGitRepo(), repo.GetIssueTemplates)
|
m.Get("/issue_templates", reqRepoReader(unit.TypeCode), context.ReferencesGitRepo(), repo.GetIssueTemplates)
|
||||||
|
|||||||
@@ -1,115 +0,0 @@
|
|||||||
// Copyright 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
package repository
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/xml"
|
|
||||||
|
|
||||||
repo_model "code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/repo"
|
|
||||||
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/git"
|
|
||||||
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
// manifestXML mirrors the .mokogitea/manifest.xml schema for XML parsing.
|
|
||||||
type manifestXML struct {
|
|
||||||
XMLName xml.Name `xml:"mokoplatform"`
|
|
||||||
Identity manifestIdentity `xml:"identity"`
|
|
||||||
Governance manifestGovernance `xml:"governance"`
|
|
||||||
Distribution manifestDistribution `xml:"distribution"`
|
|
||||||
Build manifestBuild `xml:"build"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type manifestDistribution struct {
|
|
||||||
DisplayName string `xml:"display-name"`
|
|
||||||
Maintainer string `xml:"maintainer"`
|
|
||||||
MaintainerURL string `xml:"maintainer-url"`
|
|
||||||
InfoURL string `xml:"info-url"`
|
|
||||||
TargetVersion string `xml:"target-version"`
|
|
||||||
PHPMinimum string `xml:"php-minimum"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type manifestIdentity struct {
|
|
||||||
Name string `xml:"name"`
|
|
||||||
Org string `xml:"org"`
|
|
||||||
Description string `xml:"description"`
|
|
||||||
VersionPrefix string `xml:"version-prefix"`
|
|
||||||
ElementName string `xml:"element-name"`
|
|
||||||
License manifestLicense `xml:"license"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type manifestLicense struct {
|
|
||||||
SPDX string `xml:"spdx,attr"`
|
|
||||||
Name string `xml:",chardata"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type manifestGovernance struct {
|
|
||||||
Platform string `xml:"platform"`
|
|
||||||
StandardsVersion string `xml:"standards-version"`
|
|
||||||
StandardsSource string `xml:"standards-source"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type manifestBuild struct {
|
|
||||||
Language string `xml:"language"`
|
|
||||||
ExtensionType string `xml:"package-type"`
|
|
||||||
EntryPoint string `xml:"entry-point"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// SyncMetadataFromCommit reads .mokogitea/manifest.xml from the given commit
|
|
||||||
// and upserts the values into the repo_manifest database table.
|
|
||||||
// This is called on push to the default branch to keep the database in sync
|
|
||||||
// with the XML file. If no manifest.xml exists, this is a no-op.
|
|
||||||
func SyncMetadataFromCommit(ctx context.Context, repo *repo_model.Repository, commit *git.Commit) {
|
|
||||||
if commit == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
entry, err := commit.GetTreeEntryByPath(".mokogitea/manifest.xml")
|
|
||||||
if err != nil || entry == nil {
|
|
||||||
return // no manifest.xml — not an error
|
|
||||||
}
|
|
||||||
|
|
||||||
reader, err := entry.Blob().DataAsync()
|
|
||||||
if err != nil {
|
|
||||||
log.Error("SyncMetadata: read blob for %s: %v", repo.FullName(), err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer reader.Close()
|
|
||||||
|
|
||||||
var mxml manifestXML
|
|
||||||
decoder := xml.NewDecoder(reader)
|
|
||||||
if err := decoder.Decode(&mxml); err != nil {
|
|
||||||
log.Error("SyncMetadata: parse XML for %s: %v", repo.FullName(), err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
manifest := &repo_model.RepoMetadata{
|
|
||||||
RepoID: repo.ID,
|
|
||||||
Name: mxml.Identity.Name,
|
|
||||||
Org: mxml.Identity.Org,
|
|
||||||
Description: mxml.Identity.Description,
|
|
||||||
VersionPrefix: mxml.Identity.VersionPrefix,
|
|
||||||
ElementName: mxml.Identity.ElementName,
|
|
||||||
LicenseSPDX: mxml.Identity.License.SPDX,
|
|
||||||
LicenseName: mxml.Identity.License.Name,
|
|
||||||
Platform: mxml.Governance.Platform,
|
|
||||||
StandardsVersion: mxml.Governance.StandardsVersion,
|
|
||||||
StandardsSource: mxml.Governance.StandardsSource,
|
|
||||||
Maintainer: mxml.Distribution.Maintainer,
|
|
||||||
MaintainerURL: mxml.Distribution.MaintainerURL,
|
|
||||||
InfoURL: mxml.Distribution.InfoURL,
|
|
||||||
TargetVersion: mxml.Distribution.TargetVersion,
|
|
||||||
PHPMinimum: mxml.Distribution.PHPMinimum,
|
|
||||||
Language: mxml.Build.Language,
|
|
||||||
ExtensionType: mxml.Build.ExtensionType,
|
|
||||||
EntryPoint: mxml.Build.EntryPoint,
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := repo_model.CreateOrUpdateRepoMetadata(ctx, manifest); err != nil {
|
|
||||||
log.Error("SyncMetadata: save for %s: %v", repo.FullName(), err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("SyncMetadata: synced .mokogitea/manifest.xml for %s", repo.FullName())
|
|
||||||
}
|
|
||||||
@@ -194,8 +194,6 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
|
|||||||
if err := DelRepoDivergenceFromCache(ctx, repo.ID); err != nil {
|
if err := DelRepoDivergenceFromCache(ctx, repo.ID); err != nil {
|
||||||
log.Error("DelRepoDivergenceFromCache: %v", err)
|
log.Error("DelRepoDivergenceFromCache: %v", err)
|
||||||
}
|
}
|
||||||
// Auto-sync .mokogitea/manifest.xml to database on default branch push
|
|
||||||
SyncMetadataFromCommit(ctx, repo, newCommit)
|
|
||||||
// Run security scanners on default branch push
|
// Run security scanners on default branch push
|
||||||
security_service.ScanOnPush(ctx, repo, newCommit)
|
security_service.ScanOnPush(ctx, repo, newCommit)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -255,7 +255,7 @@ func TestPackageComposer(t *testing.T) {
|
|||||||
AddBasicAuth(user.Name)
|
AddBasicAuth(user.Name)
|
||||||
resp = MakeRequest(t, req, http.StatusOK)
|
resp = MakeRequest(t, req, http.StatusOK)
|
||||||
|
|
||||||
result = composer.PackageMetadataResponse{}
|
result = &composer.PackageMetadataResponse{}
|
||||||
DecodeJSON(t, resp, &result)
|
DecodeJSON(t, resp, &result)
|
||||||
pkgs = result.Packages[packageName]
|
pkgs = result.Packages[packageName]
|
||||||
assert.Len(t, pkgs, 1)
|
assert.Len(t, pkgs, 1)
|
||||||
@@ -268,7 +268,7 @@ func TestPackageComposer(t *testing.T) {
|
|||||||
AddBasicAuth(otherUser.Name)
|
AddBasicAuth(otherUser.Name)
|
||||||
resp = MakeRequest(t, req, http.StatusOK)
|
resp = MakeRequest(t, req, http.StatusOK)
|
||||||
|
|
||||||
result = composer.PackageMetadataResponse{}
|
result = &composer.PackageMetadataResponse{}
|
||||||
DecodeJSON(t, resp, &result)
|
DecodeJSON(t, resp, &result)
|
||||||
pkgs = result.Packages[packageName]
|
pkgs = result.Packages[packageName]
|
||||||
assert.Len(t, pkgs, 1)
|
assert.Len(t, pkgs, 1)
|
||||||
|
|||||||
@@ -7,16 +7,16 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
auth_model "code.gitea.io/gitea/models/auth"
|
auth_model "code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/auth"
|
||||||
"code.gitea.io/gitea/models/unittest"
|
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/unittest"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/user"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/test"
|
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/test"
|
||||||
"code.gitea.io/gitea/modules/web"
|
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/web"
|
||||||
"code.gitea.io/gitea/routers/web/auth"
|
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/routers/web/auth"
|
||||||
"code.gitea.io/gitea/services/auth/source/oauth2"
|
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/services/auth/source/oauth2"
|
||||||
"code.gitea.io/gitea/services/context"
|
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/services/context"
|
||||||
"code.gitea.io/gitea/tests"
|
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/tests"
|
||||||
|
|
||||||
"github.com/markbates/goth"
|
"github.com/markbates/goth"
|
||||||
"github.com/markbates/goth/gothic"
|
"github.com/markbates/goth/gothic"
|
||||||
|
|||||||
Reference in New Issue
Block a user