alt
+ .drone.yml
, /docs/**/*.txt
.
settings.protect_unprotected_file_patterns=Μοτίβα μη προστατευμένων αρχείων (διαχωρισμένα με ερωτηματικό ';'):
@@ -2384,10 +2450,13 @@ branch.protected_deletion_failed=Ο κλάδος "%s" προστατεύεται
branch.default_deletion_failed=Ο κλάδος "%s" είναι ο προεπιλεγμένος κλάδος. Δεν μπορεί να διαγραφεί.
branch.restore=`Επαναφορά του Κλάδου "%s"`
branch.download=`Λήψη του Κλάδου "%s"`
+branch.rename=`Μετονομασία Κλάδου "%s"`
branch.included_desc=Αυτός ο κλάδος είναι μέρος του προεπιλεγμένου κλάδου
branch.included=Περιλαμβάνεται
branch.create_new_branch=Δημιουργία κλάδου από κλάδο:
branch.confirm_create_branch=Δημιουργία κλάδου
+branch.warning_rename_default_branch=Μετονομάζετε τον προεπιλεγμένο κλάδο.
+branch.rename_branch_to=Μετονομασία του "%s" σε:
branch.confirm_rename_branch=Μετονομασία κλάδου
branch.create_branch_operation=Δημιουργία κλάδου
branch.new_branch=Δημιουργία νέου κλάδου
@@ -2946,6 +3015,7 @@ config.mailer_sendmail_timeout=Χρονικό Όριο Sendmail
config.mailer_use_dummy=Ψεύτικο
config.test_email_placeholder=Email (π.χ. test@example.com)
config.send_test_mail=Αποστολή Δοκιμαστικού Email
+config.send_test_mail_submit=Αποστολή
config.test_mail_failed=Αποτυχία αποστολής ενός δοκιμαστικού email στο"%s": %v
config.test_mail_sent=Στάλθηκε ένα δοκιμαστικό email στο "%s".
@@ -2985,13 +3055,16 @@ config.git_pull_timeout=Χρονικό Όριο Pull
config.git_gc_timeout=Χρονικό Όριο Λειτουργίας GC
config.log_config=Ρύθμιση Καταγραφών
+config.logger_name_fmt=Καταγραφέας: %s
config.disabled_logger=Απενεργοποιημένο
config.access_log_mode=Λειτουργία Καταγραφών Πρόσβασης
+config.access_log_template=Πρότυπο Καταγραφής Προσβάσεων
config.xorm_log_sql=Καταγραφή SQL
config.get_setting_failed=Αποτυχία λήψης ρύθμισης %s
config.set_setting_failed=Αποτυχία ορισμού της ρύθμισης %s
+monitor.stats=Στατιστικά
monitor.cron=Προγραμματισμένες Εργασίες
monitor.name=Όνομα
@@ -3001,6 +3074,8 @@ monitor.previous=Προηγούμενη Ώρα
monitor.execute_times=Εκτελέσεις
monitor.process=Εκτελούμενες Διεργασίες
monitor.stacktrace=Ιχνηλατήσεις Στοίβας
+monitor.processes_count=%d Διεργασίες
+monitor.download_diagnosis_report=Λήψη αναφοράς διάγνωσης
monitor.desc=Περιγραφή
monitor.start=Ώρα Έναρξης
monitor.execute_time=Χρόνος Εκτέλεσης
@@ -3021,11 +3096,14 @@ monitor.queue.numberinqueue=Πλήθος Ουράς
monitor.queue.review=Εξέταση Ρυθμίσεων
monitor.queue.review_add=Εξέταση/Προσθήκη Εργατών
monitor.queue.settings.title=Ρυθμίσεις Δεξαμενής
+monitor.queue.settings.desc=Οι δεξαμενές αυξάνονται δυναμικά όταν υπάρχει φραγή της ουράς των εργατών τους.
monitor.queue.settings.maxnumberworkers=Μέγιστος Αριθμός Εργατών
monitor.queue.settings.maxnumberworkers.placeholder=Αυτή τη στιγμή %[1]d
monitor.queue.settings.maxnumberworkers.error=Ο μέγιστος αριθμός εργατών πρέπει να είναι αριθμός
monitor.queue.settings.submit=Ενημέρωση Ρυθμίσεων
monitor.queue.settings.changed=Οι Ρυθμίσεις Ενημερώθηκαν
+monitor.queue.settings.remove_all_items=Αφαίρεση όλων
+monitor.queue.settings.remove_all_items_done=Όλα τα αντικείμενα στην ουρά αφαιρέθηκαν.
notices.system_notice_list=Ειδοποιήσεις Συστήματος
notices.view_detail_header=Προβολή Λεπτομερειών Ειδοποίησης
@@ -3160,9 +3238,15 @@ versions=Εκδόσεις
versions.view_all=Προβολή όλων
dependency.id=ID
dependency.version=Έκδοση
+alpine.registry=Ρυθμίστε αυτό το μητρώο προσθέτοντας το url στο αρχείο /etc/apk/repositories
:
+alpine.registry.key=Αποθηκεύστε το δημόσιο κλειδί RSA του μητρώου στο φάκελο /etc/apk/keys/
για να επαληθεύσετε την υπογραφή ευρετηρίου:
+alpine.registry.info=Επιλέξτε $branch και $repository από την παρακάτω λίστα.
alpine.install=Για να εγκαταστήσετε το πακέτο, εκτελέστε την ακόλουθη εντολή:
+alpine.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο Alpine, ανατρέξτε στην τεκμηρίωση.
+alpine.repository=Πληροφορίες Αποθετηρίου
alpine.repository.branches=Κλάδοι
alpine.repository.repositories=Αποθετήρια
+alpine.repository.architectures=Αρχιτεκτονικές
cargo.registry=Ρυθμίστε αυτό το μητρώο στις ρυθμίσεις του Cargo (για παράδειγμα ~/.cargo/config.toml
):
cargo.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το Cargo, εκτελέστε την ακόλουθη εντολή:
cargo.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο Cargo, ανατρέξτε στην τεκμηρίωση.
@@ -3195,11 +3279,21 @@ container.layers=Στρώματα Εικόνας
container.labels=Ετικέτες
container.labels.key=Κλειδί
container.labels.value=Τιμή
+cran.registry=Ρυθμίστε αυτό το μητρώο στο αρχείο Rprofile.site
:
cran.install=Για να εγκαταστήσετε το πακέτο, εκτελέστε την ακόλουθη εντολή:
+cran.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο CRAN, ανατρέξτε στην τεκμηρίωση.
debian.registry=Ρυθμίστε αυτό το μητρώο από τη γραμμή εντολών:
+debian.registry.info=Επιλέξτε $distribution και $component από την παρακάτω λίστα.
debian.install=Για να εγκαταστήσετε το πακέτο, εκτελέστε την ακόλουθη εντολή:
+debian.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο Debian, ανατρέξτε στην τεκμηρίωση.
+debian.repository=Πληροφορίες Αποθετηρίου
+debian.repository.distributions=Διανομές
+debian.repository.components=Συστατικά
+debian.repository.architectures=Αρχιτεκτονικές
generic.download=Λήψη πακέτου από τη γραμμή εντολών:
generic.documentation=Για περισσότερες πληροφορίες σχετικά με το γενικό μητρώο, ανατρέξτε στην τεκμηρίωση.
+go.install=Εγκαταστήστε το πακέτο από τη γραμμή εντολών:
+go.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο Go, ανατρέξτε στην τεκμηρίωση.
helm.registry=Ρυθμίστε αυτό το μητρώο από τη γραμμή εντολών:
helm.install=Για να εγκαταστήσετε το πακέτο, εκτελέστε την ακόλουθη εντολή:
helm.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο Helm, ανατρέξτε στην τεκμηρίωση.
@@ -3228,6 +3322,7 @@ pypi.install=Για να εγκαταστήσετε το πακέτο χρησι
pypi.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο PyPI, ανατρέξτε στην τεκμηρίωση.
rpm.registry=Ρυθμίστε αυτό το μητρώο από τη γραμμή εντολών:
rpm.install=Για να εγκαταστήσετε το πακέτο, εκτελέστε την ακόλουθη εντολή:
+rpm.documentation=Για περισσότερες πληροφορίες σχετικά με το μητρώο RPM, ανατρέξτε στην τεκμηρίωση.
rubygems.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το gem, εκτελέστε την ακόλουθη εντολή:
rubygems.install2=ή προσθέστε το στο Gemfile:
rubygems.dependencies.runtime=Εξαρτήσεις Εκτέλεσης
@@ -3300,6 +3395,7 @@ deletion=Αφαίρεση μυστικού
deletion.description=Η αφαίρεση ενός μυστικού είναι μόνιμη και δεν μπορεί να αναιρεθεί. Συνέχεια;
deletion.success=Το μυστικό έχει αφαιρεθεί.
deletion.failed=Αποτυχία αφαίρεσης μυστικού.
+management=Διαχείριση Μυστικών
[actions]
actions=Δράσεις
diff --git a/routers/web/org/projects.go b/routers/web/org/projects.go
index 4b33d943b379..21cb23000d2e 100644
--- a/routers/web/org/projects.go
+++ b/routers/web/org/projects.go
@@ -41,6 +41,7 @@ func MustEnableProjects(ctx *context.Context) {
// Projects renders the home page of projects
func Projects(ctx *context.Context) {
+ shared_user.PrepareContextForProfileBigAvatar(ctx)
ctx.Data["Title"] = ctx.Tr("repo.project_board")
sortType := ctx.FormTrim("sort")
diff --git a/routers/web/shared/user/header.go b/routers/web/shared/user/header.go
index 9594e6975a8e..516c853b02e3 100644
--- a/routers/web/shared/user/header.go
+++ b/routers/web/shared/user/header.go
@@ -4,35 +4,109 @@
package user
import (
+ "code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/models/organization"
repo_model "code.gitea.io/gitea/models/repo"
+ user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/markup"
+ "code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/setting"
)
-func RenderUserHeader(ctx *context.Context) {
- ctx.Data["IsProjectEnabled"] = true
+// prepareContextForCommonProfile store some common data into context data for user's profile related pages (including the nav menu)
+// It is designed to be fast and safe to be called multiple times in one request
+func prepareContextForCommonProfile(ctx *context.Context) {
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
ctx.Data["ContextUser"] = ctx.ContextUser
- tab := ctx.FormString("tab")
- ctx.Data["TabName"] = tab
- repo, err := repo_model.GetRepositoryByName(ctx.ContextUser.ID, ".profile")
- if err == nil && !repo.IsEmpty {
- gitRepo, err := git.OpenRepository(ctx, repo.RepoPath())
+ ctx.Data["EnableFeed"] = setting.Other.EnableFeed
+ ctx.Data["FeedURL"] = ctx.ContextUser.HomeLink()
+}
+
+// PrepareContextForProfileBigAvatar set the context for big avatar view on the profile page
+func PrepareContextForProfileBigAvatar(ctx *context.Context) {
+ prepareContextForCommonProfile(ctx)
+
+ ctx.Data["IsFollowing"] = ctx.Doer != nil && user_model.IsFollowing(ctx.Doer.ID, ctx.ContextUser.ID)
+ ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail && ctx.ContextUser.Email != "" && ctx.IsSigned && !ctx.ContextUser.KeepEmailPrivate
+
+ // Show OpenID URIs
+ openIDs, err := user_model.GetUserOpenIDs(ctx.ContextUser.ID)
+ if err != nil {
+ ctx.ServerError("GetUserOpenIDs", err)
+ return
+ }
+ ctx.Data["OpenIDs"] = openIDs
+
+ if len(ctx.ContextUser.Description) != 0 {
+ content, err := markdown.RenderString(&markup.RenderContext{
+ URLPrefix: ctx.Repo.RepoLink,
+ Metas: map[string]string{"mode": "document"},
+ GitRepo: ctx.Repo.GitRepo,
+ Ctx: ctx,
+ }, ctx.ContextUser.Description)
if err != nil {
- ctx.ServerError("OpenRepository", err)
+ ctx.ServerError("RenderString", err)
return
}
- defer gitRepo.Close()
- commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch)
- if err != nil {
- ctx.ServerError("GetBranchCommit", err)
- return
+ ctx.Data["RenderedDescription"] = content
+ }
+
+ showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
+ orgs, err := organization.FindOrgs(organization.FindOrgOptions{
+ UserID: ctx.ContextUser.ID,
+ IncludePrivate: showPrivate,
+ })
+ if err != nil {
+ ctx.ServerError("FindOrgs", err)
+ return
+ }
+ ctx.Data["Orgs"] = orgs
+ ctx.Data["HasOrgsVisible"] = organization.HasOrgsVisible(orgs, ctx.Doer)
+
+ badges, _, err := user_model.GetUserBadges(ctx, ctx.ContextUser)
+ if err != nil {
+ ctx.ServerError("GetUserBadges", err)
+ return
+ }
+ ctx.Data["Badges"] = badges
+
+ // in case the numbers are already provided by other functions, no need to query again (which is slow)
+ if _, ok := ctx.Data["NumFollowers"]; !ok {
+ _, ctx.Data["NumFollowers"], _ = user_model.GetUserFollowers(ctx, ctx.ContextUser, ctx.Doer, db.ListOptions{PageSize: 1, Page: 1})
+ }
+ if _, ok := ctx.Data["NumFollowing"]; !ok {
+ _, ctx.Data["NumFollowing"], _ = user_model.GetUserFollowing(ctx, ctx.ContextUser, ctx.Doer, db.ListOptions{PageSize: 1, Page: 1})
+ }
+}
+
+func FindUserProfileReadme(ctx *context.Context) (profileGitRepo *git.Repository, profileReadmeBlob *git.Blob, profileClose func()) {
+ profileDbRepo, err := repo_model.GetRepositoryByName(ctx.ContextUser.ID, ".profile")
+ if err == nil && !profileDbRepo.IsEmpty {
+ if profileGitRepo, err = git.OpenRepository(ctx, profileDbRepo.RepoPath()); err != nil {
+ log.Error("FindUserProfileReadme failed to OpenRepository: %v", err)
+ } else {
+ if commit, err := profileGitRepo.GetBranchCommit(profileDbRepo.DefaultBranch); err != nil {
+ log.Error("FindUserProfileReadme failed to GetBranchCommit: %v", err)
+ } else {
+ profileReadmeBlob, _ = commit.GetBlobByPath("README.md")
+ }
}
- blob, err := commit.GetBlobByPath("README.md")
- if err == nil && blob != nil {
- ctx.Data["ProfileReadme"] = true
+ }
+ return profileGitRepo, profileReadmeBlob, func() {
+ if profileGitRepo != nil {
+ _ = profileGitRepo.Close()
}
}
}
+
+func RenderUserHeader(ctx *context.Context) {
+ prepareContextForCommonProfile(ctx)
+
+ _, profileReadmeBlob, profileClose := FindUserProfileReadme(ctx)
+ defer profileClose()
+ ctx.Data["HasProfileReadme"] = profileReadmeBlob != nil
+}
diff --git a/routers/web/user/code.go b/routers/web/user/code.go
index 15524de7d651..033f65c9c06c 100644
--- a/routers/web/user/code.go
+++ b/routers/web/user/code.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/modules/context"
code_indexer "code.gitea.io/gitea/modules/indexer/code"
"code.gitea.io/gitea/modules/setting"
+ shared_user "code.gitea.io/gitea/routers/web/shared/user"
)
const (
@@ -23,8 +24,9 @@ func CodeSearch(ctx *context.Context) {
ctx.Redirect(ctx.ContextUser.HomeLink())
return
}
+ shared_user.PrepareContextForProfileBigAvatar(ctx)
+ shared_user.RenderUserHeader(ctx)
- ctx.Data["IsProjectEnabled"] = true
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
ctx.Data["Title"] = ctx.Tr("explore.code")
diff --git a/routers/web/user/home.go b/routers/web/user/home.go
index 1b0f651b07da..6a89c507a9fd 100644
--- a/routers/web/user/home.go
+++ b/routers/web/user/home.go
@@ -857,7 +857,7 @@ func UsernameSubRoute(ctx *context.Context) {
context_service.UserAssignmentWeb()(ctx)
if !ctx.Written() {
ctx.Data["EnableFeed"] = setting.Other.EnableFeed
- Profile(ctx)
+ OwnerProfile(ctx)
}
}
}
diff --git a/routers/web/user/package.go b/routers/web/user/package.go
index 551e7f54c854..2e2c2a6e1f9d 100644
--- a/routers/web/user/package.go
+++ b/routers/web/user/package.go
@@ -37,6 +37,7 @@ const (
// ListPackages displays a list of all packages of the context user
func ListPackages(ctx *context.Context) {
+ shared_user.PrepareContextForProfileBigAvatar(ctx)
page := ctx.FormInt("page")
if page <= 1 {
page = 1
@@ -259,6 +260,7 @@ func ViewPackageVersion(ctx *context.Context) {
// ListPackageVersions lists all versions of a package
func ListPackageVersions(ctx *context.Context) {
+ shared_user.PrepareContextForProfileBigAvatar(ctx)
p, err := packages_model.GetPackageByName(ctx, ctx.Package.Owner.ID, packages_model.Type(ctx.Params("type")), ctx.Params("name"))
if err != nil {
if err == packages_model.ErrPackageNotExist {
diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go
index 6f9f84d60dbd..442fd0433a72 100644
--- a/routers/web/user/profile.go
+++ b/routers/web/user/profile.go
@@ -11,22 +11,22 @@ import (
activities_model "code.gitea.io/gitea/models/activities"
"code.gitea.io/gitea/models/db"
- "code.gitea.io/gitea/models/organization"
- project_model "code.gitea.io/gitea/models/project"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup"
"code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/routers/web/feed"
"code.gitea.io/gitea/routers/web/org"
+ shared_user "code.gitea.io/gitea/routers/web/shared/user"
)
-// Profile render user's profile page
-func Profile(ctx *context.Context) {
+// OwnerProfile render profile page for a user or a organization (aka, repo owner)
+func OwnerProfile(ctx *context.Context) {
if strings.Contains(ctx.Req.Header.Get("Accept"), "application/rss+xml") {
feed.ShowUserFeedRSS(ctx)
return
@@ -38,36 +38,22 @@ func Profile(ctx *context.Context) {
if ctx.ContextUser.IsOrganization() {
org.Home(ctx)
- return
+ } else {
+ userProfile(ctx)
}
+}
+func userProfile(ctx *context.Context) {
// check view permissions
if !user_model.IsUserVisibleToViewer(ctx, ctx.ContextUser, ctx.Doer) {
ctx.NotFound("user", fmt.Errorf(ctx.ContextUser.Name))
return
}
- // advertise feed via meta tag
- ctx.Data["FeedURL"] = ctx.ContextUser.HomeLink()
-
- // Show OpenID URIs
- openIDs, err := user_model.GetUserOpenIDs(ctx.ContextUser.ID)
- if err != nil {
- ctx.ServerError("GetUserOpenIDs", err)
- return
- }
-
- var isFollowing bool
- if ctx.Doer != nil {
- isFollowing = user_model.IsFollowing(ctx.Doer.ID, ctx.ContextUser.ID)
- }
-
ctx.Data["Title"] = ctx.ContextUser.DisplayName()
ctx.Data["PageIsUserProfile"] = true
- ctx.Data["ContextUser"] = ctx.ContextUser
- ctx.Data["OpenIDs"] = openIDs
- ctx.Data["IsFollowing"] = isFollowing
+ // prepare heatmap data
if setting.Service.EnableUserHeatmap {
data, err := activities_model.GetUserHeatmapDataByUser(ctx.ContextUser, ctx.Doer)
if err != nil {
@@ -78,75 +64,28 @@ func Profile(ctx *context.Context) {
ctx.Data["HeatmapTotalContributions"] = activities_model.GetTotalContributionsInHeatmap(data)
}
- if len(ctx.ContextUser.Description) != 0 {
- content, err := markdown.RenderString(&markup.RenderContext{
- URLPrefix: ctx.Repo.RepoLink,
- Metas: map[string]string{"mode": "document"},
- GitRepo: ctx.Repo.GitRepo,
- Ctx: ctx,
- }, ctx.ContextUser.Description)
- if err != nil {
- ctx.ServerError("RenderString", err)
- return
- }
- ctx.Data["RenderedDescription"] = content
- }
-
- repo, err := repo_model.GetRepositoryByName(ctx.ContextUser.ID, ".profile")
- if err == nil && !repo.IsEmpty {
- gitRepo, err := git.OpenRepository(ctx, repo.RepoPath())
- if err != nil {
- ctx.ServerError("OpenRepository", err)
- return
- }
- defer gitRepo.Close()
- commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch)
- if err != nil {
- ctx.ServerError("GetBranchCommit", err)
- return
- }
- blob, err := commit.GetBlobByPath("README.md")
- if err == nil {
- bytes, err := blob.GetBlobContent(setting.UI.MaxDisplayFileSize)
- if err != nil {
- ctx.ServerError("GetBlobContent", err)
- return
- }
- profileContent, err := markdown.RenderString(&markup.RenderContext{
- Ctx: ctx,
- GitRepo: gitRepo,
- }, bytes)
- if err != nil {
- ctx.ServerError("RenderString", err)
- return
- }
- ctx.Data["ProfileReadme"] = profileContent
- }
- }
+ profileGitRepo, profileReadmeBlob, profileClose := shared_user.FindUserProfileReadme(ctx)
+ defer profileClose()
showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
+ prepareUserProfileTabData(ctx, showPrivate, profileGitRepo, profileReadmeBlob)
+ // call PrepareContextForProfileBigAvatar later to avoid re-querying the NumFollowers & NumFollowing
+ shared_user.PrepareContextForProfileBigAvatar(ctx)
+ ctx.HTML(http.StatusOK, tplProfile)
+}
- orgs, err := organization.FindOrgs(organization.FindOrgOptions{
- UserID: ctx.ContextUser.ID,
- IncludePrivate: showPrivate,
- })
- if err != nil {
- ctx.ServerError("FindOrgs", err)
- return
- }
-
- ctx.Data["Orgs"] = orgs
- ctx.Data["HasOrgsVisible"] = organization.HasOrgsVisible(orgs, ctx.Doer)
-
- badges, _, err := user_model.GetUserBadges(ctx, ctx.ContextUser)
- if err != nil {
- ctx.ServerError("GetUserBadges", err)
- return
- }
- ctx.Data["Badges"] = badges
-
+func prepareUserProfileTabData(ctx *context.Context, showPrivate bool, profileGitRepo *git.Repository, profileReadme *git.Blob) {
+ // if there is a profile readme, default to "overview" page, otherwise, default to "repositories" page
tab := ctx.FormString("tab")
+ if tab == "" {
+ if profileReadme != nil {
+ tab = "overview"
+ } else {
+ tab = "repositories"
+ }
+ }
ctx.Data["TabName"] = tab
+ ctx.Data["HasProfileReadme"] = profileReadme != nil
page := ctx.FormInt("page")
if page <= 0 {
@@ -154,12 +93,7 @@ func Profile(ctx *context.Context) {
}
pagingNum := setting.UI.User.RepoPagingNum
- if tab == "activity" {
- pagingNum = setting.UI.FeedPagingNum
- }
-
topicOnly := ctx.FormBool("topic")
-
var (
repos []*repo_model.Repository
count int64
@@ -228,6 +162,7 @@ func Profile(ctx *context.Context) {
total = int(count)
case "activity":
date := ctx.FormString("date")
+ pagingNum = setting.UI.FeedPagingNum
items, count, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
RequestedUser: ctx.ContextUser,
Actor: ctx.Doer,
@@ -271,16 +206,6 @@ func Profile(ctx *context.Context) {
}
total = int(count)
- case "projects":
- ctx.Data["OpenProjects"], _, err = project_model.FindProjects(ctx, project_model.SearchOptions{
- Page: -1,
- IsClosed: util.OptionalBoolFalse,
- Type: project_model.TypeIndividual,
- })
- if err != nil {
- ctx.ServerError("GetProjects", err)
- return
- }
case "watching":
repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
ListOptions: db.ListOptions{
@@ -303,7 +228,17 @@ func Profile(ctx *context.Context) {
}
total = int(count)
- default:
+ case "overview":
+ if bytes, err := profileReadme.GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil {
+ log.Error("failed to GetBlobContent: %v", err)
+ } else {
+ if profileContent, err := markdown.RenderString(&markup.RenderContext{Ctx: ctx, GitRepo: profileGitRepo}, bytes); err != nil {
+ log.Error("failed to RenderString: %v", err)
+ } else {
+ ctx.Data["ProfileReadme"] = profileContent
+ }
+ }
+ default: // default to "repositories"
repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
ListOptions: db.ListOptions{
PageSize: pagingNum,
@@ -339,13 +274,6 @@ func Profile(ctx *context.Context) {
pager.AddParam(ctx, "date", "Date")
}
ctx.Data["Page"] = pager
- ctx.Data["IsProjectEnabled"] = true
- ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
- ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
-
- ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail && ctx.ContextUser.Email != "" && ctx.IsSigned && !ctx.ContextUser.KeepEmailPrivate
-
- ctx.HTML(http.StatusOK, tplProfile)
}
// Action response for follow/unfollow user request
diff --git a/services/mirror/mirror_pull.go b/services/mirror/mirror_pull.go
index 53ab632b01c1..51c7de58b645 100644
--- a/services/mirror/mirror_pull.go
+++ b/services/mirror/mirror_pull.go
@@ -307,6 +307,11 @@ func runSync(ctx context.Context, m *repo_model.Mirror) ([]*mirrorSyncResult, bo
return nil, false
}
+ log.Trace("SyncMirrors [repo: %-v]: syncing branches...", m.Repo)
+ if _, err = repo_module.SyncRepoBranchesWithRepo(ctx, m.Repo, gitRepo, 0); err != nil {
+ log.Error("SyncMirrors [repo: %-v]: failed to synchronize branches: %v", m.Repo, err)
+ }
+
log.Trace("SyncMirrors [repo: %-v]: syncing releases with tags...", m.Repo)
if err = repo_module.SyncReleasesWithTags(m.Repo, gitRepo); err != nil {
log.Error("SyncMirrors [repo: %-v]: failed to synchronize tags to releases: %v", m.Repo, err)
diff --git a/services/repository/lfs.go b/services/repository/lfs.go
index aeb808a72f33..0bd4d53a5c4d 100644
--- a/services/repository/lfs.go
+++ b/services/repository/lfs.go
@@ -19,7 +19,7 @@ import (
// GarbageCollectLFSMetaObjectsOptions provides options for GarbageCollectLFSMetaObjects function
type GarbageCollectLFSMetaObjectsOptions struct {
- Logger log.Logger
+ LogDetail func(format string, v ...any)
AutoFix bool
OlderThan time.Time
UpdatedLessRecentlyThan time.Time
@@ -32,10 +32,12 @@ func GarbageCollectLFSMetaObjects(ctx context.Context, opts GarbageCollectLFSMet
log.Trace("Doing: GarbageCollectLFSMetaObjects")
defer log.Trace("Finished: GarbageCollectLFSMetaObjects")
+ if opts.LogDetail == nil {
+ opts.LogDetail = log.Debug
+ }
+
if !setting.LFS.StartServer {
- if opts.Logger != nil {
- opts.Logger.Info("LFS support is disabled")
- }
+ opts.LogDetail("LFS support is disabled")
return nil
}
@@ -54,21 +56,17 @@ func GarbageCollectLFSMetaObjects(ctx context.Context, opts GarbageCollectLFSMet
// GarbageCollectLFSMetaObjectsForRepo garbage collects LFS objects for a specific repository
func GarbageCollectLFSMetaObjectsForRepo(ctx context.Context, repo *repo_model.Repository, opts GarbageCollectLFSMetaObjectsOptions) error {
- if opts.Logger != nil {
- opts.Logger.Info("Checking %-v", repo)
- }
+ opts.LogDetail("Checking %-v", repo)
total, orphaned, collected, deleted := int64(0), 0, 0, 0
- if opts.Logger != nil {
- defer func() {
- if orphaned == 0 {
- opts.Logger.Info("Found %d total LFSMetaObjects in %-v", total, repo)
- } else if !opts.AutoFix {
- opts.Logger.Info("Found %d/%d orphaned LFSMetaObjects in %-v", orphaned, total, repo)
- } else {
- opts.Logger.Info("Collected %d/%d orphaned/%d total LFSMetaObjects in %-v. %d removed from storage.", collected, orphaned, total, repo, deleted)
- }
- }()
- }
+ defer func() {
+ if orphaned == 0 {
+ opts.LogDetail("Found %d total LFSMetaObjects in %-v", total, repo)
+ } else if !opts.AutoFix {
+ opts.LogDetail("Found %d/%d orphaned LFSMetaObjects in %-v", orphaned, total, repo)
+ } else {
+ opts.LogDetail("Collected %d/%d orphaned/%d total LFSMetaObjects in %-v. %d removed from storage.", collected, orphaned, total, repo, deleted)
+ }
+ }()
gitRepo, err := git.OpenRepository(ctx, repo.RepoPath())
if err != nil {
@@ -129,9 +127,7 @@ func GarbageCollectLFSMetaObjectsForRepo(ctx context.Context, repo *repo_model.R
})
if err == errStop {
- if opts.Logger != nil {
- opts.Logger.Info("Processing stopped at %d total LFSMetaObjects in %-v", total, repo)
- }
+ opts.LogDetail("Processing stopped at %d total LFSMetaObjects in %-v", total, repo)
return nil
} else if err != nil {
return err
diff --git a/templates/code/searchcombo.tmpl b/templates/code/searchcombo.tmpl
new file mode 100644
index 000000000000..e495b3b454cd
--- /dev/null
+++ b/templates/code/searchcombo.tmpl
@@ -0,0 +1,17 @@
+{{template "code/searchform" .}}
+
+