Merge branch 'feat-32257-add-comments-unchanged-lines-and-show' of github.com:rajesh-jonnalagadda/gitea into feat-32257-add-comments-unchanged-lines-and-show

This commit is contained in:
Rajesh Jonnalagadda 2024-12-10 13:10:53 +05:30
commit 2413513bc0
99 changed files with 3063 additions and 1350 deletions

View File

@ -818,7 +818,7 @@ rules:
unicorn/consistent-destructuring: [2]
unicorn/consistent-empty-array-spread: [2]
unicorn/consistent-existence-index-check: [0]
unicorn/consistent-function-scoping: [2]
unicorn/consistent-function-scoping: [0]
unicorn/custom-error-definition: [0]
unicorn/empty-brace-spaces: [2]
unicorn/error-message: [0]

2
.gitignore vendored
View File

@ -28,7 +28,7 @@ _testmain.go
*.exe
*.test
*.prof
*.tsbuildInfo
*.tsbuildinfo
*coverage.out
coverage.all

View File

@ -4,6 +4,399 @@ This changelog goes through the changes that have been made in each release
without substantial changes to our git log; to see the highlights of what has
been added to each release, please refer to the [blog](https://blog.gitea.com).
## [1.22.4](https://github.com/go-gitea/gitea/releases/tag/v1.22.4) - 2024-11-14
* SECURITY
* Fix basic auth with webauthn (#32531) (#32536)
* Refactor internal routers (partial backport, auth token const time comparing) (#32473) (#32479)
* PERFORMANCE
* Remove transaction for archive download (#32186) (#32520)
* BUGFIXES
* Fix `missing signature key` error when pulling Docker images with `SERVE_DIRECT` enabled (#32365) (#32397)
* Fix get reviewers fails when selecting user without pull request permissions unit (#32415) (#32616)
* Fix adding index files to tmp directory (#32360) (#32593)
* Fix PR creation on forked repositories via API (#31863) (#32591)
* Fix missing menu tabs in organization project view page (#32313) (#32592)
* Support HTTP POST requests to `/userinfo`, aligning to OpenID Core specification (#32578) (#32594)
* Fix debian package clean up cron job (#32351) (#32590)
* Fix GetInactiveUsers (#32540) (#32588)
* Allow the actions user to login via the jwt token (#32527) (#32580)
* Fix submodule parsing (#32571) (#32577)
* Refactor find forks and fix possible bugs that weaken permissions check (#32528) (#32547)
* Fix some places that don't respect org full name setting (#32243) (#32550)
* Refactor push mirror find and add check for updating push mirror (#32539) (#32549)
* Fix basic auth with webauthn (#32531) (#32536)
* Fix artifact v4 upload above 8MB (#31664) (#32523)
* Fix oauth2 error handle not return immediately (#32514) (#32516)
* Fix action not triggered when commit message is too long (#32498) (#32507)
* Fix `GetRepoLink` nil pointer dereference on dashboard feed page when repo is deleted with actions enabled (#32501) (#32502)
* Fix `missing signature key` error when pulling Docker images with `SERVE_DIRECT` enabled (#32397) (#32397)
* Fix the permission check for user search API and limit the number of returned users for `/user/search` (#32310)
* Fix SearchIssues swagger docs (#32208) (#32298)
* Fix dropdown content overflow (#31610) (#32250)
* Disable Oauth check if oauth disabled (#32368) (#32480)
* Respect renamed dependencies of Cargo registry (#32430) (#32478)
* Fix mermaid diagram height when initially hidden (#32457) (#32464)
* Fix broken releases when re-pushing tags (#32435) (#32449)
* Only provide the commit summary for Discord webhook push events (#32432) (#32447)
* Only query team tables if repository is under org when getting assignees (#32414) (#32426)
* Fix created_unix for mirroring (#32342) (#32406)
* Respect UI.ExploreDefaultSort setting again (#32357) (#32385)
* Fix broken image when editing comment with non-image attachments (#32319) (#32345)
* Fix disable 2fa bug (#32320) (#32330)
* Always update expiration time when creating an artifact (#32281) (#32285)
* Fix null errors on conversation holder (#32258) (#32266) (#32282)
* Only rename a user when they should receive a different name (#32247) (#32249)
* Fix checkbox bug on private/archive filter (#32236) (#32240)
* Add a doctor check to disable the "Actions" unit for mirrors (#32424) (#32497)
* Quick fix milestone deadline 9999 (#32423)
* Make `show stats` work when only one file changed (#32244) (#32268)
* Make `owner/repo/pulls` handlers use "PR reader" permission (#32254) (#32265)
* Update scheduled tasks even if changes are pushed by "ActionsUser" (#32246) (#32252)
* MISC
* Remove unnecessary code: `GetPushMirrorsByRepoID` called on all repo pages (#32560) (#32567)
* Improve some sanitizer rules (#32534)
* Update nix development environment vor v1.22.x (#32495)
* Add warn log when deleting inactive users (#32318) (#32321)
* Update github.com/go-enry/go-enry to v2.9.1 (#32295) (#32296)
* Warn users when they try to use a non-root-url to sign in/up (#32272) (#32273)
## [1.22.3](https://github.com/go-gitea/gitea/releases/tag/v1.22.3) - 2024-10-08
* SECURITY
* Fix bug when a token is given public only (#32204) (#32218)
* PERFORMANCE
* Increase `cacheContextLifetime` to reduce false reports (#32011) (#32023)
* Don't join repository when loading action table data (#32127) (#32143)
* BUGFIXES
* Fix javascript error when an anonymous user visits migration page (#32144) (#32179)
* Don't init signing keys if oauth2 provider is disabled (#32177)
* Fix wrong status of `Set up Job` when first step is skipped (#32120) (#32125)
* Fix bug when deleting a migrated branch (#32075) (#32123)
* Truncate commit message during Discord webhook push events (#31970) (#32121)
* Allow to set branch protection in an empty repository (#32095) (#32119)
* Fix panic when cloning with wrong ssh format. (#32076) (#32118)
* Fix rename branch permission bug (#32066) (#32108)
* Fix: database not update release when using `git push --tags --force` (#32040) (#32074)
* Add missing comment reply handling (#32050) (#32065)
* Do not escape relative path in RPM primary index (#32038) (#32054)
* Fix `/repos/{owner}/{repo}/pulls/{index}/files` endpoint not populating `previous_filename` (#32017) (#32028)
* Support allowed hosts for migrations to work with proxy (#32025) (#32026)
* Fix the logic of finding the latest pull review commit ID (#32139) (#32165)
* Fix bug in getting merged pull request by commit (#32079) (#32117)
* Fix wrong last modify time (#32102) (#32104)
* Fix incorrect `/tokens` api (#32085) (#32092)
* Handle invalid target when creating releases using API (#31841) (#32043)
* Check if the `due_date` is nil when editing issues (#32035) (#32042)
* Fix container parallel upload bugs (#32022)
* Fixed race condition when deleting documents by repoId in ElasticSearch (#32185) (#32188)
* Refactor CSRF protector (#32057) (#32069)
* Fix Bug in Issue/pulls list (#32081) (#32115)
* Include collaboration repositories on dashboard source/forks/mirrors list (#31946) (#32122)
* Add null check for responseData.invalidTopics (#32212) (#32217)
* TESTING
* Fix mssql ci with a new mssql version on ci (#32094)
* MISC
* Upgrade some dependencies include minio-go (#32166)
* Add bin to Composer Metadata (#32099) (#32106)
* Lazy load avatar images (#32051) (#32063)
* Upgrade cache to v0.2.1 (#32003) (#32009)
## [1.22.2](https://github.com/go-gitea/gitea/releases/tag/v1.22.2) - 2024-08-28
* Security
* Replace v-html with v-text in search inputbox (#31966) (#31973)
* Fix nuget/conan/container packages upload bugs (#31967) (#31982)
* PERFORMANCE
* Refactor the usage of batch catfile (#31754) (#31889)
* BUGFIXES
* Fix overflowing content in action run log (#31842) (#31853)
* Scroll images in project issues separately from the remaining issue (#31683) (#31823)
* Add `:focus-visible` style to buttons (#31799) (#31819)
* Fix the display of project type for deleted projects (#31732) (#31734)
* Fix API owner ID should be zero when created repo secret (#31715) (#31811)
* Set owner id to zero when GetRegistrationToken for repo (#31725) (#31729)
* Fix API endpoint for registration-token (#31722) (#31728)
* Add permission check when creating PR (#31033) (#31720)
* Don't return 500 if mirror url contains special chars (#31859) (#31895)
* Fix agit automerge (#31207) (#31881)
* Add CfTurnstileSitekey context data to all captcha templates (#31874) (#31876)
* Avoid returning without written ctx when posting PR (#31843) (#31848)
* Fix raw wiki links (#31825) (#31845)
* Fix panic of ssh public key page after deletion of auth source (#31829) (#31836)
* Fixes for unreachable project issues when transfer repository from organization (#31770) (#31828)
* Show lock owner instead of repo owner on LFS setting page (#31788) (#31817)
* Fix `IsObjectExist` with gogit (#31790) (#31806)
* Fix protected branch files detection on pre_receive hook (#31778) (#31796)
* Add `TAGS` to `TEST_TAGS` and fix bugs found with gogit (#31791) (#31795)
* Rename head branch of pull requests when renaming a branch (#31759) (#31774)
* Fix wiki revision pagination (#31760) (#31772)
* Bump vue-bar-graph (#31705) (#31753)
* Distinguish LFS object errors to ignore missing objects during migration (#31702) (#31745)
* Make GetRepositoryByName more safer (#31712) (#31718)
* Fix a branch divergence cache bug (#31659) (#31661)
* Allow org team names of length 255 in create team form (#31564) (#31603)
* Use old behavior for telegram webhook (#31588)
* Bug fix for translation in ru (#31892)
* Fix actions notify bug (#31866) (#31875)
* Fix the component of access token list not mounted (#31824) (#31868)
* Add missing repository type filter parameters to pager (#31832) (#31837)
* Fix dates displaying in a wrong manner when we're close to the end of… (#31750)
* Fix "Filter by commit" Dropdown (#31695) (#31696)
* Properly filter issue list given no assignees filter (#31522) (#31685)
* Prevent update pull refs manually and will not affect other refs update (#31931)(#31955)
* Fix sort order for organization home and user profile page (#31921) (#31922)
* Fix search team (#31923) (#31942)
* Fix 500 error when state params is set when editing issue/PR by API (#31880) (#31952)
* Fix index too many file names bug (#31903) (#31953)
* Add lock for parallel maven upload (#31851) (#31954)
* MISC
* Remove "dsa-1024" testcases from Test_SSHParsePublicKey and Test_calcFingerprint (#31905) (#31914)
* Upgrade bleve to 2.4.2 (#31894)
* Remove unneccessary uses of `word-break: break-all` (#31637) (#31652)
* Return an empty string when a repo has no avatar in the repo API (#31187) (#31567)
* Upgrade micromatch to 4.0.8 (#31944)
* Update webpack to 5.94.0 (#31941)
## [1.22.1](https://github.com/go-gitea/gitea/releases/tag/v1.22.1) - 2024-07-04
* SECURITY
* Add replacement module for `mholt/archiver` (#31267) (#31270)
* API
* Fix missing images in editor preview due to wrong links (#31299) (#31393)
* Fix duplicate sub-path for avatars (#31365) (#31368)
* Reduce memory usage for chunked artifact uploads to MinIO (#31325) (#31338)
* Remove sub-path from container registry realm (#31293) (#31300)
* Fix NuGet Package API for $filter with Id equality (#31188) (#31242)
* Add an immutable tarball link to archive download headers for Nix (#31139) (#31145)
* Add missed return after `ctx.ServerError` (#31130) (#31133)
* BUGFIXES
* Fix avatar radius problem on the new issue page (#31506) (#31508)
* Fix overflow menu flickering on mobile (#31484) (#31488)
* Fix poor table column width due to breaking words (#31473) (#31477)
* Support relative paths to videos from Wiki pages (#31061) (#31453)
* Fix new issue/pr avatar (#31419) (#31424)
* Increase max length of org team names from 30 to 255 characters (#31410) (#31421)
* Fix line number width in code preview (#31307) (#31316)
* Optimize runner-tags layout to enhance visual experience (#31258) (#31263)
* Fix overflow on push notification (#31179) (#31238)
* Fix overflow on notifications (#31178) (#31237)
* Fix overflow in issue card (#31203) (#31225)
* Split sanitizer functions and fine-tune some tests (#31192) (#31200)
* use correct l10n string (#31487) (#31490)
* Fix dropzone JS error when attachment is disabled (#31486)
* Fix web notification icon not updated once you read all notifications (#31447) (#31466)
* Switch to "Write" tab when edit comment again (#31445) (#31461)
* Fix the link for .git-blame-ignore-revs bypass (#31432) (#31442)
* Fix the wrong line number in the diff view page when expanded twice. (#31431) (#31440)
* Fix labels and projects menu overflow on issue page (#31435) (#31439)
* Fix Account Linking UpdateMigrationsByType (#31428) (#31434)
* Fix markdown math brackets render problem (#31420) (#31430)
* Fix rendered wiki page link (#31398) (#31407)
* Fix natural sort (#31384) (#31394)
* Allow downloading attachments of draft releases (#31369) (#31380)
* Fix repo graph JS (#31377)
* Fix incorrect localization `explorer.go` (#31348) (#31350)
* Fix hash render end with colon (#31319) (#31346)
* Fix line number widths (#31341) (#31343)
* Fix navbar `+` menu flashing on page load (#31281) (#31342)
* Fix adopt repository has empty object name in database (#31333) (#31335)
* Delete legacy cookie before setting new cookie (#31306) (#31317)
* Fix some URLs whose sub-path is missing (#31289) (#31292)
* Fix admin oauth2 custom URL settings (#31246) (#31247)
* Make pasted "img" tag has the same behavior as markdown image (#31235) (#31243)
* Fix agit checkout command line hint & fix ShowMergeInstructions checking (#31219) (#31222)
* Fix the possible migration failure on 286 with postgres 16 (#31209) (#31218)
* Fix branch order (#31174) (#31193)
* Fix markup preview (#31158) (#31166)
* Fix push multiple branches error with tests (#31151) (#31153)
* Fix API repository object format missed (#31118) (#31132)
* Fix missing memcache import (#31105) (#31109)
* Upgrade `github.com/hashicorp/go-retryablehttp` (#31499)
* Fix double border in system status table (#31363) (#31401)
* Fix bug filtering issues which have no project (#31337) (#31367)
* Fix #31185 try fix lfs download from bitbucket failed (#31201) (#31329)
* Add nix flake for dev shell (#30967) (#31310)
* Fix and clean up `ConfirmModal` (#31283) (#31291)
* Optimize repo-list layout to enhance visual experience (#31272) (#31276)
* fixed the dropdown menu for the top New button to expand to the left (#31273) (#31275)
* Fix Activity Page Contributors dropdown (#31264) (#31269)
* fix: allow actions artifacts storage migration to complete succesfully (#31251) (#31257)
* Make blockquote attention recognize more syntaxes (#31240) (#31250)
* Remove .segment from .project-column (#31204) (#31239)
* Ignore FindRecentlyPushedNewBranches err (#31164) (#31171)
* Use vertical layout for multiple code expander buttons (#31122) (#31152)
* Remove duplicate `ProxyPreserveHost` in Apache httpd doc (#31143) (#31147)
* Improve mobile review ui (#31091) (#31136)
* Fix DashboardRepoList margin (#31121) (#31128)
* Update pip related commands for docker (#31106) (#31111)
## [1.22.0](https://github.com/go-gitea/gitea/releases/tag/v1.22.0) - 2024-05-27
This release stands as a monumental milestone in our development journey with a record-breaking incorporation of [1528](https://github.com/go-gitea/gitea/pulls?q=is%3Apr+milestone%3A1.22.0+is%3Amerged) pull requests. It marks the most extensive update in Gitea's history, showcasing a plethora of new features and infrastructure improvements.
Noteworthy advancements in this release include the introduction of `HTMX` and `Tailwind`, signaling a strategic shift as we gradually phase out `jquery` and `Fomantic UI`. These changes reflect our commitment to embracing modern technologies and enhancing the user experience.
Key highlights of this release encompass significant changes categorized under `BREAKING`, `FEATURES`, `ENHANCEMENTS`, and `PERFORMANCE`, each contributing to a more robust and efficient Gitea platform.
* BREAKING
* Improve reverse proxy documents and clarify the AppURL guessing behavior (#31003) (#31020)
* Remember log in for a month by default (#30150)
* Breaking summary for template refactoring (#29395)
* All custom templates need to follow these changes
* Recommend/convert to use case-sensitive collation for MySQL/MSSQL (#28662)
* Make offline mode as default to not connect external avatar service by default (#28548)
* Include public repos in the doer's dashboard for issue search (#28304)
* Use restricted sanitizer for repository description (#28141)
* Support storage base path as prefix (#27827)
* Enhanced auth token / remember me (#27606)
* Rename the default themes to `gitea-light`, `gitea-dark`, `gitea-auto` (#27419)
* If you didn't see the new themes, please remove the `[ui].THEMES` config option from `app.ini`
* Require MySQL 8.0, PostgreSQL 12, MSSQL 2012 (#27337)
* FEATURES
* Allow everyone to read or write a wiki by a repo unit setting (#30495)
* Use raw Wiki links for non-renderable Wiki files (#30273)
* Render embedded code preview by permalink in markdown (#30234) (#30249)
* Support repo code search without setting up an indexer (#29998)
* Support pasting URLs over markdown text (#29566)
* Allow to change primary email before account activation (#29412)
* Customizable "Open with" applications for repository clone (#29320)
* Allow options to disable user deletion from the interface on app.ini (#29275)
* Extend issue template YAML engine (#29274)
* Add support for `linguist-detectable` and `linguist-documentation` (#29267)
* Implement code frequency graph (#29191)
* Show commit status for releases (#29149)
* Add user blocking (#29028)
* Actions Artifacts v4 backend (#28965)
* Add merge style `fast-forward-only` (#28954)
* Retarget depending pulls when the parent branch is deleted (#28686)
* Add global setting on how timestamps should be rendered (#28657)
* Implement actions badge SVGs (#28102)
* Add skip ci functionality (#28075)
* Show latest commit for file (#28067)
* Allow to sync tags from the admin dashboard (#28045)
* Add Profile Readme for Organisations (#27955)
* Implement contributors graph (#27882)
* Artifact deletion in actions ui (#27172)
* Add API routes to get runner registration token (#27144)
* Add support for forking single branch (#25821)
* Add support for sha256 repositories (#23894)
* Add admin API route for managing user's badges (#23106)
* ENHANCEMENTS
* Make gitea webhooks openproject compatible (#28435) (#31081)
* Support using label names when changing issue labels (#30943) (#30958)
* Fix various problems around project board view (#30696) (#30902)
* Improve context popup rendering (#30824) (#30829)
* Allow to save empty comment (#30706)
* Prevent allow/reject reviews on merged/closed PRs (#30686)
* Initial support for colorblindness-friendly themes (#30625)
* Some NuGet package enhancements (#30280) (#30324)
* Markup color and font size fixes (#30282) (#30310)
* Show 12 lines in markup code preview (#30255) (#30257)
* Add `[other].SHOW_FOOTER_POWERED_BY` setting to hide `Powered by` (#30253)
* Pulse page improvements (#30149)
* Render code tags in commit messages (#30146)
* Prevent re-review and dismiss review actions on closed and merged PRs (#30065)
* Cancel previous runs of the same PR automatically (#29961)
* Drag-and-drop improvements for projects and issue pins (#29875)
* Add default board to new projects, remove uncategorized pseudo-board (#29874)
* Prevent layout shift in `<overflow-menu>` items (#29831)
* Add skip ci support for pull request title (#29774)
* Add more stats tables (#29730)
* Update API to return 'source_id' for users (#29718)
* Determine fuzziness of bleve indexer by keyword length (#29706)
* Expose fuzzy search for issues/pulls (#29701)
* Put an edit file button on pull request files to allow a quick operation (#29697)
* Fix action runner offline label padding (#29691)
* Update allowed attachment types (#29688)
* Completely style the webkit autofill (#29683)
* Highlight archived labels (#29680)
* Add a warning for disallowed email domains (#29658)
* Set user's 24h preference from their current OS locale (#29651)
* Add setting to disable user features when user login type is not plain (#29615)
* Improve natural sort (#29611)
* Make wiki default branch name changeable (#29603)
* Unify search boxes (#29530)
* Add support for API blob upload of release attachments (#29507)
* Detect broken git hooks (#29494)
* Sync branches to DB immediately when handling git hook calling (#29493)
* Allow options to disable user GPG key configuration from the interface on app.ini (#29486)
* Allow options to disable user SSH key configuration from the interface on app.ini (#29447)
* Use relative links for commits, mentions, and issues in markdown (#29427)
* Add `<overflow-menu>`, rename webcomponents (#29400)
* Include resource state events in Gitlab downloads (#29382)
* Properly migrate target branch change GitLab comment (#29340)
* Recolor dark theme to blue shade (#29283)
* Partially enable MSSQL case-sensitive collation support (#29238)
* Auto-update the system status in the admin dashboard (#29163)
* Integrate alpine `noarch` packages into other architectures index (#29137)
* Document how the TOC election process works (#29135)
* Tweak repo header (#29134)
* Make blockquote border size less aggressive (#29124)
* Downscale pasted PNG images based on metadata (#29123)
* Show `View at this point in history` for every commit (#29122)
* Add support for action artifact serve direct (#29120)
* Change webhook-type in create-view (#29114)
* Drop "@" from the email sender to avoid spam filters (#29109)
* Allow non-admin users to delete review requests (#29057)
* Improve user search display name (#29002)
* Include username in email headers (#28981)
* Show whether a PR is WIP inside popups (#28975)
* Also match weakly validated ETags (#28957)
* Support nuspec manifest download for Nuget packages (#28921)
* Fix hardcoded GitHub icon used as migrated release avatar (#28910)
* Propagate install_if and provider_priority to APKINDEX (#28899)
* Add artifacts v4 JWT to job message and accept it (#28885)
* Enable/disable owner and repo projects independently (#28805)
* Add non-JS fallback for reaction tooltips (#28785)
* Add the ability to see open and closed issues at the same time (#28757)
* Move sign-in labels to be above inputs (#28753)
* Display the latest sync time for pull mirrors on the repo page (#28712)
* Show in Web UI if the file is vendored and generated (#28620)
* Add orphaned topic consistency check (#28507)
* Add branch protection setting for ignoring stale approvals (#28498)
* Add option to set language in admin user view (#28449)
* Fix incorrect run order of action jobs (#28367)
* Add missing exclusive in advanced label options (#28322)
* Added instance-level variables (#28115)
* Add edit option for README.md (#28071)
* Fix link to `Code` tab on wiki commits (#28041)
* Allow to set explore page default sort (#27951)
* Improve PR diff view on mobile (#27883)
* Properly migrate automatic merge GitLab comments (#27873)
* Display issue task list on project cards (#27865)
* Add Index to pull_auto_merge.doer_id (#27811)
* Fix display member unit in the menu bar if there are no hidden members in public org (#27795)
* List all Debian package versions in `Packages` (#27786)
* Allow pull requests Manually Merged option to be used by non-admins (#27780)
* Only show diff file tree when more than one file changed (#27775)
* Show placeholder email in privacy popup (#27770)
* Revamp repo header (#27760)
* Add `must-change-password` command line parameter (#27626)
* Unify password changing and invalidate auth tokens (#27625)
* Add border to file tree 'sub-items' and add padding to 'item-file' (#27593)
* Add slow SQL query warning (#27545)
* Pre-register OAuth application for tea (#27509)
* Differentiate between `push` and `pull` `mirror sync in progress` (#27390)
* Link to file from its history (#27354)
* Add a shortcut to user's profile page to admin user details (#27299)
* Doctor: delete action entries without existing user (#27292)
* Show total TrackedTime on issue/pull/milestone lists (#26672)
* Don't show the new pull request button when the page is not compare pull (#26431)
* Add `Hide/Show all checks` button to commit status check (#26284)
* Improvements of releases list and tags list (#25859)
* PERFORMANCE
* Fix package list performance (#30520) (#30616)
* Add commit status summary table to reduce query from commit status table (#30223)
* Refactor markup/csv: don't read all to memory (#29760)
* Lazy load object format with command line and don't do it in OpenRepository (#29712)
* Add cache for branch divergence on branch list page (#29577)
* Do some performance optimization for issues list and view issue/pull (#29515)
* Cache repository default branch commit status to reduce query on commit status table (#29444)
* Use `crypto/sha256` (#29386)
* Some performance optimization on the dashboard and issues page (#29010)
* Add combined index for issue_user.uid and issue_id (#28080)
## [1.21.11](https://github.com/go-gitea/gitea/releases/tag/v1.21.11) - 2024-04-07
* SECURITY

View File

@ -223,7 +223,7 @@ func Push(ctx context.Context, repoPath string, opts PushOptions) error {
if err != nil {
if strings.Contains(stderr, "non-fast-forward") {
return &ErrPushOutOfDate{StdOut: stdout, StdErr: stderr, Err: err}
} else if strings.Contains(stderr, "! [remote rejected]") {
} else if strings.Contains(stderr, "! [remote rejected]") || strings.Contains(stderr, "! [rejected]") {
err := &ErrPushRejected{StdOut: stdout, StdErr: stderr, Err: err}
err.GenerateMessage()
return err

View File

@ -42,6 +42,7 @@ func NewFuncMap() template.FuncMap {
"HTMLFormat": htmlutil.HTMLFormat,
"HTMLEscape": htmlEscape,
"QueryEscape": queryEscape,
"QueryBuild": queryBuild,
"JSEscape": jsEscapeSafe,
"SanitizeHTML": SanitizeHTML,
"URLJoin": util.URLJoin,
@ -293,6 +294,69 @@ func timeEstimateString(timeSec any) string {
return util.TimeEstimateString(v)
}
func queryBuild(a ...any) template.URL {
var s string
if len(a)%2 == 1 {
if v, ok := a[0].(string); ok {
if v == "" || (v[0] != '?' && v[0] != '&') {
panic("queryBuild: invalid argument")
}
s = v
} else if v, ok := a[0].(template.URL); ok {
s = string(v)
} else {
panic("queryBuild: invalid argument")
}
}
for i := len(a) % 2; i < len(a); i += 2 {
k, ok := a[i].(string)
if !ok {
panic("queryBuild: invalid argument")
}
var v string
if va, ok := a[i+1].(string); ok {
v = va
} else if a[i+1] != nil {
v = fmt.Sprint(a[i+1])
}
// pos1 to pos2 is the "k=v&" part, "&" is optional
pos1 := strings.Index(s, "&"+k+"=")
if pos1 != -1 {
pos1++
} else {
pos1 = strings.Index(s, "?"+k+"=")
if pos1 != -1 {
pos1++
} else if strings.HasPrefix(s, k+"=") {
pos1 = 0
}
}
pos2 := len(s)
if pos1 == -1 {
pos1 = len(s)
} else {
pos2 = pos1 + 1
for pos2 < len(s) && s[pos2-1] != '&' {
pos2++
}
}
if v != "" {
sep := ""
hasPrefixSep := pos1 == 0 || (pos1 <= len(s) && (s[pos1-1] == '?' || s[pos1-1] == '&'))
if !hasPrefixSep {
sep = "&"
}
s = s[:pos1] + sep + k + "=" + url.QueryEscape(v) + "&" + s[pos2:]
} else {
s = s[:pos1] + s[pos2:]
}
}
if s != "" && s != "&" && s[len(s)-1] == '&' {
s = s[:len(s)-1]
}
return template.URL(s)
}
func panicIfDevOrTesting() {
if !setting.IsProd || setting.IsInTesting {
panic("legacy template functions are for backward compatibility only, do not use them in new code")

View File

@ -29,7 +29,7 @@ CASS.ini
*.gzlc
## gitignore reference sites
# https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository#Ignoring-Files
# https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository#_ignoring
# https://git-scm.com/docs/gitignore
# https://help.github.com/articles/ignoring-files/

View File

@ -0,0 +1,62 @@
# gitignore template for ECU-TEST workspaces - by TraceTronic https://tracetronic.com
# website: https://www.ecu-test.com
# * all directories are related to the default directories, please adapt the .gitignore if you use customized
# directories
# Dynamic workspace settings
# * We don't recommend to ignore the .workspace directory, because of important project specific settings
# local user settings
.workspace/ETdrive.xml
.workspace/favorites.xml
.workspace/filters.xml
.workspace/generators.xml
.workspace/history.xml
.workspace/parallelExecution.xml
.workspace/signalviewer.xml
.workspace/signalViewerHistory.json
.workspace/signalviewer2layout.xml
.workspace/testeditor.xml
.workspace/tooladapter.xml
.workspace/view.xml
# optional, if your process depends on this file remove exclusion
.workspace/interactiveexecution.xml
.workspace/pythonlibrary.xml
# deprecated, support for older versions
.workspace/traceexplorer.xml
# Custom file formats and test dependencies
# * you can manage your artifacts also with TEST-GUIDE (https://www.test-guide.info) and reference them via Playbooks
*.arxml
*.a2l
*.dbc
*.hex
*.s19
[tT]estdata
[tT]estdaten
# Test results and test execution related content
# * Git is not intended to store and provide test results for all iterations
# * We recommend to use TEST-GUIDE (https://www.test-guide.info) for the test report management
TestReports
# Report generators and templates
# * if you want to provide (f.e.) your own report generators exclude the directory here and ignore only the
# unnecessary subdirectories
Templates
# Exclude large binary artifacts
# * you can manage your artifacts also with TEST-GUIDE (https://www.test-guide.info) and reference them via Playbooks
Offline-FIUs
Offline-Models
Offline-SGBDs
*.exe
*.msi
*.zip
*.7z
# Exclude default and custom temporary directories
Backup_*
# Python bytecode and cache files
__pycache__/
*.py[cod]

View File

@ -22,3 +22,6 @@
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
# Kotlin Gradle plugin data, see https://kotlinlang.org/docs/whatsnew20.html#new-directory-for-kotlin-data-in-gradle-projects
.kotlin/

View File

@ -21,3 +21,10 @@ Homestead.yaml
Homestead.json
/.vagrant
.phpunit.result.cache
/public/build
/storage/pail
.env.backup
.env.production
.phpactor.json
auth.json

6
options/gitignore/Move Normal file
View File

@ -0,0 +1,6 @@
# Generated by Move
# will have compiled files
build/
# Remove possibly saving credentials to the git repository
.aptos/

View File

@ -0,0 +1,42 @@
# Local .terraform directories
**/.terraform/*
# .tfstate files
*.tfstate
*.tfstate.*
# Crash log files
crash.log
crash.*.log
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
*.tfvars
*.tfvars.json
# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tofu
override.tf.json
override.tofu.json
*_override.tf
*_override.tofu
*_override.tf.json
*_override.tofu.json
# Ignore transient lock info files created by tofu apply
.terraform.tfstate.lock.info
# Include override files you do wish to add to version control using negated pattern
# !example_override.tf
# !example_override.tofu
# Include tfplan files to ignore the plan output of command: tofu plan -out=tfplan
# example: *tfplan*
# Ignore CLI configuration files
.terraformrc
terraform.rc

View File

@ -94,6 +94,12 @@ ipython_config.py
# install all needed dependencies.
#Pipfile.lock
# UV
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
#uv.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more

View File

@ -59,6 +59,7 @@ sysinfo.txt
*.apk
*.aab
*.unitypackage
*.unitypackage.meta
*.app
# Crashlytics generated file

View File

@ -82,6 +82,8 @@ StyleCopReport.xml
*.pgc
*.pgd
*.rsp
# but not Directory.Build.rsp, as it configures directory-level build defaults
!Directory.Build.rsp
*.sbr
*.tlb
*.tli

View File

@ -0,0 +1,27 @@
No Copyright
This work has been identified as being free of known restrictions under
copyright law, including all related and neighboring rights.
You can copy, modify, distribute and perform the work, even for commercial
purposes, all without asking permission. See Other Information below.
Other Information
The work may not be free of known copyright restrictions in all jurisdictions .
Persons may have other rights in or related to the work, such as patent or
trademark rights, and others may have rights in how the work is used, such as
publicity or privacy rights.
In some jurisdictions moral rights of the author may persist beyond the term of
copyright. These rights may include the right to be identified as the author
and the right to object to derogatory treatments.
Unless expressly stated otherwise, the person who identified the work makes no
warranties about the work, and disclaims liability for all uses of the work, to
the fullest extent permitted by applicable law.
When using or citing the work, you should not imply endorsement by the author
or the person who identified the work.

198
options/license/CC-SA-1.0 Normal file
View File

@ -0,0 +1,198 @@
Creative Commons Legal Code
ShareAlike 1.0
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL
SERVICES. DISTRIBUTION OF THIS DRAFT LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT
RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS.
CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND
DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.
License
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
AUTHORIZED UNDER THIS LICENSE IS PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE
BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS
CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
CONDITIONS.
1. Definitions
a. "Collective Work" means a work, such as a periodical issue, anthology or
encyclopedia, in which the Work in its entirety in unmodified form, along
with a number of other contributions, constituting separate and independent
works in themselves, are assembled into a collective whole. A work that
constitutes a Collective Work will not be considered a Derivative Work (as
defined below) for the purposes of this License.
b. "Derivative Work" means a work based upon the Work or upon the Work and
other pre-existing works, such as a translation, musical arrangement,
dramatization, fictionalization, motion picture version, sound recording,
art reproduction, abridgment, condensation, or any other form in which the
Work may be recast, transformed, or adapted, except that a work that
constitutes a Collective Work will not be considered a Derivative Work for
the purpose of this License.
c. "Licensor" means the individual or entity that offers the Work under the
terms of this License.
d. "Original Author" means the individual or entity who created the Work.
e. "Work" means the copyrightable work of authorship offered under the terms
of this License.
f. "You" means an individual or entity exercising rights under this License
who has not previously violated the terms of this License with respect to
the Work, or who has received express permission from the Licensor to
exercise rights under this License despite a previous violation.
2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or
restrict any rights arising from fair use, first sale or other limitations on
the exclusive rights of the copyright owner under copyright law or other
applicable laws.
3. License Grant. Subject to the terms and conditions of this License, Licensor
hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the
duration of the applicable copyright) license to exercise the rights in the
Work as stated below:
a. to reproduce the Work, to incorporate the Work into one or more Collective
Works, and to reproduce the Work as incorporated in the Collective Works;
b. to create and reproduce Derivative Works;
c. to distribute copies or phonorecords of, display publicly, perform
publicly, and perform publicly by means of a digital audio transmission the
Work including as incorporated in Collective Works;
d. to distribute copies or phonorecords of, display publicly, perform
publicly, and perform publicly by means of a digital audio transmission
Derivative Works;
The above rights may be exercised in all media and formats whether now known or
hereafter devised. The above rights include the right to make such
modifications as are technically necessary to exercise the rights in other
media and formats. All rights not expressly granted by Licensor are hereby
reserved.
4. Restrictions. The license granted in Section 3 above is expressly made
subject to and limited by the following restrictions:
a. You may distribute, publicly display, publicly perform, or publicly
digitally perform the Work only under the terms of this License, and You
must include a copy of, or the Uniform Resource Identifier for, this
License with every copy or phonorecord of the Work You distribute, publicly
display, publicly perform, or publicly digitally perform. You may not offer
or impose any terms on the Work that alter or restrict the terms of this
License or the recipients' exercise of the rights granted hereunder. You
may not sublicense the Work. You must keep intact all notices that refer to
this License and to the disclaimer of warranties. You may not distribute,
publicly display, publicly perform, or publicly digitally perform the Work
with any technological measures that control access or use of the Work in a
manner inconsistent with the terms of this License Agreement. The above
applies to the Work as incorporated in a Collective Work, but this does not
require the Collective Work apart from the Work itself to be made subject
to the terms of this License. If You create a Collective Work, upon notice
from any Licensor You must, to the extent practicable, remove from the
Collective Work any reference to such Licensor or the Original Author, as
requested. If You create a Derivative Work, upon notice from any Licensor
You must, to the extent practicable, remove from the Derivative Work any
reference to such Licensor or the Original Author, as requested.
b. You may distribute, publicly display, publicly perform, or publicly
digitally perform a Derivative Work only under the terms of this License,
and You must include a copy of, or the Uniform Resource Identifier for,
this License with every copy or phonorecord of each Derivative Work You
distribute, publicly display, publicly perform, or publicly digitally
perform. You may not offer or impose any terms on the Derivative Works that
alter or restrict the terms of this License or the recipients' exercise of
the rights granted hereunder, and You must keep intact all notices that
refer to this License and to the disclaimer of warranties. You may not
distribute, publicly display, publicly perform, or publicly digitally
perform the Derivative Work with any technological measures that control
access or use of the Work in a manner inconsistent with the terms of this
License Agreement. The above applies to the Derivative Work as incorporated
in a Collective Work, but this does not require the Collective Work apart
from the Derivative Work itself to be made subject to the terms of this
License.
5. Representations, Warranties and Disclaimer
a. By offering the Work for public release under this License, Licensor
represents and warrants that, to the best of Licensor's knowledge after
reasonable inquiry:
i. Licensor has secured all rights in the Work necessary to grant the
license rights hereunder and to permit the lawful exercise of the
rights granted hereunder without You having any obligation to pay any
royalties, compulsory license fees, residuals or any other payments;
ii. The Work does not infringe the copyright, trademark, publicity rights,
common law rights or any other right of any third party or constitute
defamation, invasion of privacy or other tortious injury to any third
party.
b. EXCEPT AS EXPRESSLY STATED IN THIS LICENSE OR OTHERWISE AGREED IN WRITING
OR REQUIRED BY APPLICABLE LAW, THE WORK IS LICENSED ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
WITHOUT LIMITATION, ANY WARRANTIES REGARDING THE CONTENTS OR ACCURACY OF
THE WORK.
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW,
AND EXCEPT FOR DAMAGES ARISING FROM LIABILITY TO A THIRD PARTY RESULTING FROM
BREACH OF THE WARRANTIES IN SECTION 5, IN NO EVENT WILL LICENSOR BE LIABLE TO
YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR
EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. Termination
a. This License and the rights granted hereunder will terminate automatically
upon any breach by You of the terms of this License. Individuals or
entities who have received Derivative Works or Collective Works from You
under this License, however, will not have their licenses terminated
provided such individuals or entities remain in full compliance with those
licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of
this License.
b. Subject to the above terms and conditions, the license granted here is
perpetual (for the duration of the applicable copyright in the Work).
Notwithstanding the above, Licensor reserves the right to release the Work
under different license terms or to stop distributing the Work at any time;
provided, however that any such election will not serve to withdraw this
License (or any other license that has been, or is required to be, granted
under the terms of this License), and this License will continue in full
force and effect unless terminated as stated above.
8. Miscellaneous
a. Each time You distribute or publicly digitally perform the Work or a
Collective Work, the Licensor offers to the recipient a license to the Work
on the same terms and conditions as the license granted to You under this
License.
b. Each time You distribute or publicly digitally perform a Derivative Work,
Licensor offers to the recipient a license to the original Work on the same
terms and conditions as the license granted to You under this License.
c. If any provision of this License is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of the
remainder of the terms of this License, and without further action by the
parties to this agreement, such provision shall be reformed to the minimum
extent necessary to make such provision valid and enforceable.
d. No term or provision of this License shall be deemed waived and no breach
consented to unless such waiver or consent shall be in writing and signed
by the party to be charged with such waiver or consent.
e. This License constitutes the entire agreement between the parties with
respect to the Work licensed here. There are no understandings, agreements
or representations with respect to the Work not specified here. Licensor
shall not be bound by any additional provisions that may appear in any
communication from You. This License may not be modified without the mutual
written agreement of the Licensor and You.
Creative Commons is not a party to this License, and makes no warranty
whatsoever in connection with the Work. Creative Commons will not be liable to
You or any party on any legal theory for any damages whatsoever, including
without limitation any general, special, incidental or consequential damages
arising in connection to this license. Notwithstanding the foregoing two (2)
sentences, if Creative Commons has expressly identified itself as the Licensor
hereunder, it shall have all rights and obligations of Licensor.
Except for the limited purpose of indicating to the public that the Work is
licensed under the CCPL, neither party will use the trademark "Creative
Commons" or any related trademark or logo of Creative Commons without the prior
written consent of Creative Commons. Any permitted use will be in compliance
with Creative Commons' then-current trademark usage guidelines, as may be
published on its website or otherwise made available upon request from time to
time.
Creative Commons may be contacted at http://creativecommons.org/.

View File

@ -0,0 +1,4 @@
As a special exception, you have permission to link this library
with the CGAL library (http://www.cgal.org) and distribute executables,
as long as you follow the requirements of the GNU GPL in regard to
all of the software in the executable aside from CGAL.

View File

@ -0,0 +1,18 @@
This is the file COPYING.FPC, it applies to the Free Pascal Run-Time Library
(RTL) and packages (packages) distributed by members of the Free Pascal
Development Team.
The source code of the Free Pascal Runtime Libraries and packages are
distributed under the Library GNU General Public License
(see the file COPYING) with the following modification:
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent modules,
and to copy and distribute the resulting executable under terms of your choice,
provided that you also meet, for each linked independent module, the terms
and conditions of the license of that module. An independent module is a module
which is not derived from or based on this library. If you modify this
library, you may extend this exception to your version of the library, but you are
not obligated to do so. If you do not wish to do so, delete this exception
statement from your version.

27
options/license/InnoSetup Normal file
View File

@ -0,0 +1,27 @@
Inno Setup License
==================
Except where otherwise noted, all of the documentation and software included in the Inno Setup
package is copyrighted by Jordan Russell.
Copyright (C) 1997-2024 Jordan Russell. All rights reserved.
Portions Copyright (C) 2000-2024 Martijn Laan. All rights reserved.
This software is provided "as-is," without any express or implied warranty. In no event shall the
author be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial
applications, and to alter and redistribute it, provided that the following conditions are met:
1. All redistributions of source code files must retain all copyright notices that are currently in
place, and this list of conditions without modification.
2. All redistributions in binary form must retain all occurrences of the above copyright notice and
web site addresses that are currently in place (for example, in the About boxes).
3. The origin of this software must not be misrepresented; you must not claim that you wrote the
original software. If you use this software to distribute a product, an acknowledgment in the
product documentation would be appreciated but is not required.
4. Modified versions in source or binary form must be plainly marked as such, and must not be
misrepresented as being the original software.

View File

@ -1,110 +1,372 @@
MOTOSOTO OPEN SOURCE LICENSE - Version 0.9.1
This Motosoto Open Source License (the "License") applies to "Community Portal Server" and related software products as well as any updatesor maintenance releases of that software ("Motosoto Products") that are distributed by Motosoto.Com B.V. ("Licensor"). Any Motosoto Product licensed pursuant to this License is a "Licensed Product." Licensed Product, in its entirety, is protected by Dutch copyright law. This License identifies the terms under which you may use, copy, distribute or modify Licensed Product and has been submitted to the Open Software Initiative (OSI) for approval.
This Motosoto Open Source License (the "License") applies to "Community Portal Server" and related
software products as well as any updatesor maintenance releases of that software ("Motosoto
Products") that are distributed by Motosoto.Com B.V. ("Licensor"). Any Motosoto Product licensed
pursuant to this License is a "Licensed Product." Licensed Product, in its entirety, is protected
by Dutch copyright law. This License identifies the terms under which you may use, copy, distribute
or modify Licensed Product and has been submitted to the Open Software Initiative (OSI) for
approval.
Preamble
This Preamble is intended to describe, in plain English, the nature and scope of this License. However, this Preamble is not a part of this license. The legal effect of this License is dependent only upon the terms of the License and not this Preamble. This License complies with the Open Source Definition and has been approved by Open Source Initiative. Software distributed under this License may be marked as "OSI Certified Open Source Software."
This Preamble is intended to describe, in plain English, the nature and scope of this License.
However, this Preamble is not a part of this license. The legal effect of this License is dependent
only upon the terms of the License and not this Preamble. This License complies with the Open
Source Definition and has been approved by Open Source Initiative. Software distributed under this
License may be marked as "OSI Certified Open Source Software."
This License provides that:
1. You may use, sell or give away the Licensed Product, alone or as a component of an aggregate software distribution containing programs from several different sources. No royalty or other fee is required.
1. You may use, sell or give away the Licensed Product, alone or as a component of an aggregate
software distribution containing programs from several different sources. No royalty or other fee
is required.
2. Both Source Code and executable versions of the Licensed Product, including Modifications made by previous Contributors, are available for your use. (The terms "Licensed Product," "Modifications," "Contributors" and "Source Code" are defined in the License.)
2. Both Source Code and executable versions of the Licensed Product, including Modifications made
by previous Contributors, are available for your use. (The terms "Licensed Product,"
"Modifications," "Contributors" and "Source Code" are defined in the License.)
3. You are allowed to make Modifications to the Licensed Product, and you can create Derivative Works from it. (The term "Derivative Works" is defined in the License.)
3. You are allowed to make Modifications to the Licensed Product, and you can create Derivative
Works from it. (The term "Derivative Works" is defined in the License.)
4. By accepting the Licensed Product under the provisions of this License, you agree that any Modifications you make to the Licensed Product and then distribute are governed by the provisions of this License. In particular, you must make the Source Code of your Modifications available to others.
4. By accepting the Licensed Product under the provisions of this License, you agree that any
Modifications you make to the Licensed Product and then distribute are governed by the provisions
of this License. In particular, you must make the Source Code of your Modifications available to
others.
5. You may use the Licensed Product for any purpose, but the Licensor is not providing you any warranty whatsoever, nor is the Licensor accepting any liability in the event that the Licensed Product doesn't work properly or causes you any injury or damages.
5. You may use the Licensed Product for any purpose, but the Licensor is not providing you any
warranty whatsoever, nor is the Licensor accepting any liability in the event that the Licensed
Product doesn't work properly or causes you any injury or damages.
6. If you sublicense the Licensed Product or Derivative Works, you may charge fees for warranty or support, or for accepting indemnity or liability obligations to your customers. You cannot charge for the Source Code.
6. If you sublicense the Licensed Product or Derivative Works, you may charge fees for warranty or
support, or for accepting indemnity or liability obligations to your customers. You cannot charge
for the Source Code.
7. If you assert any patent claims against the Licensor relating to the Licensed Product, or if you breach any terms of the License, your rights to the Licensed Product under this License automatically terminate.
7. If you assert any patent claims against the Licensor relating to the Licensed Product, or if you
breach any terms of the License, your rights to the Licensed Product under this License
automatically terminate.
You may use this License to distribute your own Derivative Works, in which case the provisions of this License will apply to your Derivative Works just as they do to the original Licensed Product.
You may use this License to distribute your own Derivative Works, in which case the provisions of
this License will apply to your Derivative Works just as they do to the original Licensed Product.
Alternatively, you may distribute your Derivative Works under any other OSI-approved Open Source license, or under a proprietary license of your choice. If you use any license other than this License, however, you must continue to fulfill the requirements of this License (including the provisions relating to publishing the Source Code) for those portions of your Derivative Works that consist of the Licensed Product, including the files containing Modifications.
Alternatively, you may distribute your Derivative Works under any other OSI-approved Open Source
license, or under a proprietary license of your choice. If you use any license other than this
License, however, you must continue to fulfill the requirements of this License (including the
provisions relating to publishing the Source Code) for those portions of your Derivative Works that
consist of the Licensed Product, including the files containing Modifications.
New versions of this License may be published from time to time. You may choose to continue to use the license terms in this version of the License or those from the new version. However, only the Licensor has the right to change the License terms as they apply to the Licensed Product. This License relies on precise definitions for certain terms. Those terms are defined when they are first used, and the definitions are repeated for your convenience in a Glossary at the end of the License.
New versions of this License may be published from time to time. You may choose to continue to use
the license terms in this version of the License or those from the new version. However, only the
Licensor has the right to change the License terms as they apply to the Licensed Product. This
License relies on precise definitions for certain terms. Those terms are defined when they are
first used, and the definitions are repeated for your convenience in a Glossary at the end of the
License.
License Terms
1. Grant of License From Licensor.
Licensor hereby grants you a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, to do the following:
Licensor hereby grants you a world-wide, royalty-free, non-exclusive license, subject to third
party intellectual property claims, to do the following:
a. Use, reproduce, modify, display, perform, sublicense and distribute Licensed Product or portions thereof (including Modifications as hereinafter defined), in both Source Code or as an executable program. "Source Code" means the preferred form for making modifications to the Licensed Product, including all modules contained therein, plus any associated interface definition files, scripts used to control compilation and installation of an executable program, or a list of differential comparisons against the Source Code of the Licensed Product.
a. Use, reproduce, modify, display, perform, sublicense and distribute Licensed Product or
portions thereof (including Modifications as hereinafter defined), in both Source Code or as an
executable program. "Source Code" means the preferred form for making modifications to the Licensed
Product, including all modules contained therein, plus any associated interface definition files,
scripts used to control compilation and installation of an executable program, or a list of
differential comparisons against the Source Code of the Licensed Product.
b. Create Derivative Works (as that term is defined under Dutch copyright law) of Licensed Product by adding to or deleting from the substance or structure of said Licensed Product.
b. Create Derivative Works (as that term is defined under Dutch copyright law) of Licensed
Product by adding to or deleting from the substance or structure of said Licensed Product.
c. Under claims of patents now or hereafter owned or controlled by Licensor, to make, use, sell, offer for sale, have made, and/or otherwise dispose of Licensed Product or portions thereof, but solely to the extent that any such claim is necessary to enable you to make, use, sell, offer for sale, have made, and/or otherwise dispose of Licensed Product or portions thereof or Derivative Works thereof.
c. Under claims of patents now or hereafter owned or controlled by Licensor, to make, use,
sell, offer for sale, have made, and/or otherwise dispose of Licensed Product or portions thereof,
but solely to the extent that any such claim is necessary to enable you to make, use, sell, offer
for sale, have made, and/or otherwise dispose of Licensed Product or portions thereof or Derivative
Works thereof.
2. Grant of License to Modifications From Contributor.
"Modifications" means any additions to or deletions from the substance or structure of (i) a file containing Licensed Product, or (ii) any new file that contains any part of Licensed Product. Hereinafter in this License, the term "Licensed Product" shall include all previous Modifications that you receive from any Contributor. By application of the provisions in Section 4(a) below, each person or entity who created or contributed to the creation of, and distributed, a Modification (a "Contributor") hereby grants you a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, to do the following:
"Modifications" means any additions to or deletions from the substance or structure of (i) a file
containing Licensed Product, or (ii) any new file that contains any part of Licensed Product.
Hereinafter in this License, the term "Licensed Product" shall include all previous Modifications
that you receive from any Contributor. By application of the provisions in Section 4(a) below, each
person or entity who created or contributed to the creation of, and distributed, a Modification (a
"Contributor") hereby grants you a world-wide, royalty-free, non-exclusive license, subject to
third party intellectual property claims, to do the following:
a. Use, reproduce, modify, display, perform, sublicense and distribute any Modifications created by such Contributor or portions thereof, in both Source Code or as an executable program, either on an unmodified basis or as part of Derivative Works.
a. Use, reproduce, modify, display, perform, sublicense and distribute any Modifications
created by such Contributor or portions thereof, in both Source Code or as an executable program,
either on an unmodified basis or as part of Derivative Works.
b. Under claims of patents now or hereafter owned or controlled by Contributor, to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof, but solely to the extent that any such claim is necessary to enable you to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof or Derivative Works thereof.
b. Under claims of patents now or hereafter owned or controlled by Contributor, to make, use,
sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof, but
solely to the extent that any such claim is necessary to enable you to make, use, sell, offer for
sale, have made, and/or otherwise dispose of Modifications or portions thereof or Derivative Works
thereof.
3. Exclusions From License Grant.
Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor or any Contributor except as expressly stated herein. No patent license is granted separate from the Licensed Product, for code that you delete from the Licensed Product, or for combinations of the Licensed Product with other software or hardware. No right is granted to the trademarks of Licensor or any Contributor even if such marks are included in the Licensed Product. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any code that Licensor otherwise would have a right to license.
Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents,
trade secrets or any other intellectual property of Licensor or any Contributor except as expressly
stated herein. No patent license is granted separate from the Licensed Product, for code that you
delete from the Licensed Product, or for combinations of the Licensed Product with other software
or hardware. No right is granted to the trademarks of Licensor or any Contributor even if such
marks are included in the Licensed Product. Nothing in this License shall be interpreted to
prohibit Licensor from licensing under different terms from this License any code that Licensor
otherwise would have a right to license.
4. Your Obligations Regarding Distribution.
a. Application of This License to Your Modifications. As an express condition for your use of the Licensed Product, you hereby agree that any Modifications that you create or to which you contribute, and which you distribute, are governed by the terms of this License including, without limitation, Section 2. Any Modifications that you create or to which you contribute may be distributed only under the terms of this License or a future version of this License released under Section 7. You must include a copy of this License with every copy of the Modifications you distribute. You agree not to offer or impose any terms on any Source Code or executable version of the Licensed Product or Modifications that alter or restrict the applicable version of this License or the recipients' rights hereunder. However, you may include an additional document offering the additional rights described in Section 4(e).
a. Application of This License to Your Modifications. As an express condition for your use of
the Licensed Product, you hereby agree that any Modifications that you create or to which you
contribute, and which you distribute, are governed by the terms of this License including, without
limitation, Section 2. Any Modifications that you create or to which you contribute may be
distributed only under the terms of this License or a future version of this License released under
Section 7. You must include a copy of this License with every copy of the Modifications you
distribute. You agree not to offer or impose any terms on any Source Code or executable version of
the Licensed Product or Modifications that alter or restrict the applicable version of this License
or the recipients' rights hereunder. However, you may include an additional document offering the
additional rights described in Section 4(e).
b. Availability of Source Code. You must make available, under the terms of this License, the Source Code of the Licensed Product and any Modifications that you distribute, either on the same media as you distribute any executable or other form of the Licensed Product, or via a mechanism generally accepted in the software development community for the electronic transfer of data (an "Electronic Distribution Mechanism"). The Source Code for any version of Licensed Product or Modifications that you distribute must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of said Licensed Product or Modifications has been made available. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party.
b. Availability of Source Code. You must make available, under the terms of this License, the
Source Code of the Licensed Product and any Modifications that you distribute, either on the same
media as you distribute any executable or other form of the Licensed Product, or via a mechanism
generally accepted in the software development community for the electronic transfer of data (an
"Electronic Distribution Mechanism"). The Source Code for any version of Licensed Product or
Modifications that you distribute must remain available for at least twelve (12) months after the
date it initially became available, or at least six (6) months after a subsequent version of said
Licensed Product or Modifications has been made available. You are responsible for ensuring that
the Source Code version remains available even if the Electronic Distribution Mechanism is
maintained by a third party.
c. Description of Modifications. You must cause any Modifications that you create or to which you contribute, and which you distribute, to contain a file documenting the additions, changes or deletions you made to create or contribute to those Modifications, and the dates of any such additions, changes or deletions. You must include a prominent statement that the Modifications are derived, directly or indirectly, from the Licensed Product and include the names of the Licensor and any Contributor to the Licensed Product in (i) the Source Code and (ii) in any notice displayed by a version of the Licensed Product you distribute or in related documentation in which you describe the origin or ownership of the Licensed Product. You may not modify or delete any preexisting copyright notices in the Licensed Product.
c. Description of Modifications. You must cause any Modifications that you create or to which
you contribute, and which you distribute, to contain a file documenting the additions, changes or
deletions you made to create or contribute to those Modifications, and the dates of any such
additions, changes or deletions. You must include a prominent statement that the Modifications are
derived, directly or indirectly, from the Licensed Product and include the names of the Licensor
and any Contributor to the Licensed Product in (i) the Source Code and (ii) in any notice displayed
by a version of the Licensed Product you distribute or in related documentation in which you
describe the origin or ownership of the Licensed Product. You may not modify or delete any
preexisting copyright notices in the Licensed Product.
d. Intellectual Property Matters.
i. Third Party Claims. If you have knowledge that a license to a third party's intellectual property right is required to exercise the rights granted by this License, you must include a text file with the Source Code distribution titled "LEGAL" that describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after you make any Modifications available as described in Section 4(b), you shall promptly modify the LEGAL file in all copies you make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Licensed Product from you that new knowledge has been obtained.
i. Third Party Claims. If you have knowledge that a license to a third party's
intellectual property right is required to exercise the rights granted by this License, you must
include a text file with the Source Code distribution titled "LEGAL" that describes the claim and
the party making the claim in sufficient detail that a recipient will know whom to contact. If you
obtain such knowledge after you make any Modifications available as described in Section 4(b), you
shall promptly modify the LEGAL file in all copies you make available thereafter and shall take
other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to
inform those who received the Licensed Product from you that new knowledge has been obtained.
ii. Contributor APIs. If your Modifications include an application programming interface ("API") and you have knowledge of patent licenses that are reasonably necessary to implement that API, you must also include this information in the LEGAL file.
ii. Contributor APIs. If your Modifications include an application programming interface
("API") and you have knowledge of patent licenses that are reasonably necessary to implement that
API, you must also include this information in the LEGAL file.
iii. Representations. You represent that, except as disclosed pursuant to 4(d)(i) above, you believe that any Modifications you distribute are your original creations and that you have sufficient rights to grant the rights conveyed by this License.
iii. Representations. You represent that, except as disclosed pursuant to 4(d)(i) above,
you believe that any Modifications you distribute are your original creations and that you have
sufficient rights to grant the rights conveyed by this License.
e. Required Notices. You must duplicate this License in any documentation you provide along with the Source Code of any Modifications you create or to which you contribute, and which you distribute, wherever you describe recipients' rights relating to Licensed Product. You must duplicate the notice contained in Exhibit A (the "Notice") in each file of the Source Code of any copy you distribute of the Licensed Product. If you created a Modification, you may add your name as a Contributor to the Notice. If it is not possible to put the Notice in a particular Source Code file due to its structure, then you must include such Notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Licensed Product. However, you may do so only on your own behalf, and not on behalf of the Licensor or any Contributor. You must make it clear that any such warranty, support, indemnity or liability obligation is offered by you alone, and you hereby agree to indemnify the Licensor and every Contributor for any liability incurred by the Licensor or such Contributor as a result of warranty, support, indemnity or liability terms you offer.
e. Required Notices. You must duplicate this License in any documentation you provide along
with the Source Code of any Modifications you create or to which you contribute, and which you
distribute, wherever you describe recipients' rights relating to Licensed Product. You must
duplicate the notice contained in Exhibit A (the "Notice") in each file of the Source Code of any
copy you distribute of the Licensed Product. If you created a Modification, you may add your name
as a Contributor to the Notice. If it is not possible to put the Notice in a particular Source Code
file due to its structure, then you must include such Notice in a location (such as a relevant
directory file) where a user would be likely to look for such a notice. You may choose to offer,
and charge a fee for, warranty, support, indemnity or liability obligations to one or more
recipients of Licensed Product. However, you may do so only on your own behalf, and not on behalf
of the Licensor or any Contributor. You must make it clear that any such warranty, support,
indemnity or liability obligation is offered by you alone, and you hereby agree to indemnify the
Licensor and every Contributor for any liability incurred by the Licensor or such Contributor as a
result of warranty, support, indemnity or liability terms you offer.
f. Distribution of Executable Versions. You may distribute Licensed Product as an executable program under a license of your choice that may contain terms different from this License provided (i) you have satisfied the requirements of Sections 4(a) through 4(e) for that distribution, (ii) you include a conspicuous notice in the executable version, related documentation and collateral materials stating that the Source Code version of the Licensed Product is available under the terms of this License, including a description of how and where you have fulfilled the obligations of Section 4(b), (iii) you retain all existing copyright notices in the Licensed Product, and (iv) you make it clear that any terms that differ from this License are offered by you alone, not by Licensor or any Contributor. You hereby agree to indemnify the Licensor and every Contributor for any liability incurred by Licensor or such Contributor as a result of any terms you offer.
f. Distribution of Executable Versions. You may distribute Licensed Product as an executable
program under a license of your choice that may contain terms different from this License provided
(i) you have satisfied the requirements of Sections 4(a) through 4(e) for that distribution, (ii)
you include a conspicuous notice in the executable version, related documentation and collateral
materials stating that the Source Code version of the Licensed Product is available under the terms
of this License, including a description of how and where you have fulfilled the obligations of
Section 4(b), (iii) you retain all existing copyright notices in the Licensed Product, and (iv) you
make it clear that any terms that differ from this License are offered by you alone, not by
Licensor or any Contributor. You hereby agree to indemnify the Licensor and every Contributor for
any liability incurred by Licensor or such Contributor as a result of any terms you offer.
g. Distribution of Derivative Works. You may create Derivative Works (e.g., combinations of some or all of the Licensed Product with other code) and distribute the Derivative Works as products under any other license you select, with the proviso that the requirements of this License are fulfilled for those portions of the Derivative Works that consist of the Licensed Product or any Modifications thereto.
g. Distribution of Derivative Works. You may create Derivative Works (e.g., combinations of
some or all of the Licensed Product with other code) and distribute the Derivative Works as
products under any other license you select, with the proviso that the requirements of this License
are fulfilled for those portions of the Derivative Works that consist of the Licensed Product or
any Modifications thereto.
5. Inability to Comply Due to Statute or Regulation.
If it is impossible for you to comply with any of the terms of this License with respect to some or all of the Licensed Product due to statute, judicial order, or regulation, then you must (i) comply with the terms of this License to the maximum extent possible, (ii) cite the statute or regulation that prohibits you from adhering to the License, and (iii) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 4(d), and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill at computer programming to be able to understand it.
If it is impossible for you to comply with any of the terms of this License with respect to some or
all of the Licensed Product due to statute, judicial order, or regulation, then you must (i) comply
with the terms of this License to the maximum extent possible, (ii) cite the statute or regulation
that prohibits you from adhering to the License, and (iii) describe the limitations and the code
they affect. Such description must be included in the LEGAL file described in Section 4(d), and
must be included with all distributions of the Source Code. Except to the extent prohibited by
statute or regulation, such description must be sufficiently detailed for a recipient of ordinary
skill at computer programming to be able to understand it.
6. Application of This License.
This License applies to code to which Licensor or Contributor has attached the Notice in Exhibit A, which is incorporated herein by this reference.
This License applies to code to which Licensor or Contributor has attached the Notice in Exhibit A,
which is incorporated herein by this reference.
7. Versions of This License.
a. Version. The Motosoto Open Source License is derived from the Jabber Open Source License. All changes are related to applicable law and the location of court.
a. Version. The Motosoto Open Source License is derived from the Jabber Open Source License.
All changes are related to applicable law and the location of court.
b. New Versions. Licensor may publish from time to time revised and/or new versions of the License.
b. New Versions. Licensor may publish from time to time revised and/or new versions of the
License.
c. Effect of New Versions. Once Licensed Product has been published under a particular version of the License, you may always continue to use it under the terms of that version. You may also choose to use such Licensed Product under the terms of any subsequent version of the License published by Licensor. No one other than Lic ensor has the right to modify the terms applicable to Licensed Product created under this License.
c. Effect of New Versions. Once Licensed Product has been published under a particular version
of the License, you may always continue to use it under the terms of that version. You may also
choose to use such Licensed Product under the terms of any subsequent version of the License
published by Licensor. No one other than Lic ensor has the right to modify the terms applicable to
Licensed Product created under this License.
d. Derivative Works of this License. If you create or use a modified version of this License, which you may do only in order to apply it to software that is not already a Licensed Product under this License, you must rename your license so that it is not confusingly similar to this License, and must make it clear that your license contains terms that differ from this License. In so naming your license, you may not use any trademark of Licensor or any Contributor.
d. Derivative Works of this License. If you create or use a modified version of this License,
which you may do only in order to apply it to software that is not already a Licensed Product under
this License, you must rename your license so that it is not confusingly similar to this License,
and must make it clear that your license contains terms that differ from this License. In so naming
your license, you may not use any trademark of Licensor or any Contributor.
8. Disclaimer of Warranty.
LICENSED PRODUCT IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE LICENSED PRODUCT IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LICENSED PRODUCT IS WITH YOU. SHOULD LICENSED PRODUCT PROVE DEFECTIVE IN ANY RESPECT, YOU (AND NOT THE LICENSOR OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF LICENSED PRODUCT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
LICENSED PRODUCT IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE LICENSED PRODUCT IS
FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE LICENSED PRODUCT IS WITH YOU. SHOULD LICENSED PRODUCT PROVE
DEFECTIVE IN ANY RESPECT, YOU (AND NOT THE LICENSOR OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF
ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
PART OF THIS LICENSE. NO USE OF LICENSED PRODUCT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS
DISCLAIMER.
9. Termination.
a. Automatic Termination Upon Breach. This license and the rights granted hereunder will terminate automatically if you fail to comply with the terms herein and fail to cure such breach within thirty (30) days of becoming aware of the breach. All sublicenses to the Licensed Product that are properly granted shall survive any termination of this license. Provisions that, by their nature, must remain in effect beyond the termination of this License, shall survive.
a. Automatic Termination Upon Breach. This license and the rights granted hereunder will
terminate automatically if you fail to comply with the terms herein and fail to cure such breach
within thirty (30) days of becoming aware of the breach. All sublicenses to the Licensed Product
that are properly granted shall survive any termination of this license. Provisions that, by their
nature, must remain in effect beyond the termination of this License, shall survive.
b. Termination Upon Assertion of Patent Infringement. If you initiate litigation by asserting a patent infringement claim (excluding declaratory judgment actions) against Licensor or a Contributor (Licensor or Contributor against whom you file such an action is referred to herein as "Respondent") alleging that Licensed Product directly or indirectly infringes any patent, then any and all rights granted by such Respondent to you under Sections 1 or 2 of this License shall terminate prospectively upon sixty (60) days notice from Respondent (the "Notice Period") unless within that Notice Period you either agree in writing (i) to pay Respondent a mutually agreeable reasonably royalty for your past or future use of Licensed Product made by such Respondent, or (ii) withdraw your litigation claim with respect to Licensed Product against such Respondent. If within said Notice Period a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Licensor to you under Sections 1 and 2 automatically terminate at the expiration of said Notice Period.
b. Termination Upon Assertion of Patent Infringement. If you initiate litigation by asserting
a patent infringement claim (excluding declaratory judgment actions) against Licensor or a
Contributor (Licensor or Contributor against whom you file such an action is referred to herein as
"Respondent") alleging that Licensed Product directly or indirectly infringes any patent, then any
and all rights granted by such Respondent to you under Sections 1 or 2 of this License shall
terminate prospectively upon sixty (60) days notice from Respondent (the "Notice Period") unless
within that Notice Period you either agree in writing (i) to pay Respondent a mutually agreeable
reasonably royalty for your past or future use of Licensed Product made by such Respondent, or (ii)
withdraw your litigation claim with respect to Licensed Product against such Respondent. If within
said Notice Period a reasonable royalty and payment arrangement are not mutually agreed upon in
writing by the parties or the litigation claim is not withdrawn, the rights granted by Licensor to
you under Sections 1 and 2 automatically terminate at the expiration of said Notice Period.
c. Reasonable Value of This License. If you assert a patent infringement claim against Respondent alleging that Licensed Product directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by said Respondent under Sections 1 and 2 shall be taken into account in determining the amount or value of any payment or license.
c. Reasonable Value of This License. If you assert a patent infringement claim against
Respondent alleging that Licensed Product directly or indirectly infringes any patent where such
claim is resolved (such as by license or settlement) prior to the initiation of patent infringement
litigation, then the reasonable value of the licenses granted by said Respondent under Sections 1
and 2 shall be taken into account in determining the amount or value of any payment or license.
d. No Retroactive Effect of Termination. In the event of termination under Sections 9(a) or 9(b) above, all end user license agreements (excluding licenses to distributors and reselle rs) that have been validly granted by you or any distributor hereunder prior to termination shall survive termination.
d. No Retroactive Effect of Termination. In the event of termination under Sections 9(a) or
9(b) above, all end user license agreements (excluding licenses to distributors and reselle rs)
that have been validly granted by you or any distributor hereunder prior to termination shall
survive termination.
10. Limitation of Liability.
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE LICENSOR, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF LICENSED PRODUCT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR
OTHERWISE, SHALL THE LICENSOR, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF LICENSED PRODUCT, OR ANY
SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES,
EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY's
NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE 
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY 
NOT APPLY TO YOU.
11. Responsibility for Claims. 
As between Licensor and Contributors, each party is responsible for claims and damages arising, 
directly or indirectly, out of its utilization of rights under this License. You agree to work with 
Licensor and Contributors to distribute such responsibility on an equitable basis. Nothing herein is 
intended or shall be deemed to constitute any admission of liability.
12. U.S. Government End Users. 
The Licensed Product is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), 
consisting of "commercial computer software" and "commercial computer software documentation," 
as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 
48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire 
Licensed Product with only those rights set forth herein.
13. Miscellaneous. 
This License represents the complete agreement concerning the subject matter hereof. If any 
provision of this License is held to be unenforceable, such provision shall be reformed only 
to the extent necessary to make it enforceable. This License shall be governed by Dutch law 
provisions. The application of the United Nations Convention on Contracts for the International 
Sale of Goods is expressly excluded. You and Licensor expressly waive any rights to a jury trial 
in any litigation concerning Licensed Product or this License. Any law or regulation that provides 
that the language of a contract shall be construed against the drafter shall not apply to this License.
14. Definition of "You" in This License. 
"You" throughout this License, whether in upper or lower case, means an individual or a legal entity 
exercising rights under, and complying with all of the terms of, this License or a future version of 
this License issued under Section 7. For legal entities, "you" includes any entity that controls, is 
controlled by, or is under common control with you. For purposes of this definition, "control" means 
(i) the power, direct or indirect, to cause the direction or management of such entity, whether by 
contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, 
or (iii) beneficial ownership of such entity.
15. Glossary.
All defined terms in this License that are used in more than one Section of this License are 
repeated here, in alphabetical order, for the convenience of the reader. The Section of this 
License in which each defined term is first used is shown in parentheses. 
Contributor: Each person or entity who created or contributed to the creation of, and distributed, a Modification. (See Section 2)
Derivative Works: That term as used in this License is defined under Dutch copyright law. (See Section 1(b))
License: This Motosoto Open Source License. (See first paragraph of License)
Licensed Product: Any Motosoto Product licensed pursuant to this License. The term
"Licensed Product" includes all previous Modifications from any Contributor that you receive. 
(See first paragraph of License and Section 2)
Licensor: Motosoto.Com B.V.. (See first paragraph of License)
Modifications: Any additions to or deletions from the substance or structure of (i) a file 
containing Licensed Product, or (ii) any new file that contains any part of Licensed Product. (See Section 2)
Notice: The notice contained in Exhibit A. (See Section 4(e))
Source Code: The preferred form for making modifications to the Licensed Product, including 
all modules contained therein, plus any associated interface definition files, scripts used 
to control compilation and installation of an executable program, or a list of differential 
comparisons against the Source Code of the Licensed Product. (See Section 1(a))
You: This term is defined in Section 14 of this License.
 
EXHIBIT A
The Notice below must appear in each file of the Source Code of any copy you distribute of the Licensed Product or any Modifications thereto. Contributors to any Modifications may add their own copyright notices to identify their own contributions.
License:
The contents of this file are subject to the Motosoto Open Source License Version 0.9 (the "License"). You may not copy or use this file, in either source code or executable form, except in compliance with the License. You may obtain a copy of the License at http://www.motosoto.com/license/ or at http://www.opensource.org/.
Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License.
Copyrights:
Portions created by or assigned to Motosoto.com B.V. are Copyright (c) 2000-2001 Motosoto.com B.V.
All Rights Reserved. Contact information for Motosoto.com B.V. is available at http://www.motosoto.com/.
Acknowledgements
Special thanks to the Motosoto Open Source Contributors for their suggestions and support of Motosoto.
Modifications:

144
options/license/SMAIL-GPL Normal file
View File

@ -0,0 +1,144 @@
SMAIL GENERAL PUBLIC LICENSE
(Clarified 11 Feb 1988)
Copyright (C) 1988 Landon Curt Noll & Ronald S. Karr
Copyright (C) 1992 Ronald S. Karr
Copyleft (GNU) 1988 Landon Curt Noll & Ronald S. Karr
Everyone is permitted to copy and distribute verbatim copies
of this license, but changing it is not allowed. You can also
use this wording to make the terms for other programs.
The license agreements of most software companies keep you at the
mercy of those companies. By contrast, our general public license is
intended to give everyone the right to share SMAIL. To make sure that
you get the rights we want you to have, we need to make restrictions
that forbid anyone to deny you these rights or to ask you to surrender
the rights. Hence this license agreement.
Specifically, we want to make sure that you have the right to give
away copies of SMAIL, that you receive source code or else can get it
if you want it, that you can change SMAIL or use pieces of it in new
free programs, and that you know you can do these things.
To make sure that everyone has such rights, we have to forbid you to
deprive anyone else of these rights. For example, if you distribute
copies of SMAIL, you must give the recipients all the rights that you
have. You must make sure that they, too, receive or can get the
source code. And you must tell them their rights.
Also, for our own protection, we must make certain that everyone
finds out that there is no warranty for SMAIL. If SMAIL is modified by
someone else and passed on, we want its recipients to know that what
they have is not what we distributed, so that any problems introduced
by others will not reflect on our reputation.
Therefore we (Landon Curt Noll and Ronald S. Karr) make the following
terms which say what you must do to be allowed to distribute or change
SMAIL.
COPYING POLICIES
1. You may copy and distribute verbatim copies of SMAIL source code
as you receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy a valid copyright notice "Copyright
(C) 1988 Landon Curt Noll & Ronald S. Karr" (or with whatever year is
appropriate); keep intact the notices on all files that refer to this
License Agreement and to the absence of any warranty; and give any
other recipients of the SMAIL program a copy of this License
Agreement along with the program. You may charge a distribution fee
for the physical act of transferring a copy.
2. You may modify your copy or copies of SMAIL or any portion of it,
and copy and distribute such modifications under the terms of
Paragraph 1 above, provided that you also do the following:
a) cause the modified files to carry prominent notices stating
that you changed the files and the date of any change; and
b) cause the whole of any work that you distribute or publish,
that in whole or in part contains or is a derivative of SMAIL or
any part thereof, to be licensed at no charge to all third
parties on terms identical to those contained in this License
Agreement (except that you may choose to grant more extensive
warranty protection to some or all third parties, at your option).
c) You may charge a distribution fee for the physical act of
transferring a copy, and you may at your option offer warranty
protection in exchange for a fee.
Mere aggregation of another unrelated program with this program (or its
derivative) on a volume of a storage or distribution medium does not bring
the other program under the scope of these terms.
3. You may copy and distribute SMAIL (or a portion or derivative of it,
under Paragraph 2) in object code or executable form under the terms of
Paragraphs 1 and 2 above provided that you also do one of the following:
a) accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of
Paragraphs 1 and 2 above; or,
b) accompany it with a written offer, valid for at least three
years, to give any third party free (except for a nominal
shipping charge) a complete machine-readable copy of the
corresponding source code, to be distributed under the terms of
Paragraphs 1 and 2 above; or,
c) accompany it with the information you received as to where the
corresponding source code may be obtained. (This alternative is
allowed only for non-commercial distribution and only if you
received the program in object code or executable form alone.)
For an executable file, complete source code means all the source code for
all modules it contains; but, as a special exception, it need not include
source code for modules which are standard libraries that accompany the
operating system on which the executable file runs.
4. You may not copy, sublicense, distribute or transfer SMAIL
except as expressly provided under this License Agreement. Any attempt
otherwise to copy, sublicense, distribute or transfer SMAIL is void and
your rights to use the program under this License agreement shall be
automatically terminated. However, parties who have received computer
software programs from you with this License Agreement will not have
their licenses terminated so long as such parties remain in full compliance.
5. If you wish to incorporate parts of SMAIL into other free
programs whose distribution conditions are different, write to Landon
Curt Noll & Ronald S. Karr via the Free Software Foundation at 51
Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. We have not yet
worked out a simple rule that can be stated here, but we will often
permit this. We will be guided by the two goals of preserving the
free status of all derivatives of our free software and of promoting
the sharing and reuse of software.
Your comments and suggestions about our licensing policies and our
software are welcome! This contract was based on the contract made by
the Free Software Foundation. Please contact the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
USA, or call (617) 542-5942 for details on copylefted material in
general.
NO WARRANTY
BECAUSE SMAIL IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY NO
WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING, LANDON CURT NOLL & RONALD S. KARR AND/OR
OTHER PARTIES PROVIDE SMAIL "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF SMAIL IS WITH
YOU. SHOULD SMAIL PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
NECESSARY SERVICING, REPAIR OR CORRECTION.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL LANDON CURT NOLL &
RONALD S. KARR AND/OR ANY OTHER PARTY WHO MAY MODIFY AND REDISTRIBUTE
SMAIL AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
LOST PROFITS, LOST MONIES, OR OTHER SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A FAILURE OF THE
PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) SMAIL, EVEN IF YOU HAVE
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY
ANY OTHER PARTY.

View File

@ -0,0 +1,11 @@
This software may be redistributed under the terms of the GPL, LGPL,
modified BSD, or Artistic license, or any of the other OSI approved
licenses listed at http://www.opensource.org/licenses/alphabetical.
Distribution is allowed under all of these licenses, or any smaller
subset of multiple or just one of these licenses.
When using a packaged version, please refer to the package metadata to see
under which license terms it was distributed. Alternatively, a distributor
may choose to replace the LICENSE section of the documentation and/or
include a LICENSE file to reflect the license(s) they chose to redistribute
under.

View File

@ -0,0 +1,17 @@
Copyright (C) 2008, Damien Miller
Copyright (C) 2011, Alex Hornung
Permission to use, copy, and modify this software with or without fee
is hereby granted, provided that this entire notice is included in
all copies of any software which is or includes a copy or
modification of this software.
You may use this code under the GNU public license if you so wish. Please
contribute changes back to the authors under this freer than GPL license
so that we may further the use of strong encryption without limitations to
all.
THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
PURPOSE.

View File

@ -0,0 +1,16 @@
Mini-XML
Copyright © 2003-2024 by Michael R Sweet
(Optional) Exceptions to the Apache 2.0 License:
================================================
In addition, if you combine or link compiled forms of this Software with
software that is licensed under the GPLv2 or LGPLv2 (“Combined Software”) and if
a court of competent jurisdiction determines that the patent provision (Section
3), the indemnity provision (Section 9) or other Section of the License
conflicts with the conditions of the GPLv2 or LGPLv2, you may retroactively and
prospectively choose to deem waived or otherwise exclude such Section(s) of the
License, but only in their entirety and only with respect to the Combined
Software.

5
options/license/wwl Normal file
View File

@ -0,0 +1,5 @@
db@FreeBSD.ORG wrote this file. As long as you retain this notice you
can do whatever you want with this code, except you may not
license it under any form of the GPL.
A postcard or QSL card showing me you appreciate
this code would be nice. Diane Bruce va3db

View File

@ -104,6 +104,7 @@ copy_url=Kopírovat URL
copy_hash=Kopírovat hash
copy_content=Kopírovat obsah
copy_branch=Kopírovat jméno větve
copy_path=Zkopírovat cestu
copy_success=Zkopírováno!
copy_error=Kopírování se nezdařilo
copy_type_unsupported=Tento typ souboru nelze zkopírovat
@ -159,6 +160,7 @@ filter.public=Veřejná
filter.private=Soukromý
no_results_found=Nebyly nalezeny žádné výsledky.
internal_error_skipped=Došlo k vnitřní chybě, ale je přeskočena: %s
[search]
search=Hledat...
@ -177,6 +179,8 @@ code_search_by_git_grep=Aktuální výsledky vyhledávání kódu jsou poskytov
package_kind=Hledat balíčky...
project_kind=Hledat projekty...
branch_kind=Hledat větve...
tag_kind=Prohledat značky...
tag_tooltip=Hledat odpovídající značky. Použijte „%“ pro vyhledání libovolné posloupnosti číslic.
commit_kind=Hledat commity...
runner_kind=Hledat runnery...
no_results=Nebyly nalezeny žádné odpovídající výsledky.
@ -206,6 +210,10 @@ buttons.link.tooltip=Přidat odkaz
buttons.list.unordered.tooltip=Přidat seznam odrážek
buttons.list.ordered.tooltip=Přidat číslovaný seznam
buttons.list.task.tooltip=Přidat seznam úloh
buttons.table.add.tooltip=Přidat tabulku
buttons.table.add.insert=Přidat
buttons.table.rows=Řádky
buttons.table.cols=Sloupce
buttons.mention.tooltip=Uveďte uživatele nebo tým
buttons.ref.tooltip=Odkaz na issue nebo pull request
buttons.switch_to_legacy.tooltip=Místo toho použít starší editor
@ -218,16 +226,20 @@ string.desc=Z A
[error]
occurred=Došlo k chybě
report_message=Pokud jste si jisti, že se jedná o chybu Gitea, prosím vyhledejte problémy na <a href="%s" target="_blank">GitHub</a> a v případě potřeby založte nový problém.
not_found=Cíl nebyl nalezen.
network_error=Chyba sítě
[startpage]
app_desc=Snadno přístupný vlastní Git
install=Jednoduchá na instalaci
install_desc=Jednoduše <a target="_blank" rel="noopener noreferrer" href="%s">spusťte jako binární program</a> pro vaši platformu, nasaďte jej pomocí <a target="_blank" rel="noopener noreferrer" href="%s">Docker</a>, nebo jej stáhněte jako <a target="_blank" rel="noopener noreferrer" href="%s">balíček</a>.
platform=Multiplatformní
platform_desc=Gitea běží všude, kde <a target="_blank" rel="noopener noreferrer" href="%s">Go</a> může kompilovat: Windows, macOS, Linux, ARM, atd. Vyberte si ten, který milujete!
lightweight=Lehká
lightweight_desc=Gitea má minimální požadavky a může běžet na Raspberry Pi. Šetřete energii vašeho stroje!
license=Open Source
license_desc=Vše je na <a target="_blank" rel="noopener noreferrer" href="%[1]s">%[2]s</a>! Připojte se tím, že <a target="_blank" rel="noopener noreferrer" href="%[3]s">přispějete</a> a uděláte tento projekt ještě lepší. Nestyďte se být přispěvatel!
[install]
install=Instalace
@ -341,6 +353,7 @@ enable_update_checker=Povolit kontrolu aktualizací
enable_update_checker_helper=Kontroluje vydání nových verzí pravidelně připojením ke gitea.io.
env_config_keys=Konfigurace prostředí
env_config_keys_prompt=Následující proměnné prostředí budou také použity pro váš konfigurační soubor:
config_write_file_prompt=Tyto možnosti konfigurace budou zapsány do: %s
[home]
nav_menu=Navigační menu
@ -381,6 +394,8 @@ relevant_repositories=Zobrazují se pouze relevantní repositáře, <a href="%s"
[auth]
create_new_account=Registrovat účet
already_have_account=Již máte účet?
sign_in_now=Přihlásit se!
disable_register_prompt=Registrace jsou vypnuty. Prosíme, kontaktujte správce systému.
disable_register_mail=E-mailové potvrzení o registraci je zakázané.
manual_activation_only=Pro dokončení aktivace kontaktujte správce webu.
@ -388,6 +403,8 @@ remember_me=Pamatovat si toto zařízení
remember_me.compromised=Přihlašovací token již není platný, což může znamenat napadení účtu. Zkontrolujte prosím svůj účet pro neobvyklé aktivity.
forgot_password_title=Zapomenuté heslo
forgot_password=Zapomenuté heslo?
need_account=Potřebujete účet?
sign_up_now=Zaregistruj se nyní.
sign_up_successful=Účet byl úspěšně vytvořen. Vítejte!
confirmation_mail_sent_prompt_ex=Nový potvrzovací e-mail byl odeslán na <b>%s</b>. Zkontrolujte prosím svou doručenou poštu během následujících %s a dokončete proces registrace. Pokud je Vaše registrační e-mailová adresa nesprávná, můžete se znovu přihlásit a změnit ji.
must_change_password=Aktualizujte své heslo
@ -446,8 +463,11 @@ authorize_title=Autorizovat „%s“ pro přístup k vašemu účtu?
authorization_failed=Autorizace selhala
authorization_failed_desc=Autorizace selhala, protože jsme detekovali neplatný požadavek. Kontaktujte prosím správce aplikace, kterou jste se pokoušeli autorizovat.
sspi_auth_failed=SSPI autentizace selhala
password_pwned=Heslo, které jste zvolili, je na <a target="_blank" rel="noopener noreferrer" href="%s">seznamu odcizených hesel</a> dříve odhalených při narušení veřejných dat. Zkuste to prosím znovu s jiným heslem a zvažte změnu tohoto hesla i jinde.
password_pwned_err=Nelze dokončit požadavek na HaveIBeenPwned
last_admin=Nelze odstranit posledního správce. Musí existovat alespoň jeden správce.
signin_passkey=Přihlásit se pomocí přístupového klíče
back_to_sign_in=Zpět na přihlášení
[mail]
view_it_on=Zobrazit na %s
@ -464,6 +484,7 @@ activate_email=Ověřte vaši e-mailovou adresu
activate_email.title=%s, prosím ověřte vaši e-mailovou adresu
activate_email.text=Pro aktivaci vašeho účtu do <b>%s</b> klikněte na následující odkaz:
register_notify=Vítejte v %s
register_notify.title=%[1]s vítejte v %[2]s
register_notify.text_1=toto je váš potvrzovací e-mail pro %s!
register_notify.text_2=Nyní se můžete přihlásit přes uživatelské jméno: %s.
@ -565,6 +586,8 @@ lang_select_error=Vyberte jazyk ze seznamu.
username_been_taken=Uživatelské jméno je již obsazeno.
username_change_not_local_user=Uživatelé, kteří jsou ověřováni jinak než lokálně, si nemohou změnit uživatelské jméno.
change_username_disabled=Změna uživatelského jména je zakázána.
change_full_name_disabled=Změna celého jména je zakázána.
username_has_not_been_changed=Uživatelské jméno nebylo změněno
repo_name_been_taken=Název repozitáře je již použit.
repository_force_private=Vynucené soukromí je povoleno: soukromé repozitáře nelze zveřejnit.
@ -614,6 +637,7 @@ org_still_own_repo=Organizace stále vlastní jeden nebo více repozitářů. Ne
org_still_own_packages=Organizace stále vlastní jeden nebo více balíčků. Nejdříve je smažte.
target_branch_not_exist=Cílová větev neexistuje.
target_ref_not_exist=Cílové reference neexistuje %s
admin_cannot_delete_self=Nemůžete se smazat, dokud jste správce. Nejdříve prosím odeberte svá administrátorská oprávnění.
@ -689,6 +713,8 @@ public_profile=Veřejný profil
biography_placeholder=Řekněte nám něco o sobě! (Můžete použít Markdown)
location_placeholder=Sdílejte svou přibližnou polohu s ostatními
profile_desc=Nastavte, jak bude váš profil zobrazen ostatním uživatelům. Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla a operace Git.
password_username_disabled=Nemáte oprávnění měnit jejich uživatelské jméno. Pro více informací kontaktujte svého administrátora.
password_full_name_disabled=Nemáte oprávnění měnit jejich celé jméno. Pro více informací kontaktujte správce webu.
full_name=Celé jméno
website=Web
location=Místo
@ -899,6 +925,7 @@ create_oauth2_application_success=Úspěšně jste vytvořili novou OAuth2 aplik
update_oauth2_application_success=Úspěšně jste aktualizovali OAuth2 aplikaci.
oauth2_application_name=Název aplikace
oauth2_confidential_client=Důvěrný klient. Vyberte aplikace, které zachovávají důvěrnosti v utajení, jako jsou webové aplikace. Nevybírejte pro nativní aplikace včetně stolních a mobilních aplikací.
oauth2_skip_secondary_authorization=Přeskočit autorizaci pro veřejné klienty po udělení přístupu. <strong>Může představovat bezpečnostní riziko.</strong>
oauth2_redirect_uris=Přesměrování URI. Použijte nový řádek pro každou URI.
save_application=Uložit
oauth2_client_id=ID klienta
@ -918,21 +945,26 @@ revoke_oauth2_grant=Zrušit přístup
revoke_oauth2_grant_description=Zrušením přístupu této aplikaci třetí strany ji zabráníte v přístupu k vašim datům. Jste si jisti?
revoke_oauth2_grant_success=Přístup byl úspěšně zrušen.
twofa_desc=Chcete-li svůj účet ochránit před krádeží hesla, můžete použít chytrý telefon nebo jiné zařízení pro příjem jednorázových časových hesel („TOTP“).
twofa_recovery_tip=Pokud ztratíte své zařízení, budete moci použít jednorázový obnovovací klíč k získání přístupu k vašemu účtu.
twofa_is_enrolled=Váš účet aktuálně <strong>používá</strong> dvoufaktorové ověřování.
twofa_not_enrolled=Váš účet aktuálně nepoužívá dvoufaktorové ověřování.
twofa_disable=Zakázat dvoufaktorové ověřování
twofa_scratch_token_regenerate=Obnovit jednorázový obnovovací klíč
twofa_scratch_token_regenerated=Váš jednorázový obnovovací klíč je nyní %s. Uložte jej na bezpečném místě, protože se znovu nezobrazí.
twofa_enroll=Povolit dvoufaktorové ověřování
twofa_disable_note=Dvoufaktorové ověřování můžete zakázat, když bude potřeba.
twofa_disable_desc=Zakážete-li dvoufaktorové ověřování, bude váš účet méně zabezpečený. Pokračovat?
regenerate_scratch_token_desc=Jestli jste někam založili váš záložní klíč nebo jste jej již použili k přihlášení, můžete jej resetovat zde.
twofa_disabled=Dvoufaktorové ověřování bylo zakázáno.
scan_this_image=Naskenujte tento obrázek s vaší ověřovací aplikací:
or_enter_secret=Nebo zadejte tajný kód: %s
then_enter_passcode=A zadejte přístupový kód zobrazený ve vaší aplikaci:
passcode_invalid=Přístupový kód není platný. Zkuste to znovu.
twofa_enrolled=Váš účet byl úspěšně zaregistrován. Uložte si jednorázový obnovovací klíč (%s) na bezpečném místě, protože se již nebude zobrazovat.
twofa_failed_get_secret=Nepodařilo se získat tajemství.
webauthn_desc=Bezpečnostní klíče jsou hardwarová zařízení obsahující kryptografické klíče. Mohou být použity pro dvoufaktorové ověřování. Bezpečnostní klíče musí podporovat <a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a> standard.
webauthn_register_key=Přidat bezpečnostní klíč
webauthn_nickname=Přezdívka
webauthn_delete_key=Odstranit bezpečnostní klíč
@ -1009,7 +1041,6 @@ generate_repo=Generovat repozitář
generate_from=Generovat z
repo_desc=Popis
repo_desc_helper=Zadejte krátký popis (volitelné)
repo_lang=Jazyk
repo_gitignore_helper=Vyberte šablony .gitignore.
repo_gitignore_helper_desc=Vyberte soubory, které nechcete sledovat ze seznamu šablon pro běžné jazyky. Typické artefakty generované nástroji pro sestavení každého jazyka jsou ve výchozím stavu součástí .gitignore.
issue_labels=Štítky úkolů
@ -1017,6 +1048,7 @@ issue_labels_helper=Vyberte sadu štítků úkolů.
license=Licence
license_helper=Vyberte licenční soubor.
license_helper_desc=Licence řídí, co ostatní mohou a nemohou dělat s vaším kódem. Nejste si jisti, která je pro váš projekt správná? Podívejte se na <a target="_blank" rel="noopener noreferrer" href="%s">Zvolte licenci</a>
multiple_licenses=Více licencí
object_format=Formát objektu
object_format_helper=Objektový formát repozitáře. Nelze později změnit. SHA1 je nejvíce kompatibilní.
readme=README
@ -1077,7 +1109,9 @@ tree_path_not_found_branch=Cesta %[1]s ve větvi %[2]s neexistuje
tree_path_not_found_tag=Cesta %[1]s ve značce %[2]s neexistuje
transfer.accept=Přijmout převod
transfer.accept_desc=Převést do „%s“
transfer.reject=Odmítnout převod
transfer.reject_desc=Zrušit převod do „%s“
transfer.no_permission_to_accept=Nemáte oprávnění k přijetí tohoto převodu.
transfer.no_permission_to_reject=Nemáte oprávnění k odmítnutí tohoto převodu.
@ -1152,6 +1186,11 @@ migrate.gogs.description=Migrovat data z notabug.com nebo jiných Gogs instancí
migrate.onedev.description=Migrovat data z code.onedev.io nebo jiných OneDev instancí.
migrate.codebase.description=Migrovat data z codebasehq.com.
migrate.gitbucket.description=Migrovat data z GitBucket instancí.
migrate.codecommit.description=Přenést data z AWS CodeCommit.
migrate.codecommit.aws_access_key_id=AWS Access Key ID
migrate.codecommit.aws_secret_access_key=AWS Secret Access Key
migrate.codecommit.https_git_credentials_username=HTTPS Git uživatelské jméno
migrate.codecommit.https_git_credentials_password=HTTPS Git heslo
migrate.migrating_git=Migrování data gitu
migrate.migrating_topics=Migrování témat
migrate.migrating_milestones=Migrování milnků
@ -1212,6 +1251,7 @@ releases=Vydání
tag=Značka
released_this=vydal/a toto
tagged_this=označil/a
file.title=%s v %s
file_raw=Surový
file_history=Historie
file_view_source=Zobrazit zdroj
@ -1228,6 +1268,7 @@ ambiguous_runes_header=`Tento soubor obsahuje nejednoznačné znaky Unicode`
ambiguous_runes_description=`Tento soubor obsahuje znaky Unicode, které mohou být zaměněny s jinými znaky. 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í.`
invisible_runes_line=`Tento řádek má neviditelné znaky Unicode`
ambiguous_runes_line=`Tento řádek má nejednoznačné znaky Unicode`
ambiguous_character=`%[1]c [U+%04[1]X] je zaměnitelný s %[2]c [U+%04[2]X]`
escape_control_characters=Escape sekvence
unescape_control_characters=Bez escape sekvencí
@ -1416,8 +1457,6 @@ issues.new.no_items=Žádné položky
issues.new.milestone=Milník
issues.new.no_milestone=Bez milníku
issues.new.clear_milestone=Smazat milník
issues.new.open_milestone=Otevřít milník
issues.new.closed_milestone=Zavřené milníky
issues.new.assignees=Zpracovatelé
issues.new.clear_assignees=Smazat zpracovatele
issues.new.no_assignees=Bez zpracovatelů
@ -1450,6 +1489,7 @@ issues.remove_labels=odstranil/a %s štítky %s
issues.add_remove_labels=přidáno %s a odebráno %s štítků %s
issues.add_milestone_at=`přidal/a toto do milníku <b>%s</b> %s`
issues.add_project_at=`přidal/a toto do projektu <b>%s</b> %s`
issues.move_to_column_of_project=`přesunul/a toto do %s v %s na %s`
issues.change_milestone_at=`upravil/a milník z <b>%s</b> na <b>%s</b> %s`
issues.change_project_at=`upravil/a projekt z <b>%s</b> na <b>%s</b> %s`
issues.remove_milestone_at=`odstranil/a toto z milníku <b>%s</b> %s`
@ -1624,27 +1664,20 @@ issues.comment_on_locked=Nemůžete komentovat uzamčený úkol.
issues.delete=Smazat
issues.delete.title=Smazat tento úkol?
issues.delete.text=Opravdu chcete tento úkol smazat? (Tím se trvale odstraní veškerý obsah. Pokud jej hodláte archivovat, zvažte raději jeho uzavření.)
issues.tracker=Sledování času
issues.start_tracking_short=Spustit časovač
issues.start_tracking=Spustit sledování času
issues.start_tracking_history=`započal/a práci %s`
issues.tracker_auto_close=Časovač se automaticky zastaví po zavření tohoto úkolu
issues.tracking_already_started=`Již jste spustili sledování času na <a href="%s">jiném úkolu</a>!`
issues.stop_tracking=Zastavit časovač
issues.stop_tracking_history=`ukončil/a práci %s`
issues.cancel_tracking=Zahodit
issues.cancel_tracking_history=`zrušil/a sledování času %s`
issues.add_time=Přidat čas ručně
issues.del_time=Odstranit tento časový záznam
issues.add_time_short=Přidat čas
issues.add_time_cancel=Zrušit
issues.add_time_history=`přidal/a strávený čas %s`
issues.del_time_history=`odstranil/a strávený čas %s`
issues.add_time_hours=Hodiny
issues.add_time_minutes=Minuty
issues.add_time_sum_to_small=Čas nebyl zadán.
issues.time_spent_total=Celkový strávený čas
issues.time_spent_from_all_authors=`Celkový strávený čas: %s`
issues.due_date=Termín dokončení
issues.invalid_due_date_format=Termín dokončení musí být ve formátu 'rrrr-mm-dd'.
issues.error_modifying_due_date=Změna termínu dokončení selhala.
@ -1698,6 +1731,7 @@ issues.dependency.add_error_dep_not_same_repo=Oba úkoly musí být ve stejném
issues.review.self.approval=Nemůžete schválit svůj pull request.
issues.review.self.rejection=Nemůžete požadovat změny ve svém vlastním pull requestu.
issues.review.approve=schválil tyto změny %s
issues.review.comment=posoudil/a %s
issues.review.dismissed=zamítl/a posouzení od %s %s
issues.review.dismissed_label=Zamítnuto
issues.review.left_comment=zanechal komentář
@ -1705,7 +1739,7 @@ issues.review.content.empty=Je potřeba zanechat poznámku s uvedením požadova
issues.review.reject=požadované změny %s
issues.review.wait=byl požádán o posouzení %s
issues.review.add_review_request=vyžádal posouzení od %s %s
issues.review.remove_review_request=odstranil žádost o posouzení na %s %s
issues.review.remove_review_request=odstranil/a žádost o posouzení na %s %s
issues.review.remove_review_request_self=odmítl posoudit %s
issues.review.pending=Čekající
issues.review.pending.tooltip=Tento komentář není momentálně viditelný pro ostatní uživatele. Chcete-li odeslat Vaše čekající komentáře, vyberte „%s“ → „%s/%s/%s“ v horní části stránky.
@ -1723,6 +1757,11 @@ issues.review.resolve_conversation=Vyřešit konverzaci
issues.review.un_resolve_conversation=Nevyřešit konverzaci
issues.review.resolved_by=označil tuto konverzaci jako vyřešenou
issues.review.commented=Okomentovat
issues.review.official=Schváleno
issues.review.requested=Čeká na posouzení
issues.review.rejected=Požadovány změny
issues.review.stale=Aktualizováno od schválení
issues.review.unofficial=Nezapočtené schválení
issues.assignee.error=Ne všichni zpracovatelé byli přidáni z důvodu neočekávané chyby.
issues.reference_issue.body=Tělo zprávy
issues.content_history.deleted=vymazáno
@ -1739,6 +1778,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.new.must_collaborator=Musíte být spolupracovníkem pro vytvoření pull requestu.
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
@ -1795,6 +1835,8 @@ pulls.is_empty=Změny na této větvi jsou již na cílové větvi. Toto bude pr
pulls.required_status_check_failed=Některé požadované kontroly nebyly úspěšné.
pulls.required_status_check_missing=Některé požadované kontroly chybí.
pulls.required_status_check_administrator=Jako administrátor stále můžete sloučit tento pull request.
pulls.blocked_by_approvals=Tento pull request ještě nemá dostatek schválení. Uděleno %d z %d udělených oficiálních schválení.
pulls.blocked_by_approvals_whitelisted=Tento pull request nemá ještě nemá dostatek požadovaných schválení. %d z %d schválení udělených uživateli nebo týmy na seznamu povolených.
pulls.blocked_by_rejection=Tento pull request obsahuje změny požadované oficiálním posuzovatelem.
pulls.blocked_by_official_review_requests=Tento pull request obsahuje oficiální žádosti o posouzení.
pulls.blocked_by_outdated_branch=Tento pull request je zablokován, protože je zastaralý.
@ -1836,7 +1878,9 @@ pulls.unrelated_histories=Sloučení selhalo: Hlavní a základní revize nesdí
pulls.merge_out_of_date=Sloučení selhalo: Základ byl aktualizován při generování sloučení. Tip: Zkuste to znovu.
pulls.head_out_of_date=Sloučení selhalo: Hlavní revize byla aktualizován při generování sloučení. Tip: Zkuste to znovu.
pulls.has_merged=Chyba: Pull request byl sloučen, nelze znovu sloučit nebo změnit cílovou větev.
pulls.push_rejected=Nahrání se nezdařilo: Nahrání bylo zamítnuto. Zkontrolujte háčky Gitu pro tento repozitář.
pulls.push_rejected_summary=Úplná zpráva o odmítnutí
pulls.push_rejected_no_message=Nahrání se nezdařilo: Nahrání bylo odmítnuto, ale nebyla nalezena žádná vzdálená zpráva. Zkontrolujte háčky gitu pro tento repozitář
pulls.open_unmerged_pull_exists=`Nemůžete provést operaci znovuotevření protože je tu čekající pull request (#%d) s identickými vlastnostmi.`
pulls.status_checking=Některé kontroly jsou nedořešeny
pulls.status_checks_success=Všechny kontroly byly úspěšné
@ -1860,6 +1904,7 @@ 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.
pulls.cmd_instruction_merge_warning=Varování: Tato operace nemůže sloučit požadavek na natažení, protože „autodetekce manuálních sloučení“ nebyla povolena
pulls.clear_merge_message=Vymazat zprávu o sloučení
pulls.clear_merge_message_hint=Vymazání zprávy o sloučení odstraní pouze obsah zprávy a ponechá generované přídavky gitu jako "Co-AuthoreBy …".
@ -1881,6 +1926,7 @@ pulls.delete.text=Opravdu chcete tento pull request smazat? (Tím se trvale odst
pulls.recently_pushed_new_branches=Nahráli jste větev <strong>%[1]s</strong> %[2]s
pull.deleted_branch=(odstraněno):%s
pull.agit_documentation=Prohlédněte si dokumentaci o AGit
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
@ -1891,6 +1937,7 @@ milestones.no_due_date=Bez lhůty dokončení
milestones.open=Otevřít
milestones.close=Zavřít
milestones.new_subheader=Milníky vám pomohou organizovat úkoly a sledovat jejich pokrok.
milestones.completeness=<strong>%d%%</strong> Dokončeno
milestones.create=Vytvořit milník
milestones.title=Název
milestones.desc=Popis
@ -2113,6 +2160,7 @@ settings.pulls.default_delete_branch_after_merge=Ve výchozím nastavení mazat
settings.pulls.default_allow_edits_from_maintainers=Ve výchozím nastavení povolit úpravy od správců
settings.releases_desc=Povolit vydání v repozitáři
settings.packages_desc=Povolit registr balíčků repozitáře
settings.projects_desc=Povolit projekty
settings.projects_mode_desc=Režim projektů (druhy projektů k zobrazení)
settings.projects_mode_repo=Pouze projekty repozitáře
settings.projects_mode_owner=Pouze projekty uživatele nebo organizace
@ -2152,6 +2200,7 @@ settings.transfer_in_progress=V současné době probíhá převod. Zrušte jej,
settings.transfer_notices_1=- Ztratíte přístup k repozitáři, pokud jej převedete na uživatele.
settings.transfer_notices_2=- Zůstane vám přístup k repozitáři, pokud jej převedete na organizaci kterou (spolu)vlastníte.
settings.transfer_notices_3=- Pokud je repozitář soukromý a je předán jednotlivému uživateli, tato akce se ujistí, že uživatel má alespoň oprávnění ke čtení (a v případě potřeby změní oprávnění).
settings.transfer_notices_4=- Pokud repozitář patří organizaci a převádíte ho na jinou organizaci nebo jednotlivce, ztratíte odkazy mezi problémy repositáře a projektovou tabulí organizace.
settings.transfer_owner=Nový vlastník
settings.transfer_perform=Provést převod
settings.transfer_started=Tento repozitář byl označen pro převod a čeká na potvrzení od „%s“
@ -2251,6 +2300,7 @@ settings.event_wiki_desc=Wiki stránka vytvořena, přejmenována nebo smazána.
settings.event_release=Vydání
settings.event_release_desc=Vydání v tomto repozitáři bylo publikováno, aktualizováno nebo smazáno.
settings.event_push=Nahrát
settings.event_force_push=Vynucené nahrání
settings.event_push_desc=Nahrání pomocí Gitu do repozitáře.
settings.event_repository=Repozitář
settings.event_repository_desc=Repozitář vytvořen nebo smazán.
@ -2287,6 +2337,7 @@ settings.event_pull_request_merge=Sloučení pull requestu
settings.event_package=Balíček
settings.event_package_desc=Balíček vytvořen nebo odstraněn v repozitáři.
settings.branch_filter=Filtr větví
settings.branch_filter_desc=Povolené větve pro události nahrání, vytvoření větve a smazání větve jsou určeny pomocí zástupného vzoru. Pokud je prázdný nebo <code>*</code>, všechny události jsou ohlášeny. Podívejte se na dokumentaci syntaxe na <a href="%[1]s">github.com/gobwas/glob</a>. Příklady: <code>master</code>, <code>{master,release*}</code>.
settings.authorization_header=Autorizační hlavička
settings.authorization_header_desc=Pokud vyplněno, bude připojeno k požadavkům jako autorizační hlavička. Příklady: %s.
settings.active=Aktivní
@ -2337,22 +2388,48 @@ settings.protected_branch.save_rule=Uložit pravidlo
settings.protected_branch.delete_rule=Odstranit pravidlo
settings.protected_branch_can_push=Povolit nahrání?
settings.protected_branch_can_push_yes=Můžete nahrávat
settings.protected_branch_can_push_no=Nemůžete nahrávat
settings.branch_protection=Pravidla ochrany větve pro větev „<b>%s</b>“
settings.protect_this_branch=Povolit ochranu větví
settings.protect_this_branch_desc=Zabraňuje smazání a omezuje gitu nahrávání a slučování do větve.
settings.protect_disable_push=Zakázat nahrávání
settings.protect_disable_push_desc=Žádné nahrávání do této větve nebude povoleno.
settings.protect_disable_force_push=Zakázat vynucené nahrání
settings.protect_disable_force_push_desc=Do této větve nebude povoleno žádné vynucené nahrání.
settings.protect_enable_push=Povolit nahrávání
settings.protect_enable_push_desc=Každý, kdo má přístup k zápisu, bude moci nahrávat do této větve (ale ne vynucená nahrávání).
settings.protect_enable_force_push_all=Povolit vynucené nahrání
settings.protect_enable_force_push_all_desc=Každý, kdo má přístup k nahrávání, bude moci vynutit nahrání do této větve.
settings.protect_enable_force_push_allowlist=Povolit vynucené nahrání jen vyjmenovaným
settings.protect_enable_force_push_allowlist_desc=Pouze uživatelé nebo týmy s přístupem k nahrávání budou moci vynutit nahrání do této větve.
settings.protect_enable_merge=Povolit sloučení
settings.protect_enable_merge_desc=Každému, kdo má přístup k zápisu, bude povoleno sloučit pull requesty do této větve.
settings.protect_whitelist_committers=Povolit nahrání jen vyjmenovaným
settings.protect_whitelist_committers_desc=Pouze povolení uživatelé budou moci nahrávat do této větve (ale ne vynucení nahrávání).
settings.protect_whitelist_deploy_keys=Povolit nahrání klíčům pro nasazení s přístupem pro zápis.
settings.protect_whitelist_users=Povolení uživatelé pro nahrávání:
settings.protect_whitelist_teams=Povolené týmy pro nahrávání:
settings.protect_force_push_allowlist_users=Povolení uživatelé pro vynucené nahrávání:
settings.protect_force_push_allowlist_teams=Povolené týmy pro vynucené nahrávání:
settings.protect_force_push_allowlist_deploy_keys=Povolte klíče pro nasazení s přístupem pro nahrávání, aby mohly provádět vynucené nahrávání.
settings.protect_merge_whitelist_committers=Povolit vyjmenovaným slučování
settings.protect_merge_whitelist_committers_desc=Povolit pouze vyjmenovaným uživatelům nebo týmům slučovat pull requesty do této větve.
settings.protect_merge_whitelist_users=Povolení uživatelé pro slučování:
settings.protect_merge_whitelist_teams=Povolené týmy pro slučování:
settings.protect_check_status_contexts=Povolit kontrolu stavu
settings.protect_status_check_patterns=Vzorce kontroly stavu:
settings.protect_status_check_patterns_desc=Zadejte vzory pro určení, které kontroly stavu musí projít před sloučením větví do větve, která odpovídá tomuto pravidlu. Každý řádek určuje vzor. Vzory nemohou být prázdné.
settings.protect_check_status_contexts_desc=Požadovat kontrolu stavu před sloučením. Pokud je povoleno, revize musí být nejprve nahrány do jiné větve, projít kontrolou stavu, a následné sloučeny nebo přímo nahrány do větve, která vyhovuje tomuto pravidlu. Pokud nejsou vybrány žádné kontexty, musí být poslední potvrzení úspěšné bez ohledu na kontext.
settings.protect_check_status_contexts_list=Kontroly stavu pro tento repozitář zjištěné během posledního týdne
settings.protect_status_check_matched=Odpovídá
settings.protect_invalid_status_check_pattern=Neplatný vzor kontroly stavu: „%s“.
settings.protect_no_valid_status_check_patterns=Žádné platné vzory kontroly stavu.
settings.protect_required_approvals=Požadovaná schválení:
settings.protect_required_approvals_desc=Umožňuje sloučit pouze pull requestů s dostatečným počtem požadovaných schválení. Požadovaná schválení jsou buď od uživatelů nebo týmů, které jsou na seznamu povolených, nebo od kohokoli s právem zápisu.
settings.protect_approvals_whitelist_enabled=Omezit schválení na povolené uživatele nebo týmy
settings.protect_approvals_whitelist_enabled_desc=Do požadovaných schválení se započítají pouze posouzení od povolených uživatelů nebo týmů. Bez seznamu povolených se započítává schválení od kohokoli s právem zápisu.
settings.protect_approvals_whitelist_users=Povolení posuzovatelé:
settings.protect_approvals_whitelist_teams=Povolené týmy pro posuzování:
settings.dismiss_stale_approvals=Odmítnout nekvalitní schválení
settings.dismiss_stale_approvals_desc=Pokud budou do větve nahrány nové revize, které mění obsah tohoto pull requestu, všechna stará schválení budou zamítnuta.
settings.ignore_stale_approvals=Ignorovat zastaralá schválení
@ -2360,14 +2437,18 @@ settings.ignore_stale_approvals_desc=Nezapočítávejte schválení, která byla
settings.require_signed_commits=Vyžadovat podepsané revize
settings.require_signed_commits_desc=Odmítnout nahrání do této větve pokud nejsou podepsaná nebo jsou neověřitelná.
settings.protect_branch_name_pattern=Vzor jména chráněných větví
settings.protect_branch_name_pattern_desc=Vzory jmen chráněných větví. Pro vzorovou syntaxi viz <a href="%s">dokumentace</a>. Příklady: main, release/**
settings.protect_patterns=Vzory
settings.protect_protected_file_patterns=Vzory chráněných souborů (oddělené středníkem „;“):
settings.protect_protected_file_patterns_desc=Chráněné soubory, které nemají povoleno být měněny přímo, i když uživatel má právo přidávat, upravovat nebo mazat soubory v této větvi. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na <a href='%[1]s'>%[2]s</a> dokumentaci pro syntaxi vzoru. Příklady: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
settings.protect_unprotected_file_patterns=Vzory nechráněných souborů (oddělené středníkem „;“):
settings.protect_unprotected_file_patterns_desc=Nechráněné soubory, které je možné měnit přímo, pokud má uživatel právo zápisu, čímž se obejde omezení push. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na <a href='%[1]s'>%[2]s</a> dokumentaci pro syntaxi vzoru. Příklady: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
settings.add_protected_branch=Zapnout ochranu
settings.delete_protected_branch=Vypnout ochranu
settings.update_protect_branch_success=Ochrana větví pro větev „%s“ byla aktualizována.
settings.remove_protected_branch_success=Ochrana větví pro větev „%s“ byla zakázána.
settings.remove_protected_branch_failed=Odstranění ochranného pravidla větve „%s“ se nezdařilo.
settings.protected_branch_deletion=Odstranit ochranu věteve
settings.protected_branch_deletion_desc=Zakázání ochrany větví umožní uživatelům s právem zápisu nahrávat do této větve. Pokračovat?
settings.block_rejected_reviews=Blokovat sloučení při zamítavých posouzeních
settings.block_rejected_reviews_desc=Slučování nebude možné, pokud o změny požádají oficiální posuzovatelé, i když je k dispozici dostatek schválení.
@ -2375,8 +2456,11 @@ settings.block_on_official_review_requests=Blokovat sloučení při oficiální
settings.block_on_official_review_requests_desc=Slučování nebude možné, pokud mají oficiální požadavek na posouzení, i když mají k dispozici dostatek schválení.
settings.block_outdated_branch=Blokovat sloučení, pokud je pull request zastaralý
settings.block_outdated_branch_desc=Slučování nebude možné, pokud je hlavní větev za základní větví.
settings.block_admin_merge_override=Pravidla pro ochranu větví se vztahují i na administrátory
settings.block_admin_merge_override_desc=Pravidla pro ochranu větví se vztahují i na administrátory a nesmějí je obcházet.
settings.default_branch_desc=Vybrat výchozí větev repozitáře pro pull requesty a revize kódu:
settings.merge_style_desc=Sloučit styly
settings.default_merge_style_desc=Výchozí styl sloučení
settings.choose_branch=Vyberte větev…
settings.no_protected_branch=Nejsou tu žádné chráněné větve.
settings.edit_protected_branch=Upravit
@ -2392,12 +2476,25 @@ settings.tags.protection.allowed.teams=Povolené týmy
settings.tags.protection.allowed.noone=Nikdo
settings.tags.protection.create=Chránit značku
settings.tags.protection.none=Neexistují žádné chráněné značky.
settings.tags.protection.pattern.description=Můžete použít jediné jméno nebo vzor glob nebo regulární výraz, který bude odpovídat více značek. Přečtěte si více v <a target="_blank" rel="noopener" href="%s">průvodci chráněnými značkami</a>.
settings.bot_token=Token pro robota
settings.chat_id=ID chatu
settings.thread_id=ID vlákna
settings.matrix.homeserver_url=URL adresa Homeserveru
settings.matrix.room_id=ID místnosti
settings.matrix.message_type=Typ zprávy
settings.visibility.private.button=Nastavit jako soukromé
settings.visibility.private.text=Změna viditelnosti na soukromou nejen zviditelní repozitář pouze pro povolené členy, ale může odstranit vztah mezi ním a rozštěpením, sledujícími a oblíbeností.
settings.visibility.private.bullet_title=<strong>Změna viditelnosti na soukromou způsobí:</strong>
settings.visibility.private.bullet_one=Zviditelnit repozitář pouze pro povolené členy.
settings.visibility.private.bullet_two=Může odstranit vztah mezi ním a <strong>rozštěpeními</strong>, <strong>sledujícími</strong>a <strong>oblíbeností</strong>.
settings.visibility.public.button=Nastavit jako veřejné
settings.visibility.public.text=Změna viditelnosti na veřejné učiní repozitář viditelným pro kohokoliv.
settings.visibility.public.bullet_title=<strong>Změna viditelnosti na veřejnou způsobí:</strong>
settings.visibility.public.bullet_one=Zviditelnit repozitář pro kohokoliv.
settings.visibility.success=Viditelnost repozitáře se změnila.
settings.visibility.error=Nastala chyba při pokusu o změnu viditelnosti repozitáře.
settings.visibility.fork_error=Viditelnost rozštěpeného repozitáře nelze změnit.
settings.archive.button=Archivovat repozitář
settings.archive.header=Archivovat tento repozitář
settings.archive.text=Archivace repozitáře způsobí, že bude zcela určen pouze pro čtení. Bude skryt z ovládacího panelu. Nikdo (ani vy!) nebude moci vytvářet nové revize ani otevírat nové úkoly nebo pull requesty.
@ -2480,7 +2577,6 @@ diff.generated=vygenerováno
diff.vendored=vendorováno
diff.comment.add_line_comment=Přidat jednořádkový komentář
diff.comment.placeholder=Zanechat komentář
diff.comment.markdown_info=Je podporována úprava vzhledu pomocí markdown.
diff.comment.add_single_comment=Přidat jeden komentář
diff.comment.add_review_comment=Přidat komentář
diff.comment.start_review=Začít posuzování
@ -2594,6 +2690,7 @@ tag.create_success=Značka „%s“ byla vytvořena.
topic.manage_topics=Spravovat témata
topic.done=Hotovo
topic.count_prompt=Nelze vybrat více než 25 témat
topic.format_prompt=Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a tečky („.“) a může být dlouhé až 35 znaků. Písmena musí být malá.
find_file.go_to_file=Přejít na soubor
@ -2691,6 +2788,7 @@ teams.leave.detail=Opustit %s?
teams.can_create_org_repo=Vytvořit repozitáře
teams.can_create_org_repo_helper=Členové mohou vytvářet nové repozitáře v organizaci. Tvůrce získá přístup správce do nového repozitáře.
teams.none_access=Bez přístupu
teams.none_access_helper=Členové nemohou tuto jednotku prohlížet ani s ní provádět žádné jiné úkony. Pro veřejné repozitáře to nemá žádný vliv.
teams.general_access=Obecný přístup
teams.general_access_helper=O oprávnění členů bude rozhodnuto níže uvedenou tabulkou oprávnění.
teams.read_access=Čtení
@ -2743,6 +2841,7 @@ self_check=Samokontrola
identity_access=Identita a přístup
users=Uživatelské účty
organizations=Organizace
assets=Prostředky kódu
repositories=Repozitáře
hooks=Webové háčky
integrations=Integrace
@ -2758,6 +2857,7 @@ last_page=Poslední
total=Celkem: %d
settings=Nastavení správce
dashboard.new_version_hint=Gitea %s je nyní k dispozici, vy používáte %s. Další podrobnosti najdete na <a target="_blank" rel="noreferrer" href="%s">blogu</a>.
dashboard.statistic=Souhrn
dashboard.maintenance_operations=Operace údržby
dashboard.system_status=Status systému
@ -2800,6 +2900,7 @@ dashboard.reinit_missing_repos=Znovu inicializovat všechny chybějící repozit
dashboard.sync_external_users=Synchronizovat externí uživatelská data
dashboard.cleanup_hook_task_table=Vyčistit tabulku hook_task
dashboard.cleanup_packages=Vyčistit prošlé balíčky
dashboard.cleanup_actions=Vyčištění prostředků akcí, jejichž platnost vypršela
dashboard.server_uptime=Doba provozu serveru
dashboard.current_goroutine=Aktuální Goroutines
dashboard.current_memory_usage=Aktuální využití paměti
@ -2829,12 +2930,19 @@ dashboard.total_gc_time=Celková pauza GC
dashboard.total_gc_pause=Celková pauza GC
dashboard.last_gc_pause=Poslední pauza GC
dashboard.gc_times=Časy GC
dashboard.delete_old_actions=Odstranit všechny staré aktivity z databáze
dashboard.delete_old_actions.started=Začalo odstraňování všech starých aktivit z databáze.
dashboard.update_checker=Kontrola aktualizací
dashboard.delete_old_system_notices=Odstranit všechna stará systémová upozornění z databáze
dashboard.gc_lfs=Úklid LFS meta objektů
dashboard.stop_zombie_tasks=Zastavit zombie úlohy akcí
dashboard.stop_endless_tasks=Zastavit nekonečné úlohy akcí
dashboard.cancel_abandoned_jobs=Zrušit opuštěné úlohy akcí
dashboard.start_schedule_tasks=Spustit naplánované úlohy akcí
dashboard.sync_branch.started=Synchronizace větví byla spuštěna
dashboard.sync_tag.started=Synchronizace značek spuštěna
dashboard.rebuild_issue_indexer=Znovu sestavit index úkolů
dashboard.sync_repo_licenses=Synchronizovat licence repozitáře
users.user_manage_panel=Správa uživatelských účtů
users.new_account=Vytvořit uživatelský účet
@ -2906,6 +3014,10 @@ emails.not_updated=Aktualizace požadované e-mailové adresy se nezdařila: %v
emails.duplicate_active=Tato e-mailová adresa je již aktivní pro jiného uživatele.
emails.change_email_header=Aktualizovat vlastnosti e-mailu
emails.change_email_text=Opravdu chcete aktualizovat tuto e-mailovou adresu?
emails.delete=Odstranit e-mail
emails.delete_desc=Opravdu chcete odstranit tuto e-mailovou adresu?
emails.deletion_success=E-mailová adresa byla odstraněna.
emails.delete_primary_email_error=Primární e-mail nelze odstranit.
orgs.org_manage_panel=Správa organizací
orgs.name=Název
@ -2938,10 +3050,12 @@ packages.size=Velikost
packages.published=Publikováno
defaulthooks=Výchozí webové háčky
defaulthooks.desc=Webové háčky automaticky vytvářejí HTTP POST dotazy na server při určitých Gitea událostech. Webové háčky definované zde jsou výchozí a budou zkopírovány do všech nových repozitářů. Přečtěte si více v <a target="_blank" rel="noopener" href=%s">průvodci webovými háčky</a>.
defaulthooks.add_webhook=Přidat výchozí webový háček
defaulthooks.update_webhook=Aktualizovat výchozí webový háček
systemhooks=Systémové webové háčky
systemhooks.desc=Webové háčky automaticky vytvářejí HTTP POST dotazy na server při určitých Gitea událostech. Webové háčky definované zde budou vykonány na všech repozitářích systému, proto prosím zvažte jakékoli důsledky, které to může mít na výkon. Přečtěte si více v <a target="_blank" rel="noopener" href="%s">průvodci webovými háčky</a>.
systemhooks.add_webhook=Přidat systémový webový háček
systemhooks.update_webhook=Aktualizovat systémový webový háček
@ -3036,8 +3150,18 @@ 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 %s 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 %s
auths.tip.facebook=Registrujte novou aplikaci na %s a přidejte produkt „Facebook Login“
auths.tip.github=Registrujte novou OAuth aplikaci na %s
auths.tip.gitlab_new=Zaregistrujte novou aplikaci na %s
auths.tip.google_plus=Získejte klientské pověření OAuth2 z Google API konzole na %s
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 %s, 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 %s
auths.tip.gitea=Registrovat novou Oauth2 aplikaci. Návod naleznete na %s
auths.tip.yandex=Vytvořte novou aplikaci na %s. Vyberte následující oprávnění z „Yandex.Passport API“ sekce: „Přístup k e-mailové adrese“, „Přístup k uživatelskému avataru“ a „Přístup k uživatelskému jménu, jménu a příjmení, pohlaví“
auths.tip.mastodon=Vložte vlastní URL instance pro mastodon, kterou se chcete autentizovat (nebo použijte výchozí)
auths.edit=Upravit zdroj ověřování
auths.activated=Tento zdroj ověřování je aktivován
@ -3203,6 +3327,7 @@ monitor.next=Příští čas spuštění
monitor.previous=Předešlý čas spuštění
monitor.execute_times=Vykonání
monitor.process=Spuštěné procesy
monitor.stacktrace=Výpisy zásobníku
monitor.processes_count=%d procesů
monitor.download_diagnosis_report=Stáhnout diagnosttickou zprávu
monitor.desc=Popis
@ -3210,6 +3335,8 @@ monitor.start=Čas zahájení
monitor.execute_time=Doba provádění
monitor.last_execution_result=Výsledek
monitor.process.cancel=Zrušit proces
monitor.process.cancel_desc=Zrušení procesu může způsobit ztrátu dat
monitor.process.cancel_notices=Zrušit: <strong>%s</strong>?
monitor.process.children=Potomek
monitor.queues=Fronty
@ -3311,6 +3438,7 @@ raw_minutes=minut
[dropzone]
default_message=Přetáhněte soubory nebo klikněte sem pro nahrání.
invalid_input_type=Nemůžete nahrávat soubory tohoto typu.
file_too_big=Velikost souboru ({{filesize}} MB) je vyšší než maximální velikost ({{maxFilesize}} MB).
remove_file=Smazat soubor
@ -3383,6 +3511,9 @@ alpine.repository=Informace o repozitáři
alpine.repository.branches=Větve
alpine.repository.repositories=Repozitáře
alpine.repository.architectures=Architektury
arch.repository=Informace o repozitáři
arch.repository.repositories=Repozitáře
arch.repository.architectures=Architektury
cargo.registry=Nastavte tento registr v konfiguračním souboru Cargo (například <code>~/.cargo/config.toml</code>):
cargo.install=Chcete-li nainstalovat balíček pomocí Cargo, spusťte následující příkaz:
chef.registry=Nastavit tento registr v souboru <code>~/.chef/config.rb</code>:
@ -3582,12 +3713,18 @@ runs.no_workflows.quick_start=Nevíte jak začít s Gitea Actions? Podívejte se
runs.no_workflows.documentation=Další informace o Gitea Actions naleznete v <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaci</a>.
runs.no_runs=Pracovní postup zatím nebyl spuštěn.
runs.empty_commit_message=(prázdná zpráva commitu)
runs.expire_log_message=Logy byly vyčištěny, protože byly příliš staré.
workflow.disable=Zakázat pracovní postup
workflow.disable_success=Pracovní postup „%s“ byl úspěšně deaktivován.
workflow.enable=Povolit pracovní postup
workflow.enable_success=Pracovní postup „%s“ byl úspěšně aktivován.
workflow.disabled=Pracovní postup je zakázán.
workflow.run=Spustit pracovní postup
workflow.not_found=Pracovní postup „%s“ nebyl nalezen.
workflow.run_success=Pracovní postup „%s“ proběhl úspěšně.
workflow.from_ref=Použít pracovní postup od
workflow.has_workflow_dispatch=Tento pracovní postup má spouštěč události workflow_dispatch.
need_approval_desc=Potřebujete schválení pro spuštění pracovních postupů pro rozštěpený pull request.
@ -3608,6 +3745,7 @@ variables.update.failed=Úprava proměnné se nezdařila.
variables.update.success=Proměnná byla upravena.
[projects]
deleted.display_name=Odstraněný projekt
type-1.display_name=Samostatný projekt
type-2.display_name=Projekt repozitíře
type-3.display_name=Projekt organizace

View File

@ -201,6 +201,7 @@ buttons.link.tooltip=Link hinzufügen
buttons.list.unordered.tooltip=Liste hinzufügen
buttons.list.ordered.tooltip=Nummerierte Liste hinzufügen
buttons.list.task.tooltip=Aufgabenliste hinzufügen
buttons.table.add.insert=Hinzufügen
buttons.mention.tooltip=Benutzer oder Team erwähnen
buttons.ref.tooltip=Issue oder Pull-Request referenzieren
buttons.switch_to_legacy.tooltip=Legacy-Editor verwenden
@ -997,7 +998,6 @@ generate_repo=Repository erstellen
generate_from=Erstelle aus
repo_desc=Beschreibung
repo_desc_helper=Gib eine kurze Beschreibung an (optional)
repo_lang=Sprache
repo_gitignore_helper=Wähle eine .gitignore-Vorlage aus.
repo_gitignore_helper_desc=Wähle aus einer Liste an Vorlagen für bekannte Sprachen, welche Dateien ignoriert werden sollen. Typische Artefakte, die durch die Build Tools der gewählten Sprache generiert werden, sind standardmäßig Bestandteil der .gitignore.
issue_labels=Issue Label
@ -1399,12 +1399,9 @@ issues.new.no_items=Keine Einträge
issues.new.milestone=Meilenstein
issues.new.no_milestone=Kein Meilenstein
issues.new.clear_milestone=Meilenstein entfernen
issues.new.open_milestone=Offene Meilensteine
issues.new.closed_milestone=Geschlossene Meilensteine
issues.new.assignees=Zuständig
issues.new.clear_assignees=Zuständige entfernen
issues.new.no_assignees=Niemand zuständig
issues.new.no_reviewers=Keine Reviewer
issues.new.blocked_user=Das Issue kann nicht erstellt werden, da du vom Repository-Eigentümer blockiert wurdest.
issues.edit.blocked_user=Der Inhalt kann nicht bearbeitet werden, da du vom Repository-Eigentümer blockiert wurdest.
issues.choose.get_started=Los geht's
@ -1604,27 +1601,20 @@ issues.comment_on_locked=Du kannst einen gesperrten Issue nicht kommentieren.
issues.delete=Löschen
issues.delete.title=Dieses Issue löschen?
issues.delete.text=Möchtest du dieses Issue wirklich löschen? (Dadurch wird der Inhalt dauerhaft gelöscht. Denke daran, es stattdessen zu schließen, wenn du es archivieren willst)
issues.tracker=Zeiterfassung
issues.start_tracking_short=Zeiterfassung starten
issues.start_tracking=Zeiterfassung starten
issues.start_tracking_history=hat die Zeiterfassung %s gestartet
issues.tracker_auto_close=Der Timer wird automatisch gestoppt, wenn dieser Issue geschlossen wird
issues.tracking_already_started=`Du hast die Zeiterfassung bereits in <a href="%s">diesem Issue</a> gestartet!`
issues.stop_tracking=Zeiterfassung stoppen
issues.stop_tracking_history=hat die Zeiterfassung %s angehalten
issues.cancel_tracking=Verwerfen
issues.cancel_tracking_history=`hat die Zeiterfassung %s abgebrochen`
issues.add_time=Zeit manuell hinzufügen
issues.del_time=Diese Zeiterfassung löschen
issues.add_time_short=Zeit hinzufügen
issues.add_time_cancel=Abbrechen
issues.add_time_history=`hat %s gearbeitete Zeit hinzugefügt`
issues.del_time_history=`hat %s gearbeitete Zeit gelöscht`
issues.add_time_hours=Stunden
issues.add_time_minutes=Minuten
issues.add_time_sum_to_small=Es wurde keine Zeit eingegeben.
issues.time_spent_total=Zeitaufwand insgesamt
issues.time_spent_from_all_authors=`Aufgewendete Zeit: %s`
issues.due_date=Fällig am
issues.invalid_due_date_format=Das Fälligkeitsdatum muss das Format „JJJJ-MM-TT“ haben.
issues.error_modifying_due_date=Fehler beim Ändern des Fälligkeitsdatums.
@ -2452,7 +2442,6 @@ diff.generated=generiert
diff.vendored=vendored
diff.comment.add_line_comment=Einzelnen Kommentar hinzufügen
diff.comment.placeholder=Kommentieren...
diff.comment.markdown_info=Styling mit Markdown wird unterstützt.
diff.comment.add_single_comment=Einzelnen Kommentar hinzufügen
diff.comment.add_review_comment=Kommentar hinzufügen
diff.comment.start_review=Review starten
@ -3344,6 +3333,9 @@ alpine.repository=Repository-Informationen
alpine.repository.branches=Branches
alpine.repository.repositories=Repositories
alpine.repository.architectures=Architekturen
arch.repository=Repository-Informationen
arch.repository.repositories=Repositories
arch.repository.architectures=Architekturen
cargo.registry=Richte diese Registry in der Cargo-Konfigurationsdatei ein (z.B. <code>~/.cargo/config.toml</code>):
cargo.install=Um das Paket mit Cargo zu installieren, führe den folgenden Befehl aus:
chef.registry=Richte diese Registry in deiner <code>~/.chef/config.rb</code> Datei ein:

View File

@ -172,6 +172,7 @@ buttons.link.tooltip=Προσθήκη συνδέσμου
buttons.list.unordered.tooltip=Προσθήκη απλής λίστας
buttons.list.ordered.tooltip=Προσθήκη αριθμημένης λίστας
buttons.list.task.tooltip=Προσθήκη λίστας εργασιών
buttons.table.add.insert=Προσθήκη
buttons.mention.tooltip=Μνημόνευση ενός χρήστη ή ομάδας
buttons.ref.tooltip=Μνημόνευση ενός θέματος ή pull request
buttons.switch_to_legacy.tooltip=Χρήση του κλασσικού κειμενογράφου
@ -934,7 +935,6 @@ generate_repo=Δημιουργία Αποθετηρίου
generate_from=Δημιουργία Από
repo_desc=Περιγραφή
repo_desc_helper=Εισάγετε μια σύντομη περιγραφή (προαιρετικό)
repo_lang=Γλώσσα
repo_gitignore_helper=Επιλέξτε πρότυπα .gitignore.
repo_gitignore_helper_desc=Επιλέξτε ποια αρχεία δεν θα παρακολουθείτε από μια λίστα προτύπων για κοινές γλώσσες προγραμματισμού. Τυπικά αντικείμενα που δημιουργούνται από τα εργαλεία κατασκευής κάθε γλώσσας περιλαμβάνονται ήδη στο .gitignore.
issue_labels=Σήματα Ζητήματος
@ -1324,12 +1324,9 @@ issues.new.no_items=Δεν υπάρχουν αντικείμενα
issues.new.milestone=Ορόσημο
issues.new.no_milestone=Χωρίς Ορόσημο
issues.new.clear_milestone=Καθαρισμός ορόσημου
issues.new.open_milestone=Ανοιχτά Ορόσημα
issues.new.closed_milestone=Κλειστά Ορόσημα
issues.new.assignees=Αποδέκτες
issues.new.clear_assignees=Εκκαθάριση αποδεκτών
issues.new.no_assignees=Χωρίς Αποδέκτη
issues.new.no_reviewers=Δεν υπάρχουν εξεταστές
issues.choose.get_started=Ας Αρχίσουμε
issues.choose.open_external_link=Άνοιγμα
issues.choose.blank=Προεπιλογή
@ -1526,27 +1523,20 @@ issues.comment_on_locked=Δεν μπορείτε να σχολιάσετε έν
issues.delete=Διαγραφή
issues.delete.title=Διαγραφή αυτού του ζητήματος;
issues.delete.text=Θέλετε πραγματικά να διαγράψετε αυτό το ζήτημα; (Αυτό θα σβήσει οριστικά όλο το περιεχόμενο του. Εξετάστε αν θέλετε να το κλείσετε, αν σκοπεύεται να το αρχειοθετήσετε)
issues.tracker=Καταγραφή Χρόνου
issues.start_tracking_short=Εκκίνηση Χρονομέτρου
issues.start_tracking=Εκκίνηση Καταγραφής Χρόνου
issues.start_tracking_history=`ξεκίνησε να εργάζεται %s`
issues.tracker_auto_close=Το χρονόμετρο θα σταματήσει αυτόματα όταν κλείσει αυτό το ζήτημα
issues.tracking_already_started=`Έχετε ήδη ξεκινήσει την καταγραφή του χρόνου <a href="%s">σε ένα άλλο ζήτημα</a>!`
issues.stop_tracking=Διακοπή Χρονομέτρου
issues.stop_tracking_history=`σταμάτησε να εργάζεται %s`
issues.cancel_tracking=Απόρριψη
issues.cancel_tracking_history=`ακύρωσε τη παρακολούθηση χρόνου %s`
issues.add_time=Χειροκίνητη Προσθήκη Ώρας
issues.del_time=Διαγραφή αυτού του αρχείου χρόνου
issues.add_time_short=Προσθήκη Χρόνου
issues.add_time_cancel=Ακύρωση
issues.add_time_history=`πρόσθεσε χρόνο που δαπανήθηκε %s`
issues.del_time_history=`διέγραψε το χρόνο που δαπανήθηκε %s`
issues.add_time_hours=Ώρες
issues.add_time_minutes=Λεπτά
issues.add_time_sum_to_small=Δεν εισήχθη χρόνος.
issues.time_spent_total=Συνολική Δαπάνη Χρόνου
issues.time_spent_from_all_authors=`Συνολική Δαπάνη Χρόνου: %s`
issues.due_date=Ημερομηνία Παράδοσης
issues.invalid_due_date_format=Η μορφή της ημερομηνίας παράδοσης πρέπει να είναι 'yyyy-mm-dd'.
issues.error_modifying_due_date=Αποτυχία τροποποίησης της ημερομηνίας παράδοσης.
@ -2358,7 +2348,6 @@ diff.generated=δημιουργημένο
diff.vendored=εξωτερικό
diff.comment.add_line_comment=Προσθήκη σχολίου στη γραμμή
diff.comment.placeholder=Αφήστε ένα σχόλιο
diff.comment.markdown_info=Υποστηρίζεται στυλ με markdown.
diff.comment.add_single_comment=Προσθέστε ένα σχόλιο
diff.comment.add_review_comment=Προσθήκη σχολίου
diff.comment.start_review=Έναρξη αξιολόγησης
@ -3232,6 +3221,9 @@ alpine.repository=Πληροφορίες Αποθετηρίου
alpine.repository.branches=Κλάδοι
alpine.repository.repositories=Αποθετήρια
alpine.repository.architectures=Αρχιτεκτονικές
arch.repository=Πληροφορίες Αποθετηρίου
arch.repository.repositories=Αποθετήρια
arch.repository.architectures=Αρχιτεκτονικές
cargo.registry=Ρυθμίστε αυτό το μητρώο στις ρυθμίσεις του Cargo (για παράδειγμα <code>~/.cargo/config.toml</code>):
cargo.install=Για να εγκαταστήσετε το πακέτο χρησιμοποιώντας το Cargo, εκτελέστε την ακόλουθη εντολή:
chef.registry=Ρυθμίστε αυτό το μητρώο στο αρχείο <code>~/.chef/config.rb</code>:

View File

@ -1946,6 +1946,10 @@ pulls.delete.title = Delete this pull request?
pulls.delete.text = Do you really want to delete this pull request? (This will permanently remove all content. Consider closing it instead, if you intend to keep it archived)
pulls.recently_pushed_new_branches = You pushed on branch <strong>%[1]s</strong> %[2]s
pulls.upstream_diverging_prompt_behind_1 = This branch is %d commit behind %s
pulls.upstream_diverging_prompt_behind_n = This branch is %d commits behind %s
pulls.upstream_diverging_prompt_base_newer = The base branch %s has new changes
pulls.upstream_diverging_merge = Sync fork
pull.deleted_branch = (deleted):%s
pull.agit_documentation = Review documentation about AGit

View File

@ -170,6 +170,7 @@ buttons.link.tooltip=Añadir un enlace
buttons.list.unordered.tooltip=Añadir una lista
buttons.list.ordered.tooltip=Añadir una lista numerada
buttons.list.task.tooltip=Añadir una lista de tareas
buttons.table.add.insert=Añadir
buttons.mention.tooltip=Mencionar un usuario o equipo
buttons.ref.tooltip=Referir a una incidencia o pull request
buttons.switch_to_legacy.tooltip=Utilizar el editor antiguo en su lugar
@ -924,7 +925,6 @@ generate_repo=Generar repositorio
generate_from=Generar desde
repo_desc=Descripción
repo_desc_helper=Introduce una descripción corta (opcional)
repo_lang=Idioma
repo_gitignore_helper=Seleccionar plantillas de .gitignore.
repo_gitignore_helper_desc=Elija qué archivos no rastrear de una lista de plantillas para idiomas comunes. Los artefactos típicos generados por las herramientas de construcción de cada idioma se incluyen por defecto en .gitignore.
issue_labels=Etiquetas de incidencia
@ -1314,12 +1314,9 @@ issues.new.no_items=No hay elementos
issues.new.milestone=Milestone
issues.new.no_milestone=Sin Milestone
issues.new.clear_milestone=Limpiar Milestone
issues.new.open_milestone=Milestones abiertas
issues.new.closed_milestone=Milestones cerradas
issues.new.assignees=Asignados
issues.new.clear_assignees=Limpiar asignados
issues.new.no_assignees=No asignados
issues.new.no_reviewers=No hay revisores
issues.choose.get_started=Comenzar
issues.choose.open_external_link=Abrir
issues.choose.blank=Predeterminado
@ -1516,27 +1513,20 @@ issues.comment_on_locked=No puede comentar una incidencia bloqueada.
issues.delete=Eliminar
issues.delete.title=¿Eliminar esta incidencia?
issues.delete.text=¿Realmente quieres eliminar esta incidencia? (Esto eliminará permanentemente todo el contenido. Considera cerrarlo en su lugar, si quieres mantenerlo archivado)
issues.tracker=Gestor de tiempo
issues.start_tracking_short=Iniciar temporizador
issues.start_tracking=Inicio de seguimiento de tiempo
issues.start_tracking_history=`ha empezado a trabajar %s`
issues.tracker_auto_close=El temporizador se detendrá automáticamente cuando se cierre este problema
issues.tracking_already_started=`¡Ya has iniciado el seguimiento de tiempo en <a href="%s">otro problema</a>!`
issues.stop_tracking=Detener temporizador
issues.stop_tracking_history=`dejó de trabajar %s`
issues.cancel_tracking=Descartar
issues.cancel_tracking_history=`canceló el seguimiento de tiempo %s`
issues.add_time=Añadir tiempo gastado manualmente
issues.del_time=Eliminar este registro de tiempo
issues.add_time_short=Añadir tiempo gastado
issues.add_time_cancel=Cancelar
issues.add_time_history=`añadió tiempo gastado %s`
issues.del_time_history=`eliminado el tiempo gastado %s`
issues.add_time_hours=Horas
issues.add_time_minutes=Minutos
issues.add_time_sum_to_small=No se ha entrado tiempo.
issues.time_spent_total=Tiempo total gastado
issues.time_spent_from_all_authors=`Tiempo total gastado: %s`
issues.due_date=Fecha de vencimiento
issues.invalid_due_date_format=El formato de la fecha de vencimiento debe ser 'aaaa-mm-dd'.
issues.error_modifying_due_date=Fallo al modificar la fecha de vencimiento.
@ -2339,7 +2329,6 @@ diff.generated=generado
diff.vendored=vendido
diff.comment.add_line_comment=Añadir comentario en línea
diff.comment.placeholder=Deja un comentario
diff.comment.markdown_info=Es posible estilizar con markdown.
diff.comment.add_single_comment=Añadir solo comentario
diff.comment.add_review_comment=Añadir comentario
diff.comment.start_review=Comenzar revisión
@ -3211,6 +3200,9 @@ alpine.repository=Información del repositorio
alpine.repository.branches=Ramas
alpine.repository.repositories=Repositorios
alpine.repository.architectures=Arquitecturas
arch.repository=Información del repositorio
arch.repository.repositories=Repositorios
arch.repository.architectures=Arquitecturas
cargo.registry=Configurar este registro en el archivo de configuración de Cargo (por ejemplo <code>~/.cargo/config.toml</code>):
cargo.install=Para instalar el paquete usando Cargo, ejecute el siguiente comando:
chef.registry=Configura este registro en tu archivo <code>~/.chef/config.rb</code>:

View File

@ -114,6 +114,7 @@ filter.private=خصوصی
[heatmap]
[editor]
buttons.table.add.insert=افزودن
[filter]
@ -724,7 +725,6 @@ generate_repo=ساختن مخزن
generate_from=ساختن از
repo_desc=توضیحات
repo_desc_helper=توضیحات مختصر را وارد کنید(اختیاری)
repo_lang=زبان
repo_gitignore_helper=یک قالب برای .gitignore انتخاب کنید.
repo_gitignore_helper_desc=از فهرست الگوهای زبان‌های رایج، فایل‌هایی را انتخاب کنید که ردیابی نشوند. مصنوعات معمولی تولید شده توسط ابزارهای ساخت هر زبان به طور پیش فرض در gitignore. گنجانده شده است.
issue_labels=برچسب‌های مسئله
@ -1013,12 +1013,9 @@ issues.new.no_items=موردی وجود ندارد
issues.new.milestone=نقطه عطف
issues.new.no_milestone=بدون نقطه عطف
issues.new.clear_milestone=پاک‌کردن نقطه عطف
issues.new.open_milestone=نقاط عطف باز
issues.new.closed_milestone=نقاط عطف بسته
issues.new.assignees=تخصیص شده
issues.new.clear_assignees=پاک کردن تخصیص
issues.new.no_assignees=بدون تخصیص
issues.new.no_reviewers=بدون بازبین گر
issues.choose.get_started=آغاز کردن
issues.choose.open_external_link=باز‌کردن
issues.choose.blank=پیشگزیده
@ -1168,26 +1165,19 @@ issues.lock.title=انسداد مکالمه در این مسئله.
issues.unlock.title=رفع انسداد مکالمه در این مسئله.
issues.comment_on_locked=شما نمی‌توانید در مسئله قفل شده اظهار نظر کنید.
issues.delete=حذف
issues.tracker=پیگیری زمان
issues.start_tracking_short=تایمز شروع
issues.start_tracking=شروع به پیگیری زمان
issues.start_tracking_history=`شروع به کار %s`
issues.tracker_auto_close=زمان‌سنج به صورت خودکار متوقف میشود زمانی که مسئله بسته شود
issues.tracking_already_started=`شما قبلا رهگیری زمان را روی این <a href="%s"> مسئله </a> آغاز کرده‌اید!`
issues.stop_tracking=تایمز ایست
issues.stop_tracking_history=`توقف کار در %s`
issues.cancel_tracking=ول کردن
issues.add_time=زمان را به صورت دستی وارد کنید
issues.del_time=این لاگ را حذف کنید
issues.add_time_short=افزودن زمان
issues.add_time_cancel=انصراف
issues.add_time_history=`زمان صرف شده اضافه شد %s`
issues.del_time_history=`زمان صرف شده حذف شد %s`
issues.add_time_hours=ساعت
issues.add_time_minutes=دقیقه
issues.add_time_sum_to_small=هیچ زمانی وارد نشده.
issues.time_spent_total=کل زمان صرف شده
issues.time_spent_from_all_authors=`زمان صرف شده: %s`
issues.due_date=موعد مقرر
issues.invalid_due_date_format=موعد مقرر، باید به سبک 'yyyy-mm-dd' باشد.
issues.error_modifying_due_date=تغییر موعد مقرر با شکست مواجه شد.
@ -1814,7 +1804,6 @@ diff.load=Diff را بارگزاری کن
diff.generated=تولید شده
diff.vendored=فروخته شده
diff.comment.placeholder=اظهار نظر کنید
diff.comment.markdown_info=شیوه markdown پیشتیبانی می‌شود.
diff.comment.add_single_comment=افزودن یک دیدگاه به تنهایی
diff.comment.add_review_comment=افزودن دیدگاه
diff.comment.start_review=شروع بازبینی
@ -2517,6 +2506,7 @@ error.unit_not_allowed=شما اجازه دسترسی به این قسمت مخ
filter.type=نوع
alpine.repository.branches=شاخه‎ها
alpine.repository.repositories=مخازن
arch.repository.repositories=مخازن
conan.details.repository=مخزن
owner.settings.cleanuprules.enabled=فعال شده

View File

@ -128,6 +128,7 @@ filter.private=Yksityinen
[heatmap]
[editor]
buttons.table.add.insert=Lisää
[filter]
@ -648,7 +649,6 @@ fork_visibility_helper=Forkatun repon näkyvyyttä ei voi muuttaa.
download_zip=Lataa ZIP
download_tar=Lataa TAR.GZ
repo_desc=Kuvaus
repo_lang=Kieli
repo_gitignore_helper=Valitse .gitignore mallit.
issue_labels=Ongelmien tunnisteet
issue_labels_helper=Valitse pohja ongelmien nimilapuille.
@ -806,8 +806,6 @@ issues.new.no_items=Ei kohteita
issues.new.milestone=Merkkipaalu
issues.new.no_milestone=Ei merkkipaalua
issues.new.clear_milestone=Tyhjennä merkkipaalu
issues.new.open_milestone=Avoimet merkkipaalut
issues.new.closed_milestone=Suljetut merkkipaalut
issues.new.assignees=Käsittelijä
issues.new.clear_assignees=Tyhjennä käsittelijä
issues.new.no_assignees=Ei käsittelijää
@ -914,21 +912,15 @@ issues.lock.reason=Lukitsemisen syy
issues.lock.title=Lukitse keskustelu tästä ongelmasta.
issues.unlock.title=Avaa keskustelu tästä ongelmasta.
issues.delete=Poista
issues.tracker=Ajan seuranta
issues.start_tracking_short=Aloita ajanotto
issues.start_tracking=Aloita ajan seuranta
issues.start_tracking_history=`aloitti työskentelyn %s`
issues.tracker_auto_close=Ajan seuranta pysähtyy automaattisesti kun tämä ongelma on suljettu
issues.stop_tracking=Pysäytä ajanotto
issues.stop_tracking_history=`lopetti työskentelyn %s`
issues.add_time=Lisää aika käsin
issues.add_time_short=Lisää aika
issues.add_time_cancel=Peruuta
issues.add_time_history=`lisäsi käytetyn ajan %s`
issues.add_time_hours=Tuntia
issues.add_time_minutes=Minuuttia
issues.add_time_sum_to_small=Aikaa ei syötetty.
issues.time_spent_from_all_authors=`Käytetty kokonaisaika: %s`
issues.due_date=Määräpäivä
issues.push_commit_1=lisäsi %d commitin %s
issues.push_commits_n=lisäsi %d committia %s
@ -1239,7 +1231,6 @@ diff.view_file=Näytä tiedosto
diff.file_image_width=Leveys
diff.file_image_height=Korkeus
diff.file_byte_size=Koko
diff.comment.markdown_info=Muotoilu markdownilla tuettu.
diff.comment.add_single_comment=Lisää yksittäinen kommentti
diff.comment.add_review_comment=Lisää kommentti
diff.comment.start_review=Aloita tarkistus
@ -1694,6 +1685,7 @@ installation=Asennus
details.author=Tekijä
alpine.repository.branches=Haarat
alpine.repository.repositories=Repot
arch.repository.repositories=Repot
conan.details.repository=Repo
owner.settings.cleanuprules.enabled=Käytössä

View File

@ -104,6 +104,7 @@ copy_url=Copier l'URL
copy_hash=Copier le hach
copy_content=Copier le contenu
copy_branch=Copier le nom de la branche
copy_path=Copier le chemin
copy_success=Copié !
copy_error=Échec de la copie
copy_type_unsupported=Ce type de fichier ne peut pas être copié
@ -209,6 +210,10 @@ buttons.link.tooltip=Ajouter un lien
buttons.list.unordered.tooltip=Ajouter une liste à puces
buttons.list.ordered.tooltip=Ajouter une liste numérotée
buttons.list.task.tooltip=Ajouter une liste de tâches
buttons.table.add.tooltip=Ajouter un tableau
buttons.table.add.insert=Ajouter
buttons.table.rows=Lignes
buttons.table.cols=Colonnes
buttons.mention.tooltip=Mentionner un utilisateur ou une équipe
buttons.ref.tooltip=Référencer un ticket ou demande dajout
buttons.switch_to_legacy.tooltip=Utiliser lancien éditeur à la place
@ -348,6 +353,7 @@ enable_update_checker=Activer la vérification des mises-à-jour
enable_update_checker_helper=Vérifie les mises à jour régulièrement en se connectant à gitea.io.
env_config_keys=Configuration de l'environnement
env_config_keys_prompt=Les variables d'environnement suivantes seront également ajoutées à votre fichier de configuration :
config_write_file_prompt=Ces options de configuration seront écrites dans : %s
[home]
nav_menu=Menu de navigation
@ -453,6 +459,7 @@ authorize_application=Autoriser l'application
authorize_redirect_notice=Vous serez redirigé vers %s si vous autorisez cette application.
authorize_application_created_by=Cette application a été créée par %s.
authorize_application_description=Si vous accordez l'accès, il sera en mesure d'accéder et d'écrire toutes les informations de votre compte, y compris les dépôts privés et les organisations.
authorize_application_with_scopes=Avec des contextes : %s
authorize_title=Autoriser "%s" à accéder à votre compte ?
authorization_failed=Lautorisation a échoué
authorization_failed_desc=L'autorisation a échoué car nous avons détecté une demande incorrecte. Veuillez contacter le responsable de l'application que vous avez essayé d'autoriser.
@ -707,6 +714,8 @@ public_profile=Profil public
biography_placeholder=Parlez-nous un peu de vous! (Vous pouvez utiliser Markdown)
location_placeholder=Partagez votre position approximative avec d'autres personnes
profile_desc=Contrôlez comment votre profil est affiché aux autres utilisateurs. Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et les opérations Git basées sur le Web.
password_username_disabled=Vous nêtes pas autorisé à modifier leur nom dutilisateur. Veuillez contacter ladministrateur de votre site pour plus de détails.
password_full_name_disabled=Vous nêtes pas autorisé à modifier leur nom complet. Veuillez contacter ladministrateur du site pour plus de détails.
full_name=Nom complet
website=Site Web
location=Localisation
@ -756,6 +765,7 @@ uploaded_avatar_not_a_image=Le fichier téléchargé n'est pas une image.
uploaded_avatar_is_too_big=La taille du fichier téléversé (%d Kio) dépasse la taille maximale (%d Kio).
update_avatar_success=Votre avatar a été mis à jour.
update_user_avatar_success=L'avatar de l'utilisateur a été mis à jour.
cropper_prompt=Vous pouvez modifier limage avant de lenregistrer. Limage modifiée sera enregistrée en tant que PNG.
change_password=Modifier le mot de passe
old_password=Mot de passe actuel
@ -1033,7 +1043,6 @@ generate_repo=Générer un dépôt
generate_from=Générer depuis
repo_desc=Description
repo_desc_helper=Décrire brièvement votre dépôt
repo_lang=Langue
repo_gitignore_helper=Sélectionner quelques .gitignore prédéfinies
repo_gitignore_helper_desc=De nombreux outils et compilateurs génèrent des fichiers résiduels qui n'ont pas besoin d'être supervisés par git. Composez un .gitignore à laide de cette liste des languages de programmation courants.
issue_labels=Jeu de labels pour les tickets
@ -1450,8 +1459,6 @@ issues.new.no_items=Pas d'élément
issues.new.milestone=Jalon
issues.new.no_milestone=Sans jalon
issues.new.clear_milestone=Effacer le jalon
issues.new.open_milestone=Ouvrir un jalon
issues.new.closed_milestone=Jalons fermés
issues.new.assignees=Assignés
issues.new.clear_assignees=Supprimer les affectations
issues.new.no_assignees=Sans assignation
@ -1659,27 +1666,20 @@ issues.comment_on_locked=Vous ne pouvez pas commenter un ticket verrouillé.
issues.delete=Supprimer
issues.delete.title=Supprimer ce ticket ?
issues.delete.text=Voulez-vous vraiment supprimer ce ticket ? (Cette opération supprimera définitivement tout le contenu. Envisagez plutôt de le fermer si vous avez l'intention de l'archiver)
issues.tracker=Minuteur
issues.start_tracking_short=Démarrer la minuteuse
issues.start_tracking=Démarrer le suivi du temps
issues.start_tracking_history=`a commencé son travail %s.`
issues.tracker_auto_close=Le minuteur sera automatiquement arrêté quand le ticket sera fermé.
issues.tracking_already_started=`Vous avez déjà un minuteur en cours sur <a href="%s">un autre ticket</a> !`
issues.stop_tracking=Arrêter la minuteuse
issues.stop_tracking_history=`a fini de travailler %s.`
issues.cancel_tracking=Abandonner le minuteur
issues.cancel_tracking_history=`a abandonné son minuteur %s.`
issues.add_time=Ajouter du temps manuellement
issues.del_time=Supprimer ce minuteur du journal
issues.add_time_short=Pointer du temps
issues.add_time_cancel=Annuler
issues.add_time_history=`a pointé du temps de travail %s.`
issues.del_time_history=`a supprimé son temps de travail %s.`
issues.add_time_hours=Heures
issues.add_time_minutes=Minutes
issues.add_time_sum_to_small=Aucun minuteur n'a été saisi.
issues.time_spent_total=Temps passé total
issues.time_spent_from_all_authors=`Temps passé total : %s`
issues.due_date=Échéance
issues.invalid_due_date_format=Le format de la date d'échéance est invalide, il doit être comme suit 'aaaa-mm-jj'.
issues.error_modifying_due_date=Impossible de modifier l'échéance.
@ -2458,6 +2458,8 @@ settings.block_on_official_review_requests=Bloquer la fusion en cas de demande d
settings.block_on_official_review_requests_desc=La fusion ne sera pas possible tant quelle aura des demandes dévaluations officielles, même s'il y a suffisamment dapprobations.
settings.block_outdated_branch=Bloquer la fusion si la demande d'ajout est obsolète
settings.block_outdated_branch_desc=La fusion ne sera pas possible lorsque la branche principale est derrière la branche de base.
settings.block_admin_merge_override=Les administrateurs doivent respecter les règles de protection des branches
settings.block_admin_merge_override_desc=Les administrateurs doivent respecter les règles de protection des branches et ne peuvent pas les contourner.
settings.default_branch_desc=Sélectionnez une branche par défaut pour les demandes de fusion et les révisions :
settings.merge_style_desc=Styles de fusion
settings.default_merge_style_desc=Méthode de fusion par défaut
@ -2577,7 +2579,6 @@ diff.generated=générée
diff.vendored=externe
diff.comment.add_line_comment=Commenter cette ligne
diff.comment.placeholder=Laisser un commentaire
diff.comment.markdown_info=Formater avec Markdown.
diff.comment.add_single_comment=Commenter (simple)
diff.comment.add_review_comment=Commenter
diff.comment.start_review=Débuter une évaluation
@ -3512,6 +3513,9 @@ alpine.repository=Informations sur le Dépôt
alpine.repository.branches=Branches
alpine.repository.repositories=Dépôts
alpine.repository.architectures=Architectures
arch.repository=Informations sur le Dépôt
arch.repository.repositories=Dépôts
arch.repository.architectures=Architectures
cargo.registry=Configurez ce registre dans le fichier de configuration Cargo (par exemple <code>~/.cargo/config.toml</code>) :
cargo.install=Pour installer le paquet en utilisant Cargo, exécutez la commande suivante :
chef.registry=Configurer ce registre dans votre fichier <code>~/.chef/config.rb</code>:

View File

@ -104,8 +104,9 @@ copy_url=Cóipeáil URL
copy_hash=Cóipeáil hais
copy_content=Cóipeáil ábhair
copy_branch=Ainm brainse cóipeáil
copy_path=Cóipeáil cosán
copy_success=Cóipeáil!
copy_error=Theip ar an gcóip
copy_error=Theip ar an gcóipeáil
copy_type_unsupported=Ní féidir an cineál comhaid seo a chóipeáil
write=Scríobh
@ -209,6 +210,10 @@ buttons.link.tooltip=Cuir nasc leis
buttons.list.unordered.tooltip=Cuir liosta piléar leis
buttons.list.ordered.tooltip=Cuir liosta uimhrithe
buttons.list.task.tooltip=Cuir liosta tascanna leis
buttons.table.add.tooltip=Cuir tábla leis
buttons.table.add.insert=Cuir
buttons.table.rows=Sraitheanna
buttons.table.cols=Colúin
buttons.mention.tooltip=Luaigh úsáideoir nó foireann
buttons.ref.tooltip=Déan tagairt d'eisiúint nó iarratas tarraingthe
buttons.switch_to_legacy.tooltip=Úsáid an eagarthóir oidhreachta ina ionad
@ -348,6 +353,7 @@ enable_update_checker=Cumasaigh Seiceoir Nuashonraithe
enable_update_checker_helper=Seiceálacha ar eisiúintí leagan nua go tréimhsiúil trí nascadh le gitea.io.
env_config_keys=Cumraíocht Comhshaoil
env_config_keys_prompt=Cuirfear na hathróga comhshaoil seo a leanas i bhfeidhm ar do chomhad cumraíochta freisin:
config_write_file_prompt=Scríobhfar na roghanna cumraíochta seo isteach: %s
[home]
nav_menu=Roghchlár Nascleanúint
@ -453,6 +459,7 @@ authorize_application=Údaraigh an Feidhmchlár
authorize_redirect_notice=Déanfar tú a atreorú chuig %s má údaraíonn tú an feidhmchlár seo.
authorize_application_created_by=Chruthaigh %s an feidhmchlár seo.
authorize_application_description=Má dheonaíonn tú an rochtain, beidh sé in ann rochtain a fháil agus scríobh chuig faisnéis uile do chuntais, lena n-áirítear repos príobháideacha agus eagraíochtaí.
authorize_application_with_scopes=Le scóip: %s
authorize_title=Údaraigh "%s" chun rochtain a fháil ar do chuntas?
authorization_failed=Theip ar údarú
authorization_failed_desc=Theip ar an údarú toisc gur bhraitheamar iarratas neamhbhailí. Téigh i dteagmháil le cothabhálaí an aip a rinne tú iarracht a údarú.
@ -758,6 +765,7 @@ uploaded_avatar_not_a_image=Ní íomhá é an comhad uaslódáilte.
uploaded_avatar_is_too_big=Sáraíonn méid an chomhaid uaslódáilte (%d KiB) an méid uasta (%d KiB).
update_avatar_success=Tá do avatar nuashonraithe.
update_user_avatar_success=Nuashonraíodh avatar an úsáideora.
cropper_prompt=Is féidir leat an íomhá a chur in eagar roimh shábháil. Sábhálfar an íomhá in eagar mar PNG.
change_password=Nuashonrú Pasfhocal
old_password=Pasfhocal Reatha
@ -1035,7 +1043,6 @@ generate_repo=Cruthaigh Stóras
generate_from=Gin Ó
repo_desc=Cur síos
repo_desc_helper=Cuir isteach tuairisc ghearr (roghnach)
repo_lang=Teanga
repo_gitignore_helper=Roghnaigh teimpléid .gitignore.
repo_gitignore_helper_desc=Roghnaigh na comhaid nach bhfuil le rianú ó liosta teimpléid do theangacha coitianta. Cuirtear déantáin tipiciúla a ghineann uirlisí tógála gach teanga san áireamh ar.gitignore de réir réamhshocraithe.
issue_labels=Lipéid Eisiúna
@ -1452,12 +1459,10 @@ issues.new.no_items=Gan aon earraí
issues.new.milestone=Cloch Mhíle
issues.new.no_milestone=Gan Chloch Mhíle
issues.new.clear_milestone=Cloch Mhíle soiléir
issues.new.open_milestone=Clocha Míle Oscailte
issues.new.closed_milestone=Clocha Míle Dúnta
issues.new.assignees=Sannaitheoirí
issues.new.clear_assignees=Ceannaitheoirí soiléir
issues.new.no_assignees=Gan aon Sannaitheoirí
issues.new.no_reviewers=Gan athbhreithnithe
issues.new.no_reviewers=Gan Léirmheastóirí
issues.new.blocked_user=Ní féidir saincheist a chruthú toisc go bhfuil úinéir an stórais bac ort.
issues.edit.already_changed=Ní féidir athruithe a shábháil ar an tsaincheist. Dealraíonn sé gur athraigh úsáideoir eile an t-ábhar cheana féin. Athnuachan an leathanach agus déan iarracht eagarthóireacht arís chun a gcuid athruithe a sheachaint
issues.edit.blocked_user=Ní féidir ábhar a chur in eagar toisc go bhfuil an póstaer nó úinéir an stórais bac ort.
@ -1661,27 +1666,20 @@ issues.comment_on_locked=Ní féidir leat trácht a dhéanamh ar shaincheist fao
issues.delete=Scrios
issues.delete.title=Scrios an t-eagrán seo?
issues.delete.text=An bhfuil tú cinnte gur mhaith leat an cheist seo a scriosadh? (Bainfidh sé seo an t-inneachar go léir go buan. Smaoinigh ar é a dhúnadh ina ionad sin, má tá sé i gceist agat é a choinneáil i gcartlann)
issues.tracker=Rianaitheoir Ama
issues.start_tracking_short=Tosaigh Uaineoir
issues.start_tracking=Rianú Am Tosaigh
issues.start_tracking_history=`thosaigh sé ag obair %s`
issues.tracker_auto_close=Stopfar ama go huathoibríoch nuair a dhúnfar an tsaincheist seo
issues.tracking_already_started=`Tá tús curtha agat cheana féin ag rianú ama ar <a href="%s">eagrán eile</a>!`
issues.stop_tracking=Stop Uaineadóir
issues.stop_tracking_history=`stop sé ag obair %s`
issues.cancel_tracking=Caith amach
issues.cancel_tracking_history=`rianú ama curtha ar ceal %s`
issues.add_time=Láimh Cuir Am leis
issues.del_time=Scrios an log ama seo
issues.add_time_short=Cuir Am leis
issues.add_time_cancel=Cealaigh
issues.add_time_history=`am caite curtha leis %s`
issues.del_time_history=`an t-am caite scriosta %s`
issues.add_time_hours=Uaireanta
issues.add_time_minutes=Miontuairi
issues.add_time_sum_to_small=Níor iontráilíodh aon am.
issues.time_spent_total=An t-am iomlán a chaitear
issues.time_spent_from_all_authors=`Am Iomlán Caitear: %s`
issues.due_date=Dáta dlite
issues.invalid_due_date_format=Ní mór 'bbbb-mm-ll' a bheith i bhformáid an dáta dlite.
issues.error_modifying_due_date=Theip ar an dáta dlite a mhodhnú.
@ -2460,6 +2458,8 @@ settings.block_on_official_review_requests=Cuir bac ar chumasc ar iarratais ar a
settings.block_on_official_review_requests_desc=Ní bheidh sé indéanta cumasc nuair a bhíonn iarratais oifigiúla ar athbhreithniú aige, fiú má tá go leor ceadaithe ann.
settings.block_outdated_branch=Cuir bac ar chumasc má tá an t-iarratas tarraingthe as dáta
settings.block_outdated_branch_desc=Ní bheidh cumasc indéanta nuair a bhíonn ceannbhrainse taobh thiar de bhronnbhrainse.
settings.block_admin_merge_override=Ní mór do riarthóirí rialacha cosanta brainse a leanúint
settings.block_admin_merge_override_desc=Ní mór do riarthóirí rialacha cosanta brainse a leanúint agus ní féidir leo dul timpeall air.
settings.default_branch_desc=Roghnaigh brainse stóras réamhshocraithe le haghaidh iarratas tarraingte agus geallann an cód:
settings.merge_style_desc=Stíleanna Cumaisc
settings.default_merge_style_desc=Stíl Cumaisc Réamhshocraithe
@ -2579,7 +2579,6 @@ diff.generated=a ghintear
diff.vendored=curtha ar fáil
diff.comment.add_line_comment=Cuir trácht líne leis
diff.comment.placeholder=Fág trácht
diff.comment.markdown_info=Tacaítear le stíliú le marcáil.
diff.comment.add_single_comment=Cuir trácht aonair leis
diff.comment.add_review_comment=Cuir trácht leis
diff.comment.start_review=Tosaigh athbhreithniú
@ -3514,6 +3513,9 @@ alpine.repository=Eolas Stórais
alpine.repository.branches=Brainsí
alpine.repository.repositories=Stórais
alpine.repository.architectures=Ailtireachtaí
arch.repository=Eolas Stórais
arch.repository.repositories=Stórais
arch.repository.architectures=Ailtireachtaí
cargo.registry=Socraigh an clárlann seo sa chomhad cumraíochta lasta (mar shampla <code>~/.cargo/config.toml</code>):
cargo.install=Chun an pacáiste a shuiteáil ag baint úsáide as Cargo, reáchtáil an t-ordú seo a leanas:
chef.registry=Socraigh an clárlann seo i do chomhad <code>~/.chef/config.rb</code>:

View File

@ -103,6 +103,7 @@ filter.private=Privát
[heatmap]
[editor]
buttons.table.add.insert=Hozzáadás
[filter]
@ -577,7 +578,6 @@ fork_visibility_helper=A másolt tárolók láthatósága nem változtatható me
use_template=Sablon használata
generate_repo=Új repozitórium
repo_desc=Leírás
repo_lang=Nyelv
repo_gitignore_helper=Válasszon .gitignore sablont.
issue_labels=Hibajegy címkék
issue_labels_helper=Válasszon hibajegy címkét.
@ -747,12 +747,9 @@ issues.new.no_items=Nincsenek elemek
issues.new.milestone=Mérföldkő
issues.new.no_milestone=Nincs mérföldkő
issues.new.clear_milestone=Mérföldkő eltávolítása
issues.new.open_milestone=Nyitott mérföldkövek
issues.new.closed_milestone=Lezárt mérföldkövek
issues.new.assignees=Megbízottak
issues.new.clear_assignees=Megbízottak eltávolítása
issues.new.no_assignees=Nincsenek megbízottak
issues.new.no_reviewers=Nincs véleményező
issues.no_ref=Nincsen ág/címke megadva
issues.create=Hibajegy létrehozása
issues.new_label=Új címke
@ -860,19 +857,15 @@ issues.lock.title=Beszélgetés lezárása ezen a hibajegyen.
issues.unlock.title=Hibajegy újranyitása.
issues.comment_on_locked=Egy zárolt hibajegyhez nem lehet hozzászólni.
issues.delete=Törlés
issues.tracker=Időzítő
issues.start_tracking=Időmérés elkezdése
issues.start_tracking_history=`elkezdett dolgozni %s`
issues.stop_tracking_history=`abbahagyta a %s`
issues.add_time=Idő kézi hozzáadása
issues.add_time_short=Idő hozzáadása
issues.add_time_cancel=Megszakítva
issues.add_time_history=`hozzáadta %s`
issues.add_time_hours=Óra
issues.add_time_minutes=Perc
issues.add_time_sum_to_small=Nem volt idő megadva.
issues.time_spent_total=Teljes ráfordított idő
issues.time_spent_from_all_authors=`Teljes ráfordított idő: %s`
issues.due_date=Határidő
issues.invalid_due_date_format=A határidőt 'éééé-hh-nn' formátumban kell megadni.
issues.error_modifying_due_date=Határidő módosítása sikertelen.
@ -1114,7 +1107,6 @@ diff.view_file=Fájl megtekintése
diff.file_byte_size=Méret
diff.file_suppressed=A különbségek nem kerülnek megjelenítésre, mivel a fájl túl nagy
diff.comment.placeholder=Hozzászólás létrehozása
diff.comment.markdown_info=Támogatja a markdown formázást.
diff.comment.add_single_comment=Egyszerű hozzászólás hozzáadása
diff.comment.reply=Válasz
diff.review.comment=Hozzászólás
@ -1600,6 +1592,7 @@ error.not_signed_commit=Nem aláírt commit
filter.type=Típus
alpine.repository.branches=Ágak
alpine.repository.repositories=Tárolók
arch.repository.repositories=Tárolók
conan.details.repository=Tároló
owner.settings.cleanuprules.enabled=Engedélyezett

View File

@ -94,6 +94,7 @@ filter.private=Pribadi
[heatmap]
[editor]
buttons.table.add.insert=Tambah
[filter]
@ -500,7 +501,6 @@ fork_repo=Cabang Gudang penyimpanan
fork_from=Cabang Dari
generate_repo=Buat Repositori
repo_desc=Deskripsi
repo_lang=Bahasa
issue_labels=Label Masalah
issue_labels_helper=Pilih serangkaian label masalah.
license=Lisensi
@ -641,8 +641,6 @@ issues.new.clear_labels=Label yang jelas
issues.new.milestone=Tolak ukur waktu
issues.new.no_milestone=Tidak Ada Milestone
issues.new.clear_milestone=Bersihkan milestone
issues.new.open_milestone=Buka Milestone
issues.new.closed_milestone=Tutup Milestone
issues.no_ref=Tidak Ada Cabang/Tag Ditentukan
issues.create=Buat Masalah
issues.new_label=Label Baru
@ -718,12 +716,11 @@ issues.attachment.download=`Klik untuk mengunduh "%s"`
issues.subscribe=Berlangganan
issues.unsubscribe=Berhenti berlangganan
issues.delete=Hapus
issues.start_tracking_history=`mulai bekerja %s`
issues.stop_tracking_history=`berhenti bekerja %s`
issues.add_time_cancel=Batalkan
issues.add_time_history=`tambah menghabiskan waktu %s`
issues.add_time_hours=Jam
issues.add_time_minutes=Menit
issues.due_date_form_edit=Edit
issues.due_date_form_remove=Menghapus
issues.dependency.cancel=Membatalkan
@ -1287,6 +1284,7 @@ error.unit_not_allowed=Anda tidak diizinkan untuk mengunjungi unit repositori in
[packages]
filter.type=Jenis
alpine.repository.repositories=Repositori
arch.repository.repositories=Repositori
conan.details.repository=Repositori
owner.settings.cleanuprules.enabled=Aktif

View File

@ -124,6 +124,7 @@ filter.public=Opinbert
[heatmap]
[editor]
buttons.table.add.insert=Bæta við
[filter]
@ -566,7 +567,6 @@ download_zip=Sækja ZIP
generate_repo=Mynda Hugbúnaðarsafn
repo_desc=Lýsing
repo_desc_helper=Sláðu inn stutta lýsingu (valfrjálst)
repo_lang=Tungumál
repo_gitignore_helper=Velja .gitignore sniðmát.
repo_gitignore_helper_desc=Veldu hvaða skrár á ekki að rekja af lista sniðmáta fyrir algeng tungumál. Dæmagert rusl sem myndast af byggingarverkfærum hvers tungumáls er sjálfgefið í .gitignore.
issue_labels=Vandamálslýsingar
@ -811,17 +811,15 @@ issues.unlock_comment=aflæsti þessa umræðu %s
issues.lock_confirm=Læsa
issues.unlock_confirm=Aflæsa
issues.delete=Eyða
issues.start_tracking_short=Ræsa Tímamælir
issues.add_time=Bæta Bið Tíma Handvirkt
issues.add_time_short=Bæta Bið Tíma
issues.add_time_cancel=Hætta við
issues.add_time_history=`bætti við eyddum tíma %s`
issues.del_time_history=`fjarlægði eyddum tíma %s`
issues.add_time_hours=Klukkutímar
issues.add_time_minutes=Mínútur
issues.add_time_sum_to_small=Enginn tími var sleginn inn.
issues.time_spent_total=Heildartíma Eytt
issues.time_spent_from_all_authors=`Heildartíma Eytt: %s`
issues.due_date=Eindagi
issues.push_commit_1=bætti við %d framlag %s
issues.push_commits_n=bætti við %d framlög %s
@ -1313,6 +1311,7 @@ dependency.id=Auðkenni
dependency.version=Útgáfa
alpine.repository.branches=Greinar
alpine.repository.repositories=Hugbúnaðarsöfn
arch.repository.repositories=Hugbúnaðarsöfn
conan.details.repository=Hugbúnaðarsafn
container.details.platform=Vettvangur
container.labels=Lýsingar

View File

@ -130,6 +130,7 @@ filter.private=Privati
[heatmap]
[editor]
buttons.table.add.insert=Aggiungi
[filter]
@ -777,7 +778,6 @@ generate_repo=Genera repository
generate_from=Genera da
repo_desc=Descrizione
repo_desc_helper=Inserisci una breve descrizione (opzionale)
repo_lang=Lingua
repo_gitignore_helper=Seleziona i template di .gitignore.
repo_gitignore_helper_desc=Scegli di quali file non tenere traccia da un elenco di modelli per le lingue comuni. Gli artefatti tipici generati dagli strumenti di build di ogni lingua sono inclusi su .gitignore per impostazione predefinita.
issue_labels=Etichette Issue
@ -1095,12 +1095,9 @@ issues.new.no_items=Nessun elemento
issues.new.milestone=Traguardo
issues.new.no_milestone=Nessuna milestone
issues.new.clear_milestone=Milestone pulita
issues.new.open_milestone=Apri Milestone
issues.new.closed_milestone=Milestone chiuse
issues.new.assignees=Assegnatari
issues.new.clear_assignees=Cancella assegnatari
issues.new.no_assignees=Nessuna assegnatario
issues.new.no_reviewers=Nessun revisore
issues.choose.get_started=Inizia
issues.choose.open_external_link=Apri
issues.choose.blank=Default
@ -1260,26 +1257,19 @@ issues.comment_on_locked=Non puoi commentare un problema bloccato.
issues.delete=Elimina
issues.delete.title=Eliminare questo problema?
issues.delete.text=Vuoi davvero eliminare questo problema? (Questo rimuoverà permanentemente tutti i contenuti. Considera invece di chiuderlo, se vuoi tenerlo archiviato)
issues.tracker=Cronografo
issues.start_tracking_short=Avvia timer
issues.start_tracking=Avvia cronografo
issues.start_tracking_history=ha iniziato a lavorare %s
issues.tracker_auto_close=Il timer verrà interrotto automaticamente una volta che il problema verrá chiuso
issues.tracking_already_started=`Hai già avviato il monitoraggio del tempo su <a href="%s">un altro problema</a>!`
issues.stop_tracking=Ferma timer
issues.stop_tracking_history=`ha smesso di funzionare %s`
issues.cancel_tracking=Scarta
issues.add_time=Aggiungi Tempo manualmente
issues.del_time=Elimina questo registro di tempo
issues.add_time_short=Aggiungi tempo
issues.add_time_cancel=Annulla
issues.add_time_history=`aggiunto tempo trascorso %s`
issues.del_time_history=`tempo trascorso eliminato %s`
issues.add_time_hours=Ore
issues.add_time_minutes=Minuti
issues.add_time_sum_to_small=Non è stato inserito alcun tempo.
issues.time_spent_total=Tempo totale trascorso
issues.time_spent_from_all_authors=`Totale tempo trascorso: %s`
issues.due_date=Data di scadenza
issues.invalid_due_date_format=Il formato della data di scadenza deve essere 'yyyy-mm-dd'.
issues.error_modifying_due_date=Impossibile modificare la data di scadenza.
@ -1965,7 +1955,6 @@ diff.load=Carica Diff
diff.generated=generato
diff.vendored=esterno
diff.comment.placeholder=Lascia un commento
diff.comment.markdown_info=Lo stile con markdown è supportato.
diff.comment.add_single_comment=Aggiungi un commento singolo
diff.comment.add_review_comment=Aggiungi commento
diff.comment.start_review=Inizio revisione
@ -2734,6 +2723,7 @@ dependency.version=Versione
alpine.install=Per installare il pacchetto, eseguire il seguente comando:
alpine.repository.branches=Branches
alpine.repository.repositories=Repository
arch.repository.repositories=Repository
chef.install=Per installare il pacchetto, eseguire il seguente comando:
composer.registry=Imposta questo registro nel tuo file <code>~/.composer/config.json</code>:
composer.install=Per installare il pacchetto utilizzando Composer, eseguire il seguente comando:

View File

@ -104,6 +104,7 @@ copy_url=URLをコピー
copy_hash=ハッシュをコピー
copy_content=内容をコピー
copy_branch=ブランチ名をコピー
copy_path=パスをコピー
copy_success=コピーされました!
copy_error=コピーに失敗しました
copy_type_unsupported=このファイルタイプはコピーできません
@ -209,6 +210,10 @@ buttons.link.tooltip=リンク追加
buttons.list.unordered.tooltip=箇条書き追加
buttons.list.ordered.tooltip=番号付きリスト追加
buttons.list.task.tooltip=タスクリスト追加
buttons.table.add.tooltip=テーブルの追加
buttons.table.add.insert=追加
buttons.table.rows=
buttons.table.cols=
buttons.mention.tooltip=ユーザーまたはチームにメンション
buttons.ref.tooltip=イシューまたはプルリクエストを参照
buttons.switch_to_legacy.tooltip=レガシーエディタを使用する
@ -348,6 +353,7 @@ enable_update_checker=アップデートチェッカーを有効にする
enable_update_checker_helper=gitea.ioに接続して定期的に新しいバージョンのリリースを確認します。
env_config_keys=環境設定
env_config_keys_prompt=以下の環境変数も設定ファイルに適用されます:
config_write_file_prompt=これらの設定オプションは %s に書き込まれます
[home]
nav_menu=ナビゲーションメニュー
@ -453,6 +459,7 @@ authorize_application=アプリケーションを許可
authorize_redirect_notice=このアプリケーションを許可すると %s にリダイレクトします。
authorize_application_created_by=このアプリケーションは %s が作成しました。
authorize_application_description=アクセスを許可すると、このアプリケーションは、プライベート リポジトリや組織を含むあなたのすべてのアカウント情報に対して、アクセスと書き込みができるようになります。
authorize_application_with_scopes=スコープ: %s
authorize_title=`"%s"にあなたのアカウントへのアクセスを許可しますか?`
authorization_failed=認可失敗
authorization_failed_desc=無効なリクエストを検出したため認可が失敗しました。 認可しようとしたアプリの開発者に連絡してください。
@ -580,6 +587,8 @@ lang_select_error=言語をリストから選択してください。
username_been_taken=ユーザー名が既に使用されています。
username_change_not_local_user=非ローカルユーザーのユーザー名は変更できません。
change_username_disabled=ユーザー名の変更は無効化されています。
change_full_name_disabled=フルネームの変更は無効化されています。
username_has_not_been_changed=ユーザー名は変更されていません
repo_name_been_taken=リポジトリ名が既に使用されています。
repository_force_private=強制プライベートが有効です。プライベートリポジトリはパブリックにできません。
@ -705,6 +714,8 @@ public_profile=公開プロフィール
biography_placeholder=自己紹介してください!(Markdownを使うことができます)
location_placeholder=おおよその場所を他の人と共有
profile_desc=あなたのプロフィールが他のユーザーにどのように表示されるかを制御します。あなたのプライマリメールアドレスは、通知、パスワードの回復、WebベースのGit操作に使用されます。
password_username_disabled=ユーザー名の変更は許可されていません。詳細はサイト管理者にお問い合わせください。
password_full_name_disabled=フルネームの変更は許可されていません。詳細はサイト管理者にお問い合わせください。
full_name=フルネーム
website=Webサイト
location=場所
@ -754,6 +765,7 @@ uploaded_avatar_not_a_image=アップロードしたファイルは画像ファ
uploaded_avatar_is_too_big=アップロードされたファイルサイズ(%d KiB) が最大サイズ(%d KiB) を超えています。
update_avatar_success=アバターを更新しました。
update_user_avatar_success=ユーザーのアバターを更新しました。
cropper_prompt=保存する前に画像を編集できます。 編集した画像はPNGで保存されます。
change_password=パスワードを更新
old_password=現在のパスワード
@ -1031,7 +1043,6 @@ generate_repo=リポジトリの生成
generate_from=他からの生成
repo_desc=説明
repo_desc_helper=簡単な説明を入力してください (オプション)
repo_lang=言語
repo_gitignore_helper=.gitignoreテンプレートを選択してください。
repo_gitignore_helper_desc=一般的な言語のテンプレートリストから、追跡しないファイルの設定を選択します。 各言語のビルドツールが生成する典型的なファイルが、デフォルトで.gitignoreに含まれます。
issue_labels=イシューラベル
@ -1448,8 +1459,6 @@ issues.new.no_items=項目なし
issues.new.milestone=マイルストーン
issues.new.no_milestone=マイルストーンなし
issues.new.clear_milestone=マイルストーンをクリア
issues.new.open_milestone=オープン中のマイルストーン
issues.new.closed_milestone=クローズされたマイルストーン
issues.new.assignees=担当者
issues.new.clear_assignees=担当者をクリア
issues.new.no_assignees=担当者なし
@ -1657,27 +1666,20 @@ issues.comment_on_locked=ロックされているイシューにコメントは
issues.delete=削除
issues.delete.title=このイシューを削除しますか?
issues.delete.text=本当にこのイシューを削除しますか? (これはすべてのコンテンツを完全に削除します。 保存しておきたい場合は、代わりにクローズすることを検討してください)
issues.tracker=タイムトラッカー
issues.start_tracking_short=タイマー 開始
issues.start_tracking=タイムトラッキングを開始
issues.start_tracking_history=`が作業を開始 %s`
issues.tracker_auto_close=タイマーは、このイシューがクローズされると自動的に終了します
issues.tracking_already_started=`<a href="%s">別のイシュー</a>で既にタイムトラッキングを開始しています!`
issues.stop_tracking=タイマー 終了
issues.stop_tracking_history=`が作業を終了 %s`
issues.cancel_tracking=中止
issues.cancel_tracking_history=`がタイムトラッキングを中止 %s`
issues.add_time=手で時間を入力
issues.del_time=このタイムログを削除
issues.add_time_short=時間入力
issues.add_time_cancel=キャンセル
issues.add_time_history=`が作業時間を追加 %s`
issues.del_time_history=`が作業時間を削除 %s`
issues.add_time_hours=時間
issues.add_time_minutes=
issues.add_time_sum_to_small=時間が入力されていません。
issues.time_spent_total=かかった時間の合計
issues.time_spent_from_all_authors=`かかった時間の合計: %s`
issues.due_date=期日
issues.invalid_due_date_format=期日は 'yyyy-mm-dd' の形式で入力してください。
issues.error_modifying_due_date=期日を変更できませんでした。
@ -2456,6 +2458,8 @@ settings.block_on_official_review_requests=公式レビュー依頼でマージ
settings.block_on_official_review_requests_desc=公式レビュー依頼があるときは、承認数を満たしていてもマージできないようにします。
settings.block_outdated_branch=遅れているプルリクエストのマージをブロック
settings.block_outdated_branch_desc=baseブランチがheadブランチより進んでいる場合、マージできないようにします。
settings.block_admin_merge_override=管理者もブランチ保護のルールに従う
settings.block_admin_merge_override_desc=管理者はブランチ保護のルールに従う必要があり、回避することはできません。
settings.default_branch_desc=プルリクエストやコミット表示のデフォルトのブランチを選択:
settings.merge_style_desc=マージ スタイル
settings.default_merge_style_desc=デフォルトのマージスタイル
@ -2575,7 +2579,6 @@ diff.generated=generated
diff.vendored=vendored
diff.comment.add_line_comment=行コメントを追加
diff.comment.placeholder=コメントを残す
diff.comment.markdown_info=Markdownによる書式設定をサポートしています。
diff.comment.add_single_comment=単独のコメントを追加
diff.comment.add_review_comment=コメントを追加
diff.comment.start_review=レビュー開始
@ -3510,6 +3513,9 @@ alpine.repository=リポジトリ情報
alpine.repository.branches=Branches
alpine.repository.repositories=Repositories
alpine.repository.architectures=Architectures
arch.repository=リポジトリ情報
arch.repository.repositories=リポジトリ
arch.repository.architectures=Architectures
cargo.registry=Cargo 設定ファイルでこのレジストリをセットアップします。(例 <code>~/.cargo/config.toml</code>):
cargo.install=Cargo を使用してパッケージをインストールするには、次のコマンドを実行します:
chef.registry=あなたの <code>~/.chef/config.rb</code> ファイルに、このレジストリをセットアップします:

View File

@ -95,6 +95,7 @@ filter.private=비공개
[heatmap]
[editor]
buttons.table.add.insert=추가
[filter]
@ -544,7 +545,6 @@ fork_from=원본 프로젝트 :
fork_visibility_helper=포크된 저장소의 가시성은 변경하실 수 없습니다.
use_template=이 템플릿을 사용
repo_desc=설명
repo_lang=언어
repo_gitignore_helper=.gitignore 템플릿 선택
license=라이센스
license_helper=라이센스 파일을 선택해주세요.
@ -680,8 +680,6 @@ issues.new.clear_labels=레이블 초기화
issues.new.milestone=마일스톤
issues.new.no_milestone=마일스톤 없음
issues.new.clear_milestone=마일스톤 초기화
issues.new.open_milestone=마일스톤 생성
issues.new.closed_milestone=마일스톤 닫기
issues.new.assignees=담당자
issues.new.clear_assignees=담당자 초기화
issues.new.no_assignees=담당자 없음
@ -773,19 +771,15 @@ issues.attachment.download=' "%s"를 다운로드 하려면 클릭 하십시오
issues.subscribe=구독하기
issues.unsubscribe=구독 취소
issues.delete=삭제
issues.tracker=타임 트래커
issues.start_tracking=타임 트래킹 시작
issues.start_tracking_history=`%s가 작업 시작`
issues.stop_tracking_history=`작업 중단 %s`
issues.add_time=수동으로 시간 입력
issues.add_time_short=시간 입력
issues.add_time_cancel=취소
issues.add_time_history=`사용 시간이 추가됨 %s`
issues.add_time_hours=시간
issues.add_time_minutes=
issues.add_time_sum_to_small=시간이 입력되지 않았습니다.
issues.time_spent_total=총 경과된 시간
issues.time_spent_from_all_authors=`총 경과된 시간: %s`
issues.due_date=마감일
issues.invalid_due_date_format="마감일은 반드시 'yyyy-mm-dd' 형식이어야 합니다."
issues.error_modifying_due_date="마감일 수정을 실패하였습니다."
@ -1546,6 +1540,7 @@ error.unit_not_allowed=이 저장소 섹션에 접근할 수 없습니다.
[packages]
filter.type=유형
alpine.repository.repositories=저장소
arch.repository.repositories=저장소
conan.details.repository=저장소
owner.settings.cleanuprules.enabled=활성화됨

View File

@ -175,6 +175,7 @@ buttons.link.tooltip=Pievienot saiti
buttons.list.unordered.tooltip=Pievienot sarakstu
buttons.list.ordered.tooltip=Pievienot numurētu sarakstu
buttons.list.task.tooltip=Pievienot uzdevumu sarakstu
buttons.table.add.insert=Pievienot
buttons.mention.tooltip=Pieminēt lietotāju vai komandu
buttons.ref.tooltip=Atsaukties uz problēmu vai izmaiņu pieprasījumu
buttons.switch_to_legacy.tooltip=Izmantot vēsturisko redaktoru
@ -939,7 +940,6 @@ generate_repo=Ģenerēt repozitoriju
generate_from=Ģenerēt no
repo_desc=Apraksts
repo_desc_helper=Ievadiet īsu aprakstu (neobligāts)
repo_lang=Valoda
repo_gitignore_helper=Izvēlieties .gitignore sagatavi.
repo_gitignore_helper_desc=Izvēlieties kādi faili netiks glabāti repozitorijā no sagatavēm biežāk lietotājām valodām. Pēc noklusējuma .gitignore iekļauj valodu kompilācijas rīku artifaktus.
issue_labels=Problēmu iezīmes
@ -1330,12 +1330,9 @@ issues.new.no_items=Nav vienumu
issues.new.milestone=Atskaites punkts
issues.new.no_milestone=Nav atskaites punktu
issues.new.clear_milestone=Notīrīt atskaites punktus
issues.new.open_milestone=Atvērtie atskaites punktus
issues.new.closed_milestone=Aizvērtie atskaites punkti
issues.new.assignees=Atbildīgie
issues.new.clear_assignees=Noņemt atbildīgo
issues.new.no_assignees=Nav atbildīgo
issues.new.no_reviewers=Nav recenzentu
issues.choose.get_started=Sākt darbu
issues.choose.open_external_link=Atvērt
issues.choose.blank=Noklusējuma
@ -1532,27 +1529,20 @@ issues.comment_on_locked=Jūs nevarat komentēt slēgtai problēmai.
issues.delete=Dzēst
issues.delete.title=Dzēst šo problēmu?
issues.delete.text=Vai patiešām vēlaties dzēst šo problemu? (Neatgriezeniski tiks izdzēsts viss saturs. Apsveriet iespēju to aizvērt, ja vēlaties informāciju saglabāt vēsturei)
issues.tracker=Laika uzskaite
issues.start_tracking_short=Uzsākt taimeri
issues.start_tracking=Uzsākt laika uzskaiti
issues.start_tracking_history=` uzsāka darbu %s`
issues.tracker_auto_close=Taimeris tiks automātiski apturēts, kad šī problēma tiks aizvērta
issues.tracking_already_started=`Jau ir uzsākta laika uzskaite par <a href="%s">citu problēmu</a>!`
issues.stop_tracking=Apturēt taimeri
issues.stop_tracking_history=` beidza strādāt %s`
issues.cancel_tracking=Atmest
issues.cancel_tracking_history=`atcēla laika uzskaiti %s`
issues.add_time=Manuāli pievienot laiku
issues.del_time=Dzēst šo laika žurnāla ierakstu
issues.add_time_short=Pievienot laiku
issues.add_time_cancel=Atcelt
issues.add_time_history=` pievienoja patērēto laiku %s`
issues.del_time_history=`dzēsts patērētais laiks %s`
issues.add_time_hours=Stundas
issues.add_time_minutes=Minūtes
issues.add_time_sum_to_small=Nav norādīts laiks.
issues.time_spent_total=Kopējais patērētais laiks
issues.time_spent_from_all_authors=`Kopējais patērētais laiks: %s`
issues.due_date=Izpildes termiņš
issues.invalid_due_date_format=Izpildes termiņam ir jābūt formāta 'yyyy-mm-dd'.
issues.error_modifying_due_date=Neizdevās izmainīt izpildes termiņu.
@ -2358,7 +2348,6 @@ diff.generated=ģenerēts
diff.vendored=ārējs
diff.comment.add_line_comment=Pievienot rindas komentāru
diff.comment.placeholder=Ievadiet komentāru
diff.comment.markdown_info=Tiek atbalstīta formatēšana ar Markdown.
diff.comment.add_single_comment=Pievienot vienu komentāru
diff.comment.add_review_comment=Pievienot komentāru
diff.comment.start_review=Sākt recenziju
@ -2702,7 +2691,6 @@ dashboard.gc_times=GC reizes
dashboard.update_checker=Atjauninājumu pārbaudītājs
dashboard.delete_old_system_notices=Dzēst vecos sistēmas paziņojumus no datubāzes
dashboard.gc_lfs=Veikt atkritumu uzkopšanas darbus LFS meta objektiem
dashboard.sync_branch.started=Sākta atzaru sinhronizācija
dashboard.rebuild_issue_indexer=Pārbūvēt problēmu indeksu
users.user_manage_panel=Lietotāju kontu pārvaldība
@ -3236,6 +3224,9 @@ alpine.install=Lai uzstādītu pakotni, ir jāizpilda šī komanda:
alpine.repository=Repozitorija informācija
alpine.repository.repositories=Repozitoriji
alpine.repository.architectures=Arhitektūras
arch.repository=Repozitorija informācija
arch.repository.repositories=Repozitoriji
arch.repository.architectures=Arhitektūras
cargo.registry=Uzstādiet šo reģistru Cargo konfigurācijas failā, piemēram, <code>~/.cargo/config.toml</code>:
cargo.install=Lai instalētu Cargo pakotni, izpildiet sekojošu komandu:
chef.registry=Uzstādiet šo reģistru failā <code>~/.chef/config.rb</code>:

View File

@ -129,6 +129,7 @@ filter.private=Prive
[heatmap]
[editor]
buttons.table.add.insert=Toevoegen
[filter]
@ -775,7 +776,6 @@ generate_repo=Repository genereren
generate_from=Genereer van
repo_desc=Omschrijving
repo_desc_helper=Voer korte beschrijving in (optioneel)
repo_lang=Taal
repo_gitignore_helper=Selecteer .gitignore templates.
repo_gitignore_helper_desc=Kies welke bestanden niet bij te houden vanuit een lijst met sjablonen voor alledaagse talen. Gebruikelijke artefacten gegenereerd door de build tools van elke taal zijn standaard inbegrepen met .gitignore.
issue_labels=Issuelabels
@ -1093,12 +1093,9 @@ issues.new.no_items=Geen items
issues.new.milestone=Mijlpaal
issues.new.no_milestone=Geen mijlpaal
issues.new.clear_milestone=Verwijder mijlpaal
issues.new.open_milestone=Open mijlpalen
issues.new.closed_milestone=Gesloten mijlpalen
issues.new.assignees=Toegewezen aan
issues.new.clear_assignees=Verwijder toegewezen aan
issues.new.no_assignees=Niet toegewezen
issues.new.no_reviewers=Geen beoordelaars
issues.choose.get_started=Ga aan de slag
issues.choose.open_external_link=Open
issues.choose.blank=Standaard
@ -1257,26 +1254,19 @@ issues.comment_on_locked=Je kunt geen commentaar geven op een vergrendeld proble
issues.delete=Verwijderen
issues.delete.title=Deze issue verwijderen?
issues.delete.text=Wilt u deze issue echt verwijderen? (Dit is permanent en verwijdert alle inhoud. Overweeg om deze issue te sluiten, als u liever deze als archief wilt bijhouden)
issues.tracker=Tijdregistratie
issues.start_tracking_short=Start timer
issues.start_tracking=Start tijdregistratie
issues.start_tracking_history=`%s is begonnen`
issues.tracker_auto_close=Timer wordt automatisch gestopt wanneer dit probleem wordt gesloten
issues.tracking_already_started=`Je houd al tijd bij voor <a href="%s">een ander issue</a>!`
issues.stop_tracking=Stop timer
issues.stop_tracking_history=`gestopt met werken aan %s`
issues.cancel_tracking=Weggooien
issues.add_time=Tijd handmatig toevoegen
issues.del_time=Verwijder deze tijdlog
issues.add_time_short=Timer toevoegen
issues.add_time_cancel=Annuleren
issues.add_time_history=`heeft besteedde tijd toegevoegd: %s`
issues.del_time_history=`heeft besteedde tijd verwijderd: %s`
issues.add_time_hours=Uren
issues.add_time_minutes=Minuten
issues.add_time_sum_to_small=Geen tijd opgegeven.
issues.time_spent_total=Totaal besteedde tijd
issues.time_spent_from_all_authors=`Totaal besteedde tijd: %s`
issues.due_date=Vervaldatum
issues.invalid_due_date_format=Het formaat van de deadline is moet 'jjjj-mm-dd' zijn.
issues.error_modifying_due_date=Deadline aanpassen mislukt.
@ -1900,7 +1890,6 @@ diff.load=Laad Diff
diff.generated=gegenereerd
diff.vendored=vendored
diff.comment.placeholder=Opmerking toevoegen
diff.comment.markdown_info=Styling met markdown wordt ondersteund.
diff.comment.add_single_comment=Één reactie toevoegen
diff.comment.add_review_comment=Voeg commentaar toe
diff.comment.start_review=Review starten
@ -2523,6 +2512,7 @@ error.unit_not_allowed=U heeft geen toegang tot deze sectie van de repository.
filter.type=Type
assets=Assets
alpine.repository.repositories=Repositories
arch.repository.repositories=Repositories
conan.details.repository=Opslagplaats
rubygems.required.ruby=Vereist Ruby versie
rubygems.required.rubygems=Vereist RubyGem versie

View File

@ -126,6 +126,7 @@ filter.private=Prywatne
[heatmap]
[editor]
buttons.table.add.insert=Dodaj
[filter]
@ -732,7 +733,6 @@ generate_repo=Generuj repozytorium
generate_from=Generuj z
repo_desc=Opis
repo_desc_helper=Wprowadź krótki opis (opcjonalnie)
repo_lang=Język
repo_gitignore_helper=Wybierz szablony pliku .gitignore.
issue_labels=Etykiety zgłoszenia
issue_labels_helper=Wybierz zestaw etykiet zgłoszeń.
@ -1012,12 +1012,9 @@ issues.new.no_items=Brak elementów
issues.new.milestone=Kamień milowy
issues.new.no_milestone=Brak kamienia milowego
issues.new.clear_milestone=Wyczyść kamień milowy
issues.new.open_milestone=Otwarte kamienie milowe
issues.new.closed_milestone=Zamknięte kamienie milowe
issues.new.assignees=Przypisani
issues.new.clear_assignees=Usuń przypisanych
issues.new.no_assignees=Brak przypisanych
issues.new.no_reviewers=Brak recenzentów
issues.choose.get_started=Rozpocznij
issues.choose.open_external_link=Otwórz
issues.choose.blank=Domyślny
@ -1158,23 +1155,18 @@ issues.lock.title=Zablokuj konwersację w tym zgłoszeniu.
issues.unlock.title=Odblokuj konwersację w tym zgłoszeniu.
issues.comment_on_locked=Nie możesz umieszczać komentarzy pod zablokowanym zgłoszeniem.
issues.delete=Usuń
issues.tracker=Śledzenie czasu
issues.start_tracking=Rozpocznij śledzenie czasu
issues.start_tracking_history=`rozpoczął(-ęła) pracę nad %s`
issues.tracker_auto_close=Licznik czasu zostanie automatycznie zatrzymany w momencie zamknięcia tego zgłoszenia
issues.stop_tracking_history=`zakończył(-a) pracę nad %s`
issues.cancel_tracking=Odrzuć
issues.add_time=Dodaj czas ręcznie
issues.del_time=Usuń ten dziennik czasu
issues.add_time_short=Dodaj czas
issues.add_time_cancel=Anuluj
issues.add_time_history=`dodał(-a) spędzony czas %s`
issues.del_time_history=usunął(-ęła) spędzony czas %s
issues.add_time_hours=Godziny
issues.add_time_minutes=Minuty
issues.add_time_sum_to_small=Czas nie został wprowadzony.
issues.time_spent_total=Całkowity spędzony czas
issues.time_spent_from_all_authors=`Całkowity spędzony czas: %s`
issues.due_date=Termin realizacji
issues.invalid_due_date_format=Format terminu realizacji musi mieć wartość 'rrrr-mm-dd'.
issues.error_modifying_due_date=Nie udało się zmodyfikować terminu realizacji.
@ -1759,7 +1751,6 @@ diff.file_byte_size=Rozmiar
diff.file_suppressed=Plik diff jest za duży
diff.generated=wygenerowano
diff.comment.placeholder=Zostaw komentarz
diff.comment.markdown_info=Formatowanie przy użyciu Markdown jest wspierane.
diff.comment.add_single_comment=Dodaj jeden komentarz
diff.comment.add_review_comment=Dodaj komentarz
diff.comment.start_review=Rozpocznij recenzję
@ -2416,6 +2407,7 @@ error.unit_not_allowed=Nie masz uprawnień do tej sekcji repozytorium.
[packages]
filter.type=Typ
alpine.repository.repositories=Repozytoria
arch.repository.repositories=Repozytoria
conan.details.repository=Repozytorium
owner.settings.cleanuprules.enabled=Włączone

View File

@ -172,6 +172,7 @@ buttons.link.tooltip=Adicionar um link
buttons.list.unordered.tooltip=Adicionar uma lista com marcadores
buttons.list.ordered.tooltip=Adicionar uma lista numerada
buttons.list.task.tooltip=Adicionar uma lista de tarefas
buttons.table.add.insert=Adicionar
buttons.mention.tooltip=Mencionar um usuário ou equipe
buttons.ref.tooltip=Referenciar um issue ou um pull request
buttons.switch_to_legacy.tooltip=Em vez disso, usar o editor legado
@ -934,7 +935,6 @@ generate_repo=Gerar repositório
generate_from=Gerar de
repo_desc=Descrição
repo_desc_helper=Digite uma breve descrição (opcional)
repo_lang=Linguagem
repo_gitignore_helper=Selecione modelos do .gitignore.
repo_gitignore_helper_desc=Escolha os arquivos que não serão rastreados da lista de modelos para linguagens comuns. Artefatos típicos gerados pelos compiladores de cada linguagem estão incluídos no .gitignore por padrão.
issue_labels=Etiquetas de issue
@ -1322,12 +1322,9 @@ issues.new.no_items=Nenhum item
issues.new.milestone=Marco
issues.new.no_milestone=Sem marco
issues.new.clear_milestone=Limpar marco
issues.new.open_milestone=Marcos abertos
issues.new.closed_milestone=Marcos fechados
issues.new.assignees=Responsáveis
issues.new.clear_assignees=Limpar responsáveis
issues.new.no_assignees=Sem responsável
issues.new.no_reviewers=Sem revisor
issues.choose.get_started=Primeiros passos
issues.choose.open_external_link=Abrir
issues.choose.blank=Padrão
@ -1522,27 +1519,20 @@ issues.comment_on_locked=Você não pode comentar em uma issue bloqueada.
issues.delete=Apagar
issues.delete.title=Apagar esta issue?
issues.delete.text=Você realmente deseja excluir esta issue? (Isto irá remover permanentemente todo o conteúdo. Considere fechá-la em vez disso, se você pretende mantê-la arquivado)
issues.tracker=Contador de tempo
issues.start_tracking_short=Iniciar Cronômetro
issues.start_tracking=Iniciar Cronômetro
issues.start_tracking_history=`começou a trabalhar %s`
issues.tracker_auto_close=Contador de tempo será parado automaticamente quando esta issue for fechada
issues.tracking_already_started=`Você já iniciou o cronômetro em <a href="%s">outra issue</a>!`
issues.stop_tracking=Parar Cronômetro
issues.stop_tracking_history=`parou de trabalhar %s`
issues.cancel_tracking=Descartar
issues.cancel_tracking_history=`cronômetro cancelado %s`
issues.add_time=Adicionar tempo manualmente
issues.del_time=Apagar este registro de tempo
issues.add_time_short=Adicionar tempo
issues.add_time_cancel=Cancelar
issues.add_time_history=`adicionou tempo gasto %s`
issues.del_time_history=`removeu tempo gasto %s`
issues.add_time_hours=Horas
issues.add_time_minutes=Minutos
issues.add_time_sum_to_small=Nenhum tempo foi inserido.
issues.time_spent_total=Tempo total gasto
issues.time_spent_from_all_authors=`Tempo total gasto: %s`
issues.due_date=Data limite
issues.invalid_due_date_format=Formato da data limite inválido, deve ser 'dd/mm/aaaa'.
issues.error_modifying_due_date=Falha ao modificar a data limite.
@ -2319,7 +2309,6 @@ diff.load=Carregar Diff
diff.generated=gerado
diff.vendored=externo
diff.comment.placeholder=Deixe um comentário
diff.comment.markdown_info=Estilo com markdown é suportado.
diff.comment.add_single_comment=Adicionar um único comentário
diff.comment.add_review_comment=Adicionar comentário
diff.comment.start_review=Iniciar revisão
@ -3173,6 +3162,9 @@ alpine.install=Para instalar o pacote, execute o seguinte comando:
alpine.repository=Informações do repositório
alpine.repository.repositories=Repositórios
alpine.repository.architectures=Arquiteturas
arch.repository=Informações do repositório
arch.repository.repositories=Repositórios
arch.repository.architectures=Arquiteturas
cargo.registry=Configurar este registro no arquivo de configuração de Cargo (por exemplo <code>~/.cargo/config.toml</code>):
cargo.install=Para instalar o pacote usando Cargo, execute o seguinte comando:
chef.registry=Configure este registro em seu arquivo <code>~/.chef/config.rb</code>:

View File

@ -104,6 +104,7 @@ copy_url=Copiar URL
copy_hash=Copiar hash
copy_content=Copiar conteúdo
copy_branch=Copiar nome do ramo
copy_path=Copiar caminho
copy_success=Copiado!
copy_error=Falha ao copiar
copy_type_unsupported=Este tipo de ficheiro não pode ser copiado
@ -144,6 +145,7 @@ confirm_delete_selected=Confirma a exclusão de todos os itens marcados?
name=Nome
value=Valor
readme=Leia-me
filter=Filtro
filter.clear=Retirar filtro
@ -209,6 +211,10 @@ buttons.link.tooltip=Adicionar uma ligação
buttons.list.unordered.tooltip=Adicionar uma lista de pontos
buttons.list.ordered.tooltip=Adicionar uma lista numerada
buttons.list.task.tooltip=Adicionar uma lista de tarefas
buttons.table.add.tooltip=Adicionar uma tabela
buttons.table.add.insert=Adicionar
buttons.table.rows=Linhas
buttons.table.cols=Colunas
buttons.mention.tooltip=Mencionar um utilizador ou uma equipa
buttons.ref.tooltip=Referenciar uma questão ou um pedido de integração
buttons.switch_to_legacy.tooltip=Usar o editor clássico
@ -348,6 +354,7 @@ enable_update_checker=Habilitar verificador de novidades
enable_update_checker_helper=Verifica, periodicamente, se foi lançada alguma versão nova, fazendo uma ligação ao gitea.io.
env_config_keys=Configuração do ambiente
env_config_keys_prompt=As seguintes variáveis de ambiente também serão aplicadas ao seu ficheiro de configuração:
config_write_file_prompt=Estas opções de configuração serão escritas em: %s
[home]
nav_menu=Menu de navegação
@ -453,6 +460,7 @@ authorize_application=Autorizar aplicação
authorize_redirect_notice=Irá ser reencaminhado para %s se autorizar esta aplicação.
authorize_application_created_by=Esta aplicação foi criada por %s.
authorize_application_description=Se conceder acesso, a aplicação terá privilégios para alterar toda a informação da conta, incluindo repositórios e organizações privados.
authorize_application_with_scopes=Com âmbitos: %s
authorize_title=Autorizar o acesso de "%s" à sua conta?
authorization_failed=A autorização falhou
authorization_failed_desc=A autorização falhou porque encontrámos um pedido inválido. Entre em contacto com o responsável pela aplicação que tentou autorizar.
@ -758,6 +766,7 @@ uploaded_avatar_not_a_image=O ficheiro carregado não é uma imagem.
uploaded_avatar_is_too_big=O tamanho do ficheiro carregado (%d KiB) excede o tamanho máximo (%d KiB).
update_avatar_success=O seu avatar foi substituído.
update_user_avatar_success=O avatar do utilizador foi modificado.
cropper_prompt=Pode editar a imagem antes de a guardar. A imagem editada será guardada como PNG.
change_password=Substituir a senha
old_password=Senha corrente
@ -1024,6 +1033,8 @@ fork_to_different_account=Fazer uma derivação para uma conta diferente
fork_visibility_helper=A visibilidade de um repositório derivado não poderá ser alterada posteriormente.
fork_branch=Ramo a ser clonado para a derivação
all_branches=Todos os ramos
view_all_branches=Ver todos os ramos
view_all_tags=Ver todas as etiquetas
fork_no_valid_owners=Não pode fazer uma derivação deste repositório porque não existem proprietários válidos.
fork.blocked_user=Não pode derivar o repositório porque foi bloqueado/a pelo/a proprietário/a do repositório.
use_template=Usar este modelo
@ -1035,7 +1046,8 @@ generate_repo=Gerar repositório
generate_from=Gerar a partir de
repo_desc=Descrição
repo_desc_helper=Insira uma descrição curta (opcional)
repo_lang=Idioma
repo_no_desc=Descrição não fornecida
repo_lang=Idiomas
repo_gitignore_helper=Escolher modelos .gitignore.
repo_gitignore_helper_desc=Escolha os ficheiros que não são para rastrear, a partir de uma lista de modelos de linguagens comuns. Serão incluídos no ficheiro .gitignore, logo à partida, artefactos típicos gerados pelas ferramentas de construção de cada uma das linguagens.
issue_labels=Rótulos para as questões
@ -1452,8 +1464,6 @@ issues.new.no_items=Sem itens
issues.new.milestone=Etapa
issues.new.no_milestone=Sem etapa
issues.new.clear_milestone=Limpar etapa
issues.new.open_milestone=Etapas abertas
issues.new.closed_milestone=Etapas fechadas
issues.new.assignees=Encarregados
issues.new.clear_assignees=Retirar todos os encarregados
issues.new.no_assignees=Sem encarregados
@ -1661,27 +1671,34 @@ issues.comment_on_locked=Não pode comentar numa questão bloqueada.
issues.delete=Eliminar
issues.delete.title=Pretende eliminar esta questão?
issues.delete.text=Tem a certeza que quer eliminar esta questão? Isso irá remover todo o conteúdo permanentemente. Como alternativa considere fechá-la, se pretender mantê-la em arquivo.
issues.tracker=Gestor de tempo
issues.start_tracking_short=Iniciar cronómetro
issues.start_tracking=Iniciar contagem de tempo
issues.start_tracking_history=`começou a trabalhar %s`
issues.timetracker_timer_start=Iniciar cronómetro
issues.timetracker_timer_stop=Parar cronómetro
issues.timetracker_timer_discard=Descartar cronómetro
issues.timetracker_timer_manually_add=Adicionar tempo
issues.time_estimate_placeholder=1h 2m
issues.time_estimate_set=Definir tempo estimado
issues.time_estimate_display=Estimativa: %s
issues.change_time_estimate_at=alterou a estimativa de tempo para <b>%s</b> %s
issues.remove_time_estimate_at=removeu a estimativa de tempo %s
issues.time_estimate_invalid=O formato da estimativa de tempo é inválido
issues.start_tracking_history=começou a trabalhar %s
issues.tracker_auto_close=O cronómetro será parado automaticamente quando esta questão for fechada
issues.tracking_already_started=`Você já iniciou a contagem de tempo <a href="%s">noutra questão</a>!`
issues.stop_tracking=Parar cronómetro
issues.stop_tracking_history=`parou de trabalhar %s`
issues.cancel_tracking=Descartar
issues.stop_tracking_history=trabalhou durante <b>%s</b> %s
issues.cancel_tracking_history=`cancelou a contagem de tempo %s`
issues.add_time=Adicionar tempo manualmente
issues.del_time=Eliminar este registo de tempo
issues.add_time_short=Adicionar tempo
issues.add_time_cancel=Cancelar
issues.add_time_history=`adicionou tempo gasto nesta questão %s`
issues.add_time_history=adicionou <b>%s</b> de tempo gasto %s
issues.del_time_history=`eliminou o tempo gasto nesta questão %s`
issues.add_time_manually=Adicionar tempo manualmente
issues.add_time_hours=Horas
issues.add_time_minutes=Minutos
issues.add_time_sum_to_small=Não foi inserido qualquer tempo.
issues.time_spent_total=Total de tempo gasto
issues.time_spent_from_all_authors=`Total de tempo gasto: %s`
issues.due_date=Data de vencimento
issues.invalid_due_date_format=O formato da data de vencimento tem que ser 'aaaa-mm-dd'.
issues.error_modifying_due_date=Falhou a modificação da data de vencimento.
@ -1779,7 +1796,7 @@ issues.reference_link=Referência: %s
compare.compare_base=base
compare.compare_head=comparar
pulls.desc=Habilitar pedidos de integração e revisão de código.
pulls.desc=Habilitar pedidos de integração e revisão de código-fonte.
pulls.new=Novo pedido de integração
pulls.new.blocked_user=Não pode criar o pedido de integração porque foi bloqueado/a pelo/a proprietário/a do repositório.
pulls.new.must_collaborator=Tem de ser um/a colaborador/a para criar um pedido de integração.
@ -1869,7 +1886,7 @@ pulls.rebase_merge_pull_request=Mudar a base e avançar rapidamente
pulls.rebase_merge_commit_pull_request=Mudar a base e criar um cometimento de integração
pulls.squash_merge_pull_request=Criar cometimento de compactação
pulls.fast_forward_only_merge_pull_request=Avançar rapidamente apenas
pulls.merge_manually=Integrado manualmente
pulls.merge_manually=Integrar manualmente
pulls.merge_commit_id=O ID de cometimento da integração
pulls.require_signed_wont_sign=O ramo requer que os cometimentos sejam assinados mas esta integração não vai ser assinada
@ -1928,6 +1945,10 @@ pulls.delete.title=Eliminar este pedido de integração?
pulls.delete.text=Tem a certeza que quer eliminar este pedido de integração? Isso irá remover todo o conteúdo permanentemente. Como alternativa considere fechá-lo, se pretender mantê-lo em arquivo.
pulls.recently_pushed_new_branches=Enviou para o ramo <strong>%[1]s</strong> %[2]s
pulls.upstream_diverging_prompt_behind_1=Este ramo está %d cometimento atrás de %s
pulls.upstream_diverging_prompt_behind_n=Este ramo está %d cometimentos atrás de %s
pulls.upstream_diverging_prompt_base_newer=O ramo base %s tem novas modificações
pulls.upstream_diverging_merge=Sincronizar derivação
pull.deleted_branch=(eliminado):%s
pull.agit_documentation=Rever a documentação sobre o AGit
@ -2131,7 +2152,7 @@ settings.branches.update_default_branch=Definir o ramo principal
settings.branches.add_new_rule=Adicionar nova regra
settings.advanced_settings=Configurações avançadas
settings.wiki_desc=Habilitar wiki do repositório
settings.use_internal_wiki=Usar o wiki nativo
settings.use_internal_wiki=Usar o wiki integrado
settings.default_wiki_branch_name=Nome do ramo predefinido do wiki
settings.default_wiki_everyone_access=Permissão de acesso predefinida para utilizadores registados:
settings.failed_to_change_default_wiki_branch=Falhou ao mudar o nome do ramo predefinido do wiki.
@ -2140,7 +2161,7 @@ settings.external_wiki_url=URL do wiki externo
settings.external_wiki_url_error=O URL do wiki externo não é um URL válido.
settings.external_wiki_url_desc=Os visitantes são encaminhados para o URL do wiki externo ao clicar no separador do wiki.
settings.issues_desc=Habilitar o seguidor de questões do repositório
settings.use_internal_issue_tracker=Usar o seguidor de questões nativo
settings.use_internal_issue_tracker=Usar o seguidor de questões integrado
settings.use_external_issue_tracker=Usar um seguidor de questões externo
settings.external_tracker_url=URL do gestor de questões externo
settings.external_tracker_url_error=O URL do gestor de questões externo não é um URL válido.
@ -2230,7 +2251,7 @@ settings.wiki_deletion_success=Os dados do repositório do wiki foram eliminados
settings.delete=Eliminar este repositório
settings.delete_desc=Eliminar um repositório é permanente e não pode ser revertido.
settings.delete_notices_1=- Esta operação <strong>NÃO PODERÁ</strong> ser revertida.
settings.delete_notices_2=- Esta operação eliminará permanentemente o repositório <strong>%s</strong> incluindo código, questões, comentários, dados do wiki e configurações dos colaboradores.
settings.delete_notices_2=- Esta operação eliminará permanentemente o repositório <strong>%s</strong> incluindo código-fonte, questões, comentários, dados do wiki e configurações dos colaboradores.
settings.delete_notices_fork_1=- Derivações deste repositório tornar-se-ão independentes, após a eliminação.
settings.deletion_success=O repositório foi eliminado.
settings.update_settings_success=As configurações do repositório foram modificadas.
@ -2460,6 +2481,8 @@ settings.block_on_official_review_requests=Bloquear integração nos pedidos de
settings.block_on_official_review_requests_desc=A integração não será possível quando tiver pedidos de revisão oficiais, mesmo que haja aprovações suficientes.
settings.block_outdated_branch=Bloquear integração se o pedido de integração for obsoleto
settings.block_outdated_branch_desc=A integração não será possível quando o ramo de topo estiver abaixo do ramo base.
settings.block_admin_merge_override=Os administradores têm de cumprir as regras de salvaguarda dos ramos
settings.block_admin_merge_override_desc=Os administradores têm de cumprir as regras de salvaguarda e não as podem contornar.
settings.default_branch_desc=Escolha um ramo do repositório como sendo o predefinido para pedidos de integração e cometimentos:
settings.merge_style_desc=Estilos de integração
settings.default_merge_style_desc=Tipo de integração predefinido
@ -2579,7 +2602,6 @@ diff.generated=gerado
diff.vendored=externo
diff.comment.add_line_comment=Adicionar comentário de linha
diff.comment.placeholder=Deixar um comentário
diff.comment.markdown_info=A formatação com markdown é suportada.
diff.comment.add_single_comment=Adicionar um único comentário
diff.comment.add_review_comment=Adicionar comentário
diff.comment.start_review=Iniciar revisão
@ -2721,7 +2743,7 @@ create_org=Criar organização
repo_updated=Modificado
members=Membros
teams=Equipas
code=Código
code=Código-fonte
lower_members=membros
lower_repositories=repositórios
create_new_team=Nova equipa
@ -3514,6 +3536,11 @@ alpine.repository=Informação do repositório
alpine.repository.branches=Ramos
alpine.repository.repositories=Repositórios
alpine.repository.architectures=Arquitecturas
arch.registry=Adicionar servidor com repositório e arquitectura relacionados a <code>/etc/pacman.conf</code>:
arch.install=Sincronizar pacote com pacman:
arch.repository=Informação do repositório
arch.repository.repositories=Repositórios
arch.repository.architectures=Arquitecturas
cargo.registry=Configurar este registo no ficheiro de configuração do Cargo (por exemplo: <code>~/.cargo/config.toml</code>):
cargo.install=Para instalar o pacote usando o Cargo, execute o seguinte comando:
chef.registry=Configure este registo no seu ficheiro <code>~/.chef/config.rb</code>:

View File

@ -170,6 +170,7 @@ buttons.link.tooltip=Добавить ссылку
buttons.list.unordered.tooltip=Добавить маркированный список
buttons.list.ordered.tooltip=Добавить нумерованный список
buttons.list.task.tooltip=Добавить список заданий
buttons.table.add.insert=Добавить
buttons.mention.tooltip=Упомянуть пользователя или команду
buttons.ref.tooltip=Сослаться на задачу или запрос на слияние
buttons.switch_to_legacy.tooltip=Использовать старый редактор
@ -924,7 +925,6 @@ generate_repo=Создать репозиторий
generate_from=Создать из
repo_desc=Описание
repo_desc_helper=Добавьте краткое описание (необязательно)
repo_lang=Язык
repo_gitignore_helper=Выберите шаблон .gitignore.
repo_gitignore_helper_desc=Выберите из списка шаблонов для популярных языков , какие файлы не надо отслеживать. По умолчанию в .gitignore включены типичные артефакты, создаваемые инструментами сборки каждого языка.
issue_labels=Метки задач
@ -1301,12 +1301,9 @@ issues.new.no_items=Нет элементов
issues.new.milestone=Этап
issues.new.no_milestone=Нет этапа
issues.new.clear_milestone=Очистить этап
issues.new.open_milestone=Открыть этап
issues.new.closed_milestone=Завершенные этапы
issues.new.assignees=Назначенные
issues.new.clear_assignees=Убрать ответственных
issues.new.no_assignees=Нет назначенных лиц
issues.new.no_reviewers=Нет рецензентов
issues.choose.get_started=Начать
issues.choose.open_external_link=Открыть
issues.choose.blank=По умолчанию
@ -1502,27 +1499,20 @@ issues.comment_on_locked=Вы не можете оставить коммент
issues.delete=Удалить
issues.delete.title=Удалить эту задачу?
issues.delete.text=Вы действительно хотите удалить эту задачу? Это навсегда удалит всё содержимое. Возможно лучше закрыть её в архивных целях.
issues.tracker=Отслеживание времени
issues.start_tracking_short=Запустить таймер
issues.start_tracking=Начать отслеживание времени
issues.start_tracking_history=`начал(а) работать %s`
issues.tracker_auto_close=Таймер будет остановлен автоматически, когда эта проблема будет закрыта
issues.tracking_already_started=`Вы уже начали отслеживать время для <a href="%s">другой задачи</a>!`
issues.stop_tracking=Остановить таймер
issues.stop_tracking_history=`перестал(а) работать %s`
issues.cancel_tracking=Отмена
issues.cancel_tracking_history=`отменил(а) отслеживание времени %s`
issues.add_time=Вручную добавить время
issues.del_time=Удалить этот журнал времени
issues.add_time_short=Добавить время
issues.add_time_cancel=Отмена
issues.add_time_history=`добавил(а) к затраченному времени %s`
issues.del_time_history=`удалил(а) потраченное время %s`
issues.add_time_hours=Часы
issues.add_time_minutes=Минуты
issues.add_time_sum_to_small=Время не было введено.
issues.time_spent_total=Общее затраченное время
issues.time_spent_from_all_authors=`Общее затраченное время: %s`
issues.due_date=Срок выполнения
issues.invalid_due_date_format=Дата окончания должна быть в формате 'гггг-мм-дд'.
issues.error_modifying_due_date=Не удалось изменить срок выполнения.
@ -2307,7 +2297,6 @@ diff.load=Загрузить разницу
diff.generated=сгенерированный
diff.vendored=поставляемый
diff.comment.placeholder=Оставить комментарий
diff.comment.markdown_info=Поддерживается синтаксис Markdown.
diff.comment.add_single_comment=Добавить простой комментарий
diff.comment.add_review_comment=Добавить комментарий
diff.comment.start_review=Начать рецензию
@ -3171,6 +3160,9 @@ alpine.install=Чтобы установить пакет, выполните с
alpine.repository=О репозитории
alpine.repository.repositories=Репозитории
alpine.repository.architectures=Архитектуры
arch.repository=О репозитории
arch.repository.repositories=Репозитории
arch.repository.architectures=Архитектуры
cargo.registry=Настройте этот реестр в файле конфигурации Cargo (например, <code>~/.cargo/config.toml</code>):
cargo.install=Чтобы установить пакет с помощью Cargo, выполните следующую команду:
chef.registry=Настройте этот реестр в своём файле <code>~/.chef/config.rb</code>:

View File

@ -114,6 +114,7 @@ filter.private=පෞද්ගලික
[heatmap]
[editor]
buttons.table.add.insert=එකතු
[filter]
@ -713,7 +714,6 @@ generate_repo=ගබඩාව ජනනය කරන්න
generate_from=සිට උත්පාදනය
repo_desc=සවිස්තරය
repo_desc_helper=කෙටි විස්තරයක් ඇතුලත් කරන්න (විකල්ප)
repo_lang=භාෂාව
repo_gitignore_helper=.gitignore සැකිලි තෝරන්න.
repo_gitignore_helper_desc=පොදු භාෂා සඳහා සැකිලි ලැයිස්තුවෙන් සොයා නොගත යුතු ගොනු තෝරන්න. එක් එක් භාෂාව ගොඩ නැගීමේ මෙවලම් මගින් ජනනය කරන ලද සාමාන්ය කෞතුක වස්තු පෙරනිමියෙන් .gitignore මත ඇතුළත් වේ.
issue_labels=නිකුත් ලේබල
@ -986,12 +986,9 @@ issues.new.closed_projects=සංවෘත ව්‍යාපෘති
issues.new.milestone=සන්ධිස්ථානය
issues.new.no_milestone=සන්ධිස්ථානයක් නැත
issues.new.clear_milestone=පැහැදිලි සන්ධිස්ථානයක්
issues.new.open_milestone=විවෘත සන්ධිස්ථාන
issues.new.closed_milestone=සංවෘත සන්ධිස්ථාන
issues.new.assignees=සහස්ර
issues.new.clear_assignees=පැහැදිලි ඇග්නස්
issues.new.no_assignees=කිසිදු සහස්ර
issues.new.no_reviewers=විචාරකයින් නැත
issues.choose.get_started=ආරම්භ කරන්න
issues.choose.open_external_link=විවෘත
issues.choose.blank=පෙරනිමි
@ -1133,26 +1130,19 @@ issues.lock.title=මෙම ගැටළුව පිළිබඳ ලොක්
issues.unlock.title=මෙම ගැටළුව පිළිබඳ සංවාදය අගුළු ඇරීමට.
issues.comment_on_locked=අගුලු දමා ඇති ගැටළුවක් පිළිබඳව ඔබට අදහස් දැක්විය නොහැක.
issues.delete=මකන්න
issues.tracker=වේලාව ට්රැකර්
issues.start_tracking_short=ටයිමරයට ගැලපෙන ලෙස
issues.start_tracking=ආරම්භ වේලාව ට්රැකින්
issues.start_tracking_history=`වැඩ ආරම්භ %s`
issues.tracker_auto_close=මෙම ගැටළුව වසා දැමූ විට ටයිමරයට ස්වයංක්රීයව නතර වේ
issues.tracking_already_started=`ඔබ දැනටමත් <a href="%s">හි තවත් නිකුතුවක්</a>හි කාලය සොයා ගැනීම ආරම්භ කර ඇත! `
issues.stop_tracking=ටයිමරයට නවත්වන්න
issues.stop_tracking_history=`නතර වැඩ %s`
issues.cancel_tracking=ඉවතලන්න
issues.add_time=අතින් වේලාව එකතු කරන්න
issues.del_time=මෙම කාල ලොග් මකන්න
issues.add_time_short=කාලය එකතු කරන්න
issues.add_time_cancel=අවලංගු කරන්න
issues.add_time_history=`එකතු කළ කාලය %s`
issues.del_time_history=`මකාදැමුවා කාලය ගත %s`
issues.add_time_hours=පැය
issues.add_time_minutes=විනාඩි
issues.add_time_sum_to_small=කාලයක් ඇතුළු නොවීය.
issues.time_spent_total=වැය කළ මුළු කාලය
issues.time_spent_from_all_authors=වැය කළ මුළු කාලය: %s
issues.due_date=නියමිත දිනය
issues.invalid_due_date_format=නියමිත දින ආකෘතිය 'yyy-mm-dd' විය යුතුය.
issues.error_modifying_due_date=නියමිත දිනය වෙනස් කිරීමට අපොහොසත් විය.
@ -1776,7 +1766,6 @@ diff.load=බර අඩු
diff.generated=ජනනය
diff.vendored=අලෙවි
diff.comment.placeholder=අදහසක් හැරයන්න
diff.comment.markdown_info=Markdown සමග මෝස්තර සහාය වේ.
diff.comment.add_single_comment=තනි අදහස් එක් කරන්න
diff.comment.add_review_comment=අදහස එකතු කරන්න
diff.comment.start_review=සමාලෝචනය ආරම්භ කරන්න
@ -2458,6 +2447,7 @@ no_read=කියවූ දැනුම්දීම් නැත.
filter.type=වර්ගය
alpine.repository.branches=ශාඛා
alpine.repository.repositories=කෝෂ්ඨ
arch.repository.repositories=කෝෂ්ඨ
conan.details.repository=කෝෂ්ඨය
owner.settings.cleanuprules.enabled=සබල කර ඇත

View File

@ -169,6 +169,7 @@ buttons.link.tooltip=Pridať odkaz
buttons.list.unordered.tooltip=Pridať zoznam
buttons.list.ordered.tooltip=Pridať číslovaný zoznam
buttons.list.task.tooltip=Pridať zoznam úloh
buttons.table.add.insert=Pridať
buttons.mention.tooltip=Spomenúť používateľa alebo tím
buttons.ref.tooltip=Odkázať na problém alebo žiadosť o natiahnutie
buttons.switch_to_legacy.tooltip=Použiť starší editor namiest toho
@ -832,7 +833,6 @@ generate_repo=Generovať repozitár
generate_from=Generovať z
repo_desc=Popis
repo_desc_helper=Zadajte krátky popis (voliteľné)
repo_lang=Jazyk
repo_gitignore_helper=Vyberte .gitignore šablóny.
repo_gitignore_helper_desc=Zo zoznamu šablón pre bežné jazyky vyberte, ktoré súbory sa nemajú sledovať. Typické artefakty generované nástrojmi na vytváranie jednotlivých jazykov sú štandardne zahrnuté v .gitignore.
license=Licencia
@ -1049,7 +1049,6 @@ issues.filter_reviewers=Filtrovať revidentov
issues.new.labels=Štítky
issues.new.projects=Projekty
issues.new.milestone=Míľnik
issues.new.no_reviewers=Žiadni revidenti
issues.choose.open_external_link=Otvoriť
issues.create=Vytvoriť úkol
issues.filter_label=Štítok
@ -1070,8 +1069,9 @@ issues.dismiss_review=Zamietnuť revíziu
issues.dismiss_review_warning=Naozaj chcete zrušiť túto revíziu?
issues.cancel=Zrušiť
issues.save=Uložiť
issues.cancel_tracking=Zahodiť
issues.add_time_cancel=Zrušiť
issues.dependency.cancel=Zrušiť
issues.review.dismissed=zamietol revíziu od %s %s
issues.review.wait=bol požiadaný o revidovanie %s
@ -1311,6 +1311,7 @@ error.not_signed_commit=Nie je podpísaný commit
[packages]
alpine.repository.repositories=Repozitáre
arch.repository.repositories=Repozitáre
conan.details.repository=Repozitár
container.labels=Štítky
owner.settings.cleanuprules.enabled=Povolené

View File

@ -104,6 +104,7 @@ filter.private=Privat
[heatmap]
[editor]
buttons.table.add.insert=Lägg till
[filter]
@ -615,7 +616,6 @@ use_template=Välj den här mallen
generate_repo=Skapa utvecklingskatalog
generate_from=Generera från
repo_desc=Beskrivning
repo_lang=Språk
repo_gitignore_helper=Välj .gitignore-mallar.
repo_gitignore_helper_desc=Välj vilka filer som inte ska spåras från en lista med mallar för vanliga språk. Typiska artefakter som genereras av varje språk byggverktyg ingår i .gitignore som standard.
issue_labels=Ärendeetiketter
@ -837,12 +837,9 @@ issues.new.no_items=Inga objekt
issues.new.milestone=Milsten
issues.new.no_milestone=Ingen Milsten
issues.new.clear_milestone=Rensa milstenar
issues.new.open_milestone=Öppna Milstenar
issues.new.closed_milestone=Stängda Milstenar
issues.new.assignees=Tilldelade
issues.new.clear_assignees=Rensa tilldelade
issues.new.no_assignees=Ingen tilldelad
issues.new.no_reviewers=Inga granskare
issues.choose.get_started=Kom igång
issues.choose.open_external_link=Öppna
issues.choose.blank=Standard
@ -980,22 +977,18 @@ issues.comment_on_locked=Du kan inte kommentera ett låst ärende.
issues.delete=Radera
issues.delete.title=Radera detta ärende?
issues.delete.text=Vill du verkligen ta bort detta ärende? (Detta kommer att permanent ta bort allt innehåll. Överväg att stänga det istället om du avser att hålla det arkiverat)
issues.tracker=Tidsredovisning
issues.start_tracking=Starta tidsredovisning
issues.start_tracking_history=`började arbeta %s`
issues.tracker_auto_close=Timern stoppas automatiskt när ärendet stängs
issues.tracking_already_started=`Du har redan påbörjat tidredovisning på <a href="%s">ett annat ärende</a>!`
issues.stop_tracking_history=`slutade arbeta %s`
issues.add_time=Lägg till tid manuellt
issues.add_time_short=Lägg till tid
issues.add_time_cancel=Avbryt
issues.add_time_history=`la till tillbringad tid %s`
issues.del_time_history=`raderade tillbringad tid %s`
issues.add_time_hours=Timmar
issues.add_time_minutes=Minuter
issues.add_time_sum_to_small=Inge tid har angivits.
issues.time_spent_total=Total Tid Spenderad
issues.time_spent_from_all_authors=`Total Tid Spenderad: %s`
issues.due_date=Förfallodatum
issues.invalid_due_date_format=Datumsformatet för förfallodatum måste följa 'yyyy-MM-dd'.
issues.error_modifying_due_date=Det gick inte att ändra förfallodatumet.
@ -1443,7 +1436,6 @@ diff.file_image_height=Höjd
diff.file_byte_size=Storlek
diff.file_suppressed=Filskillnaden har hållits tillbaka eftersom den är för stor
diff.comment.placeholder=Lämna en kommentar
diff.comment.markdown_info=Styling med markdown stöds.
diff.comment.add_single_comment=Lägg till en kommentar
diff.comment.add_review_comment=Lägg till kommentar
diff.comment.start_review=Starta granskning
@ -1990,6 +1982,7 @@ error.unit_not_allowed=Du har inte åtkomst till denna del av utvecklingskatalog
filter.type=Typ
alpine.repository.branches=Brancher
alpine.repository.repositories=Utvecklingskataloger
arch.repository.repositories=Utvecklingskataloger
conan.details.repository=Utvecklingskatalog
owner.settings.cleanuprules.enabled=Aktiv

View File

@ -206,6 +206,7 @@ buttons.link.tooltip=Bağlantı ekle
buttons.list.unordered.tooltip=Maddeli liste ekle
buttons.list.ordered.tooltip=Numaralandırılmış liste ekle
buttons.list.task.tooltip=Görev listesi ekle
buttons.table.add.insert=Ekle
buttons.mention.tooltip=Bir kişiye veya takıma değin
buttons.ref.tooltip=Bir konuya veya değişiklik isteğine değin
buttons.switch_to_legacy.tooltip=Eski düzenleyiciyi kullan
@ -1012,7 +1013,6 @@ generate_repo=Depo Oluştur
generate_from=Şuradan Oluştur
repo_desc=ıklama
repo_desc_helper=Kısa açıklama girin (isteğe bağlı)
repo_lang=Dil
repo_gitignore_helper=.gitignore şablonlarını seç.
repo_gitignore_helper_desc=Sık kullanılan diller için bir şablon listesinden hangi dosyaların izlenmeyeceğini seçin. Her dilin oluşturma araçları tarafından oluşturulan tipik yapılar, varsayılan olarak .gitignore dosyasına dahil edilmiştir.
issue_labels=Konu Etiketleri
@ -1419,12 +1419,9 @@ issues.new.no_items=Öge yok
issues.new.milestone=Kilometre Taşı
issues.new.no_milestone=Kilometre Taşı Yok
issues.new.clear_milestone=Kilometre Taşlarını Temizle
issues.new.open_milestone=Kilometre Taşlarını
issues.new.closed_milestone=Kapanmış Kilometre Taşları
issues.new.assignees=Atananlar
issues.new.clear_assignees=Atamaları Temizle
issues.new.no_assignees=Atanan Kişi Yok
issues.new.no_reviewers=Gözden geçiren yok
issues.new.blocked_user=Konu oluşturulamıyor, depo sahibi tarafından engellenmişsiniz.
issues.edit.already_changed=Konuya yapılan değişiklikler kaydedilemiyor. İçerik başka kullanıcı tarafından değiştirilmiş gözüküyor. Diğerlerinin değişikliklerinin üzerine yazmamak için lütfen sayfayı yenileyin ve tekrar düzenlemeye çalışın
issues.edit.blocked_user=İçerik düzenlenemiyor, gönderen veya depo sahibi tarafından engellenmişsiniz.
@ -1627,27 +1624,20 @@ issues.comment_on_locked=Kilitli bir konuya yorum yapamazsınız.
issues.delete=Sil
issues.delete.title=Bu konu silinsin mi?
issues.delete.text=Bu konuyu gerçekten silmek istiyor musunuz? (Bu işlem tüm içeriği kalıcı olarak silecektir. Arşivde tutma niyetiniz varsa silmek yerine kapatmayı düşünün)
issues.tracker=Zaman Takibi
issues.start_tracking_short=Zamanlayıcıyı Başlat
issues.start_tracking=Zaman İzlemeyi Başlat
issues.start_tracking_history=`%s çalışma başlattı`
issues.tracker_auto_close=Bu konu kapatıldığında zamanlayıcı otomatik olarak durur
issues.tracking_already_started=`<a href="%s">başka bir konuda</a> zaten zaman izleyici başlattınız!`
issues.stop_tracking=Zamanlayıcıyı Bitir
issues.stop_tracking_history=`%s çalışmayı durdurdu`
issues.cancel_tracking=Yoksay
issues.cancel_tracking_history=`%s zaman takibini iptal etti`
issues.add_time=El ile Zaman Ekle
issues.del_time=Bu zaman kaydını sil
issues.add_time_short=Zaman Ekle
issues.add_time_cancel=İptal
issues.add_time_history=`%s harcanan zaman eklendi`
issues.del_time_history=`%s harcanan zaman silindi`
issues.add_time_hours=Saat
issues.add_time_minutes=Dakika
issues.add_time_sum_to_small=Zaman girilmedi.
issues.time_spent_total=Toplam Harcanan Zaman
issues.time_spent_from_all_authors=`Toplam Harcanan Zaman: %s`
issues.due_date=Bitiş Tarihi
issues.invalid_due_date_format=Bitiş tarihinin biçimi 'yyyy-aa-gg' olmalıdır.
issues.error_modifying_due_date=Bitiş tarihi değiştirilemedi.
@ -2503,7 +2493,6 @@ diff.generated=üretilen
diff.vendored=sağlanmış
diff.comment.add_line_comment=Satır yorum ekle
diff.comment.placeholder=Yorum Yap
diff.comment.markdown_info=Markdown ile şekillendirme desteklenir.
diff.comment.add_single_comment=Bir yorum ekle
diff.comment.add_review_comment=Yorum ekle
diff.comment.start_review=İncelemeye başla
@ -3418,6 +3407,9 @@ alpine.repository=Depo Bilgisi
alpine.repository.branches=Dallar
alpine.repository.repositories=Depolar
alpine.repository.architectures=Mimariler
arch.repository=Depo Bilgisi
arch.repository.repositories=Depolar
arch.repository.architectures=Mimariler
cargo.registry=Bu kütüğü Cargo yapılandırma dosyasına (örneğin <code>~/.cargo/config.toml</code>) ayarlayın:
cargo.install=Paketi Cargo kullanarak kurmak için, şu komutu çalıştırın:
chef.registry=Bu kütüğü <code>~/.chef/config.rb</code> dosyasında ayarlayın:

View File

@ -115,6 +115,7 @@ filter.private=Приватний
[heatmap]
[editor]
buttons.table.add.insert=Додати
[filter]
@ -732,7 +733,6 @@ generate_repo=Згенерувати репозиторій
generate_from=Генерувати з
repo_desc=Опис
repo_desc_helper=Введіть короткий опис (опціонально)
repo_lang=Мова
repo_gitignore_helper=Виберіть шаблон .gitignore.
repo_gitignore_helper_desc=Оберіть з списку мовних шаблонів файли, які не будуть відстежуватись. Типові артефакти, які генеруються за допомогою інструментів побудови кожної мови, за замовчуванням включені до .gitignor.
issue_labels=Мітки задачі
@ -1022,12 +1022,9 @@ issues.new.no_items=Немає елементів
issues.new.milestone=Етап
issues.new.no_milestone=Етап відсутній
issues.new.clear_milestone=Очистити етап
issues.new.open_milestone=Активні етапи
issues.new.closed_milestone=Закриті етапи
issues.new.assignees=Виконавці
issues.new.clear_assignees=Прибрати виконавців
issues.new.no_assignees=Немає виконавця
issues.new.no_reviewers=Немає рецензентів
issues.choose.get_started=Початок роботи
issues.choose.open_external_link=Відкрити
issues.choose.blank=Типово
@ -1178,26 +1175,19 @@ issues.lock.title=Заблокувати обговорення цієї зад
issues.unlock.title=Розблокувати обговорення цієї задачі.
issues.comment_on_locked=Ви не можете коментувати заблоковану задачу.
issues.delete=Видалити
issues.tracker=Відстеження часу
issues.start_tracking_short=Запустити таймер
issues.start_tracking=Почати відстеження часу
issues.start_tracking_history=`почав працювати %s`
issues.tracker_auto_close=Таймер буде автоматично зупинено, коли ця задача буде закрита
issues.tracking_already_started=`Ви вже почали відстежувати час для <a href="%s">іншої задачі</a>!`
issues.stop_tracking=Зупинити таймер
issues.stop_tracking_history=`перестав(-ла) працювати %s`
issues.cancel_tracking=Скасувати
issues.add_time=Вручну додати час
issues.del_time=Видалити цей журнал часу
issues.add_time_short=Додати час
issues.add_time_cancel=Відмінити
issues.add_time_history=`додав(-ла) витрачений час %s`
issues.del_time_history=`видалив витрачений час %s`
issues.add_time_hours=Години
issues.add_time_minutes=Хвилини
issues.add_time_sum_to_small=Час не введено.
issues.time_spent_total=Загальний витрачений час
issues.time_spent_from_all_authors=`Загальний витрачений час: %s`
issues.due_date=Дата завершення
issues.invalid_due_date_format=Дата закінчення має бути в форматі 'ррр-мм-дд'.
issues.error_modifying_due_date=Не вдалося змінити дату завершення.
@ -1824,7 +1814,6 @@ diff.load=Завантажити різницю
diff.generated=згенерований
diff.vendored=сторонній
diff.comment.placeholder=Залишити коментар
diff.comment.markdown_info=Стилізація з markdown підтримується.
diff.comment.add_single_comment=Додати простий коментар
diff.comment.add_review_comment=Додати коментар
diff.comment.start_review=Розпочати рецензію
@ -2526,6 +2515,7 @@ error.unit_not_allowed=У вас немає доступу до жодного
filter.type=Тип
alpine.repository.branches=Гілки
alpine.repository.repositories=Репозиторії
arch.repository.repositories=Репозиторії
conan.details.repository=Репозиторій
owner.settings.cleanuprules.enabled=Увімкнено

View File

@ -158,6 +158,7 @@ filter.public=公开
filter.private=私有库
no_results_found=未找到结果
internal_error_skipped=发生内部错误,但已被跳过: %s
[search]
search=搜索...
@ -176,6 +177,7 @@ code_search_by_git_grep=当前代码搜索结果由“git grep”提供。如果
package_kind=搜索软件包...
project_kind=搜索项目...
branch_kind=搜索分支...
tag_kind=搜索标签...
commit_kind=搜索提交记录...
runner_kind=搜索runners...
no_results=未找到匹配结果
@ -205,6 +207,10 @@ buttons.link.tooltip=添加链接
buttons.list.unordered.tooltip=添加待办清单
buttons.list.ordered.tooltip=添加编号列表
buttons.list.task.tooltip=添加任务列表
buttons.table.add.tooltip=添加表格
buttons.table.add.insert=添加
buttons.table.rows=行数
buttons.table.cols=列数
buttons.mention.tooltip=提及用户或团队
buttons.ref.tooltip=引用一个问题或合并请求
buttons.switch_to_legacy.tooltip=使用旧版编辑器
@ -380,6 +386,7 @@ relevant_repositories=只显示相关的仓库, <a href="%s">显示未过滤
[auth]
create_new_account=注册帐号
sign_in_now=立即登录
disable_register_prompt=对不起,注册功能已被关闭。请联系网站管理员。
disable_register_mail=已禁用注册的电子邮件确认。
manual_activation_only=请联系您的站点管理员来完成激活。
@ -387,6 +394,7 @@ remember_me=记住此设备
remember_me.compromised=登录令牌不再有效,因为它可能表明帐户已被破坏。请检查您的帐户是否有异常活动。
forgot_password_title=忘记密码
forgot_password=忘记密码?
sign_up_now=还没账号?马上注册。
sign_up_successful=帐户创建成功。欢迎!
confirmation_mail_sent_prompt_ex=一封新的确认邮件已经发送到 <b>%s</b>请在下一个 %s 中检查您的收件箱以完成注册过程。 如果您的注册电子邮件地址不正确,您可以重新登录并更改它。
must_change_password=更新您的密码
@ -447,6 +455,7 @@ authorization_failed_desc=因为检测到无效请求,授权失败。请尝试
sspi_auth_failed=SSPI 认证失败
password_pwned_err=无法完成对 HaveIBeenPwned 的请求
last_admin=您不能删除最后一个管理员。必须至少保留一个管理员。
back_to_sign_in=返回登录页面
[mail]
view_it_on=在 %s 上查看
@ -463,6 +472,7 @@ activate_email=请验证您的邮箱地址
activate_email.title=%s请验证您的邮箱
activate_email.text=请在 <b>%s</b> 时间内,点击以下链接,以验证你的电子邮件地址:
register_notify=欢迎来到 %s
register_notify.title=%[1]s欢迎来到 %[2]s
register_notify.text_1=这是您的 %s 注册确认电子邮件
register_notify.text_2=您现在可以以用户名 %s 登录。
@ -1003,7 +1013,6 @@ generate_repo=生成仓库
generate_from=生成自
repo_desc=仓库描述
repo_desc_helper=输入简要描述 (可选)
repo_lang=仓库语言
repo_gitignore_helper=选择 .gitignore 模板。
repo_gitignore_helper_desc=从常见语言的模板列表中选择忽略跟踪的文件。默认情况下,由开发或构建工具生成的特殊文件都包含在 .gitignore 中。
issue_labels=工单标签
@ -1011,6 +1020,7 @@ issue_labels_helper=选择一个工单标签集
license=授权许可
license_helper=选择授权许可文件。
license_helper_desc=许可证说明了其他人可以和不可以用您的代码做什么。不确定哪一个适合你的项目?见 <a target="_blank" rel="noopener noreferrer" href="%s">选择一个许可证</a>
multiple_licenses=多许可证
object_format=对象格式
object_format_helper=仓库的对象格式。之后无法更改。SHA1 是最兼容的。
readme=自述
@ -1071,7 +1081,9 @@ tree_path_not_found_branch=路径 %[1]s 不存在于分支 %[2]s 中。
tree_path_not_found_tag=路径 %[1]s 不存在于标签 %[2]s 中
transfer.accept=接受转移
transfer.accept_desc=`转移到 "%s"`
transfer.reject=拒绝转移
transfer.reject_desc=`取消转移到 "%s"`
transfer.no_permission_to_accept=您没有权限接受此转让。
transfer.no_permission_to_reject=您没有权限拒绝此转让。
@ -1146,6 +1158,11 @@ migrate.gogs.description=从 notabug.org 或其他 Gogs 实例迁移数据。
migrate.onedev.description=从 code.onedev.io 或其他 OneDev 实例迁移数据
migrate.codebase.description=从 codebasehq.com 迁移数据
migrate.gitbucket.description=从 GitBucket 实例迁移数据
migrate.codecommit.description=从 AWS CodeCommit 迁移数据。
migrate.codecommit.aws_access_key_id=AWS 访问密钥ID
migrate.codecommit.aws_secret_access_key=AWS 秘密访问密钥
migrate.codecommit.https_git_credentials_username=HTTPS Git 凭据用户名
migrate.codecommit.https_git_credentials_password=HTTPS Git 凭据密码
migrate.migrating_git=迁移Git数据
migrate.migrating_topics=迁移主题
migrate.migrating_milestones=迁移里程碑
@ -1213,6 +1230,7 @@ file_view_rendered=渲染模式
file_view_raw=查看原始文件
file_permalink=永久链接
file_too_large=文件过大,无法显示。
file_is_empty=此文件是空的。
code_preview_line_from_to=在 %[3]s 的第 %[1]d 行到 %[2]d 行
code_preview_line_in=在 %[2]s 的第 %[1]d 行
invisible_runes_header=`此文件含有不可见的 Unicode 字符`
@ -1409,12 +1427,9 @@ issues.new.no_items=无可选项
issues.new.milestone=里程碑
issues.new.no_milestone=未选择里程碑
issues.new.clear_milestone=取消选中里程碑
issues.new.open_milestone=开启中的里程碑
issues.new.closed_milestone=已关闭的里程碑
issues.new.assignees=指派成员
issues.new.clear_assignees=取消指派成员
issues.new.no_assignees=未指派成员
issues.new.no_reviewers=无审核者
issues.new.blocked_user=无法创建工单,因为您已被仓库所有者屏蔽。
issues.edit.already_changed=无法保存对工单的更改。其内容似乎已被其他用户更改。 请刷新页面并重新编辑以避免覆盖他们的更改
issues.edit.blocked_user=无法编辑内容,因为您已被仓库所有者或工单创建者屏蔽。
@ -1615,27 +1630,20 @@ issues.comment_on_locked=您不能对锁定的问题发表评论。
issues.delete=删除
issues.delete.title=是否删除工单?
issues.delete.text=您真的要删除这个工单吗?(该操作将会永久删除所有内容。如果您需要保留,请关闭它)
issues.tracker=时间跟踪
issues.start_tracking_short=启动计时器
issues.start_tracking=开始时间跟踪
issues.start_tracking_history=`开始工作 %s`
issues.tracker_auto_close=当此工单关闭时,自动停止计时器
issues.tracking_already_started=`你已经开始对 <a href="%s">另一个工单</a> 进行时间跟踪!`
issues.stop_tracking=停止计时器
issues.stop_tracking_history=`停止工作 %s`
issues.cancel_tracking=放弃
issues.cancel_tracking_history=`取消时间跟踪 %s`
issues.add_time=手动添加时间
issues.del_time=删除此时间跟踪日志
issues.add_time_short=添加时间
issues.add_time_cancel=取消
issues.add_time_history=`添加耗时 %s`
issues.del_time_history=`已删除时间 %s`
issues.add_time_hours=小时
issues.add_time_minutes=分钟
issues.add_time_sum_to_small=没有输入时间。
issues.time_spent_total=总用时
issues.time_spent_from_all_authors=`总花费时间:%s`
issues.due_date=到期时间
issues.invalid_due_date_format=到期时间的格式必须是 'yyyy-mm-dd' 的形式。
issues.error_modifying_due_date=修改到期时间失败。
@ -1714,6 +1722,7 @@ issues.review.resolve_conversation=已解决问题
issues.review.un_resolve_conversation=未解决问题
issues.review.resolved_by=标记问题为已解决
issues.review.commented=评论
issues.review.unofficial=非官方审批数
issues.assignee.error=因为未知原因,并非所有的指派都成功。
issues.reference_issue.body=内容
issues.content_history.deleted=删除于
@ -1876,6 +1885,7 @@ pulls.delete.text=你真的要删除这个合并请求吗? (这将永久删除
pulls.recently_pushed_new_branches=您已经于%[2]s推送了分支 <strong>%[1]s</strong>
pull.deleted_branch=(已删除): %s
pull.agit_documentation=查看有关 AGit 的文档
comments.edit.already_changed=无法保存对评论的更改。其内容似乎已被其他用户更改。 请刷新页面并重新编辑以避免覆盖他们的更改
@ -1883,7 +1893,7 @@ milestones.new=新的里程碑
milestones.closed=于 %s关闭
milestones.update_ago=已更新 %s
milestones.no_due_date=暂无截止日期
milestones.open=开启
milestones.open=开启
milestones.close=关闭
milestones.new_subheader=里程碑可以帮助您组织工单并跟踪其进度。
milestones.create=创建里程碑
@ -1956,6 +1966,7 @@ wiki.original_git_entry_tooltip=查看原始的 Git 文件而不是使用友好
activity=动态
activity.navbar.pulse=活动
activity.navbar.code_frequency=代码频率
activity.navbar.contributors=贡献者
activity.navbar.recent_commits=最近的提交
activity.period.filter_label=周期:
activity.period.daily=1 天
@ -2245,6 +2256,7 @@ settings.event_wiki_desc=创建、重命名、编辑或删除了百科页面。
settings.event_release=版本发布
settings.event_release_desc=发布、更新或删除版本时。
settings.event_push=推送
settings.event_force_push=强制推送
settings.event_push_desc=Git 仓库推送
settings.event_repository=仓库
settings.event_repository_desc=创建或删除仓库
@ -2470,7 +2482,6 @@ diff.generated=自动生成的
diff.vendored=vendored
diff.comment.add_line_comment=添加行内评论
diff.comment.placeholder=留下评论
diff.comment.markdown_info=支持使用Markdown格式。
diff.comment.add_single_comment=添加单条评论
diff.comment.add_review_comment=添加评论
diff.comment.start_review=开始评审
@ -3143,6 +3154,7 @@ config.cache_adapter=Cache 适配器
config.cache_interval=Cache 周期
config.cache_conn=Cache 连接字符串
config.cache_item_ttl=缓存项目 TTL
config.cache_test=测试缓存
config.session_config=Session 配置
config.session_provider=Session 提供者
@ -3368,6 +3380,9 @@ alpine.repository=仓库信息
alpine.repository.branches=分支
alpine.repository.repositories=仓库管理
alpine.repository.architectures=架构
arch.repository=仓库信息
arch.repository.repositories=仓库管理
arch.repository.architectures=架构
cargo.registry=在 Cargo 配置文件中设置此注册中心(例如:<code>~/.cargo/config.toml</code>)
cargo.install=要使用 Cargo 安装软件包,请运行以下命令:
chef.registry=在您的 <code>~/.chef/config.rb</code> 文件中设置此注册中心:

View File

@ -308,7 +308,6 @@ visibility=可見度
fork_repo=複製儲存庫
fork_from=複製自
repo_desc=儲存庫描述
repo_lang=儲存庫語言
license=授權許可
create_repo=建立儲存庫
default_branch=默認分支
@ -399,8 +398,6 @@ issues.new.clear_labels=清除已選取標籤
issues.new.milestone=里程碑
issues.new.no_milestone=未選擇里程碑
issues.new.clear_milestone=清除已選取里程碑
issues.new.open_milestone=開啟中的里程碑
issues.new.closed_milestone=已關閉的里程碑
issues.create=建立問題
issues.new_label=建立標籤
issues.new_label_desc_placeholder=組織描述
@ -471,7 +468,9 @@ issues.attachment.open_tab=`在新的標籤頁中查看 '%s'`
issues.attachment.download=`點擊下載 '%s'`
issues.subscribe=訂閱
issues.unsubscribe=取消訂閱
issues.add_time_cancel=取消
issues.due_date_form_edit=編輯
issues.due_date_form_remove=移除成員
issues.dependency.cancel=取消
@ -956,6 +955,7 @@ error.not_signed_commit=未簽名的提交
[packages]
filter.type=認證類型
alpine.repository.repositories=儲存庫管理
arch.repository.repositories=儲存庫管理
conan.details.repository=儲存庫
owner.settings.cleanuprules.enabled=已啟用

View File

@ -156,6 +156,7 @@ buttons.link.tooltip=新增連結
buttons.list.unordered.tooltip=新增項目符號清單
buttons.list.ordered.tooltip=新增編號清單
buttons.list.task.tooltip=新增工作項目清單
buttons.table.add.insert=增加
buttons.mention.tooltip=提及使用者或團隊
buttons.ref.tooltip=參考問題或合併請求
buttons.enable_monospace_font=啟用等寬字型
@ -853,7 +854,6 @@ generate_repo=產生儲存庫
generate_from=產生自
repo_desc=描述
repo_desc_helper=輸入簡介 (選用)
repo_lang=儲存庫語言
repo_gitignore_helper=選擇 .gitignore 範本
repo_gitignore_helper_desc=從常見語言範本清單中挑選忽略追蹤的檔案。預設情況下各種語言建置工具產生的特殊檔案都包含在 .gitignore 中。
issue_labels=問題標籤
@ -1211,12 +1211,9 @@ issues.new.no_items=沒有項目
issues.new.milestone=里程碑
issues.new.no_milestone=未選擇里程碑
issues.new.clear_milestone=清除已選取里程碑
issues.new.open_milestone=開放中的里程碑
issues.new.closed_milestone=已關閉的里程碑
issues.new.assignees=負責人
issues.new.clear_assignees=清除負責人
issues.new.no_assignees=沒有負責人
issues.new.no_reviewers=沒有審核者
issues.choose.get_started=開始
issues.choose.open_external_link=開啟
issues.choose.blank=預設
@ -1393,26 +1390,19 @@ issues.comment_on_locked=您無法在已鎖定的問題上留言。
issues.delete=刪除
issues.delete.title=刪除此問題?
issues.delete.text=您真的要刪除此問題嗎?(這將會永久移除所有內容。若您還想保留,請考慮改為關閉它。)
issues.tracker=時間追蹤
issues.start_tracking_short=開始計時
issues.start_tracking=開始時間追蹤
issues.start_tracking_history=`開始工作 %s`
issues.tracker_auto_close=當這個問題被關閉時,自動停止計時器
issues.tracking_already_started=`您已在<a href="%s">另一個問題</a>上開始時間追蹤!`
issues.stop_tracking=停止計時
issues.stop_tracking_history=`結束工作 %s`
issues.cancel_tracking=捨棄
issues.add_time=手動新增時間
issues.del_time=刪除此時間記錄
issues.add_time_short=新增時間
issues.add_time_cancel=取消
issues.add_time_history=`加入了花費時間 %s`
issues.del_time_history=`刪除了花費時間 %s`
issues.add_time_hours=小時
issues.add_time_minutes=分鐘
issues.add_time_sum_to_small=沒有輸入時間。
issues.time_spent_total=總花費時間
issues.time_spent_from_all_authors=`總花費時間:%s`
issues.due_date=截止日期
issues.invalid_due_date_format=截止日期的格式必須為「yyyy-mm-dd」。
issues.error_modifying_due_date=無法修改截止日期。
@ -2130,7 +2120,6 @@ diff.load=載入差異
diff.generated=generated
diff.vendored=vendored
diff.comment.placeholder=留言...
diff.comment.markdown_info=支援 markdown 格式。
diff.comment.add_single_comment=加入單獨的留言
diff.comment.add_review_comment=新增留言
diff.comment.start_review=開始審核
@ -2961,6 +2950,9 @@ alpine.repository=儲存庫資訊
alpine.repository.branches=分支
alpine.repository.repositories=儲存庫
alpine.repository.architectures=架構
arch.repository=儲存庫資訊
arch.repository.repositories=儲存庫
arch.repository.architectures=架構
cargo.registry=在 Cargo 組態檔設定此註冊中心 (例如: <code>~/.cargo/config.toml</code>):
cargo.install=執行下列命令以使用 Cargo 安裝此套件:
chef.registry=在您的 <code>~/.chef/config.rb</code> 檔設定此註冊中心:

View File

@ -9,6 +9,7 @@ import (
"context"
"errors"
"fmt"
"html/template"
"io"
"net/http"
"net/url"
@ -29,6 +30,7 @@ import (
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/storage"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/templates"
"code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/web"
@ -87,19 +89,20 @@ type ViewResponse struct {
State struct {
Run struct {
Link string `json:"link"`
Title string `json:"title"`
Status string `json:"status"`
CanCancel bool `json:"canCancel"`
CanApprove bool `json:"canApprove"` // the run needs an approval and the doer has permission to approve
CanRerun bool `json:"canRerun"`
CanDeleteArtifact bool `json:"canDeleteArtifact"`
Done bool `json:"done"`
WorkflowID string `json:"workflowID"`
WorkflowLink string `json:"workflowLink"`
IsSchedule bool `json:"isSchedule"`
Jobs []*ViewJob `json:"jobs"`
Commit ViewCommit `json:"commit"`
Link string `json:"link"`
Title string `json:"title"`
TitleHTML template.HTML `json:"titleHTML"`
Status string `json:"status"`
CanCancel bool `json:"canCancel"`
CanApprove bool `json:"canApprove"` // the run needs an approval and the doer has permission to approve
CanRerun bool `json:"canRerun"`
CanDeleteArtifact bool `json:"canDeleteArtifact"`
Done bool `json:"done"`
WorkflowID string `json:"workflowID"`
WorkflowLink string `json:"workflowLink"`
IsSchedule bool `json:"isSchedule"`
Jobs []*ViewJob `json:"jobs"`
Commit ViewCommit `json:"commit"`
} `json:"run"`
CurrentJob struct {
Title string `json:"title"`
@ -200,7 +203,10 @@ func ViewPost(ctx *context_module.Context) {
}
}
metas := ctx.Repo.Repository.ComposeMetas(ctx)
resp.State.Run.Title = run.Title
resp.State.Run.TitleHTML = templates.NewRenderUtils(ctx).RenderCommitMessage(run.Title, metas)
resp.State.Run.Link = run.Link()
resp.State.Run.CanCancel = !run.Status.IsDone() && ctx.Repo.CanWrite(unit.TypeActions)
resp.State.Run.CanApprove = run.NeedApproval && ctx.Repo.CanWrite(unit.TypeActions)

View File

@ -259,3 +259,20 @@ func CreateBranch(ctx *context.Context) {
ctx.Flash.Success(ctx.Tr("repo.branch.create_success", form.NewBranchName))
ctx.Redirect(ctx.Repo.RepoLink + "/src/branch/" + util.PathEscapeSegments(form.NewBranchName) + "/" + util.PathEscapeSegments(form.CurrentPath))
}
func MergeUpstream(ctx *context.Context) {
branchName := ctx.FormString("branch")
_, err := repo_service.MergeUpstream(ctx, ctx.Doer, ctx.Repo.Repository, branchName)
if err != nil {
if errors.Is(err, util.ErrNotExist) {
ctx.JSONError(ctx.Tr("error.not_found"))
return
} else if models.IsErrMergeConflicts(err) {
ctx.JSONError(ctx.Tr("repo.pulls.merge_conflict"))
return
}
ctx.ServerError("MergeUpstream", err)
return
}
ctx.JSONRedirect("")
}

View File

@ -504,19 +504,16 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt
if !util.SliceContainsString(types, viewType, true) {
viewType = "all"
}
var (
assigneeID = ctx.FormInt64("assignee")
posterID = ctx.FormInt64("poster")
mentionedID int64
reviewRequestedID int64
reviewedID int64
)
// TODO: "assignee" should also use GetFilterUserIDByName in the future to support usernames directly
assigneeID := ctx.FormInt64("assignee")
posterUsername := ctx.FormString("poster")
posterUserID := shared_user.GetFilterUserIDByName(ctx, posterUsername)
var mentionedID, reviewRequestedID, reviewedID int64
if ctx.IsSigned {
switch viewType {
case "created_by":
posterID = ctx.Doer.ID
posterUserID = ctx.Doer.ID
case "mentioned":
mentionedID = ctx.Doer.ID
case "assigned":
@ -564,7 +561,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt
ProjectID: projectID,
AssigneeID: assigneeID,
MentionedID: mentionedID,
PosterID: posterID,
PosterID: posterUserID,
ReviewRequestedID: reviewRequestedID,
ReviewedID: reviewedID,
IsPull: isPullOption,
@ -646,7 +643,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt
},
RepoIDs: []int64{repo.ID},
AssigneeID: assigneeID,
PosterID: posterID,
PosterID: posterUserID,
MentionedID: mentionedID,
ReviewRequestedID: reviewRequestedID,
ReviewedID: reviewedID,
@ -800,16 +797,16 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt
ctx.Data["IssueStats"] = issueStats
ctx.Data["OpenCount"] = issueStats.OpenCount
ctx.Data["ClosedCount"] = issueStats.ClosedCount
linkStr := "%s?q=%s&type=%s&sort=%s&state=%s&labels=%s&milestone=%d&project=%d&assignee=%d&poster=%d&archived=%t"
linkStr := "%s?q=%s&type=%s&sort=%s&state=%s&labels=%s&milestone=%d&project=%d&assignee=%d&poster=%v&archived=%t"
ctx.Data["AllStatesLink"] = fmt.Sprintf(linkStr, ctx.Link,
url.QueryEscape(keyword), url.QueryEscape(viewType), url.QueryEscape(sortType), "all", url.QueryEscape(selectLabels),
milestoneID, projectID, assigneeID, posterID, archived)
milestoneID, projectID, assigneeID, url.QueryEscape(posterUsername), archived)
ctx.Data["OpenLink"] = fmt.Sprintf(linkStr, ctx.Link,
url.QueryEscape(keyword), url.QueryEscape(viewType), url.QueryEscape(sortType), "open", url.QueryEscape(selectLabels),
milestoneID, projectID, assigneeID, posterID, archived)
milestoneID, projectID, assigneeID, url.QueryEscape(posterUsername), archived)
ctx.Data["ClosedLink"] = fmt.Sprintf(linkStr, ctx.Link,
url.QueryEscape(keyword), url.QueryEscape(viewType), url.QueryEscape(sortType), "closed", url.QueryEscape(selectLabels),
milestoneID, projectID, assigneeID, posterID, archived)
milestoneID, projectID, assigneeID, url.QueryEscape(posterUsername), archived)
ctx.Data["SelLabelIDs"] = labelIDs
ctx.Data["SelectLabels"] = selectLabels
ctx.Data["ViewType"] = viewType
@ -817,7 +814,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt
ctx.Data["MilestoneID"] = milestoneID
ctx.Data["ProjectID"] = projectID
ctx.Data["AssigneeID"] = assigneeID
ctx.Data["PosterID"] = posterID
ctx.Data["PosterUsername"] = posterUsername
ctx.Data["Keyword"] = keyword
ctx.Data["IsShowClosed"] = isShowClosed
switch {
@ -838,7 +835,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt
pager.AddParamString("milestone", fmt.Sprint(milestoneID))
pager.AddParamString("project", fmt.Sprint(projectID))
pager.AddParamString("assignee", fmt.Sprint(assigneeID))
pager.AddParamString("poster", fmt.Sprint(posterID))
pager.AddParamString("poster", posterUsername)
pager.AddParamString("archived", fmt.Sprint(archived))
ctx.Data["Page"] = pager

View File

@ -195,7 +195,9 @@ func (d *IssuePageMetaData) retrieveReviewersData(ctx *context.Context) {
var reviews issues_model.ReviewList
if d.Issue == nil {
posterID = ctx.Doer.ID
if ctx.Doer != nil {
posterID = ctx.Doer.ID
}
} else {
posterID = d.Issue.PosterID
if d.Issue.OriginalAuthorID > 0 {

View File

@ -325,14 +325,6 @@ func ViewIssue(ctx *context.Context) {
ctx.Data["NewIssueChooseTemplate"] = issue_service.HasTemplatesOrContactLinks(ctx.Repo.Repository, ctx.Repo.GitRepo)
}
if issue.IsPull && !ctx.Repo.CanRead(unit.TypeIssues) {
ctx.Data["IssueDependencySearchType"] = "pulls"
} else if !issue.IsPull && !ctx.Repo.CanRead(unit.TypePullRequests) {
ctx.Data["IssueDependencySearchType"] = "issues"
} else {
ctx.Data["IssueDependencySearchType"] = "all"
}
ctx.Data["IsProjectsEnabled"] = ctx.Repo.CanRead(unit.TypeProjects)
ctx.Data["IsAttachmentEnabled"] = setting.Attachment.Enabled
upload.AddUploadContext(ctx, "comment")
@ -349,46 +341,6 @@ func ViewIssue(ctx *context.Context) {
ctx.Data["Title"] = fmt.Sprintf("#%d - %s", issue.Index, emoji.ReplaceAliases(issue.Title))
iw := new(issues_model.IssueWatch)
if ctx.Doer != nil {
iw.UserID = ctx.Doer.ID
iw.IssueID = issue.ID
iw.IsWatching, err = issues_model.CheckIssueWatch(ctx, ctx.Doer, issue)
if err != nil {
ctx.ServerError("CheckIssueWatch", err)
return
}
}
ctx.Data["IssueWatch"] = iw
rctx := renderhelper.NewRenderContextRepoComment(ctx, ctx.Repo.Repository)
issue.RenderedContent, err = markdown.RenderString(rctx, issue.Content)
if err != nil {
ctx.ServerError("RenderString", err)
return
}
repo := ctx.Repo.Repository
// Get more information if it's a pull request.
if issue.IsPull {
if issue.PullRequest.HasMerged {
ctx.Data["DisableStatusChange"] = issue.PullRequest.HasMerged
PrepareMergedViewPullInfo(ctx, issue)
} else {
PrepareViewPullInfo(ctx, issue)
ctx.Data["DisableStatusChange"] = ctx.Data["IsPullRequestBroken"] == true && issue.IsClosed
}
if ctx.Written() {
return
}
}
pageMetaData := retrieveRepoIssueMetaData(ctx, repo, issue, issue.IsPull)
if ctx.Written() {
return
}
pageMetaData.LabelsData.SetSelectedLabels(issue.Labels)
if ctx.IsSigned {
// Update issue-user.
if err = activities_model.SetIssueReadBy(ctx, issue.ID, ctx.Doer.ID); err != nil {
@ -397,52 +349,219 @@ func ViewIssue(ctx *context.Context) {
}
}
var (
role issues_model.RoleDescriptor
ok bool
marked = make(map[int64]issues_model.RoleDescriptor)
comment *issues_model.Comment
participants = make([]*user_model.User, 1, 10)
latestCloseCommentID int64
)
if ctx.Repo.Repository.IsTimetrackerEnabled(ctx) {
if ctx.IsSigned {
// Deal with the stopwatch
ctx.Data["IsStopwatchRunning"] = issues_model.StopwatchExists(ctx, ctx.Doer.ID, issue.ID)
if !ctx.Data["IsStopwatchRunning"].(bool) {
var exists bool
var swIssue *issues_model.Issue
if exists, _, swIssue, err = issues_model.HasUserStopwatch(ctx, ctx.Doer.ID); err != nil {
ctx.ServerError("HasUserStopwatch", err)
return
}
ctx.Data["HasUserStopwatch"] = exists
if exists {
// Add warning if the user has already a stopwatch
// Add link to the issue of the already running stopwatch
ctx.Data["OtherStopwatchURL"] = swIssue.Link()
}
}
ctx.Data["CanUseTimetracker"] = ctx.Repo.CanUseTimetracker(ctx, issue, ctx.Doer)
} else {
ctx.Data["CanUseTimetracker"] = false
}
if ctx.Data["WorkingUsers"], err = issues_model.TotalTimesForEachUser(ctx, &issues_model.FindTrackedTimesOptions{IssueID: issue.ID}); err != nil {
ctx.ServerError("TotalTimesForEachUser", err)
pageMetaData := retrieveRepoIssueMetaData(ctx, ctx.Repo.Repository, issue, issue.IsPull)
if ctx.Written() {
return
}
pageMetaData.LabelsData.SetSelectedLabels(issue.Labels)
prepareFuncs := []func(*context.Context, *issues_model.Issue){
prepareIssueViewContent,
func(ctx *context.Context, issue *issues_model.Issue) {
preparePullViewPullInfo(ctx, issue)
},
prepareIssueViewCommentsAndSidebarParticipants,
preparePullViewReviewAndMerge,
prepareIssueViewSidebarWatch,
prepareIssueViewSidebarTimeTracker,
prepareIssueViewSidebarDependency,
prepareIssueViewSidebarPin,
}
for _, prepareFunc := range prepareFuncs {
prepareFunc(ctx, issue)
if ctx.Written() {
return
}
}
// Get more information if it's a pull request.
if issue.IsPull {
if issue.PullRequest.HasMerged {
ctx.Data["DisableStatusChange"] = issue.PullRequest.HasMerged
} else {
ctx.Data["DisableStatusChange"] = ctx.Data["IsPullRequestBroken"] == true && issue.IsClosed
}
}
ctx.Data["Reference"] = issue.Ref
ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login?redirect_to=" + url.QueryEscape(ctx.Data["Link"].(string))
ctx.Data["IsIssuePoster"] = ctx.IsSigned && issue.IsPoster(ctx.Doer.ID)
ctx.Data["HasIssuesOrPullsWritePermission"] = ctx.Repo.CanWriteIssuesOrPulls(issue.IsPull)
ctx.Data["HasProjectsWritePermission"] = ctx.Repo.CanWrite(unit.TypeProjects)
ctx.Data["IsRepoAdmin"] = ctx.IsSigned && (ctx.Repo.IsAdmin() || ctx.Doer.IsAdmin)
ctx.Data["LockReasons"] = setting.Repository.Issue.LockReasons
ctx.Data["RefEndName"] = git.RefName(issue.Ref).ShortName()
tags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID)
if err != nil {
ctx.ServerError("GetTagNamesByRepoID", err)
return
}
ctx.Data["Tags"] = tags
ctx.Data["CanBlockUser"] = func(blocker, blockee *user_model.User) bool {
return user_service.CanBlockUser(ctx, ctx.Doer, blocker, blockee)
}
ctx.HTML(http.StatusOK, tplIssueView)
}
func prepareIssueViewSidebarDependency(ctx *context.Context, issue *issues_model.Issue) {
if issue.IsPull && !ctx.Repo.CanRead(unit.TypeIssues) {
ctx.Data["IssueDependencySearchType"] = "pulls"
} else if !issue.IsPull && !ctx.Repo.CanRead(unit.TypePullRequests) {
ctx.Data["IssueDependencySearchType"] = "issues"
} else {
ctx.Data["IssueDependencySearchType"] = "all"
}
// Check if the user can use the dependencies
ctx.Data["CanCreateIssueDependencies"] = ctx.Repo.CanCreateIssueDependencies(ctx, ctx.Doer, issue.IsPull)
// check if dependencies can be created across repositories
ctx.Data["AllowCrossRepositoryDependencies"] = setting.Service.AllowCrossRepositoryDependencies
if issue.ShowRole, err = roleDescriptor(ctx, repo, issue.Poster, issue, issue.HasOriginalAuthor()); err != nil {
ctx.ServerError("roleDescriptor", err)
// Get Dependencies
blockedBy, err := issue.BlockedByDependencies(ctx, db.ListOptions{})
if err != nil {
ctx.ServerError("BlockedByDependencies", err)
return
}
ctx.Data["BlockedByDependencies"], ctx.Data["BlockedByDependenciesNotPermitted"] = checkBlockedByIssues(ctx, blockedBy)
if ctx.Written() {
return
}
blocking, err := issue.BlockingDependencies(ctx)
if err != nil {
ctx.ServerError("BlockingDependencies", err)
return
}
ctx.Data["BlockingDependencies"], ctx.Data["BlockingDependenciesNotPermitted"] = checkBlockedByIssues(ctx, blocking)
}
func preparePullViewSigning(ctx *context.Context, issue *issues_model.Issue) {
if !issue.IsPull {
return
}
pull := issue.PullRequest
ctx.Data["WillSign"] = false
if ctx.Doer != nil {
sign, key, _, err := asymkey_service.SignMerge(ctx, pull, ctx.Doer, pull.BaseRepo.RepoPath(), pull.BaseBranch, pull.GetGitRefName())
ctx.Data["WillSign"] = sign
ctx.Data["SigningKey"] = key
if err != nil {
if asymkey_service.IsErrWontSign(err) {
ctx.Data["WontSignReason"] = err.(*asymkey_service.ErrWontSign).Reason
} else {
ctx.Data["WontSignReason"] = "error"
log.Error("Error whilst checking if could sign pr %d in repo %s. Error: %v", pull.ID, pull.BaseRepo.FullName(), err)
}
}
} else {
ctx.Data["WontSignReason"] = "not_signed_in"
}
}
func prepareIssueViewSidebarWatch(ctx *context.Context, issue *issues_model.Issue) {
iw := new(issues_model.IssueWatch)
if ctx.Doer != nil {
iw.UserID = ctx.Doer.ID
iw.IssueID = issue.ID
var err error
iw.IsWatching, err = issues_model.CheckIssueWatch(ctx, ctx.Doer, issue)
if err != nil {
ctx.ServerError("CheckIssueWatch", err)
return
}
}
ctx.Data["IssueWatch"] = iw
}
func prepareIssueViewSidebarTimeTracker(ctx *context.Context, issue *issues_model.Issue) {
if !ctx.Repo.Repository.IsTimetrackerEnabled(ctx) {
return
}
if ctx.IsSigned {
// Deal with the stopwatch
ctx.Data["IsStopwatchRunning"] = issues_model.StopwatchExists(ctx, ctx.Doer.ID, issue.ID)
if !ctx.Data["IsStopwatchRunning"].(bool) {
exists, _, swIssue, err := issues_model.HasUserStopwatch(ctx, ctx.Doer.ID)
if err != nil {
ctx.ServerError("HasUserStopwatch", err)
return
}
ctx.Data["HasUserStopwatch"] = exists
if exists {
// Add warning if the user has already a stopwatch
// Add link to the issue of the already running stopwatch
ctx.Data["OtherStopwatchURL"] = swIssue.Link()
}
}
ctx.Data["CanUseTimetracker"] = ctx.Repo.CanUseTimetracker(ctx, issue, ctx.Doer)
} else {
ctx.Data["CanUseTimetracker"] = false
}
var err error
if ctx.Data["WorkingUsers"], err = issues_model.TotalTimesForEachUser(ctx, &issues_model.FindTrackedTimesOptions{IssueID: issue.ID}); err != nil {
ctx.ServerError("TotalTimesForEachUser", err)
return
}
}
func preparePullViewDeleteBranch(ctx *context.Context, issue *issues_model.Issue, canDelete bool) {
if !issue.IsPull {
return
}
pull := issue.PullRequest
isPullBranchDeletable := canDelete &&
pull.HeadRepo != nil &&
git.IsBranchExist(ctx, pull.HeadRepo.RepoPath(), pull.HeadBranch) &&
(!pull.HasMerged || ctx.Data["HeadBranchCommitID"] == ctx.Data["PullHeadCommitID"])
if isPullBranchDeletable && pull.HasMerged {
exist, err := issues_model.HasUnmergedPullRequestsByHeadInfo(ctx, pull.HeadRepoID, pull.HeadBranch)
if err != nil {
ctx.ServerError("HasUnmergedPullRequestsByHeadInfo", err)
return
}
isPullBranchDeletable = !exist
}
ctx.Data["IsPullBranchDeletable"] = isPullBranchDeletable
}
func prepareIssueViewSidebarPin(ctx *context.Context, issue *issues_model.Issue) {
var pinAllowed bool
if !issue.IsPinned() {
var err error
pinAllowed, err = issues_model.IsNewPinAllowed(ctx, issue.RepoID, issue.IsPull)
if err != nil {
ctx.ServerError("IsNewPinAllowed", err)
return
}
} else {
pinAllowed = true
}
ctx.Data["NewPinAllowed"] = pinAllowed
ctx.Data["PinEnabled"] = setting.Repository.Issue.MaxPinned != 0
}
func prepareIssueViewCommentsAndSidebarParticipants(ctx *context.Context, issue *issues_model.Issue) {
var (
role issues_model.RoleDescriptor
ok bool
marked = make(map[int64]issues_model.RoleDescriptor)
comment *issues_model.Comment
participants = make([]*user_model.User, 1, 10)
latestCloseCommentID int64
err error
)
marked[issue.PosterID] = issue.ShowRole
// Render comments and fetch participants.
@ -461,7 +580,7 @@ func ViewIssue(ctx *context.Context) {
comment.Issue = issue
if comment.Type == issues_model.CommentTypeComment || comment.Type == issues_model.CommentTypeReview {
rctx = renderhelper.NewRenderContextRepoComment(ctx, repo)
rctx := renderhelper.NewRenderContextRepoComment(ctx, issue.Repo)
comment.RenderedContent, err = markdown.RenderString(rctx, comment.Content)
if err != nil {
ctx.ServerError("RenderString", err)
@ -474,7 +593,7 @@ func ViewIssue(ctx *context.Context) {
continue
}
comment.ShowRole, err = roleDescriptor(ctx, repo, comment.Poster, issue, comment.HasOriginalAuthor())
comment.ShowRole, err = roleDescriptor(ctx, issue.Repo, comment.Poster, issue, comment.HasOriginalAuthor())
if err != nil {
ctx.ServerError("roleDescriptor", err)
return
@ -537,7 +656,7 @@ func ViewIssue(ctx *context.Context) {
}
}
} else if comment.Type.HasContentSupport() {
rctx = renderhelper.NewRenderContextRepoComment(ctx, repo)
rctx := renderhelper.NewRenderContextRepoComment(ctx, issue.Repo)
comment.RenderedContent, err = markdown.RenderString(rctx, comment.Content)
if err != nil {
ctx.ServerError("RenderString", err)
@ -572,7 +691,7 @@ func ViewIssue(ctx *context.Context) {
continue
}
c.ShowRole, err = roleDescriptor(ctx, repo, c.Poster, issue, c.HasOriginalAuthor())
c.ShowRole, err = roleDescriptor(ctx, issue.Repo, c.Poster, issue, c.HasOriginalAuthor())
if err != nil {
ctx.ServerError("roleDescriptor", err)
return
@ -629,237 +748,6 @@ func ViewIssue(ctx *context.Context) {
// Combine multiple label assignments into a single comment
combineLabelComments(issue)
getBranchData(ctx, issue)
if issue.IsPull {
pull := issue.PullRequest
pull.Issue = issue
canDelete := false
allowMerge := false
canWriteToHeadRepo := false
if ctx.IsSigned {
if err := pull.LoadHeadRepo(ctx); err != nil {
log.Error("LoadHeadRepo: %v", err)
} else if pull.HeadRepo != nil {
perm, err := access_model.GetUserRepoPermission(ctx, pull.HeadRepo, ctx.Doer)
if err != nil {
ctx.ServerError("GetUserRepoPermission", err)
return
}
if perm.CanWrite(unit.TypeCode) {
// Check if branch is not protected
if pull.HeadBranch != pull.HeadRepo.DefaultBranch {
if protected, err := git_model.IsBranchProtected(ctx, pull.HeadRepo.ID, pull.HeadBranch); err != nil {
log.Error("IsProtectedBranch: %v", err)
} else if !protected {
canDelete = true
ctx.Data["DeleteBranchLink"] = issue.Link() + "/cleanup"
}
}
canWriteToHeadRepo = true
}
}
if err := pull.LoadBaseRepo(ctx); err != nil {
log.Error("LoadBaseRepo: %v", err)
}
perm, err := access_model.GetUserRepoPermission(ctx, pull.BaseRepo, ctx.Doer)
if err != nil {
ctx.ServerError("GetUserRepoPermission", err)
return
}
if !canWriteToHeadRepo { // maintainers maybe allowed to push to head repo even if they can't write to it
canWriteToHeadRepo = pull.AllowMaintainerEdit && perm.CanWrite(unit.TypeCode)
}
allowMerge, err = pull_service.IsUserAllowedToMerge(ctx, pull, perm, ctx.Doer)
if err != nil {
ctx.ServerError("IsUserAllowedToMerge", err)
return
}
if ctx.Data["CanMarkConversation"], err = issues_model.CanMarkConversation(ctx, issue, ctx.Doer); err != nil {
ctx.ServerError("CanMarkConversation", err)
return
}
}
ctx.Data["CanWriteToHeadRepo"] = canWriteToHeadRepo
ctx.Data["ShowMergeInstructions"] = canWriteToHeadRepo
ctx.Data["AllowMerge"] = allowMerge
prUnit, err := repo.GetUnit(ctx, unit.TypePullRequests)
if err != nil {
ctx.ServerError("GetUnit", err)
return
}
prConfig := prUnit.PullRequestsConfig()
ctx.Data["AutodetectManualMerge"] = prConfig.AutodetectManualMerge
var mergeStyle repo_model.MergeStyle
// Check correct values and select default
if ms, ok := ctx.Data["MergeStyle"].(repo_model.MergeStyle); !ok ||
!prConfig.IsMergeStyleAllowed(ms) {
defaultMergeStyle := prConfig.GetDefaultMergeStyle()
if prConfig.IsMergeStyleAllowed(defaultMergeStyle) && !ok {
mergeStyle = defaultMergeStyle
} else if prConfig.AllowMerge {
mergeStyle = repo_model.MergeStyleMerge
} else if prConfig.AllowRebase {
mergeStyle = repo_model.MergeStyleRebase
} else if prConfig.AllowRebaseMerge {
mergeStyle = repo_model.MergeStyleRebaseMerge
} else if prConfig.AllowSquash {
mergeStyle = repo_model.MergeStyleSquash
} else if prConfig.AllowFastForwardOnly {
mergeStyle = repo_model.MergeStyleFastForwardOnly
} else if prConfig.AllowManualMerge {
mergeStyle = repo_model.MergeStyleManuallyMerged
}
}
ctx.Data["MergeStyle"] = mergeStyle
defaultMergeMessage, defaultMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, mergeStyle)
if err != nil {
ctx.ServerError("GetDefaultMergeMessage", err)
return
}
ctx.Data["DefaultMergeMessage"] = defaultMergeMessage
ctx.Data["DefaultMergeBody"] = defaultMergeBody
defaultSquashMergeMessage, defaultSquashMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash)
if err != nil {
ctx.ServerError("GetDefaultSquashMergeMessage", err)
return
}
ctx.Data["DefaultSquashMergeMessage"] = defaultSquashMergeMessage
ctx.Data["DefaultSquashMergeBody"] = defaultSquashMergeBody
pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pull.BaseRepoID, pull.BaseBranch)
if err != nil {
ctx.ServerError("LoadProtectedBranch", err)
return
}
if pb != nil {
pb.Repo = pull.BaseRepo
ctx.Data["ProtectedBranch"] = pb
ctx.Data["IsBlockedByApprovals"] = !issues_model.HasEnoughApprovals(ctx, pb, pull)
ctx.Data["IsBlockedByRejection"] = issues_model.MergeBlockedByRejectedReview(ctx, pb, pull)
ctx.Data["IsBlockedByOfficialReviewRequests"] = issues_model.MergeBlockedByOfficialReviewRequests(ctx, pb, pull)
ctx.Data["IsBlockedByOutdatedBranch"] = issues_model.MergeBlockedByOutdatedBranch(pb, pull)
ctx.Data["GrantedApprovals"] = issues_model.GetGrantedApprovalsCount(ctx, pb, pull)
ctx.Data["RequireSigned"] = pb.RequireSignedCommits
ctx.Data["ChangedProtectedFiles"] = pull.ChangedProtectedFiles
ctx.Data["IsBlockedByChangedProtectedFiles"] = len(pull.ChangedProtectedFiles) != 0
ctx.Data["ChangedProtectedFilesNum"] = len(pull.ChangedProtectedFiles)
ctx.Data["RequireApprovalsWhitelist"] = pb.EnableApprovalsWhitelist
}
ctx.Data["WillSign"] = false
if ctx.Doer != nil {
sign, key, _, err := asymkey_service.SignMerge(ctx, pull, ctx.Doer, pull.BaseRepo.RepoPath(), pull.BaseBranch, pull.GetGitRefName())
ctx.Data["WillSign"] = sign
ctx.Data["SigningKey"] = key
if err != nil {
if asymkey_service.IsErrWontSign(err) {
ctx.Data["WontSignReason"] = err.(*asymkey_service.ErrWontSign).Reason
} else {
ctx.Data["WontSignReason"] = "error"
log.Error("Error whilst checking if could sign pr %d in repo %s. Error: %v", pull.ID, pull.BaseRepo.FullName(), err)
}
}
} else {
ctx.Data["WontSignReason"] = "not_signed_in"
}
isPullBranchDeletable := canDelete &&
pull.HeadRepo != nil &&
git.IsBranchExist(ctx, pull.HeadRepo.RepoPath(), pull.HeadBranch) &&
(!pull.HasMerged || ctx.Data["HeadBranchCommitID"] == ctx.Data["PullHeadCommitID"])
if isPullBranchDeletable && pull.HasMerged {
exist, err := issues_model.HasUnmergedPullRequestsByHeadInfo(ctx, pull.HeadRepoID, pull.HeadBranch)
if err != nil {
ctx.ServerError("HasUnmergedPullRequestsByHeadInfo", err)
return
}
isPullBranchDeletable = !exist
}
ctx.Data["IsPullBranchDeletable"] = isPullBranchDeletable
stillCanManualMerge := func() bool {
if pull.HasMerged || issue.IsClosed || !ctx.IsSigned {
return false
}
if pull.CanAutoMerge() || pull.IsWorkInProgress(ctx) || pull.IsChecking() {
return false
}
if allowMerge && prConfig.AllowManualMerge {
return true
}
return false
}
ctx.Data["StillCanManualMerge"] = stillCanManualMerge()
// Check if there is a pending pr merge
ctx.Data["HasPendingPullRequestMerge"], ctx.Data["PendingPullRequestMerge"], err = pull_model.GetScheduledMergeByPullID(ctx, pull.ID)
if err != nil {
ctx.ServerError("GetScheduledMergeByPullID", err)
return
}
}
// Get Dependencies
blockedBy, err := issue.BlockedByDependencies(ctx, db.ListOptions{})
if err != nil {
ctx.ServerError("BlockedByDependencies", err)
return
}
ctx.Data["BlockedByDependencies"], ctx.Data["BlockedByDependenciesNotPermitted"] = checkBlockedByIssues(ctx, blockedBy)
if ctx.Written() {
return
}
blocking, err := issue.BlockingDependencies(ctx)
if err != nil {
ctx.ServerError("BlockingDependencies", err)
return
}
ctx.Data["BlockingDependencies"], ctx.Data["BlockingDependenciesNotPermitted"] = checkBlockedByIssues(ctx, blocking)
if ctx.Written() {
return
}
var pinAllowed bool
if !issue.IsPinned() {
pinAllowed, err = issues_model.IsNewPinAllowed(ctx, issue.RepoID, issue.IsPull)
if err != nil {
ctx.ServerError("IsNewPinAllowed", err)
return
}
} else {
pinAllowed = true
}
ctx.Data["Participants"] = participants
ctx.Data["NumParticipants"] = len(participants)
ctx.Data["Issue"] = issue
ctx.Data["Reference"] = issue.Ref
ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login?redirect_to=" + url.QueryEscape(ctx.Data["Link"].(string))
ctx.Data["IsIssuePoster"] = ctx.IsSigned && issue.IsPoster(ctx.Doer.ID)
ctx.Data["HasIssuesOrPullsWritePermission"] = ctx.Repo.CanWriteIssuesOrPulls(issue.IsPull)
ctx.Data["HasProjectsWritePermission"] = ctx.Repo.CanWrite(unit.TypeProjects)
ctx.Data["IsRepoAdmin"] = ctx.IsSigned && (ctx.Repo.IsAdmin() || ctx.Doer.IsAdmin)
ctx.Data["LockReasons"] = setting.Repository.Issue.LockReasons
ctx.Data["RefEndName"] = git.RefName(issue.Ref).ShortName()
ctx.Data["NewPinAllowed"] = pinAllowed
ctx.Data["PinEnabled"] = setting.Repository.Issue.MaxPinned != 0
var hiddenCommentTypes *big.Int
if ctx.IsSigned {
val, err := user_model.GetUserSetting(ctx, ctx.Doer.ID, user_model.SettingsKeyHiddenCommentTypes)
@ -872,23 +760,189 @@ func ViewIssue(ctx *context.Context) {
ctx.Data["ShouldShowCommentType"] = func(commentType issues_model.CommentType) bool {
return hiddenCommentTypes == nil || hiddenCommentTypes.Bit(int(commentType)) == 0
}
// For sidebar
PrepareBranchList(ctx)
// prepare for sidebar participants
ctx.Data["Participants"] = participants
ctx.Data["NumParticipants"] = len(participants)
}
func preparePullViewReviewAndMerge(ctx *context.Context, issue *issues_model.Issue) {
getBranchData(ctx, issue)
if !issue.IsPull {
return
}
pull := issue.PullRequest
pull.Issue = issue
canDelete := false
allowMerge := false
canWriteToHeadRepo := false
if ctx.IsSigned {
if err := pull.LoadHeadRepo(ctx); err != nil {
log.Error("LoadHeadRepo: %v", err)
} else if pull.HeadRepo != nil {
perm, err := access_model.GetUserRepoPermission(ctx, pull.HeadRepo, ctx.Doer)
if err != nil {
ctx.ServerError("GetUserRepoPermission", err)
return
}
if perm.CanWrite(unit.TypeCode) {
// Check if branch is not protected
if pull.HeadBranch != pull.HeadRepo.DefaultBranch {
if protected, err := git_model.IsBranchProtected(ctx, pull.HeadRepo.ID, pull.HeadBranch); err != nil {
log.Error("IsProtectedBranch: %v", err)
} else if !protected {
canDelete = true
ctx.Data["DeleteBranchLink"] = issue.Link() + "/cleanup"
}
}
canWriteToHeadRepo = true
}
}
if err := pull.LoadBaseRepo(ctx); err != nil {
log.Error("LoadBaseRepo: %v", err)
}
perm, err := access_model.GetUserRepoPermission(ctx, pull.BaseRepo, ctx.Doer)
if err != nil {
ctx.ServerError("GetUserRepoPermission", err)
return
}
if !canWriteToHeadRepo { // maintainers maybe allowed to push to head repo even if they can't write to it
canWriteToHeadRepo = pull.AllowMaintainerEdit && perm.CanWrite(unit.TypeCode)
}
allowMerge, err = pull_service.IsUserAllowedToMerge(ctx, pull, perm, ctx.Doer)
if err != nil {
ctx.ServerError("IsUserAllowedToMerge", err)
return
}
if ctx.Data["CanMarkConversation"], err = issues_model.CanMarkConversation(ctx, issue, ctx.Doer); err != nil {
ctx.ServerError("CanMarkConversation", err)
return
}
}
ctx.Data["CanWriteToHeadRepo"] = canWriteToHeadRepo
ctx.Data["ShowMergeInstructions"] = canWriteToHeadRepo
ctx.Data["AllowMerge"] = allowMerge
prUnit, err := issue.Repo.GetUnit(ctx, unit.TypePullRequests)
if err != nil {
ctx.ServerError("GetUnit", err)
return
}
prConfig := prUnit.PullRequestsConfig()
ctx.Data["AutodetectManualMerge"] = prConfig.AutodetectManualMerge
var mergeStyle repo_model.MergeStyle
// Check correct values and select default
if ms, ok := ctx.Data["MergeStyle"].(repo_model.MergeStyle); !ok ||
!prConfig.IsMergeStyleAllowed(ms) {
defaultMergeStyle := prConfig.GetDefaultMergeStyle()
if prConfig.IsMergeStyleAllowed(defaultMergeStyle) && !ok {
mergeStyle = defaultMergeStyle
} else if prConfig.AllowMerge {
mergeStyle = repo_model.MergeStyleMerge
} else if prConfig.AllowRebase {
mergeStyle = repo_model.MergeStyleRebase
} else if prConfig.AllowRebaseMerge {
mergeStyle = repo_model.MergeStyleRebaseMerge
} else if prConfig.AllowSquash {
mergeStyle = repo_model.MergeStyleSquash
} else if prConfig.AllowFastForwardOnly {
mergeStyle = repo_model.MergeStyleFastForwardOnly
} else if prConfig.AllowManualMerge {
mergeStyle = repo_model.MergeStyleManuallyMerged
}
}
ctx.Data["MergeStyle"] = mergeStyle
defaultMergeMessage, defaultMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, mergeStyle)
if err != nil {
ctx.ServerError("GetDefaultMergeMessage", err)
return
}
ctx.Data["DefaultMergeMessage"] = defaultMergeMessage
ctx.Data["DefaultMergeBody"] = defaultMergeBody
defaultSquashMergeMessage, defaultSquashMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash)
if err != nil {
ctx.ServerError("GetDefaultSquashMergeMessage", err)
return
}
ctx.Data["DefaultSquashMergeMessage"] = defaultSquashMergeMessage
ctx.Data["DefaultSquashMergeBody"] = defaultSquashMergeBody
pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pull.BaseRepoID, pull.BaseBranch)
if err != nil {
ctx.ServerError("LoadProtectedBranch", err)
return
}
if pb != nil {
pb.Repo = pull.BaseRepo
ctx.Data["ProtectedBranch"] = pb
ctx.Data["IsBlockedByApprovals"] = !issues_model.HasEnoughApprovals(ctx, pb, pull)
ctx.Data["IsBlockedByRejection"] = issues_model.MergeBlockedByRejectedReview(ctx, pb, pull)
ctx.Data["IsBlockedByOfficialReviewRequests"] = issues_model.MergeBlockedByOfficialReviewRequests(ctx, pb, pull)
ctx.Data["IsBlockedByOutdatedBranch"] = issues_model.MergeBlockedByOutdatedBranch(pb, pull)
ctx.Data["GrantedApprovals"] = issues_model.GetGrantedApprovalsCount(ctx, pb, pull)
ctx.Data["RequireSigned"] = pb.RequireSignedCommits
ctx.Data["ChangedProtectedFiles"] = pull.ChangedProtectedFiles
ctx.Data["IsBlockedByChangedProtectedFiles"] = len(pull.ChangedProtectedFiles) != 0
ctx.Data["ChangedProtectedFilesNum"] = len(pull.ChangedProtectedFiles)
ctx.Data["RequireApprovalsWhitelist"] = pb.EnableApprovalsWhitelist
}
preparePullViewSigning(ctx, issue)
if ctx.Written() {
return
}
tags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID)
if err != nil {
ctx.ServerError("GetTagNamesByRepoID", err)
preparePullViewDeleteBranch(ctx, issue, canDelete)
if ctx.Written() {
return
}
ctx.Data["Tags"] = tags
ctx.Data["CanBlockUser"] = func(blocker, blockee *user_model.User) bool {
return user_service.CanBlockUser(ctx, ctx.Doer, blocker, blockee)
stillCanManualMerge := func() bool {
if pull.HasMerged || issue.IsClosed || !ctx.IsSigned {
return false
}
if pull.CanAutoMerge() || pull.IsWorkInProgress(ctx) || pull.IsChecking() {
return false
}
if allowMerge && prConfig.AllowManualMerge {
return true
}
return false
}
ctx.HTML(http.StatusOK, tplIssueView)
ctx.Data["StillCanManualMerge"] = stillCanManualMerge()
// Check if there is a pending pr merge
ctx.Data["HasPendingPullRequestMerge"], ctx.Data["PendingPullRequestMerge"], err = pull_model.GetScheduledMergeByPullID(ctx, pull.ID)
if err != nil {
ctx.ServerError("GetScheduledMergeByPullID", err)
return
}
}
func prepareIssueViewContent(ctx *context.Context, issue *issues_model.Issue) {
var err error
rctx := renderhelper.NewRenderContextRepoComment(ctx, ctx.Repo.Repository)
issue.RenderedContent, err = markdown.RenderString(rctx, issue.Content)
if err != nil {
ctx.ServerError("RenderString", err)
return
}
if issue.ShowRole, err = roleDescriptor(ctx, issue.Repo, issue.Poster, issue, issue.HasOriginalAuthor()); err != nil {
ctx.ServerError("roleDescriptor", err)
return
}
ctx.Data["Issue"] = issue
}

View File

@ -425,6 +425,7 @@ func ViewProject(ctx *context.Context) {
return
}
ctx.Data["Title"] = project.Title
ctx.Data["IsProjectsPage"] = true
ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(unit.TypeProjects)
ctx.Data["Project"] = project

View File

@ -264,8 +264,18 @@ func GetMergedBaseCommitID(ctx *context.Context, issue *issues_model.Issue) stri
return baseCommit
}
// PrepareMergedViewPullInfo show meta information for a merged pull request view page
func PrepareMergedViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.CompareInfo {
func preparePullViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.CompareInfo {
if !issue.IsPull {
return nil
}
if issue.PullRequest.HasMerged {
return prepareMergedViewPullInfo(ctx, issue)
}
return prepareViewPullInfo(ctx, issue)
}
// prepareMergedViewPullInfo show meta information for a merged pull request view page
func prepareMergedViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.CompareInfo {
pull := issue.PullRequest
setMergeTarget(ctx, pull)
@ -310,8 +320,8 @@ func PrepareMergedViewPullInfo(ctx *context.Context, issue *issues_model.Issue)
return compareInfo
}
// PrepareViewPullInfo show meta information for a pull request preview page
func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.CompareInfo {
// prepareViewPullInfo show meta information for a pull request preview page
func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.CompareInfo {
ctx.Data["PullRequestWorkInProgressPrefixes"] = setting.Repository.PullRequest.WorkInProgressPrefixes
repo := ctx.Repo.Repository
@ -611,15 +621,8 @@ func ViewPullCommits(ctx *context.Context) {
if !ok {
return
}
pull := issue.PullRequest
var prInfo *git.CompareInfo
if pull.HasMerged {
prInfo = PrepareMergedViewPullInfo(ctx, issue)
} else {
prInfo = PrepareViewPullInfo(ctx, issue)
}
prInfo := preparePullViewPullInfo(ctx, issue)
if ctx.Written() {
return
} else if prInfo == nil {
@ -663,11 +666,12 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi
gitRepo = ctx.Repo.GitRepo
)
var prInfo *git.CompareInfo
if pull.HasMerged {
prInfo = PrepareMergedViewPullInfo(ctx, issue)
} else {
prInfo = PrepareViewPullInfo(ctx, issue)
prInfo := preparePullViewPullInfo(ctx, issue)
if ctx.Written() {
return
} else if prInfo == nil {
ctx.NotFound("ViewPullFiles", nil)
return
}
// Validate the given commit sha to show (if any passed)

View File

@ -31,7 +31,7 @@ import (
"github.com/nektos/act/pkg/model"
)
func renderFile(ctx *context.Context, entry *git.TreeEntry) {
func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) {
ctx.Data["IsViewFile"] = true
ctx.Data["HideRepoInfo"] = true
blob := entry.Blob()

View File

@ -4,6 +4,7 @@
package repo
import (
"errors"
"fmt"
"html/template"
"net/http"
@ -86,29 +87,31 @@ func prepareOpenWithEditorApps(ctx *context.Context) {
ctx.Data["OpenWithEditorApps"] = tmplApps
}
func prepareHomeSidebarCitationFile(ctx *context.Context, entry *git.TreeEntry) {
if entry.Name() != "" {
return
}
tree, err := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath)
if err != nil {
HandleGitError(ctx, "Repo.Commit.SubTree", err)
return
}
allEntries, err := tree.ListEntries()
if err != nil {
ctx.ServerError("ListEntries", err)
return
}
for _, entry := range allEntries {
if entry.Name() == "CITATION.cff" || entry.Name() == "CITATION.bib" {
// Read Citation file contents
if content, err := entry.Blob().GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil {
log.Error("checkCitationFile: GetBlobContent: %v", err)
} else {
ctx.Data["CitiationExist"] = true
ctx.PageData["citationFileContent"] = content
break
func prepareHomeSidebarCitationFile(entry *git.TreeEntry) func(ctx *context.Context) {
return func(ctx *context.Context) {
if entry.Name() != "" {
return
}
tree, err := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath)
if err != nil {
HandleGitError(ctx, "Repo.Commit.SubTree", err)
return
}
allEntries, err := tree.ListEntries()
if err != nil {
ctx.ServerError("ListEntries", err)
return
}
for _, entry := range allEntries {
if entry.Name() == "CITATION.cff" || entry.Name() == "CITATION.bib" {
// Read Citation file contents
if content, err := entry.Blob().GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil {
log.Error("checkCitationFile: GetBlobContent: %v", err)
} else {
ctx.Data["CitiationExist"] = true
ctx.PageData["citationFileContent"] = content
break
}
}
}
}
@ -174,83 +177,21 @@ func prepareHomeSidebarLatestRelease(ctx *context.Context) {
}
}
func renderHomeCode(ctx *context.Context) {
ctx.Data["PageIsViewCode"] = true
ctx.Data["RepositoryUploadEnabled"] = setting.Repository.Upload.Enabled
prepareOpenWithEditorApps(ctx)
if ctx.Repo.Commit == nil || ctx.Repo.Repository.IsEmpty || ctx.Repo.Repository.IsBroken() {
showEmpty := true
var err error
if ctx.Repo.GitRepo != nil {
showEmpty, err = ctx.Repo.GitRepo.IsEmpty()
if err != nil {
log.Error("GitRepo.IsEmpty: %v", err)
ctx.Repo.Repository.Status = repo_model.RepositoryBroken
showEmpty = true
ctx.Flash.Error(ctx.Tr("error.occurred"), true)
}
}
if showEmpty {
ctx.HTML(http.StatusOK, tplRepoEMPTY)
return
}
// the repo is not really empty, so we should update the modal in database
// such problem may be caused by:
// 1) an error occurs during pushing/receiving. 2) the user replaces an empty git repo manually
// and even more: the IsEmpty flag is deeply broken and should be removed with the UI changed to manage to cope with empty repos.
// it's possible for a repository to be non-empty by that flag but still 500
// because there are no branches - only tags -or the default branch is non-extant as it has been 0-pushed.
ctx.Repo.Repository.IsEmpty = false
if err = repo_model.UpdateRepositoryCols(ctx, ctx.Repo.Repository, "is_empty"); err != nil {
ctx.ServerError("UpdateRepositoryCols", err)
return
}
if err = repo_module.UpdateRepoSize(ctx, ctx.Repo.Repository); err != nil {
ctx.ServerError("UpdateRepoSize", err)
return
}
// the repo's IsEmpty has been updated, redirect to this page to make sure middlewares can get the correct values
link := ctx.Link
if ctx.Req.URL.RawQuery != "" {
link += "?" + ctx.Req.URL.RawQuery
}
ctx.Redirect(link)
func prepareUpstreamDivergingInfo(ctx *context.Context) {
if !ctx.Repo.Repository.IsFork || !ctx.Repo.IsViewBranch || ctx.Repo.TreePath != "" {
return
}
title := ctx.Repo.Repository.Owner.Name + "/" + ctx.Repo.Repository.Name
if len(ctx.Repo.Repository.Description) > 0 {
title += ": " + ctx.Repo.Repository.Description
}
ctx.Data["Title"] = title
// Get Topics of this repo
prepareHomeSidebarRepoTopics(ctx)
if ctx.Written() {
return
}
// Get current entry user currently looking at.
entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath)
upstreamDivergingInfo, err := repo_service.GetUpstreamDivergingInfo(ctx, ctx.Repo.Repository, ctx.Repo.BranchName)
if err != nil {
HandleGitError(ctx, "Repo.Commit.GetTreeEntryByPath", err)
return
}
checkOutdatedBranch(ctx)
if entry.IsDir() {
prepareToRenderDirectory(ctx)
} else {
renderFile(ctx, entry)
}
if ctx.Written() {
if !errors.Is(err, util.ErrNotExist) && !errors.Is(err, util.ErrInvalidArgument) {
log.Error("GetUpstreamDivergingInfo: %v", err)
}
return
}
ctx.Data["UpstreamDivergingInfo"] = upstreamDivergingInfo
}
func prepareRecentlyPushedNewBranches(ctx *context.Context) {
if ctx.Doer != nil {
if err := ctx.Repo.Repository.GetBaseRepo(ctx); err != nil {
ctx.ServerError("GetBaseRepo", err)
@ -280,7 +221,112 @@ func renderHomeCode(ctx *context.Context) {
}
}
}
}
func handleRepoEmptyOrBroken(ctx *context.Context) {
showEmpty := true
var err error
if ctx.Repo.GitRepo != nil {
showEmpty, err = ctx.Repo.GitRepo.IsEmpty()
if err != nil {
log.Error("GitRepo.IsEmpty: %v", err)
ctx.Repo.Repository.Status = repo_model.RepositoryBroken
showEmpty = true
ctx.Flash.Error(ctx.Tr("error.occurred"), true)
}
}
if showEmpty {
ctx.HTML(http.StatusOK, tplRepoEMPTY)
return
}
// the repo is not really empty, so we should update the modal in database
// such problem may be caused by:
// 1) an error occurs during pushing/receiving. 2) the user replaces an empty git repo manually
// and even more: the IsEmpty flag is deeply broken and should be removed with the UI changed to manage to cope with empty repos.
// it's possible for a repository to be non-empty by that flag but still 500
// because there are no branches - only tags -or the default branch is non-extant as it has been 0-pushed.
ctx.Repo.Repository.IsEmpty = false
if err = repo_model.UpdateRepositoryCols(ctx, ctx.Repo.Repository, "is_empty"); err != nil {
ctx.ServerError("UpdateRepositoryCols", err)
return
}
if err = repo_module.UpdateRepoSize(ctx, ctx.Repo.Repository); err != nil {
ctx.ServerError("UpdateRepoSize", err)
return
}
// the repo's IsEmpty has been updated, redirect to this page to make sure middlewares can get the correct values
link := ctx.Link
if ctx.Req.URL.RawQuery != "" {
link += "?" + ctx.Req.URL.RawQuery
}
ctx.Redirect(link)
}
func prepareToRenderDirOrFile(entry *git.TreeEntry) func(ctx *context.Context) {
return func(ctx *context.Context) {
if entry.IsDir() {
prepareToRenderDirectory(ctx)
} else {
prepareToRenderFile(ctx, entry)
}
}
}
func handleRepoHomeFeed(ctx *context.Context) bool {
if setting.Other.EnableFeed {
isFeed, _, showFeedType := feed.GetFeedType(ctx.PathParam(":reponame"), ctx.Req)
if isFeed {
switch {
case ctx.Link == fmt.Sprintf("%s.%s", ctx.Repo.RepoLink, showFeedType):
feed.ShowRepoFeed(ctx, ctx.Repo.Repository, showFeedType)
case ctx.Repo.TreePath == "":
feed.ShowBranchFeed(ctx, ctx.Repo.Repository, showFeedType)
case ctx.Repo.TreePath != "":
feed.ShowFileFeed(ctx, ctx.Repo.Repository, showFeedType)
}
return true
}
}
return false
}
// Home render repository home page
func Home(ctx *context.Context) {
if handleRepoHomeFeed(ctx) {
return
}
// Check whether the repo is viewable: not in migration, and the code unit should be enabled
// Ideally the "feed" logic should be after this, but old code did so, so keep it as-is.
checkHomeCodeViewable(ctx)
if ctx.Written() {
return
}
title := ctx.Repo.Repository.Owner.Name + "/" + ctx.Repo.Repository.Name
if len(ctx.Repo.Repository.Description) > 0 {
title += ": " + ctx.Repo.Repository.Description
}
ctx.Data["Title"] = title
ctx.Data["PageIsViewCode"] = true
ctx.Data["RepositoryUploadEnabled"] = setting.Repository.Upload.Enabled // show New File / Upload File buttons
if ctx.Repo.Commit == nil || ctx.Repo.Repository.IsEmpty || ctx.Repo.Repository.IsBroken() {
// empty or broken repositories need to be handled differently
handleRepoEmptyOrBroken(ctx)
return
}
// get the current git entry which doer user is currently looking at.
entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath)
if err != nil {
HandleGitError(ctx, "Repo.Commit.GetTreeEntryByPath", err)
return
}
// prepare the tree path
var treeNames, paths []string
branchLink := ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchNameSubURL()
treeLink := branchLink
@ -295,57 +341,38 @@ func renderHomeCode(ctx *context.Context) {
ctx.Data["ParentPath"] = "/" + paths[len(paths)-2]
}
}
isTreePathRoot := ctx.Repo.TreePath == ""
if isTreePathRoot {
prepareHomeSidebarLicenses(ctx)
if ctx.Written() {
return
}
prepareHomeSidebarCitationFile(ctx, entry)
if ctx.Written() {
return
}
prepareHomeSidebarLanguageStats(ctx)
if ctx.Written() {
return
}
prepareHomeSidebarLatestRelease(ctx)
if ctx.Written() {
return
}
}
ctx.Data["Paths"] = paths
ctx.Data["TreeLink"] = treeLink
ctx.Data["TreeNames"] = treeNames
ctx.Data["BranchLink"] = branchLink
ctx.HTML(http.StatusOK, tplRepoHome)
}
// Home render repository home page
func Home(ctx *context.Context) {
if setting.Other.EnableFeed {
isFeed, _, showFeedType := feed.GetFeedType(ctx.PathParam(":reponame"), ctx.Req)
if isFeed {
switch {
case ctx.Link == fmt.Sprintf("%s.%s", ctx.Repo.RepoLink, showFeedType):
feed.ShowRepoFeed(ctx, ctx.Repo.Repository, showFeedType)
case ctx.Repo.TreePath == "":
feed.ShowBranchFeed(ctx, ctx.Repo.Repository, showFeedType)
case ctx.Repo.TreePath != "":
feed.ShowFileFeed(ctx, ctx.Repo.Repository, showFeedType)
}
// some UI components are only shown when the tree path is root
isTreePathRoot := ctx.Repo.TreePath == ""
prepareFuncs := []func(*context.Context){
prepareOpenWithEditorApps,
prepareHomeSidebarRepoTopics,
checkOutdatedBranch,
prepareToRenderDirOrFile(entry),
prepareRecentlyPushedNewBranches,
}
if isTreePathRoot {
prepareFuncs = append(prepareFuncs,
prepareUpstreamDivergingInfo,
prepareHomeSidebarLicenses,
prepareHomeSidebarCitationFile(entry),
prepareHomeSidebarLanguageStats,
prepareHomeSidebarLatestRelease,
)
}
for _, prepare := range prepareFuncs {
prepare(ctx)
if ctx.Written() {
return
}
}
checkHomeCodeViewable(ctx)
if ctx.Written() {
return
}
renderHomeCode(ctx)
ctx.HTML(http.StatusOK, tplRepoHome)
}

View File

@ -4,7 +4,9 @@
package user
import (
"context"
"slices"
"strconv"
"code.gitea.io/gitea/models/user"
)
@ -24,3 +26,22 @@ func MakeSelfOnTop(doer *user.User, users []*user.User) []*user.User {
}
return users
}
// GetFilterUserIDByName tries to get the user ID from the given username.
// Before, the "issue filter" passes user ID to query the list, but in many cases, it's impossible to pre-fetch the full user list.
// So it's better to make it work like GitHub: users could input username directly.
// Since it only converts the username to ID directly and is only used internally (to search issues), so no permission check is needed.
// Old usage: poster=123, new usage: poster=the-username (at the moment, non-existing username is treated as poster=0, not ideal but acceptable)
func GetFilterUserIDByName(ctx context.Context, name string) int64 {
if name == "" {
return 0
}
u, err := user.GetUserByName(ctx, name)
if err != nil {
if id, err := strconv.ParseInt(name, 10, 64); err == nil {
return id
}
return 0
}
return u.ID
}

View File

@ -31,7 +31,9 @@ import (
"code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/optional"
"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/shared/user"
"code.gitea.io/gitea/services/context"
feed_service "code.gitea.io/gitea/services/feed"
issue_service "code.gitea.io/gitea/services/issue"
@ -375,16 +377,8 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
return
}
var (
viewType string
sortType = ctx.FormString("sort")
filterMode int
)
// Default to recently updated, unlike repository issues list
if sortType == "" {
sortType = "recentupdate"
}
sortType := util.IfZero(ctx.FormString("sort"), "recentupdate")
// --------------------------------------------------------------------------------
// Distinguish User from Organization.
@ -399,7 +393,8 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
// TODO: distinguish during routing
viewType = ctx.FormString("type")
viewType := ctx.FormString("type")
var filterMode int
switch viewType {
case "assigned":
filterMode = issues_model.FilterModeAssign
@ -443,6 +438,14 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
Team: team,
User: ctx.Doer,
}
// Get filter by author id & assignee id
// FIXME: this feature doesn't work at the moment, because frontend can't use a "user-remote-search" dropdown directly
// the existing "/posters" handlers doesn't work for this case, it is unable to list the related users correctly.
// In the future, we need something like github: "author:user1" to accept usernames directly.
posterUsername := ctx.FormString("poster")
opts.PosterID = user.GetFilterUserIDByName(ctx, posterUsername)
// TODO: "assignee" should also use GetFilterUserIDByName in the future to support usernames directly
opts.AssigneeID, _ = strconv.ParseInt(ctx.FormString("assignee"), 10, 64)
isFuzzy := ctx.FormBool("fuzzy")
@ -573,8 +576,22 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
// -------------------------------
// Fill stats to post to ctx.Data.
// -------------------------------
issueStats, err := getUserIssueStats(ctx, ctxUser, filterMode, issue_indexer.ToSearchOptions(keyword, opts).Copy(
func(o *issue_indexer.SearchOptions) { o.IsFuzzyKeyword = isFuzzy },
issueStats, err := getUserIssueStats(ctx, filterMode, issue_indexer.ToSearchOptions(keyword, opts).Copy(
func(o *issue_indexer.SearchOptions) {
o.IsFuzzyKeyword = isFuzzy
// If the doer is the same as the context user, which means the doer is viewing his own dashboard,
// it's not enough to show the repos that the doer owns or has been explicitly granted access to,
// because the doer may create issues or be mentioned in any public repo.
// So we need search issues in all public repos.
o.AllPublic = ctx.Doer.ID == ctxUser.ID
// TODO: to make it work with poster/assignee filter, then these IDs should be kept
o.AssigneeID = nil
o.PosterID = nil
o.MentionID = nil
o.ReviewRequestedID = nil
o.ReviewedID = nil
},
))
if err != nil {
ctx.ServerError("getUserIssueStats", err)
@ -630,6 +647,8 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
ctx.Data["IsShowClosed"] = isShowClosed
ctx.Data["SelectLabels"] = selectedLabels
ctx.Data["IsFuzzy"] = isFuzzy
ctx.Data["SearchFilterPosterID"] = util.Iif[any](opts.PosterID != 0, opts.PosterID, nil)
ctx.Data["SearchFilterAssigneeID"] = util.Iif[any](opts.AssigneeID != 0, opts.AssigneeID, nil)
if isShowClosed {
ctx.Data["State"] = "closed"
@ -643,7 +662,11 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
pager.AddParamString("sort", sortType)
pager.AddParamString("state", fmt.Sprint(ctx.Data["State"]))
pager.AddParamString("labels", selectedLabels)
pager.AddParamString("fuzzy", fmt.Sprintf("%v", isFuzzy))
pager.AddParamString("fuzzy", fmt.Sprint(isFuzzy))
pager.AddParamString("poster", posterUsername)
if opts.AssigneeID != 0 {
pager.AddParamString("assignee", fmt.Sprint(opts.AssigneeID))
}
ctx.Data["Page"] = pager
ctx.HTML(http.StatusOK, tplIssues)
@ -768,27 +791,10 @@ func UsernameSubRoute(ctx *context.Context) {
}
}
func getUserIssueStats(ctx *context.Context, ctxUser *user_model.User, filterMode int, opts *issue_indexer.SearchOptions) (*issues_model.IssueStats, error) {
func getUserIssueStats(ctx *context.Context, filterMode int, opts *issue_indexer.SearchOptions) (ret *issues_model.IssueStats, err error) {
ret = &issues_model.IssueStats{}
doerID := ctx.Doer.ID
opts = opts.Copy(func(o *issue_indexer.SearchOptions) {
// If the doer is the same as the context user, which means the doer is viewing his own dashboard,
// it's not enough to show the repos that the doer owns or has been explicitly granted access to,
// because the doer may create issues or be mentioned in any public repo.
// So we need search issues in all public repos.
o.AllPublic = doerID == ctxUser.ID
o.AssigneeID = nil
o.PosterID = nil
o.MentionID = nil
o.ReviewRequestedID = nil
o.ReviewedID = nil
})
var (
err error
ret = &issues_model.IssueStats{}
)
{
openClosedOpts := opts.Copy()
switch filterMode {

View File

@ -1320,6 +1320,7 @@ func registerRoutes(m *web.Router) {
m.Post("/delete", repo.DeleteBranchPost)
m.Post("/restore", repo.RestoreBranchPost)
m.Post("/rename", web.Bind(forms.RenameBranchForm{}), repo_setting.RenameBranchPost)
m.Post("/merge-upstream", repo.MergeUpstream)
}, context.RepoMustNotBeArchived(), reqRepoCodeWriter, repo.MustBeNotEmpty)
m.Combo("/fork").Get(repo.Fork).Post(web.Bind(forms.CreateRepoForm{}), repo.ForkPost)

View File

@ -65,7 +65,9 @@ func Update(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.
return fmt.Errorf("unable to load HeadRepo for PR[%d] during update-by-merge: %w", pr.ID, err)
}
// use merge functions but switch repos and branches
// TODO: FakePR: it is somewhat hacky, but it is the only way to "merge" at the moment
// ideally in the future the "merge" functions should be refactored to decouple from the PullRequest
// now use a fake reverse PR to switch head&base repos/branches
reversePR := &issues_model.PullRequest{
ID: pr.ID,

View File

@ -0,0 +1,115 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package repository
import (
"context"
"fmt"
git_model "code.gitea.io/gitea/models/git"
issue_model "code.gitea.io/gitea/models/issues"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/services/pull"
)
type UpstreamDivergingInfo struct {
BaseIsNewer bool
CommitsBehind int
CommitsAhead int
}
func MergeUpstream(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, branch string) (mergeStyle string, err error) {
if err = repo.MustNotBeArchived(); err != nil {
return "", err
}
if err = repo.GetBaseRepo(ctx); err != nil {
return "", err
}
err = git.Push(ctx, repo.BaseRepo.RepoPath(), git.PushOptions{
Remote: repo.RepoPath(),
Branch: fmt.Sprintf("%s:%s", branch, branch),
Env: repo_module.PushingEnvironment(doer, repo),
})
if err == nil {
return "fast-forward", nil
}
if !git.IsErrPushOutOfDate(err) && !git.IsErrPushRejected(err) {
return "", err
}
// TODO: FakePR: it is somewhat hacky, but it is the only way to "merge" at the moment
// ideally in the future the "merge" functions should be refactored to decouple from the PullRequest
fakeIssue := &issue_model.Issue{
ID: -1,
RepoID: repo.ID,
Repo: repo,
Index: -1,
PosterID: doer.ID,
Poster: doer,
IsPull: true,
}
fakePR := &issue_model.PullRequest{
ID: -1,
Status: issue_model.PullRequestStatusMergeable,
IssueID: -1,
Issue: fakeIssue,
Index: -1,
HeadRepoID: repo.ID,
HeadRepo: repo,
BaseRepoID: repo.BaseRepo.ID,
BaseRepo: repo.BaseRepo,
HeadBranch: branch, // maybe HeadCommitID is not needed
BaseBranch: branch,
}
fakeIssue.PullRequest = fakePR
err = pull.Update(ctx, fakePR, doer, "merge upstream", false)
if err != nil {
return "", err
}
return "merge", nil
}
func GetUpstreamDivergingInfo(ctx context.Context, repo *repo_model.Repository, branch string) (*UpstreamDivergingInfo, error) {
if !repo.IsFork {
return nil, util.NewInvalidArgumentErrorf("repo is not a fork")
}
if repo.IsArchived {
return nil, util.NewInvalidArgumentErrorf("repo is archived")
}
if err := repo.GetBaseRepo(ctx); err != nil {
return nil, err
}
forkBranch, err := git_model.GetBranch(ctx, repo.ID, branch)
if err != nil {
return nil, err
}
baseBranch, err := git_model.GetBranch(ctx, repo.BaseRepo.ID, branch)
if err != nil {
return nil, err
}
info := &UpstreamDivergingInfo{}
if forkBranch.CommitID == baseBranch.CommitID {
return info, nil
}
// TODO: if the fork repo has new commits, this call will fail:
// exit status 128 - fatal: Invalid symmetric difference expression aaaaaaaaaaaa...bbbbbbbbbbbb
// so at the moment, we are not able to handle this case, should be improved in the future
diff, err := git.GetDivergingCommits(ctx, repo.BaseRepo.RepoPath(), baseBranch.CommitID, forkBranch.CommitID)
if err != nil {
info.BaseIsNewer = baseBranch.UpdatedUnix > forkBranch.UpdatedUnix
return info, nil
}
info.CommitsBehind, info.CommitsAhead = diff.Behind, diff.Ahead
return info, nil
}

View File

@ -1,15 +1,13 @@
{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings labels")}}
<div class="org-setting-content">
<div class="tw-flex tw-items-center">
<div class="tw-flex-1">
{{ctx.Locale.Tr "org.settings.labels_desc"}}
</div>
<button class="ui small primary new-label button">{{ctx.Locale.Tr "repo.issues.new_label"}}</button>
</div>
<div class="divider"></div>
{{template "repo/issue/labels/label_new" .}}
{{template "repo/issue/labels/label_list" .}}
</div>
{{template "repo/issue/labels/edit_delete_label" .}}
<div class="org-setting-content">
<div class="tw-flex tw-items-center">
<div class="tw-flex-1">
{{ctx.Locale.Tr "org.settings.labels_desc"}}
</div>
<button class="ui small primary new-label button">{{ctx.Locale.Tr "repo.issues.new_label"}}</button>
</div>
<div class="divider"></div>
{{template "repo/issue/labels/label_list" .}}
{{template "repo/issue/labels/label_edit_modal" .}}
</div>
{{template "org/settings/layout_footer" .}}

View File

@ -36,10 +36,11 @@
{{range .Labels}}
{{$exclusiveScope := .ExclusiveScope}}
{{if and (ne $previousExclusiveScope $exclusiveScope)}}
<div class="divider"></div>
<div class="divider" data-scope="{{.ExclusiveScope}}"></div>
{{end}}
{{$previousExclusiveScope = $exclusiveScope}}
<a class="item label-filter-item tw-flex tw-items-center" {{if .IsArchived}}data-is-archived{{end}} href="?labels={{.QueryString}}&assignee={{$.AssigneeID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}" data-label-id="{{.ID}}">
<a class="item label-filter-item tw-flex tw-items-center" data-label-id="{{.ID}}" data-scope="{{.ExclusiveScope}}" {{if .IsArchived}}data-is-archived{{end}}
href="?labels={{.QueryString}}&assignee={{$.AssigneeID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">
{{if .IsExcluded}}
{{svg "octicon-circle-slash"}}
{{else if .IsSelected}}

View File

@ -0,0 +1,18 @@
{{if and .UpstreamDivergingInfo (or .UpstreamDivergingInfo.BaseIsNewer .UpstreamDivergingInfo.CommitsBehind)}}
<div class="ui message flex-text-block">
<div class="tw-flex-1">
{{$upstreamLink := printf "%s/src/branch/%s" .Repository.BaseRepo.Link (.BranchName|PathEscapeSegments)}}
{{$upstreamHtml := HTMLFormat `<a href="%s">%s:%s</a>` $upstreamLink .Repository.BaseRepo.FullName .BranchName}}
{{if .UpstreamDivergingInfo.CommitsBehind}}
{{ctx.Locale.TrN .UpstreamDivergingInfo.CommitsBehind "repo.pulls.upstream_diverging_prompt_behind_1" "repo.pulls.upstream_diverging_prompt_behind_n" .UpstreamDivergingInfo.CommitsBehind $upstreamHtml}}
{{else}}
{{ctx.Locale.Tr "repo.pulls.upstream_diverging_prompt_base_newer" $upstreamHtml}}
{{end}}
</div>
{{if .CanWriteCode}}
<button class="ui compact green button tw-m-0 link-action" data-url="{{.Repository.Link}}/branches/merge-upstream?branch={{.BranchName}}">
{{ctx.Locale.Tr "repo.pulls.upstream_diverging_merge"}}
</button>
{{end}}
</div>
{{end}}

View File

@ -102,7 +102,8 @@
{{end}}
</div>
<div class="repo-button-row-right">
{{/* by default, the row-right flex grows, but on non-root tree path, it should not because the row-left might contain a long path */}}
<div class="repo-button-row-right {{if not $isTreePathRoot}}tw-flex-grow-0{{end}}">
<!-- Only show clone panel in repository home page -->
{{if $isTreePathRoot}}
<div class="clone-panel ui action tiny input">
@ -122,7 +123,6 @@
</button>
{{template "repo/clone_script" .}}{{/* the script will update `.js-clone-url` and related elements */}}
</div>
{{template "repo/cite/cite_modal" .}}
{{end}}
{{if and (not $isTreePathRoot) (not .IsViewFile) (not .IsBlame)}}{{/* IsViewDirectory (not home), TODO: split the templates, avoid using "if" tricks */}}
<a class="ui button" href="{{.RepoLink}}/commits/{{.BranchNameSubURL}}/{{.TreePath | PathEscapeSegments}}">
@ -136,6 +136,9 @@
{{else if .IsBlame}}
{{template "repo/blame" .}}
{{else}}{{/* IsViewDirectory */}}
{{if $isTreePathRoot}}
{{template "repo/code/upstream_diverging_info" .}}
{{end}}
{{template "repo/view_list" .}}
{{end}}
</div>

View File

@ -43,22 +43,23 @@
{{end}}
{{if .ReadmeExist}}
<div class="flex-item-body tw-mt-2">
<a class="tw-flex tw-items-center tw-gap-2 muted" href="{{.TreeLink}}/{{.FileName}}">
{{svg "octicon-book"}}{{ctx.Locale.Tr "readme"}}
<a class="flex-text-block muted" href="{{.TreeLink}}/{{.FileName}}">
{{svg "octicon-book"}} {{ctx.Locale.Tr "readme"}}
</a>
</div>
{{end}}
{{if .DetectedRepoLicenses}}
<div class="flex-item-body">
<a class="tw-flex tw-items-center tw-gap-2 muted" href="{{.RepoLink}}/src/{{.Repository.DefaultBranch}}/{{PathEscapeSegments .LicenseFileName}}" title="{{StringUtils.Join .DetectedRepoLicenses ", "}}">
{{svg "octicon-law"}}{{if eq (len .DetectedRepoLicenses) 1}}{{index .DetectedRepoLicenses 0}}{{else}}{{ctx.Locale.Tr "repo.multiple_licenses"}}{{end}}
<a class="flex-text-block muted" href="{{.RepoLink}}/src/{{.Repository.DefaultBranch}}/{{PathEscapeSegments .LicenseFileName}}" title="{{StringUtils.Join .DetectedRepoLicenses ", "}}">
{{svg "octicon-law"}} {{if eq (len .DetectedRepoLicenses) 1}}{{index .DetectedRepoLicenses 0}}{{else}}{{ctx.Locale.Tr "repo.multiple_licenses"}}{{end}}
</a>
</div>
{{end}}
{{if .CitiationExist}}
<div class="flex-item-body">
<a class="tw-flex tw-items-center tw-gap-2 muted" id="cite-repo-button">
{{svg "octicon-cross-reference"}}{{ctx.Locale.Tr "repo.cite_this_repo"}}
{{template "repo/cite/cite_modal" .}}
<a class="flex-text-block muted" id="cite-repo-button">
{{svg "octicon-cross-reference"}} {{ctx.Locale.Tr "repo.cite_this_repo"}}
</a>
</div>
{{end}}

View File

@ -1,3 +1,4 @@
{{$queryLink := QueryBuild "?" "q" $.Keyword "type" $.ViewType "sort" $.SortType "state" $.State "labels" $.SelectLabels "milestone" $.MilestoneID "project" $.ProjectID "assignee" $.AssigneeID "poster" $.PosterUsername "archived" (Iif $.ShowArchivedLabels NIL)}}
<!-- Label -->
<div class="ui {{if not .Labels}}disabled{{end}} dropdown jump item label-filter">
<span class="text">
@ -23,16 +24,17 @@
</div>
<span class="info">{{ctx.Locale.Tr "repo.issues.filter_label_exclude"}}</span>
<div class="divider"></div>
<a class="{{if .AllLabels}}active selected {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_label_no_select"}}</a>
<a class="{{if .NoLabel}}active selected {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels=0&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_label_select_no_label"}}</a>
<a class="{{if .AllLabels}}active selected {{end}}item" href="{{QueryBuild $queryLink "labels" NIL}}">{{ctx.Locale.Tr "repo.issues.filter_label_no_select"}}</a>
<a class="{{if .NoLabel}}active selected {{end}}item" href="{{QueryBuild $queryLink "labels" 0}}">{{ctx.Locale.Tr "repo.issues.filter_label_select_no_label"}}</a>
{{$previousExclusiveScope := "_no_scope"}}
{{range .Labels}}
{{$exclusiveScope := .ExclusiveScope}}
{{if and (ne $previousExclusiveScope $exclusiveScope)}}
<div class="divider"></div>
<div class="divider" data-scope="{{.ExclusiveScope}}"></div>
{{end}}
{{$previousExclusiveScope = $exclusiveScope}}
<a class="item label-filter-item tw-flex tw-items-center" {{if .IsArchived}}data-is-archived{{end}} href="?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.QueryString}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}" data-label-id="{{.ID}}">
<a class="item label-filter-item tw-flex tw-items-center" data-label-id="{{.ID}}" data-scope="{{.ExclusiveScope}}" {{if .IsArchived}}data-is-archived{{end}}
href="{{QueryBuild $queryLink "labels" .QueryString}}">
{{if .IsExcluded}}
{{svg "octicon-circle-slash"}}
{{else if .IsSelected}}
@ -62,13 +64,13 @@
<input type="text" placeholder="{{ctx.Locale.Tr "repo.issues.filter_milestone"}}">
</div>
<div class="divider"></div>
<a class="{{if not $.MilestoneID}}active selected {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone=0&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_milestone_all"}}</a>
<a class="{{if $.MilestoneID}}{{if eq $.MilestoneID -1}}active selected {{end}}{{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone=-1&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_milestone_none"}}</a>
<a class="{{if not $.MilestoneID}}active selected {{end}}item" href="{{QueryBuild $queryLink "milestone" 0}}">{{ctx.Locale.Tr "repo.issues.filter_milestone_all"}}</a>
<a class="{{if $.MilestoneID}}{{if eq $.MilestoneID -1}}active selected {{end}}{{end}}item" href="{{QueryBuild $queryLink "milestone" -1}}">{{ctx.Locale.Tr "repo.issues.filter_milestone_none"}}</a>
{{if .OpenMilestones}}
<div class="divider"></div>
<div class="header">{{ctx.Locale.Tr "repo.issues.filter_milestone_open"}}</div>
{{range .OpenMilestones}}
<a class="{{if $.MilestoneID}}{{if eq $.MilestoneID .ID}}active selected {{end}}{{end}}item" href="?type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{$.SelectLabels}}&milestone={{.ID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">
<a class="{{if $.MilestoneID}}{{if eq $.MilestoneID .ID}}active selected {{end}}{{end}}item" href="{{QueryBuild $queryLink "milestone" .ID}}">
{{svg "octicon-milestone" 16 "mr-2"}}
{{.Name}}
</a>
@ -78,7 +80,7 @@
<div class="divider"></div>
<div class="header">{{ctx.Locale.Tr "repo.issues.filter_milestone_closed"}}</div>
{{range .ClosedMilestones}}
<a class="{{if $.MilestoneID}}{{if eq $.MilestoneID .ID}}active selected {{end}}{{end}}item" href="?type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{$.SelectLabels}}&milestone={{.ID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">
<a class="{{if $.MilestoneID}}{{if eq $.MilestoneID .ID}}active selected {{end}}{{end}}item" href="{{QueryBuild $queryLink "milestone" .ID}}">
{{svg "octicon-milestone" 16 "mr-2"}}
{{.Name}}
</a>
@ -99,15 +101,15 @@
<i class="icon">{{svg "octicon-search" 16}}</i>
<input type="text" placeholder="{{ctx.Locale.Tr "repo.issues.filter_project"}}">
</div>
<a class="{{if not .ProjectID}}active selected {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_project_all"}}</a>
<a class="{{if eq .ProjectID -1}}active selected {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&project=-1&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_project_none"}}</a>
<a class="{{if not .ProjectID}}active selected {{end}}item" href="{{QueryBuild $queryLink "project" NIL}}">{{ctx.Locale.Tr "repo.issues.filter_project_all"}}</a>
<a class="{{if eq .ProjectID -1}}active selected {{end}}item" href="{{QueryBuild $queryLink "project" -1}}">{{ctx.Locale.Tr "repo.issues.filter_project_none"}}</a>
{{if .OpenProjects}}
<div class="divider"></div>
<div class="header">
{{ctx.Locale.Tr "repo.issues.new.open_projects"}}
</div>
{{range .OpenProjects}}
<a class="{{if $.ProjectID}}{{if eq $.ProjectID .ID}}active selected{{end}}{{end}} item tw-flex" href="?type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{$.SelectLabels}}&milestone={{$.MilestoneID}}&project={{.ID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">
<a class="{{if $.ProjectID}}{{if eq $.ProjectID .ID}}active selected{{end}}{{end}} item tw-flex" href="{{QueryBuild $queryLink "project" .ID}}">
{{svg .IconName 18 "tw-mr-2 tw-shrink-0"}}<span class="gt-ellipsis">{{.Title}}</span>
</a>
{{end}}
@ -118,7 +120,7 @@
{{ctx.Locale.Tr "repo.issues.new.closed_projects"}}
</div>
{{range .ClosedProjects}}
<a class="{{if $.ProjectID}}{{if eq $.ProjectID .ID}}active selected{{end}}{{end}} item" href="?type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{$.SelectLabels}}&milestone={{$.MilestoneID}}&project={{.ID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">
<a class="{{if $.ProjectID}}{{if eq $.ProjectID .ID}}active selected{{end}}{{end}} item" href="{{QueryBuild $queryLink "project" .ID}}">
{{svg .IconName 18 "tw-mr-2"}}{{.Title}}
</a>
{{end}}
@ -130,7 +132,7 @@
<div class="ui dropdown jump item user-remote-search" data-tooltip-content="{{ctx.Locale.Tr "repo.author_search_tooltip"}}"
data-search-url="{{if .Milestone}}{{$.RepoLink}}/issues/posters{{else}}{{$.Link}}/posters{{end}}"
data-selected-user-id="{{$.PosterID}}"
data-action-jump-url="?type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{$.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={user_id}{{if $.ShowArchivedLabels}}&archived=true{{end}}"
data-action-jump-url="{{QueryBuild $queryLink "poster" NIL}}&poster={username}"
>
<span class="text">
{{ctx.Locale.Tr "repo.issues.filter_poster"}}
@ -156,11 +158,11 @@
<i class="icon">{{svg "octicon-search" 16}}</i>
<input type="text" placeholder="{{ctx.Locale.Tr "repo.issues.filter_assignee"}}">
</div>
<a class="{{if not .AssigneeID}}active selected {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_assginee_no_select"}}</a>
<a class="{{if eq .AssigneeID -1}}active selected {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee=-1&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_assginee_no_assignee"}}</a>
<a class="{{if not .AssigneeID}}active selected {{end}}item" href="{{QueryBuild $queryLink "assignee" NIL}}">{{ctx.Locale.Tr "repo.issues.filter_assginee_no_select"}}</a>
<a class="{{if eq .AssigneeID -1}}active selected {{end}}item" href="{{QueryBuild $queryLink "assignee" -1}}">{{ctx.Locale.Tr "repo.issues.filter_assginee_no_assignee"}}</a>
<div class="divider"></div>
{{range .Assignees}}
<a class="{{if eq $.AssigneeID .ID}}active selected{{end}} item tw-flex" href="?type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&labels={{$.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{.ID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">
<a class="{{if eq $.AssigneeID .ID}}active selected{{end}} item tw-flex" href="{{QueryBuild $queryLink "assignee" .ID}}">
{{ctx.AvatarUtils.Avatar . 20}}{{template "repo/search_name" .}}
</a>
{{end}}
@ -175,14 +177,14 @@
</span>
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
<div class="menu">
<a class="{{if eq .ViewType "all"}}active {{end}}item" href="?q={{$.Keyword}}&type=all&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_type.all_issues"}}</a>
<a class="{{if eq .ViewType "assigned"}}active {{end}}item" href="?q={{$.Keyword}}&type=assigned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_type.assigned_to_you"}}</a>
<a class="{{if eq .ViewType "created_by"}}active {{end}}item" href="?q={{$.Keyword}}&type=created_by&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_type.created_by_you"}}</a>
<a class="{{if eq .ViewType "all"}}active {{end}}item" href="{{QueryBuild $queryLink "type" "all"}}">{{ctx.Locale.Tr "repo.issues.filter_type.all_issues"}}</a>
<a class="{{if eq .ViewType "assigned"}}active {{end}}item" href="{{QueryBuild $queryLink "type" "assigned"}}">{{ctx.Locale.Tr "repo.issues.filter_type.assigned_to_you"}}</a>
<a class="{{if eq .ViewType "created_by"}}active {{end}}item" href="{{QueryBuild $queryLink "type" "created_by"}}">{{ctx.Locale.Tr "repo.issues.filter_type.created_by_you"}}</a>
{{if .PageIsPullList}}
<a class="{{if eq .ViewType "review_requested"}}active {{end}}item" href="?q={{$.Keyword}}&type=review_requested&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_type.review_requested"}}</a>
<a class="{{if eq .ViewType "reviewed_by"}}active {{end}}item" href="?q={{$.Keyword}}&type=reviewed_by&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_type.reviewed_by_you"}}</a>
<a class="{{if eq .ViewType "review_requested"}}active {{end}}item" href="{{QueryBuild $queryLink "type" "review_requested"}}">{{ctx.Locale.Tr "repo.issues.filter_type.review_requested"}}</a>
<a class="{{if eq .ViewType "reviewed_by"}}active {{end}}item" href="{{QueryBuild $queryLink "type" "reviewed_by"}}">{{ctx.Locale.Tr "repo.issues.filter_type.reviewed_by_you"}}</a>
{{end}}
<a class="{{if eq .ViewType "mentioned"}}active {{end}}item" href="?q={{$.Keyword}}&type=mentioned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_type.mentioning_you"}}</a>
<a class="{{if eq .ViewType "mentioned"}}active {{end}}item" href="{{QueryBuild $queryLink "type" "mentioned"}}">{{ctx.Locale.Tr "repo.issues.filter_type.mentioning_you"}}</a>
</div>
</div>
{{end}}
@ -194,13 +196,13 @@
</span>
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
<div class="menu">
<a class="{{if or (eq .SortType "latest") (not .SortType)}}active {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort=latest&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_sort.latest"}}</a>
<a class="{{if eq .SortType "oldest"}}active {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort=oldest&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_sort.oldest"}}</a>
<a class="{{if eq .SortType "recentupdate"}}active {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort=recentupdate&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_sort.recentupdate"}}</a>
<a class="{{if eq .SortType "leastupdate"}}active {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort=leastupdate&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_sort.leastupdate"}}</a>
<a class="{{if eq .SortType "mostcomment"}}active {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort=mostcomment&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_sort.mostcomment"}}</a>
<a class="{{if eq .SortType "leastcomment"}}active {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort=leastcomment&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_sort.leastcomment"}}</a>
<a class="{{if eq .SortType "nearduedate"}}active {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort=nearduedate&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_sort.nearduedate"}}</a>
<a class="{{if eq .SortType "farduedate"}}active {{end}}item" href="?q={{$.Keyword}}&type={{$.ViewType}}&sort=farduedate&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}{{if $.ShowArchivedLabels}}&archived=true{{end}}">{{ctx.Locale.Tr "repo.issues.filter_sort.farduedate"}}</a>
<a class="{{if or (eq .SortType "latest") (not .SortType)}}active {{end}}item" href="{{QueryBuild $queryLink "sort" "latest"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.latest"}}</a>
<a class="{{if eq .SortType "oldest"}}active {{end}}item" href="{{QueryBuild $queryLink "sort" "oldest"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.oldest"}}</a>
<a class="{{if eq .SortType "recentupdate"}}active {{end}}item" href="{{QueryBuild $queryLink "sort" "recentupdate"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.recentupdate"}}</a>
<a class="{{if eq .SortType "leastupdate"}}active {{end}}item" href="{{QueryBuild $queryLink "sort" "leastupdate"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.leastupdate"}}</a>
<a class="{{if eq .SortType "mostcomment"}}active {{end}}item" href="{{QueryBuild $queryLink "sort" "mostcomment"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.mostcomment"}}</a>
<a class="{{if eq .SortType "leastcomment"}}active {{end}}item" href="{{QueryBuild $queryLink "sort" "leastcomment"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.leastcomment"}}</a>
<a class="{{if eq .SortType "nearduedate"}}active {{end}}item" href="{{QueryBuild $queryLink "sort" "nearduedate"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.nearduedate"}}</a>
<a class="{{if eq .SortType "farduedate"}}active {{end}}item" href="{{QueryBuild $queryLink "sort" "farduedate"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.farduedate"}}</a>
</div>
</div>

View File

@ -8,15 +8,11 @@
<button class="ui small primary new-label button">{{ctx.Locale.Tr "repo.issues.new_label"}}</button>
{{end}}
</div>
{{if and (or .CanWriteIssues .CanWritePulls) (not .Repository.IsArchived)}}
{{template "repo/issue/labels/label_new" .}}
{{end}}
{{template "base/alert" .}}
{{template "repo/issue/labels/label_list" .}}
</div>
{{if and (or .CanWriteIssues .CanWritePulls) (not .Repository.IsArchived)}}
{{template "repo/issue/labels/label_edit_modal" .}}
{{end}}
</div>
{{if and (or .CanWriteIssues .CanWritePulls) (not .Repository.IsArchived)}}
{{template "repo/issue/labels/edit_delete_label" .}}
{{end}}
{{template "base/footer" .}}

View File

@ -1,22 +1,13 @@
<div class="ui g-modal-confirm delete modal">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.issues.label_deletion"}}
</div>
<div class="ui small modal" id="issue-label-edit-modal"
data-current-page-link="{{$.Link}}"{{/*will be used to construct "new label" and "edit label" URLs*/}}
data-text-new-label="{{ctx.Locale.Tr "repo.issues.new_label"}}"
data-text-edit-label="{{ctx.Locale.Tr "repo.issues.label_modify"}}"
>
<div class="header"></div>
<div class="content">
<p>{{ctx.Locale.Tr "repo.issues.label_deletion_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
<div class="ui small edit-label modal">
<div class="header">
{{ctx.Locale.Tr "repo.issues.label_modify"}}
</div>
<div class="content">
<form class="ui edit-label form ignore-dirty" action="{{$.Link}}/edit" method="post">
<form class="ui form ignore-dirty" method="post">
{{.CsrfTokenHtml}}
<input id="label-modal-id" name="id" type="hidden">
<input name="id" type="hidden">
<div class="required field">
<label for="name">{{ctx.Locale.Tr "repo.issues.label_title"}}</label>
<div class="ui small input">

View File

@ -27,6 +27,8 @@
{{end}}
<ul class="issue-label-list">
{{$canEditLabel := and (not $.PageIsOrgSettingsLabels) (not $.Repository.IsArchived) (or $.CanWriteIssues $.CanWritePulls)}}
{{$canEditLabel = or $canEditLabel $.PageIsOrgSettingsLabels}}
{{range .Labels}}
<li class="item">
<div class="label-title">
@ -43,12 +45,16 @@
<div class="label-operation tw-flex">
{{template "repo/issue/labels/label_archived" .}}
<div class="tw-flex tw-ml-auto">
{{if and (not $.PageIsOrgSettingsLabels) (not $.Repository.IsArchived) (or $.CanWriteIssues $.CanWritePulls)}}
<a class="edit-label-button" href="#" data-id="{{.ID}}" data-title="{{.Name}}" {{if .Exclusive}}data-exclusive{{end}} {{if gt .ArchivedUnix 0}}data-is-archived{{end}} data-num-issues="{{.NumIssues}}" data-description="{{.Description}}" data-color={{.Color}}>{{svg "octicon-pencil"}} {{ctx.Locale.Tr "repo.issues.label_edit"}}</a>
<a class="delete-button" href="#" data-url="{{$.Link}}/delete" data-id="{{.ID}}">{{svg "octicon-trash"}} {{ctx.Locale.Tr "repo.issues.label_delete"}}</a>
{{else if $.PageIsOrgSettingsLabels}}
<a class="edit-label-button" href="#" data-id="{{.ID}}" data-title="{{.Name}}" {{if .Exclusive}}data-exclusive{{end}} {{if gt .ArchivedUnix 0}}data-is-archived{{end}} data-num-issues="{{.NumIssues}}" data-description="{{.Description}}" data-color={{.Color}}>{{svg "octicon-pencil"}} {{ctx.Locale.Tr "repo.issues.label_edit"}}</a>
<a class="delete-button" href="#" data-url="{{$.Link}}/delete" data-id="{{.ID}}">{{svg "octicon-trash"}} {{ctx.Locale.Tr "repo.issues.label_delete"}}</a>
{{if $canEditLabel}}
<a class="edit-label-button" href="#"
data-label-id="{{.ID}}" data-label-name="{{.Name}}" data-label-color="{{.Color}}"
data-label-exclusive="{{.Exclusive}}" data-label-is-archived="{{gt .ArchivedUnix 0}}"
data-label-num-issues="{{.NumIssues}}" data-label-description="{{.Description}}"
>{{svg "octicon-pencil"}} {{ctx.Locale.Tr "repo.issues.label_edit"}}</a>
<a class="link-action" href="#" data-url="{{$.Link}}/delete?id={{.ID}}"
data-modal-confirm-header="{{ctx.Locale.Tr "repo.issues.label_deletion"}}"
data-modal-confirm-content="{{ctx.Locale.Tr "repo.issues.label_deletion_desc"}}"
>{{svg "octicon-trash"}} {{ctx.Locale.Tr "repo.issues.label_delete"}}</a>
{{end}}
</div>
</div>

View File

@ -1,48 +0,0 @@
<div class="ui small new-label modal">
<div class="header">
{{ctx.Locale.Tr "repo.issues.new_label"}}
</div>
<div class="content">
<form class="ui new-label form ignore-dirty" action="{{$.Link}}/new" method="post">
{{.CsrfTokenHtml}}
<div class="required field">
<label for="name">{{ctx.Locale.Tr "repo.issues.label_title"}}</label>
<div class="ui small input">
<input class="label-name-input" name="title" placeholder="{{ctx.Locale.Tr "repo.issues.new_label_placeholder"}}" autofocus required maxlength="50">
</div>
</div>
<div class="field label-exclusive-input-field">
<div class="ui checkbox">
<input class="label-exclusive-input" name="exclusive" type="checkbox">
<label>{{ctx.Locale.Tr "repo.issues.label_exclusive"}}</label>
</div>
<br>
<small class="desc">{{ctx.Locale.Tr "repo.issues.label_exclusive_desc"}}</small>
</div>
<div class="field">
<label for="description">{{ctx.Locale.Tr "repo.issues.label_description"}}</label>
<div class="ui small fluid input">
<input class="label-desc-input" name="description" placeholder="{{ctx.Locale.Tr "repo.issues.new_label_desc_placeholder"}}" maxlength="200">
</div>
</div>
<div class="field color-field">
<label for="color">{{ctx.Locale.Tr "repo.issues.label_color"}}</label>
<div class="js-color-picker-input column">
<input name="color" value="#70c24a" placeholder="#c320f6" required maxlength="7">
{{template "repo/issue/label_precolors"}}
</div>
</div>
</form>
</div>
<div class="actions">
<button class="ui cancel button">
{{svg "octicon-x"}}
{{ctx.Locale.Tr "cancel"}}
</button>
<button class="ui primary ok button">
{{svg "octicon-check"}}
{{ctx.Locale.Tr "repo.issues.create_label"}}
</button>
</div>
</div>

View File

@ -7,7 +7,7 @@
<input type="hidden" name="milestone" value="{{$.MilestoneID}}">
<input type="hidden" name="project" value="{{$.ProjectID}}">
<input type="hidden" name="assignee" value="{{$.AssigneeID}}">
<input type="hidden" name="poster" value="{{$.PosterID}}">
<input type="hidden" name="poster" value="{{$.PosterUsername}}">
{{end}}
{{template "shared/search/input" dict "Value" .Keyword}}
{{if .PageIsIssueList}}

View File

@ -22,7 +22,7 @@
{{range $data.RepoLabels}}
{{$exclusiveScope := .ExclusiveScope}}
{{if and (ne $previousExclusiveScope "_no_scope") (ne $previousExclusiveScope $exclusiveScope)}}
<div class="divider"></div>
<div class="divider" data-scope="{{.ExclusiveScope}}"></div>
{{end}}
{{$previousExclusiveScope = $exclusiveScope}}
{{template "repo/issue/sidebar/label_list_item" dict "Label" .}}
@ -32,7 +32,7 @@
{{range $data.OrgLabels}}
{{$exclusiveScope := .ExclusiveScope}}
{{if and (ne $previousExclusiveScope "_no_scope") (ne $previousExclusiveScope $exclusiveScope)}}
<div class="divider"></div>
<div class="divider" data-scope="{{.ExclusiveScope}}"></div>
{{end}}
{{$previousExclusiveScope = $exclusiveScope}}
{{template "repo/issue/sidebar/label_list_item" dict "Label" .}}

View File

@ -4,45 +4,48 @@
<div class="ui container">
{{template "base/alert" .}}
<div class="flex-container">
{{$queryLink := QueryBuild "?" "type" $.ViewType "sort" $.SortType "state" $.State "q" $.Keyword "fuzzy" $.IsFuzzy}}
<div class="flex-container-nav">
<div class="ui secondary vertical filter menu tw-bg-transparent">
<a class="{{if eq .ViewType "your_repositories"}}active{{end}} item" href="?type=your_repositories&sort={{$.SortType}}&state={{.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">
<a class="{{if eq .ViewType "your_repositories"}}active{{end}} item" href="{{QueryBuild $queryLink "type" "your_repositories"}}">
{{ctx.Locale.Tr "home.issues.in_your_repos"}}
<strong>{{CountFmt .IssueStats.YourRepositoriesCount}}</strong>
</a>
<a class="{{if eq .ViewType "assigned"}}active{{end}} item" href="?type=assigned&sort={{$.SortType}}&state={{.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">
<a class="{{if eq .ViewType "assigned"}}active{{end}} item" href="{{QueryBuild $queryLink "type" "assigned"}}">
{{ctx.Locale.Tr "repo.issues.filter_type.assigned_to_you"}}
<strong>{{CountFmt .IssueStats.AssignCount}}</strong>
</a>
<a class="{{if eq .ViewType "created_by"}}active{{end}} item" href="?type=created_by&sort={{$.SortType}}&state={{.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">
<a class="{{if eq .ViewType "created_by"}}active{{end}} item" href="{{QueryBuild $queryLink "type" "created_by"}}">
{{ctx.Locale.Tr "repo.issues.filter_type.created_by_you"}}
<strong>{{CountFmt .IssueStats.CreateCount}}</strong>
</a>
{{if .PageIsPulls}}
<a class="{{if eq .ViewType "review_requested"}}active{{end}} item" href="?type=review_requested&sort={{$.SortType}}&state={{.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">
<a class="{{if eq .ViewType "review_requested"}}active{{end}} item" href="{{QueryBuild $queryLink "type" "review_requested"}}">
{{ctx.Locale.Tr "repo.issues.filter_type.review_requested"}}
<strong>{{CountFmt .IssueStats.ReviewRequestedCount}}</strong>
</a>
<a class="{{if eq .ViewType "reviewed_by"}}active{{end}} item" href="?type=reviewed_by&sort={{$.SortType}}&state={{.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">
<a class="{{if eq .ViewType "reviewed_by"}}active{{end}} item" href="{{QueryBuild $queryLink "type" "reviewed_by"}}">
{{ctx.Locale.Tr "repo.issues.filter_type.reviewed_by_you"}}
<strong>{{CountFmt .IssueStats.ReviewedCount}}</strong>
</a>
{{end}}
<a class="{{if eq .ViewType "mentioned"}}active{{end}} item" href="?type=mentioned&sort={{$.SortType}}&state={{.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">
<a class="{{if eq .ViewType "mentioned"}}active{{end}} item" href="{{QueryBuild $queryLink "type" "mentioned"}}">
{{ctx.Locale.Tr "repo.issues.filter_type.mentioning_you"}}
<strong>{{CountFmt .IssueStats.MentionCount}}</strong>
</a>
</div>
</div>
{{$queryLinkWithFilter := QueryBuild $queryLink "poster" $.SearchFilterPosterUsername "assignee" $.SearchFilterAssigneeID}}
<div class="flex-container-main content">
<div class="list-header">
<div class="small-menu-items ui compact tiny menu list-header-toggle">
<a class="item{{if not .IsShowClosed}} active{{end}}" href="?type={{$.ViewType}}&sort={{$.SortType}}&state=open&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">
{{svg "octicon-issue-opened" 16 "tw-mr-2"}}
<div class="small-menu-items ui compact tiny menu list-header-toggle flex-items-block">
<a class="item{{if not .IsShowClosed}} active{{end}}" href="{{QueryBuild $queryLink "state" "open"}}">
{{svg "octicon-issue-opened"}}
{{ctx.Locale.PrettyNumber .IssueStats.OpenCount}}&nbsp;{{ctx.Locale.Tr "repo.issues.open_title"}}
</a>
<a class="item{{if .IsShowClosed}} active{{end}}" href="?type={{$.ViewType}}&sort={{$.SortType}}&state=closed&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">
{{svg "octicon-issue-closed" 16 "tw-mr-2"}}
<a class="item{{if .IsShowClosed}} active{{end}}" href="{{QueryBuild $queryLink "state" "closed"}}">
{{svg "octicon-issue-closed"}}
{{ctx.Locale.PrettyNumber .IssueStats.ClosedCount}}&nbsp;{{ctx.Locale.Tr "repo.issues.closed_title"}}
</a>
</div>
@ -61,14 +64,14 @@
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
</span>
<div class="menu">
<a class="{{if eq .SortType "recentupdate"}}active {{end}}item" href="?type={{$.ViewType}}&sort=recentupdate&state={{$.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">{{ctx.Locale.Tr "repo.issues.filter_sort.recentupdate"}}</a>
<a class="{{if eq .SortType "leastupdate"}}active {{end}}item" href="?type={{$.ViewType}}&sort=leastupdate&state={{$.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">{{ctx.Locale.Tr "repo.issues.filter_sort.leastupdate"}}</a>
<a class="{{if or (eq .SortType "latest") (not .SortType)}}active {{end}}item" href="?type={{$.ViewType}}&sort=latest&state={{$.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">{{ctx.Locale.Tr "repo.issues.filter_sort.latest"}}</a>
<a class="{{if eq .SortType "oldest"}}active {{end}}item" href="?type={{$.ViewType}}&sort=oldest&state={{$.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">{{ctx.Locale.Tr "repo.issues.filter_sort.oldest"}}</a>
<a class="{{if eq .SortType "mostcomment"}}active {{end}}item" href="?type={{$.ViewType}}&sort=mostcomment&state={{$.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">{{ctx.Locale.Tr "repo.issues.filter_sort.mostcomment"}}</a>
<a class="{{if eq .SortType "leastcomment"}}active {{end}}item" href="?type={{$.ViewType}}&sort=leastcomment&state={{$.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">{{ctx.Locale.Tr "repo.issues.filter_sort.leastcomment"}}</a>
<a class="{{if eq .SortType "nearduedate"}}active {{end}}item" href="?type={{$.ViewType}}&sort=nearduedate&state={{$.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">{{ctx.Locale.Tr "repo.issues.filter_sort.nearduedate"}}</a>
<a class="{{if eq .SortType "farduedate"}}active {{end}}item" href="?type={{$.ViewType}}&sort=farduedate&state={{$.State}}&q={{$.Keyword}}&fuzzy={{.IsFuzzy}}">{{ctx.Locale.Tr "repo.issues.filter_sort.farduedate"}}</a>
<a class="{{if eq .SortType "recentupdate"}}active {{end}}item" href="{{QueryBuild $queryLinkWithFilter "sort" "recentupdate"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.recentupdate"}}</a>
<a class="{{if eq .SortType "leastupdate"}}active {{end}}item" href="{{QueryBuild $queryLinkWithFilter "sort" "leastupdate"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.leastupdate"}}</a>
<a class="{{if eq .SortType "latest"}}active {{end}}item" href="{{QueryBuild $queryLinkWithFilter "sort" "latest"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.latest"}}</a>
<a class="{{if eq .SortType "oldest"}}active {{end}}item" href="{{QueryBuild $queryLinkWithFilter "sort" "oldest"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.oldest"}}</a>
<a class="{{if eq .SortType "mostcomment"}}active {{end}}item" href="{{QueryBuild $queryLinkWithFilter "sort" "mostcomment"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.mostcomment"}}</a>
<a class="{{if eq .SortType "leastcomment"}}active {{end}}item" href="{{QueryBuild $queryLinkWithFilter "sort" "leastcomment"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.leastcomment"}}</a>
<a class="{{if eq .SortType "nearduedate"}}active {{end}}item" href="{{QueryBuild $queryLinkWithFilter "sort" "nearduedate"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.nearduedate"}}</a>
<a class="{{if eq .SortType "farduedate"}}active {{end}}item" href="{{QueryBuild $queryLinkWithFilter "sort" "farduedate"}}">{{ctx.Locale.Tr "repo.issues.filter_sort.farduedate"}}</a>
</div>
</div>
</div>

View File

@ -2061,17 +2061,6 @@ td .commit-summary {
padding: 1em;
}
.edit-label.modal .form .column,
.new-label.modal .form .column {
padding-right: 0;
}
.edit-label.modal .form .buttons,
.new-label.modal .form .buttons {
margin-left: auto;
padding-top: 15px;
}
.stats-table {
display: table;
width: 100%;

View File

@ -20,7 +20,7 @@
grid-row: 2;
padding-left: 1em;
}
.repo-home-sidebar-bottom > :first-child {
.repo-home-sidebar-bottom .flex-list > :first-child {
border-top: 1px solid var(--color-secondary); /* same to .flex-list > .flex-item + .flex-item */
}
@ -43,7 +43,7 @@
grid-row: 3;
padding-left: 0;
}
.repo-home-sidebar-bottom > :first-child {
.repo-home-sidebar-bottom .flex-list > :first-child {
border-top: 0;
}
}

View File

@ -6,8 +6,17 @@ import {fomanticQuery} from '../modules/fomantic/base.ts';
const {appSubUrl, assetUrlPrefix, pageData} = window.config;
type CommitStatus = 'pending' | 'success' | 'error' | 'failure' | 'warning';
type CommitStatusMap = {
[status in CommitStatus]: {
name: string,
color: string,
};
};
// make sure this matches templates/repo/commit_status.tmpl
const commitStatus = {
const commitStatus: CommitStatusMap = {
pending: {name: 'octicon-dot-fill', color: 'yellow'},
success: {name: 'octicon-check', color: 'green'},
error: {name: 'gitea-exclamation', color: 'red'},
@ -281,18 +290,18 @@ const sfc = {
return 'octicon-repo';
},
statusIcon(status) {
statusIcon(status: CommitStatus) {
return commitStatus[status].name;
},
statusColor(status) {
statusColor(status: CommitStatus) {
return commitStatus[status].color;
},
reposFilterKeyControl(e) {
switch (e.key) {
case 'Enter':
document.querySelector('.repo-owner-name-list li.active a')?.click();
document.querySelector<HTMLAnchorElement>('.repo-owner-name-list li.active a')?.click();
break;
case 'ArrowUp':
if (this.activeIndex > 0) {

View File

@ -14,7 +14,7 @@ export default {
issueLink: el.getAttribute('data-issuelink'),
locale: {
filter_changes_by_commit: el.getAttribute('data-filter_changes_by_commit'),
},
} as Record<string, string>,
commits: [],
hoverActivated: false,
lastReviewCommitSha: null,
@ -41,16 +41,16 @@ export default {
this.$el.removeEventListener('keyup', this.onKeyUp);
},
methods: {
onBodyClick(event) {
onBodyClick(event: MouseEvent) {
// close this menu on click outside of this element when the dropdown is currently visible opened
if (this.$el.contains(event.target)) return;
if (this.menuVisible) {
this.toggleMenu();
}
},
onKeyDown(event) {
onKeyDown(event: KeyboardEvent) {
if (!this.menuVisible) return;
const item = document.activeElement;
const item = document.activeElement as HTMLElement;
if (!this.$el.contains(item)) return;
switch (event.key) {
case 'ArrowDown': // select next element
@ -73,7 +73,7 @@ export default {
if (commitIdx) this.highlight(this.commits[commitIdx]);
}
},
onKeyUp(event) {
onKeyUp(event: KeyboardEvent) {
if (!this.menuVisible) return;
const item = document.activeElement;
if (!this.$el.contains(item)) return;
@ -95,7 +95,7 @@ export default {
}
},
/** Focus given element */
focusElem(elem, prevElem) {
focusElem(elem: HTMLElement, prevElem: HTMLElement) {
if (elem) {
elem.tabIndex = 0;
if (prevElem) prevElem.tabIndex = -1;
@ -149,7 +149,7 @@ export default {
window.location.assign(`${this.issueLink}/files/${this.lastReviewCommitSha}..${this.commits.at(-1).id}${this.queryParams}`);
},
/** Clicking on a single commit opens this specific commit */
commitClicked(commitId, newWindow = false) {
commitClicked(commitId: string, newWindow = false) {
const url = `${this.issueLink}/commits/${commitId}${this.queryParams}`;
if (newWindow) {
window.open(url);

View File

@ -51,6 +51,7 @@ const sfc = {
run: {
link: '',
title: '',
titleHTML: '',
status: '',
canCancel: false,
canApprove: false,
@ -383,9 +384,8 @@ export function initRepositoryActionView() {
<div class="action-info-summary">
<div class="action-info-summary-title">
<ActionRunStatus :locale-status="locale.status[run.status]" :status="run.status" :size="20"/>
<h2 class="action-info-summary-title-text">
{{ run.title }}
</h2>
<!-- eslint-disable-next-line vue/no-v-html -->
<h2 class="action-info-summary-title-text" v-html="run.titleHTML"/>
</div>
<button class="ui basic small compact button primary" @click="approveRun()" v-if="run.canApprove">
{{ locale.approve }}

View File

@ -8,6 +8,8 @@ import {
PointElement,
LineElement,
Filler,
type ChartOptions,
type ChartData,
} from 'chart.js';
import {GET} from '../modules/fetch.ts';
import {Line as ChartLine} from 'vue-chartjs';
@ -16,6 +18,7 @@ import {
firstStartDateAfterDate,
fillEmptyStartDaysWithZeroes,
type DayData,
type DayDataObject,
} from '../utils/time.ts';
import {chartJsColors} from '../utils/color.ts';
import {sleep} from '../utils.ts';
@ -64,12 +67,12 @@ async function fetchGraphData() {
}
} while (response.status === 202);
if (response.ok) {
data.value = await response.json();
const weekValues = Object.values(data.value);
const dayDataObject: DayDataObject = await response.json();
const weekValues = Object.values(dayDataObject);
const start = weekValues[0].week;
const end = firstStartDateAfterDate(new Date());
const startDays = startDaysBetween(start, end);
data.value = fillEmptyStartDaysWithZeroes(startDays, data.value);
data.value = fillEmptyStartDaysWithZeroes(startDays, dayDataObject);
errorText.value = '';
} else {
errorText.value = response.statusText;
@ -81,7 +84,7 @@ async function fetchGraphData() {
}
}
function toGraphData(data) {
function toGraphData(data: Array<Record<string, any>>): ChartData<'line'> {
return {
datasets: [
{
@ -108,10 +111,9 @@ function toGraphData(data) {
};
}
const options = {
const options: ChartOptions<'line'> = {
responsive: true,
maintainAspectRatio: false,
animation: true,
plugins: {
legend: {
display: true,

View File

@ -9,6 +9,9 @@ import {
PointElement,
LineElement,
Filler,
type ChartOptions,
type ChartData,
type Plugin,
} from 'chart.js';
import {GET} from '../modules/fetch.ts';
import zoomPlugin from 'chartjs-plugin-zoom';
@ -22,8 +25,9 @@ import {chartJsColors} from '../utils/color.ts';
import {sleep} from '../utils.ts';
import 'chartjs-adapter-dayjs-4/dist/chartjs-adapter-dayjs-4.esm';
import {fomanticQuery} from '../modules/fomantic/base.ts';
import type {Entries} from 'type-fest';
const customEventListener = {
const customEventListener: Plugin = {
id: 'customEventListener',
afterEvent: (chart, args, opts) => {
// event will be replayed from chart.update when reset zoom,
@ -65,10 +69,10 @@ export default {
data: () => ({
isLoading: false,
errorText: '',
totalStats: {},
sortedContributors: {},
totalStats: {} as Record<string, any>,
sortedContributors: {} as Record<string, any>,
type: 'commits',
contributorsStats: [],
contributorsStats: {} as Record<string, any>,
xAxisStart: null,
xAxisEnd: null,
xAxisMin: null,
@ -99,7 +103,7 @@ export default {
async fetchGraphData() {
this.isLoading = true;
try {
let response;
let response: Response;
do {
response = await GET(`${this.repoLink}/activity/contributors/data`);
if (response.status === 202) {
@ -112,7 +116,7 @@ export default {
// below line might be deleted if we are sure go produces map always sorted by keys
total.weeks = Object.fromEntries(Object.entries(total.weeks).sort());
const weekValues = Object.values(total.weeks);
const weekValues = Object.values(total.weeks) as any;
this.xAxisStart = weekValues[0].week;
this.xAxisEnd = firstStartDateAfterDate(new Date());
const startDays = startDaysBetween(this.xAxisStart, this.xAxisEnd);
@ -120,7 +124,7 @@ export default {
this.xAxisMin = this.xAxisStart;
this.xAxisMax = this.xAxisEnd;
this.contributorsStats = {};
for (const [email, user] of Object.entries(rest)) {
for (const [email, user] of Object.entries(rest) as Entries<Record<string, Record<string, any>>>) {
user.weeks = fillEmptyStartDaysWithZeroes(startDays, user.weeks);
this.contributorsStats[email] = user;
}
@ -146,7 +150,7 @@ export default {
user.total_additions = 0;
user.total_deletions = 0;
user.max_contribution_type = 0;
const filteredWeeks = user.weeks.filter((week) => {
const filteredWeeks = user.weeks.filter((week: Record<string, number>) => {
const oneWeek = 7 * 24 * 60 * 60 * 1000;
if (week.week >= this.xAxisMin - oneWeek && week.week <= this.xAxisMax + oneWeek) {
user.total_commits += week.commits;
@ -195,7 +199,7 @@ export default {
return (1 - (coefficient % 1)) * 10 ** exp + maxValue;
},
toGraphData(data) {
toGraphData(data: Array<Record<string, any>>): ChartData<'line'> {
return {
datasets: [
{
@ -211,9 +215,9 @@ export default {
};
},
updateOtherCharts(event, reset) {
const minVal = event.chart.options.scales.x.min;
const maxVal = event.chart.options.scales.x.max;
updateOtherCharts({chart}: {chart: Chart}, reset?: boolean = false) {
const minVal = chart.options.scales.x.min;
const maxVal = chart.options.scales.x.max;
if (reset) {
this.xAxisMin = this.xAxisStart;
this.xAxisMax = this.xAxisEnd;
@ -225,7 +229,7 @@ export default {
}
},
getOptions(type) {
getOptions(type: string): ChartOptions<'line'> {
return {
responsive: true,
maintainAspectRatio: false,
@ -238,6 +242,7 @@ export default {
position: 'top',
align: 'center',
},
// @ts-expect-error: bug in chart.js types
customEventListener: {
chartType: type,
instance: this,

View File

@ -7,6 +7,7 @@ import {
LinearScale,
TimeScale,
type ChartOptions,
type ChartData,
} from 'chart.js';
import {GET} from '../modules/fetch.ts';
import {Bar} from 'vue-chartjs';
@ -15,6 +16,7 @@ import {
firstStartDateAfterDate,
fillEmptyStartDaysWithZeroes,
type DayData,
type DayDataObject,
} from '../utils/time.ts';
import {chartJsColors} from '../utils/color.ts';
import {sleep} from '../utils.ts';
@ -61,11 +63,11 @@ async function fetchGraphData() {
}
} while (response.status === 202);
if (response.ok) {
const data = await response.json();
const start = Object.values(data)[0].week;
const dayDataObj: DayDataObject = await response.json();
const start = Object.values(dayDataObj)[0].week;
const end = firstStartDateAfterDate(new Date());
const startDays = startDaysBetween(start, end);
data.value = fillEmptyStartDaysWithZeroes(startDays, data).slice(-52);
data.value = fillEmptyStartDaysWithZeroes(startDays, dayDataObj).slice(-52);
errorText.value = '';
} else {
errorText.value = response.statusText;
@ -77,10 +79,11 @@ async function fetchGraphData() {
}
}
function toGraphData(data) {
function toGraphData(data: DayData[]): ChartData<'bar'> {
return {
datasets: [
{
// @ts-expect-error -- bar chart expects one-dimensional data, but apparently x/y still works
data: data.map((i) => ({x: i.week, y: i.commits})),
label: 'Commits',
backgroundColor: chartJsColors['commits'],
@ -91,10 +94,9 @@ function toGraphData(data) {
};
}
const options = {
const options: ChartOptions<'bar'> = {
responsive: true,
maintainAspectRatio: false,
animation: true,
scales: {
x: {
type: 'time',

View File

@ -12,5 +12,5 @@ export function initCommonOrganization() {
});
// Labels
initCompLabelEdit('.organization.settings.labels');
initCompLabelEdit('.page-content.organization.settings.labels');
}

View File

@ -1,96 +1,81 @@
import $ from 'jquery';
import {toggleElem} from '../../utils/dom.ts';
import {fomanticQuery} from '../../modules/fomantic/base.ts';
function isExclusiveScopeName(name) {
function nameHasScope(name: string): boolean {
return /.*[^/]\/[^/].*/.test(name);
}
function updateExclusiveLabelEdit(form) {
const nameInput = document.querySelector(`${form} .label-name-input`);
const exclusiveField = document.querySelector(`${form} .label-exclusive-input-field`);
const exclusiveCheckbox = document.querySelector(`${form} .label-exclusive-input`);
const exclusiveWarning = document.querySelector(`${form} .label-exclusive-warning`);
export function initCompLabelEdit(pageSelector: string) {
const pageContent = document.querySelector<HTMLElement>(pageSelector);
if (!pageContent) return;
if (isExclusiveScopeName(nameInput.value)) {
exclusiveField?.classList.remove('muted');
exclusiveField?.removeAttribute('aria-disabled');
if (exclusiveCheckbox.checked && exclusiveCheckbox.getAttribute('data-exclusive-warn')) {
exclusiveWarning?.classList.remove('tw-hidden');
} else {
exclusiveWarning?.classList.add('tw-hidden');
}
} else {
exclusiveField?.classList.add('muted');
exclusiveField?.setAttribute('aria-disabled', 'true');
exclusiveWarning?.classList.add('tw-hidden');
// for guest view, the modal is not available, the "labels" are read-only
const elModal = pageContent.querySelector<HTMLElement>('#issue-label-edit-modal');
if (!elModal) return;
const elLabelId = elModal.querySelector<HTMLInputElement>('input[name="id"]');
const elNameInput = elModal.querySelector<HTMLInputElement>('.label-name-input');
const elExclusiveField = elModal.querySelector('.label-exclusive-input-field');
const elExclusiveInput = elModal.querySelector<HTMLInputElement>('.label-exclusive-input');
const elExclusiveWarning = elModal.querySelector('.label-exclusive-warning');
const elIsArchivedField = elModal.querySelector('.label-is-archived-input-field');
const elIsArchivedInput = elModal.querySelector<HTMLInputElement>('.label-is-archived-input');
const elDescInput = elModal.querySelector<HTMLInputElement>('.label-desc-input');
const elColorInput = elModal.querySelector<HTMLInputElement>('.js-color-picker-input input');
const syncModalUi = () => {
const hasScope = nameHasScope(elNameInput.value);
elExclusiveField.classList.toggle('disabled', !hasScope);
const showExclusiveWarning = hasScope && elExclusiveInput.checked && elModal.hasAttribute('data-need-warn-exclusive');
toggleElem(elExclusiveWarning, showExclusiveWarning);
if (!hasScope) elExclusiveInput.checked = false;
};
const showLabelEditModal = (btn:HTMLElement) => {
// the "btn" should contain the label's attributes by its `data-label-xxx` attributes
const form = elModal.querySelector<HTMLFormElement>('form');
elLabelId.value = btn.getAttribute('data-label-id') || '';
elNameInput.value = btn.getAttribute('data-label-name') || '';
elIsArchivedInput.checked = btn.getAttribute('data-label-is-archived') === 'true';
elExclusiveInput.checked = btn.getAttribute('data-label-exclusive') === 'true';
elDescInput.value = btn.getAttribute('data-label-description') || '';
elColorInput.value = btn.getAttribute('data-label-color') || '';
elColorInput.dispatchEvent(new Event('input', {bubbles: true})); // trigger the color picker
// if label id exists: "edit label" mode; otherwise: "new label" mode
const isEdit = Boolean(elLabelId.value);
// if a label was not exclusive but has issues, then it should warn user if it will become exclusive
const numIssues = parseInt(btn.getAttribute('data-label-num-issues') || '0');
elModal.toggleAttribute('data-need-warn-exclusive', !elExclusiveInput.checked && numIssues > 0);
elModal.querySelector('.header').textContent = isEdit ? elModal.getAttribute('data-text-edit-label') : elModal.getAttribute('data-text-new-label');
const curPageLink = elModal.getAttribute('data-current-page-link');
form.action = isEdit ? `${curPageLink}/edit` : `${curPageLink}/new`;
toggleElem(elIsArchivedField, isEdit);
syncModalUi();
fomanticQuery(elModal).modal({
onApprove() {
if (!form.checkValidity()) {
form.reportValidity();
return false;
}
form.submit();
},
}).modal('show');
};
elModal.addEventListener('input', () => syncModalUi());
// theoretically, if the modal exists, the "new label" button should also exist, just in case it doesn't, use "?."
const elNewLabel = pageContent.querySelector<HTMLElement>('.ui.button.new-label');
elNewLabel?.addEventListener('click', () => showLabelEditModal(elNewLabel));
const elEditLabelButtons = pageContent.querySelectorAll<HTMLElement>('.edit-label-button');
for (const btn of elEditLabelButtons) {
btn.addEventListener('click', (e) => {
e.preventDefault();
showLabelEditModal(btn);
});
}
}
export function initCompLabelEdit(selector) {
if (!$(selector).length) return;
// Create label
$('.new-label.button').on('click', () => {
updateExclusiveLabelEdit('.new-label');
$('.new-label.modal').modal({
onApprove() {
const form = document.querySelector('.new-label.form');
if (!form.checkValidity()) {
form.reportValidity();
return false;
}
$('.new-label.form').trigger('submit');
},
}).modal('show');
return false;
});
// Edit label
$('.edit-label-button').on('click', function () {
$('#label-modal-id').val($(this).data('id'));
const $nameInput = $('.edit-label .label-name-input');
$nameInput.val($(this).data('title'));
const $isArchivedCheckbox = $('.edit-label .label-is-archived-input');
$isArchivedCheckbox[0].checked = this.hasAttribute('data-is-archived');
const $exclusiveCheckbox = $('.edit-label .label-exclusive-input');
$exclusiveCheckbox[0].checked = this.hasAttribute('data-exclusive');
// Warn when label was previously not exclusive and used in issues
$exclusiveCheckbox.data('exclusive-warn',
$(this).data('num-issues') > 0 &&
(!this.hasAttribute('data-exclusive') || !isExclusiveScopeName($nameInput.val())));
updateExclusiveLabelEdit('.edit-label');
$('.edit-label .label-desc-input').val(this.getAttribute('data-description'));
const colorInput = document.querySelector('.edit-label .js-color-picker-input input');
colorInput.value = this.getAttribute('data-color');
colorInput.dispatchEvent(new Event('input', {bubbles: true}));
$('.edit-label.modal').modal({
onApprove() {
const form = document.querySelector('.edit-label.form');
if (!form.checkValidity()) {
form.reportValidity();
return false;
}
$('.edit-label.form').trigger('submit');
},
}).modal('show');
return false;
});
$('.new-label .label-name-input').on('input', () => {
updateExclusiveLabelEdit('.new-label');
});
$('.new-label .label-exclusive-input').on('change', () => {
updateExclusiveLabelEdit('.new-label');
});
$('.edit-label .label-name-input').on('input', () => {
updateExclusiveLabelEdit('.edit-label');
});
$('.edit-label .label-exclusive-input').on('change', () => {
updateExclusiveLabelEdit('.edit-label');
});
}

View File

@ -1,17 +1,17 @@
import $ from 'jquery';
import {updateIssuesMeta} from './repo-common.ts';
import {toggleElem, hideElem, isElemHidden} from '../utils/dom.ts';
import {toggleElem, hideElem, isElemHidden, queryElems} from '../utils/dom.ts';
import {htmlEscape} from 'escape-goat';
import {confirmModal} from './comp/ConfirmModal.ts';
import {showErrorToast} from '../modules/toast.ts';
import {createSortable} from '../modules/sortable.ts';
import {DELETE, POST} from '../modules/fetch.ts';
import {parseDom} from '../utils.ts';
import {fomanticQuery} from '../modules/fomantic/base.ts';
function initRepoIssueListCheckboxes() {
const issueSelectAll = document.querySelector('.issue-checkbox-all');
const issueSelectAll = document.querySelector<HTMLInputElement>('.issue-checkbox-all');
if (!issueSelectAll) return; // logged out state
const issueCheckboxes = document.querySelectorAll('.issue-checkbox');
const issueCheckboxes = document.querySelectorAll<HTMLInputElement>('.issue-checkbox');
const syncIssueSelectionState = () => {
const checkedCheckboxes = Array.from(issueCheckboxes).filter((el) => el.checked);
@ -29,8 +29,8 @@ function initRepoIssueListCheckboxes() {
issueSelectAll.indeterminate = false;
}
// if any issue is selected, show the action panel, otherwise show the filter panel
toggleElem($('#issue-filters'), !anyChecked);
toggleElem($('#issue-actions'), anyChecked);
toggleElem('#issue-filters', !anyChecked);
toggleElem('#issue-actions', anyChecked);
// there are two panels but only one select-all checkbox, so move the checkbox to the visible panel
const panels = document.querySelectorAll('#issue-filters, #issue-actions');
const visiblePanel = Array.from(panels).find((el) => !isElemHidden(el));
@ -49,56 +49,55 @@ function initRepoIssueListCheckboxes() {
syncIssueSelectionState();
});
$('.issue-action').on('click', async function (e) {
e.preventDefault();
queryElems(document, '.issue-action', (el) => el.addEventListener('click',
async (e: MouseEvent) => {
e.preventDefault();
const url = this.getAttribute('data-url');
let action = this.getAttribute('data-action');
let elementId = this.getAttribute('data-element-id');
let issueIDs = [];
for (const el of document.querySelectorAll('.issue-checkbox:checked')) {
issueIDs.push(el.getAttribute('data-issue-id'));
}
issueIDs = issueIDs.join(',');
if (!issueIDs) return;
// for assignee
if (elementId === '0' && url.endsWith('/assignee')) {
elementId = '';
action = 'clear';
}
// for toggle
if (action === 'toggle' && e.altKey) {
action = 'toggle-alt';
}
// for delete
if (action === 'delete') {
const confirmText = e.target.getAttribute('data-action-delete-confirm');
if (!await confirmModal({content: confirmText, confirmButtonColor: 'red'})) {
return;
const url = el.getAttribute('data-url');
let action = el.getAttribute('data-action');
let elementId = el.getAttribute('data-element-id');
const issueIDList: string[] = [];
for (const el of document.querySelectorAll('.issue-checkbox:checked')) {
issueIDList.push(el.getAttribute('data-issue-id'));
}
}
const issueIDs = issueIDList.join(',');
if (!issueIDs) return;
try {
await updateIssuesMeta(url, action, issueIDs, elementId);
window.location.reload();
} catch (err) {
showErrorToast(err.responseJSON?.error ?? err.message);
}
});
// for assignee
if (elementId === '0' && url.endsWith('/assignee')) {
elementId = '';
action = 'clear';
}
// for toggle
if (action === 'toggle' && e.altKey) {
action = 'toggle-alt';
}
// for delete
if (action === 'delete') {
const confirmText = el.getAttribute('data-action-delete-confirm');
if (!await confirmModal({content: confirmText, confirmButtonColor: 'red'})) {
return;
}
}
try {
await updateIssuesMeta(url, action, issueIDs, elementId);
window.location.reload();
} catch (err) {
showErrorToast(err.responseJSON?.error ?? err.message);
}
},
));
}
function initRepoIssueListAuthorDropdown() {
const $searchDropdown = $('.user-remote-search');
if (!$searchDropdown.length) return;
let searchUrl = $searchDropdown[0].getAttribute('data-search-url');
const actionJumpUrl = $searchDropdown[0].getAttribute('data-action-jump-url');
const selectedUserId = $searchDropdown[0].getAttribute('data-selected-user-id');
function initDropdownUserRemoteSearch(el: Element) {
let searchUrl = el.getAttribute('data-search-url');
const actionJumpUrl = el.getAttribute('data-action-jump-url');
const selectedUserId = el.getAttribute('data-selected-user-id');
if (!searchUrl.includes('?')) searchUrl += '?';
const $searchDropdown = fomanticQuery(el);
$searchDropdown.dropdown('setting', {
fullTextSearch: true,
selectOnKeydown: false,
@ -111,14 +110,14 @@ function initRepoIssueListAuthorDropdown() {
for (const item of resp.results) {
let html = `<img class="ui avatar tw-align-middle" src="${htmlEscape(item.avatar_link)}" aria-hidden="true" alt="" width="20" height="20"><span class="gt-ellipsis">${htmlEscape(item.username)}</span>`;
if (item.full_name) html += `<span class="search-fullname tw-ml-2">${htmlEscape(item.full_name)}</span>`;
processedResults.push({value: item.user_id, name: html});
processedResults.push({value: item.username, name: html});
}
resp.results = processedResults;
return resp;
},
},
action: (_text, value) => {
window.location.href = actionJumpUrl.replace('{user_id}', encodeURIComponent(value));
window.location.href = actionJumpUrl.replace('{username}', encodeURIComponent(value));
},
onShow: () => {
$searchDropdown.dropdown('filter', ' '); // trigger a search on first show
@ -160,7 +159,7 @@ function initRepoIssueListAuthorDropdown() {
function initPinRemoveButton() {
for (const button of document.querySelectorAll('.issue-card-unpin')) {
button.addEventListener('click', async (event) => {
const el = event.currentTarget;
const el = event.currentTarget as HTMLElement;
const id = Number(el.getAttribute('data-issue-id'));
// Send the unpin request
@ -205,10 +204,8 @@ async function initIssuePinSort() {
}
function initArchivedLabelFilter() {
const archivedLabelEl = document.querySelector('#archived-filter-checkbox');
if (!archivedLabelEl) {
return;
}
const archivedLabelEl = document.querySelector<HTMLInputElement>('#archived-filter-checkbox');
if (!archivedLabelEl) return;
const url = new URL(window.location.href);
const archivedLabels = document.querySelectorAll('[data-is-archived]');
@ -219,7 +216,7 @@ function initArchivedLabelFilter() {
}
const selectedLabels = (url.searchParams.get('labels') || '')
.split(',')
.map((id) => id < 0 ? `${~id + 1}` : id); // selectedLabels contains -ve ids, which are excluded so convert any -ve value id to +ve
.map((id) => parseInt(id) < 0 ? `${~id + 1}` : id); // selectedLabels contains -ve ids, which are excluded so convert any -ve value id to +ve
const archivedElToggle = () => {
for (const label of archivedLabels) {
@ -241,9 +238,9 @@ function initArchivedLabelFilter() {
}
export function initRepoIssueList() {
if (!document.querySelectorAll('.page-content.repository.issue-list, .page-content.repository.milestone-issue-list').length) return;
if (!document.querySelector('.page-content.repository.issue-list, .page-content.repository.milestone-issue-list')) return;
initRepoIssueListCheckboxes();
initRepoIssueListAuthorDropdown();
queryElems(document, '.ui.dropdown.user-remote-search', (el) => initDropdownUserRemoteSearch(el));
initIssuePinSort();
initArchivedLabelFilter();
}

View File

@ -8,6 +8,7 @@ import {parseIssuePageInfo, toAbsoluteUrl} from '../utils.ts';
import {GET, POST} from '../modules/fetch.ts';
import {showErrorToast} from '../modules/toast.ts';
import {initRepoIssueSidebar} from './repo-issue-sidebar.ts';
import {fomanticQuery} from '../modules/fomantic/base.ts';
const {appSubUrl} = window.config;
@ -31,34 +32,35 @@ export function initRepoIssueSidebarList() {
if (crossRepoSearch === 'true') {
issueSearchUrl = `${appSubUrl}/issues/search?q={query}&priority_repo_id=${issuePageInfo.repoId}&type=${issuePageInfo.issueDependencySearchType}`;
}
$('#new-dependency-drop-list')
.dropdown({
apiSettings: {
url: issueSearchUrl,
onResponse(response) {
const filteredResponse = {success: true, results: []};
const currIssueId = $('#new-dependency-drop-list').data('issue-id');
// Parse the response from the api to work with our dropdown
$.each(response, (_i, issue) => {
// Don't list current issue in the dependency list.
if (issue.id === currIssueId) {
return;
}
filteredResponse.results.push({
name: `<div class="gt-ellipsis">#${issue.number} ${htmlEscape(issue.title)}</div>
fomanticQuery('#new-dependency-drop-list').dropdown({
fullTextSearch: true,
apiSettings: {
url: issueSearchUrl,
onResponse(response) {
const filteredResponse = {success: true, results: []};
const currIssueId = $('#new-dependency-drop-list').data('issue-id');
// Parse the response from the api to work with our dropdown
$.each(response, (_i, issue) => {
// Don't list current issue in the dependency list.
if (issue.id === currIssueId) {
return;
}
filteredResponse.results.push({
name: `<div class="gt-ellipsis">#${issue.number} ${htmlEscape(issue.title)}</div>
<div class="text small tw-break-anywhere">${htmlEscape(issue.repository.full_name)}</div>`,
value: issue.id,
});
value: issue.id,
});
return filteredResponse;
},
cache: false,
});
return filteredResponse;
},
cache: false,
},
});
}
fullTextSearch: true,
});
$('.menu a.label-filter-item').each(function () {
export function initRepoIssueLabelFilter() {
// the "label-filter" is used in 2 templates: projects/view, issue/filter_list (issue list page including the milestone page)
$('.ui.dropdown.label-filter a.label-filter-item').each(function () {
$(this).on('click', function (e) {
if (e.altKey) {
e.preventDefault();
@ -66,11 +68,9 @@ export function initRepoIssueSidebarList() {
}
});
});
// FIXME: it is wrong place to init ".ui.dropdown.label-filter"
$('.menu .ui.dropdown.label-filter').on('keydown', (e) => {
$('.ui.dropdown.label-filter').on('keydown', (e) => {
if (e.altKey && e.key === 'Enter') {
const selectedItem = document.querySelector('.menu .ui.dropdown.label-filter .menu .item.selected');
const selectedItem = document.querySelector('.ui.dropdown.label-filter .menu .item.selected');
if (selectedItem) {
excludeLabel(selectedItem);
}

View File

@ -43,7 +43,7 @@ export function initRepository() {
initRepoCommentFormAndSidebar();
// Labels
initCompLabelEdit('.repository.labels');
initCompLabelEdit('.page-content.repository.labels');
initRepoMilestone();
initRepoNew();

View File

@ -29,7 +29,7 @@ import {
initRepoIssueWipTitle,
initRepoPullRequestMergeInstruction,
initRepoPullRequestAllowMaintainerEdit,
initRepoPullRequestReview, initRepoIssueSidebarList,
initRepoPullRequestReview, initRepoIssueSidebarList, initRepoIssueLabelFilter,
} from './features/repo-issue.ts';
import {initRepoEllipsisButton, initCommitStatuses} from './features/repo-commit.ts';
import {initRepoTopicBar} from './features/repo-home.ts';
@ -181,6 +181,7 @@ onDomReady(() => {
initRepoGraphGit,
initRepoIssueContentHistory,
initRepoIssueList,
initRepoIssueLabelFilter,
initRepoIssueSidebarList,
initRepoIssueReferenceRepositorySearch,
initRepoIssueWipTitle,

View File

@ -0,0 +1,56 @@
import {createElementFromHTML} from '../../utils/dom.ts';
import {hideScopedEmptyDividers} from './dropdown.ts';
test('hideScopedEmptyDividers-simple', () => {
const container = createElementFromHTML(`<div>
<div class="divider"></div>
<div class="item">a</div>
<div class="divider"></div>
<div class="divider"></div>
<div class="divider"></div>
<div class="item">b</div>
<div class="divider"></div>
</div>`);
hideScopedEmptyDividers(container);
expect(container.innerHTML).toEqual(`
<div class="divider hidden transition"></div>
<div class="item">a</div>
<div class="divider hidden transition"></div>
<div class="divider hidden transition"></div>
<div class="divider"></div>
<div class="item">b</div>
<div class="divider hidden transition"></div>
`);
});
test('hideScopedEmptyDividers-hidden1', () => {
const container = createElementFromHTML(`<div>
<div class="item">a</div>
<div class="divider" data-scope="b"></div>
<div class="item tw-hidden" data-scope="b">b</div>
</div>`);
hideScopedEmptyDividers(container);
expect(container.innerHTML).toEqual(`
<div class="item">a</div>
<div class="divider hidden transition" data-scope="b"></div>
<div class="item tw-hidden" data-scope="b">b</div>
`);
});
test('hideScopedEmptyDividers-hidden2', () => {
const container = createElementFromHTML(`<div>
<div class="item" data-scope="">a</div>
<div class="divider" data-scope="b"></div>
<div class="item tw-hidden" data-scope="b">b</div>
<div class="divider" data-scope=""></div>
<div class="item" data-scope="">c</div>
</div>`);
hideScopedEmptyDividers(container);
expect(container.innerHTML).toEqual(`
<div class="item" data-scope="">a</div>
<div class="divider hidden transition" data-scope="b"></div>
<div class="item tw-hidden" data-scope="b">b</div>
<div class="divider hidden transition" data-scope=""></div>
<div class="item" data-scope="">c</div>
`);
});

View File

@ -59,6 +59,12 @@ function updateSelectionLabel(label: HTMLElement) {
}
}
function processMenuItems($dropdown, dropdownCall) {
const hideEmptyDividers = dropdownCall('setting', 'hideDividers') === 'empty';
const itemsMenu = $dropdown[0].querySelector('.scrolling.menu') || $dropdown[0].querySelector('.menu');
if (hideEmptyDividers) hideScopedEmptyDividers(itemsMenu);
}
// delegate the dropdown's template functions and callback functions to add aria attributes.
function delegateOne($dropdown: any) {
const dropdownCall = fomanticDropdownFn.bind($dropdown);
@ -72,6 +78,18 @@ function delegateOne($dropdown: any) {
// * If the "dropdown icon" is clicked again when the menu is visible, Fomantic calls "blurSearch", so hide the menu
dropdownCall('internal', 'blurSearch', function () { oldBlurSearch.call(this); dropdownCall('hide') });
const oldFilterItems = dropdownCall('internal', 'filterItems');
dropdownCall('internal', 'filterItems', function (...args: any[]) {
oldFilterItems.call(this, ...args);
processMenuItems($dropdown, dropdownCall);
});
const oldShow = dropdownCall('internal', 'show');
dropdownCall('internal', 'show', function (...args: any[]) {
oldShow.call(this, ...args);
processMenuItems($dropdown, dropdownCall);
});
// the "template" functions are used for dynamic creation (eg: AJAX)
const dropdownTemplates = {...dropdownCall('setting', 'templates'), t: performance.now()};
const dropdownTemplatesMenuOld = dropdownTemplates.menu;
@ -271,3 +289,65 @@ function attachDomEvents(dropdown: HTMLElement, focusable: HTMLElement, menu: HT
ignoreClickPreEvents = ignoreClickPreVisible = 0;
}, true);
}
// Although Fomantic Dropdown supports "hideDividers", it doesn't really work with our "scoped dividers"
// At the moment, "label dropdown items" use scopes, a sample case is:
// * a-label
// * divider
// * scope/1
// * scope/2
// * divider
// * z-label
// when the "scope/*" are filtered out, we'd like to see "a-label" and "z-label" without the divider.
export function hideScopedEmptyDividers(container: Element) {
const visibleItems: Element[] = [];
const curScopeVisibleItems: Element[] = [];
let curScope: string = '', lastVisibleScope: string = '';
const isScopedDivider = (item: Element) => item.matches('.divider') && item.hasAttribute('data-scope');
const hideDivider = (item: Element) => item.classList.add('hidden', 'transition'); // dropdown has its own classes to hide items
const handleScopeSwitch = (itemScope: string) => {
if (curScopeVisibleItems.length === 1 && isScopedDivider(curScopeVisibleItems[0])) {
hideDivider(curScopeVisibleItems[0]);
} else if (curScopeVisibleItems.length) {
if (isScopedDivider(curScopeVisibleItems[0]) && lastVisibleScope === curScope) {
hideDivider(curScopeVisibleItems[0]);
curScopeVisibleItems.shift();
}
visibleItems.push(...curScopeVisibleItems);
lastVisibleScope = curScope;
}
curScope = itemScope;
curScopeVisibleItems.length = 0;
};
// hide the scope dividers if the scope items are empty
for (const item of container.children) {
const itemScope = item.getAttribute('data-scope') || '';
if (itemScope !== curScope) {
handleScopeSwitch(itemScope);
}
if (!item.classList.contains('filtered') && !item.classList.contains('tw-hidden')) {
curScopeVisibleItems.push(item as HTMLElement);
}
}
handleScopeSwitch('');
// hide all leading and trailing dividers
while (visibleItems.length) {
if (!visibleItems[0].matches('.divider')) break;
hideDivider(visibleItems[0]);
visibleItems.shift();
}
while (visibleItems.length) {
if (!visibleItems[visibleItems.length - 1].matches('.divider')) break;
hideDivider(visibleItems[visibleItems.length - 1]);
visibleItems.pop();
}
// hide all duplicate dividers, hide current divider if next sibling is still divider
// no need to update "visibleItems" array since this is the last loop
for (const item of visibleItems) {
if (!item.matches('.divider')) continue;
if (item.nextElementSibling?.matches('.divider')) hideDivider(item);
}
}

View File

@ -49,7 +49,11 @@ export type DayData = {
commits: number,
}
export function fillEmptyStartDaysWithZeroes(startDays: number[], data: DayData[]): DayData[] {
export type DayDataObject = {
[timestamp: string]: DayData,
}
export function fillEmptyStartDaysWithZeroes(startDays: number[], data: DayDataObject): DayData[] {
const result = {};
for (const startDay of startDays) {

View File

@ -12,7 +12,7 @@ window.customElements.define('overflow-menu', class extends HTMLElement {
mutationObserver: MutationObserver;
lastWidth: number;
updateItems = throttle(100, () => { // eslint-disable-line unicorn/consistent-function-scoping -- https://github.com/sindresorhus/eslint-plugin-unicorn/issues/2088
updateItems = throttle(100, () => {
if (!this.tippyContent) {
const div = document.createElement('div');
div.classList.add('tippy-target');