diff --git a/models/db/search.go b/models/db/search.go
index aa577f08e0..37565f45e1 100644
--- a/models/db/search.go
+++ b/models/db/search.go
@@ -18,12 +18,6 @@ const (
SearchOrderByRecentUpdated SearchOrderBy = "updated_unix DESC"
SearchOrderByOldest SearchOrderBy = "created_unix ASC"
SearchOrderByNewest SearchOrderBy = "created_unix DESC"
- SearchOrderBySize SearchOrderBy = "size ASC"
- SearchOrderBySizeReverse SearchOrderBy = "size DESC"
- SearchOrderByGitSize SearchOrderBy = "git_size ASC"
- SearchOrderByGitSizeReverse SearchOrderBy = "git_size DESC"
- SearchOrderByLFSSize SearchOrderBy = "lfs_size ASC"
- SearchOrderByLFSSizeReverse SearchOrderBy = "lfs_size DESC"
SearchOrderByID SearchOrderBy = "id ASC"
SearchOrderByIDReverse SearchOrderBy = "id DESC"
SearchOrderByStars SearchOrderBy = "num_stars ASC"
diff --git a/models/issues/pull_list.go b/models/issues/pull_list.go
index 2ba14bd555..368a9f3eca 100644
--- a/models/issues/pull_list.go
+++ b/models/issues/pull_list.go
@@ -193,8 +193,10 @@ func (prs PullRequestList) LoadIssues(ctx context.Context) (IssueList, error) {
return nil, nil
}
- // Load issues.
- issueIDs := prs.GetIssueIDs()
+ // Load issues which are not loaded
+ issueIDs := container.FilterSlice(prs, func(pr *PullRequest) (int64, bool) {
+ return pr.IssueID, pr.Issue == nil && pr.IssueID > 0
+ })
issues := make(map[int64]*Issue, len(issueIDs))
if err := db.GetEngine(ctx).
In("id", issueIDs).
@@ -230,10 +232,7 @@ func (prs PullRequestList) LoadIssues(ctx context.Context) (IssueList, error) {
// GetIssueIDs returns all issue ids
func (prs PullRequestList) GetIssueIDs() []int64 {
return container.FilterSlice(prs, func(pr *PullRequest) (int64, bool) {
- if pr.Issue == nil {
- return pr.IssueID, pr.IssueID > 0
- }
- return 0, false
+ return pr.IssueID, pr.IssueID > 0
})
}
diff --git a/models/repo/repo_list.go b/models/repo/repo_list.go
index eacc98e222..e22d872ae4 100644
--- a/models/repo/repo_list.go
+++ b/models/repo/repo_list.go
@@ -207,31 +207,6 @@ type SearchRepoOptions struct {
OnlyShowRelevant bool
}
-// SearchOrderBy is used to sort the result
-type SearchOrderBy string
-
-func (s SearchOrderBy) String() string {
- return string(s)
-}
-
-// Strings for sorting result
-const (
- SearchOrderByAlphabetically SearchOrderBy = "name ASC"
- SearchOrderByAlphabeticallyReverse SearchOrderBy = "name DESC"
- SearchOrderByLeastUpdated SearchOrderBy = "updated_unix ASC"
- SearchOrderByRecentUpdated SearchOrderBy = "updated_unix DESC"
- SearchOrderByOldest SearchOrderBy = "created_unix ASC"
- SearchOrderByNewest SearchOrderBy = "created_unix DESC"
- SearchOrderBySize SearchOrderBy = "size ASC"
- SearchOrderBySizeReverse SearchOrderBy = "size DESC"
- SearchOrderByID SearchOrderBy = "id ASC"
- SearchOrderByIDReverse SearchOrderBy = "id DESC"
- SearchOrderByStars SearchOrderBy = "num_stars ASC"
- SearchOrderByStarsReverse SearchOrderBy = "num_stars DESC"
- SearchOrderByForks SearchOrderBy = "num_forks ASC"
- SearchOrderByForksReverse SearchOrderBy = "num_forks DESC"
-)
-
// UserOwnedRepoCond returns user ownered repositories
func UserOwnedRepoCond(userID int64) builder.Cond {
return builder.Eq{
diff --git a/models/repo/search.go b/models/repo/search.go
index 54d6dcfb44..c500d41be8 100644
--- a/models/repo/search.go
+++ b/models/repo/search.go
@@ -5,20 +5,72 @@ package repo
import "code.gitea.io/gitea/models/db"
+// Strings for sorting result
+const (
+ // only used for repos
+ SearchOrderByAlphabetically db.SearchOrderBy = "owner_name ASC, name ASC"
+ SearchOrderByAlphabeticallyReverse db.SearchOrderBy = "owner_name DESC, name DESC"
+ SearchOrderBySize db.SearchOrderBy = "size ASC"
+ SearchOrderBySizeReverse db.SearchOrderBy = "size DESC"
+ SearchOrderByGitSize db.SearchOrderBy = "git_size ASC"
+ SearchOrderByGitSizeReverse db.SearchOrderBy = "git_size DESC"
+ SearchOrderByLFSSize db.SearchOrderBy = "lfs_size ASC"
+ SearchOrderByLFSSizeReverse db.SearchOrderBy = "lfs_size DESC"
+ // alias as also used elsewhere
+ SearchOrderByLeastUpdated db.SearchOrderBy = db.SearchOrderByLeastUpdated
+ SearchOrderByRecentUpdated db.SearchOrderBy = db.SearchOrderByRecentUpdated
+ SearchOrderByOldest db.SearchOrderBy = db.SearchOrderByOldest
+ SearchOrderByNewest db.SearchOrderBy = db.SearchOrderByNewest
+ SearchOrderByID db.SearchOrderBy = db.SearchOrderByID
+ SearchOrderByIDReverse db.SearchOrderBy = db.SearchOrderByIDReverse
+ SearchOrderByStars db.SearchOrderBy = db.SearchOrderByStars
+ SearchOrderByStarsReverse db.SearchOrderBy = db.SearchOrderByStarsReverse
+ SearchOrderByForks db.SearchOrderBy = db.SearchOrderByForks
+ SearchOrderByForksReverse db.SearchOrderBy = db.SearchOrderByForksReverse
+)
+
// SearchOrderByMap represents all possible search order
var SearchOrderByMap = map[string]map[string]db.SearchOrderBy{
"asc": {
- "alpha": "owner_name ASC, name ASC",
- "created": db.SearchOrderByOldest,
- "updated": db.SearchOrderByLeastUpdated,
- "size": db.SearchOrderBySize,
- "id": db.SearchOrderByID,
+ "alpha": SearchOrderByAlphabetically,
+ "created": SearchOrderByOldest,
+ "updated": SearchOrderByLeastUpdated,
+ "size": SearchOrderBySize,
+ "git_size": SearchOrderByGitSize,
+ "lfs_size": SearchOrderByLFSSize,
+ "id": SearchOrderByID,
+ "stars": SearchOrderByStars,
+ "forks": SearchOrderByForks,
},
"desc": {
- "alpha": "owner_name DESC, name DESC",
- "created": db.SearchOrderByNewest,
- "updated": db.SearchOrderByRecentUpdated,
- "size": db.SearchOrderBySizeReverse,
- "id": db.SearchOrderByIDReverse,
+ "alpha": SearchOrderByAlphabeticallyReverse,
+ "created": SearchOrderByNewest,
+ "updated": SearchOrderByRecentUpdated,
+ "size": SearchOrderBySizeReverse,
+ "git_size": SearchOrderByGitSizeReverse,
+ "lfs_size": SearchOrderByLFSSizeReverse,
+ "id": SearchOrderByIDReverse,
+ "stars": SearchOrderByStarsReverse,
+ "forks": SearchOrderByForksReverse,
},
}
+
+// SearchOrderByFlatMap is similar to SearchOrderByMap but use human language keywords
+// to decide between asc and desc
+var SearchOrderByFlatMap = map[string]db.SearchOrderBy{
+ "newest": SearchOrderByMap["desc"]["created"],
+ "oldest": SearchOrderByMap["asc"]["created"],
+ "leastupdate": SearchOrderByMap["asc"]["updated"],
+ "reversealphabetically": SearchOrderByMap["desc"]["alpha"],
+ "alphabetically": SearchOrderByMap["asc"]["alpha"],
+ "reversesize": SearchOrderByMap["desc"]["size"],
+ "size": SearchOrderByMap["asc"]["size"],
+ "reversegitsize": SearchOrderByMap["desc"]["git_size"],
+ "gitsize": SearchOrderByMap["asc"]["git_size"],
+ "reverselfssize": SearchOrderByMap["desc"]["lfs_size"],
+ "lfssize": SearchOrderByMap["asc"]["lfs_size"],
+ "moststars": SearchOrderByMap["desc"]["stars"],
+ "feweststars": SearchOrderByMap["asc"]["stars"],
+ "mostforks": SearchOrderByMap["desc"]["forks"],
+ "fewestforks": SearchOrderByMap["asc"]["forks"],
+}
diff --git a/modules/markup/html.go b/modules/markup/html.go
index 8dbc958299..565bc175b7 100644
--- a/modules/markup/html.go
+++ b/modules/markup/html.go
@@ -49,7 +49,7 @@ var (
// hashCurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae
// Although SHA1 hashes are 40 chars long, SHA256 are 64, the regex matches the hash from 7 to 64 chars in length
// so that abbreviated hash links can be used as well. This matches git and GitHub usability.
- hashCurrentPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-f]{7,64})(?:\s|$|\)|\]|[.,](\s|$))`)
+ hashCurrentPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-f]{7,64})(?:\s|$|\)|\]|[.,:](\s|$))`)
// shortLinkPattern matches short but difficult to parse [[name|link|arg=test]] syntax
shortLinkPattern = regexp.MustCompile(`\[\[(.*?)\]\](\w*)`)
diff --git a/modules/markup/html_internal_test.go b/modules/markup/html_internal_test.go
index 9aa9c22d70..74089cffdd 100644
--- a/modules/markup/html_internal_test.go
+++ b/modules/markup/html_internal_test.go
@@ -380,6 +380,7 @@ func TestRegExp_sha1CurrentPattern(t *testing.T) {
"(abcdefabcdefabcdefabcdefabcdefabcdefabcd)",
"[abcdefabcdefabcdefabcdefabcdefabcdefabcd]",
"abcdefabcdefabcdefabcdefabcdefabcdefabcd.",
+ "abcdefabcdefabcdefabcdefabcdefabcdefabcd:",
}
falseTestCases := []string{
"test",
diff --git a/modules/markup/markdown/prefixed_id.go b/modules/markup/markdown/prefixed_id.go
index 9c60949202..63d7fadc0a 100644
--- a/modules/markup/markdown/prefixed_id.go
+++ b/modules/markup/markdown/prefixed_id.go
@@ -9,9 +9,9 @@ import (
"code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/markup/common"
+ "code.gitea.io/gitea/modules/util"
"github.com/yuin/goldmark/ast"
- "github.com/yuin/goldmark/util"
)
type prefixedIDs struct {
@@ -36,7 +36,7 @@ func (p *prefixedIDs) GenerateWithDefault(value, dft []byte) []byte {
if !bytes.HasPrefix(result, []byte("user-content-")) {
result = append([]byte("user-content-"), result...)
}
- if p.values.Add(util.BytesToReadOnlyString(result)) {
+ if p.values.Add(util.UnsafeBytesToString(result)) {
return result
}
for i := 1; ; i++ {
@@ -49,7 +49,7 @@ func (p *prefixedIDs) GenerateWithDefault(value, dft []byte) []byte {
// Put puts a given element id to the used ids table.
func (p *prefixedIDs) Put(value []byte) {
- p.values.Add(util.BytesToReadOnlyString(value))
+ p.values.Add(util.UnsafeBytesToString(value))
}
func newPrefixedIDs() *prefixedIDs {
diff --git a/modules/markup/markdown/transform_heading.go b/modules/markup/markdown/transform_heading.go
index 6f38abfad9..6d48f34d93 100644
--- a/modules/markup/markdown/transform_heading.go
+++ b/modules/markup/markdown/transform_heading.go
@@ -7,10 +7,10 @@ import (
"fmt"
"code.gitea.io/gitea/modules/markup"
+ "code.gitea.io/gitea/modules/util"
"github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/text"
- "github.com/yuin/goldmark/util"
)
func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Heading, reader text.Reader, tocList *[]markup.Header) {
@@ -21,11 +21,11 @@ func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Headin
}
txt := v.Text(reader.Source())
header := markup.Header{
- Text: util.BytesToReadOnlyString(txt),
+ Text: util.UnsafeBytesToString(txt),
Level: v.Level,
}
if id, found := v.AttributeString("id"); found {
- header.ID = util.BytesToReadOnlyString(id.([]byte))
+ header.ID = util.UnsafeBytesToString(id.([]byte))
}
*tocList = append(*tocList, header)
g.applyElementDir(v)
diff --git a/modules/references/references.go b/modules/references/references.go
index 1b656ed4cb..2889430bcf 100644
--- a/modules/references/references.go
+++ b/modules/references/references.go
@@ -14,8 +14,7 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup/mdstripper"
"code.gitea.io/gitea/modules/setting"
-
- "github.com/yuin/goldmark/util"
+ "code.gitea.io/gitea/modules/util"
)
var (
@@ -341,7 +340,7 @@ func FindRenderizableReferenceNumeric(content string, prOnly, crossLinkOnly bool
return false, nil
}
}
- r := getCrossReference(util.StringToReadOnlyBytes(content), match[2], match[3], false, prOnly)
+ r := getCrossReference(util.UnsafeStringToBytes(content), match[2], match[3], false, prOnly)
if r == nil {
return false, nil
}
diff --git a/modules/system/db.go b/modules/system/db.go
index 05e9de0ae8..17178283d9 100644
--- a/modules/system/db.go
+++ b/modules/system/db.go
@@ -8,8 +8,7 @@ import (
"code.gitea.io/gitea/models/system"
"code.gitea.io/gitea/modules/json"
-
- "github.com/yuin/goldmark/util"
+ "code.gitea.io/gitea/modules/util"
)
// DBStore can be used to store app state items in local filesystem
@@ -24,7 +23,7 @@ func (f *DBStore) Get(ctx context.Context, item StateItem) error {
if content == "" {
return nil
}
- return json.Unmarshal(util.StringToReadOnlyBytes(content), item)
+ return json.Unmarshal(util.UnsafeStringToBytes(content), item)
}
// Set saves the state item
@@ -33,5 +32,5 @@ func (f *DBStore) Set(ctx context.Context, item StateItem) error {
if err != nil {
return err
}
- return system.SaveAppStateContent(ctx, item.Name(), util.BytesToReadOnlyString(b))
+ return system.SaveAppStateContent(ctx, item.Name(), util.UnsafeBytesToString(b))
}
diff --git a/modules/util/sanitize.go b/modules/util/sanitize.go
index f1ea2574f1..0dd8b342a2 100644
--- a/modules/util/sanitize.go
+++ b/modules/util/sanitize.go
@@ -6,8 +6,6 @@ package util
import (
"bytes"
"unicode"
-
- "github.com/yuin/goldmark/util"
)
type sanitizedError struct {
@@ -33,7 +31,7 @@ var schemeSep = []byte("://")
// SanitizeCredentialURLs remove all credentials in URLs (starting with "scheme://") for the input string: "https://user:pass@domain.com" => "https://sanitized-credential@domain.com"
func SanitizeCredentialURLs(s string) string {
- bs := util.StringToReadOnlyBytes(s)
+ bs := UnsafeStringToBytes(s)
schemeSepPos := bytes.Index(bs, schemeSep)
if schemeSepPos == -1 || bytes.IndexByte(bs[schemeSepPos:], '@') == -1 {
return s // fast return if there is no URL scheme or no userinfo
@@ -70,5 +68,5 @@ func SanitizeCredentialURLs(s string) string {
schemeSepPos = bytes.Index(bs, schemeSep)
}
out = append(out, bs...)
- return util.BytesToReadOnlyString(out)
+ return UnsafeBytesToString(out)
}
diff --git a/modules/util/string.go b/modules/util/string.go
index 2cf44d29b1..cf50f591c6 100644
--- a/modules/util/string.go
+++ b/modules/util/string.go
@@ -87,11 +87,11 @@ func ToSnakeCase(input string) string {
}
// UnsafeBytesToString uses Go's unsafe package to convert a byte slice to a string.
-// TODO: replace all "goldmark/util.BytesToReadOnlyString" with this official approach
func UnsafeBytesToString(b []byte) string {
return unsafe.String(unsafe.SliceData(b), len(b))
}
+// UnsafeStringToBytes uses Go's unsafe package to convert a string to a byte slice.
func UnsafeStringToBytes(s string) []byte {
return unsafe.Slice(unsafe.StringData(s), len(s))
}
diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini
index acc0d0bc27..4cbac49ddc 100644
--- a/options/locale/locale_cs-CZ.ini
+++ b/options/locale/locale_cs-CZ.ini
@@ -164,6 +164,8 @@ search=Hledat...
type_tooltip=Druh vyhledávání
fuzzy=Fuzzy
fuzzy_tooltip=Zahrnout výsledky, které také úzce odpovídají hledanému výrazu
+exact=Přesně
+exact_tooltip=Zahrnout pouze výsledky, které přesně odpovídají hledanému výrazu
repo_kind=Hledat repozitáře...
user_kind=Hledat uživatele...
org_kind=Hledat organizace...
@@ -177,6 +179,8 @@ branch_kind=Hledat větve...
commit_kind=Hledat commity...
runner_kind=Hledat runnery...
no_results=Nebyly nalezeny žádné odpovídající výsledky.
+issue_kind=Hledat úkoly...
+pull_kind=Hledat pull request...
keyword_search_unavailable=Hledání podle klíčového slova není momentálně dostupné. Obraťte se na správce webu.
[aria]
@@ -432,6 +436,7 @@ oauth_signin_submit=Propojit účet
oauth.signin.error=Došlo k chybě při zpracování žádosti o autorizaci. Pokud tato chyba přetrvává, obraťte se na správce webu.
oauth.signin.error.access_denied=Žádost o autorizaci byla zamítnuta.
oauth.signin.error.temporarily_unavailable=Autorizace se nezdařila, protože ověřovací server je dočasně nedostupný. Opakujte akci později.
+oauth_callback_unable_auto_reg=Automatická registrace je povolena, ale OAuth2 poskytovatel %[1]s vrátil chybějící pole: %[2]s, nelze vytvořit účet automaticky, vytvořte účet nebo se připojte k účtu, nebo kontaktujte správce webu.
openid_connect_submit=Připojit
openid_connect_title=Připojení k existujícímu účtu
openid_connect_desc=Zvolené OpenID URI není známé. Přidružte nový účet zde.
@@ -712,8 +717,9 @@ cancel=Zrušit
language=Jazyk
ui=Motiv vzhledu
hidden_comment_types=Skryté typy komentářů
+hidden_comment_types_description=Zde zaškrtnuté typy komentářů nebudou zobrazeny na stránkách úkolů. Zaškrtnutím položky „Štítek“ například odstraní všechny komentáře „{uživatel} přidal/odstranil {štítek}“.
hidden_comment_types.ref_tooltip=Komentáře, na které se odkazovalo z jiného úkolu/commitu/…
-hidden_comment_types.issue_ref_tooltip=Komentáře, kde uživatel změní větev/značku spojenou s problémem
+hidden_comment_types.issue_ref_tooltip=Komentáře, kde uživatel změní větev/značku spojenou s úkolem
comment_type_group_reference=Reference
comment_type_group_label=Štítek
comment_type_group_milestone=Milník
@@ -758,6 +764,8 @@ manage_themes=Vyberte výchozí motiv vzhledu
manage_openid=Správa OpenID adres
email_desc=Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla, a pokud není skrytá, pro operace Gitu.
theme_desc=Toto bude váš výchozí motiv vzhledu napříč stránkou.
+theme_colorblindness_help=Podpora šablony pro barvoslepost
+theme_colorblindness_prompt=Gitea právě získala některé motivy se základní podporou barvosleposti, které mají pouze několik barev. Práce stále probíhá. Další vylepšení by bylo možné provést definováním více barev v CSS souborů.
primary=Hlavní
activated=Aktivován
requires_activation=Vyžaduje aktivaci
@@ -882,6 +890,7 @@ repo_and_org_access=Repozitář a přístup organizace
permissions_public_only=Pouze veřejnost
permissions_access_all=Vše (veřejné, soukromé a omezené)
select_permissions=Vyberte oprávnění
+permission_not_set=Není nastaveno
permission_no_access=Bez přístupu
permission_read=Přečtené
permission_write=čtení i zápis
@@ -1061,6 +1070,7 @@ watchers=Sledující
stargazers=Sledující
stars_remove_warning=Tímto odstraníte všechny hvězdičky z tohoto repozitáře.
forks=Rozštěpení
+stars=Oblíbené
reactions_more=a %d dalších
unit_disabled=Správce webu zakázal tuto sekci repozitáře.
language_other=Jiný
@@ -1108,7 +1118,7 @@ template.one_item=Musíte vybrat alespoň jednu položku šablony
template.invalid=Musíte vybrat repositář šablony
archive.title=Tento repozitář je archivovaný. Můžete prohlížet soubory, klonovat, ale nemůžete nahrávat a vytvářet nové úkoly nebo pull requesty.
-archive.title_date=Tento repositář byl archivován %s. Můžete zobrazit soubory a klonovat je, ale nemůžete nahrávat ani otevírat problémy nebo pull requesty.
+archive.title_date=Tento repositář byl archivován %s. Můžete zobrazit soubory a klonovat je, ale nemůžete nahrávat ani otevírat úkoly nebo pull requesty.
archive.issue.nocomment=Tento repozitář je archivovaný. Nemůžete komentovat úkoly.
archive.pull.nocomment=Tento repozitář je archivovaný. Nemůžete komentovat pull requesty.
@@ -1228,6 +1238,8 @@ file_view_rendered=Zobrazit vykreslené
file_view_raw=Zobrazit v surovém stavu
file_permalink=Trvalý odkaz
file_too_large=Soubor je příliš velký pro zobrazení.
+code_preview_line_from_to=Řádky %[1]d do%[2]d v %[3]s
+code_preview_line_in=Řádek %[1]d v %[2]s
invisible_runes_header=`Tento soubor obsahuje neviditelné znaky Unicode`
invisible_runes_description=`Tento soubor obsahuje neviditelné Unicode znaky, které jsou pro člověka nerozeznatelné, ale mohou být zpracovány jiným způsobem. Pokud si myslíte, že je to záměrné, můžete toto varování bezpečně ignorovat. Použijte tlačítko Escape sekvence k jejich zobrazení.`
ambiguous_runes_header=`Tento soubor obsahuje nejednoznačné znaky Unicode`
@@ -1282,6 +1294,7 @@ editor.or=nebo
editor.cancel_lower=Zrušit
editor.commit_signed_changes=Odevzdat podepsané změny
editor.commit_changes=Odevzdat změny
+editor.add_tmpl=Přidán „{nazev_souboru}“
editor.add=Přidat %s
editor.update=Aktualizovat %s
editor.delete=Odstranit %s
@@ -1364,6 +1377,7 @@ commitstatus.success=Úspěch
ext_issues=Přístup k externím úkolům
ext_issues.desc=Odkaz na externí systém úkolů.
+projects.desc=Spravujte úkoly a pull requesty v projektech.
projects.description=Popis (volitelné)
projects.description_placeholder=Popis
projects.create=Vytvořit projekt
@@ -1391,6 +1405,7 @@ projects.column.new=Nový sloupec
projects.column.set_default=Nastavit jako výchozí
projects.column.set_default_desc=Nastavit tento sloupec jako výchozí pro nekategorizované úkoly a požadavky na natažení
projects.column.delete=Smazat sloupec
+projects.column.deletion_desc=Smazání sloupce projektu přesune všechny související úkoly do výchozího sloupce. Pokračovat?
projects.column.color=Barva
projects.open=Otevřít
projects.close=Zavřít
@@ -1426,6 +1441,7 @@ issues.new.clear_assignees=Smazat zpracovatele
issues.new.no_assignees=Bez zpracovatelů
issues.new.no_reviewers=Žádní posuzovatelé
issues.new.blocked_user=Nemůžete vytvořit úkol, protože jste zablokováni zadavatelem příspěvku nebo vlastníkem repozitáře.
+issues.edit.already_changed=Nelze uložit změny v úkolu. Zdá se, že obsah byl již změněn jiným uživatelem. Aktualizujte stránku a zkuste ji znovu problém upravit, abyste se vyhnuli přepsání jejich změn
issues.edit.blocked_user=Nemůžete upravovat obsah, protože jste zablokováni zadavatelem příspěvku nebo vlastníkem repozitáře.
issues.choose.get_started=Začínáme
issues.choose.open_external_link=Otevřít
@@ -1433,7 +1449,7 @@ issues.choose.blank=Výchozí
issues.choose.blank_about=Vytvořit úkol z výchozí šablony.
issues.choose.ignore_invalid_templates=Neplatné šablony byly ignorovány
issues.choose.invalid_templates=%v nalezených neplatných šablon
-issues.choose.invalid_config=Nastavení problému obsahuje chyby:
+issues.choose.invalid_config=Nastavení úkolu obsahuje chyby:
issues.no_ref=Není určena žádná větev/značka
issues.create=Vytvořit úkol
issues.new_label=Nový štítek
@@ -1534,10 +1550,12 @@ issues.context.reference_issue=Odkázat v novém úkolu
issues.context.edit=Upravit
issues.context.delete=Smazat
issues.no_content=K dispozici není žádný popis.
-issues.close=Zavřít problém
+issues.close=Zavřít úkol
issues.comment_pull_merged_at=sloučený commit %[1]s do %[2]s %[3]s
issues.comment_manually_pull_merged_at=ručně sloučený commit %[1]s do %[2]s %[3]s
+issues.close_comment_issue=Okomentovat a zavřít
issues.reopen_issue=Znovuotevřít
+issues.reopen_comment_issue=Znovu otevřít s komentářem
issues.create_comment=Okomentovat
issues.comment.blocked_user=Nemůžete vytvořit nebo upravovat komentář, protože jste zablokováni zadavatelem příspěvku nebo vlastníkem repozitáře.
issues.closed_at=`uzavřel/a tento úkol %[2]s`
@@ -1598,7 +1616,7 @@ issues.attachment.open_tab=`Klikněte pro zobrazení „%s“ v nové záložce`
issues.attachment.download=`Klikněte pro stažení „%s“`
issues.subscribe=Odebírat
issues.unsubscribe=Zrušit odběr
-issues.unpin_issue=Odepnout problém
+issues.unpin_issue=Odepnout úkol
issues.max_pinned=Nemůžete připnout další úkoly
issues.pin_comment=připnuto %s
issues.unpin_comment=odepnul/a tento %s
@@ -1657,7 +1675,7 @@ issues.due_date_form=rrrr-mm-dd
issues.due_date_form_add=Přidat termín dokončení
issues.due_date_form_edit=Upravit
issues.due_date_form_remove=Odstranit
-issues.due_date_not_writer=Potřebujete přístup k zápisu do tohoto repozitáře, abyste mohli aktualizovat datum dokončení problému.
+issues.due_date_not_writer=Potřebujete přístup k zápisu do tohoto repozitáře, abyste mohli aktualizovat datum dokončení úkolu.
issues.due_date_not_set=Žádný termín dokončení.
issues.due_date_added=přidal/a termín dokončení %s %s
issues.due_date_modified=upravil/a termín termínu z %[2]s na %[1]s %[3]s
@@ -1739,6 +1757,7 @@ compare.compare_head=porovnat
pulls.desc=Povolit pull requesty a posuzování kódu.
pulls.new=Nový pull request
pulls.new.blocked_user=Nemůžete vytvořit pull request, protože jste zablokování vlastníkem repozitáře.
+pulls.edit.already_changed=Nelze uložit změny v pull requestu. Zdá se, že obsah byl již změněn jiným uživatelem. Aktualizujte stránku a zkuste znovu komentář upravit, abyste se vyhnuli přepsání jejich změn
pulls.view=Zobrazit pull request
pulls.compare_changes=Nový pull request
pulls.allow_edits_from_maintainers=Povolit úpravy od správců
@@ -1858,6 +1877,7 @@ pulls.close=Zavřít pull request
pulls.closed_at=`uzavřel/a tento pull request %[2]s`
pulls.reopened_at=`znovuotevřel/a tento pull request %[2]s`
pulls.cmd_instruction_hint=`Zobrazit instrukce příkazové řádky.`
+pulls.cmd_instruction_checkout_title=Checkout
pulls.cmd_instruction_checkout_desc=Z vašeho repositáře projektu se podívejte na novou větev a vyzkoušejte změny.
pulls.cmd_instruction_merge_title=Sloučit
pulls.cmd_instruction_merge_desc=Slučte změny a aktualizujte je na Gitea.
@@ -1883,6 +1903,7 @@ pulls.recently_pushed_new_branches=Nahráli jste větev %[1]s %
pull.deleted_branch=(odstraněno):%s
+comments.edit.already_changed=Nelze uložit změny v komentáři. Zdá se, že obsah byl již změněn jiným uživatelem. Aktualizujte stránku a zkuste znovu komentář upravit, abyste se vyhnuli přepsání jejich změn
milestones.new=Nový milník
milestones.closed=Zavřen dne %s
@@ -1959,6 +1980,7 @@ wiki.page_name_desc=Zadejte název této Wiki stránky. Některé speciální n
wiki.original_git_entry_tooltip=Zobrazit originální Git soubor namísto použití přátelského odkazu.
activity=Aktivita
+activity.navbar.pulse=Pulz
activity.navbar.code_frequency=Frekvence kódu
activity.navbar.contributors=Přispěvatelé
activity.navbar.recent_commits=Nedávné commity
@@ -2052,6 +2074,7 @@ settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=Právě t
settings.mirror_settings.docs.disabled_push_mirror.info=Push zrcadla byla zakázána administrátorem vašeho webu.
settings.mirror_settings.docs.no_new_mirrors=Váš repozitář zrcadlí změny do nebo z jiného repozitáře. Mějte prosím na paměti, že v tuto chvíli nemůžete vytvořit žádná nová zrcadla.
settings.mirror_settings.docs.can_still_use=I když nemůžete upravit stávající zrcadla nebo vytvořit nová, stále můžete použít své stávající zrcadlo.
+settings.mirror_settings.docs.pull_mirror_instructions=Chcete-li nastavit zrcadlo pro natažení, konzultujte prosím:
settings.mirror_settings.docs.more_information_if_disabled=Více informací o zrcadlech pro nahrání a natažení naleznete zde:
settings.mirror_settings.docs.doc_link_title=Jak mohu zrcadlit repozitáře?
settings.mirror_settings.docs.doc_link_pull_section=sekci "stahovat ze vzdáleného úložiště" v dokumentaci.
@@ -2079,6 +2102,7 @@ settings.advanced_settings=Pokročilá nastavení
settings.wiki_desc=Povolit Wiki repozitáře
settings.use_internal_wiki=Používat vestavěnou Wiki
settings.default_wiki_branch_name=Výchozí název větve Wiki
+settings.default_wiki_everyone_access=Výchozí přístupová práva pro přihlášené uživatele:
settings.failed_to_change_default_wiki_branch=Změna výchozí větve wiki se nezdařila.
settings.use_external_wiki=Používat externí Wiki
settings.external_wiki_url=URL externí Wiki
@@ -2760,6 +2784,7 @@ teams.invite.by=Pozvání od %s
teams.invite.description=Pro připojení k týmu klikněte na tlačítko níže.
[admin]
+maintenance=Údržba
dashboard=Přehled
self_check=Samokontrola
identity_access=Identita a přístup
@@ -2782,6 +2807,7 @@ settings=Nastavení správce
dashboard.new_version_hint=Gitea %s je nyní k dispozici, právě u vás běži %s. Podívej se na blogu pro více informací.
dashboard.statistic=Souhrn
+dashboard.maintenance_operations=Operace údržby
dashboard.system_status=Status systému
dashboard.operation_name=Název operace
dashboard.operation_switch=Přepnout
@@ -3067,12 +3093,14 @@ auths.tips=Tipy
auths.tips.oauth2.general=Ověřování OAuth2
auths.tips.oauth2.general.tip=Při registraci nové OAuth2 autentizace by URL callbacku/přesměrování měla být:
auths.tip.oauth2_provider=Poskytovatel OAuth2
+auths.tip.bitbucket=Vytvořte nového OAuth konzumenta na https://bitbucket.org/account/user/{vase-uzivatelske-jmeno}/oauth-consumers/new a přidejte oprávnění „Account“ - „Read“
auths.tip.nextcloud=Zaregistrujte nového OAuth konzumenta na vaší instanci pomocí následujícího menu „Nastavení -> Zabezpečení -> OAuth 2.0 klient“
auths.tip.dropbox=Vytvořte novou aplikaci na https://www.dropbox.com/developers/apps
auths.tip.facebook=Registrujte novou aplikaci na https://developers.facebook.com/apps a přidejte produkt „Facebook Login“
auths.tip.github=Registrujte novou OAuth aplikaci na https://github.com/settings/applications/new
auths.tip.gitlab_new=Zaregistrujte novou aplikaci na https://gitlab.com/-/profile/applications
auths.tip.google_plus=Získejte klientské pověření OAuth2 z Google API konzole na https://console.developers.google.com/
+auths.tip.openid_connect=Použijte OpenID Connect URL pro objevování spojení „https://{server}/.well-known/openid-configuration“ k nastavení koncových bodů
auths.tip.twitter=Jděte na https://dev.twitter.com/apps, vytvořte aplikaci a ujistěte se, že volba „Allow this application to be used to Sign in with Twitter“ je povolená
auths.tip.discord=Registrujte novou aplikaci na https://discordapp.com/developers/applications/me
auths.tip.gitea=Registrovat novou Oauth2 aplikaci. Návod naleznete na https://docs.gitea.com/development/oauth2-provider
@@ -3285,11 +3313,13 @@ notices.op=Akce
notices.delete_success=Systémové upozornění bylo smazáno.
self_check.no_problem_found=Zatím nebyl nalezen žádný problém.
+self_check.startup_warnings=Upozornění při spuštění:
self_check.database_collation_mismatch=Očekávejte, že databáze použije collation: %s
self_check.database_collation_case_insensitive=Databáze používá collation %s, což je collation nerozlišující velká a malá písmena. Ačkoli s ní Gitea může pracovat, mohou se vyskytnout vzácné případy, kdy nebude fungovat podle očekávání.
self_check.database_inconsistent_collation_columns=Databáze používá collation %s, ale tyto sloupce používají chybné collation. To může způsobit neočekávané problémy.
self_check.database_fix_mysql=Pro uživatele MySQL/MariaDB můžete použít příkaz "gitea doctor convert", který opraví problémy s collation, nebo můžete také problém vyřešit příkazem "ALTER ... COLLATE ..." SQL ručně.
self_check.database_fix_mssql=Uživatelé MSSQL mohou problém vyřešit pouze pomocí příkazu "ALTER ... COLLATE ..." SQL ručně.
+self_check.location_origin_mismatch=Aktuální URL (%[1]s) se neshoduje s URL viditelnou pro Gitea (%[2]s). Pokud používáte reverzní proxy, ujistěte se, že hlavičky „Host“ a „X-Forwarded-Proto“ jsou nastaveny správně.
[action]
create_repo=vytvořil/a repozitář %s
@@ -3301,7 +3331,7 @@ reopen_issue=`znovuotevřel/a úkol %[3]s#%[2]s`
create_pull_request=`vytvořil/a pull request %[3]s#%[2]s`
close_pull_request=`uzavřel/a pull request %[3]s#%[2]s`
reopen_pull_request=`znovuotevřel/a pull request %[3]s#%[2]s`
-comment_issue=`okomentoval/a problém %[3]s#%[2]s`
+comment_issue=`okomentoval/a úkol %[3]s#%[2]s`
comment_pull=`okomentoval/a pull request %[3]s#%[2]s`
merge_pull_request=`sloučil/a pull request %[3]s#%[2]s`
auto_merge_pull_request=`automaticky sloučen pull request %[3]s#%[2]s`
@@ -3317,6 +3347,7 @@ mirror_sync_create=synchronizoval/a novou referenci %[3]s do
mirror_sync_delete=synchronizoval/a a smazal/a referenci %[2]s v %[3]s ze zrcadla
approve_pull_request=`schválil/a %[3]s#%[2]s`
reject_pull_request=`navrhl/a změny pro %[3]s#%[2]s`
+publish_release=`vydal/a "%[4]s" v %[3]s`
review_dismissed=`zamítl/a posouzení z %[4]s pro %[3]s#%[2]s`
review_dismissed_reason=Důvod:
create_branch=vytvořil/a větev %[3]s v %[4]s
@@ -3383,6 +3414,7 @@ error.unit_not_allowed=Nejste oprávněni přistupovat k této části repozitá
title=Balíčky
desc=Správa balíčků repozitáře.
empty=Zatím nejsou žádné balíčky.
+no_metadata=Žádná metadata.
empty.documentation=Další informace o registru balíčků naleznete v dokumentaci.
empty.repo=Nahráli jste balíček, ale nezobrazil se zde? Přejděte na nastavení balíčku a propojte jej s tímto repozitářem.
registry.documentation=Další informace o registru %s naleznete v dokumentaci.
@@ -3464,6 +3496,7 @@ npm.install=Pro instalaci balíčku pomocí npm spusťte následující příkaz
npm.install2=nebo ho přidejte do souboru package.json:
npm.dependencies=Závislosti
npm.dependencies.development=Vývojové závislosti
+npm.dependencies.bundle=Vnitřní závislosti
npm.dependencies.peer=Vzájemné závislosti
npm.dependencies.optional=Volitelné závislosti
npm.details.tag=Značka
@@ -3601,6 +3634,7 @@ runs.pushed_by=náhrán
runs.invalid_workflow_helper=Konfigurační soubor pracovního postupu je neplatný. Zkontrolujte prosím konfigurační soubor: %s
runs.no_matching_online_runner_helper=Žádný odpovídající online runner s popiskem: %s
runs.no_job_without_needs=Pracovní postup musí obsahovat alespoň jednu úlohu bez závislostí.
+runs.no_job=Pracovní postup musí obsahovat alespoň jednu úlohu
runs.actor=Aktér
runs.status=Status
runs.actors_no_select=Všichni aktéři
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 539715b3f9..fbada5472c 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -1238,6 +1238,7 @@ file_view_rendered = View Rendered
file_view_raw = View Raw
file_permalink = Permalink
file_too_large = The file is too large to be shown.
+file_is_empty = The file is empty.
code_preview_line_from_to = Lines %[1]d to %[2]d in %[3]s
code_preview_line_in = Line %[1]d in %[2]s
invisible_runes_header = `This file contains invisible Unicode characters`
diff --git a/routers/api/actions/artifacts_chunks.go b/routers/api/actions/artifacts_chunks.go
index bba8ec5f94..3d1a3891d9 100644
--- a/routers/api/actions/artifacts_chunks.go
+++ b/routers/api/actions/artifacts_chunks.go
@@ -39,7 +39,7 @@ func saveUploadChunkBase(st storage.ObjectStorage, ctx *ArtifactContext,
r = io.TeeReader(r, hasher)
}
// save chunk to storage
- writtenSize, err := st.Save(storagePath, r, -1)
+ writtenSize, err := st.Save(storagePath, r, contentSize)
if err != nil {
return -1, fmt.Errorf("save chunk to storage error: %v", err)
}
@@ -208,7 +208,7 @@ func mergeChunksForArtifact(ctx *ArtifactContext, chunks []*chunkFileItem, st st
// save merged file
storagePath := fmt.Sprintf("%d/%d/%d.%s", artifact.RunID%255, artifact.ID%255, time.Now().UnixNano(), extension)
- written, err := st.Save(storagePath, mergedReader, -1)
+ written, err := st.Save(storagePath, mergedReader, artifact.FileCompressedSize)
if err != nil {
return fmt.Errorf("save merged file error: %v", err)
}
diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go
index 594f2d86f6..9ba5887525 100644
--- a/routers/api/v1/repo/repo.go
+++ b/routers/api/v1/repo/repo.go
@@ -107,7 +107,7 @@ func Search(ctx *context.APIContext) {
// - name: sort
// in: query
// description: sort repos by attribute. Supported values are
- // "alpha", "created", "updated", "size", and "id".
+ // "alpha", "created", "updated", "size", "git_size", "lfs_size", "stars", "forks" and "id".
// Default is "alpha"
// type: string
// - name: order
diff --git a/routers/web/explore/repo.go b/routers/web/explore/repo.go
index 66477a255c..22b1fc5bf9 100644
--- a/routers/web/explore/repo.go
+++ b/routers/web/explore/repo.go
@@ -6,6 +6,7 @@ package explore
import (
"fmt"
"net/http"
+ "strings"
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
@@ -57,47 +58,18 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
orderBy db.SearchOrderBy
)
- sortOrder := ctx.FormString("sort")
+ sortOrder := strings.ToLower(ctx.FormString("sort"))
if sortOrder == "" {
sortOrder = setting.UI.ExploreDefaultSort
}
- ctx.Data["SortType"] = sortOrder
- switch sortOrder {
- case "newest":
- orderBy = db.SearchOrderByNewest
- case "oldest":
- orderBy = db.SearchOrderByOldest
- case "leastupdate":
- orderBy = db.SearchOrderByLeastUpdated
- case "reversealphabetically":
- orderBy = db.SearchOrderByAlphabeticallyReverse
- case "alphabetically":
- orderBy = db.SearchOrderByAlphabetically
- case "reversesize":
- orderBy = db.SearchOrderBySizeReverse
- case "size":
- orderBy = db.SearchOrderBySize
- case "reversegitsize":
- orderBy = db.SearchOrderByGitSizeReverse
- case "gitsize":
- orderBy = db.SearchOrderByGitSize
- case "reverselfssize":
- orderBy = db.SearchOrderByLFSSizeReverse
- case "lfssize":
- orderBy = db.SearchOrderByLFSSize
- case "moststars":
- orderBy = db.SearchOrderByStarsReverse
- case "feweststars":
- orderBy = db.SearchOrderByStars
- case "mostforks":
- orderBy = db.SearchOrderByForksReverse
- case "fewestforks":
- orderBy = db.SearchOrderByForks
- default:
- ctx.Data["SortType"] = "recentupdate"
+ if order, ok := repo_model.SearchOrderByFlatMap[sortOrder]; ok {
+ orderBy = order
+ } else {
+ sortOrder = "recentupdate"
orderBy = db.SearchOrderByRecentUpdated
}
+ ctx.Data["SortType"] = sortOrder
keyword := ctx.FormTrim("q")
diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go
index 1887e4d95d..3e76ea6df4 100644
--- a/routers/web/repo/blame.go
+++ b/routers/web/repo/blame.go
@@ -99,8 +99,6 @@ func RefBlame(ctx *context.Context) {
}
ctx.Data["NumLines"], err = blob.GetBlobLineCount()
- ctx.Data["NumLinesSet"] = true
-
if err != nil {
ctx.NotFound("GetBlobLineCount", err)
return
diff --git a/routers/web/repo/setting/lfs.go b/routers/web/repo/setting/lfs.go
index 6dddade066..2891556d6f 100644
--- a/routers/web/repo/setting/lfs.go
+++ b/routers/web/repo/setting/lfs.go
@@ -303,6 +303,7 @@ func LFSFileGet(ctx *context.Context) {
rd := charset.ToUTF8WithFallbackReader(io.MultiReader(bytes.NewReader(buf), dataRc), charset.ConvertOpts{})
// Building code view blocks with line number on server side.
+ // FIXME: the logic is not right here: it first calls EscapeControlReader then calls HTMLEscapeString: double-escaping
escapedContent := &bytes.Buffer{}
ctx.Data["EscapeStatus"], _ = charset.EscapeControlReader(rd, escapedContent, ctx.Locale)
diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go
index 386ef7be5c..0aa3fe1efd 100644
--- a/routers/web/repo/view.go
+++ b/routers/web/repo/view.go
@@ -286,6 +286,7 @@ func renderReadmeFile(ctx *context.Context, subfolder string, readmeFile *git.Tr
ctx.Data["FileIsText"] = fInfo.isTextFile
ctx.Data["FileName"] = path.Join(subfolder, readmeFile.Name())
+ ctx.Data["FileSize"] = fInfo.fileSize
ctx.Data["IsLFSFile"] = fInfo.isLFSFile
if fInfo.isLFSFile {
@@ -301,7 +302,6 @@ func renderReadmeFile(ctx *context.Context, subfolder string, readmeFile *git.Tr
// Pretend that this is a normal text file to display 'This file is too large to be shown'
ctx.Data["IsFileTooLarge"] = true
ctx.Data["IsTextFile"] = true
- ctx.Data["FileSize"] = fInfo.fileSize
return
}
@@ -552,7 +552,6 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
} else {
ctx.Data["NumLines"] = bytes.Count(buf, []byte{'\n'}) + 1
}
- ctx.Data["NumLinesSet"] = true
language, err := files_service.TryGetContentLanguage(ctx.Repo.GitRepo, ctx.Repo.CommitID, ctx.Repo.TreePath)
if err != nil {
@@ -606,8 +605,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
break
}
- // TODO: this logic seems strange, it duplicates with "isRepresentableAsText=true", it is not the same as "LFSFileGet" in "lfs.go"
- // maybe for this case, the file is a binary file, and shouldn't be rendered?
+ // TODO: this logic duplicates with "isRepresentableAsText=true", it is not the same as "LFSFileGet" in "lfs.go"
+ // It is used by "external renders", markupRender will execute external programs to get rendered content.
if markupType := markup.Type(blob.Name()); markupType != "" {
rd := io.MultiReader(bytes.NewReader(buf), dataRc)
ctx.Data["IsMarkup"] = true
diff --git a/templates/base/head_navbar.tmpl b/templates/base/head_navbar.tmpl
index 2b52247303..4889924819 100644
--- a/templates/base/head_navbar.tmpl
+++ b/templates/base/head_navbar.tmpl
@@ -4,7 +4,7 @@
{{end}}