mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 08:02:36 +09:00 
			
		
		
		
	Compare commits
	
		
			48 Commits
		
	
	
		
			v1.10.0-de
			...
			v1.2.3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					09bd05732d | ||
| 
						 | 
					de7a76a995 | ||
| 
						 | 
					357d5a5a3d | ||
| 
						 | 
					d81cf34e37 | ||
| 
						 | 
					9902317679 | ||
| 
						 | 
					33e164168f | ||
| 
						 | 
					f40ba68d57 | ||
| 
						 | 
					cb0c8b8ae4 | ||
| 
						 | 
					eba5945d2f | ||
| 
						 | 
					4c67925531 | ||
| 
						 | 
					3c60121ca7 | ||
| 
						 | 
					46bb1cf026 | ||
| 
						 | 
					13013e90f3 | ||
| 
						 | 
					785ba171f4 | ||
| 
						 | 
					fb80265b52 | ||
| 
						 | 
					6fae585d28 | ||
| 
						 | 
					670562a9c5 | ||
| 
						 | 
					ed07d8a308 | ||
| 
						 | 
					74399f333f | ||
| 
						 | 
					d1cec5ecfa | ||
| 
						 | 
					73ad7d2ef3 | ||
| 
						 | 
					5b36379172 | ||
| 
						 | 
					e38e502e20 | ||
| 
						 | 
					3cc5b11b0d | ||
| 
						 | 
					4c9bf91a2c | ||
| 
						 | 
					03ff7687e0 | ||
| 
						 | 
					f646154ead | ||
| 
						 | 
					a6d2f47a2b | ||
| 
						 | 
					1837194882 | ||
| 
						 | 
					9ca26432f6 | ||
| 
						 | 
					67595c0d0b | ||
| 
						 | 
					6d03cf831e | ||
| 
						 | 
					e232c49b10 | ||
| 
						 | 
					25e71ad41e | ||
| 
						 | 
					f014e42a06 | ||
| 
						 | 
					d14a724b53 | ||
| 
						 | 
					91788e0200 | ||
| 
						 | 
					fc0c6f48c7 | ||
| 
						 | 
					002fa73460 | ||
| 
						 | 
					2fdc649202 | ||
| 
						 | 
					0c910afe11 | ||
| 
						 | 
					1cbe502cc2 | ||
| 
						 | 
					f916aa0fe3 | ||
| 
						 | 
					04728b5b91 | ||
| 
						 | 
					bbb0b8c17c | ||
| 
						 | 
					0938a2dca3 | ||
| 
						 | 
					9df0eafa25 | ||
| 
						 | 
					e13eef8cfe | 
							
								
								
									
										91
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								.drone.yml
									
									
									
									
									
								
							@@ -2,12 +2,13 @@ workspace:
 | 
			
		||||
  base: /srv/app
 | 
			
		||||
  path: src/code.gitea.io/gitea
 | 
			
		||||
 | 
			
		||||
pipeline:
 | 
			
		||||
  clone:
 | 
			
		||||
    image: plugins/git
 | 
			
		||||
clone:
 | 
			
		||||
  git:
 | 
			
		||||
    image: plugins/git:1
 | 
			
		||||
    depth: 50
 | 
			
		||||
    tags: true
 | 
			
		||||
 | 
			
		||||
pipeline:
 | 
			
		||||
  build:
 | 
			
		||||
    image: webhippie/golang:edge
 | 
			
		||||
    pull: true
 | 
			
		||||
@@ -15,7 +16,6 @@ pipeline:
 | 
			
		||||
      TAGS: bindata sqlite
 | 
			
		||||
      GOPATH: /srv/app
 | 
			
		||||
    commands:
 | 
			
		||||
      - apk -U add openssh-client
 | 
			
		||||
      - make clean
 | 
			
		||||
      - make generate
 | 
			
		||||
      - make vet
 | 
			
		||||
@@ -34,35 +34,21 @@ pipeline:
 | 
			
		||||
      TAGS: bindata sqlite
 | 
			
		||||
      GOPATH: /srv/app
 | 
			
		||||
    commands:
 | 
			
		||||
      - apk -U add openssh-client
 | 
			
		||||
      - make test
 | 
			
		||||
    when:
 | 
			
		||||
      event: [ tag, pull_request ]
 | 
			
		||||
 | 
			
		||||
  test-coverage:
 | 
			
		||||
    image: webhippie/golang:edge
 | 
			
		||||
    pull: true
 | 
			
		||||
    environment:
 | 
			
		||||
      TAGS: bindata sqlite
 | 
			
		||||
      GOPATH: /srv/app
 | 
			
		||||
    commands:
 | 
			
		||||
      - apk -U add openssh-client
 | 
			
		||||
      - go get github.com/wadey/gocovmerge
 | 
			
		||||
      - make test-coverage
 | 
			
		||||
    when:
 | 
			
		||||
      event: [ push ]
 | 
			
		||||
      branch: master
 | 
			
		||||
 | 
			
		||||
  test-sqlite:
 | 
			
		||||
    image: webhippie/golang:edge
 | 
			
		||||
    pull: true
 | 
			
		||||
    environment:
 | 
			
		||||
      TAGS: bindata
 | 
			
		||||
      GOPATH: /srv/app
 | 
			
		||||
    commands:
 | 
			
		||||
      - echo "Needs to be fixed" # make test-sqlite
 | 
			
		||||
    when:
 | 
			
		||||
      event: [ push, tag, pull_request ]
 | 
			
		||||
  # Commented until db locking have been resolved!
 | 
			
		||||
  # test-sqlite:
 | 
			
		||||
  #   image: webhippie/golang:edge
 | 
			
		||||
  #   pull: true
 | 
			
		||||
  #   environment:
 | 
			
		||||
  #     TAGS: bindata
 | 
			
		||||
  #     GOPATH: /srv/app
 | 
			
		||||
  #   commands:
 | 
			
		||||
  #     - make test-sqlite
 | 
			
		||||
  #   when:
 | 
			
		||||
  #     event: [ push, tag, pull_request ]
 | 
			
		||||
 | 
			
		||||
  test-mysql:
 | 
			
		||||
    image: webhippie/golang:edge
 | 
			
		||||
@@ -97,25 +83,19 @@ pipeline:
 | 
			
		||||
    when:
 | 
			
		||||
      event: [ push, tag ]
 | 
			
		||||
 | 
			
		||||
  # coverage:
 | 
			
		||||
  #   image: plugins/coverage
 | 
			
		||||
  #   server: https://coverage.gitea.io
 | 
			
		||||
  #   when:
 | 
			
		||||
  #     event: [ push ]
 | 
			
		||||
  #     branch: master
 | 
			
		||||
 | 
			
		||||
  docker:
 | 
			
		||||
    image: plugins/docker
 | 
			
		||||
    image: plugins/docker:17.05
 | 
			
		||||
    pull: true
 | 
			
		||||
    secrets: [ docker_username, docker_password ]
 | 
			
		||||
    repo: gitea/gitea
 | 
			
		||||
    tags: [ '${DRONE_TAG##v}' ]
 | 
			
		||||
    when:
 | 
			
		||||
      event: [ tag ]
 | 
			
		||||
      branch: [ refs/tags/* ]
 | 
			
		||||
 | 
			
		||||
  docker:
 | 
			
		||||
    image: plugins/docker
 | 
			
		||||
    image: plugins/docker:17.05
 | 
			
		||||
    pull: true
 | 
			
		||||
    secrets: [ docker_username, docker_password ]
 | 
			
		||||
    repo: gitea/gitea
 | 
			
		||||
    tags: [ '${DRONE_BRANCH##release/v}' ]
 | 
			
		||||
    when:
 | 
			
		||||
@@ -123,8 +103,9 @@ pipeline:
 | 
			
		||||
      branch: [ release/* ]
 | 
			
		||||
 | 
			
		||||
  docker:
 | 
			
		||||
    image: plugins/docker
 | 
			
		||||
    image: plugins/docker:17.05
 | 
			
		||||
    pull: true
 | 
			
		||||
    secrets: [ docker_username, docker_password ]
 | 
			
		||||
    repo: gitea/gitea
 | 
			
		||||
    tags: [ 'latest' ]
 | 
			
		||||
    when:
 | 
			
		||||
@@ -132,17 +113,24 @@ pipeline:
 | 
			
		||||
      branch: [ master ]
 | 
			
		||||
 | 
			
		||||
  release:
 | 
			
		||||
    image: plugins/s3
 | 
			
		||||
    image: plugins/s3:1
 | 
			
		||||
    pull: true
 | 
			
		||||
    secrets: [ aws_access_key_id, aws_secret_access_key ]
 | 
			
		||||
    bucket: releases
 | 
			
		||||
    endpoint: https://storage.gitea.io
 | 
			
		||||
    path_style: true
 | 
			
		||||
    strip_prefix: dist/release/
 | 
			
		||||
    source: dist/release/*
 | 
			
		||||
    target: /gitea/${DRONE_TAG##v}
 | 
			
		||||
    when:
 | 
			
		||||
      event: [ tag ]
 | 
			
		||||
      branch: [ refs/tags/* ]
 | 
			
		||||
 | 
			
		||||
  release:
 | 
			
		||||
    image: plugins/s3
 | 
			
		||||
    image: plugins/s3:1
 | 
			
		||||
    pull: true
 | 
			
		||||
    secrets: [ aws_access_key_id, aws_secret_access_key ]
 | 
			
		||||
    bucket: releases
 | 
			
		||||
    endpoint: https://storage.gitea.io
 | 
			
		||||
    path_style: true
 | 
			
		||||
    strip_prefix: dist/release/
 | 
			
		||||
    source: dist/release/*
 | 
			
		||||
@@ -152,7 +140,11 @@ pipeline:
 | 
			
		||||
      branch: [ release/* ]
 | 
			
		||||
 | 
			
		||||
  release:
 | 
			
		||||
    image: plugins/s3
 | 
			
		||||
    image: plugins/s3:1
 | 
			
		||||
    pull: true
 | 
			
		||||
    secrets: [ aws_access_key_id, aws_secret_access_key ]
 | 
			
		||||
    bucket: releases
 | 
			
		||||
    endpoint: https://storage.gitea.io
 | 
			
		||||
    path_style: true
 | 
			
		||||
    strip_prefix: dist/release/
 | 
			
		||||
    source: dist/release/*
 | 
			
		||||
@@ -162,17 +154,18 @@ pipeline:
 | 
			
		||||
      branch: [ master ]
 | 
			
		||||
 | 
			
		||||
  github:
 | 
			
		||||
    image: plugins/github-release
 | 
			
		||||
    image: plugins/github-release:1
 | 
			
		||||
    pull: true
 | 
			
		||||
    secrets: [ github_token ]
 | 
			
		||||
    files:
 | 
			
		||||
      - dist/release/*
 | 
			
		||||
    when:
 | 
			
		||||
      event: [ tag ]
 | 
			
		||||
      branch: [ refs/tags/* ]
 | 
			
		||||
 | 
			
		||||
  discord:
 | 
			
		||||
    image: appleboy/drone-discord:0.0.4
 | 
			
		||||
    webhook_id: ${WEBHOOK_ID}
 | 
			
		||||
    webhook_token: ${WEBHOOK_TOKEN}
 | 
			
		||||
    image: appleboy/drone-discord:1.0.0
 | 
			
		||||
    pull: true
 | 
			
		||||
    secrets: [ discord_webhook_id, discord_webhook_token ]
 | 
			
		||||
    when:
 | 
			
		||||
      event: [ push, tag, pull_request ]
 | 
			
		||||
      status: [ changed, failure ]
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										500
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										500
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,10 +1,504 @@
 | 
			
		||||
# Changelog
 | 
			
		||||
## [1.2.3](https://github.com/go-gitea/gitea/releases/tag/v1.2.3) - 2017-11-03
 | 
			
		||||
* BUGFIXES
 | 
			
		||||
  * Only require one email when validating GPG key (#2266, #2467, #2663) (#2788)
 | 
			
		||||
  * Fix order of comments (#2835) (#2839)
 | 
			
		||||
 | 
			
		||||
## Unreleased
 | 
			
		||||
## [1.2.2](https://github.com/go-gitea/gitea/releases/tag/v1.2.2) - 2017-10-26
 | 
			
		||||
* BUGFIXES
 | 
			
		||||
  * Add checks for commits with missing author and time (#2771) (#2785)
 | 
			
		||||
  * Fix sending mail with a non-latin display name (#2559) (#2783)
 | 
			
		||||
  * Sync MaxGitDiffLineCharacters with conf/app.ini (#2779) (#2780)
 | 
			
		||||
  * Update vendor git (#2765) (#2772)
 | 
			
		||||
  * Fix emojify image URL (#2769) (#2773)
 | 
			
		||||
 | 
			
		||||
## [1.2.1](https://github.com/go-gitea/gitea/releases/tag/v1.2.1) - 2017-10-16
 | 
			
		||||
* BUGFIXES
 | 
			
		||||
  * Fix PR, milestone and label functionality if issue unit is disabled (#2710) (#2714)
 | 
			
		||||
  * Fix plain readme didn't render correctly on repo home page (#2705) (#2712)
 | 
			
		||||
  * Fix so that user can still fork his own repository to his organizations (#2699) (#2707)
 | 
			
		||||
  * Fix .netrc authentication (#2700) (#2708)
 | 
			
		||||
  * Fix slice out of bounds error in mailer (#2479) (#2696)
 | 
			
		||||
 | 
			
		||||
## [1.2.0](https://github.com/go-gitea/gitea/releases/tag/v1.2.0) - 2017-10-10
 | 
			
		||||
* SECURITY
 | 
			
		||||
  * Sanitation fix from Gogs (#1461)
 | 
			
		||||
* BREAKING
 | 
			
		||||
  * Password reset URL changed from `/user/forget_password` to `/user/forgot_password`
 | 
			
		||||
  * SSH keys management URL changed from `/user/settings/ssh` to `/user/settings/keys`
 | 
			
		||||
  * Rename /forget_password url to /forgot_password (#1219)
 | 
			
		||||
* FEATURE
 | 
			
		||||
  * Logo: Add task to generate images from SVG and change to new logo (#2194)
 | 
			
		||||
  * Status-API (#1332)
 | 
			
		||||
  * Show commit status icon in commits table (#1688)
 | 
			
		||||
  * Additional OAuth2 providers (#1010)
 | 
			
		||||
  * GPG commit validation (#1150)
 | 
			
		||||
  * Rework SSH key management UI to add GPG (#1293)
 | 
			
		||||
  * Implement GPG api (#710)
 | 
			
		||||
  * Login via OpenID-2.0 (#618)
 | 
			
		||||
  * Add units to team (#947)
 | 
			
		||||
  * Batch updates for issues (#926)
 | 
			
		||||
  * Add Gitea Webhook (#1755)
 | 
			
		||||
  * API: support '/orgs/:org/repos' (#2047)
 | 
			
		||||
  * Display all organization from user settings (#1739)
 | 
			
		||||
  * LDAP user synchronization (#1478)
 | 
			
		||||
  * Adding #issuecomment to the URL in E-Mail notifications (#1674)
 | 
			
		||||
  * Add download count field and unit testing for attachment. (#1512)
 | 
			
		||||
  * Add repo mirror sync API endpoint (#1508)
 | 
			
		||||
  * Add markup package to prepare for org markup format (#1493)
 | 
			
		||||
  * Support for custom html meta  (#1423)
 | 
			
		||||
  * Per issue/PR watch/unwatch (#1410)
 | 
			
		||||
  * Allow ENABLE_OPENID_SIGNUP to depend on DISABLE_REGISTRATION (#1369)
 | 
			
		||||
  * Repo size in admin panel (#1482)
 | 
			
		||||
  * Show user OpenID URIs in their profile (#1314)
 | 
			
		||||
  * Add change-password admin command (#1304)
 | 
			
		||||
  * Only use issue and wiki on repo. (#1297)
 | 
			
		||||
  * Allow push to init a wiki repo (#1279)
 | 
			
		||||
* ENHANCEMENT
 | 
			
		||||
  * Make time diff translatable (#2057)
 | 
			
		||||
  * Smaller watch, star, and fork buttons (#2052)
 | 
			
		||||
  * Display config file path on admin panel (#2030)
 | 
			
		||||
  * Only show SSH clone URL if signed in (#2169) (#2170)
 | 
			
		||||
  * Only show "No Description" to repo admins (#2167)
 | 
			
		||||
  * Always return valid go-get meta, even if unauthorized (#2010)
 | 
			
		||||
  * Enable assignee e-mail notification (#2003)
 | 
			
		||||
  * Let not-logged-in users view releases (#1999)
 | 
			
		||||
  * No highlighting for .txt files (#1922)
 | 
			
		||||
  * Make side nav on dashboard stackable (#1778)
 | 
			
		||||
  * Setting to disable authorized_keys backup (#1856)
 | 
			
		||||
  * Hide the create organization button (in dashboard/organization section) (#1705)
 | 
			
		||||
  * LFS: Return 404 for unimplemented endpoints (#1330)
 | 
			
		||||
  * Show a link to password reset from user settings requiring a password (#862)
 | 
			
		||||
  * Reserve the "explore" user/org name (#1222)
 | 
			
		||||
  * Send notifications to partecipants in issue comments (#1217)
 | 
			
		||||
  * Improve style of user OpenID setting page (#1324)
 | 
			
		||||
  * Use font-awesome OpenID icon more (#1320)
 | 
			
		||||
  * Use readonly input form to show the validated OpenID URI (#1308)
 | 
			
		||||
  * Add captcha support to OpenID based signup (#1307)
 | 
			
		||||
  * Minor improvements on commit graph UI (#1380)
 | 
			
		||||
  * Mirror sync interval specified as duration string (#1407)
 | 
			
		||||
  * Make issue in commit graph "clickable" (#1392)
 | 
			
		||||
  * Use whole button (commit graph) as link (#1390)
 | 
			
		||||
  * Autofocus on 2fa passcode fields (#1460)
 | 
			
		||||
  * Sort on repo size in admin panel (#1654)
 | 
			
		||||
  * Improve dashboard repo search (#1652)
 | 
			
		||||
  * Use a better default MAX_GIT_DIFF_LINE_CHARACTERS (#1845)
 | 
			
		||||
  * Adds Parent property to the repo API (#1687)
 | 
			
		||||
  * Add configuration option for default permission to create Organizations (#1686)
 | 
			
		||||
  * Remove sha1 hash display in repository table (#1678)
 | 
			
		||||
  * Download files to their original filename (#1676)
 | 
			
		||||
  * Exposes in API the Repo entity's Size and IsBare property (#1668)
 | 
			
		||||
  * Change two factor code entry box from text to number (#1733)
 | 
			
		||||
  * Directly show error if user hit repository limit  (#1767)
 | 
			
		||||
  * Generate small and large logos at 4x resolution (#2233)
 | 
			
		||||
  * Tags listed in releases tab (#2389) (#2424)
 | 
			
		||||
* BUGFIXES
 | 
			
		||||
  * Fix adding branch as protected to not allow pushing to it (#2556)
 | 
			
		||||
  * Orgs: fix org page title when full name is not defined (#1495)
 | 
			
		||||
  * Fix double borders on edit page (#1152) (#1153)
 | 
			
		||||
  * Search bar fixes for #1187 and #1205 (#1207)
 | 
			
		||||
  * Fix upgrade failed after ever rollback (#1194)
 | 
			
		||||
  * Fix FCGI (over TCP) support (#1368)
 | 
			
		||||
  * Backport of migration fixes (#2604) (#2677)
 | 
			
		||||
  * fix panic on gogs webhook creation (#2675) (#2676)
 | 
			
		||||
  * Backport: Fixes 500 error on dashboard when using MSSQL (#2504) (#2662)
 | 
			
		||||
  * Fix go get response if only app URL is custom in configuration (#2634) (#2640)
 | 
			
		||||
  * Fix deletion of unprotected branches (#2630)
 | 
			
		||||
  * Backport of 2611 / Fix doubled issue tab introduced in migration v16 (#2622)
 | 
			
		||||
  * v38 migration used an outdated version of RepoUnit model (#2602)
 | 
			
		||||
  * fix go get subpackage bug (#2584) (#2589)
 | 
			
		||||
  * Backport: Sync releases table with tags on push and for mirrors (#2459) (#2554)
 | 
			
		||||
  * Backport: Restricting access to fork functioanlity to users with Code access (#2542)
 | 
			
		||||
  * Fix migration from pre-v15 to 1.2.0 (#2460) (#2465)
 | 
			
		||||
  * Fix migration from pre-v15 to 1.2.0 (#2460)
 | 
			
		||||
  * fix duplicated feed (#2370) (#2413)
 | 
			
		||||
  * Fix releases to be counted from database not tags (#2389)
 | 
			
		||||
  * Fix missing collabrative repos (#2367) (#2382)
 | 
			
		||||
  * Add more test for login links and fix a bug on action retrieve (#2361)
 | 
			
		||||
  * Fix SQL condition bug in GetFeeds(..) (#2360)
 | 
			
		||||
  * fix bug on create repo link on dashboard (#2359)
 | 
			
		||||
  * Fix order of elements in dashboard html (#2344)
 | 
			
		||||
  * Fix repo-search template errors for go1.7 (#2336)
 | 
			
		||||
  * Add missing forks key for dashboard repository component (#2325)
 | 
			
		||||
  * fix template error on explore repos (#2319)
 | 
			
		||||
  * Trigger sync webhooks on UI commit (#2302)
 | 
			
		||||
  * fix 500 error when view an issue which's milestone deleted (#2297)
 | 
			
		||||
  * Only update needed columns when update user (#2296)
 | 
			
		||||
  * Fix rendering of external links (#2292)
 | 
			
		||||
  * Fix and improve dashboard repo UI (#2285)
 | 
			
		||||
  * Make short link pattern greedy (#2259)
 | 
			
		||||
  * Temporarily patch go-ini/ini with fork (#2255)
 | 
			
		||||
  * Convert xorm literal queries to method calls (#2253)
 | 
			
		||||
  * update code.gitea.io/git in vendor to fix delete branch fails (#2250)
 | 
			
		||||
  * Replace calls to xorm UseBool with Where (#2237)
 | 
			
		||||
  * rhel7 has a git version with four digits (1.8.3.1) (#2236)
 | 
			
		||||
  * Fix internal requests when gitea listens to unix socket or only external IP (#2234)
 | 
			
		||||
  * Check for access in /repositories/:id (#2227)
 | 
			
		||||
  * Fixed robots.txt 404 error (#2226)
 | 
			
		||||
  * Fix counts on issues dashboard (#2215)
 | 
			
		||||
  * Fix unclosed session bug (#2214)
 | 
			
		||||
  * Add collaborative repositories to the dashboard (#2205)
 | 
			
		||||
  * Fix issue updated_unix bug (#2204)
 | 
			
		||||
  * Fix Commits nil pointer dereference (#2203)
 | 
			
		||||
  * Fix bare-repo bugs (#2199)
 | 
			
		||||
  * Fix PR nil-dereference bug (#2195)
 | 
			
		||||
  * Allow only single fork per user/organization (#2193)
 | 
			
		||||
  * Fix key usage time update if the key is used in parallel for multiple operations (#2185)
 | 
			
		||||
  * Only allow token authentication with 2FA enabled (#2184)
 | 
			
		||||
  * Fix profile update for non-local users (#2178)
 | 
			
		||||
  * Fix compiling without sqlite and gcc (#2177)
 | 
			
		||||
  * Make compare button URL aware if current repo is a fork (#2162) (#2163)
 | 
			
		||||
  * Remove unit types commits and settings (#2161)
 | 
			
		||||
  * Fix OpenID registration route (#2160)
 | 
			
		||||
  * Fix repository settings collobration list display (#2151)
 | 
			
		||||
  * Ignore invalid issue numbers in commit messages. Fixes  #2022 (#2150)
 | 
			
		||||
  * Fix SHA1 hash linking (#2143)
 | 
			
		||||
  * Fix repo API bug (#2133)
 | 
			
		||||
  * Use POSIX complaint ! operator in find (#2132)
 | 
			
		||||
  * Fix GET /users/:username/repos endpoint (#2125)
 | 
			
		||||
  * Fix username rendering bug (#2122)
 | 
			
		||||
  * Fix wiki preview links (#2119)
 | 
			
		||||
  * vendor: update sqlite to fix "database is locked" errors (#2116)
 | 
			
		||||
  * Fix unchecked error bug (#2110)
 | 
			
		||||
  * Fix missing-return bug (#2109)
 | 
			
		||||
  * Fix API for branches with slashes (#2096)
 | 
			
		||||
  * Fix git hooks update to receive required arguments (#2095)
 | 
			
		||||
  * upgrade git source code. (#2094)
 | 
			
		||||
  * Fix SQL bug in models.PullRequests (#2092)
 | 
			
		||||
  * Don't ignore gravatar error (#2083)
 | 
			
		||||
  * Fix release display and correct paging (#2080)
 | 
			
		||||
  * remove unnecessary blank lines and wrong error log (#2079)
 | 
			
		||||
  * Check for valid renamed usernames (#2077)
 | 
			
		||||
  * Update git module (#2074)
 | 
			
		||||
  * Fix org hooks UI (#2072)
 | 
			
		||||
  * Fix #1271: Call location.reload after XHR finishes (#2071)
 | 
			
		||||
  * Fix default ghost assignee bug (#2069)
 | 
			
		||||
  * Fix bug in issue labels API (#2048)
 | 
			
		||||
  * Load label ID in NewLabels (#2045)
 | 
			
		||||
  * Fix: `http: multiple response.WriteHeader calls` (#2038)
 | 
			
		||||
  * Pagination on releases page (#2035)
 | 
			
		||||
  * repo/editor: fix breadcrumb path cuts parent dirs (#3859) (#2032)
 | 
			
		||||
  * Fix displaying commits and files of PR created from now deleted fork (#2023)
 | 
			
		||||
  * Fix #2001 and fix issue comments hidden (#2016)
 | 
			
		||||
  * Update code.gitea.io/git (#2014)
 | 
			
		||||
  * Keep sort when switching page (#2013)
 | 
			
		||||
  * Important: wrong PR merge commit ID saved (#2007)
 | 
			
		||||
  * Don't show non-comments in comments API (#2001)
 | 
			
		||||
  * Fix "Dashboard shows deleted comments" (#1995)
 | 
			
		||||
  * Make branch deletion URL more like GitHub's, fixes #1397 (#1994)
 | 
			
		||||
  * Fix fast-forward PR bug (#1989)
 | 
			
		||||
  * Fix GPG email checking to be case insensitive (#1988)
 | 
			
		||||
  * fix bug for normal user visit public repo (#1984)
 | 
			
		||||
  * fix collborators lack of units on orgnization repositories (#1968)
 | 
			
		||||
  * Fix diff of renamed and modified file (#1967)
 | 
			
		||||
  * Fix uppercase default branch bug (#1965)
 | 
			
		||||
  * Fix bug in Action.loadRepo() (#1959)
 | 
			
		||||
  * Fix deleted milestone bug (#1942)
 | 
			
		||||
  * Fix engine bug in getIssueByID (#1934)
 | 
			
		||||
  * Switch to keybase go-crypto (for some elliptic curve key) + test (#1925)
 | 
			
		||||
  * Fix setting.AppPath for integration tests (#1923)
 | 
			
		||||
  * Fix search by issue type (#1914)
 | 
			
		||||
  * Fix ghost user bug (#1913)
 | 
			
		||||
  * Require token before checking membership/ownership (#1905)
 | 
			
		||||
  * Bug fixes for org member API (#1904)
 | 
			
		||||
  * A missing / to provide a correct endpoint (#1903)
 | 
			
		||||
  * Fix 500 in public activity page (#1901)
 | 
			
		||||
  * Center-aligned login topbar (#1880)
 | 
			
		||||
  * Migration to fix existing owner team units (#1873)
 | 
			
		||||
  * Fix paginater length (#1866)
 | 
			
		||||
  * Fix bug in removeOrgRepo (#1858)
 | 
			
		||||
  * Display draft releases (#1854)
 | 
			
		||||
  * Fix 404 for external tracking issues (#1852)
 | 
			
		||||
  * Update code.gitea.io/git (#1849)
 | 
			
		||||
  * Fix user profile activity feed (#1848)
 | 
			
		||||
  * Don't ignore error in getMergeCommit (#1843)
 | 
			
		||||
  * Fix locking bug in removeOrgRepo (#1842)
 | 
			
		||||
  * Fix status table race condition (#1835)
 | 
			
		||||
  * Fix PR template error (#1834)
 | 
			
		||||
  * Fix pull request compare link (#1832)
 | 
			
		||||
  * Use ghost users in issues/PRs (#1831)
 | 
			
		||||
  * Commitless repos should be bare (#1829)
 | 
			
		||||
  * Update code.gitea.io/git (#1824)
 | 
			
		||||
  * Fix invalid reference in feeds template (#1820)
 | 
			
		||||
  * fix bug to deny to add orgnization as a member of an orgnization or team (#1815)
 | 
			
		||||
  * xxx_active_code_live setting in printed in hours and minutes instead … (#1814)
 | 
			
		||||
  * Fix deadlock in updateRepository (#1813)
 | 
			
		||||
  * Give all units to owner team (#1812)
 | 
			
		||||
  * Fix 500 for GET /teams/:id endpoints (#1811)
 | 
			
		||||
  * fix bug not to trim space of login username (#1796)
 | 
			
		||||
  * Fix renaming bug (#1786)
 | 
			
		||||
  * Fix activity feed (#1779)
 | 
			
		||||
  * Make navbar scroll on overflow (#1777)
 | 
			
		||||
  * Delete repo redirects on repo deletion (#1776)
 | 
			
		||||
  * Fix unloaded owner bug (#1770)
 | 
			
		||||
  * Admin should always be allowed to create repositories even if hit limit (#1765)
 | 
			
		||||
  * Update HighlightJS and fix YAML files highlighting (#1764)
 | 
			
		||||
  * fix: #1757 fix set MAX_CREATION_LIMIT as zero. (#1762)
 | 
			
		||||
  * fix admin lost permission caused by #947 (#1753)
 | 
			
		||||
  * More fixes for dashboard search (#1750)
 | 
			
		||||
  * fixes wrong after field in webhook payload (#1746)
 | 
			
		||||
  * fix avatar update bug (#1729)
 | 
			
		||||
  * Fix FOUC on Firefox (#1728)
 | 
			
		||||
  * Fix changes introduce by update of go-swagger. (#1727)
 | 
			
		||||
  * Fix #1719 (#1722)
 | 
			
		||||
  * Correct flash after sending password reset email (#1718)
 | 
			
		||||
  * Fix and test for delete user (#1713)
 | 
			
		||||
  * Fix rendering of issue checkboxes (#1709)
 | 
			
		||||
  * Enforce netgo build tag while cross-compilation (#1690)
 | 
			
		||||
  * fix bug when push a branch name with / & fix an integration test bug (#1689)
 | 
			
		||||
  * fix potential sqlite lock (#1680)
 | 
			
		||||
  * Fix commit sha1 URL rendering in markdown (#1677)
 | 
			
		||||
  * Fix static files permission under public/ (#1675)
 | 
			
		||||
  * fix: tag contain character ) will http 500 on release page (#1670)
 | 
			
		||||
  * Fix CSS for code in wiki markdown (#1660)
 | 
			
		||||
  * fix multiple readme file rendering and fix #1657 (#1658)
 | 
			
		||||
  * Add primary key and index to external login user table (#1656)
 | 
			
		||||
  * fix #1643 and improve integration test (#1645)
 | 
			
		||||
  * Fix version in Makefile (#1636)
 | 
			
		||||
  * Handle display of GPG key without end date (#1628)
 | 
			
		||||
  * fix bug on issue view when not login (#1624)
 | 
			
		||||
  * bug fixed for API to get user's repos (#1622)
 | 
			
		||||
  * fix lost text color on button on set as primary email (#1621)
 | 
			
		||||
  * Add create_at and updated_at in PR json (#1616)
 | 
			
		||||
  * update git and fix #1133 (#1614)
 | 
			
		||||
  * fix bug on status API (#1533)
 | 
			
		||||
  * Do not show empty collaborators segment (#1531)
 | 
			
		||||
  * Fix markdown rendering (#1530)
 | 
			
		||||
  * fix go get sub package and add domain on installation to let go get work defaultly (#1518)
 | 
			
		||||
  * fix #1501 ssh hangs caused by #1461 (#1513)
 | 
			
		||||
  * Fix empty file download (#1506)
 | 
			
		||||
  * Fix broken v27 migration - change mirror interval from int to bigint (#1504)
 | 
			
		||||
  * Do not allow commiting to protected branch from online editor (#1502)
 | 
			
		||||
  * Add internal routes for ssh hook comands (#1471)
 | 
			
		||||
  * Fix races within code.gitea.io/git.(*Command).RunInDirTimeoutPipeline (#1465)
 | 
			
		||||
  * Simple quick fix for #1418 (#1456)
 | 
			
		||||
  * fix gpg API panic when no verification (#1451)
 | 
			
		||||
  * fix migrate failed and org dashboard failed on MSSQL database (#1448)
 | 
			
		||||
  * Optimize and fix autolink function (#1442) (#1444)
 | 
			
		||||
  * Fix and simplify repo branches (settings) UI (#1435)
 | 
			
		||||
  * Fix disabled fields in repo settings UI (#1431)
 | 
			
		||||
  * fixes pull request hanging when it contains normal and LFS files (#1425)
 | 
			
		||||
  * Fix races in the log module by using syncmap (#1421)
 | 
			
		||||
  * Add length check for the return string (#1420)
 | 
			
		||||
  * Fix "Error: No issue number specified"  when pushing (#1393)
 | 
			
		||||
  * Corrected Mirror.NextUpdate not set (#1388)
 | 
			
		||||
  * fix: remove `str2html` from org full name (#1360)
 | 
			
		||||
  * Correct broken unaligned load/store in armv5 (#1355)
 | 
			
		||||
  * Remove href on first/last link when on first/last page (#1345)
 | 
			
		||||
  * Fix broken table layout (#1344)
 | 
			
		||||
  * LFS: Fix SSH authentication for trailing arguments (#1328)
 | 
			
		||||
  * Remove empty file (#1326)
 | 
			
		||||
  * Fix delete user failed on sqlite (#1321)
 | 
			
		||||
  * Fix inconsistency in layout (#1316)
 | 
			
		||||
  * Fix gpg wrong column types (#1303)
 | 
			
		||||
  * Fix wiki bugs (#1294)
 | 
			
		||||
  * Fix missing less sources for oauth (#1288)
 | 
			
		||||
  * Make sure both scripts/ can live side by side (#1264)
 | 
			
		||||
  * Fix nil-dereference bug (#1258)
 | 
			
		||||
  * rewrite pre-commit, post-commit and options hooks (fixes #1250) (#1257)
 | 
			
		||||
  * Commit search appearence fixes (#1254)
 | 
			
		||||
  * Fix forget migration for wiki hooks (#1227)
 | 
			
		||||
  * Fix repo settings external tracker failed and check external urls (#1215)
 | 
			
		||||
  * Fix 500 caused by branches settings introduced by #1198 (#1214)
 | 
			
		||||
  * fix #1189, commit messages containing a pipe (#1203)
 | 
			
		||||
  * Bug fixed for delete repo failed (#1193)
 | 
			
		||||
  * Fix migration failed when authorized_keys is not exist (#1180)
 | 
			
		||||
  * Fix ini format incomiptable with crowdin (#1177)
 | 
			
		||||
* TESTING
 | 
			
		||||
  * Integration tests for issues API (#2059)
 | 
			
		||||
  * Add integration tests for signin (#2363)
 | 
			
		||||
  * Add INTERNAL_TOKEN to integration .ini file (#2346)
 | 
			
		||||
  * Add public links check (#2323)
 | 
			
		||||
  * Fix hooks for integration repo (#2216)
 | 
			
		||||
  * More integration tests for comment API (#2156)
 | 
			
		||||
  * Cache session cookies in tests (#2128)
 | 
			
		||||
  * Less verbose integration tests (#2123)
 | 
			
		||||
  * Fix improper setup for integration tests (#2050)
 | 
			
		||||
  * Improve integration test helper functions (#2049)
 | 
			
		||||
  * Add integration test for issue creating (#2002)
 | 
			
		||||
  * Use testing/benchmark interface (#1993)
 | 
			
		||||
  * Add integration test for repository migration (#1983)
 | 
			
		||||
  * Consolidate boilerplate in integration tests (#1979)
 | 
			
		||||
  * Set console to debug for integration tests (#1976)
 | 
			
		||||
  * Add pull-create integration test (#1972)
 | 
			
		||||
  * Coverage reports for integration tests (#1960)
 | 
			
		||||
  * Add integration test for pull-request merge (#1912)
 | 
			
		||||
  * Add integration test for file editing (#1907)
 | 
			
		||||
  * Add integration test for repository forking (#1896)
 | 
			
		||||
  * Run unused test (#1875)
 | 
			
		||||
  * Don't recreate database in integration tests (#1697)
 | 
			
		||||
  * remove sqlite tag when integration test with mysql/postgres and recreate database when init integration test (#1693)
 | 
			
		||||
  * MySQL, Postgres integration tests in drone (#1638)
 | 
			
		||||
  * improve integration test to resue models/fixtures and store git repos with tests (#1627)
 | 
			
		||||
  * Improve govendor testing (#1623)
 | 
			
		||||
  * Integration test framework (#1290)
 | 
			
		||||
  * Unit tests for issue_list (#1209)
 | 
			
		||||
  * Add integration test for signup (#1135)
 | 
			
		||||
* TRANSLATION
 | 
			
		||||
  * update translation from crowdin (#2368) (#2380)
 | 
			
		||||
  * Small fixes (#2144)
 | 
			
		||||
  * Missing signed commit display translations (#2134)
 | 
			
		||||
  * Sync latest translations from crowdin (#2104)
 | 
			
		||||
  * Add make command update-translations for update translations from crodwin (#2097)
 | 
			
		||||
  * Fix some mistakes (#1833)
 | 
			
		||||
  * Improve clarity between is_activated and prohibit_login (#1788)
 | 
			
		||||
  * Improve grammar (#1775)
 | 
			
		||||
  * Fix bad grammar and wordiness (#1741)
 | 
			
		||||
  * Make strings translatable (#1188) (#1198)
 | 
			
		||||
* BUILD
 | 
			
		||||
  * Dockerfile for aarch64 (#1128) (#1130)
 | 
			
		||||
  * backport from v1.2 branch: add secrets for github release (#2588) (#2598)
 | 
			
		||||
  * Add secrets for github release to fix drone failed (#2588)
 | 
			
		||||
  * Backport changes for latest drone (#2586)
 | 
			
		||||
  * Removing .drone.yml.sig (#2579)
 | 
			
		||||
  * Fix drone for tags (#2573) (#2576)
 | 
			
		||||
  * Backport: Remove go version check for make fmt (#2558) (#2561)
 | 
			
		||||
  * Backport: Fix lint, fmt and integration testing errors (#2553)
 | 
			
		||||
  * update latest xorm version to vendor (#2353)
 | 
			
		||||
  * Remove integration test executables on `make clean` (#2340)
 | 
			
		||||
  * refactor(Makefile): allow overriding default go program (#2310)
 | 
			
		||||
  * Revert to upstream ini dependency (#2304)
 | 
			
		||||
  * Use /dev/urandom to create random password (#2298)
 | 
			
		||||
  * update drone sig file. (#2262)
 | 
			
		||||
  * go get github.com/wadey/gocovmerge when needed (#2235)
 | 
			
		||||
  * fix typo (#2145)
 | 
			
		||||
  * Revert "Reduce number of layer" (#2086)
 | 
			
		||||
  * Reduce number of layer (#2078)
 | 
			
		||||
  * Skip sqlite integration in CI (#2058)
 | 
			
		||||
  * fix golint error and rename func for suggestion. (#1997)
 | 
			
		||||
  * fix misspell (#1996)
 | 
			
		||||
  * update drone sig file (#1981)
 | 
			
		||||
  * send notification if status changed (#1973)
 | 
			
		||||
  * switch gitter to discord for drone. (#1971)
 | 
			
		||||
  * Fix missing backslash in Dockerfile.rpi (#1952)
 | 
			
		||||
  * Don't run 'make release' on PRs (#1908)
 | 
			
		||||
  * Update code.gitea.io/git (#1892)
 | 
			
		||||
  * Use production version of vuejs (#1869)
 | 
			
		||||
  * Add a variable for docker tag (#1825)
 | 
			
		||||
  * resign drone and fix #1816 (#1819)
 | 
			
		||||
  * Separate generate swagger + fix sed os specific (#1791)
 | 
			
		||||
  * Only run coverage on merges/pushes to master (#1783)
 | 
			
		||||
  * Remove stale rule from Makefile (#1782)
 | 
			
		||||
  * feat: upgrade drone docker image to support multi-stage build. (#1732)
 | 
			
		||||
  * Realy don't cache apk index (#1694)
 | 
			
		||||
  * Limit clone depth when drone-building (#1644)
 | 
			
		||||
  * Refactor Dockerfile (#1632)
 | 
			
		||||
  * Check if missing/modified/unused deps in vendor and fix errors (#1468)
 | 
			
		||||
  * Add GOFLAGS and EXTRA_GOFLAGS (#1438)
 | 
			
		||||
  * Include formatting check to the `make test` (and thus also `check`) rule (#1366)
 | 
			
		||||
* DOCS
 | 
			
		||||
  * fix wrong changelog title (#2395)
 | 
			
		||||
  * fix webhook link (#2289)
 | 
			
		||||
  * Improve swagger doc (#2274)
 | 
			
		||||
  * Add link to forum in issue template (#2070)
 | 
			
		||||
  * add missing lfs config on example file (#2039)
 | 
			
		||||
  * Add discourse link (#2027)
 | 
			
		||||
  * Fix wording (#2024)
 | 
			
		||||
  * Fix typo (#1974)
 | 
			
		||||
  * Swagger docs for list/create forks (#1941)
 | 
			
		||||
  * Update links to Discord server (#1940)
 | 
			
		||||
  * [ci skip] update discord badge. (#1930)
 | 
			
		||||
  * Change join chat from gitter to discord (#1929)
 | 
			
		||||
  * Update changelog with v1.1.1 (#1926)
 | 
			
		||||
  * Correct grammar in APIEmpty documentation (#1748)
 | 
			
		||||
  * Add swagger comment for MirrorSync (#1747)
 | 
			
		||||
  * Add "Table of Contents" in CONTRIBUTING.md (#1634)
 | 
			
		||||
  * Fix service description in Debian init file (#1538)
 | 
			
		||||
  * Use MAINTAINERS file in repository in CONTRIBUTING (#1489)
 | 
			
		||||
  * Generate swagger json (#1402)
 | 
			
		||||
  * Changed text when password reset disabled. (#1364)
 | 
			
		||||
  * Removed email copyright year (#1348)
 | 
			
		||||
  * Specify that time interval units are seconds (#1311)
 | 
			
		||||
  * Gitea OpenID-2.0 login has been tested with livejournal.com too (#1306)
 | 
			
		||||
  * Make wording of commit search more clear (#1291)
 | 
			
		||||
  * Add notice that LFS mirroring is not supported (#1251)
 | 
			
		||||
  * Fix typos in models/ and modules/ (#1248)
 | 
			
		||||
  * Refactor and fix incorrect comment (#1247)
 | 
			
		||||
  * Fix migration comment (#1241)
 | 
			
		||||
  * Update locale_en-US.ini (#1235)
 | 
			
		||||
  * Add LibreJS support (#1201)
 | 
			
		||||
  * rename OSX to macOS (#1176)
 | 
			
		||||
  * add mssql to app.ini db config comment (#1172)
 | 
			
		||||
  * Add MSSQL to issues template (#1171)
 | 
			
		||||
* MISC
 | 
			
		||||
  * Add badge and link to the Matrix room (#2348)
 | 
			
		||||
  * ignore coverage steps. (#2257)
 | 
			
		||||
  * Use sqlite3 database as default for Docker image (#2182)
 | 
			
		||||
  * update drone discord plugin to 0.0.4 version (#1992)
 | 
			
		||||
  * fix typo (#1990)
 | 
			
		||||
  * Move 3rd party js/css into `public/vendor` and document sources (#2383)
 | 
			
		||||
  * Prevent conflicting TOTP accounts by adding AppURL to issuer parameter (#2335)
 | 
			
		||||
  * Fix variable name typo (#2327)
 | 
			
		||||
  * Make use of Vue more universal (#2318)
 | 
			
		||||
  * Remove (almost) server side data rendering from repo-search component (#2317)
 | 
			
		||||
  * Add OpenID configuration in install page (#2276)
 | 
			
		||||
  * More tweaks to repo top panel (#2267)
 | 
			
		||||
  * File path tweaks in UI (#2264)
 | 
			
		||||
  * Make SHOW_USER_EMAIL also apply to profiles (#2258)
 | 
			
		||||
  * EnableUnit() -> UnitEnabled() (#2242)
 | 
			
		||||
  * Prevent selection of diff line numbers (#2240)
 | 
			
		||||
  * Remove unused variable on makefile (#2225)
 | 
			
		||||
  * No error log entries for repo 404 (#2200)
 | 
			
		||||
  * Refactor vue delimeters to use es6 template delimeters (#2171)
 | 
			
		||||
  * Replace tmp with TMPDIR. (#2152)
 | 
			
		||||
  * Remove unused files (#2124)
 | 
			
		||||
  * Improve org error handling (#2117)
 | 
			
		||||
  * Absolute path for setting.CustomConf (#2085)
 | 
			
		||||
  * remove deprecated code for Gogs compitable (#2041)
 | 
			
		||||
  * Refactor session close as xorm already does everything needed internally  (#2020)
 | 
			
		||||
  * SQLite has a query timeout. Hopefully fixes most 'database locked' errors (#1961)
 | 
			
		||||
  * Use monospace font in githook editor (#1958)
 | 
			
		||||
  * Fix import order (#1951)
 | 
			
		||||
  * Gracefully handle bare repositories on API operations. (#1932)
 | 
			
		||||
  * Fix errors caused by force push (#1927)
 | 
			
		||||
  * Display URLs in integration test logs (#1924)
 | 
			
		||||
  * Set TMPDIR enviroment variable for dump command (#1915)
 | 
			
		||||
  * Cache ctx.User in retrieveFeeds (#1902)
 | 
			
		||||
  * Make `LocalCopyPath` a setting instead of a hard-coded path (#1881)
 | 
			
		||||
  * Add check misspelling (#1877)
 | 
			
		||||
  * Fix misspelled variables (#1874)
 | 
			
		||||
  * Gofmt (#1868, #1710, #1662)
 | 
			
		||||
  * Rename misnamed migration (#1867)
 | 
			
		||||
  * Support CRLF when splitting code lines for display (#1862)
 | 
			
		||||
  * Add convert less css file step. (#1861)
 | 
			
		||||
  * Prevent accidential selection of line numbers in code view (#1860)
 | 
			
		||||
  * Delete Public SSH Key tmp file after calculating fingerprint (#1855)
 | 
			
		||||
  * Remove annoying difference in button heights. (#1853)
 | 
			
		||||
  * Only run test coverage on master branch. (#1838)
 | 
			
		||||
  * Error from mktemp command in MacOS. (#1837)
 | 
			
		||||
  * Use writeTmpKeyFile in calcFingerprint (#1828)
 | 
			
		||||
  * ROOT_URL setting use the default as shown in conf/app.ini (#1823)
 | 
			
		||||
  * Rename RepoCreationNum -> MaxCreationLimit (#1766)
 | 
			
		||||
  * Add button to admin ui (#1738)
 | 
			
		||||
  * Correct spelling mistakes (#1703)
 | 
			
		||||
  * Make openid support default false for compitable with v1.1 (#1650)
 | 
			
		||||
  * Send mails as HTML as default. Setting for send as plain text. (#1648)
 | 
			
		||||
  * fix potential lock when sqlite (#1647)
 | 
			
		||||
  * Optimize png images via Google zopflipng [ci skip] (#1639)
 | 
			
		||||
  * Upgrade alpine to v3.5 in Dockerfile (#1633)
 | 
			
		||||
  * remove unused vendor packages (#1620)
 | 
			
		||||
  * markup: microoptimise for many short filenames in directory (#1534)
 | 
			
		||||
  * support health check via / and fix #969 (#1520)
 | 
			
		||||
  * Remove env user salt since no need to use (#1515)
 | 
			
		||||
  * Drop db operations from hook commands (#1514)
 | 
			
		||||
  * Better URL validation (#1507)
 | 
			
		||||
  * Migrate WatchInfo struct to api (#1492)
 | 
			
		||||
  * refactor: show command help message. (#1486)
 | 
			
		||||
  * refactor update ssh key use time (#1466)
 | 
			
		||||
  * Set VERSION from git once, in a variable (#1447)
 | 
			
		||||
  * Remove unused mutex field (#1440)
 | 
			
		||||
  * Simplify settings pages with item list (#1389)
 | 
			
		||||
  * Clean-up PostgreSQL Tests (#1361)
 | 
			
		||||
  * refactor: remove workaround after the golang 1.7 release. (#1349)
 | 
			
		||||
  * Delete the useless code (#1335)
 | 
			
		||||
  * Run "make fmt" with go-1.6 (#1333)
 | 
			
		||||
  * Refactor admin/auth/new.tmpl (#1277)
 | 
			
		||||
  * Refactor repo/issue/view_content.tmpl (#1276)
 | 
			
		||||
  * Cleaner ui for admin, repo settings, and user settings page (#1269) (#1270)
 | 
			
		||||
  * Cleaner UI for explore page (#1253) (#1255)
 | 
			
		||||
  * Synced licenses with github repo (#1246)
 | 
			
		||||
  * Synced gitignores with github repo (#1245)
 | 
			
		||||
  * Simplify RepositoryList.loadAttributes() (#1211)
 | 
			
		||||
  * Move user_follow to separate file (#1210)
 | 
			
		||||
  * Reduce conditionals in signin/signup inner forms (#1138)
 | 
			
		||||
 | 
			
		||||
## [1.1.3](https://github.com/go-gitea/gitea/releases/tag/v1.1.3) - 2017-08-03
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								Makefile
									
									
									
									
									
								
							@@ -56,11 +56,8 @@ clean:
 | 
			
		||||
	$(GO) clean -i ./...
 | 
			
		||||
	rm -rf $(EXECUTABLE) $(DIST) $(BINDATA) integrations*.test
 | 
			
		||||
 | 
			
		||||
required-gofmt-version:
 | 
			
		||||
	@$(GO) version  | grep -q '\(1.7\|1.8\)' || { echo "We require go version 1.7 or 1.8 to format code" >&2 && exit 1; }
 | 
			
		||||
 | 
			
		||||
.PHONY: fmt
 | 
			
		||||
fmt: required-gofmt-version
 | 
			
		||||
fmt:
 | 
			
		||||
	$(GOFMT) -w $(GOFILES)
 | 
			
		||||
 | 
			
		||||
.PHONY: vet
 | 
			
		||||
@@ -112,7 +109,7 @@ misspell:
 | 
			
		||||
	misspell -w -i unknwon $(GOFILES)
 | 
			
		||||
 | 
			
		||||
.PHONY: fmt-check
 | 
			
		||||
fmt-check: required-gofmt-version
 | 
			
		||||
fmt-check:
 | 
			
		||||
	# get all go files and run go fmt on them
 | 
			
		||||
	@diff=$$($(GOFMT) -d $(GOFILES)); \
 | 
			
		||||
	if [ -n "$$diff" ]; then \
 | 
			
		||||
@@ -285,9 +282,9 @@ public/css/index.css: $(STYLESHEETS)
 | 
			
		||||
 | 
			
		||||
.PHONY: swagger-ui
 | 
			
		||||
swagger-ui:
 | 
			
		||||
	rm -Rf public/assets/swagger-ui
 | 
			
		||||
	rm -Rf public/vendor/assets/swagger-ui
 | 
			
		||||
	git clone --depth=10 -b v3.0.7 --single-branch https://github.com/swagger-api/swagger-ui.git $(TMPDIR)/swagger-ui
 | 
			
		||||
	mv $(TMPDIR)/swagger-ui/dist public/assets/swagger-ui
 | 
			
		||||
	mv $(TMPDIR)/swagger-ui/dist public/vendor/assets/swagger-ui
 | 
			
		||||
	rm -Rf $(TMPDIR)/swagger-ui
 | 
			
		||||
	$(SED_INPLACE) "s;http://petstore.swagger.io/v2/swagger.json;../../swagger.v1.json;g" public/assets/swagger-ui/index.html
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								cmd/hook.go
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								cmd/hook.go
									
									
									
									
									
								
							@@ -126,15 +126,13 @@ func runHookPreReceive(c *cli.Context) error {
 | 
			
		||||
			log.GitLogger.Fatal(2, "retrieve protected branches information failed")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if protectBranch != nil {
 | 
			
		||||
			if !protectBranch.CanPush {
 | 
			
		||||
				// check and deletion
 | 
			
		||||
				if newCommitID == git.EmptySHA {
 | 
			
		||||
					fail(fmt.Sprintf("branch %s is protected from deletion", branchName), "")
 | 
			
		||||
				} else {
 | 
			
		||||
					fail(fmt.Sprintf("protected branch %s can not be pushed to", branchName), "")
 | 
			
		||||
					//fail(fmt.Sprintf("branch %s is protected from force push", branchName), "")
 | 
			
		||||
				}
 | 
			
		||||
		if protectBranch != nil && protectBranch.IsProtected() {
 | 
			
		||||
			// check and deletion
 | 
			
		||||
			if newCommitID == git.EmptySHA {
 | 
			
		||||
				fail(fmt.Sprintf("branch %s is protected from deletion", branchName), "")
 | 
			
		||||
			} else if !protectBranch.CanPush {
 | 
			
		||||
				fail(fmt.Sprintf("protected branch %s can not be pushed to", branchName), "")
 | 
			
		||||
				//fail(fmt.Sprintf("branch %s is protected from force push", branchName), "")
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										260
									
								
								integrations/api_gpg_keys_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										260
									
								
								integrations/api_gpg_keys_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,260 @@
 | 
			
		||||
// Copyright 2017 The Gogs Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package integrations
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
 | 
			
		||||
	api "code.gitea.io/sdk/gitea"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestGPGKeys(t *testing.T) {
 | 
			
		||||
	prepareTestEnv(t)
 | 
			
		||||
	session := loginUser(t, "user2")
 | 
			
		||||
 | 
			
		||||
	tt := []struct {
 | 
			
		||||
		name       string
 | 
			
		||||
		reqBuilder func(testing.TB, *http.Request, int) *TestResponse
 | 
			
		||||
		results    []int
 | 
			
		||||
	}{
 | 
			
		||||
		{name: "NoLogin", reqBuilder: MakeRequest,
 | 
			
		||||
			results: []int{http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized},
 | 
			
		||||
		},
 | 
			
		||||
		{name: "LoggedAsUser2", reqBuilder: session.MakeRequest,
 | 
			
		||||
			results: []int{http.StatusOK, http.StatusOK, http.StatusNotFound, http.StatusNoContent, http.StatusInternalServerError, http.StatusInternalServerError, http.StatusCreated, http.StatusCreated}},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range tt {
 | 
			
		||||
 | 
			
		||||
		//Basic test on result code
 | 
			
		||||
		t.Run(tc.name, func(t *testing.T) {
 | 
			
		||||
			t.Run("ViewOwnGPGKeys", func(t *testing.T) {
 | 
			
		||||
				testViewOwnGPGKeys(t, tc.reqBuilder, tc.results[0])
 | 
			
		||||
			})
 | 
			
		||||
			t.Run("ViewGPGKeys", func(t *testing.T) {
 | 
			
		||||
				testViewGPGKeys(t, tc.reqBuilder, tc.results[1])
 | 
			
		||||
			})
 | 
			
		||||
			t.Run("GetGPGKey", func(t *testing.T) {
 | 
			
		||||
				testGetGPGKey(t, tc.reqBuilder, tc.results[2])
 | 
			
		||||
			})
 | 
			
		||||
			t.Run("DeleteGPGKey", func(t *testing.T) {
 | 
			
		||||
				testDeleteGPGKey(t, tc.reqBuilder, tc.results[3])
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
			t.Run("CreateInvalidGPGKey", func(t *testing.T) {
 | 
			
		||||
				testCreateInvalidGPGKey(t, tc.reqBuilder, tc.results[4])
 | 
			
		||||
			})
 | 
			
		||||
			t.Run("CreateNoneRegistredEmailGPGKey", func(t *testing.T) {
 | 
			
		||||
				testCreateNoneRegistredEmailGPGKey(t, tc.reqBuilder, tc.results[5])
 | 
			
		||||
			})
 | 
			
		||||
			t.Run("CreateValidGPGKey", func(t *testing.T) {
 | 
			
		||||
				testCreateValidGPGKey(t, tc.reqBuilder, tc.results[6])
 | 
			
		||||
			})
 | 
			
		||||
			t.Run("CreateValidSecondaryEmailGPGKey", func(t *testing.T) {
 | 
			
		||||
				testCreateValidSecondaryEmailGPGKey(t, tc.reqBuilder, tc.results[7])
 | 
			
		||||
			})
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//Check state after basic add
 | 
			
		||||
	t.Run("CheckState", func(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
		var keys []*api.GPGKey
 | 
			
		||||
 | 
			
		||||
		req := NewRequest(t, "GET", "/api/v1/user/gpg_keys") //GET all keys
 | 
			
		||||
		resp := session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
		DecodeJSON(t, resp, &keys)
 | 
			
		||||
 | 
			
		||||
		primaryKey1 := keys[0] //Primary key 1
 | 
			
		||||
		assert.EqualValues(t, "38EA3BCED732982C", primaryKey1.KeyID)
 | 
			
		||||
		assert.EqualValues(t, 1, len(primaryKey1.Emails))
 | 
			
		||||
		assert.EqualValues(t, "user2@example.com", primaryKey1.Emails[0].Email)
 | 
			
		||||
		assert.EqualValues(t, true, primaryKey1.Emails[0].Verified)
 | 
			
		||||
 | 
			
		||||
		subKey := primaryKey1.SubsKey[0] //Subkey of 38EA3BCED732982C
 | 
			
		||||
		assert.EqualValues(t, "70D7C694D17D03AD", subKey.KeyID)
 | 
			
		||||
		assert.EqualValues(t, 0, len(subKey.Emails))
 | 
			
		||||
 | 
			
		||||
		primaryKey2 := keys[1] //Primary key 2
 | 
			
		||||
		assert.EqualValues(t, "FABF39739FE1E927", primaryKey2.KeyID)
 | 
			
		||||
		assert.EqualValues(t, 1, len(primaryKey2.Emails))
 | 
			
		||||
		assert.EqualValues(t, "user21@example.com", primaryKey2.Emails[0].Email)
 | 
			
		||||
		assert.EqualValues(t, false, primaryKey2.Emails[0].Verified)
 | 
			
		||||
 | 
			
		||||
		var key api.GPGKey
 | 
			
		||||
		req = NewRequest(t, "GET", "/api/v1/user/gpg_keys/"+strconv.FormatInt(primaryKey1.ID, 10)) //Primary key 1
 | 
			
		||||
		resp = session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
		DecodeJSON(t, resp, &key)
 | 
			
		||||
		assert.EqualValues(t, "38EA3BCED732982C", key.KeyID)
 | 
			
		||||
		assert.EqualValues(t, 1, len(key.Emails))
 | 
			
		||||
		assert.EqualValues(t, "user2@example.com", key.Emails[0].Email)
 | 
			
		||||
		assert.EqualValues(t, true, key.Emails[0].Verified)
 | 
			
		||||
 | 
			
		||||
		req = NewRequest(t, "GET", "/api/v1/user/gpg_keys/"+strconv.FormatInt(subKey.ID, 10)) //Subkey of 38EA3BCED732982C
 | 
			
		||||
		resp = session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
		DecodeJSON(t, resp, &key)
 | 
			
		||||
		assert.EqualValues(t, "70D7C694D17D03AD", key.KeyID)
 | 
			
		||||
		assert.EqualValues(t, 0, len(key.Emails))
 | 
			
		||||
 | 
			
		||||
		req = NewRequest(t, "GET", "/api/v1/user/gpg_keys/"+strconv.FormatInt(primaryKey2.ID, 10)) //Primary key 2
 | 
			
		||||
		resp = session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
		DecodeJSON(t, resp, &key)
 | 
			
		||||
		assert.EqualValues(t, "FABF39739FE1E927", key.KeyID)
 | 
			
		||||
		assert.EqualValues(t, 1, len(key.Emails))
 | 
			
		||||
		assert.EqualValues(t, "user21@example.com", key.Emails[0].Email)
 | 
			
		||||
		assert.EqualValues(t, false, key.Emails[0].Verified)
 | 
			
		||||
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	//Check state after basic add
 | 
			
		||||
	t.Run("CheckCommits", func(t *testing.T) {
 | 
			
		||||
		t.Run("NotSigned", func(t *testing.T) {
 | 
			
		||||
			var branch api.Branch
 | 
			
		||||
			req := NewRequest(t, "GET", "/api/v1/repos/user2/repo16/branches/not-signed")
 | 
			
		||||
			resp := session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
			DecodeJSON(t, resp, &branch)
 | 
			
		||||
			assert.EqualValues(t, false, branch.Commit.Verification.Verified)
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		t.Run("SignedWithNotValidatedEmail", func(t *testing.T) {
 | 
			
		||||
			var branch api.Branch
 | 
			
		||||
			req := NewRequest(t, "GET", "/api/v1/repos/user2/repo16/branches/good-sign-not-yet-validated")
 | 
			
		||||
			resp := session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
			DecodeJSON(t, resp, &branch)
 | 
			
		||||
			assert.EqualValues(t, false, branch.Commit.Verification.Verified)
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		t.Run("SignedWithValidEmail", func(t *testing.T) {
 | 
			
		||||
			var branch api.Branch
 | 
			
		||||
			req := NewRequest(t, "GET", "/api/v1/repos/user2/repo16/branches/good-sign")
 | 
			
		||||
			resp := session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
			DecodeJSON(t, resp, &branch)
 | 
			
		||||
			assert.EqualValues(t, true, branch.Commit.Verification.Verified)
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testViewOwnGPGKeys(t *testing.T, reqBuilder func(testing.TB, *http.Request, int) *TestResponse, expected int) {
 | 
			
		||||
	req := NewRequest(t, "GET", "/api/v1/user/gpg_keys")
 | 
			
		||||
	reqBuilder(t, req, expected)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testViewGPGKeys(t *testing.T, reqBuilder func(testing.TB, *http.Request, int) *TestResponse, expected int) {
 | 
			
		||||
	req := NewRequest(t, "GET", "/api/v1/users/user2/gpg_keys")
 | 
			
		||||
	reqBuilder(t, req, expected)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testGetGPGKey(t *testing.T, reqBuilder func(testing.TB, *http.Request, int) *TestResponse, expected int) {
 | 
			
		||||
	req := NewRequest(t, "GET", "/api/v1/user/gpg_keys/1")
 | 
			
		||||
	reqBuilder(t, req, expected)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testDeleteGPGKey(t *testing.T, reqBuilder func(testing.TB, *http.Request, int) *TestResponse, expected int) {
 | 
			
		||||
	req := NewRequest(t, "DELETE", "/api/v1/user/gpg_keys/1")
 | 
			
		||||
	reqBuilder(t, req, expected)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testCreateGPGKey(t *testing.T, reqBuilder func(testing.TB, *http.Request, int) *TestResponse, expected int, publicKey string) {
 | 
			
		||||
	req := NewRequestWithJSON(t, "POST", "/api/v1/user/gpg_keys", api.CreateGPGKeyOption{
 | 
			
		||||
		ArmoredKey: publicKey,
 | 
			
		||||
	})
 | 
			
		||||
	reqBuilder(t, req, expected)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testCreateInvalidGPGKey(t *testing.T, reqBuilder func(testing.TB, *http.Request, int) *TestResponse, expected int) {
 | 
			
		||||
	testCreateGPGKey(t, reqBuilder, expected, "invalid_key")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testCreateNoneRegistredEmailGPGKey(t *testing.T, reqBuilder func(testing.TB, *http.Request, int) *TestResponse, expected int) {
 | 
			
		||||
	testCreateGPGKey(t, reqBuilder, expected, `-----BEGIN PGP PUBLIC KEY BLOCK-----
 | 
			
		||||
 | 
			
		||||
mQENBFmGUygBCACjCNbKvMGgp0fd5vyFW9olE1CLCSyyF9gQN2hSuzmZLuAZF2Kh
 | 
			
		||||
dCMCG2T1UwzUB/yWUFWJ2BtCwSjuaRv+cGohqEy6bhEBV90peGA33lHfjx7wP25O
 | 
			
		||||
7moAphDOTZtDj1AZfCh/PTcJut8Lc0eRDMhNyp/bYtO7SHNT1Hr6rrCV/xEtSAvR
 | 
			
		||||
3b148/tmIBiSadaLwc558KU3ucjnW5RVGins3AjBZ+TuT4XXVH/oeLSeXPSJ5rt1
 | 
			
		||||
rHwaseslMqZ4AbvwFLx5qn1OC9rEQv/F548QsA8m0IntLjoPon+6wcubA9Gra21c
 | 
			
		||||
Fp6aRYl9x7fiqXDLg8i3s2nKdV7+e6as6Tp9ABEBAAG0FG5vdGtub3duQGV4YW1w
 | 
			
		||||
bGUuY29tiQEcBBABAgAGBQJZhlMoAAoJEC8+pvYULDtte/wH/2JNrhmHwDY+hMj0
 | 
			
		||||
batIK4HICnkKxjIgbha80P2Ao08NkzSge58fsxiKDFYAQjHui+ZAw4dq79Ax9AOO
 | 
			
		||||
Iv2GS9+DUfWhrb6RF+vNuJldFzcI0rTW/z2q+XGKrUCwN3khJY5XngHfQQrdBtMK
 | 
			
		||||
qsoUXz/5B8g422RTbo/SdPsyYAV6HeLLeV3rdgjI1fpaW0seZKHeTXQb/HvNeuPg
 | 
			
		||||
qz+XV1g6Gdqa1RjDOaX7A8elVKxrYq3LBtc93FW+grBde8n7JL0zPM3DY+vJ0IJZ
 | 
			
		||||
INx/MmBfmtCq05FqNclvU+sj2R3N1JJOtBOjZrJHQbJhzoILou8AkxeX1A+q9OAz
 | 
			
		||||
1geiY5E=
 | 
			
		||||
=TkP3
 | 
			
		||||
-----END PGP PUBLIC KEY BLOCK-----`)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testCreateValidGPGKey(t *testing.T, reqBuilder func(testing.TB, *http.Request, int) *TestResponse, expected int) {
 | 
			
		||||
	//User2 <user2@example.com> //primary & activated
 | 
			
		||||
	testCreateGPGKey(t, reqBuilder, expected, `-----BEGIN PGP PUBLIC KEY BLOCK-----
 | 
			
		||||
 | 
			
		||||
mQENBFmGVsMBCACuxgZ7W7rI9xN08Y4M7B8yx/6/I4Slm94+wXf8YNRvAyqj30dW
 | 
			
		||||
VJhyBcnfNRDLKSQp5o/hhfDkCgdqBjLa1PnHlGS3PXJc0hP/FyYPD2BFvNMPpCYS
 | 
			
		||||
eu3T1qKSNXm6X0XOWD2LIrdiDC8HaI9FqZVMI/srMK2CF8XCL2m67W1FuoPlWzod
 | 
			
		||||
5ORy0IZB7spoF0xihmcgnEGElRmdo5w/vkGH8U7Zyn9Eb57UVFeafgeskf4wqB23
 | 
			
		||||
BjbMdW2YaB+yzMRwYgOnD5lnBD4uqSmvjaV9C0kxn7x+oJkkiRV8/z1cNcO+BaeQ
 | 
			
		||||
Akh/yTTeTzYGSc/ZOqCX1O+NOPgSeixVlqenABEBAAG0GVVzZXIyIDx1c2VyMkBl
 | 
			
		||||
eGFtcGxlLmNvbT6JAVQEEwEIAD4WIQRXgbSh0TtGbgRd7XI46jvO1zKYLAUCWYZW
 | 
			
		||||
wwIbAwUJA8JnAAULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRA46jvO1zKYLF/e
 | 
			
		||||
B/91wm2KLMIQBZBA9WA2/+9rQWTo9EqgYrXN60rEzX3cYJWXZiE4DrKR1oWDGNLi
 | 
			
		||||
KXOCW62snvJldolBqq0ZqaKvPKzl0Y5TRqbYEc9AjUSqgRin1b+G2DevLGT4ibq+
 | 
			
		||||
7ocQvz0XkASEUAgHahp0Ubiiib1521WwT/duL+AG8Gg0+DK09RfV3eX5/EOkQCKv
 | 
			
		||||
8cutqgsd2Smz40A8wXuJkRcipZBtrB/GkUaZ/eJdwEeSYZjEA9GWF61LJT2stvRN
 | 
			
		||||
HCk7C3z3pVEek1PluiFs/4VN8BG8yDzW4c0tLty4Fj3VwPqwIbB5AJbquVfhQCb4
 | 
			
		||||
Eep2lm3Lc9b1OwO5N3coPJkouQENBFmGVsMBCADAGba2L6NCOE1i3WIP6CPzbdOo
 | 
			
		||||
N3gdTfTgccAx9fNeon9jor+3tgEjlo9/6cXiRoksOV6W4wFab/ZwWgwN6JO4CGvZ
 | 
			
		||||
Wi7EQwMMMp1E36YTojKQJrcA9UvMnTHulqQQ88F5E845DhzFQM3erv42QZZMBAX3
 | 
			
		||||
kXCgy1GNFocl6tLUvJdEqs+VcJGGANMpmzE4WLa8KhSYnxipwuQ62JBy9R+cHyKT
 | 
			
		||||
OARk8znRqSu5bT3LtlrZ/HXu+6Oy4+2uCdNzZIh5J5tPS7CPA6ptl88iGVBte/CJ
 | 
			
		||||
7cjgJWSQqeYp2Y5QvsWAivkQ4Ww9plHbbwV0A2eaHsjjWzlUl3HoJ/snMOhBABEB
 | 
			
		||||
AAGJATwEGAEIACYWIQRXgbSh0TtGbgRd7XI46jvO1zKYLAUCWYZWwwIbDAUJA8Jn
 | 
			
		||||
AAAKCRA46jvO1zKYLBwLCACQOpeRVrwIKVaWcPMYjVHHJsGscaLKpgpARAUgbiG6
 | 
			
		||||
Cbc2WI8Sm3fRwrY0VAfN+u9QwrtvxANcyB3vTgTzw7FimfhOimxiTSO8HQCfjDZF
 | 
			
		||||
Xly8rq+Fua7+ClWUpy21IekW41VvZYjH2sL6EVP+UcEOaGAyN53XfhaRVZPhNtZN
 | 
			
		||||
NKAE9N5EG3rbsZ33LzJj40rEKlzFSseAAPft8qA3IXjzFBx+PQXHMpNCagL79he6
 | 
			
		||||
lqockTJ+oPmta4CF/J0U5LUr1tOZXheL3TP6m8d08gDrtn0YuGOPk87i9sJz+jR9
 | 
			
		||||
uy6MA3VSB99SK9ducGmE1Jv8mcziREroz2TEGr0zPs6h
 | 
			
		||||
=J59D
 | 
			
		||||
-----END PGP PUBLIC KEY BLOCK-----`)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testCreateValidSecondaryEmailGPGKey(t *testing.T, reqBuilder func(testing.TB, *http.Request, int) *TestResponse, expected int) {
 | 
			
		||||
	//User2 <user21@example.com> //secondary and not activated
 | 
			
		||||
	testCreateGPGKey(t, reqBuilder, expected, `-----BEGIN PGP PUBLIC KEY BLOCK-----
 | 
			
		||||
 | 
			
		||||
mQENBFmGWN4BCAC18V4tVGO65VLCV7p14FuXJlUtZ5CuYMvgEkcOqrvRaBSW9ao4
 | 
			
		||||
PGESOhJpfWpnW3QgJniYndLzPpsmdHEclEER6aZjiNgReWPOjHD5tykWocZAJqXD
 | 
			
		||||
eY1ym59gvVMLcfbV2yQsyR2hbJlc+dJsl16tigSEe3nwxZSw2IsW92pgEzT9JNUr
 | 
			
		||||
Q+mC8dw4dqY0tYmFazYUGNxufUc/twgQT/Or1aNs0az5Q6Jft4rrTRsh/S7We0VB
 | 
			
		||||
COKGkdcQyYgAls7HJBuPjQRi6DM9VhgBSHLAgSLyaUcZvhZBJr8Qe/q4PP3/kYDJ
 | 
			
		||||
wm4RMnjOLz2pFZPgtRqgcAwpmFtLrACbEB3JABEBAAG0GlVzZXIyIDx1c2VyMjFA
 | 
			
		||||
ZXhhbXBsZS5jb20+iQFUBBMBCAA+FiEEPOLHOjPSO42DWM57+r85c5/h6ScFAlmG
 | 
			
		||||
WN4CGwMFCQPCZwAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ+r85c5/h6Sfx
 | 
			
		||||
Lgf/dq64NBV8+X9an3seaLxePRviva48e4K67/wV/JxtXNO5Z/DhMGz5kHXCsG9D
 | 
			
		||||
CXuWYO8ehlTjEnMZ6qqdDnY+H6bQsb2OS5oPn4RwpPXslAjEKtojPAr0dDsMS2DB
 | 
			
		||||
dUuIm1AoOnewOVO0OFRf1EqX1bivxnN0FVMcO0m8AczfnKDaGb0y/qg/Y9JAsKqp
 | 
			
		||||
j5pZNMWUkntRtGySeJ4CVJMmkVKJAHsa1Qj6MKdFeid4h4y94cBJ4ZdyBxNdpQOx
 | 
			
		||||
ydf0doicovfeqGNO4oWzsGP4RBK2CqGPCUT+EFl20jPvMkKwOjxgqc8p0z3b2UT9
 | 
			
		||||
+9bnmCGHgF/fW1HJ3iKmfFPqnLkBDQRZhljeAQgA5AirU/NJGgm19ZJYFOiHftjS
 | 
			
		||||
azbrPxGeD3cSqmvDPIMc1DNZGfQV5D4EVumnVbQBtL6xHFoGKz9KisUMbe4a/X2J
 | 
			
		||||
S8JmIphQWG0vMJX1DaZIzr2gT71MnPD7JMGsSUCh5dIKpTNTZX4w+oGPGOu0/UlL
 | 
			
		||||
x0448AryKwp30J2p6D4GeI0nb03n35S2lTOpnHDn1wj7Jl/8LS2fdFOdNaNHXSZe
 | 
			
		||||
twdSwJKhyBEiScgeHBDyKqo8zWkYoSb9eA2HiYlbVaiNtp24KP1mIEpiUdrRjWno
 | 
			
		||||
zauYSZGHZlOFMgF4dKWuetPiuH9m7UYZGKyMLfQ9vYFb+xcPh2bLCQHJ1OEmMQAR
 | 
			
		||||
AQABiQE8BBgBCAAmFiEEPOLHOjPSO42DWM57+r85c5/h6ScFAlmGWN4CGwwFCQPC
 | 
			
		||||
ZwAACgkQ+r85c5/h6Sfjfwf+O4WEjRdvPJLxNy7mfAGoAqDMHIwyH/tVzYgyVhnG
 | 
			
		||||
h/+cfRxJbGc3rpjYdr8dmvghzjEAout8uibPWaIqs63RCAPGPqgWLfxNO5c8+y8V
 | 
			
		||||
LZMVOTV26l2olkkdBWAuhLqKTNh6TiQva03yhOgHWj4XDvFfxICWPFXVd6t5ELpD
 | 
			
		||||
iApGu1OAj8JfhmzbG03Yzx+Ku7bWDxMonx3V/IDEu5LS5zrboHYDKCA53bXXghoi
 | 
			
		||||
Aceqql+PKrDwEjoY4bptwMHLmcjGjdCQ//Qx1neho7nZcS7xjTucY8gQuulwCyXF
 | 
			
		||||
y6wM+wMz8dunIG9gw4+Re6c4Rz9tX1kzxLrU7Pl21tMqfg==
 | 
			
		||||
=0N/9
 | 
			
		||||
-----END PGP PUBLIC KEY BLOCK-----`)
 | 
			
		||||
}
 | 
			
		||||
@@ -46,7 +46,7 @@ func TestCreateFileOnProtectedBranch(t *testing.T) {
 | 
			
		||||
	req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches?action=protected_branch", map[string]string{
 | 
			
		||||
		"_csrf":      csrf,
 | 
			
		||||
		"branchName": "master",
 | 
			
		||||
		"canPush":    "true",
 | 
			
		||||
		"canPush":    "false",
 | 
			
		||||
	})
 | 
			
		||||
	resp := session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
	// Check if master branch has been locked successfully
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
ref: refs/heads/master
 | 
			
		||||
@@ -0,0 +1,4 @@
 | 
			
		||||
[core]
 | 
			
		||||
	repositoryformatversion = 0
 | 
			
		||||
	filemode = true
 | 
			
		||||
	bare = true
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
Unnamed repository; edit this file 'description' to name the repository.
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# An example hook script to check the commit log message taken by
 | 
			
		||||
# applypatch from an e-mail message.
 | 
			
		||||
#
 | 
			
		||||
# The hook should exit with non-zero status after issuing an
 | 
			
		||||
# appropriate message if it wants to stop the commit.  The hook is
 | 
			
		||||
# allowed to edit the commit message file.
 | 
			
		||||
#
 | 
			
		||||
# To enable this hook, rename this file to "applypatch-msg".
 | 
			
		||||
 | 
			
		||||
. git-sh-setup
 | 
			
		||||
commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
 | 
			
		||||
test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
 | 
			
		||||
:
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# An example hook script to check the commit log message.
 | 
			
		||||
# Called by "git commit" with one argument, the name of the file
 | 
			
		||||
# that has the commit message.  The hook should exit with non-zero
 | 
			
		||||
# status after issuing an appropriate message if it wants to stop the
 | 
			
		||||
# commit.  The hook is allowed to edit the commit message file.
 | 
			
		||||
#
 | 
			
		||||
# To enable this hook, rename this file to "commit-msg".
 | 
			
		||||
 | 
			
		||||
# Uncomment the below to add a Signed-off-by line to the message.
 | 
			
		||||
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
 | 
			
		||||
# hook is more suited to it.
 | 
			
		||||
#
 | 
			
		||||
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
 | 
			
		||||
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
 | 
			
		||||
 | 
			
		||||
# This example catches duplicate Signed-off-by lines.
 | 
			
		||||
 | 
			
		||||
test "" = "$(grep '^Signed-off-by: ' "$1" |
 | 
			
		||||
	 sort | uniq -c | sed -e '/^[ 	]*1[ 	]/d')" || {
 | 
			
		||||
	echo >&2 Duplicate Signed-off-by lines.
 | 
			
		||||
	exit 1
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,8 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# An example hook script to prepare a packed repository for use over
 | 
			
		||||
# dumb transports.
 | 
			
		||||
#
 | 
			
		||||
# To enable this hook, rename this file to "post-update".
 | 
			
		||||
 | 
			
		||||
exec git update-server-info
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# An example hook script to verify what is about to be committed
 | 
			
		||||
# by applypatch from an e-mail message.
 | 
			
		||||
#
 | 
			
		||||
# The hook should exit with non-zero status after issuing an
 | 
			
		||||
# appropriate message if it wants to stop the commit.
 | 
			
		||||
#
 | 
			
		||||
# To enable this hook, rename this file to "pre-applypatch".
 | 
			
		||||
 | 
			
		||||
. git-sh-setup
 | 
			
		||||
precommit="$(git rev-parse --git-path hooks/pre-commit)"
 | 
			
		||||
test -x "$precommit" && exec "$precommit" ${1+"$@"}
 | 
			
		||||
:
 | 
			
		||||
@@ -0,0 +1,49 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# An example hook script to verify what is about to be committed.
 | 
			
		||||
# Called by "git commit" with no arguments.  The hook should
 | 
			
		||||
# exit with non-zero status after issuing an appropriate message if
 | 
			
		||||
# it wants to stop the commit.
 | 
			
		||||
#
 | 
			
		||||
# To enable this hook, rename this file to "pre-commit".
 | 
			
		||||
 | 
			
		||||
if git rev-parse --verify HEAD >/dev/null 2>&1
 | 
			
		||||
then
 | 
			
		||||
	against=HEAD
 | 
			
		||||
else
 | 
			
		||||
	# Initial commit: diff against an empty tree object
 | 
			
		||||
	against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# If you want to allow non-ASCII filenames set this variable to true.
 | 
			
		||||
allownonascii=$(git config --bool hooks.allownonascii)
 | 
			
		||||
 | 
			
		||||
# Redirect output to stderr.
 | 
			
		||||
exec 1>&2
 | 
			
		||||
 | 
			
		||||
# Cross platform projects tend to avoid non-ASCII filenames; prevent
 | 
			
		||||
# them from being added to the repository. We exploit the fact that the
 | 
			
		||||
# printable range starts at the space character and ends with tilde.
 | 
			
		||||
if [ "$allownonascii" != "true" ] &&
 | 
			
		||||
	# Note that the use of brackets around a tr range is ok here, (it's
 | 
			
		||||
	# even required, for portability to Solaris 10's /usr/bin/tr), since
 | 
			
		||||
	# the square bracket bytes happen to fall in the designated range.
 | 
			
		||||
	test $(git diff --cached --name-only --diff-filter=A -z $against |
 | 
			
		||||
	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
 | 
			
		||||
then
 | 
			
		||||
	cat <<\EOF
 | 
			
		||||
Error: Attempt to add a non-ASCII file name.
 | 
			
		||||
 | 
			
		||||
This can cause problems if you want to work with people on other platforms.
 | 
			
		||||
 | 
			
		||||
To be portable it is advisable to rename the file.
 | 
			
		||||
 | 
			
		||||
If you know what you are doing you can disable this check using:
 | 
			
		||||
 | 
			
		||||
  git config hooks.allownonascii true
 | 
			
		||||
EOF
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# If there are whitespace errors, print the offending file names and fail.
 | 
			
		||||
exec git diff-index --check --cached $against --
 | 
			
		||||
@@ -0,0 +1,53 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
# An example hook script to verify what is about to be pushed.  Called by "git
 | 
			
		||||
# push" after it has checked the remote status, but before anything has been
 | 
			
		||||
# pushed.  If this script exits with a non-zero status nothing will be pushed.
 | 
			
		||||
#
 | 
			
		||||
# This hook is called with the following parameters:
 | 
			
		||||
#
 | 
			
		||||
# $1 -- Name of the remote to which the push is being done
 | 
			
		||||
# $2 -- URL to which the push is being done
 | 
			
		||||
#
 | 
			
		||||
# If pushing without using a named remote those arguments will be equal.
 | 
			
		||||
#
 | 
			
		||||
# Information about the commits which are being pushed is supplied as lines to
 | 
			
		||||
# the standard input in the form:
 | 
			
		||||
#
 | 
			
		||||
#   <local ref> <local sha1> <remote ref> <remote sha1>
 | 
			
		||||
#
 | 
			
		||||
# This sample shows how to prevent push of commits where the log message starts
 | 
			
		||||
# with "WIP" (work in progress).
 | 
			
		||||
 | 
			
		||||
remote="$1"
 | 
			
		||||
url="$2"
 | 
			
		||||
 | 
			
		||||
z40=0000000000000000000000000000000000000000
 | 
			
		||||
 | 
			
		||||
while read local_ref local_sha remote_ref remote_sha
 | 
			
		||||
do
 | 
			
		||||
	if [ "$local_sha" = $z40 ]
 | 
			
		||||
	then
 | 
			
		||||
		# Handle delete
 | 
			
		||||
		:
 | 
			
		||||
	else
 | 
			
		||||
		if [ "$remote_sha" = $z40 ]
 | 
			
		||||
		then
 | 
			
		||||
			# New branch, examine all commits
 | 
			
		||||
			range="$local_sha"
 | 
			
		||||
		else
 | 
			
		||||
			# Update to existing branch, examine new commits
 | 
			
		||||
			range="$remote_sha..$local_sha"
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		# Check for WIP commit
 | 
			
		||||
		commit=`git rev-list -n 1 --grep '^WIP' "$range"`
 | 
			
		||||
		if [ -n "$commit" ]
 | 
			
		||||
		then
 | 
			
		||||
			echo >&2 "Found WIP commit in $local_ref, not pushing"
 | 
			
		||||
			exit 1
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -0,0 +1,169 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2006, 2008 Junio C Hamano
 | 
			
		||||
#
 | 
			
		||||
# The "pre-rebase" hook is run just before "git rebase" starts doing
 | 
			
		||||
# its job, and can prevent the command from running by exiting with
 | 
			
		||||
# non-zero status.
 | 
			
		||||
#
 | 
			
		||||
# The hook is called with the following parameters:
 | 
			
		||||
#
 | 
			
		||||
# $1 -- the upstream the series was forked from.
 | 
			
		||||
# $2 -- the branch being rebased (or empty when rebasing the current branch).
 | 
			
		||||
#
 | 
			
		||||
# This sample shows how to prevent topic branches that are already
 | 
			
		||||
# merged to 'next' branch from getting rebased, because allowing it
 | 
			
		||||
# would result in rebasing already published history.
 | 
			
		||||
 | 
			
		||||
publish=next
 | 
			
		||||
basebranch="$1"
 | 
			
		||||
if test "$#" = 2
 | 
			
		||||
then
 | 
			
		||||
	topic="refs/heads/$2"
 | 
			
		||||
else
 | 
			
		||||
	topic=`git symbolic-ref HEAD` ||
 | 
			
		||||
	exit 0 ;# we do not interrupt rebasing detached HEAD
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
case "$topic" in
 | 
			
		||||
refs/heads/??/*)
 | 
			
		||||
	;;
 | 
			
		||||
*)
 | 
			
		||||
	exit 0 ;# we do not interrupt others.
 | 
			
		||||
	;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# Now we are dealing with a topic branch being rebased
 | 
			
		||||
# on top of master.  Is it OK to rebase it?
 | 
			
		||||
 | 
			
		||||
# Does the topic really exist?
 | 
			
		||||
git show-ref -q "$topic" || {
 | 
			
		||||
	echo >&2 "No such branch $topic"
 | 
			
		||||
	exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Is topic fully merged to master?
 | 
			
		||||
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
 | 
			
		||||
if test -z "$not_in_master"
 | 
			
		||||
then
 | 
			
		||||
	echo >&2 "$topic is fully merged to master; better remove it."
 | 
			
		||||
	exit 1 ;# we could allow it, but there is no point.
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Is topic ever merged to next?  If so you should not be rebasing it.
 | 
			
		||||
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
 | 
			
		||||
only_next_2=`git rev-list ^master           ${publish} | sort`
 | 
			
		||||
if test "$only_next_1" = "$only_next_2"
 | 
			
		||||
then
 | 
			
		||||
	not_in_topic=`git rev-list "^$topic" master`
 | 
			
		||||
	if test -z "$not_in_topic"
 | 
			
		||||
	then
 | 
			
		||||
		echo >&2 "$topic is already up-to-date with master"
 | 
			
		||||
		exit 1 ;# we could allow it, but there is no point.
 | 
			
		||||
	else
 | 
			
		||||
		exit 0
 | 
			
		||||
	fi
 | 
			
		||||
else
 | 
			
		||||
	not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
 | 
			
		||||
	/usr/bin/perl -e '
 | 
			
		||||
		my $topic = $ARGV[0];
 | 
			
		||||
		my $msg = "* $topic has commits already merged to public branch:\n";
 | 
			
		||||
		my (%not_in_next) = map {
 | 
			
		||||
			/^([0-9a-f]+) /;
 | 
			
		||||
			($1 => 1);
 | 
			
		||||
		} split(/\n/, $ARGV[1]);
 | 
			
		||||
		for my $elem (map {
 | 
			
		||||
				/^([0-9a-f]+) (.*)$/;
 | 
			
		||||
				[$1 => $2];
 | 
			
		||||
			} split(/\n/, $ARGV[2])) {
 | 
			
		||||
			if (!exists $not_in_next{$elem->[0]}) {
 | 
			
		||||
				if ($msg) {
 | 
			
		||||
					print STDERR $msg;
 | 
			
		||||
					undef $msg;
 | 
			
		||||
				}
 | 
			
		||||
				print STDERR " $elem->[1]\n";
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	' "$topic" "$not_in_next" "$not_in_master"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
 | 
			
		||||
################################################################
 | 
			
		||||
 | 
			
		||||
This sample hook safeguards topic branches that have been
 | 
			
		||||
published from being rewound.
 | 
			
		||||
 | 
			
		||||
The workflow assumed here is:
 | 
			
		||||
 | 
			
		||||
 * Once a topic branch forks from "master", "master" is never
 | 
			
		||||
   merged into it again (either directly or indirectly).
 | 
			
		||||
 | 
			
		||||
 * Once a topic branch is fully cooked and merged into "master",
 | 
			
		||||
   it is deleted.  If you need to build on top of it to correct
 | 
			
		||||
   earlier mistakes, a new topic branch is created by forking at
 | 
			
		||||
   the tip of the "master".  This is not strictly necessary, but
 | 
			
		||||
   it makes it easier to keep your history simple.
 | 
			
		||||
 | 
			
		||||
 * Whenever you need to test or publish your changes to topic
 | 
			
		||||
   branches, merge them into "next" branch.
 | 
			
		||||
 | 
			
		||||
The script, being an example, hardcodes the publish branch name
 | 
			
		||||
to be "next", but it is trivial to make it configurable via
 | 
			
		||||
$GIT_DIR/config mechanism.
 | 
			
		||||
 | 
			
		||||
With this workflow, you would want to know:
 | 
			
		||||
 | 
			
		||||
(1) ... if a topic branch has ever been merged to "next".  Young
 | 
			
		||||
    topic branches can have stupid mistakes you would rather
 | 
			
		||||
    clean up before publishing, and things that have not been
 | 
			
		||||
    merged into other branches can be easily rebased without
 | 
			
		||||
    affecting other people.  But once it is published, you would
 | 
			
		||||
    not want to rewind it.
 | 
			
		||||
 | 
			
		||||
(2) ... if a topic branch has been fully merged to "master".
 | 
			
		||||
    Then you can delete it.  More importantly, you should not
 | 
			
		||||
    build on top of it -- other people may already want to
 | 
			
		||||
    change things related to the topic as patches against your
 | 
			
		||||
    "master", so if you need further changes, it is better to
 | 
			
		||||
    fork the topic (perhaps with the same name) afresh from the
 | 
			
		||||
    tip of "master".
 | 
			
		||||
 | 
			
		||||
Let's look at this example:
 | 
			
		||||
 | 
			
		||||
		   o---o---o---o---o---o---o---o---o---o "next"
 | 
			
		||||
		  /       /           /           /
 | 
			
		||||
		 /   a---a---b A     /           /
 | 
			
		||||
		/   /               /           /
 | 
			
		||||
	       /   /   c---c---c---c B         /
 | 
			
		||||
	      /   /   /             \         /
 | 
			
		||||
	     /   /   /   b---b C     \       /
 | 
			
		||||
	    /   /   /   /             \     /
 | 
			
		||||
    ---o---o---o---o---o---o---o---o---o---o---o "master"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
A, B and C are topic branches.
 | 
			
		||||
 | 
			
		||||
 * A has one fix since it was merged up to "next".
 | 
			
		||||
 | 
			
		||||
 * B has finished.  It has been fully merged up to "master" and "next",
 | 
			
		||||
   and is ready to be deleted.
 | 
			
		||||
 | 
			
		||||
 * C has not merged to "next" at all.
 | 
			
		||||
 | 
			
		||||
We would want to allow C to be rebased, refuse A, and encourage
 | 
			
		||||
B to be deleted.
 | 
			
		||||
 | 
			
		||||
To compute (1):
 | 
			
		||||
 | 
			
		||||
	git rev-list ^master ^topic next
 | 
			
		||||
	git rev-list ^master        next
 | 
			
		||||
 | 
			
		||||
	if these match, topic has not merged in next at all.
 | 
			
		||||
 | 
			
		||||
To compute (2):
 | 
			
		||||
 | 
			
		||||
	git rev-list master..topic
 | 
			
		||||
 | 
			
		||||
	if this is empty, it is fully merged to "master".
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# An example hook script to make use of push options.
 | 
			
		||||
# The example simply echoes all push options that start with 'echoback='
 | 
			
		||||
# and rejects all pushes when the "reject" push option is used.
 | 
			
		||||
#
 | 
			
		||||
# To enable this hook, rename this file to "pre-receive".
 | 
			
		||||
 | 
			
		||||
if test -n "$GIT_PUSH_OPTION_COUNT"
 | 
			
		||||
then
 | 
			
		||||
	i=0
 | 
			
		||||
	while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
 | 
			
		||||
	do
 | 
			
		||||
		eval "value=\$GIT_PUSH_OPTION_$i"
 | 
			
		||||
		case "$value" in
 | 
			
		||||
		echoback=*)
 | 
			
		||||
			echo "echo from the pre-receive-hook: ${value#*=}" >&2
 | 
			
		||||
			;;
 | 
			
		||||
		reject)
 | 
			
		||||
			exit 1
 | 
			
		||||
		esac
 | 
			
		||||
		i=$((i + 1))
 | 
			
		||||
	done
 | 
			
		||||
fi
 | 
			
		||||
@@ -0,0 +1,36 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# An example hook script to prepare the commit log message.
 | 
			
		||||
# Called by "git commit" with the name of the file that has the
 | 
			
		||||
# commit message, followed by the description of the commit
 | 
			
		||||
# message's source.  The hook's purpose is to edit the commit
 | 
			
		||||
# message file.  If the hook fails with a non-zero status,
 | 
			
		||||
# the commit is aborted.
 | 
			
		||||
#
 | 
			
		||||
# To enable this hook, rename this file to "prepare-commit-msg".
 | 
			
		||||
 | 
			
		||||
# This hook includes three examples.  The first comments out the
 | 
			
		||||
# "Conflicts:" part of a merge commit.
 | 
			
		||||
#
 | 
			
		||||
# The second includes the output of "git diff --name-status -r"
 | 
			
		||||
# into the message, just before the "git status" output.  It is
 | 
			
		||||
# commented because it doesn't cope with --amend or with squashed
 | 
			
		||||
# commits.
 | 
			
		||||
#
 | 
			
		||||
# The third example adds a Signed-off-by line to the message, that can
 | 
			
		||||
# still be edited.  This is rarely a good idea.
 | 
			
		||||
 | 
			
		||||
case "$2,$3" in
 | 
			
		||||
  merge,)
 | 
			
		||||
    /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
 | 
			
		||||
 | 
			
		||||
# ,|template,)
 | 
			
		||||
#   /usr/bin/perl -i.bak -pe '
 | 
			
		||||
#      print "\n" . `git diff --cached --name-status -r`
 | 
			
		||||
#	 if /^#/ && $first++ == 0' "$1" ;;
 | 
			
		||||
 | 
			
		||||
  *) ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
 | 
			
		||||
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
 | 
			
		||||
@@ -0,0 +1,128 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# An example hook script to block unannotated tags from entering.
 | 
			
		||||
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
 | 
			
		||||
#
 | 
			
		||||
# To enable this hook, rename this file to "update".
 | 
			
		||||
#
 | 
			
		||||
# Config
 | 
			
		||||
# ------
 | 
			
		||||
# hooks.allowunannotated
 | 
			
		||||
#   This boolean sets whether unannotated tags will be allowed into the
 | 
			
		||||
#   repository.  By default they won't be.
 | 
			
		||||
# hooks.allowdeletetag
 | 
			
		||||
#   This boolean sets whether deleting tags will be allowed in the
 | 
			
		||||
#   repository.  By default they won't be.
 | 
			
		||||
# hooks.allowmodifytag
 | 
			
		||||
#   This boolean sets whether a tag may be modified after creation. By default
 | 
			
		||||
#   it won't be.
 | 
			
		||||
# hooks.allowdeletebranch
 | 
			
		||||
#   This boolean sets whether deleting branches will be allowed in the
 | 
			
		||||
#   repository.  By default they won't be.
 | 
			
		||||
# hooks.denycreatebranch
 | 
			
		||||
#   This boolean sets whether remotely creating branches will be denied
 | 
			
		||||
#   in the repository.  By default this is allowed.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# --- Command line
 | 
			
		||||
refname="$1"
 | 
			
		||||
oldrev="$2"
 | 
			
		||||
newrev="$3"
 | 
			
		||||
 | 
			
		||||
# --- Safety check
 | 
			
		||||
if [ -z "$GIT_DIR" ]; then
 | 
			
		||||
	echo "Don't run this script from the command line." >&2
 | 
			
		||||
	echo " (if you want, you could supply GIT_DIR then run" >&2
 | 
			
		||||
	echo "  $0 <ref> <oldrev> <newrev>)" >&2
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
 | 
			
		||||
	echo "usage: $0 <ref> <oldrev> <newrev>" >&2
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# --- Config
 | 
			
		||||
allowunannotated=$(git config --bool hooks.allowunannotated)
 | 
			
		||||
allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
 | 
			
		||||
denycreatebranch=$(git config --bool hooks.denycreatebranch)
 | 
			
		||||
allowdeletetag=$(git config --bool hooks.allowdeletetag)
 | 
			
		||||
allowmodifytag=$(git config --bool hooks.allowmodifytag)
 | 
			
		||||
 | 
			
		||||
# check for no description
 | 
			
		||||
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
 | 
			
		||||
case "$projectdesc" in
 | 
			
		||||
"Unnamed repository"* | "")
 | 
			
		||||
	echo "*** Project description file hasn't been set" >&2
 | 
			
		||||
	exit 1
 | 
			
		||||
	;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# --- Check types
 | 
			
		||||
# if $newrev is 0000...0000, it's a commit to delete a ref.
 | 
			
		||||
zero="0000000000000000000000000000000000000000"
 | 
			
		||||
if [ "$newrev" = "$zero" ]; then
 | 
			
		||||
	newrev_type=delete
 | 
			
		||||
else
 | 
			
		||||
	newrev_type=$(git cat-file -t $newrev)
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
case "$refname","$newrev_type" in
 | 
			
		||||
	refs/tags/*,commit)
 | 
			
		||||
		# un-annotated tag
 | 
			
		||||
		short_refname=${refname##refs/tags/}
 | 
			
		||||
		if [ "$allowunannotated" != "true" ]; then
 | 
			
		||||
			echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
 | 
			
		||||
			echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
 | 
			
		||||
			exit 1
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	refs/tags/*,delete)
 | 
			
		||||
		# delete tag
 | 
			
		||||
		if [ "$allowdeletetag" != "true" ]; then
 | 
			
		||||
			echo "*** Deleting a tag is not allowed in this repository" >&2
 | 
			
		||||
			exit 1
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	refs/tags/*,tag)
 | 
			
		||||
		# annotated tag
 | 
			
		||||
		if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
 | 
			
		||||
		then
 | 
			
		||||
			echo "*** Tag '$refname' already exists." >&2
 | 
			
		||||
			echo "*** Modifying a tag is not allowed in this repository." >&2
 | 
			
		||||
			exit 1
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	refs/heads/*,commit)
 | 
			
		||||
		# branch
 | 
			
		||||
		if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
 | 
			
		||||
			echo "*** Creating a branch is not allowed in this repository" >&2
 | 
			
		||||
			exit 1
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	refs/heads/*,delete)
 | 
			
		||||
		# delete branch
 | 
			
		||||
		if [ "$allowdeletebranch" != "true" ]; then
 | 
			
		||||
			echo "*** Deleting a branch is not allowed in this repository" >&2
 | 
			
		||||
			exit 1
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	refs/remotes/*,commit)
 | 
			
		||||
		# tracking branch
 | 
			
		||||
		;;
 | 
			
		||||
	refs/remotes/*,delete)
 | 
			
		||||
		# delete tracking branch
 | 
			
		||||
		if [ "$allowdeletebranch" != "true" ]; then
 | 
			
		||||
			echo "*** Deleting a tracking branch is not allowed in this repository" >&2
 | 
			
		||||
			exit 1
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		# Anything else (is there anything else?)
 | 
			
		||||
		echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
 | 
			
		||||
		exit 1
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# --- Finished
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
# git ls-files --others --exclude-from=.git/info/exclude
 | 
			
		||||
# Lines that start with '#' are comments.
 | 
			
		||||
# For a project mostly in C, the following would be a good set of
 | 
			
		||||
# exclude patterns (uncomment them if you want to use them):
 | 
			
		||||
# *.[oa]
 | 
			
		||||
# *~
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
x+)JMU06g040031Q(JML<4D>M<EFBFBD><4D>MaXbR<62><52>10<31>-&<26><>C<EFBFBD><43><EFBFBD>˒<EFBFBD><CB92>=<3D>,
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
x<01><>Q
 | 
			
		||||
B!E<>v<15><1F><>O'!<21>M<EFBFBD><4D>Q<EFBFBD>׃<EFBFBD><D783><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD><02><><EFBFBD><0B><>TKY:v<><76><EFBFBD>N6<4E><36><EFBFBD><EFBFBD>b f<><66><EFBFBD><EFBFBD><EFBFBD>&<26><>19<31><39><EFBFBD>ho<>V\Wi<08><>yqy<71><79><EFBFBD>j9<6A>q<1A><>F<1B><0F>j<EFBFBD><6A><EFBFBD><EFBFBD>?ٟ<><D99F>Z3<5A><33><EFBFBD><EFBFBD><0C><05>*S6#
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
f27c2b2b03dcab38beaf89b0ab4ff61f6de63441
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
27566bd5738fc8b4e3fef3c5e72cce608537bd95
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
69554a64c1e6030f051e5c3f94bfbd773cd6a324
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
69554a64c1e6030f051e5c3f94bfbd773cd6a324
 | 
			
		||||
@@ -17,7 +17,7 @@ import (
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func assertProtectedBranch(t *testing.T, repoID int64, branchName string, isErr, canPush bool) {
 | 
			
		||||
func assertProtectedBranch(t *testing.T, repoID int64, branchName string, isErr, isProtected bool) {
 | 
			
		||||
	reqURL := fmt.Sprintf("/api/internal/branch/%d/%s", repoID, url.QueryEscape(branchName))
 | 
			
		||||
	req := NewRequest(t, "GET", reqURL)
 | 
			
		||||
	t.Log(reqURL)
 | 
			
		||||
@@ -31,14 +31,14 @@ func assertProtectedBranch(t *testing.T, repoID int64, branchName string, isErr,
 | 
			
		||||
		var branch models.ProtectedBranch
 | 
			
		||||
		t.Log(string(resp.Body))
 | 
			
		||||
		assert.NoError(t, json.Unmarshal(resp.Body, &branch))
 | 
			
		||||
		assert.Equal(t, canPush, branch.CanPush)
 | 
			
		||||
		assert.Equal(t, isProtected, branch.IsProtected())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestInternal_GetProtectedBranch(t *testing.T) {
 | 
			
		||||
	prepareTestEnv(t)
 | 
			
		||||
 | 
			
		||||
	assertProtectedBranch(t, 1, "master", false, true)
 | 
			
		||||
	assertProtectedBranch(t, 1, "dev", false, true)
 | 
			
		||||
	assertProtectedBranch(t, 1, "lunny/dev", false, true)
 | 
			
		||||
	assertProtectedBranch(t, 1, "master", false, false)
 | 
			
		||||
	assertProtectedBranch(t, 1, "dev", false, false)
 | 
			
		||||
	assertProtectedBranch(t, 1, "lunny/dev", false, false)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ func TestLinksNoLogin(t *testing.T) {
 | 
			
		||||
		"/user/forgot_password",
 | 
			
		||||
		"/swagger",
 | 
			
		||||
		// TODO: follow this page and test every link
 | 
			
		||||
		"/assets/librejs/librejs.html",
 | 
			
		||||
		"/vendor/librejs.html",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, link := range links {
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ RUN_MODE = prod
 | 
			
		||||
 | 
			
		||||
[database]
 | 
			
		||||
DB_TYPE  = mysql
 | 
			
		||||
HOST     = 127.0.0.1:3306
 | 
			
		||||
HOST     = mysql:3306
 | 
			
		||||
NAME     = testgitea
 | 
			
		||||
USER     = root
 | 
			
		||||
PASSWD   =
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ RUN_MODE = prod
 | 
			
		||||
 | 
			
		||||
[database]
 | 
			
		||||
DB_TYPE  = postgres
 | 
			
		||||
HOST     = 127.0.0.1:5432
 | 
			
		||||
HOST     = pgsql:5432
 | 
			
		||||
NAME     = testgitea
 | 
			
		||||
USER     = postgres
 | 
			
		||||
PASSWD   = postgres
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ func testPullCreate(t *testing.T, session *TestSession, user, repo, branch strin
 | 
			
		||||
func TestPullCreate(t *testing.T) {
 | 
			
		||||
	prepareTestEnv(t)
 | 
			
		||||
	session := loginUser(t, "user1")
 | 
			
		||||
	testRepoFork(t, session)
 | 
			
		||||
	testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
 | 
			
		||||
	testEditFile(t, session, "user1", "repo1", "master", "README.md")
 | 
			
		||||
	testPullCreate(t, session, "user1", "repo1", "master")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,7 @@ func testPullCleanUp(t *testing.T, session *TestSession, user, repo, pullnum str
 | 
			
		||||
func TestPullMerge(t *testing.T) {
 | 
			
		||||
	prepareTestEnv(t)
 | 
			
		||||
	session := loginUser(t, "user1")
 | 
			
		||||
	testRepoFork(t, session)
 | 
			
		||||
	testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
 | 
			
		||||
	testEditFile(t, session, "user1", "repo1", "master", "README.md")
 | 
			
		||||
 | 
			
		||||
	resp := testPullCreate(t, session, "user1", "repo1", "master")
 | 
			
		||||
@@ -61,7 +61,7 @@ func TestPullMerge(t *testing.T) {
 | 
			
		||||
func TestPullCleanUpAfterMerge(t *testing.T) {
 | 
			
		||||
	prepareTestEnv(t)
 | 
			
		||||
	session := loginUser(t, "user1")
 | 
			
		||||
	testRepoFork(t, session)
 | 
			
		||||
	testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
 | 
			
		||||
	testEditFileToNewBranch(t, session, "user1", "repo1", "master", "feature/test", "README.md")
 | 
			
		||||
 | 
			
		||||
	resp := testPullCreate(t, session, "user1", "repo1", "feature/test")
 | 
			
		||||
 
 | 
			
		||||
@@ -5,19 +5,24 @@
 | 
			
		||||
package integrations
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func testRepoFork(t *testing.T, session *TestSession) *TestResponse {
 | 
			
		||||
func testRepoFork(t *testing.T, session *TestSession, ownerName, repoName, forkOwnerName, forkRepoName string) *TestResponse {
 | 
			
		||||
	forkOwner := models.AssertExistsAndLoadBean(t, &models.User{Name: forkOwnerName}).(*models.User)
 | 
			
		||||
 | 
			
		||||
	// Step0: check the existence of the to-fork repo
 | 
			
		||||
	req := NewRequest(t, "GET", "/user1/repo1")
 | 
			
		||||
	req := NewRequestf(t, "GET", "/%s/%s", forkOwnerName, forkRepoName)
 | 
			
		||||
	resp := session.MakeRequest(t, req, http.StatusNotFound)
 | 
			
		||||
 | 
			
		||||
	// Step1: go to the main page of repo
 | 
			
		||||
	req = NewRequest(t, "GET", "/user2/repo1")
 | 
			
		||||
	req = NewRequestf(t, "GET", "/%s/%s", ownerName, repoName)
 | 
			
		||||
	resp = session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
 | 
			
		||||
	// Step2: click the fork button
 | 
			
		||||
@@ -31,15 +36,17 @@ func testRepoFork(t *testing.T, session *TestSession) *TestResponse {
 | 
			
		||||
	htmlDoc = NewHTMLParser(t, resp.Body)
 | 
			
		||||
	link, exists = htmlDoc.doc.Find("form.ui.form[action^=\"/repo/fork/\"]").Attr("action")
 | 
			
		||||
	assert.True(t, exists, "The template has changed")
 | 
			
		||||
	_, exists = htmlDoc.doc.Find(fmt.Sprintf(".owner.dropdown .item[data-value=\"%d\"]", forkOwner.ID)).Attr("data-value")
 | 
			
		||||
	assert.True(t, exists, fmt.Sprintf("Fork owner '%s' is not present in select box", forkOwnerName))
 | 
			
		||||
	req = NewRequestWithValues(t, "POST", link, map[string]string{
 | 
			
		||||
		"_csrf":     htmlDoc.GetCSRF(),
 | 
			
		||||
		"uid":       "1",
 | 
			
		||||
		"repo_name": "repo1",
 | 
			
		||||
		"uid":       fmt.Sprintf("%d", forkOwner.ID),
 | 
			
		||||
		"repo_name": forkRepoName,
 | 
			
		||||
	})
 | 
			
		||||
	resp = session.MakeRequest(t, req, http.StatusFound)
 | 
			
		||||
 | 
			
		||||
	// Step4: check the existence of the forked repo
 | 
			
		||||
	req = NewRequest(t, "GET", "/user1/repo1")
 | 
			
		||||
	req = NewRequestf(t, "GET", "/%s/%s", forkOwnerName, forkRepoName)
 | 
			
		||||
	resp = session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
 | 
			
		||||
	return resp
 | 
			
		||||
@@ -48,5 +55,19 @@ func testRepoFork(t *testing.T, session *TestSession) *TestResponse {
 | 
			
		||||
func TestRepoFork(t *testing.T) {
 | 
			
		||||
	prepareTestEnv(t)
 | 
			
		||||
	session := loginUser(t, "user1")
 | 
			
		||||
	testRepoFork(t, session)
 | 
			
		||||
	testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRepoForkToOrg(t *testing.T) {
 | 
			
		||||
	prepareTestEnv(t)
 | 
			
		||||
	session := loginUser(t, "user2")
 | 
			
		||||
	testRepoFork(t, session, "user2", "repo1", "user3", "repo1")
 | 
			
		||||
 | 
			
		||||
	// Check that no more forking is allowed as user2 owns repository
 | 
			
		||||
	//  and user3 organization that owner user2 is also now has forked this repository
 | 
			
		||||
	req := NewRequest(t, "GET", "/user2/repo1")
 | 
			
		||||
	resp := session.MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
	htmlDoc := NewHTMLParser(t, resp.Body)
 | 
			
		||||
	_, exists := htmlDoc.doc.Find("a.ui.button[href^=\"/repo/fork/\"]").Attr("href")
 | 
			
		||||
	assert.False(t, exists, "Forking should not be allowed anymore")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,6 @@ RUN_MODE = prod
 | 
			
		||||
 | 
			
		||||
[database]
 | 
			
		||||
DB_TYPE  = sqlite3
 | 
			
		||||
HOST     = 127.0.0.1:3306
 | 
			
		||||
NAME     = testgitea
 | 
			
		||||
USER     = gitea
 | 
			
		||||
PASSWD   =
 | 
			
		||||
SSL_MODE = disable
 | 
			
		||||
PATH     = :memory:
 | 
			
		||||
 | 
			
		||||
[repository]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								main.go
									
									
									
									
									
								
							@@ -17,7 +17,7 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Version holds the current Gitea version
 | 
			
		||||
var Version = "1.1.0+dev"
 | 
			
		||||
var Version = "1.2.0-dev"
 | 
			
		||||
 | 
			
		||||
// Tags holds the build tags used
 | 
			
		||||
var Tags = ""
 | 
			
		||||
 
 | 
			
		||||
@@ -713,7 +713,6 @@ type GetFeedsOptions struct {
 | 
			
		||||
	IncludePrivate   bool // include private actions
 | 
			
		||||
	OnlyPerformedBy  bool // only actions performed by requested user
 | 
			
		||||
	IncludeDeleted   bool // include deleted actions
 | 
			
		||||
	Collaborate      bool // Include collaborative repositories
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetFeeds returns actions according to the provided options
 | 
			
		||||
@@ -733,13 +732,7 @@ func GetFeeds(opts GetFeedsOptions) ([]*Action, error) {
 | 
			
		||||
		cond = cond.And(builder.In("repo_id", repoIDs))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var userIDCond builder.Cond = builder.Eq{"user_id": opts.RequestedUser.ID}
 | 
			
		||||
	if opts.Collaborate {
 | 
			
		||||
		userIDCond = userIDCond.Or(builder.Expr(
 | 
			
		||||
			"repo_id IN (SELECT repo_id FROM `access` WHERE access.user_id = ?)",
 | 
			
		||||
			opts.RequestedUser.ID))
 | 
			
		||||
	}
 | 
			
		||||
	cond = cond.And(userIDCond)
 | 
			
		||||
	cond = cond.And(builder.Eq{"user_id": opts.RequestedUser.ID})
 | 
			
		||||
 | 
			
		||||
	if opts.OnlyPerformedBy {
 | 
			
		||||
		cond = cond.And(builder.Eq{"act_user_id": opts.RequestedUser.ID})
 | 
			
		||||
 
 | 
			
		||||
@@ -17,10 +17,10 @@ const (
 | 
			
		||||
 | 
			
		||||
// ProtectedBranch struct
 | 
			
		||||
type ProtectedBranch struct {
 | 
			
		||||
	ID          int64  `xorm:"pk autoincr"`
 | 
			
		||||
	RepoID      int64  `xorm:"UNIQUE(s)"`
 | 
			
		||||
	BranchName  string `xorm:"UNIQUE(s)"`
 | 
			
		||||
	CanPush     bool
 | 
			
		||||
	ID          int64     `xorm:"pk autoincr"`
 | 
			
		||||
	RepoID      int64     `xorm:"UNIQUE(s)"`
 | 
			
		||||
	BranchName  string    `xorm:"UNIQUE(s)"`
 | 
			
		||||
	CanPush     bool      `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	Created     time.Time `xorm:"-"`
 | 
			
		||||
	CreatedUnix int64
 | 
			
		||||
	Updated     time.Time `xorm:"-"`
 | 
			
		||||
@@ -38,6 +38,11 @@ func (protectBranch *ProtectedBranch) BeforeUpdate() {
 | 
			
		||||
	protectBranch.UpdatedUnix = time.Now().Unix()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsProtected returns if the branch is protected
 | 
			
		||||
func (protectBranch *ProtectedBranch) IsProtected() bool {
 | 
			
		||||
	return protectBranch.ID > 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetProtectedBranchByRepoID getting protected branch by repo ID
 | 
			
		||||
func GetProtectedBranchByRepoID(RepoID int64) ([]*ProtectedBranch, error) {
 | 
			
		||||
	protectedBranches := make([]*ProtectedBranch, 0)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,9 +4,7 @@
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
import "fmt"
 | 
			
		||||
 | 
			
		||||
// ErrNameReserved represents a "reserved name" error.
 | 
			
		||||
type ErrNameReserved struct {
 | 
			
		||||
@@ -260,19 +258,19 @@ func (err ErrKeyNameAlreadyUsed) Error() string {
 | 
			
		||||
	return fmt.Sprintf("public key already exists [owner_id: %d, name: %s]", err.OwnerID, err.Name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ErrGPGEmailNotFound represents a "ErrGPGEmailNotFound" kind of error.
 | 
			
		||||
type ErrGPGEmailNotFound struct {
 | 
			
		||||
	Email string
 | 
			
		||||
// ErrGPGNoEmailFound represents a "ErrGPGNoEmailFound" kind of error.
 | 
			
		||||
type ErrGPGNoEmailFound struct {
 | 
			
		||||
	FailedEmails []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsErrGPGEmailNotFound checks if an error is a ErrGPGEmailNotFound.
 | 
			
		||||
func IsErrGPGEmailNotFound(err error) bool {
 | 
			
		||||
	_, ok := err.(ErrGPGEmailNotFound)
 | 
			
		||||
// IsErrGPGNoEmailFound checks if an error is a ErrGPGNoEmailFound.
 | 
			
		||||
func IsErrGPGNoEmailFound(err error) bool {
 | 
			
		||||
	_, ok := err.(ErrGPGNoEmailFound)
 | 
			
		||||
	return ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (err ErrGPGEmailNotFound) Error() string {
 | 
			
		||||
	return fmt.Sprintf("failed to found email or is not confirmed : %s", err.Email)
 | 
			
		||||
func (err ErrGPGNoEmailFound) Error() string {
 | 
			
		||||
	return fmt.Sprintf("none of the emails attached to the GPG key could be found: %v", err.FailedEmails)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ErrGPGKeyParsing represents a "ErrGPGKeyParsing" kind of error.
 | 
			
		||||
 
 | 
			
		||||
@@ -176,3 +176,15 @@
 | 
			
		||||
  lower_name: repo15
 | 
			
		||||
  name: repo15
 | 
			
		||||
  is_bare: true
 | 
			
		||||
 | 
			
		||||
-
 | 
			
		||||
  id: 16
 | 
			
		||||
  owner_id: 2
 | 
			
		||||
  lower_name: repo16
 | 
			
		||||
  name: repo16
 | 
			
		||||
  is_private: true
 | 
			
		||||
  num_issues: 0
 | 
			
		||||
  num_closed_issues: 0
 | 
			
		||||
  num_pulls: 0
 | 
			
		||||
  num_closed_pulls: 0
 | 
			
		||||
  num_watches: 0
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@
 | 
			
		||||
  is_admin: false
 | 
			
		||||
  avatar: avatar2
 | 
			
		||||
  avatar_email: user2@example.com
 | 
			
		||||
  num_repos: 3
 | 
			
		||||
  num_repos: 4
 | 
			
		||||
  num_stars: 2
 | 
			
		||||
  num_followers: 2
 | 
			
		||||
  num_following: 1
 | 
			
		||||
 
 | 
			
		||||
@@ -208,21 +208,27 @@ func parseGPGKey(ownerID int64, e *openpgp.Entity) (*GPGKey, error) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	emails := make([]*EmailAddress, len(e.Identities))
 | 
			
		||||
	n := 0
 | 
			
		||||
 | 
			
		||||
	emails := make([]*EmailAddress, 0, len(e.Identities))
 | 
			
		||||
	for _, ident := range e.Identities {
 | 
			
		||||
		email := strings.ToLower(strings.TrimSpace(ident.UserId.Email))
 | 
			
		||||
		for _, e := range userEmails {
 | 
			
		||||
			if e.Email == email && e.IsActivated {
 | 
			
		||||
				emails[n] = e
 | 
			
		||||
			if e.Email == email {
 | 
			
		||||
				emails = append(emails, e)
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if emails[n] == nil {
 | 
			
		||||
			return nil, ErrGPGEmailNotFound{ident.UserId.Email}
 | 
			
		||||
		}
 | 
			
		||||
		n++
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//In the case no email as been found
 | 
			
		||||
	if len(emails) == 0 {
 | 
			
		||||
		failedEmails := make([]string, 0, len(e.Identities))
 | 
			
		||||
		for _, ident := range e.Identities {
 | 
			
		||||
			failedEmails = append(failedEmails, ident.UserId.Email)
 | 
			
		||||
		}
 | 
			
		||||
		return nil, ErrGPGNoEmailFound{failedEmails}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	content, err := base64EncPubKey(pubkey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@@ -276,11 +282,7 @@ func DeleteGPGKey(doer *User, id int64) (err error) {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = sess.Commit(); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
	return sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CommitVerification represents a commit validation of signature
 | 
			
		||||
@@ -380,8 +382,8 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		//Find Committer account
 | 
			
		||||
		committer, err := GetUserByEmail(c.Committer.Email)
 | 
			
		||||
		if err != nil { //Skipping not user for commiter
 | 
			
		||||
		committer, err := GetUserByEmail(c.Committer.Email) //This find the user by primary email or activated email so commit will not be valid if email is not
 | 
			
		||||
		if err != nil {                                     //Skipping not user for commiter
 | 
			
		||||
			log.Error(3, "NoCommitterAccount: %v", err)
 | 
			
		||||
			return &CommitVerification{
 | 
			
		||||
				Verified: false,
 | 
			
		||||
@@ -399,6 +401,19 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, k := range keys {
 | 
			
		||||
			//Pre-check (& optimization) that emails attached to key can be attached to the commiter email and can validate
 | 
			
		||||
			canValidate := false
 | 
			
		||||
			lowerCommiterEmail := strings.ToLower(c.Committer.Email)
 | 
			
		||||
			for _, e := range k.Emails {
 | 
			
		||||
				if e.IsActivated && strings.ToLower(e.Email) == lowerCommiterEmail {
 | 
			
		||||
					canValidate = true
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if !canValidate {
 | 
			
		||||
				continue //Skip this key
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			//Generating hash of commit
 | 
			
		||||
			hash, err := populateHash(sig.Hash, []byte(c.Signature.Payload))
 | 
			
		||||
			if err != nil { //Skipping ailed to generate hash
 | 
			
		||||
 
 | 
			
		||||
@@ -572,11 +572,7 @@ func (issue *Issue) ReadBy(userID int64) error {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := setNotificationStatusReadIfUnread(x, userID, issue.ID); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
	return setNotificationStatusReadIfUnread(x, userID, issue.ID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func updateIssueCols(e Engine, issue *Issue, cols ...string) error {
 | 
			
		||||
 
 | 
			
		||||
@@ -613,6 +613,7 @@ func findComments(e Engine, opts FindCommentsOptions) ([]*Comment, error) {
 | 
			
		||||
	}
 | 
			
		||||
	return comments, sess.
 | 
			
		||||
		Asc("comment.created_unix").
 | 
			
		||||
		Asc("comment.id").
 | 
			
		||||
		Find(&comments)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -509,10 +509,7 @@ func SMTPAuth(a smtp.Auth, cfg *SMTPConfig) error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ok, _ := c.Extension("AUTH"); ok {
 | 
			
		||||
		if err = c.Auth(a); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
		return c.Auth(a)
 | 
			
		||||
	}
 | 
			
		||||
	return ErrUnsupportedLoginType
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -166,7 +166,7 @@ func composeIssueCommentMessage(issue *Issue, doer *User, comment *Comment, tplN
 | 
			
		||||
		log.Error(3, "Template: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	msg := mailer.NewMessageFrom(tos, fmt.Sprintf(`"%s" <%s>`, doer.DisplayName(), setting.MailService.FromEmail), subject, content.String())
 | 
			
		||||
	msg := mailer.NewMessageFrom(tos, doer.DisplayName(), setting.MailService.FromEmail, subject, content.String())
 | 
			
		||||
	msg.Info = fmt.Sprintf("Subject: %s, %s", subject, info)
 | 
			
		||||
	return msg
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -126,6 +126,12 @@ var migrations = []Migration{
 | 
			
		||||
	NewMigration("unescape user full names", unescapeUserFullNames),
 | 
			
		||||
	// v38 -> v39
 | 
			
		||||
	NewMigration("remove commits and settings unit types", removeCommitsUnitType),
 | 
			
		||||
	// v43 -> v44
 | 
			
		||||
	NewMigration("fix protected branch can push value to false", fixProtectedBranchCanPushValue),
 | 
			
		||||
	// v42 -> v43
 | 
			
		||||
	NewMigration("add tags to releases and sync existing repositories", releaseAddColumnIsTagAndSyncTags),
 | 
			
		||||
	// v44 -> v45
 | 
			
		||||
	NewMigration("remove duplicate unit types", removeDuplicateUnitTypes),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Migrate database to current version
 | 
			
		||||
 
 | 
			
		||||
@@ -10,20 +10,15 @@ import (
 | 
			
		||||
	"github.com/go-xorm/xorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// UserV15 describes the added field for User
 | 
			
		||||
type UserV15 struct {
 | 
			
		||||
	AllowCreateOrganization bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TableName will be invoked by XORM to customrize the table name
 | 
			
		||||
func (*UserV15) TableName() string {
 | 
			
		||||
	return "user"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createAllowCreateOrganizationColumn(x *xorm.Engine) error {
 | 
			
		||||
	if err := x.Sync2(new(UserV15)); err != nil {
 | 
			
		||||
	type User struct {
 | 
			
		||||
		KeepEmailPrivate        bool
 | 
			
		||||
		AllowCreateOrganization bool
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := x.Sync2(new(User)); err != nil {
 | 
			
		||||
		return fmt.Errorf("Sync2: %v", err)
 | 
			
		||||
	} else if _, err = x.Where("type=0").Cols("allow_create_organization").Update(&UserV15{AllowCreateOrganization: true}); err != nil {
 | 
			
		||||
	} else if _, err = x.Where("`type` = 0").Cols("allow_create_organization").Update(&User{AllowCreateOrganization: true}); err != nil {
 | 
			
		||||
		return fmt.Errorf("set allow_create_organization: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
 
 | 
			
		||||
@@ -13,17 +13,6 @@ import (
 | 
			
		||||
	"github.com/go-xorm/xorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RepoUnit describes all units of a repository
 | 
			
		||||
type RepoUnit struct {
 | 
			
		||||
	ID          int64
 | 
			
		||||
	RepoID      int64 `xorm:"INDEX(s)"`
 | 
			
		||||
	Type        int   `xorm:"INDEX(s)"`
 | 
			
		||||
	Index       int
 | 
			
		||||
	Config      map[string]string `xorm:"JSON"`
 | 
			
		||||
	CreatedUnix int64             `xorm:"INDEX CREATED"`
 | 
			
		||||
	Created     time.Time         `xorm:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Enumerate all the unit types
 | 
			
		||||
const (
 | 
			
		||||
	V16UnitTypeCode            = iota + 1 // 1 code
 | 
			
		||||
@@ -37,14 +26,25 @@ const (
 | 
			
		||||
	V16UnitTypeExternalTracker            // 9 ExternalTracker
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Repo describes a repository
 | 
			
		||||
type Repo struct {
 | 
			
		||||
	ID                                                                               int64
 | 
			
		||||
	EnableWiki, EnableExternalWiki, EnableIssues, EnableExternalTracker, EnablePulls bool
 | 
			
		||||
	ExternalWikiURL, ExternalTrackerURL, ExternalTrackerFormat, ExternalTrackerStyle string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func addUnitsToTables(x *xorm.Engine) error {
 | 
			
		||||
	// RepoUnit describes all units of a repository
 | 
			
		||||
	type RepoUnit struct {
 | 
			
		||||
		ID          int64
 | 
			
		||||
		RepoID      int64 `xorm:"INDEX(s)"`
 | 
			
		||||
		Type        int   `xorm:"INDEX(s)"`
 | 
			
		||||
		Index       int
 | 
			
		||||
		Config      map[string]interface{} `xorm:"JSON"`
 | 
			
		||||
		CreatedUnix int64                  `xorm:"INDEX CREATED"`
 | 
			
		||||
		Created     time.Time              `xorm:"-"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Repo describes a repository
 | 
			
		||||
	type Repo struct {
 | 
			
		||||
		ID                                                                               int64
 | 
			
		||||
		EnableWiki, EnableExternalWiki, EnableIssues, EnableExternalTracker, EnablePulls bool
 | 
			
		||||
		ExternalWikiURL, ExternalTrackerURL, ExternalTrackerFormat, ExternalTrackerStyle string
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var repos []Repo
 | 
			
		||||
	err := x.Table("repository").Select("*").Find(&repos)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -95,7 +95,7 @@ func addUnitsToTables(x *xorm.Engine) error {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var config = make(map[string]string)
 | 
			
		||||
			var config = make(map[string]interface{})
 | 
			
		||||
			switch i {
 | 
			
		||||
			case V16UnitTypeExternalTracker:
 | 
			
		||||
				config["ExternalTrackerURL"] = repo.ExternalTrackerURL
 | 
			
		||||
@@ -119,9 +119,5 @@ func addUnitsToTables(x *xorm.Engine) error {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := sess.Commit(); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
	return sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -51,8 +51,5 @@ func useNewPublickeyFormat(x *xorm.Engine) error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	f.Close()
 | 
			
		||||
	if err = os.Rename(tmpPath, fpath); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
	return os.Rename(tmpPath, fpath)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,16 +7,19 @@ package migrations
 | 
			
		||||
import (
 | 
			
		||||
	"html"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/xorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func unescapeUserFullNames(x *xorm.Engine) (err error) {
 | 
			
		||||
	type User struct {
 | 
			
		||||
		ID       int64 `xorm:"pk autoincr"`
 | 
			
		||||
		FullName string
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const batchSize = 100
 | 
			
		||||
	for start := 0; ; start += batchSize {
 | 
			
		||||
		users := make([]*models.User, 0, batchSize)
 | 
			
		||||
		if err := x.Limit(start, batchSize).Find(users); err != nil {
 | 
			
		||||
		users := make([]*User, 0, batchSize)
 | 
			
		||||
		if err := x.Limit(batchSize, start).Find(&users); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if len(users) == 0 {
 | 
			
		||||
@@ -24,7 +27,7 @@ func unescapeUserFullNames(x *xorm.Engine) (err error) {
 | 
			
		||||
		}
 | 
			
		||||
		for _, user := range users {
 | 
			
		||||
			user.FullName = html.UnescapeString(user.FullName)
 | 
			
		||||
			if _, err := x.Cols("full_name").Update(user); err != nil {
 | 
			
		||||
			if _, err := x.ID(user.ID).Cols("full_name").Update(user); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,12 +5,26 @@
 | 
			
		||||
package migrations
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/core"
 | 
			
		||||
	"github.com/go-xorm/xorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func removeCommitsUnitType(x *xorm.Engine) (err error) {
 | 
			
		||||
	// RepoUnit describes all units of a repository
 | 
			
		||||
	type RepoUnit struct {
 | 
			
		||||
		ID          int64
 | 
			
		||||
		RepoID      int64 `xorm:"INDEX(s)"`
 | 
			
		||||
		Type        int   `xorm:"INDEX(s)"`
 | 
			
		||||
		Index       int
 | 
			
		||||
		Config      core.Conversion `xorm:"TEXT"`
 | 
			
		||||
		CreatedUnix int64           `xorm:"INDEX CREATED"`
 | 
			
		||||
		Created     time.Time       `xorm:"-"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Update team unit types
 | 
			
		||||
	const batchSize = 100
 | 
			
		||||
	for start := 0; ; start += batchSize {
 | 
			
		||||
@@ -33,7 +47,7 @@ func removeCommitsUnitType(x *xorm.Engine) (err error) {
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			team.UnitTypes = ut
 | 
			
		||||
			if _, err := x.Id(team.ID).Cols("unit_types").Update(team); err != nil {
 | 
			
		||||
			if _, err := x.ID(team.ID).Cols("unit_types").Update(team); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										57
									
								
								models/migrations/v42.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								models/migrations/v42.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
// Copyright 2017 The Gitea Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package migrations
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/git"
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/xorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ReleaseV39 describes the added field for Release
 | 
			
		||||
type ReleaseV39 struct {
 | 
			
		||||
	IsTag bool `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TableName will be invoked by XORM to customrize the table name
 | 
			
		||||
func (*ReleaseV39) TableName() string {
 | 
			
		||||
	return "release"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func releaseAddColumnIsTagAndSyncTags(x *xorm.Engine) error {
 | 
			
		||||
	if err := x.Sync2(new(ReleaseV39)); err != nil {
 | 
			
		||||
		return fmt.Errorf("Sync2: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// For the sake of SQLite3, we can't use x.Iterate here.
 | 
			
		||||
	offset := 0
 | 
			
		||||
	pageSize := 20
 | 
			
		||||
	for {
 | 
			
		||||
		repos := make([]*models.Repository, 0, pageSize)
 | 
			
		||||
		if err := x.Table("repository").Asc("id").Limit(pageSize, offset).Find(&repos); err != nil {
 | 
			
		||||
			return fmt.Errorf("select repos [offset: %d]: %v", offset, err)
 | 
			
		||||
		}
 | 
			
		||||
		for _, repo := range repos {
 | 
			
		||||
			gitRepo, err := git.OpenRepository(repo.RepoPath())
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Warn("OpenRepository: %v", err)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if err = models.SyncReleasesWithTags(repo, gitRepo); err != nil {
 | 
			
		||||
				log.Warn("SyncReleasesWithTags: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if len(repos) < pageSize {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		offset += pageSize
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								models/migrations/v43.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								models/migrations/v43.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
// Copyright 2017 The Gitea Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package migrations
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/xorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func fixProtectedBranchCanPushValue(x *xorm.Engine) error {
 | 
			
		||||
	_, err := x.Cols("can_push").Update(&models.ProtectedBranch{
 | 
			
		||||
		CanPush: false,
 | 
			
		||||
	})
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								models/migrations/v44.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								models/migrations/v44.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
// Copyright 2017 The Gitea Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package migrations
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-xorm/xorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func removeDuplicateUnitTypes(x *xorm.Engine) error {
 | 
			
		||||
	// RepoUnit describes all units of a repository
 | 
			
		||||
	type RepoUnit struct {
 | 
			
		||||
		RepoID int64
 | 
			
		||||
		Type   int
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Enumerate all the unit types
 | 
			
		||||
	const (
 | 
			
		||||
		UnitTypeCode            = iota + 1 // 1 code
 | 
			
		||||
		UnitTypeIssues                     // 2 issues
 | 
			
		||||
		UnitTypePullRequests               // 3 PRs
 | 
			
		||||
		UnitTypeReleases                   // 4 Releases
 | 
			
		||||
		UnitTypeWiki                       // 5 Wiki
 | 
			
		||||
		UnitTypeExternalWiki               // 6 ExternalWiki
 | 
			
		||||
		UnitTypeExternalTracker            // 7 ExternalTracker
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	var externalIssueRepoUnits []RepoUnit
 | 
			
		||||
	err := x.Where("type = ?", UnitTypeExternalTracker).Find(&externalIssueRepoUnits)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("Query repositories: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var externalWikiRepoUnits []RepoUnit
 | 
			
		||||
	err = x.Where("type = ?", UnitTypeExternalWiki).Find(&externalWikiRepoUnits)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("Query repositories: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
 | 
			
		||||
	if err := sess.Begin(); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, repoUnit := range externalIssueRepoUnits {
 | 
			
		||||
		if _, err = sess.Delete(&RepoUnit{
 | 
			
		||||
			RepoID: repoUnit.RepoID,
 | 
			
		||||
			Type:   UnitTypeIssues,
 | 
			
		||||
		}); err != nil {
 | 
			
		||||
			return fmt.Errorf("Delete repo unit: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, repoUnit := range externalWikiRepoUnits {
 | 
			
		||||
		if _, err = sess.Delete(&RepoUnit{
 | 
			
		||||
			RepoID: repoUnit.RepoID,
 | 
			
		||||
			Type:   UnitTypeWiki,
 | 
			
		||||
		}); err != nil {
 | 
			
		||||
			return fmt.Errorf("Delete repo unit: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
@@ -235,11 +235,7 @@ func DeleteOrganization(org *User) (err error) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = sess.Commit(); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
	return sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func deleteOrg(e *xorm.Session, u *User) error {
 | 
			
		||||
@@ -675,7 +671,7 @@ func (env *accessibleReposEnv) MirrorRepoIDs() ([]int64, error) {
 | 
			
		||||
		Table("repository").
 | 
			
		||||
		Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id AND `repository`.is_mirror=?", true).
 | 
			
		||||
		Where(env.cond()).
 | 
			
		||||
		GroupBy("`repository`.id").
 | 
			
		||||
		GroupBy("`repository`.id, `repository`.updated_unix").
 | 
			
		||||
		OrderBy("updated_unix DESC").
 | 
			
		||||
		Cols("`repository`.id").
 | 
			
		||||
		Find(&repoIDs)
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,8 @@ type Release struct {
 | 
			
		||||
	NumCommitsBehind int64  `xorm:"-"`
 | 
			
		||||
	Note             string `xorm:"TEXT"`
 | 
			
		||||
	IsDraft          bool   `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	IsPrerelease     bool
 | 
			
		||||
	IsPrerelease     bool   `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	IsTag            bool   `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
 | 
			
		||||
	Attachments []*Attachment `xorm:"-"`
 | 
			
		||||
 | 
			
		||||
@@ -139,17 +140,18 @@ func createTag(gitRepo *git.Repository, rel *Release) error {
 | 
			
		||||
				}
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			commit, err := gitRepo.GetTagCommit(rel.TagName)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("GetTagCommit: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
			rel.LowerTagName = strings.ToLower(rel.TagName)
 | 
			
		||||
		}
 | 
			
		||||
		commit, err := gitRepo.GetTagCommit(rel.TagName)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("GetTagCommit: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
			rel.Sha1 = commit.ID.String()
 | 
			
		||||
			rel.NumCommits, err = commit.CommitsCount()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("CommitsCount: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
		rel.Sha1 = commit.ID.String()
 | 
			
		||||
		rel.CreatedUnix = commit.Author.When.Unix()
 | 
			
		||||
		rel.NumCommits, err = commit.CommitsCount()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("CommitsCount: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
@@ -236,6 +238,7 @@ func GetReleaseByID(id int64) (*Release, error) {
 | 
			
		||||
// FindReleasesOptions describes the conditions to Find releases
 | 
			
		||||
type FindReleasesOptions struct {
 | 
			
		||||
	IncludeDrafts bool
 | 
			
		||||
	IncludeTags   bool
 | 
			
		||||
	TagNames      []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -246,6 +249,9 @@ func (opts *FindReleasesOptions) toConds(repoID int64) builder.Cond {
 | 
			
		||||
	if !opts.IncludeDrafts {
 | 
			
		||||
		cond = cond.And(builder.Eq{"is_draft": false})
 | 
			
		||||
	}
 | 
			
		||||
	if !opts.IncludeTags {
 | 
			
		||||
		cond = cond.And(builder.Eq{"is_tag": false})
 | 
			
		||||
	}
 | 
			
		||||
	if len(opts.TagNames) > 0 {
 | 
			
		||||
		cond = cond.And(builder.In("tag_name", opts.TagNames))
 | 
			
		||||
	}
 | 
			
		||||
@@ -361,6 +367,8 @@ func UpdateRelease(gitRepo *git.Repository, rel *Release, attachmentUUIDs []stri
 | 
			
		||||
	if err = createTag(gitRepo, rel); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	rel.LowerTagName = strings.ToLower(rel.TagName)
 | 
			
		||||
 | 
			
		||||
	_, err = x.Id(rel.ID).AllCols().Update(rel)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
@@ -397,11 +405,64 @@ func DeleteReleaseByID(id int64, u *User, delTag bool) error {
 | 
			
		||||
		if err != nil && !strings.Contains(stderr, "not found") {
 | 
			
		||||
			return fmt.Errorf("git tag -d: %v - %s", err, stderr)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, err = x.Id(rel.ID).Delete(new(Release)); err != nil {
 | 
			
		||||
		return fmt.Errorf("Delete: %v", err)
 | 
			
		||||
		if _, err = x.Id(rel.ID).Delete(new(Release)); err != nil {
 | 
			
		||||
			return fmt.Errorf("Delete: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		rel.IsTag = true
 | 
			
		||||
		rel.IsDraft = false
 | 
			
		||||
		rel.IsPrerelease = false
 | 
			
		||||
		rel.Title = ""
 | 
			
		||||
		rel.Note = ""
 | 
			
		||||
 | 
			
		||||
		if _, err = x.Id(rel.ID).AllCols().Update(rel); err != nil {
 | 
			
		||||
			return fmt.Errorf("Update: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SyncReleasesWithTags synchronizes release table with repository tags
 | 
			
		||||
func SyncReleasesWithTags(repo *Repository, gitRepo *git.Repository) error {
 | 
			
		||||
	existingRelTags := make(map[string]struct{})
 | 
			
		||||
	opts := FindReleasesOptions{IncludeDrafts: true, IncludeTags: true}
 | 
			
		||||
	for page := 1; ; page++ {
 | 
			
		||||
		rels, err := GetReleasesByRepoID(repo.ID, opts, page, 100)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("GetReleasesByRepoID: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		if len(rels) == 0 {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		for _, rel := range rels {
 | 
			
		||||
			if rel.IsDraft {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			commitID, err := gitRepo.GetTagCommitID(rel.TagName)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("GetTagCommitID: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
			if !gitRepo.IsTagExist(rel.TagName) || commitID != rel.Sha1 {
 | 
			
		||||
				if err := pushUpdateDeleteTag(repo, gitRepo, rel.TagName); err != nil {
 | 
			
		||||
					return fmt.Errorf("pushUpdateDeleteTag: %v", err)
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				existingRelTags[strings.ToLower(rel.TagName)] = struct{}{}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	tags, err := gitRepo.GetTags()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("GetTags: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	for _, tagName := range tags {
 | 
			
		||||
		if _, ok := existingRelTags[strings.ToLower(tagName)]; !ok {
 | 
			
		||||
			if err := pushUpdateAddTag(repo, gitRepo, tagName); err != nil {
 | 
			
		||||
				return fmt.Errorf("pushUpdateAddTag: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -193,7 +193,7 @@ type Repository struct {
 | 
			
		||||
	NumMilestones       int `xorm:"NOT NULL DEFAULT 0"`
 | 
			
		||||
	NumClosedMilestones int `xorm:"NOT NULL DEFAULT 0"`
 | 
			
		||||
	NumOpenMilestones   int `xorm:"-"`
 | 
			
		||||
	NumTags             int `xorm:"-"`
 | 
			
		||||
	NumReleases         int `xorm:"-"`
 | 
			
		||||
 | 
			
		||||
	IsPrivate bool `xorm:"INDEX"`
 | 
			
		||||
	IsBare    bool `xorm:"INDEX"`
 | 
			
		||||
@@ -409,6 +409,21 @@ func (repo *Repository) UnitEnabled(tp UnitType) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AnyUnitEnabled if this repository has the any of the given units enabled
 | 
			
		||||
func (repo *Repository) AnyUnitEnabled(tps ...UnitType) bool {
 | 
			
		||||
	if err := repo.getUnits(x); err != nil {
 | 
			
		||||
		log.Warn("Error loading repository (ID: %d) units: %s", repo.ID, err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	for _, unit := range repo.Units {
 | 
			
		||||
		for _, tp := range tps {
 | 
			
		||||
			if unit.Type == tp {
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// ErrUnitNotExist organization does not exist
 | 
			
		||||
	ErrUnitNotExist = errors.New("Unit does not exist")
 | 
			
		||||
@@ -648,7 +663,26 @@ func (repo *Repository) UpdateSize() error {
 | 
			
		||||
 | 
			
		||||
// CanBeForked returns true if repository meets the requirements of being forked.
 | 
			
		||||
func (repo *Repository) CanBeForked() bool {
 | 
			
		||||
	return !repo.IsBare
 | 
			
		||||
	return !repo.IsBare && repo.UnitEnabled(UnitTypeCode)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CanUserFork returns true if specified user can fork repository.
 | 
			
		||||
func (repo *Repository) CanUserFork(user *User) (bool, error) {
 | 
			
		||||
	if user == nil {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
	if repo.OwnerID != user.ID && !user.HasForkedRepo(repo.ID) {
 | 
			
		||||
		return true, nil
 | 
			
		||||
	}
 | 
			
		||||
	if err := user.GetOwnedOrganizations(); err != nil {
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	for _, org := range user.OwnedOrgs {
 | 
			
		||||
		if repo.OwnerID != org.ID && !org.HasForkedRepo(repo.ID) {
 | 
			
		||||
			return true, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CanEnablePulls returns true if repository meets the requirements of accepting pulls.
 | 
			
		||||
@@ -912,6 +946,10 @@ func MigrateRepository(u *User, opts MigrateRepoOptions) (*Repository, error) {
 | 
			
		||||
		if headBranch != nil {
 | 
			
		||||
			repo.DefaultBranch = headBranch.Name
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err = SyncReleasesWithTags(repo, gitRepo); err != nil {
 | 
			
		||||
			log.Error(4, "Failed to synchronize tags to releases for repository: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = repo.UpdateSize(); err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -120,10 +120,12 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun
 | 
			
		||||
		opts.Page = 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var starJoin bool
 | 
			
		||||
	if opts.Starred && opts.OwnerID > 0 {
 | 
			
		||||
		cond = builder.Eq{
 | 
			
		||||
			"star.uid": opts.OwnerID,
 | 
			
		||||
		}
 | 
			
		||||
		starJoin = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	opts.Keyword = strings.ToLower(opts.Keyword)
 | 
			
		||||
@@ -133,34 +135,34 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun
 | 
			
		||||
 | 
			
		||||
	// Append conditions
 | 
			
		||||
	if !opts.Starred && opts.OwnerID > 0 {
 | 
			
		||||
		cond = cond.And(builder.Eq{"owner_id": opts.OwnerID})
 | 
			
		||||
	}
 | 
			
		||||
	if !opts.Private {
 | 
			
		||||
		cond = cond.And(builder.Eq{"is_private": false})
 | 
			
		||||
	}
 | 
			
		||||
		var searcherReposCond builder.Cond = builder.Eq{"owner_id": opts.OwnerID}
 | 
			
		||||
		if opts.Searcher != nil {
 | 
			
		||||
			var ownerIds []int64
 | 
			
		||||
 | 
			
		||||
	if opts.Searcher != nil {
 | 
			
		||||
		var ownerIds []int64
 | 
			
		||||
			ownerIds = append(ownerIds, opts.Searcher.ID)
 | 
			
		||||
			err = opts.Searcher.GetOrganizations(true)
 | 
			
		||||
 | 
			
		||||
		ownerIds = append(ownerIds, opts.Searcher.ID)
 | 
			
		||||
		err = opts.Searcher.GetOrganizations(true)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, 0, fmt.Errorf("Organization: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, 0, fmt.Errorf("Organization: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
			for _, org := range opts.Searcher.Orgs {
 | 
			
		||||
				ownerIds = append(ownerIds, org.ID)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		for _, org := range opts.Searcher.Orgs {
 | 
			
		||||
			ownerIds = append(ownerIds, org.ID)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		searcherReposCond := builder.In("owner_id", ownerIds)
 | 
			
		||||
		if opts.Collaborate {
 | 
			
		||||
			searcherReposCond = searcherReposCond.Or(builder.Expr(`id IN (SELECT repo_id FROM "access" WHERE access.user_id = ? AND owner_id != ?)`,
 | 
			
		||||
				opts.Searcher.ID, opts.Searcher.ID))
 | 
			
		||||
			searcherReposCond = searcherReposCond.Or(builder.In("owner_id", ownerIds))
 | 
			
		||||
			if opts.Collaborate {
 | 
			
		||||
				searcherReposCond = searcherReposCond.Or(builder.Expr("id IN (SELECT repo_id FROM `access` WHERE access.user_id = ? AND owner_id != ?)",
 | 
			
		||||
					opts.Searcher.ID, opts.Searcher.ID))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		cond = cond.And(searcherReposCond)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !opts.Private {
 | 
			
		||||
		cond = cond.And(builder.Eq{"is_private": false})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(opts.OrderBy) == 0 {
 | 
			
		||||
		opts.OrderBy = "name ASC"
 | 
			
		||||
	}
 | 
			
		||||
@@ -168,7 +170,7 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
 | 
			
		||||
	if opts.Starred && opts.OwnerID > 0 {
 | 
			
		||||
	if starJoin {
 | 
			
		||||
		count, err = sess.
 | 
			
		||||
			Join("INNER", "star", "star.repo_id = repository.id").
 | 
			
		||||
			Where(cond).
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ import (
 | 
			
		||||
	"github.com/go-xorm/xorm"
 | 
			
		||||
	"gopkg.in/ini.v1"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/process"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
@@ -148,6 +149,15 @@ func (m *Mirror) runSync() bool {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gitRepo, err := git.OpenRepository(repoPath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(4, "OpenRepository: %v", err)
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if err = SyncReleasesWithTags(m.Repo, gitRepo); err != nil {
 | 
			
		||||
		log.Error(4, "Failed to synchronize tags to releases for repository: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := m.Repo.UpdateSize(); err != nil {
 | 
			
		||||
		log.Error(4, "Failed to update size for mirror repository: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -609,11 +609,7 @@ func RewriteAllPublicKeys() error {
 | 
			
		||||
		defer f.Close()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = os.Rename(tmpPath, fPath); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
	return os.Rename(tmpPath, fPath)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ________                .__                 ____  __.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										123
									
								
								models/update.go
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								models/update.go
									
									
									
									
									
								
							@@ -9,6 +9,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/git"
 | 
			
		||||
 | 
			
		||||
@@ -81,6 +82,108 @@ func PushUpdate(branch string, opt PushUpdateOptions) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func pushUpdateDeleteTag(repo *Repository, gitRepo *git.Repository, tagName string) error {
 | 
			
		||||
	rel, err := GetRelease(repo.ID, tagName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if IsErrReleaseNotExist(err) {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("GetRelease: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if rel.IsTag {
 | 
			
		||||
		if _, err = x.Id(rel.ID).Delete(new(Release)); err != nil {
 | 
			
		||||
			return fmt.Errorf("Delete: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		rel.IsDraft = true
 | 
			
		||||
		rel.NumCommits = 0
 | 
			
		||||
		rel.Sha1 = ""
 | 
			
		||||
		if _, err = x.Id(rel.ID).AllCols().Update(rel); err != nil {
 | 
			
		||||
			return fmt.Errorf("Update: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func pushUpdateAddTag(repo *Repository, gitRepo *git.Repository, tagName string) error {
 | 
			
		||||
	rel, err := GetRelease(repo.ID, tagName)
 | 
			
		||||
	if err != nil && !IsErrReleaseNotExist(err) {
 | 
			
		||||
		return fmt.Errorf("GetRelease: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tag, err := gitRepo.GetTag(tagName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("GetTag: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	commit, err := tag.Commit()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("Commit: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sig := tag.Tagger
 | 
			
		||||
	if sig == nil {
 | 
			
		||||
		sig = commit.Author
 | 
			
		||||
	}
 | 
			
		||||
	if sig == nil {
 | 
			
		||||
		sig = commit.Committer
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var author *User
 | 
			
		||||
	var createdAt = time.Unix(1, 0)
 | 
			
		||||
 | 
			
		||||
	if sig != nil {
 | 
			
		||||
		author, err = GetUserByEmail(sig.Email)
 | 
			
		||||
		if err != nil && !IsErrUserNotExist(err) {
 | 
			
		||||
			return fmt.Errorf("GetUserByEmail: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		createdAt = sig.When
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commitsCount, err := commit.CommitsCount()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("CommitsCount: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if rel == nil {
 | 
			
		||||
		rel = &Release{
 | 
			
		||||
			RepoID:       repo.ID,
 | 
			
		||||
			Title:        "",
 | 
			
		||||
			TagName:      tagName,
 | 
			
		||||
			LowerTagName: strings.ToLower(tagName),
 | 
			
		||||
			Target:       "",
 | 
			
		||||
			Sha1:         commit.ID.String(),
 | 
			
		||||
			NumCommits:   commitsCount,
 | 
			
		||||
			Note:         "",
 | 
			
		||||
			IsDraft:      false,
 | 
			
		||||
			IsPrerelease: false,
 | 
			
		||||
			IsTag:        true,
 | 
			
		||||
			Created:      createdAt,
 | 
			
		||||
			CreatedUnix:  createdAt.Unix(),
 | 
			
		||||
		}
 | 
			
		||||
		if author != nil {
 | 
			
		||||
			rel.PublisherID = author.ID
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if _, err = x.InsertOne(rel); err != nil {
 | 
			
		||||
			return fmt.Errorf("InsertOne: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		rel.Sha1 = commit.ID.String()
 | 
			
		||||
		rel.Created = createdAt
 | 
			
		||||
		rel.CreatedUnix = createdAt.Unix()
 | 
			
		||||
		rel.NumCommits = commitsCount
 | 
			
		||||
		rel.IsDraft = false
 | 
			
		||||
		if rel.IsTag && author != nil {
 | 
			
		||||
			rel.PublisherID = author.ID
 | 
			
		||||
		}
 | 
			
		||||
		if _, err = x.Id(rel.ID).AllCols().Update(rel); err != nil {
 | 
			
		||||
			return fmt.Errorf("Update: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func pushUpdate(opts PushUpdateOptions) (repo *Repository, err error) {
 | 
			
		||||
	isNewRef := opts.OldCommitID == git.EmptySHA
 | 
			
		||||
	isDelRef := opts.NewCommitID == git.EmptySHA
 | 
			
		||||
@@ -106,23 +209,31 @@ func pushUpdate(opts PushUpdateOptions) (repo *Repository, err error) {
 | 
			
		||||
		return nil, fmt.Errorf("GetRepositoryByName: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if isDelRef {
 | 
			
		||||
		log.GitLogger.Info("Reference '%s' has been deleted from '%s/%s' by %s",
 | 
			
		||||
			opts.RefFullName, opts.RepoUserName, opts.RepoName, opts.PusherName)
 | 
			
		||||
		return repo, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gitRepo, err := git.OpenRepository(repoPath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("OpenRepository: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if isDelRef {
 | 
			
		||||
		// Tag has been deleted
 | 
			
		||||
		if strings.HasPrefix(opts.RefFullName, git.TagPrefix) {
 | 
			
		||||
			err = pushUpdateDeleteTag(repo, gitRepo, opts.RefFullName[len(git.TagPrefix):])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, fmt.Errorf("pushUpdateDeleteTag: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		log.GitLogger.Info("Reference '%s' has been deleted from '%s/%s' by %s",
 | 
			
		||||
			opts.RefFullName, opts.RepoUserName, opts.RepoName, opts.PusherName)
 | 
			
		||||
		return repo, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = repo.UpdateSize(); err != nil {
 | 
			
		||||
		log.Error(4, "Failed to update size for repository: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Push tags.
 | 
			
		||||
	if strings.HasPrefix(opts.RefFullName, git.TagPrefix) {
 | 
			
		||||
		pushUpdateAddTag(repo, gitRepo, opts.RefFullName[len(git.TagPrefix):])
 | 
			
		||||
		if err := CommitRepoAction(CommitRepoActionOptions{
 | 
			
		||||
			PusherName:  opts.PusherName,
 | 
			
		||||
			RepoOwnerID: owner.ID,
 | 
			
		||||
 
 | 
			
		||||
@@ -1205,6 +1205,9 @@ type UserCommit struct {
 | 
			
		||||
 | 
			
		||||
// ValidateCommitWithEmail check if author's e-mail of commit is corresponding to a user.
 | 
			
		||||
func ValidateCommitWithEmail(c *git.Commit) *User {
 | 
			
		||||
	if c.Author == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	u, err := GetUserByEmail(c.Author.Email)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil
 | 
			
		||||
@@ -1223,11 +1226,15 @@ func ValidateCommitsWithEmails(oldCommits *list.List) *list.List {
 | 
			
		||||
	for e != nil {
 | 
			
		||||
		c := e.Value.(*git.Commit)
 | 
			
		||||
 | 
			
		||||
		if v, ok := emails[c.Author.Email]; !ok {
 | 
			
		||||
			u, _ = GetUserByEmail(c.Author.Email)
 | 
			
		||||
			emails[c.Author.Email] = u
 | 
			
		||||
		if c.Author != nil {
 | 
			
		||||
			if v, ok := emails[c.Author.Email]; !ok {
 | 
			
		||||
				u, _ = GetUserByEmail(c.Author.Email)
 | 
			
		||||
				emails[c.Author.Email] = u
 | 
			
		||||
			} else {
 | 
			
		||||
				u = v
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			u = v
 | 
			
		||||
			u = nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		newCommits.PushBack(UserCommit{
 | 
			
		||||
 
 | 
			
		||||
@@ -194,7 +194,7 @@ func Contexter() macaron.Handler {
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
`, map[string]string{
 | 
			
		||||
				"GoGetImport":    path.Join(setting.Domain, setting.AppSubURL, ctx.Link),
 | 
			
		||||
				"GoGetImport":    ComposeGoGetImport(ownerName, strings.TrimSuffix(repoName, ".git")),
 | 
			
		||||
				"CloneLink":      models.ComposeHTTPSCloneURL(ownerName, repoName),
 | 
			
		||||
				"GoDocDirectory": prefix + "{/dir}",
 | 
			
		||||
				"GoDocFile":      prefix + "{/dir}/{file}#L{line}",
 | 
			
		||||
 
 | 
			
		||||
@@ -124,21 +124,23 @@ func RetrieveBaseRepo(ctx *Context, repo *models.Repository) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// composeGoGetImport returns go-get-import meta content.
 | 
			
		||||
func composeGoGetImport(owner, repo string) string {
 | 
			
		||||
// ComposeGoGetImport returns go-get-import meta content.
 | 
			
		||||
func ComposeGoGetImport(owner, repo string) string {
 | 
			
		||||
	return path.Join(setting.Domain, setting.AppSubURL, owner, repo)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// earlyResponseForGoGetMeta responses appropriate go-get meta with status 200
 | 
			
		||||
// EarlyResponseForGoGetMeta responses appropriate go-get meta with status 200
 | 
			
		||||
// if user does not have actual access to the requested repository,
 | 
			
		||||
// or the owner or repository does not exist at all.
 | 
			
		||||
// This is particular a workaround for "go get" command which does not respect
 | 
			
		||||
// .netrc file.
 | 
			
		||||
func earlyResponseForGoGetMeta(ctx *Context) {
 | 
			
		||||
func EarlyResponseForGoGetMeta(ctx *Context) {
 | 
			
		||||
	username := ctx.Params(":username")
 | 
			
		||||
	reponame := ctx.Params(":reponame")
 | 
			
		||||
	ctx.PlainText(200, []byte(com.Expand(`<meta name="go-import" content="{GoGetImport} git {CloneLink}">`,
 | 
			
		||||
		map[string]string{
 | 
			
		||||
			"GoGetImport": composeGoGetImport(ctx.Params(":username"), strings.TrimSuffix(ctx.Params(":reponame"), ".git")),
 | 
			
		||||
			"CloneLink":   models.ComposeHTTPSCloneURL(ctx.Params(":username"), ctx.Params(":reponame")),
 | 
			
		||||
			"GoGetImport": ComposeGoGetImport(username, strings.TrimSuffix(reponame, ".git")),
 | 
			
		||||
			"CloneLink":   models.ComposeHTTPSCloneURL(username, reponame),
 | 
			
		||||
		})))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -162,6 +164,75 @@ func RedirectToRepo(ctx *Context, redirectRepoID int64) {
 | 
			
		||||
	ctx.Redirect(redirectPath)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RepoIDAssignment returns an macaron handler which assigns the repo to the context.
 | 
			
		||||
func RepoIDAssignment() macaron.Handler {
 | 
			
		||||
	return func(ctx *Context) {
 | 
			
		||||
		var (
 | 
			
		||||
			err error
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		repoID := ctx.ParamsInt64(":repoid")
 | 
			
		||||
 | 
			
		||||
		// Get repository.
 | 
			
		||||
		repo, err := models.GetRepositoryByID(repoID)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if models.IsErrRepoNotExist(err) {
 | 
			
		||||
				ctx.Handle(404, "GetRepositoryByID", nil)
 | 
			
		||||
			} else {
 | 
			
		||||
				ctx.Handle(500, "GetRepositoryByID", err)
 | 
			
		||||
			}
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err = repo.GetOwner(); err != nil {
 | 
			
		||||
			ctx.Handle(500, "GetOwner", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Admin has super access.
 | 
			
		||||
		if ctx.IsSigned && ctx.User.IsAdmin {
 | 
			
		||||
			ctx.Repo.AccessMode = models.AccessModeOwner
 | 
			
		||||
		} else {
 | 
			
		||||
			var userID int64
 | 
			
		||||
			if ctx.User != nil {
 | 
			
		||||
				userID = ctx.User.ID
 | 
			
		||||
			}
 | 
			
		||||
			mode, err := models.AccessLevel(userID, repo)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.Handle(500, "AccessLevel", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			ctx.Repo.AccessMode = mode
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Check access.
 | 
			
		||||
		if ctx.Repo.AccessMode == models.AccessModeNone {
 | 
			
		||||
			if ctx.Query("go-get") == "1" {
 | 
			
		||||
				EarlyResponseForGoGetMeta(ctx)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			ctx.Handle(404, "no access right", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Data["HasAccess"] = true
 | 
			
		||||
 | 
			
		||||
		if repo.IsMirror {
 | 
			
		||||
			ctx.Repo.Mirror, err = models.GetMirrorByRepoID(repo.ID)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.Handle(500, "GetMirror", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			ctx.Data["MirrorEnablePrune"] = ctx.Repo.Mirror.EnablePrune
 | 
			
		||||
			ctx.Data["MirrorInterval"] = ctx.Repo.Mirror.Interval
 | 
			
		||||
			ctx.Data["Mirror"] = ctx.Repo.Mirror
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ctx.Repo.Repository = repo
 | 
			
		||||
		ctx.Data["RepoName"] = ctx.Repo.Repository.Name
 | 
			
		||||
		ctx.Data["IsBareRepo"] = ctx.Repo.Repository.IsBare
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RepoAssignment returns a macaron to handle repository assignment
 | 
			
		||||
func RepoAssignment() macaron.Handler {
 | 
			
		||||
	return func(ctx *Context) {
 | 
			
		||||
@@ -181,7 +252,7 @@ func RepoAssignment() macaron.Handler {
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				if models.IsErrUserNotExist(err) {
 | 
			
		||||
					if ctx.Query("go-get") == "1" {
 | 
			
		||||
						earlyResponseForGoGetMeta(ctx)
 | 
			
		||||
						EarlyResponseForGoGetMeta(ctx)
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
					ctx.Handle(404, "GetUserByName", nil)
 | 
			
		||||
@@ -203,7 +274,7 @@ func RepoAssignment() macaron.Handler {
 | 
			
		||||
					RedirectToRepo(ctx, redirectRepoID)
 | 
			
		||||
				} else if models.IsErrRepoRedirectNotExist(err) {
 | 
			
		||||
					if ctx.Query("go-get") == "1" {
 | 
			
		||||
						earlyResponseForGoGetMeta(ctx)
 | 
			
		||||
						EarlyResponseForGoGetMeta(ctx)
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
					ctx.Handle(404, "GetRepositoryByName", nil)
 | 
			
		||||
@@ -236,7 +307,7 @@ func RepoAssignment() macaron.Handler {
 | 
			
		||||
		// Check access.
 | 
			
		||||
		if ctx.Repo.AccessMode == models.AccessModeNone {
 | 
			
		||||
			if ctx.Query("go-get") == "1" {
 | 
			
		||||
				earlyResponseForGoGetMeta(ctx)
 | 
			
		||||
				EarlyResponseForGoGetMeta(ctx)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			ctx.Handle(404, "no access right", err)
 | 
			
		||||
@@ -275,7 +346,16 @@ func RepoAssignment() macaron.Handler {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Data["Tags"] = tags
 | 
			
		||||
		ctx.Repo.Repository.NumTags = len(tags)
 | 
			
		||||
 | 
			
		||||
		count, err := models.GetReleaseCountByRepoID(ctx.Repo.Repository.ID, models.FindReleasesOptions{
 | 
			
		||||
			IncludeDrafts: false,
 | 
			
		||||
			IncludeTags:   true,
 | 
			
		||||
		})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.Handle(500, "GetReleaseCountByRepoID", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Repo.Repository.NumReleases = int(count)
 | 
			
		||||
 | 
			
		||||
		ctx.Data["Title"] = owner.Name + "/" + repo.Name
 | 
			
		||||
		ctx.Data["Repository"] = repo
 | 
			
		||||
@@ -284,6 +364,11 @@ func RepoAssignment() macaron.Handler {
 | 
			
		||||
		ctx.Data["IsRepositoryAdmin"] = ctx.Repo.IsAdmin()
 | 
			
		||||
		ctx.Data["IsRepositoryWriter"] = ctx.Repo.IsWriter()
 | 
			
		||||
 | 
			
		||||
		if ctx.Data["CanSignedUserFork"], err = ctx.Repo.Repository.CanUserFork(ctx.User); err != nil {
 | 
			
		||||
			ctx.Handle(500, "CanUserFork", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ctx.Data["DisableSSH"] = setting.SSH.Disabled
 | 
			
		||||
		ctx.Data["ExposeAnonSSH"] = setting.SSH.ExposeAnonymous
 | 
			
		||||
		ctx.Data["DisableHTTP"] = setting.Repository.DisableHTTPGit
 | 
			
		||||
@@ -355,7 +440,7 @@ func RepoAssignment() macaron.Handler {
 | 
			
		||||
		ctx.Data["PullRequestCtx"] = ctx.Repo.PullRequest
 | 
			
		||||
 | 
			
		||||
		if ctx.Query("go-get") == "1" {
 | 
			
		||||
			ctx.Data["GoGetImport"] = composeGoGetImport(owner.Name, repo.Name)
 | 
			
		||||
			ctx.Data["GoGetImport"] = ComposeGoGetImport(owner.Name, repo.Name)
 | 
			
		||||
			prefix := setting.AppURL + path.Join(owner.Name, repo.Name, "src", ctx.Repo.BranchName)
 | 
			
		||||
			ctx.Data["GoDocDirectory"] = prefix + "{/dir}"
 | 
			
		||||
			ctx.Data["GoDocFile"] = prefix + "{/dir}/{file}#L{line}"
 | 
			
		||||
@@ -529,6 +614,15 @@ func CheckUnit(unitType models.UnitType) macaron.Handler {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckAnyUnit will check whether any of the unit types are enabled
 | 
			
		||||
func CheckAnyUnit(unitTypes ...models.UnitType) macaron.Handler {
 | 
			
		||||
	return func(ctx *Context) {
 | 
			
		||||
		if !ctx.Repo.Repository.AnyUnitEnabled(unitTypes...) {
 | 
			
		||||
			ctx.Handle(404, "CheckAnyUnit", fmt.Errorf("%s: %v", ctx.Tr("units.error.unit_not_allowed"), unitTypes))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GitHookService checks if repository Git hooks service has been enabled.
 | 
			
		||||
func GitHookService() macaron.Handler {
 | 
			
		||||
	return func(ctx *Context) {
 | 
			
		||||
 
 | 
			
		||||
@@ -70,10 +70,7 @@ func (s *ContentStore) Put(meta *models.LFSMetaObject, r io.Reader) error {
 | 
			
		||||
		return errHashMismatch
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := os.Rename(tmpPath, path); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
	return os.Rename(tmpPath, path)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Exists returns true if the object exists in the content store.
 | 
			
		||||
 
 | 
			
		||||
@@ -110,10 +110,7 @@ func (w *FileLogWriter) StartLogger() error {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	w.mw.SetFd(fd)
 | 
			
		||||
	if err = w.initFd(); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
	return w.initFd()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *FileLogWriter) docheck(size int) {
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/base"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
 | 
			
		||||
@@ -30,18 +31,18 @@ type Message struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewMessageFrom creates new mail message object with custom From header.
 | 
			
		||||
func NewMessageFrom(to []string, from, subject, body string) *Message {
 | 
			
		||||
func NewMessageFrom(to []string, fromDisplayName, fromAddress, subject, body string) *Message {
 | 
			
		||||
	log.Trace("NewMessageFrom (body):\n%s", body)
 | 
			
		||||
 | 
			
		||||
	msg := gomail.NewMessage()
 | 
			
		||||
	msg.SetHeader("From", from)
 | 
			
		||||
	msg.SetAddressHeader("From", fromAddress, fromDisplayName)
 | 
			
		||||
	msg.SetHeader("To", to...)
 | 
			
		||||
	msg.SetHeader("Subject", subject)
 | 
			
		||||
	msg.SetDateHeader("Date", time.Now())
 | 
			
		||||
 | 
			
		||||
	plainBody, err := html2text.FromString(body)
 | 
			
		||||
	if err != nil || setting.MailService.SendAsPlainText {
 | 
			
		||||
		if strings.Contains(body[:100], "<html>") {
 | 
			
		||||
		if strings.Contains(base.TruncateString(body, 100), "<html>") {
 | 
			
		||||
			log.Warn("Mail contains HTML but configured to send as plain text.")
 | 
			
		||||
		}
 | 
			
		||||
		msg.SetBody("text/plain", plainBody)
 | 
			
		||||
@@ -57,7 +58,7 @@ func NewMessageFrom(to []string, from, subject, body string) *Message {
 | 
			
		||||
 | 
			
		||||
// NewMessage creates new mail message object with default From header.
 | 
			
		||||
func NewMessage(to []string, subject, body string) *Message {
 | 
			
		||||
	return NewMessageFrom(to, setting.MailService.From, subject, body)
 | 
			
		||||
	return NewMessageFrom(to, setting.MailService.FromName, setting.MailService.FromEmail, subject, body)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type loginAuth struct {
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@ import (
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/mail"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"os"
 | 
			
		||||
@@ -431,7 +432,7 @@ var (
 | 
			
		||||
	}{
 | 
			
		||||
		DisableDiffHighlight:     false,
 | 
			
		||||
		MaxGitDiffLines:          1000,
 | 
			
		||||
		MaxGitDiffLineCharacters: 500,
 | 
			
		||||
		MaxGitDiffLineCharacters: 5000,
 | 
			
		||||
		MaxGitDiffFiles:          100,
 | 
			
		||||
		GCArgs:                   []string{},
 | 
			
		||||
		Timeout: struct {
 | 
			
		||||
@@ -657,6 +658,12 @@ func NewContext() {
 | 
			
		||||
	// This value is empty if site does not have sub-url.
 | 
			
		||||
	AppSubURL = strings.TrimSuffix(url.Path, "/")
 | 
			
		||||
	AppSubURLDepth = strings.Count(AppSubURL, "/")
 | 
			
		||||
	// Check if Domain differs from AppURL domain than update it to AppURL's domain
 | 
			
		||||
	// TODO: Can be replaced with url.Hostname() when minimal GoLang version is 1.8
 | 
			
		||||
	urlHostname := strings.SplitN(url.Host, ":", 2)[0]
 | 
			
		||||
	if urlHostname != Domain && net.ParseIP(urlHostname) == nil {
 | 
			
		||||
		Domain = urlHostname
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var defaultLocalURL string
 | 
			
		||||
	switch Protocol {
 | 
			
		||||
@@ -1274,6 +1281,7 @@ type Mailer struct {
 | 
			
		||||
	QueueLength     int
 | 
			
		||||
	Name            string
 | 
			
		||||
	From            string
 | 
			
		||||
	FromName        string
 | 
			
		||||
	FromEmail       string
 | 
			
		||||
	SendAsPlainText bool
 | 
			
		||||
 | 
			
		||||
@@ -1332,6 +1340,7 @@ func newMailService() {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatal(4, "Invalid mailer.FROM (%s): %v", MailService.From, err)
 | 
			
		||||
	}
 | 
			
		||||
	MailService.FromName = parsed.Name
 | 
			
		||||
	MailService.FromEmail = parsed.Address
 | 
			
		||||
 | 
			
		||||
	log.Info("Mail Service Enabled")
 | 
			
		||||
 
 | 
			
		||||
@@ -66,6 +66,7 @@ func NewFuncMap() []template.FuncMap {
 | 
			
		||||
		},
 | 
			
		||||
		"AvatarLink":   base.AvatarLink,
 | 
			
		||||
		"Safe":         Safe,
 | 
			
		||||
		"SafeJS":       SafeJS,
 | 
			
		||||
		"Sanitize":     bluemonday.UGCPolicy().Sanitize,
 | 
			
		||||
		"Str2html":     Str2html,
 | 
			
		||||
		"TimeSince":    base.TimeSince,
 | 
			
		||||
@@ -162,6 +163,11 @@ func Safe(raw string) template.HTML {
 | 
			
		||||
	return template.HTML(raw)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SafeJS renders raw as JS
 | 
			
		||||
func SafeJS(raw string) template.JS {
 | 
			
		||||
	return template.JS(raw)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Str2html render Markdown text to HTML
 | 
			
		||||
func Str2html(raw string) template.HTML {
 | 
			
		||||
	return template.HTML(markdown.Sanitize(raw))
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ settings=Настройки
 | 
			
		||||
your_profile=Вашият профил
 | 
			
		||||
your_settings=Вашите настройки
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Активности
 | 
			
		||||
pull_requests=Заявки за сливане
 | 
			
		||||
issues=Задачи
 | 
			
		||||
@@ -553,7 +554,6 @@ settings.wiki_delete_notices_1=- Това ще изтрие и ще деакти
 | 
			
		||||
settings.delete=Изтрий това хранилище
 | 
			
		||||
settings.delete_desc=След като изтриете хранилището, няма връщане назад. Моля, бъдете сигурни.
 | 
			
		||||
settings.delete_notices_1=- Тази операция <strong>НЕ МОЖЕ</strong> да бъде отменена в последствие.
 | 
			
		||||
settings.delete_notices_fork_1=- Всички разклонения ще станат независими след изтриването.
 | 
			
		||||
settings.transfer_owner=Нов притежател
 | 
			
		||||
settings.make_transfer=Прехвърли
 | 
			
		||||
settings.confirm_delete=Потвърди изтриването
 | 
			
		||||
@@ -640,7 +640,6 @@ release.ahead=<strong>%d</strong> ревизии на %s след тази ве
 | 
			
		||||
release.source_code=Изходен код
 | 
			
		||||
release.tag_name=Име на маркера
 | 
			
		||||
release.target=Цел
 | 
			
		||||
release.tag_helper=Изберете съществуващ маркер или създайте нов маркер по време на публикуване.
 | 
			
		||||
release.title=Заглавие
 | 
			
		||||
release.content=Съдържание
 | 
			
		||||
release.write=Редактор
 | 
			
		||||
@@ -689,7 +688,6 @@ settings.delete_account=Изтриване на тази организация
 | 
			
		||||
settings.delete_prompt=Организацията ще бъде изтрита и операцията <strong>НЕ МОЖЕ</strong> да бъде отменена в последствие!
 | 
			
		||||
settings.confirm_delete_account=Потвърди изтриването
 | 
			
		||||
settings.delete_org_title=Изтрий организацията
 | 
			
		||||
settings.hooks_desc=Добави уеб-куки, които ще бъдат използвани от <strong>всички хранилища</strong> в тази организация.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Видимост:
 | 
			
		||||
members.public=Публични
 | 
			
		||||
@@ -718,7 +716,6 @@ teams.update_settings=Запази настройките
 | 
			
		||||
teams.delete_team=Изтриване на този екип
 | 
			
		||||
teams.add_team_member=Добави участник в екипа
 | 
			
		||||
teams.delete_team_title=Изтрий екипа
 | 
			
		||||
teams.delete_team_desc=Тъй като този екип ще бъдат изтрит, участниците му може да загубят достъп до някои хранилища. Желаете ли да продължите?
 | 
			
		||||
teams.read_permission_desc=Този екип предоставя достъп за <strong>четене</strong>: участниците могат да разглеждат и клонират хранилищата на този екип.
 | 
			
		||||
teams.write_permission_desc=Този екип предоставя достъп за <strong>писане</strong>: участниците могат да четат от и да предават към хранилищата на този екип.
 | 
			
		||||
teams.admin_permission_desc=Този екип предоставя <strong>администраторски</strong> достъп: участниците могат да четат от, да предават към и да добавя нови сътрудници към хранилищата на този екип.
 | 
			
		||||
@@ -838,7 +835,6 @@ auths.smtp_auth=SMTP удостоверяване
 | 
			
		||||
auths.smtphost=SMTP сървър
 | 
			
		||||
auths.smtpport=SMTP порт
 | 
			
		||||
auths.allowed_domains=Разрешени домейни
 | 
			
		||||
auths.allowed_domains_helper=Оставете празно за да не се ограничават домейните. За множество домейни използвайте запетая за разделител.
 | 
			
		||||
auths.enable_tls=Включи TLS криптиране
 | 
			
		||||
auths.skip_tls_verify=Пропусни проверка на TLS сертификат
 | 
			
		||||
auths.pam_service_name=Име на PAM услуга
 | 
			
		||||
@@ -864,7 +860,6 @@ config.reverse_auth_user=Потребителско име при обратно
 | 
			
		||||
 | 
			
		||||
config.ssh_config=SSH конфигурация
 | 
			
		||||
config.ssh_enabled=Активен
 | 
			
		||||
config.ssh_start_builtin_server=Стартирай вграден сървър
 | 
			
		||||
config.ssh_domain=Домейн
 | 
			
		||||
config.ssh_port=Порт
 | 
			
		||||
config.ssh_listen_port=Порт за слушане
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ settings=Nastavení
 | 
			
		||||
your_profile=Váš profil
 | 
			
		||||
your_settings=Vaše nastavení
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Aktivity
 | 
			
		||||
pull_requests=Požadavek na natažení
 | 
			
		||||
issues=Úkoly
 | 
			
		||||
@@ -553,7 +554,6 @@ settings.wiki_delete_notices_1=- Toto smaže a vypne Wiki pro %s
 | 
			
		||||
settings.delete=Smazat tento repositář
 | 
			
		||||
settings.delete_desc=Jakmile smažete repositář, není možné se vrátit. Buďte si, prosím, jist.
 | 
			
		||||
settings.delete_notices_1=- Tuto operaci <strong>nelze</strong> zvrátit.
 | 
			
		||||
settings.delete_notices_fork_1=- Po smazání se všechny forky se stanou nezávislé.
 | 
			
		||||
settings.transfer_owner=Nový vlastník
 | 
			
		||||
settings.make_transfer=Předat
 | 
			
		||||
settings.confirm_delete=Potvrdit smazání
 | 
			
		||||
@@ -641,7 +641,6 @@ release.ahead=<strong>%d</strong> revizí do větve %s od tohoto vydání
 | 
			
		||||
release.source_code=Zdrojový kód
 | 
			
		||||
release.tag_name=Název značky
 | 
			
		||||
release.target=Cíl
 | 
			
		||||
release.tag_helper=Vyberte existující značku nebo vytvořte novou značku při vydání.
 | 
			
		||||
release.title=Název
 | 
			
		||||
release.content=Obsah
 | 
			
		||||
release.write=Zapsat
 | 
			
		||||
@@ -690,7 +689,6 @@ settings.delete_account=Smazat tuto organizaci
 | 
			
		||||
settings.delete_prompt=Organizace bude trvale smazána a tato změna <strong>nemůže</strong> být vrácena!
 | 
			
		||||
settings.confirm_delete_account=Potvrdit smazání
 | 
			
		||||
settings.delete_org_title=Smazání organizace
 | 
			
		||||
settings.hooks_desc=Přidejte webového háčky, které budou spouštěny nad <strong>všemi repositáři</strong> této organizace.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Viditelnost členství:
 | 
			
		||||
members.public=Veřejný
 | 
			
		||||
@@ -719,7 +717,6 @@ teams.update_settings=Upravit nastavení
 | 
			
		||||
teams.delete_team=Smazat tento tým
 | 
			
		||||
teams.add_team_member=Přidat člena týmu
 | 
			
		||||
teams.delete_team_title=Smazání týmu
 | 
			
		||||
teams.delete_team_desc=Jelikož bude tento tým smazán, jeho členové mohou ztratit přístup do některých repositářů. Chcete pokračovat?
 | 
			
		||||
teams.read_permission_desc=Členství v tom týmu poskytuje právo <strong>čtení</strong>: členové mohou číst z a vytvářet klony repositářů týmu.
 | 
			
		||||
teams.write_permission_desc=Členství v tom týmu poskytuje právo <strong>zápisu</strong>: členové mohou číst z a nahrávat do repositářů týmu.
 | 
			
		||||
teams.admin_permission_desc=Členství v tom týmu poskytuje právo <strong>správce</strong>: členové mohou číst z, nahrávat do a přidávat spolupracovníky do repositářů týmu.
 | 
			
		||||
@@ -838,7 +835,6 @@ auths.smtp_auth=Typ ověření SMTP
 | 
			
		||||
auths.smtphost=Server SMTP
 | 
			
		||||
auths.smtpport=Port SMTP
 | 
			
		||||
auths.allowed_domains=Povolené domény
 | 
			
		||||
auths.allowed_domains_helper=Zanechte prázdné, pokud nechcete omezit jakékoliv domény. Domény musí být od sebe odděleny čárkou ','.
 | 
			
		||||
auths.enable_tls=Povolit šifrování TLS
 | 
			
		||||
auths.skip_tls_verify=Přeskočit ověření TLS
 | 
			
		||||
auths.pam_service_name=Název služby PAM
 | 
			
		||||
@@ -864,7 +860,6 @@ config.reverse_auth_user=Uživatel obráceného ověření
 | 
			
		||||
 | 
			
		||||
config.ssh_config=Nastavení SSH
 | 
			
		||||
config.ssh_enabled=Zapnutý
 | 
			
		||||
config.ssh_start_builtin_server=Spustit vestavěný server
 | 
			
		||||
config.ssh_domain=Doména
 | 
			
		||||
config.ssh_listen_port=Port pro naslouchání
 | 
			
		||||
config.ssh_root_path=Kořenová cesta
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ dashboard=Übersicht
 | 
			
		||||
explore=Erkunden
 | 
			
		||||
help=Hilfe
 | 
			
		||||
sign_in=Anmelden
 | 
			
		||||
sign_in_with=Einloggen mit
 | 
			
		||||
sign_in_with=Anmelden mit
 | 
			
		||||
sign_out=Abmelden
 | 
			
		||||
sign_up=Registrieren
 | 
			
		||||
link_account=Account verbinden
 | 
			
		||||
@@ -46,6 +46,12 @@ your_profile=Profil
 | 
			
		||||
your_starred=Deine Favoriten
 | 
			
		||||
your_settings=Einstellungen
 | 
			
		||||
 | 
			
		||||
all=Alle
 | 
			
		||||
sources=Quellen
 | 
			
		||||
mirrors=Mirrors
 | 
			
		||||
collaborative=Kollaborativ
 | 
			
		||||
forks=Forks
 | 
			
		||||
 | 
			
		||||
activities=Aktivitäten
 | 
			
		||||
pull_requests=Pull-Requests
 | 
			
		||||
issues=Issues
 | 
			
		||||
@@ -251,6 +257,7 @@ username_been_taken=Benutzername ist bereits vergeben.
 | 
			
		||||
repo_name_been_taken=Dieser Repository-Name wird schon verwendet.
 | 
			
		||||
org_name_been_taken=Name der Organisation wird bereits verwendet.
 | 
			
		||||
team_name_been_taken=Teamname ist bereits vorhanden.
 | 
			
		||||
team_no_units_error=Das Team muss mindestens eine Einheit aktiviert haben.
 | 
			
		||||
email_been_used=E-Mail-Adresse wird bereits verwendet.
 | 
			
		||||
openid_been_used=OpenID-Adresse "%s" wurde bereits verwendet.
 | 
			
		||||
username_password_incorrect=Falscher Benutzername oder Passwort.
 | 
			
		||||
@@ -303,7 +310,7 @@ uid=Uid
 | 
			
		||||
 | 
			
		||||
public_profile=Öffentliches Profil
 | 
			
		||||
profile_desc=Deine E-Mail-Adresse ist öffentlich einsehbar und dient dazu, dir Benachrichtigungen bezüglich deines Kontos sowie Aktivitäten auf der Webseite zukommen zu lassen.
 | 
			
		||||
password_username_disabled=Nutzer die nicht von Gitea verwaltet sind, können ihren Benutzernamen nicht ändern. Bitte kontaktiere den Gitea-Administrator für mehr Details.
 | 
			
		||||
password_username_disabled=Nutzer, die nicht von Gitea verwaltet sind, können ihren Benutzernamen nicht ändern. Bitte kontaktiere den Gitea-Administrator für mehr Details.
 | 
			
		||||
full_name=Vollständiger Name
 | 
			
		||||
website=Webseite
 | 
			
		||||
location=Standort
 | 
			
		||||
@@ -351,7 +358,7 @@ add_openid=OpenID-URI hinzufügen
 | 
			
		||||
add_email_confirmation_sent=Eine neue Bestätigungs-E-Mail wurde an '%s' gesendet. Kontrolliere dein Postfach innerhalb der nächsten %s, um die Verifizierung abzuschließen.
 | 
			
		||||
add_email_success=Dein neue E-Mail-Adresse wurde erfolgreich hinzugefügt.
 | 
			
		||||
add_openid_success=Deine neue OpenID-Adresse wurde erfolgreich hinzugefügt.
 | 
			
		||||
keep_email_private=Private E-Mail-Adressen
 | 
			
		||||
keep_email_private=E-Mail-Adresse nicht veröffentlichen
 | 
			
		||||
keep_email_private_popup=Deine E-Mail-Adresse wird vor anderen Benutzern versteckt, wenn diese Option gesetzt ist.
 | 
			
		||||
openid_desc=Mit deinen OpenID-Adressen kannst du die Authentifizierung an einen provider deiner Wahl delegieren
 | 
			
		||||
 | 
			
		||||
@@ -491,6 +498,7 @@ migrate.lfs_mirror_unsupported=Spiegelung von LFS-Objekten wird nicht unterstüt
 | 
			
		||||
 | 
			
		||||
mirror_from=Mirror von
 | 
			
		||||
forked_from=geforkt von
 | 
			
		||||
fork_from_self=Du kannst kein Repository forken, das dir gehört!
 | 
			
		||||
copy_link=Kopieren
 | 
			
		||||
copy_link_success=Kopiert!
 | 
			
		||||
copy_link_error=Drücke ⌘-C oder Strg-C zum Kopieren
 | 
			
		||||
@@ -510,6 +518,7 @@ push_exist_repo=Bestehendes Repository via Kommandozeile pushen
 | 
			
		||||
bare_message=Diese Repository hat noch keinen Inhalt.
 | 
			
		||||
 | 
			
		||||
code=Code
 | 
			
		||||
code.desc=Code ist der Speicherort des Codes
 | 
			
		||||
branch=Branch
 | 
			
		||||
tree=Struktur
 | 
			
		||||
filter_branch_and_tag=Nach Branch oder Tag filtern
 | 
			
		||||
@@ -580,6 +589,8 @@ commits.message=Nachricht
 | 
			
		||||
commits.date=Datum
 | 
			
		||||
commits.older=Älter
 | 
			
		||||
commits.newer=Neuer
 | 
			
		||||
commits.signed_by=Signiert von
 | 
			
		||||
commits.gpg_key_id=GPG Schlüssel ID
 | 
			
		||||
 | 
			
		||||
ext_issues=Ext Issues
 | 
			
		||||
ext_issues.desc=Externe Issues zu einer externen Website zuweisen
 | 
			
		||||
@@ -689,6 +700,7 @@ issues.attachment.download=`Klicken um "%s" herunterzuladen`
 | 
			
		||||
issues.subscribe=Abonnieren
 | 
			
		||||
issues.unsubscribe=Abbestellen
 | 
			
		||||
 | 
			
		||||
pulls.desc=Pull-Requests helfen dir deinen Code zu überprüfen und neuen Code mit der Codebasis zusammenzuführen
 | 
			
		||||
pulls.new=Neuer Pull-Request
 | 
			
		||||
pulls.compare_changes=Änderungen vergleichen
 | 
			
		||||
pulls.compare_changes_desc=Zwei Branches vergleichen und einen Pull-Request für die Änderungen erstellen.
 | 
			
		||||
@@ -713,6 +725,7 @@ pulls.can_auto_merge_desc=Dieser Pull-Request kann automatisch zusammengeführt
 | 
			
		||||
pulls.cannot_auto_merge_desc=Dieser Pull-Request kann nicht automatisch zusammengeführt werden, da es Konflikte gibt.
 | 
			
		||||
pulls.cannot_auto_merge_helper=Bitte manuell zusammenführen, um die Konflikte zu lösen.
 | 
			
		||||
pulls.merge_pull_request=Pull-Request zusammenführen
 | 
			
		||||
pulls.open_unmerged_pull_exists=`Du kannst diesen Pull-Request nicht wieder öffnen, da bereits ein offener Pull-Request (#%d) aus dem selben Repository mit den gleichen Merge-Informationen existiert und auf das Zusammenführen wartet.`
 | 
			
		||||
 | 
			
		||||
milestones.new=Neuer Meilenstein
 | 
			
		||||
milestones.open_tab=%d offen
 | 
			
		||||
@@ -730,6 +743,7 @@ milestones.clear=Feld leeren
 | 
			
		||||
milestones.invalid_due_date_format=Format des Fälligkeitsdatums ist ungültig. Es muss das Format 'JJJJ-MM-TT' haben.
 | 
			
		||||
milestones.create_success=Meilenstein '%s' wurde erfolgreich erstellt!
 | 
			
		||||
milestones.edit=Meilenstein bearbeiten
 | 
			
		||||
milestones.edit_subheader=Verwende eine aussagekräftige Beschreibung für Meilensteine, um Missverständnisse zu vermeiden.
 | 
			
		||||
milestones.cancel=Abbrechen
 | 
			
		||||
milestones.modify=Meilenstein ändern
 | 
			
		||||
milestones.edit_success=Änderungen des Meilensteins '%s' wurden erfolgreich gespeichert!
 | 
			
		||||
@@ -825,6 +839,7 @@ settings.deletion_success=Das Repository würde gelöscht.
 | 
			
		||||
settings.update_settings_success=Repository Einstellungen wurden aktualisiert.
 | 
			
		||||
settings.transfer_owner=Neuer Besitzer
 | 
			
		||||
settings.make_transfer=Transfer starten
 | 
			
		||||
settings.transfer_succeed=Repository-Eigentum wurde übertragen.
 | 
			
		||||
settings.confirm_delete=Löschen
 | 
			
		||||
settings.add_collaborator=Mitarbeiter hinzufügen
 | 
			
		||||
settings.add_collaborator_success=Neuer Mitarbeiter wurde hinzugefügt.
 | 
			
		||||
@@ -892,6 +907,7 @@ settings.key_been_used=Deploy-Schlüssel wurde verwendet.
 | 
			
		||||
settings.key_name_used=Ein Deploy-Schlüssel mit diesem Namen existiert bereits.
 | 
			
		||||
settings.add_key_success=Der Deploy-Schlüssel '%s' wurde erfolgreich hinzugefügt!
 | 
			
		||||
settings.deploy_key_deletion=Deploy-Schlüssel löschen
 | 
			
		||||
settings.deploy_key_deletion_desc=Durch das Löschen dieses Keys wird ein Zugriff damit nicht mehr möglich sein. Fortfahren?
 | 
			
		||||
settings.deploy_key_deletion_success=Der Deploy-Schlüssel wurde erfolgreich gelöscht!
 | 
			
		||||
settings.branches=Branches
 | 
			
		||||
settings.protected_branch=Branch-Schutz
 | 
			
		||||
@@ -912,6 +928,7 @@ settings.no_protected_branch=Es gibt keine geschützten Branches
 | 
			
		||||
diff.browse_source=Quellcode durchsuchen
 | 
			
		||||
diff.parent=Ursprung
 | 
			
		||||
diff.commit=Commit
 | 
			
		||||
diff.data_not_available=Keine Diff-Daten verfügbar
 | 
			
		||||
diff.show_diff_stats=Diff-Statistik anzeigen
 | 
			
		||||
diff.show_split_view=Geteilte Ansicht
 | 
			
		||||
diff.show_unified_view=Gesamtansicht
 | 
			
		||||
@@ -921,6 +938,7 @@ diff.view_file=Datei anzeigen
 | 
			
		||||
diff.file_suppressed=Datei-Diff unterdrückt, da er zu groß ist
 | 
			
		||||
diff.too_many_files=Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.
 | 
			
		||||
 | 
			
		||||
releases.desc=Unter Releases kannst du die Versionen deines Projekts verwalten
 | 
			
		||||
release.releases=Releases
 | 
			
		||||
release.new_release=Neues Release
 | 
			
		||||
release.draft=Entwurf
 | 
			
		||||
@@ -933,7 +951,7 @@ release.new_subheader=Veröffentliche Versionen um Projektversionen zu verfolgen
 | 
			
		||||
release.edit_subheader=Ein ausführliche Changelog kann helfen, Benutzer verstehen, was sich geändert hat.
 | 
			
		||||
release.tag_name=Tag-Name
 | 
			
		||||
release.target=Ziel
 | 
			
		||||
release.tag_helper=Wähle einen existierenden Tag, oder erstelle einen neuen Tag bei der Veröffentlichung.
 | 
			
		||||
release.tag_helper=Wähle einen existierenden oder erstelle einen neuen Tag.
 | 
			
		||||
release.title=Titel
 | 
			
		||||
release.content=Inhalt
 | 
			
		||||
release.write=Schreiben
 | 
			
		||||
@@ -947,12 +965,17 @@ release.save_draft=Entwurf speichern
 | 
			
		||||
release.edit_release=Release bearbeiten
 | 
			
		||||
release.delete_release=Dieses Release löschen
 | 
			
		||||
release.deletion=Release löschen
 | 
			
		||||
release.deletion_desc=Beim Löschen dieses Releases wird das entsprechende Git-Tag gelöscht. Möchtest du fortfahren?
 | 
			
		||||
release.deletion_success=Das Release wurde gelöscht.
 | 
			
		||||
release.tag_name_already_exist=Ein Release mit diesem Tag existiert bereits.
 | 
			
		||||
release.tag_name_invalid=Tag-Name ist nicht gültig.
 | 
			
		||||
release.downloads=Downloads
 | 
			
		||||
 | 
			
		||||
branch.delete=Branch %s löschen
 | 
			
		||||
branch.delete_desc=Das Löschen eines Branches kann nicht Rückgängig gemacht werden.
 | 
			
		||||
branch.delete_notices_1=- Diese Operation <strong>kann nicht</strong> rückgängig gemacht werden.
 | 
			
		||||
branch.delete_notices_2=- Diese Operation wird permanent alle Inhalte des Branches %s löschen.
 | 
			
		||||
branch.deletion_success=%s wurde gelöscht.
 | 
			
		||||
branch.deletion_failed=Branch %s konnte nicht gelöscht werden.
 | 
			
		||||
branch.delete_branch_has_new_commits=%s kann nicht gelöscht weden, da es ungemergte Commits gibt.
 | 
			
		||||
 | 
			
		||||
@@ -971,7 +994,10 @@ create_new_team=Neues Team erstellen
 | 
			
		||||
org_desc=Beschreibung
 | 
			
		||||
team_name=Teamname
 | 
			
		||||
team_desc=Beschreibung
 | 
			
		||||
team_name_helper=Unter diesem Namen kannst du in Diskussionen auf das Team verweisen.
 | 
			
		||||
team_desc_helper=Wofür ist dieses Team da?
 | 
			
		||||
team_permission_desc=Welche Berechtigungsstufe soll das Team haben?
 | 
			
		||||
team_unit_desc=Auf welche Bestandteile sollte dieses Team Zugriff haben?
 | 
			
		||||
 | 
			
		||||
form.name_reserved=Organisationsname '%s' ist bereits vergeben.
 | 
			
		||||
form.name_pattern_not_allowed=Organisationsnamen der Form '%s' sind nicht erlaubt.
 | 
			
		||||
@@ -983,11 +1009,15 @@ settings.full_name=Vollständiger Name
 | 
			
		||||
settings.website=Webseite
 | 
			
		||||
settings.location=Standort
 | 
			
		||||
settings.update_settings=Einstellungen speichern
 | 
			
		||||
settings.update_setting_success=Organisationseinstellungen wurden aktualisiert.
 | 
			
		||||
settings.change_orgname_prompt=Diese Änderung wird die Links zur Organisation ändern.
 | 
			
		||||
settings.update_avatar_success=Der Organisationsavatar wurde aktualisiert.
 | 
			
		||||
settings.delete=Organisation löschen
 | 
			
		||||
settings.delete_account=Diese Organisation löschen
 | 
			
		||||
settings.delete_prompt=Die Organisation wird dauerhaft gelöscht. Dies kann <strong>NICHT</strong> rückgängig gemacht werden!
 | 
			
		||||
settings.confirm_delete_account=Löschen
 | 
			
		||||
settings.delete_org_title=Organisation löschen
 | 
			
		||||
settings.delete_org_desc=Diese Organisation wird dauerhaft gelöscht. Möchtest du fortfahren?
 | 
			
		||||
settings.hooks_desc=Webhooks hinzufügen, die für <strong>alle</strong> Repositories dieser Organisation ausgelöst werden.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Sichtbarkeit der Mitgliedschaft:
 | 
			
		||||
@@ -1020,6 +1050,7 @@ teams.delete_team=Dieses Team löschen
 | 
			
		||||
teams.add_team_member=Teammitglied hinzufügen
 | 
			
		||||
teams.delete_team_title=Team löschen
 | 
			
		||||
teams.delete_team_desc=Mitglieder dieses Teams verlieren möglicherweise ihren Zugang zu einigen Repositories, wenn dieses Team gelöscht wird. Möchtest du fortfahren?
 | 
			
		||||
teams.delete_team_success=Das Team wurde gelöscht.
 | 
			
		||||
teams.read_permission_desc=Dieses Team hat <strong>Lesezugriff</strong>: Mitglieder können Team-Repositories einsehen und klonen.
 | 
			
		||||
teams.write_permission_desc=Dieses Team hat <strong>Schreibzugriff</strong>: Mitglieder können Team-Repositories einsehen und darauf pushen.
 | 
			
		||||
teams.admin_permission_desc=Dieses Team hat <strong>Adminzugriff</strong>: Mitglieder dieses Teams können pullen, pushen und Mitarbeiter zu Team-Repositories hinzufügen.
 | 
			
		||||
@@ -1049,14 +1080,24 @@ dashboard.statistic_info=Gitea Datenbank hat <b>%d</b> Benutzer, <b>%d</b> Organ
 | 
			
		||||
dashboard.operation_name=Name der Operation
 | 
			
		||||
dashboard.operation_switch=Wechseln
 | 
			
		||||
dashboard.operation_run=Ausführen
 | 
			
		||||
dashboard.clean_unbind_oauth=Nicht verbundene OAuths Verbindungen löschen
 | 
			
		||||
dashboard.clean_unbind_oauth_success=Alle unverbundene OAuth-Verbindungen wurden gelöscht.
 | 
			
		||||
dashboard.delete_inactivate_accounts=Deaktivierte Konten löschen
 | 
			
		||||
dashboard.delete_inactivate_accounts_success=Alle deaktivierten Konten wurden erfolgreich gelöscht.
 | 
			
		||||
dashboard.delete_repo_archives=Alle Repository-Archive löschen
 | 
			
		||||
dashboard.delete_missing_repos=Alle Repositorys löschen, welche ihre zugehörigen Git-Dateien verloren haben
 | 
			
		||||
dashboard.delete_repo_archives_success=Alle Repository-Archive wurden gelöscht.
 | 
			
		||||
dashboard.delete_missing_repos=Alle Repository-Datensätze mit verlorenen gegangenen Git-Dateien löschen
 | 
			
		||||
dashboard.delete_missing_repos_success=Alle Repository-Datensätze mit verlorenen Git-Dateien wurden erfolgreich gelöscht.
 | 
			
		||||
dashboard.git_gc_repos=Garbage Collection auf allen Repositories ausführen
 | 
			
		||||
dashboard.git_gc_repos_success=Alle Repositories haben garbage collection erfolgreich beendet.
 | 
			
		||||
dashboard.resync_all_sshkeys=Datei '.ssh/Authorized_keys' neuschreiben (für Gitea SSH-Schlüssel)
 | 
			
		||||
dashboard.resync_all_sshkeys_success=Alle öffentlichen Keys wurden erfolgreich neu geschrieben.
 | 
			
		||||
dashboard.resync_all_hooks=Synchronisiere pre-receive, update und post-receive Hooks für alle Repositories.
 | 
			
		||||
dashboard.resync_all_hooks_success=Pre-receive, update und post-receive Hooks aller Repositories wurden erfolgreich synchronisiert.
 | 
			
		||||
dashboard.reinit_missing_repos=Alle Git-Repositories für welche Einträge existieren neu einlesen
 | 
			
		||||
dashboard.reinit_missing_repos_success=Alle verlorenen Git-Repositories mit existierenden Einträgen wurden erfolgreich aktualisiert.
 | 
			
		||||
dashboard.sync_external_users=Externe Benutzerdaten synchronisieren
 | 
			
		||||
dashboard.sync_external_users_started=Externe Benutzer Synchronisation gestartet
 | 
			
		||||
dashboard.server_uptime=Server-Uptime
 | 
			
		||||
dashboard.current_goroutine=Aktuelle Goroutines
 | 
			
		||||
dashboard.current_memory_usage=Aktuelle Speichernutzung
 | 
			
		||||
@@ -1087,6 +1128,7 @@ dashboard.total_gc_pause=Gesamte GC-Pause
 | 
			
		||||
dashboard.last_gc_pause=Letzte GC-Pause
 | 
			
		||||
dashboard.gc_times=Anzahl GC
 | 
			
		||||
 | 
			
		||||
users.user_manage_panel=Benutzerverwaltung
 | 
			
		||||
users.new_account=Neues Konto erstellen
 | 
			
		||||
users.name=Name
 | 
			
		||||
users.activated=Aktiviert
 | 
			
		||||
@@ -1096,26 +1138,35 @@ users.created=Erstellt am
 | 
			
		||||
users.last_login=Letzte Anmeldung
 | 
			
		||||
users.never_login=Niemals eingeloggt
 | 
			
		||||
users.send_register_notify=Bei der Registrierung eine Benachrichtigung an den Benutzer senden
 | 
			
		||||
users.new_success=Der Account '%s' wurde erfolgreich erstellt.
 | 
			
		||||
users.edit=Bearbeiten
 | 
			
		||||
users.auth_source=Authentifizierungsquelle
 | 
			
		||||
users.local=Lokal
 | 
			
		||||
users.auth_login_name=Anmeldename zur Authentifizierung
 | 
			
		||||
users.password_helper=Leer lassen um es unverändert zu lassen.
 | 
			
		||||
users.update_profile_success=Kontoprofil wurde erfolgreich aktualisiert.
 | 
			
		||||
users.edit_account=Konto bearbeiten
 | 
			
		||||
users.max_repo_creation=Maximale Anzahl erstellbarer Repositories
 | 
			
		||||
users.max_repo_creation_desc=(Auf -1 setzen, um das globale Standardlimit zu verwenden)
 | 
			
		||||
users.is_activated=Dieses Konto hat die Aktivierung abgeschlossen
 | 
			
		||||
users.prohibit_login=Der Anmeldevorgang für dieses Konto wurde verweigert
 | 
			
		||||
users.prohibit_login=Diesem Konto den Login verweigern
 | 
			
		||||
users.is_admin=Dieses Konto hat Administratorrechte
 | 
			
		||||
users.allow_git_hook=Dieses Konto ist berechtigt, Git-Hooks zu erstellen
 | 
			
		||||
users.allow_import_local=Dieses Konto ist berechtigt, lokale Repositories zu importieren
 | 
			
		||||
users.allow_create_organization=Mit diesem Konto ist das Erstellen von Organisationen erlaubt
 | 
			
		||||
users.update_profile=Konto aktualisieren
 | 
			
		||||
users.delete_account=Dieses Konto löschen
 | 
			
		||||
users.still_own_repo=Dieses Konto besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden.
 | 
			
		||||
users.still_has_org=Dieses Konto ist noch Mitglied von mindestens einer Organisation. Du musst alle Organisationen erst verlassen oder löschen.
 | 
			
		||||
users.deletion_success=Das Konto wurde erfolgreich gelöscht.
 | 
			
		||||
 | 
			
		||||
orgs.org_manage_panel=Organisationsverwaltung
 | 
			
		||||
orgs.name=Name
 | 
			
		||||
orgs.teams=Teams
 | 
			
		||||
orgs.members=Mitglieder
 | 
			
		||||
orgs.new_orga=Organisation erstellen
 | 
			
		||||
 | 
			
		||||
repos.repo_manage_panel=Repositoryverwaltung
 | 
			
		||||
repos.owner=Besitzer
 | 
			
		||||
repos.name=Name
 | 
			
		||||
repos.private=Privat
 | 
			
		||||
@@ -1124,10 +1175,12 @@ repos.stars=Favoriten
 | 
			
		||||
repos.issues=Issues
 | 
			
		||||
repos.size=Größe
 | 
			
		||||
 | 
			
		||||
auths.auth_manage_panel=Authentifizierung
 | 
			
		||||
auths.new=Neue Quelle hinzufügen
 | 
			
		||||
auths.name=Name
 | 
			
		||||
auths.type=Typ
 | 
			
		||||
auths.enabled=Aktiviert
 | 
			
		||||
auths.syncenabled=Benutzersynchronisation aktivieren
 | 
			
		||||
auths.updated=Aktualisiert
 | 
			
		||||
auths.auth_type=Authentifizierungstyp
 | 
			
		||||
auths.auth_name=Authentifizierungsname
 | 
			
		||||
@@ -1137,6 +1190,7 @@ auths.host=Host
 | 
			
		||||
auths.port=Port
 | 
			
		||||
auths.bind_dn=DN binden
 | 
			
		||||
auths.bind_password=Passwort binden
 | 
			
		||||
auths.bind_password_helper=Achtung: Das Passwort wird im Klartext gespeichert. Benutze kein Konto mit hoher Berechtigungsstufe.
 | 
			
		||||
auths.user_base=Basis für Benutzersuche
 | 
			
		||||
auths.user_dn=Benutzer DN
 | 
			
		||||
auths.attribute_username=Attribut Benutzername
 | 
			
		||||
@@ -1152,16 +1206,40 @@ auths.smtp_auth=SMTP-Authentifizierung
 | 
			
		||||
auths.smtphost=SMTP-Host
 | 
			
		||||
auths.smtpport=SMTP-Port
 | 
			
		||||
auths.allowed_domains=Erlaubte Domains
 | 
			
		||||
auths.allowed_domains_helper=Leer lassen für keine Einschränkungen. Mehrere Domains können durch Komma "," getrennt werden.
 | 
			
		||||
auths.allowed_domains_helper=Leer lassen um alle Domains zu erlauben. Mehrere Domains können durch Komma "," getrennt werden.
 | 
			
		||||
auths.enable_tls=TLS-Verschlüsselung aktivieren
 | 
			
		||||
auths.skip_tls_verify=TLS-Prüfung überspringen
 | 
			
		||||
auths.pam_service_name=PAM Dienstname
 | 
			
		||||
auths.oauth2_provider=OAuth2 Anbieter
 | 
			
		||||
auths.oauth2_clientID=Client-ID (Schlüssel)
 | 
			
		||||
auths.oauth2_clientSecret=Client-Secret
 | 
			
		||||
auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery URL
 | 
			
		||||
auths.oauth2_use_custom_url=Benutzerdefinierte URLs anstelle von Standard-URLs verwenden
 | 
			
		||||
auths.oauth2_tokenURL=Token-URL
 | 
			
		||||
auths.oauth2_authURL=Authorisier-URL
 | 
			
		||||
auths.oauth2_profileURL=Profil-URL
 | 
			
		||||
auths.oauth2_emailURL=E-Mail-URL
 | 
			
		||||
auths.enable_auto_register=Automatische Registrierung aktivieren
 | 
			
		||||
auths.tips=Tipps
 | 
			
		||||
auths.tips.oauth2.general=OAuth2 Authentifizierung
 | 
			
		||||
auths.tips.oauth2.general.tip=Beim Registrieren einer neuen OAuth2 Authentifizierung sollte die callback/weiterleitungs-URL <host>/user/oauth2/<Authentication Name>/callback sein
 | 
			
		||||
auths.tip.oauth2_provider=OAuth2 Anbieter
 | 
			
		||||
auths.tip.bitbucket=Registriere einen neuen OAuth consumer unter https://bitbucket.org/account/user/<your username>/oauth-consumers/new und füge die Berechtigung "Account"-"Read" hinzu
 | 
			
		||||
auths.tip.dropbox=Erstelle unter https://www.dropbox.com/developers/apps eine neue App
 | 
			
		||||
auths.tip.facebook=Registriere unter https://developers.facebook.com/apps eine neue App und füge das Produkt "Facebook Login" hinzu
 | 
			
		||||
auths.tip.github=Registriere unter https://github.com/settings/applications/new eine neue OAuth Anwendung
 | 
			
		||||
auths.tip.gitlab=Registriere unter https://gitlab.com/profile/applications eine neue Anwendung
 | 
			
		||||
auths.tip.google_plus=Du erhälst die OAuth2 Client Zugangsdaten in der Google API Console (https://console.developers.google.com)
 | 
			
		||||
auths.tip.openid_connect=Benutze die OpenID Connect Discovery URL (<server>/.well-known/openid-configuration), um den Endpunkt zu spezifizieren
 | 
			
		||||
auths.tip.twitter=Gehe auf https://dev.twitter.com/apps, erstelle eine Anwendung und stelle sicher, dass die Option “Allow this application to be used to Sign in with Twitter” aktiviert ist.
 | 
			
		||||
auths.edit=Authentifizierungseinstellungen bearbeiten
 | 
			
		||||
auths.activated=Diese Authentifizierung ist aktiv
 | 
			
		||||
auths.new_success=Die Authentifizierung "%s" wurde hinzugefügt.
 | 
			
		||||
auths.update_success=Die Authentifizierungseinstellungen wurden aktualisiert.
 | 
			
		||||
auths.update=Authentifizierungseinstellungen aktualisieren
 | 
			
		||||
auths.delete=Diese Authentifizierungsquelle löschen
 | 
			
		||||
auths.delete_auth_title=Authentifizierungsquelle löschen
 | 
			
		||||
auths.delete_auth_desc=Diese Authentifizierung wird gelöscht. Möchtest du fortfahren?
 | 
			
		||||
auths.still_in_used=Diese Authentifizierung wird noch von einigen Benutzern verwendet. Bitte lösche diese Benutzer oder ändere deren Anmeldetyp.
 | 
			
		||||
auths.deletion_success=Authentifizierung wurde erfolgreich gelöscht!
 | 
			
		||||
auths.login_source_exist=Login-Quelle '%s' ist bereits vorhanden.
 | 
			
		||||
@@ -1217,12 +1295,15 @@ config.mail_notify=E-Mail-Benachrichtigung
 | 
			
		||||
config.disable_key_size_check=Prüfung der Mindestschlüssellänge deaktiveren
 | 
			
		||||
config.enable_captcha=Captcha aktivieren
 | 
			
		||||
config.active_code_lives=Aktivierungscode Lebensdauer
 | 
			
		||||
config.reset_password_code_lives=Ablaufdatum des Passworts zurücksetzen
 | 
			
		||||
config.default_keep_email_private=Standard-Wert für "Private E-Mail-Adressen
 | 
			
		||||
config.default_allow_create_organization=Standardmäßige Erlaubnis eine Organisation zu erstellen
 | 
			
		||||
config.no_reply_address=No-Reply Adresse
 | 
			
		||||
 | 
			
		||||
config.webhook_config=Webhook-Konfiguration
 | 
			
		||||
config.queue_length=Warteschlangenlänge
 | 
			
		||||
config.deliver_timeout=Zeitlimit für Zustellung
 | 
			
		||||
config.skip_tls_verify=Überspringe die Überprüfung des TLS-Zertifikats
 | 
			
		||||
 | 
			
		||||
config.mailer_config=Mailer-Konfiguration
 | 
			
		||||
config.mailer_enabled=Aktiviert
 | 
			
		||||
@@ -1231,6 +1312,7 @@ config.mailer_name=Name
 | 
			
		||||
config.mailer_host=Host
 | 
			
		||||
config.mailer_user=Benutzer
 | 
			
		||||
config.send_test_mail=Test-E-Mail senden
 | 
			
		||||
config.test_mail_failed=Das Senden der Test-E-Mail an '%s' ist fehlgeschlagen: %v
 | 
			
		||||
config.test_mail_sent=Test-E-Mail wurde an '%s' gesendet.
 | 
			
		||||
 | 
			
		||||
config.oauth_config=OAuth-Konfiguration
 | 
			
		||||
@@ -1283,6 +1365,7 @@ monitor.start=Startzeit
 | 
			
		||||
monitor.execute_time=Ausführungszeit
 | 
			
		||||
 | 
			
		||||
notices.system_notice_list=Systemmitteilungen
 | 
			
		||||
notices.view_detail_header=Meldungsdetails ansehen
 | 
			
		||||
notices.actions=Aktionen
 | 
			
		||||
notices.select_all=Alles auswählen
 | 
			
		||||
notices.deselect_all=Alles abwählen
 | 
			
		||||
@@ -1293,6 +1376,7 @@ notices.type=Typ
 | 
			
		||||
notices.type_1=Repository
 | 
			
		||||
notices.desc=Beschreibung
 | 
			
		||||
notices.op=Aktion
 | 
			
		||||
notices.delete_success=Diese Systemmeldung wurde gelöscht.
 | 
			
		||||
 | 
			
		||||
[action]
 | 
			
		||||
create_repo=hat das Repository <a href="%s">%s</a> erstellt
 | 
			
		||||
@@ -1308,11 +1392,13 @@ comment_issue=`hat Issue <a href="%s/issues/%s">%s#%[2]s</a> kommentiert`
 | 
			
		||||
merge_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> zuammengeführt`
 | 
			
		||||
transfer_repo=hat Repository <code>%s</code> transferiert an <a href="%s">%s</a>
 | 
			
		||||
push_tag=hat Tag <a href="%s/src/%s">%[2]s</a> auf <a href="%[1]s">%[3]s</a> gepusht
 | 
			
		||||
compare_commits=Vergleiche %d Commits
 | 
			
		||||
 | 
			
		||||
[tool]
 | 
			
		||||
ago=vor %s
 | 
			
		||||
from_now=in %s
 | 
			
		||||
now=jetzt
 | 
			
		||||
future=Zukunft
 | 
			
		||||
1s=1 Sekunde
 | 
			
		||||
1m=1 Minute
 | 
			
		||||
1h=1 Stunde
 | 
			
		||||
@@ -1331,6 +1417,7 @@ raw_seconds=Sekunden
 | 
			
		||||
raw_minutes=Minuten
 | 
			
		||||
 | 
			
		||||
[dropzone]
 | 
			
		||||
default_message=Zum Hochladen hier klicken oder Datei hier ablegen.
 | 
			
		||||
invalid_input_type=Dateien dieses Dateityps können nicht hochgeladen werden.
 | 
			
		||||
file_too_big=Dateigröße ({{filesize}} MB) überschreitet die Maximalgröße ({{maxFilesize}} MB).
 | 
			
		||||
remove_file=Datei entfernen
 | 
			
		||||
@@ -1338,7 +1425,7 @@ remove_file=Datei entfernen
 | 
			
		||||
[notification]
 | 
			
		||||
notifications=Nachrichten
 | 
			
		||||
unread=Ungelesen
 | 
			
		||||
read=Lesen
 | 
			
		||||
read=Gelesen
 | 
			
		||||
no_unread=Du hast momentan keine ungelesenen Benachrichtigungen.
 | 
			
		||||
no_read=Du hast momentan keine gelesenen Benachrichtigungen.
 | 
			
		||||
pin=Benachrichtigung pinnen
 | 
			
		||||
@@ -1348,8 +1435,12 @@ mark_as_unread=Als ungelesen markieren
 | 
			
		||||
[gpg]
 | 
			
		||||
error.extract_sign=Die Signatur konnte nicht extrahiert werden
 | 
			
		||||
error.generate_hash=Es konnte kein Hash vom Commit generiert werden
 | 
			
		||||
error.no_committer_account=Es ist kein Account mit dieser Commiter-Email verbunden
 | 
			
		||||
error.no_gpg_keys_found=Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
 | 
			
		||||
error.not_signed_commit=Kein signierter Commit
 | 
			
		||||
error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Keys des Commiter-Accounts
 | 
			
		||||
 | 
			
		||||
[units]
 | 
			
		||||
error.no_unit_allowed_repo=Es konnte kein Bestandteil in dieser Repository gefunden werden auf den der Zugriff erlaubt ist
 | 
			
		||||
error.unit_not_allowed=Du bist nicht berechtigt diesen Repository-Bestandteil zu benutzen
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -378,7 +378,7 @@ add_new_gpg_key = Add GPG Key
 | 
			
		||||
ssh_key_been_used = This public key has already been used.
 | 
			
		||||
ssh_key_name_used = A public key with same name already exists.
 | 
			
		||||
gpg_key_id_used = A public GPG key with same id already exists.
 | 
			
		||||
gpg_key_email_not_found = The email attached to the GPG key couldn't be found or is not confirmed yet: %s
 | 
			
		||||
gpg_no_key_email_found = None of the emails attached to the GPG key could be found.
 | 
			
		||||
subkeys = Subkeys
 | 
			
		||||
key_id = Key ID
 | 
			
		||||
key_name = Key Name
 | 
			
		||||
 
 | 
			
		||||
@@ -41,6 +41,7 @@ your_profile=Tu perfil
 | 
			
		||||
your_starred=Tus favoritos
 | 
			
		||||
your_settings=Tu configuración
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Actividad
 | 
			
		||||
issues=Incidencias
 | 
			
		||||
 | 
			
		||||
@@ -580,7 +581,6 @@ settings.wiki_delete_notices_1=- Esto eliminará y deshabilitará la wiki para %
 | 
			
		||||
settings.delete=Eliminar este repositorio
 | 
			
		||||
settings.delete_desc=Una vez has eliminado un repositorio, no hay vuelta atrás. Por favor, asegúrate de que es lo que quieres.
 | 
			
		||||
settings.delete_notices_1=- Esta operación <strong>NO PUEDE</strong> revertirse.
 | 
			
		||||
settings.delete_notices_fork_1=- Todos los forks se convertirán en independientes tras el borrado.
 | 
			
		||||
settings.transfer_owner=Nuevo Propietario
 | 
			
		||||
settings.make_transfer=Transferir
 | 
			
		||||
settings.confirm_delete=Confirmar eliminación
 | 
			
		||||
@@ -663,7 +663,6 @@ release.ahead=<strong>%d</strong> commits en %s desde esta release
 | 
			
		||||
release.source_code=Código Fuente
 | 
			
		||||
release.tag_name=Nombre de la etiqueta
 | 
			
		||||
release.target=Destino
 | 
			
		||||
release.tag_helper=Escoge una etiqueta o crea una nueva al publicar.
 | 
			
		||||
release.title=Título
 | 
			
		||||
release.content=Contenido
 | 
			
		||||
release.write=Escribir
 | 
			
		||||
@@ -714,7 +713,6 @@ settings.delete_account=Eliminar esta organización
 | 
			
		||||
settings.delete_prompt=Esta operación eliminará esta organización de manera permanente, y ¡<strong>NO PUEDE</strong> deshacerse!
 | 
			
		||||
settings.confirm_delete_account=Confirmar eliminación
 | 
			
		||||
settings.delete_org_title=Eliminación de la organización
 | 
			
		||||
settings.hooks_desc=Añadir webhooks que serán ejecutados para <strong>todos los repositorios</strong> de esta organización.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Visibilidad de Membresía:
 | 
			
		||||
members.public=Público
 | 
			
		||||
@@ -743,7 +741,6 @@ teams.update_settings=Actualizar configuración
 | 
			
		||||
teams.delete_team=Eliminar este equipo
 | 
			
		||||
teams.add_team_member=Añadir miembro al equipo
 | 
			
		||||
teams.delete_team_title=Eliminar equipo
 | 
			
		||||
teams.delete_team_desc=Este equipo va a ser eliminado, ¿seguro que quieres continuar? Los miembros de este equipo pueden perder acceso a algunos repositorios.
 | 
			
		||||
teams.read_permission_desc=Este equipo tiene permisos de <strong>Lectura</strong>: sus miembros pueden ver y clonar los repositorios del equipo.
 | 
			
		||||
teams.write_permission_desc=Este equipo tiene permisos de <strong>Escritura</strong>: sus miembros pueden leer y hacer push a los repositorios del equipo.
 | 
			
		||||
teams.admin_permission_desc=Este equipo tiene permisos de <strong>Administración</strong>: sus miembros pueden leer, hacer push y añadir colaboradores a los repositorios del equipo.
 | 
			
		||||
@@ -862,7 +859,6 @@ auths.admin_filter=Filtro de aministrador
 | 
			
		||||
auths.smtp_auth=Tipo de autenticación SMTP
 | 
			
		||||
auths.smtpport=Puerto SMTP
 | 
			
		||||
auths.allowed_domains=Dominios Permitidos
 | 
			
		||||
auths.allowed_domains_helper=Deje el campo vacío si no desea restringir ningún dominio. Para restringir más de uno, separe los dominios con una coma ','.
 | 
			
		||||
auths.enable_tls=Habilitar cifrado TLS
 | 
			
		||||
auths.skip_tls_verify=Omitir la verificación TLS
 | 
			
		||||
auths.pam_service_name=Nombre del Servicio PAM
 | 
			
		||||
@@ -889,7 +885,6 @@ config.reverse_auth_user=Autenticación Inversa de Usuario
 | 
			
		||||
 | 
			
		||||
config.ssh_config=Configuración SSH
 | 
			
		||||
config.ssh_enabled=Habilitado
 | 
			
		||||
config.ssh_start_builtin_server=Iniciar servidor integrado
 | 
			
		||||
config.ssh_domain=Dominio
 | 
			
		||||
config.ssh_port=Puerto
 | 
			
		||||
config.ssh_listen_port=Puerto de escucha
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,7 @@ settings=Asetukset
 | 
			
		||||
your_profile=Profiilisi
 | 
			
		||||
your_settings=Asetuksesi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Toimet
 | 
			
		||||
pull_requests=Pull requestit
 | 
			
		||||
issues=Ongelmat
 | 
			
		||||
@@ -610,7 +611,6 @@ release.ahead=<strong>%d</strong> committia kohteeseen %s version jälkeen
 | 
			
		||||
release.source_code=Lähdekoodi
 | 
			
		||||
release.tag_name=Taginimi
 | 
			
		||||
release.target=Kohde
 | 
			
		||||
release.tag_helper=Valitse olemassaoleva tagi, tai luo uusi tagi julkaistaessa.
 | 
			
		||||
release.title=Otsikko
 | 
			
		||||
release.content=Sisältö
 | 
			
		||||
release.write=Kirjoita
 | 
			
		||||
@@ -660,7 +660,6 @@ settings.delete_account=Poista tämä organisaatio
 | 
			
		||||
settings.delete_prompt=Organisaatio poistetaan pysyvästi, ja tätä <strong>EI VOI</strong> peruuttaa myöhemmin!
 | 
			
		||||
settings.confirm_delete_account=Vahvista poisto
 | 
			
		||||
settings.delete_org_title=Organisaation poistaminen
 | 
			
		||||
settings.hooks_desc=Lisää webkoukkuja jotka laukeavat <strong>kaikissa repoissa</strong> tässä organisaatiossa.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Jäsenyyden näkyvyys:
 | 
			
		||||
members.public=Julkinen
 | 
			
		||||
@@ -689,7 +688,6 @@ teams.update_settings=Päivitä asetukset
 | 
			
		||||
teams.delete_team=Poista tämä ryhmä
 | 
			
		||||
teams.add_team_member=Lisää tiimin jäsen
 | 
			
		||||
teams.delete_team_title=Ryhmän poistaminen
 | 
			
		||||
teams.delete_team_desc=Kun tämä tiimi poistetaan, tiimin jäsenet voivat menettää pääsyn joihinkin repoihin. Haluatko jatkaa?
 | 
			
		||||
teams.read_permission_desc=Tämä tiimi myöntää <strong>lukuoikeuden</strong>: jäsenet voivat katsella ja kloonata tiimin repot.
 | 
			
		||||
teams.write_permission_desc=Tämä tiimi myöntää <strong>kirjoitusoikeuden</strong>: jäsenet voivat lukea ja pushata tiimin repoihin.
 | 
			
		||||
teams.admin_permission_desc=Tämä tiimi myöntää <strong>ylläpito-oikeuden</strong>: jäsenet voivat lukea, pushata, ja lisätä yhteistyökumppaneita tiimin repoihin.
 | 
			
		||||
@@ -811,7 +809,6 @@ auths.smtp_auth=SMTP todennustyyppi
 | 
			
		||||
auths.smtphost=SMTP isäntä
 | 
			
		||||
auths.smtpport=SMTP portti
 | 
			
		||||
auths.allowed_domains=Sallitut verkkotunnukset
 | 
			
		||||
auths.allowed_domains_helper=Jätä tyhjäksi jos et rajoita yhtään verkkotunnusta. Useat verkkotunnukset erotetaan pilkulla ','.
 | 
			
		||||
auths.enable_tls=Ota käyttöön TLS-salaus
 | 
			
		||||
auths.skip_tls_verify=Ohita TLS tarkistaminen
 | 
			
		||||
auths.pam_service_name=PAM palvelun nimi
 | 
			
		||||
@@ -837,7 +834,6 @@ config.reverse_auth_user=Käänteinen todennus käyttäjä
 | 
			
		||||
 | 
			
		||||
config.ssh_config=SSH asetukset
 | 
			
		||||
config.ssh_enabled=Käytössä
 | 
			
		||||
config.ssh_start_builtin_server=Käynnistä sisäänrakennettu palvelin
 | 
			
		||||
config.ssh_domain=Verkkotunnus
 | 
			
		||||
config.ssh_port=Portti
 | 
			
		||||
config.ssh_listen_port=Kuuntele porttia
 | 
			
		||||
 
 | 
			
		||||
@@ -45,6 +45,7 @@ your_profile=Votre profil
 | 
			
		||||
your_starred=Vos favoris
 | 
			
		||||
your_settings=Vos paramètres
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Activités
 | 
			
		||||
pull_requests=Demandes d'ajout
 | 
			
		||||
issues=Tickets
 | 
			
		||||
@@ -269,7 +270,7 @@ form.name_pattern_not_allowed=Motif '%s' interdit pour les noms d'utilisateur.
 | 
			
		||||
 | 
			
		||||
[settings]
 | 
			
		||||
profile=Profil
 | 
			
		||||
password=Mot de Passe
 | 
			
		||||
password=Mot de passe
 | 
			
		||||
avatar=Avatar
 | 
			
		||||
ssh_gpg_keys=Clés SSH / GPG
 | 
			
		||||
social=Réseaux Sociaux
 | 
			
		||||
@@ -439,7 +440,7 @@ branches=Branches
 | 
			
		||||
tags=Tags
 | 
			
		||||
issues=Tickets
 | 
			
		||||
pulls=Demandes d'ajout
 | 
			
		||||
labels=Etiquettes
 | 
			
		||||
labels=Étiquettes
 | 
			
		||||
milestones=Jalons
 | 
			
		||||
commits=Révisions
 | 
			
		||||
releases=Publications
 | 
			
		||||
@@ -450,7 +451,7 @@ file_permalink=Lien permanent
 | 
			
		||||
file_too_large=Ce fichier est trop gros pour être afficher
 | 
			
		||||
video_not_supported_in_browser=Votre navigateur ne supporte pas le tag video HTML5.
 | 
			
		||||
stored_lfs=Stocké avec Git LFS
 | 
			
		||||
commit_graph=Graphique des Commits
 | 
			
		||||
commit_graph=Graphique des révisions
 | 
			
		||||
 | 
			
		||||
editor.new_file=Nouveau fichier
 | 
			
		||||
editor.upload_file=Téléverser un fichier
 | 
			
		||||
@@ -501,7 +502,7 @@ commits.newer=Récemment
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
issues.new=Nouveau ticket
 | 
			
		||||
issues.new.labels=Etiquettes
 | 
			
		||||
issues.new.labels=Étiquettes
 | 
			
		||||
issues.new.no_label=Pas d'étiquette
 | 
			
		||||
issues.new.clear_labels=Effacer les étiquettes
 | 
			
		||||
issues.new.milestone=Jalon
 | 
			
		||||
@@ -517,8 +518,9 @@ issues.new_label=Nouvelle étiquette
 | 
			
		||||
issues.new_label_placeholder=Nom de l'étiquette...
 | 
			
		||||
issues.create_label=Créer une étiquette
 | 
			
		||||
issues.label_templates.title=Charger un ensemble prédéfini d'étiquettes
 | 
			
		||||
issues.label_templates.info=Il n'y a pas encore d'étiquettes. Vous pouvez cliquer sur le bouton "Nouvelle étiquette" pour en créer une ou en utiliser une prédéfinies ci-dessous.
 | 
			
		||||
issues.label_templates.helper=Sélectionnez un ensemble d'étiquettes
 | 
			
		||||
issues.label_templates.use=Utilisez ce jeu d'étiquettes
 | 
			
		||||
issues.label_templates.use=Utiliser ce jeu d'étiquettes
 | 
			
		||||
issues.label_templates.fail_to_load_file=Impossible de charger le fichier de modèle étiquette '%s' : %v
 | 
			
		||||
issues.add_label_at=`ajouté le <div class="ui label" style="color: %s" ; background-color: %s">%s</div> label %s`
 | 
			
		||||
issues.remove_label_at=`supprimé le <div class="ui label" style="color: %s" ; background-color: %s">%s</div> label %s`
 | 
			
		||||
@@ -533,7 +535,7 @@ issues.delete_branch_at=`a supprimé la branche <b>%s</b> %s`
 | 
			
		||||
issues.open_tab=%d Ouvert
 | 
			
		||||
issues.close_tab=%d Fermé
 | 
			
		||||
issues.filter_label=Étiquette
 | 
			
		||||
issues.filter_label_no_select=Aucun étiquette sélectionnée
 | 
			
		||||
issues.filter_label_no_select=Aucune étiquette sélectionnée
 | 
			
		||||
issues.filter_milestone=Jalon
 | 
			
		||||
issues.filter_milestone_no_select=Aucun jalon sélectionné
 | 
			
		||||
issues.filter_assignee=Assigné
 | 
			
		||||
@@ -581,14 +583,15 @@ issues.sign_in_require_desc=<a href="%s">Connectez-vous</a> pour rejoindre cette
 | 
			
		||||
issues.edit=Modifier
 | 
			
		||||
issues.cancel=Annuler
 | 
			
		||||
issues.save=Enregistrer
 | 
			
		||||
issues.label_title=Nom du Label
 | 
			
		||||
issues.label_color=Couleur du Label
 | 
			
		||||
issues.label_title=Nom de l'étiquette
 | 
			
		||||
issues.label_color=Couleur de l'étiquette
 | 
			
		||||
issues.label_count=%d étiquettes
 | 
			
		||||
issues.label_open_issues=%d tickets ouverts
 | 
			
		||||
issues.label_edit=Éditer
 | 
			
		||||
issues.label_delete=Supprimer
 | 
			
		||||
issues.label_modify=Modification du Label
 | 
			
		||||
issues.label_deletion=Suppression du Label
 | 
			
		||||
issues.label_modify=Modification de l'étiquette
 | 
			
		||||
issues.label_deletion=Suppression de l'étiquette
 | 
			
		||||
issues.label_deletion_success=L'étiquette a été supprimé avec succès !
 | 
			
		||||
issues.label.filter_sort.alphabetically=Par ordre alphabétique
 | 
			
		||||
issues.label.filter_sort.reverse_alphabetically=Par ordre alphabétique inversé
 | 
			
		||||
issues.label.filter_sort.by_size=Taille
 | 
			
		||||
@@ -623,7 +626,7 @@ pulls.cannot_auto_merge_desc=Cette demande d'ajout ne peut pas être fusionnée
 | 
			
		||||
pulls.cannot_auto_merge_helper=Fusionner manuellement afin de résoudre les conflits.
 | 
			
		||||
pulls.merge_pull_request=Fusionner la demande d'ajout
 | 
			
		||||
 | 
			
		||||
milestones.new=Nouveau Jalon
 | 
			
		||||
milestones.new=Nouveau jalon
 | 
			
		||||
milestones.open_tab=%d Ouvert
 | 
			
		||||
milestones.close_tab=%d Fermé
 | 
			
		||||
milestones.closed=%s fermé
 | 
			
		||||
@@ -712,9 +715,8 @@ settings.wiki_delete=Effacer les données du Wiki
 | 
			
		||||
settings.wiki_delete_desc=Une fois que vous effacez les données du wiki, on ne peut revenir en arrière. Soyez-en sûr.
 | 
			
		||||
settings.wiki_delete_notices_1=- Cela va supprimer et désactiver le wiki pour %s
 | 
			
		||||
settings.delete=Supprimer ce dépôt
 | 
			
		||||
settings.delete_desc=Attention, cette action est action irréversible. Soyez sûr de vous.
 | 
			
		||||
settings.delete_desc=La suppression d'un dépôt est irréversible. Soyez sûr de vous.
 | 
			
		||||
settings.delete_notices_1=- Cette opération <strong>ne peut pas </strong> être annulée.
 | 
			
		||||
settings.delete_notices_fork_1=- Toutes les bifurcations deviendront indépendantes après l’effacement.
 | 
			
		||||
settings.transfer_owner=Nouveau propriétaire
 | 
			
		||||
settings.make_transfer=Transférer
 | 
			
		||||
settings.confirm_delete=Confirmer la suppression
 | 
			
		||||
@@ -811,7 +813,6 @@ release.ahead=<strong>%d</strong> révisions sur %s depuis cette publication
 | 
			
		||||
release.source_code=Code source
 | 
			
		||||
release.tag_name=Nom du tag
 | 
			
		||||
release.target=Cible
 | 
			
		||||
release.tag_helper=Choisissez un tag existant ou créez-en un nouveau lors de la publication.
 | 
			
		||||
release.title=Titre
 | 
			
		||||
release.content=Contenu
 | 
			
		||||
release.write=Écrire
 | 
			
		||||
@@ -865,7 +866,6 @@ settings.delete_account=Supprimer cette organisation
 | 
			
		||||
settings.delete_prompt=Cela supprimera cette organisation définitivement. Cette opération est <strong>IRRÉVERSIBLE</strong> !
 | 
			
		||||
settings.confirm_delete_account=Confirmez la suppression
 | 
			
		||||
settings.delete_org_title=Suppression d'organisation
 | 
			
		||||
settings.hooks_desc=Ajoute des webhooks qui seront activés pour <strong>tous les dépôts</strong> de cette organisation.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Visibilité des membres:
 | 
			
		||||
members.public=Public
 | 
			
		||||
@@ -882,10 +882,10 @@ members.invite_now=Envoyer une invitation
 | 
			
		||||
 | 
			
		||||
teams.join=Rejoindre
 | 
			
		||||
teams.leave=Quitter
 | 
			
		||||
teams.read_access=Accès en Lecture
 | 
			
		||||
teams.read_access=Accès en lecture
 | 
			
		||||
teams.read_access_helper=Cette équipe aura la possibilité de voir et cloner ses dépôts.
 | 
			
		||||
teams.write_access=Accès en Écriture
 | 
			
		||||
teams.admin_access=Accès Administrateur
 | 
			
		||||
teams.write_access=Accès en écriture
 | 
			
		||||
teams.admin_access=Accès administrateur
 | 
			
		||||
teams.no_desc=Aucune description
 | 
			
		||||
teams.settings=Paramètres
 | 
			
		||||
teams.owners_permission_desc=Les propriétaires possèdent <strong>les droits d'administrateur</strong> et disposent d'un accès complet à <strong>tous les dépôts</strong> de l'organisation.
 | 
			
		||||
@@ -894,7 +894,6 @@ teams.update_settings=Valider
 | 
			
		||||
teams.delete_team=Supprimer cette Équipe
 | 
			
		||||
teams.add_team_member=Ajouter un Membre
 | 
			
		||||
teams.delete_team_title=Suppression de l'équipe
 | 
			
		||||
teams.delete_team_desc=Cette équipe sera supprimée. Les membres pourraient perdre leurs accès à certains dépôts.
 | 
			
		||||
teams.delete_team_success=L’équipe a été supprimé.
 | 
			
		||||
teams.read_permission_desc=Cette équipe permet l'accès en <strong>lecture</strong> : les membres peuvent voir et dupliquer ses dépôts.
 | 
			
		||||
teams.write_permission_desc=Cette équipe permet l'accès en <strong>écriture</strong> : les membres peuvent participer à ses dépôts.
 | 
			
		||||
@@ -979,7 +978,7 @@ users.edit_account=Modifier le Compte
 | 
			
		||||
users.max_repo_creation=Nombre maximum de dépôts créés
 | 
			
		||||
users.max_repo_creation_desc=(Mettre à -1 pour utiliser la limite globale par défaut)
 | 
			
		||||
users.is_admin=Ce compte possède un niveau d'accès administrateur
 | 
			
		||||
users.allow_import_local=Ce compte dispose des permissions nécessaire à l'import des dépôts locaux
 | 
			
		||||
users.allow_import_local=Ce compte a l'autorisation d'importer des dépôts locaux
 | 
			
		||||
users.allow_create_organization=Ce compte a l'autorisation de créer des organisations
 | 
			
		||||
users.update_profile=Mettre à jour le profil
 | 
			
		||||
users.delete_account=Supprimer ce Compte
 | 
			
		||||
@@ -1024,7 +1023,6 @@ auths.smtp_auth=Type d'authentification SMTP
 | 
			
		||||
auths.smtphost=Hôte SMTP
 | 
			
		||||
auths.smtpport=Port SMTP
 | 
			
		||||
auths.allowed_domains=Domaines autorisés
 | 
			
		||||
auths.allowed_domains_helper=Laissez-le vide pour ne pas restreindre de domaines. Plusieurs domaines doivent être séparés par une virgule «, ».
 | 
			
		||||
auths.enable_tls=Activer le Chiffrement TLS
 | 
			
		||||
auths.skip_tls_verify=Ne pas vérifier TLS
 | 
			
		||||
auths.pam_service_name=Nom du Service PAM
 | 
			
		||||
@@ -1034,7 +1032,7 @@ auths.activated=Authentification activée
 | 
			
		||||
auths.deletion_success=L'authentification a été supprimée avec succès !
 | 
			
		||||
auths.login_source_exist=La source d'authentification '%s' existe déjà.
 | 
			
		||||
 | 
			
		||||
config.server_config=Configuration du Serveur
 | 
			
		||||
config.server_config=Configuration du serveur
 | 
			
		||||
config.app_name=Nom de l'application
 | 
			
		||||
config.app_ver=Version de l'application
 | 
			
		||||
config.app_url=URL de l'application
 | 
			
		||||
@@ -1053,7 +1051,6 @@ config.reverse_auth_user=Annuler l'Authentification de l'Utilisateur
 | 
			
		||||
 | 
			
		||||
config.ssh_config=Configuration SSH
 | 
			
		||||
config.ssh_enabled=Activé
 | 
			
		||||
config.ssh_start_builtin_server=Démarrer le serveur intégré
 | 
			
		||||
config.ssh_domain=Domaine
 | 
			
		||||
config.ssh_port=Port
 | 
			
		||||
config.ssh_listen_port=Port d'écoute
 | 
			
		||||
@@ -1063,7 +1060,7 @@ config.ssh_keygen_path=Chemin vers le générateur de clefs ("ssh-keygen")
 | 
			
		||||
config.ssh_minimum_key_size_check=Vérification de la longueur de clé minimale
 | 
			
		||||
config.ssh_minimum_key_sizes=Tailles de clé minimales
 | 
			
		||||
 | 
			
		||||
config.db_config=Configuration de la Base de Données
 | 
			
		||||
config.db_config=Configuration de la base de données
 | 
			
		||||
config.db_type=Type
 | 
			
		||||
config.db_host=Hôte
 | 
			
		||||
config.db_name=Nom
 | 
			
		||||
@@ -1073,7 +1070,7 @@ config.db_ssl_mode_helper=("postgres" uniquement)
 | 
			
		||||
config.db_path=Emplacement
 | 
			
		||||
config.db_path_helper=(pour « sqlite3 » et « TIDB »)
 | 
			
		||||
 | 
			
		||||
config.service_config=Configuration du Service
 | 
			
		||||
config.service_config=Configuration du service
 | 
			
		||||
config.register_email_confirm=Nécessite une confirmation par e-mail
 | 
			
		||||
config.disable_register=Désactiver les inscriptions
 | 
			
		||||
config.show_registration_button=Afficher le bouton d'enregistrement
 | 
			
		||||
@@ -1101,7 +1098,7 @@ config.test_mail_sent=Un e-mail de test à été envoyé à '%s'.
 | 
			
		||||
config.oauth_config=Configuration OAuth
 | 
			
		||||
config.oauth_enabled=Activé
 | 
			
		||||
 | 
			
		||||
config.cache_config=Configuration du Cache
 | 
			
		||||
config.cache_config=Configuration du cache
 | 
			
		||||
config.cache_adapter=Adaptateur du Cache
 | 
			
		||||
config.cache_interval=Intervales du Cache
 | 
			
		||||
config.cache_conn=Liaison du Cache
 | 
			
		||||
@@ -1133,7 +1130,7 @@ config.git_clone_timeout=Délai imparti pour l'opération "Clone
 | 
			
		||||
config.git_pull_timeout=Délai imparti pour l'opération "Pull
 | 
			
		||||
config.git_gc_timeout=Délai imparti pour l'opération "GC
 | 
			
		||||
 | 
			
		||||
config.log_config=Configuration du Journal
 | 
			
		||||
config.log_config=Configuration du journal
 | 
			
		||||
config.log_mode=Mode du journal
 | 
			
		||||
 | 
			
		||||
monitor.cron=Tâches Cron
 | 
			
		||||
@@ -1141,10 +1138,10 @@ monitor.name=Nom
 | 
			
		||||
monitor.schedule=Planification
 | 
			
		||||
monitor.next=Suivant
 | 
			
		||||
monitor.previous=Précédent
 | 
			
		||||
monitor.execute_times=Nombre d'Éxécutions
 | 
			
		||||
monitor.process=Processus en cours d'éxécution
 | 
			
		||||
monitor.execute_times=Nombre d'exécutions
 | 
			
		||||
monitor.process=Processus en cours d'exécution
 | 
			
		||||
monitor.desc=Description
 | 
			
		||||
monitor.start=Heure de Démarrage
 | 
			
		||||
monitor.start=Heure de démarrage
 | 
			
		||||
monitor.execute_time=Heure d'Éxécution
 | 
			
		||||
 | 
			
		||||
notices.system_notice_list=Notes Systèmes
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,12 @@ your_profile=Saját Profil
 | 
			
		||||
your_starred=Csillagozottjaid
 | 
			
		||||
your_settings=Beállításaid
 | 
			
		||||
 | 
			
		||||
all=Összes
 | 
			
		||||
sources=Források
 | 
			
		||||
mirrors=Tükrök
 | 
			
		||||
collaborative=Együttműködés
 | 
			
		||||
forks=Másolatok
 | 
			
		||||
 | 
			
		||||
activities=Tevékenységek
 | 
			
		||||
pull_requests=Egyesítési Kérések
 | 
			
		||||
issues=Hibajegyek
 | 
			
		||||
@@ -86,7 +92,7 @@ domain_helper=Ez befolyásolja az SSH klónozási URL-jeit.
 | 
			
		||||
ssh_port=SSH port
 | 
			
		||||
ssh_port_helper=SSH port amit a szervered használni fog, vagy hagyd üresen a kikapcsoláshoz.
 | 
			
		||||
http_port=HTTP port
 | 
			
		||||
http_port_helper=Ezen a porton érhető el az alkalmazás.
 | 
			
		||||
http_port_helper=Ezen a porton érhető el az alkalmazás webfelülete.
 | 
			
		||||
app_url=Alkalmazás URL-je
 | 
			
		||||
app_url_helper=Ez hatással van a HTTP/HTTPS-klón URL és néhány E-Mail értesítésre.
 | 
			
		||||
log_root_path=Naplófájl elérési útja
 | 
			
		||||
@@ -251,6 +257,7 @@ username_been_taken=Felhasználónév már foglalt.
 | 
			
		||||
repo_name_been_taken=A tároló neve már foglalt.
 | 
			
		||||
org_name_been_taken=A szervezet neve már foglalt.
 | 
			
		||||
team_name_been_taken=A csoportnév már foglalt.
 | 
			
		||||
team_no_units_error=A csoportnak legalább egy egységet engedélyezni kell.
 | 
			
		||||
email_been_used=Az E-mail már használatban van.
 | 
			
		||||
openid_been_used=Az OpenID cím "%s" már használatban van.
 | 
			
		||||
username_password_incorrect=Helytelen felhasználónév vagy jelszó.
 | 
			
		||||
@@ -386,7 +393,7 @@ valid_until=Érvényesség vége:
 | 
			
		||||
valid_forever=Érvényes örökre
 | 
			
		||||
last_used=Utolsó használat:
 | 
			
		||||
no_activity=Mostanság nem aktívan használt
 | 
			
		||||
key_state_desc=Ez a kulcs volt használva az elmúlt 7 napban
 | 
			
		||||
key_state_desc=Ezt a kulcsot már használta az elmúlt 7 napban
 | 
			
		||||
token_state_desc=Ez a token volt használva az elmúlt 7 napban
 | 
			
		||||
show_openid=Megjelenítés a profilon
 | 
			
		||||
hide_openid=Elrejtés a profilról
 | 
			
		||||
@@ -491,6 +498,7 @@ migrate.lfs_mirror_unsupported=LFS objektumok tükrözése nem támogatott - has
 | 
			
		||||
 | 
			
		||||
mirror_from=tükörképe a:
 | 
			
		||||
forked_from=másolva innen:
 | 
			
		||||
fork_from_self=Nem fork-olhat önmaga által birtokolt tárolót!
 | 
			
		||||
copy_link=Másolás
 | 
			
		||||
copy_link_success=Másolva!
 | 
			
		||||
copy_link_error=Nyomja meg a ⌘-C vagy Ctrl-C gombokat a másoláshoz
 | 
			
		||||
@@ -504,7 +512,7 @@ download_archive=Töltse le ezt a tárolót
 | 
			
		||||
 | 
			
		||||
no_desc=Nincs leírás
 | 
			
		||||
quick_guide=Gyors útmutató
 | 
			
		||||
clone_this_repo=A tároló másolása
 | 
			
		||||
clone_this_repo=Tároló klónozása
 | 
			
		||||
create_new_repo_command=Egy új tároló létrehozása a parancssorból
 | 
			
		||||
push_exist_repo=Meglévő tároló feltöltése parancssorból
 | 
			
		||||
bare_message=A tároló nem tartalmaz semmit, üres.
 | 
			
		||||
@@ -567,7 +575,7 @@ editor.file_already_exists=A(z) '%s' nevű fájl már létezik a tárolóban.
 | 
			
		||||
editor.no_changes_to_show=Nincsen megjeleníthető változás.
 | 
			
		||||
editor.fail_to_update_file=Nem sikerült létrehozni/módosítani a következő fájlt: '%s' A hiba oka: %v
 | 
			
		||||
editor.add_subdir=Alkönyvtár hozzáadása...
 | 
			
		||||
editor.unable_to_upload_files=Nem sikerült feltölteni a fájlokat a következőre: '%s' A hiba oka: %v
 | 
			
		||||
editor.unable_to_upload_files=Nem sikerült feltölteni a fájlokat a "%s" hiba: %v
 | 
			
		||||
editor.upload_files_to_dir=Fájlok feltöltése a következőre: '%s'
 | 
			
		||||
editor.cannot_commit_to_protected_branch=Nem lehet a következő védett ágra commit-olni: '%s'.
 | 
			
		||||
 | 
			
		||||
@@ -581,6 +589,8 @@ commits.message=Üzenet
 | 
			
		||||
commits.date=Dátum
 | 
			
		||||
commits.older=Régebbi
 | 
			
		||||
commits.newer=Újabb
 | 
			
		||||
commits.signed_by=Aláírta
 | 
			
		||||
commits.gpg_key_id=GPG kulcs azonosító
 | 
			
		||||
 | 
			
		||||
ext_issues=Külső hibajegyek
 | 
			
		||||
ext_issues.desc=Külső Hibajegy kezelő: link egy külső hibajegy kezelő rendszer oldalára
 | 
			
		||||
@@ -770,7 +780,7 @@ wiki.pages=Oldalak
 | 
			
		||||
wiki.last_updated=Utoljára módosítva: %s
 | 
			
		||||
 | 
			
		||||
settings=Beállítások
 | 
			
		||||
settings.desc=A beállítások menüpontban állíthatók a tároló paraméterei
 | 
			
		||||
settings.desc=A beállítások menüpontban állítható a tároló paraméterei
 | 
			
		||||
settings.options=Beállítások
 | 
			
		||||
settings.collaboration=Együttműködés
 | 
			
		||||
settings.collaboration.admin=Rendszergazda
 | 
			
		||||
@@ -809,9 +819,9 @@ settings.new_owner_has_same_repo=Az új tulajdonos már rendelkezik ilyen nevű
 | 
			
		||||
settings.convert=Hagyományos tárolóvá alakítás
 | 
			
		||||
settings.convert_desc=Átalakíthatja ezt a tükörtárolót hagyományos tárolóvá. A művelet nem visszavonható.
 | 
			
		||||
settings.convert_notices_1=- Ez a művelet át fogja konvertálni ezt a tükör-tárolót egy rendes tárolóvá, és nem lehet visszavonni.
 | 
			
		||||
settings.convert_confirm=Konvertálás Megerősítése
 | 
			
		||||
settings.convert_confirm=Átalakítás Megerősítése
 | 
			
		||||
settings.convert_succeed=A tárolót egy rendes tárolóvá kell konvertálni.
 | 
			
		||||
settings.transfer=Tulajdonosi jog átadása
 | 
			
		||||
settings.transfer=Tulajdonjog átadása
 | 
			
		||||
settings.transfer_desc=A tároló tulajdonának átruházása egy másik felhasználóra, vagy egy szervezetre ahol rendszergazdai jogai van.
 | 
			
		||||
settings.transfer_notices_1=- El fogja veszteni a hozzáférését, ha az új tulajdonos egy egyéni felhasználó.
 | 
			
		||||
settings.transfer_notices_2=- Megmarad a hozzáférése, ha az új tulajdonos egy szervezet és te az egyik tulajdonosa vagy.
 | 
			
		||||
@@ -824,7 +834,7 @@ settings.delete=A tároló törlése
 | 
			
		||||
settings.delete_desc=Ha egyszer letöröl egy tárolót, azt nem lehet visszavonni. Bizonyosodjon meg benne, hogy ezt szeretné.
 | 
			
		||||
settings.delete_notices_1=- Ezt a műveletet <strong>NEM</strong> lehet visszavonni.
 | 
			
		||||
settings.delete_notices_2=- Ez a művelet véglegesen törölni fog mindent ami a tárolóhoz tartozik, például kódot, hibajegyeket, hozzászólásokat, Wiki oldalakat és a közreműködők jogait.
 | 
			
		||||
settings.delete_notices_fork_1=- Minden másolat önállóvá válik a törlés után.
 | 
			
		||||
settings.delete_notices_fork_1=- Minden tároló másolat önállóvá válik a törlés után.
 | 
			
		||||
settings.deletion_success=A tároló törölve lett.
 | 
			
		||||
settings.update_settings_success=A tároló beállításai firssítve lettek.
 | 
			
		||||
settings.transfer_owner=Új tulajdonos
 | 
			
		||||
@@ -874,14 +884,14 @@ settings.event_create_desc=Ág vagy címke létrehozva
 | 
			
		||||
settings.event_pull_request=Egyesítési Kérés
 | 
			
		||||
settings.event_pull_request_desc=Egyesítési kérés megnyitva, lecsukva, újranyitva, szerkesztve, hozzárendelve, senkihez sem rendelve, címke frissítve, címke törölve vagy szinkronizálva.
 | 
			
		||||
settings.event_push=Feltöltés
 | 
			
		||||
settings.event_push_desc=Git push egy tárolóhoz
 | 
			
		||||
settings.event_push_desc=Push-olás egy tárolóba
 | 
			
		||||
settings.active=Aktív
 | 
			
		||||
settings.active_helper=Az információ az eseményről, amely miatt lefutott is el lesz küldve.
 | 
			
		||||
settings.add_hook_success=Új Webhook hozzáadva.
 | 
			
		||||
settings.update_webhook=Webhook frissítése
 | 
			
		||||
settings.update_hook_success=A Webhook frissítve.
 | 
			
		||||
settings.delete_webhook=Webhook törlése
 | 
			
		||||
settings.recent_deliveries=Közelmúltbeli küldések
 | 
			
		||||
settings.recent_deliveries=Legutóbbi Küldések
 | 
			
		||||
settings.hook_type=Hook típusa
 | 
			
		||||
settings.add_slack_hook_desc=<a href="%s">Slack</a> integráció hozzáadása a tárolójához.
 | 
			
		||||
settings.slack_token=Token
 | 
			
		||||
@@ -893,7 +903,7 @@ settings.deploy_key_desc=A Deploy kulcsoknak csak olvasási joga van. Nem ugyan
 | 
			
		||||
settings.no_deploy_keys=Még nem adott hozzá egyetlen Deploy kulcsot sem.
 | 
			
		||||
settings.title=Cím
 | 
			
		||||
settings.deploy_key_content=Tartalom
 | 
			
		||||
settings.key_been_used=Deploy kulcs tartalma használva lett.
 | 
			
		||||
settings.key_been_used=Deploy kulcs tartalma már fel lett használva.
 | 
			
		||||
settings.key_name_used=Ezzel a névvel már létezik Deploy kulcs.
 | 
			
		||||
settings.add_key_success=Az új Deploy kulcs '%s' sikeresen hozzáadva!
 | 
			
		||||
settings.deploy_key_deletion=Telepítési kulcs törlése
 | 
			
		||||
@@ -1076,8 +1086,8 @@ dashboard.delete_inactivate_accounts=Minden inaktív fiók törlése
 | 
			
		||||
dashboard.delete_inactivate_accounts_success=Minden inaktív fiók törölve.
 | 
			
		||||
dashboard.delete_repo_archives=Összes archív tároló törlése
 | 
			
		||||
dashboard.delete_repo_archives_success=Az összes archivált tároló törölve lett.
 | 
			
		||||
dashboard.delete_missing_repos=Az összes olyan tároló bejegyzés törlése, amiknek a kapcsolódó GIT fájljai elvesztek
 | 
			
		||||
dashboard.delete_missing_repos_success=Az összes tároló bejegyzés törölve, amiknek a kapcsolódó GIT fájljai elvesztek.
 | 
			
		||||
dashboard.delete_missing_repos=Az összes tárolóban az elveszett Git fájl rekordok törlése
 | 
			
		||||
dashboard.delete_missing_repos_success=Az összes tároló bejegyzés törölve, amiknek a kapcsolódó Git fájljai elvesztek.
 | 
			
		||||
dashboard.git_gc_repos=Memóriaszemét-gyűjtő (GC) futtatása az összes tárolón
 | 
			
		||||
dashboard.git_gc_repos_success=Minden tárolón befejezte a memóriaszemét-gyűjtő (GC) a futását.
 | 
			
		||||
dashboard.resync_all_sshkeys=A '.ssh/authorized_keys' fájl újraírása (a Gitea SSH publikus kulcsaival)
 | 
			
		||||
@@ -1085,14 +1095,14 @@ dashboard.resync_all_sshkeys_success=Minden kulcs újraírva.
 | 
			
		||||
dashboard.resync_all_hooks=pre-receive, update és post-receive hook-ok újraszinkronizálása az összes tárolóban.
 | 
			
		||||
dashboard.resync_all_hooks_success=Az összes tároló pre-receive, update és post-receive hook-ja szinkronizálva lett.
 | 
			
		||||
dashboard.reinit_missing_repos=Az összes Git tároló újra-inicializálása amihez léteznek bejegyzések
 | 
			
		||||
dashboard.reinit_missing_repos_success=Az összes Git tároló amihez létezett bejegyzés újra lett szinkronizálva.
 | 
			
		||||
dashboard.reinit_missing_repos_success=Az összes Git tároló amihez létezett bejegyzés újra lett iniciaizálva.
 | 
			
		||||
dashboard.sync_external_users=Külső felhasználói adatok szinkronizálása
 | 
			
		||||
dashboard.sync_external_users_started=Külső felhasználó szinkronizálása elkezdődött
 | 
			
		||||
dashboard.server_uptime=Kiszolgáló futási ideje
 | 
			
		||||
dashboard.current_goroutine=Aktuális Gorutinok
 | 
			
		||||
dashboard.current_goroutine=Jelenlegi Goroutinok
 | 
			
		||||
dashboard.current_memory_usage=Jelenlegi memória használat
 | 
			
		||||
dashboard.total_memory_allocated=Összes lefoglalt memória
 | 
			
		||||
dashboard.memory_obtained=Memória Megszerezve
 | 
			
		||||
dashboard.memory_obtained=Megszerzett Memória
 | 
			
		||||
dashboard.pointer_lookup_times=Pointer Lookup Idők
 | 
			
		||||
dashboard.memory_allocate_times=Memória Foglalási Idők
 | 
			
		||||
dashboard.memory_free_times=Memória Felszabadítási Idők
 | 
			
		||||
@@ -1146,8 +1156,8 @@ users.allow_import_local=Ez a fiók importálhat helyi tárolókat
 | 
			
		||||
users.allow_create_organization=Ez a fiók létrehozhat szervezeteket
 | 
			
		||||
users.update_profile=Fiók profiljának frissítése
 | 
			
		||||
users.delete_account=A fiók törlése
 | 
			
		||||
users.still_own_repo=Ennek a felhasználónak legalább egy tárolója van még, le kell törölnöd, vagy valakinek átadnod.
 | 
			
		||||
users.still_has_org=Ez a felhasználó még mindig tagja legalább egy szervezetnek, távoznia kell onnan, vagy a szervezetet törölni.
 | 
			
		||||
users.still_own_repo=Ennek a felhasználónak legalább egy tárolója van még, le kell törölnie, vagy valakinek átadnia.
 | 
			
		||||
users.still_has_org=Ez a felhasználó még mindig tagja legalább egy szervezetnek, távoznia kell onnan, vagy a szervezetet előbb törölni kell.
 | 
			
		||||
users.deletion_success=Fiók sikeresen törölve.
 | 
			
		||||
 | 
			
		||||
orgs.org_manage_panel=Szervezetek kezelése
 | 
			
		||||
@@ -1229,7 +1239,7 @@ auths.update_success=A hitelesítési mód beállításai frissítve lettek.
 | 
			
		||||
auths.update=Hitelesítési forrás frissítése
 | 
			
		||||
auths.delete=A hitelesítési forrás törlése
 | 
			
		||||
auths.delete_auth_title=Hitelesítési forrás törlése
 | 
			
		||||
auths.delete_auth_desc=A hitelesítési mód törlésre kerül, biztosan folytatni szeretné?
 | 
			
		||||
auths.delete_auth_desc=A hitelesítési forrás törlésre kerül, biztosan folytatni szeretné?
 | 
			
		||||
auths.still_in_used=A hitelesítési mód még használatban van, mielőtt törölné válasszon más hitelesítési módot az érintett fiókokhoz, vagy törölje őket.
 | 
			
		||||
auths.deletion_success=Hitelesítési forrás sikeresen törölve!
 | 
			
		||||
auths.login_source_exist=Bejelentkezési forrás "%s" már létezik.
 | 
			
		||||
@@ -1287,7 +1297,7 @@ config.enable_captcha=Captcha Engedélyezése
 | 
			
		||||
config.active_code_lives=Aktív kód életek
 | 
			
		||||
config.reset_password_code_lives=Jelszó visszaállításnál használt kód elévülési ideje
 | 
			
		||||
config.default_keep_email_private=Email cím ne látszódjon" alapértelmezett értéke
 | 
			
		||||
config.default_allow_create_organization=Szervezet létrehozása" jogosultság alapértelmezett értéke
 | 
			
		||||
config.default_allow_create_organization=Szervezet létrehozása jogosultság alapértelmezett értéke
 | 
			
		||||
config.no_reply_address=No-reply cím
 | 
			
		||||
 | 
			
		||||
config.webhook_config=Webhook Beállítása
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,7 @@ settings=Impostazioni
 | 
			
		||||
your_profile=Il tuo profilo
 | 
			
		||||
your_settings=Impostazioni
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Attivitá
 | 
			
		||||
pull_requests=Pull Request
 | 
			
		||||
issues=Problemi
 | 
			
		||||
@@ -569,7 +570,6 @@ release.ahead=<strong>%d</strong> commits da %s da questo rilascio
 | 
			
		||||
release.source_code=Codice Sorgente
 | 
			
		||||
release.tag_name=Nome tag
 | 
			
		||||
release.target=Obbiettivo
 | 
			
		||||
release.tag_helper=Scegli un tag esistente o crea un nuovo tag una volta pubblicato.
 | 
			
		||||
release.title=Titolo
 | 
			
		||||
release.content=Contenuto
 | 
			
		||||
release.write=Scrivi
 | 
			
		||||
@@ -617,7 +617,6 @@ settings.delete_account=Elimina questa organizzazione
 | 
			
		||||
settings.delete_prompt=L'organizzazione verrà rimossa definitivamente, e questa operazione <strong>NON PUÒ</strong> essere annullata!
 | 
			
		||||
settings.confirm_delete_account=Conferma Eliminazione
 | 
			
		||||
settings.delete_org_title=Eliminazione Organizzazione
 | 
			
		||||
settings.hooks_desc=Aggiungi i webhooks che verranno attivati per <strong>tutti i repository</strong> sotto questa organizzazione.
 | 
			
		||||
 | 
			
		||||
members.public=Pubblico
 | 
			
		||||
members.public_helper=rendi privato
 | 
			
		||||
@@ -645,7 +644,6 @@ teams.update_settings=Aggiorna Impostazioni
 | 
			
		||||
teams.delete_team=Elimina questo Team
 | 
			
		||||
teams.add_team_member=Aggiungere un Membro al Team
 | 
			
		||||
teams.delete_team_title=Eliminazione Team
 | 
			
		||||
teams.delete_team_desc=Quando questo team verrà eliminato, i membri di questa squadra potrebbero perdere l'accesso ad alcuni repository. Si desidera continuare?
 | 
			
		||||
teams.read_permission_desc=Questo Team concede accesso di <strong>Lettura</strong>: i membri possono visualizzare e clonare i repository del Team.
 | 
			
		||||
teams.write_permission_desc=Questo Team concede accesso di <strong>Scrittura</strong>: i membri possono leggere e pushare i repository del Team.
 | 
			
		||||
teams.admin_permission_desc=Questo Team concede accesso di <strong>Amministratore</strong>: i membri possono leggere i, pushare a, e aggiungere collaboratori ai repository del Team.
 | 
			
		||||
@@ -780,7 +778,6 @@ config.reverse_auth_user=Autenticazione Utente Inversa
 | 
			
		||||
 | 
			
		||||
config.ssh_config=Configurazione SSH
 | 
			
		||||
config.ssh_enabled=Attivo
 | 
			
		||||
config.ssh_start_builtin_server=Avvia server builtin
 | 
			
		||||
config.ssh_domain=Dominio
 | 
			
		||||
config.ssh_port=Porta
 | 
			
		||||
config.ssh_listen_port=Porta in ascolto
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ settings=設定
 | 
			
		||||
your_profile=プロフィール
 | 
			
		||||
your_settings=設定
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=アクティビティ
 | 
			
		||||
pull_requests=プルリクエスト
 | 
			
		||||
issues=課題
 | 
			
		||||
@@ -549,7 +550,6 @@ release.ahead=このリリース以降 %s へ <strong>%d</strong> コミット
 | 
			
		||||
release.source_code=ソース コード
 | 
			
		||||
release.tag_name=タグ名
 | 
			
		||||
release.target=ターゲット
 | 
			
		||||
release.tag_helper=既存のタグを選択するか、新しいタグを作成し発行します。
 | 
			
		||||
release.title=タイトル
 | 
			
		||||
release.content=コンテント
 | 
			
		||||
release.write=書込み
 | 
			
		||||
@@ -596,7 +596,6 @@ settings.delete_account=この組織を削除
 | 
			
		||||
settings.delete_prompt=この操作をすると組織が完全に削除され、<strong>二度と元に戻すことができなくなります</strong> !
 | 
			
		||||
settings.confirm_delete_account=削除を確認
 | 
			
		||||
settings.delete_org_title=組織の削除
 | 
			
		||||
settings.hooks_desc=この組織のもとで <strong>すべてのリポジトリ</strong> に対してトリガーされる webhook を追加します。
 | 
			
		||||
 | 
			
		||||
members.public=パブリック
 | 
			
		||||
members.public_helper=プライベートにする
 | 
			
		||||
@@ -624,7 +623,6 @@ teams.update_settings=設定の更新
 | 
			
		||||
teams.delete_team=このチームを削除
 | 
			
		||||
teams.add_team_member=チーム メンバーを追加
 | 
			
		||||
teams.delete_team_title=チームの削除
 | 
			
		||||
teams.delete_team_desc=このチームを削除します、継続しますか?このチームのメンバーはいくつかのリポジトリへのアクセスを失う可能性があります。
 | 
			
		||||
teams.read_permission_desc=このチームは<strong>読み取り</strong>権限を持ち: メンバーはリポジトリの表示及びクローンの作成ができます。
 | 
			
		||||
teams.write_permission_desc=このチームは<strong>書き込み</strong>権限を持ち: メンバーはリポジトリの表示及リポジトリへのプッシュができます。
 | 
			
		||||
teams.admin_permission_desc=このチームは<strong>管理者</strong>の権限を持ち: メンバーはチームのリポジトリに対して、読み取り、プッシュや共同編集者の追加ができます。
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ settings=설정
 | 
			
		||||
your_profile=프로필
 | 
			
		||||
your_settings=설정
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=활동
 | 
			
		||||
pull_requests=풀 리퀘스트
 | 
			
		||||
issues=이슈들
 | 
			
		||||
@@ -542,7 +543,6 @@ settings.wiki_delete_notices_1=- 이것은 %s의 Wiki를 비활성화 시키고
 | 
			
		||||
settings.delete=이 저장소 삭제
 | 
			
		||||
settings.delete_desc=저장소를 지우고 나면 되돌릴 수 없습니다. 다시 한번 확인하세요.
 | 
			
		||||
settings.delete_notices_1=- 이 작업은 취소할 수 <strong>없습니다.</strong>
 | 
			
		||||
settings.delete_notices_fork_1=- 모든 포크들은 삭제 후에도 독립적으로 유지됩니다.
 | 
			
		||||
settings.transfer_owner=새 소유자
 | 
			
		||||
settings.make_transfer=저장소 전송
 | 
			
		||||
settings.confirm_delete=삭제 확인
 | 
			
		||||
@@ -629,7 +629,6 @@ release.ahead=이 릴리스 이후로 <strong>%d</strong> %s에 커밋합니다.
 | 
			
		||||
release.source_code=소스 코드
 | 
			
		||||
release.tag_name=태그 이름
 | 
			
		||||
release.target=대상
 | 
			
		||||
release.tag_helper=태그를 선택하거나 새로운 태그를 만들어 게시
 | 
			
		||||
release.title=제목
 | 
			
		||||
release.content=컨텐츠
 | 
			
		||||
release.write=쓰기
 | 
			
		||||
@@ -678,7 +677,6 @@ settings.delete_account=이 조직을 삭제합니다.
 | 
			
		||||
settings.delete_prompt=조직이 영구적으로 삭제됩니다. 그리고 취소할 수 <strong>없습니다.</strong>
 | 
			
		||||
settings.confirm_delete_account=삭제 승인
 | 
			
		||||
settings.delete_org_title=조직 삭제
 | 
			
		||||
settings.hooks_desc=이 조직의 <strong>모든 저장소</strong>에서 실행되는 웹훅을 추가합니다.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=회원 표시:
 | 
			
		||||
members.public=공개
 | 
			
		||||
@@ -707,7 +705,6 @@ teams.update_settings=설정 업데이트
 | 
			
		||||
teams.delete_team=이 팀을 삭제하기
 | 
			
		||||
teams.add_team_member=팀 구성원 추가
 | 
			
		||||
teams.delete_team_title=팀 삭제
 | 
			
		||||
teams.delete_team_desc=이 팀을 삭제하면 몇몇 저장소에대해 팀 구성원이 접근 권한을 잃게됩니다. 계속하시겠습니까?
 | 
			
		||||
teams.read_permission_desc=이 팀의 <strong>읽기</strong> 권한을 부여: 회원은 이 팀의 저장소를 보거나 복제할 수 있습니다.
 | 
			
		||||
teams.write_permission_desc=이 팀의 <strong>쓰기</strong> 권한을 부여: 회원은 이 팀의 저장소를 읽거나 푸시할 수 있습니다.
 | 
			
		||||
teams.admin_permission_desc=이 팀의 <strong>관리자</strong> 권한을 부여: 회원은 이 팀의 저장소를 읽거나 푸시하거나 추가하고 공동 작업자를 추가할 수 있습니다.
 | 
			
		||||
@@ -826,7 +823,6 @@ auths.smtp_auth=SMTP 인증 유형
 | 
			
		||||
auths.smtphost=SMTP 호스트
 | 
			
		||||
auths.smtpport=SMTP 포트
 | 
			
		||||
auths.allowed_domains=허용된 도메인
 | 
			
		||||
auths.allowed_domains_helper=도메인을 제안하지 않으려면 비워둡니다. 여러 도메인은 ',' 콤마를 이용해 구분합니다.
 | 
			
		||||
auths.enable_tls=TLS 암호화 활성화
 | 
			
		||||
auths.skip_tls_verify=TLS 검증 건너뛰기
 | 
			
		||||
auths.pam_service_name=PAM 서비스 명
 | 
			
		||||
@@ -852,7 +848,6 @@ config.reverse_auth_user=역방향 사용자 인증
 | 
			
		||||
 | 
			
		||||
config.ssh_config=SSH 설정
 | 
			
		||||
config.ssh_enabled=활성화됨
 | 
			
		||||
config.ssh_start_builtin_server=빌트인 서버 시작
 | 
			
		||||
config.ssh_domain=도메인
 | 
			
		||||
config.ssh_port=포트
 | 
			
		||||
config.ssh_listen_port=수신 대기 포트
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ settings=Nustatymai
 | 
			
		||||
your_profile=Jūsų profilis
 | 
			
		||||
your_settings=Jūsų parametrai
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Veiklos
 | 
			
		||||
issues=Problemos
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,12 @@ your_profile=Tavs profils
 | 
			
		||||
your_starred=Tavi atzīmētie ar zvaigznīti
 | 
			
		||||
your_settings=Tavi iestatījumi
 | 
			
		||||
 | 
			
		||||
all=Visi
 | 
			
		||||
sources=Avoti
 | 
			
		||||
mirrors=Spoguļi
 | 
			
		||||
collaborative=Sadarbības
 | 
			
		||||
forks=Atdalītie
 | 
			
		||||
 | 
			
		||||
activities=Aktivitāte
 | 
			
		||||
pull_requests=Izmaiņu pieprasījumi
 | 
			
		||||
issues=Problēmas
 | 
			
		||||
@@ -251,6 +257,7 @@ username_been_taken=Lietotājvārds jau ir aizņemts.
 | 
			
		||||
repo_name_been_taken=Jau eksistē repozitorijs ar šādu nosaukumu.
 | 
			
		||||
org_name_been_taken=Organizācijas nosaukums jau ir aizņemts.
 | 
			
		||||
team_name_been_taken=Komandas nosaukums jau ir aizņemts.
 | 
			
		||||
team_no_units_error=Komandai ir jābūt iespējotai vismaz vienai sadaļai.
 | 
			
		||||
email_been_used=E-pasta adrese jau ir izmantota.
 | 
			
		||||
openid_been_used=OpenID adrese '%s' jau ir izmantota.
 | 
			
		||||
username_password_incorrect=Nepareizs lietotājvārds vai parole.
 | 
			
		||||
@@ -267,9 +274,9 @@ invalid_gpg_key=Nav iespējams pārbaudīt GPG atslēgu: %s
 | 
			
		||||
unable_verify_ssh_key=SSH atslēgu nav iespējams pārbaudīt, pārliecinieties, ka tajā nav kļūdu.
 | 
			
		||||
auth_failed=Autentifikācija neizdevās: %v
 | 
			
		||||
 | 
			
		||||
still_own_repo=Šis konts ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai nomainīt to īpašnieku.
 | 
			
		||||
still_own_repo=Šis konts ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku.
 | 
			
		||||
still_has_org=Jūsu konts ir piesaistīts vismaz vienai organizācijai, sākumā nepieciešams to pamest.
 | 
			
		||||
org_still_own_repo=Organizācijai pieder repozitoriji, tos vispirms ir nepieciešams izdzēst vai pārvietot.
 | 
			
		||||
org_still_own_repo=Organizācijai pieder repozitoriji, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku.
 | 
			
		||||
 | 
			
		||||
target_branch_not_exist=Mērķa atzars neeksistē
 | 
			
		||||
 | 
			
		||||
@@ -491,6 +498,7 @@ migrate.lfs_mirror_unsupported=LFS objektu spoguļošana netiek atbalstīta - iz
 | 
			
		||||
 | 
			
		||||
mirror_from=spogulis no
 | 
			
		||||
forked_from=atdalīts no
 | 
			
		||||
fork_from_self=Nav iespējams atdalīt repozitoriju, kuram esat īpašnieks!
 | 
			
		||||
copy_link=Kopēt
 | 
			
		||||
copy_link_success=Nokopēts!
 | 
			
		||||
copy_link_error=Nospiediet ⌘-C vai Ctrl-C, lai nokopētu
 | 
			
		||||
@@ -581,6 +589,8 @@ commits.message=Ziņojums
 | 
			
		||||
commits.date=Datums
 | 
			
		||||
commits.older=Vecāki
 | 
			
		||||
commits.newer=Jaunāki
 | 
			
		||||
commits.signed_by=Parakstījis
 | 
			
		||||
commits.gpg_key_id=GPG atslēgas ID
 | 
			
		||||
 | 
			
		||||
ext_issues=Ārējās problēmas
 | 
			
		||||
ext_issues.desc=Ārējās problēmas ir saite uz ārējo problēmu vadības lapu
 | 
			
		||||
@@ -823,8 +833,8 @@ settings.wiki_deletion_success=Repozitorija vikivietnes dati tika izdzēsti.
 | 
			
		||||
settings.delete=Dzēst šo repozitoriju
 | 
			
		||||
settings.delete_desc=Dzēšot repozitoriju, tā datus vairs nebūs iespējams atgūt. Pirms dzēšanas pārliecinieties vai patiešām vēlaties to darīt.
 | 
			
		||||
settings.delete_notices_1=- Šī darbība ir <strong>NEATGRIEZENISKA</strong>.
 | 
			
		||||
settings.delete_notices_2=- Šī darbība neatgriezeniski dzēsīs visu ar šo repozitoriju saistīto informāciju, tai skaitā kodu, problēmu pieteikumus, komentārus, vikivietni un sadarbības lietotāju tiesības.
 | 
			
		||||
settings.delete_notices_fork_1=- Visi atdalītie repozitoriji kļūs neatkarīgi pēc dzēšanas.
 | 
			
		||||
settings.delete_notices_2=- Šī darbība neatgriezeniski dzēsīs šī repozitorija kodu, problēmas, komentārus, vikivietni un līdzstrādnieku piekļuvi.
 | 
			
		||||
settings.delete_notices_fork_1=- Visi atdalītie repozitoriju pēc dzēšanas kļūs neatkarīgi.
 | 
			
		||||
settings.deletion_success=Repozitorijs tika izdzēsts.
 | 
			
		||||
settings.update_settings_success=Repozitorija iestatījumi tika saglabāti.
 | 
			
		||||
settings.transfer_owner=Jaunais īpašnieks
 | 
			
		||||
@@ -941,7 +951,7 @@ release.new_subheader=Publicējiet laidienus, lai varētu veikt atsekošanu proj
 | 
			
		||||
release.edit_subheader=Detalizēts izmaiņu žurnāls palīdz lietotajiem saprast, kas ir ticis mainīts.
 | 
			
		||||
release.tag_name=Taga nosaukums
 | 
			
		||||
release.target=Mērķis
 | 
			
		||||
release.tag_helper=Publicējot, izvēlieties esošu vai izveidojiet jaunu tagu.
 | 
			
		||||
release.tag_helper=Izvēlieties jau esošu tagu vai izveidojiet jaunu.
 | 
			
		||||
release.title=Virsraksts
 | 
			
		||||
release.content=Saturs
 | 
			
		||||
release.write=Rakstīt
 | 
			
		||||
@@ -967,7 +977,7 @@ branch.delete_notices_1=- Šī darbība ir <strong>NEATGRIEZENISKA</strong>.
 | 
			
		||||
branch.delete_notices_2=- Šī darbība neatgriezeniski izdzēsīs visu zarā %s.
 | 
			
		||||
branch.deletion_success=Atzars '%s' tika izdzēsts.
 | 
			
		||||
branch.deletion_failed=Neizdevās izdzēst atzaru %s.
 | 
			
		||||
branch.delete_branch_has_new_commits=%s nevar tikt izdzēsts, jo tam ir jaunas revīzijas pēc sapludināšanas.
 | 
			
		||||
branch.delete_branch_has_new_commits=%s nevar tikt dzēsts, jo tam ir jaunas revīzijas pēc tā sapludināšanas.
 | 
			
		||||
 | 
			
		||||
[org]
 | 
			
		||||
org_name_holder=Organizācijas nosaukums
 | 
			
		||||
@@ -1039,7 +1049,7 @@ teams.update_settings=Saglabāt iestatījumus
 | 
			
		||||
teams.delete_team=Dzēst komandu
 | 
			
		||||
teams.add_team_member=Pievienot komandas biedru
 | 
			
		||||
teams.delete_team_title=Komandas dzēšana
 | 
			
		||||
teams.delete_team_desc=Komanda tiks dzēsta, vai vēlaties turpināt? Komandas biedri var zaudēt piekļuvi dažiem vai pat visiem repozitorijiem.
 | 
			
		||||
teams.delete_team_desc=Dzēšot komandu, tās biedri var zaudēt piekļuvi dažiem vai pat visiem repozitorijiem. Vai vēlaties turpināt?
 | 
			
		||||
teams.delete_team_success=Komanda tika izdzēsta.
 | 
			
		||||
teams.read_permission_desc=Šai komandai ir <strong>lasīšanas</strong> tiesības: dalībnieki var skatīties un klonēt komandas repozitorijus.
 | 
			
		||||
teams.write_permission_desc=Šai komandai ir <strong>rakstīšanas</strong> tiesības: dalībnieki var lasīt un nosūtīt izmaiņas repozitorijiem.
 | 
			
		||||
@@ -1076,8 +1086,8 @@ dashboard.delete_inactivate_accounts=Dzēst visus neaktīvos kontus
 | 
			
		||||
dashboard.delete_inactivate_accounts_success=Visi neaktīvie konti tika izdzēsti.
 | 
			
		||||
dashboard.delete_repo_archives=Dzēst visu repozitoriju arhīvus
 | 
			
		||||
dashboard.delete_repo_archives_success=Visu repozitoriju arhīvi tika izdzēsti.
 | 
			
		||||
dashboard.delete_missing_repos=Dzēst visus repozitoriju ierakstus, kas ir pazaudējuši attiecīgos Git failus
 | 
			
		||||
dashboard.delete_missing_repos_success=Visi repozitoriju ieraksti, kam bija pazaudēti Git repozitoriji, tika izdzēsti.
 | 
			
		||||
dashboard.delete_missing_repos=Dzēst visus repozitorijus, kuriem trūkst Git faili
 | 
			
		||||
dashboard.delete_missing_repos_success=Visi repozitoriji, kuriem trūkst Git faili, tika izdzēsti.
 | 
			
		||||
dashboard.git_gc_repos=Izpildīt visu repozitoriju datu sakārtošanu
 | 
			
		||||
dashboard.git_gc_repos_success=Visiem repozitorijiem ir pabeigta datu sakārtošana.
 | 
			
		||||
dashboard.resync_all_sshkeys=Pārrakstīt '.ssh/authorized_keys' failu (Gitea SSH atslēgām)
 | 
			
		||||
@@ -1146,7 +1156,7 @@ users.allow_import_local=Šim kontam ir tiesības importēt lokālus repozitorij
 | 
			
		||||
users.allow_create_organization=Jums nav tiesību veidot organizācijas
 | 
			
		||||
users.update_profile=Mainīt konta profilu
 | 
			
		||||
users.delete_account=Dzēst šo kontu
 | 
			
		||||
users.still_own_repo=Šim kontam pieder vismaz viens repozitorijs. Sākumā to ir nepieciešams izdzēst vai nomainīt tā īpašnieku.
 | 
			
		||||
users.still_own_repo=Šim kontam pieder vismaz viens repozitorijs, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku.
 | 
			
		||||
users.still_has_org=Šis konts ir piesaistīts vismaz vienai organizācijai. Sākumā ir nepieciešams to atsaistīt vai izdzēst šo organizāciju.
 | 
			
		||||
users.deletion_success=Konts tika veiksmīgi izdzēsts.
 | 
			
		||||
 | 
			
		||||
@@ -1196,7 +1206,7 @@ auths.smtp_auth=SMTP autentifikācijas tips
 | 
			
		||||
auths.smtphost=SMTP resursdators
 | 
			
		||||
auths.smtpport=SMTP ports
 | 
			
		||||
auths.allowed_domains=Atļautie domēni
 | 
			
		||||
auths.allowed_domains_helper=Atstājiet tukšu, ja nevēlaties ierobežot domēnu vārdus. Domēna vārdus nepieciešams atdalīt ar komatu ','.
 | 
			
		||||
auths.allowed_domains_helper=Atstājiet tukšu, lai atļautu visus domēnus. Lai norādītu vairākus domēnus, tos var atdalīt ar komatu.
 | 
			
		||||
auths.enable_tls=Iespējot TLS šifrēšanu
 | 
			
		||||
auths.skip_tls_verify=Izlaist TLS verifikāciju
 | 
			
		||||
auths.pam_service_name=PAM servisa nosaukums
 | 
			
		||||
@@ -1229,7 +1239,7 @@ auths.update_success=Autentifikācijas iestatījumi tika saglabāti.
 | 
			
		||||
auths.update=Mainīt autentifikācijas iestatījumus
 | 
			
		||||
auths.delete=Dzēst šo autentifikācijas avotu
 | 
			
		||||
auths.delete_auth_title=Dzēst autentifikācijas avotu
 | 
			
		||||
auths.delete_auth_desc=Šis autentifikācijas avots tiks dzēsts. Vai patiešām vēlaties turpināt?
 | 
			
		||||
auths.delete_auth_desc=Šis autentificēšanas avots tiks dzēsts, vai patiešām vēlaties turpināt?
 | 
			
		||||
auths.still_in_used=Daži lietotāji joprojām izmanto šo autentifikācijas avotu. Nepieciešams veikt šo lietotāju konvertāciju vai dzēšanu.
 | 
			
		||||
auths.deletion_success=Autentifikācija tika veiksmīgi izdzēsta!
 | 
			
		||||
auths.login_source_exist=Pieteikšanās avots '%s' jau eksistē.
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,7 @@ admin_panel=Administrasjonspanel
 | 
			
		||||
account_settings=Kontoinstillinger
 | 
			
		||||
settings=Innstillinger
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
issues=Problemer
 | 
			
		||||
 | 
			
		||||
cancel=Avbryt
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,7 @@ your_profile=Uw profiel
 | 
			
		||||
your_starred=Jouw Sterren
 | 
			
		||||
your_settings=Uw instellingen
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Activiteiten
 | 
			
		||||
pull_requests=Pull requests
 | 
			
		||||
issues=Kwesties
 | 
			
		||||
@@ -721,7 +722,6 @@ settings.wiki_deletion_success=De repository met wiki data is succesvol gewist.
 | 
			
		||||
settings.delete=Verwijder deze repository
 | 
			
		||||
settings.delete_desc=Als u eenmaal een repository verwijderd is er geen weg terug. Gelieve zeker te zijn van uw acties.
 | 
			
		||||
settings.delete_notices_1=- Deze bewerking kan <strong>NIET</strong> ongedaan gemaakt worden.
 | 
			
		||||
settings.delete_notices_fork_1=-Alle forks zullen onafhankelijk geworden na verwijdering.
 | 
			
		||||
settings.deletion_success=De repository is verwijderd.
 | 
			
		||||
settings.update_settings_success=Repository opties zijn verwijderd.
 | 
			
		||||
settings.transfer_owner=Nieuwe eigenaar
 | 
			
		||||
@@ -819,7 +819,6 @@ release.ahead=<strong>%d</strong> aanpassingen aan %s sinds deze versie
 | 
			
		||||
release.source_code=Broncode
 | 
			
		||||
release.tag_name=Tagnaam
 | 
			
		||||
release.target=Doel
 | 
			
		||||
release.tag_helper=Kies een bestaande tag, of creëer een nieuwe tag bij publiceren.
 | 
			
		||||
release.title=Titel
 | 
			
		||||
release.content=Inhoud
 | 
			
		||||
release.write=Schrijf
 | 
			
		||||
@@ -881,7 +880,6 @@ settings.delete_prompt=Deze actie zal de origanisatie permanent verwijderen. U k
 | 
			
		||||
settings.confirm_delete_account=Bevestig verwijdering
 | 
			
		||||
settings.delete_org_title=Verwijderen organsiatie
 | 
			
		||||
settings.delete_org_desc=Deze organisatie zal permanent worden verwijderd, wilt u doorgaan?
 | 
			
		||||
settings.hooks_desc=Een webhook toevoegen die door <strong>alle repositories</strong> in deze organisatie getriggerd kan worden.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Zichtbaarheid lidmaatschap:
 | 
			
		||||
members.public=Openbaar
 | 
			
		||||
@@ -910,7 +908,6 @@ teams.update_settings=Instellingen bijwerken
 | 
			
		||||
teams.delete_team=Verwijder deze team
 | 
			
		||||
teams.add_team_member=Nieuwe team lid aanmaken
 | 
			
		||||
teams.delete_team_title=Team verwijderen
 | 
			
		||||
teams.delete_team_desc=Dit team zal worden verwijderd. De leden van dit team zullen toegang tot alle repositories van het team verliezen. Wilt u doorgaan?
 | 
			
		||||
teams.delete_team_success=Het team is verwijderd.
 | 
			
		||||
teams.read_permission_desc=Dit team heeft <strong>Lees</strong> rechten : leden kunnen repositories lezen en klonen.
 | 
			
		||||
teams.write_permission_desc=Dit team heeft <strong>Schrijf</strong> rechten : leden kunnen repositories lezen en push aanvragen verwerken.
 | 
			
		||||
@@ -1048,7 +1045,6 @@ auths.smtp_auth=SMTP-authenticatietype
 | 
			
		||||
auths.smtphost=SMTP host
 | 
			
		||||
auths.smtpport=SMTP poort
 | 
			
		||||
auths.allowed_domains=Toegelaten domeinen
 | 
			
		||||
auths.allowed_domains_helper=Laat dit leeg om geen enkel domein te beperken. Meerdere domeinen moeten door een komma (',') gescheiden worden.
 | 
			
		||||
auths.enable_tls=Activeer TLS-encryptie
 | 
			
		||||
auths.skip_tls_verify=TLS-verificatie overslaan
 | 
			
		||||
auths.pam_service_name=PAM servicenaam
 | 
			
		||||
@@ -1083,7 +1079,6 @@ config.reverse_auth_user=Omgekeerde verificatie gebruiker
 | 
			
		||||
 | 
			
		||||
config.ssh_config=SSH-configuratie
 | 
			
		||||
config.ssh_enabled=Ingeschakeld
 | 
			
		||||
config.ssh_start_builtin_server=Ingebouwde server starten
 | 
			
		||||
config.ssh_domain=Domein
 | 
			
		||||
config.ssh_port=Poort
 | 
			
		||||
config.ssh_listen_port=Luister op poort
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ settings=Ustawienia
 | 
			
		||||
your_profile=Twój profil
 | 
			
		||||
your_settings=Twoje ustawienia
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Aktywności
 | 
			
		||||
pull_requests=Oczekujące zmiany
 | 
			
		||||
issues=Problemy
 | 
			
		||||
@@ -546,7 +547,6 @@ settings.wiki_delete_notices_1=- To usunie i wyłączy wiki dla %s
 | 
			
		||||
settings.delete=Usuń to repozytorium
 | 
			
		||||
settings.delete_desc=Po usunięciu repozytorium nie ma odwrotu. Upewnij się, że tego chcesz.
 | 
			
		||||
settings.delete_notices_1=- Ta operacja <strong>NIE MOŻE</strong> zostać cofnięta.
 | 
			
		||||
settings.delete_notices_fork_1=Wszystkie forki staną się niezależne po usunięciu.
 | 
			
		||||
settings.transfer_owner=Nowy właściciel
 | 
			
		||||
settings.make_transfer=Przenieś
 | 
			
		||||
settings.confirm_delete=Potwierdź usunięcie
 | 
			
		||||
@@ -630,7 +630,6 @@ release.ahead=<strong>%d</strong> commitów w %s od tego wydania
 | 
			
		||||
release.source_code=Kod źródłowy
 | 
			
		||||
release.tag_name=Nazwa tagu
 | 
			
		||||
release.target=Cel
 | 
			
		||||
release.tag_helper=Wybierz istniejący tag, bądź utwórz nowy podczas publikacji.
 | 
			
		||||
release.title=Tytuł
 | 
			
		||||
release.content=Treść
 | 
			
		||||
release.write=Napisz
 | 
			
		||||
@@ -679,7 +678,6 @@ settings.delete_account=Usuń tą organizację
 | 
			
		||||
settings.delete_prompt=Organizacja zostanie trwale usunięta, a to <strong>NIE MOŻE</strong> być cofnięte!
 | 
			
		||||
settings.confirm_delete_account=Potwierdź usunięcie
 | 
			
		||||
settings.delete_org_title=Usunięcie organizacji
 | 
			
		||||
settings.hooks_desc=Dodaj webhooki, uruchamiane dla <strong>wszystkich repozytoriów</strong> w tej organizacji.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Widoczność członkostwa:
 | 
			
		||||
members.public=Publiczne
 | 
			
		||||
@@ -708,7 +706,6 @@ teams.update_settings=Aktualizuj ustawienia
 | 
			
		||||
teams.delete_team=Usuń ten zespół
 | 
			
		||||
teams.add_team_member=Dodaj członka zespołu
 | 
			
		||||
teams.delete_team_title=Usuwanie zespołu
 | 
			
		||||
teams.delete_team_desc=Ten zespół zostanie usunięty, czy na pewno chcesz kontynuować? Jego członkowie mogą utracić dostęp do części repozytoriów.
 | 
			
		||||
teams.read_permission_desc=Ten zespół daje dostęp do <strong>odczytu</strong>: członkowie mogą wyświetlać i klonować repozytoria zespołu.
 | 
			
		||||
teams.write_permission_desc=Ten zespół daje dostęp do <strong>zapisu</strong>: członkowie mogą wyświetlać i wysyłać do repozytoriów zespołu.
 | 
			
		||||
teams.admin_permission_desc=Ten zespół daje dostęp <strong>pełny</strong>: członkowie mogą wyświetlać, wysyłać i dodawać współpracowników do repozytoriów zespołu.
 | 
			
		||||
@@ -824,7 +821,6 @@ auths.smtp_auth=Typ uwierzytelnienia SMTP
 | 
			
		||||
auths.smtphost=Serwer SMTP
 | 
			
		||||
auths.smtpport=Port SMTP
 | 
			
		||||
auths.allowed_domains=Dozwolone domeny
 | 
			
		||||
auths.allowed_domains_helper=Pozostaw puste aby nie ograniczać domen. Wiele domen powinno być oddzielone przecinkami ','.
 | 
			
		||||
auths.enable_tls=Włącz szyfrowanie TLS
 | 
			
		||||
auths.skip_tls_verify=Pomiń weryfikację protokołu TLS
 | 
			
		||||
auths.pam_service_name=Nazwa usługi PAM
 | 
			
		||||
@@ -850,7 +846,6 @@ config.reverse_auth_user=Użytkownik dostarczony przez odwrotne proxy
 | 
			
		||||
 | 
			
		||||
config.ssh_config=Konfiguracja SSH
 | 
			
		||||
config.ssh_enabled=Aktywne
 | 
			
		||||
config.ssh_start_builtin_server=Uruchom serwer wbudowany
 | 
			
		||||
config.ssh_domain=Domena
 | 
			
		||||
config.ssh_listen_port=Port nasłuchu
 | 
			
		||||
config.ssh_root_path=Ścieżka katalogu głównego
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ sign_in_with=Fazer login com
 | 
			
		||||
sign_out=Sair
 | 
			
		||||
sign_up=Cadastrar
 | 
			
		||||
link_account=Conectar Conta
 | 
			
		||||
link_account_signin_or_signup=Faça login para conectar sua conta existente à sua nova conta, ou cadastre-se para uma nova conta
 | 
			
		||||
register=Registrar
 | 
			
		||||
website=Site
 | 
			
		||||
version=Versão
 | 
			
		||||
@@ -45,6 +46,7 @@ your_profile=Seu perfil
 | 
			
		||||
your_starred=Você favoritou
 | 
			
		||||
your_settings=Suas configurações
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Atividades
 | 
			
		||||
pull_requests=Pull requests
 | 
			
		||||
issues=Issues
 | 
			
		||||
@@ -53,6 +55,9 @@ cancel=Cancelar
 | 
			
		||||
 | 
			
		||||
[install]
 | 
			
		||||
install=Instalação
 | 
			
		||||
title=Configuração inicial
 | 
			
		||||
docker_helper=Se você está rodando o Gitea dentro do Docker, por favor leia as <a target="_blank" rel="noopener" href="%s">instruções</a> cuidadosamente antes de alterar qualquer coisa nesta página.
 | 
			
		||||
requite_db_desc=Gitea requer MySQL, PostgreSQL, SQLite3 ou TiDB.
 | 
			
		||||
db_title=Configurações de banco de dados
 | 
			
		||||
db_type=Tipo de banco de dados
 | 
			
		||||
host=Servidor
 | 
			
		||||
@@ -62,13 +67,17 @@ db_name=Nome do banco de dados
 | 
			
		||||
db_helper=Por favor, use InnoDB como Engine e utf8_general_ci como o charset para o MySQL.
 | 
			
		||||
ssl_mode=Modo SSL
 | 
			
		||||
path=Caminho
 | 
			
		||||
sqlite_helper=O caminho do arquivo de banco de dados SQLite3 ou TiDB. <br>Por favor use o caminho absoluto se rodar o Gitea como serviço.
 | 
			
		||||
err_empty_db_path=O Caminho do banco de dados SQLite3 ou TiDB não pode ser vazio.
 | 
			
		||||
err_invalid_tidb_name=Nome do banco de dados TiDB não permite os caracteres "." e "-".
 | 
			
		||||
no_admin_and_disable_registration=Você não pode desabilitar o registro sem criar uma conta de administrador.
 | 
			
		||||
err_empty_admin_password=A senha de administrador não pode ser vazia.
 | 
			
		||||
 | 
			
		||||
general_title=Configurações gerais do aplicativo
 | 
			
		||||
app_name=Nome do aplicativo
 | 
			
		||||
app_name_helper=Você pode colocar o nome de sua organização aqui.
 | 
			
		||||
repo_path=Caminho raíz do repositório
 | 
			
		||||
repo_path_helper=Todos os repositórios remotos do Git serão salvos neste diretório.
 | 
			
		||||
lfs_path=Caminho raiz do LFS
 | 
			
		||||
lfs_path_helper=Os arquivos armazenados com o Git LFS serão armazenados neste diretório. Deixe vazio para desativar o LFS.
 | 
			
		||||
run_user=Usuário da execução
 | 
			
		||||
@@ -76,9 +85,11 @@ run_user_helper=O usuário deve ter acesso ao caminho raiz do repositório e exe
 | 
			
		||||
domain=Domínio
 | 
			
		||||
domain_helper=Isto afeta URLs para o clone via SSH.
 | 
			
		||||
ssh_port=Porta SSH
 | 
			
		||||
ssh_port_helper=Número da porta que seu servidor SSH está usando, deixe vazio para desativar o recurso SSH.
 | 
			
		||||
http_port=Porta HTTP
 | 
			
		||||
http_port_helper=Número da porta em que a aplicação irá executar.
 | 
			
		||||
app_url=URL do aplicativo
 | 
			
		||||
app_url_helper=Isto afeta a URL de clone via HTTP/HTTPS e também algumas notificações por e-mail.
 | 
			
		||||
log_root_path=Caminho do log
 | 
			
		||||
log_root_path_helper=Pasta dos arquivos de log.
 | 
			
		||||
 | 
			
		||||
@@ -86,11 +97,14 @@ optional_title=Configurações opcionais
 | 
			
		||||
email_title=Configurações do serviço de e-mail
 | 
			
		||||
smtp_host=Host SMTP
 | 
			
		||||
smtp_from=De
 | 
			
		||||
smtp_from_helper=Endereço do remetente de e-mails, no formato RFC 5322. Pode ser apenas o endereço de e-mail ou "Nome" <email@example.com>.
 | 
			
		||||
mailer_user=Usuário do envio
 | 
			
		||||
mailer_password=Senha do remetente
 | 
			
		||||
register_confirm=Habilitar confirmação de registro
 | 
			
		||||
mail_notify=Habilitar notificações de e-mail
 | 
			
		||||
server_service_title=Configurações de servidor e outros serviços
 | 
			
		||||
offline_mode=Ativar modo off-line
 | 
			
		||||
offline_mode_popup=Desative o uso de CDNs para que todos os recursos sejam servidos localmente.
 | 
			
		||||
disable_gravatar=Desativar serviço Gravatar
 | 
			
		||||
disable_gravatar_popup=Desabilitar o Gravatar e fontes personalizadas, todos os avatares são enviados por usuários ou padrão.
 | 
			
		||||
federated_avatar_lookup=Habilitar a busca federativa de avatares
 | 
			
		||||
@@ -101,6 +115,7 @@ enable_captcha=Habilitar captcha
 | 
			
		||||
enable_captcha_popup=Obrigar validação por captcha para auto-registro de usuários.
 | 
			
		||||
require_sign_in_view=Obrigar login para a visualização de páginas
 | 
			
		||||
require_sign_in_view_popup=Somente usuários autenticados podem ver todas as páginas, visitantes somente podem entrar ou se cadastrar.
 | 
			
		||||
admin_setting_desc=Você não precisa criar uma conta de administrador agora. O primeiro usuário a se registrar no site automaticamente terá acesso de administrador.
 | 
			
		||||
admin_title=Configurações da conta de administrador
 | 
			
		||||
admin_name=Nome de usuário
 | 
			
		||||
admin_password=Senha
 | 
			
		||||
@@ -108,11 +123,18 @@ confirm_password=Confirmar senha
 | 
			
		||||
admin_email=E-mail do administrador
 | 
			
		||||
install_btn_confirm=Instalar Gitea
 | 
			
		||||
test_git_failed=Falha ao testar o comando 'git': %v
 | 
			
		||||
sqlite3_not_available=Sua versão não suporta SQLite3, por favor faça o download do executável oficial em %s, e NÃO da versão gobuild.
 | 
			
		||||
invalid_db_setting=Configuração de banco de dados inválida: %v
 | 
			
		||||
invalid_repo_path=A raiz do repositório é inválida: %v
 | 
			
		||||
run_user_not_match=O usuário configurado não é o mesmo que está executando o aplicativo no momento: %s -> %s
 | 
			
		||||
save_config_failed=Falha ao salvar a configuração: %v
 | 
			
		||||
invalid_admin_setting=Configuração da conta de administrador está inválida: %v
 | 
			
		||||
install_success=Bem-vindo! Obrigado por escolher o Gitea. Divirta-se!
 | 
			
		||||
invalid_log_root_path=Pasta raíz do log é inválida: %v
 | 
			
		||||
default_keep_email_private=Valor padrão para manter o e-mail privado
 | 
			
		||||
default_keep_email_private_popup=Esse é o valor padrão para a visibilidade do endereço de e-mail do usuário. Se definido como true, o endereço de e-mail de todos os novos usuários será ocultado até que o usuário altere sua configuração.
 | 
			
		||||
default_allow_create_organization=Permissão para que novos usuários possam criar organizações por padrão
 | 
			
		||||
default_allow_create_organization_popup=Este é o valor de permissão padrão que será atribuído à novos usuários. Se ativado, novos usuários poderão criar organizações.
 | 
			
		||||
no_reply_address=Endereço de sem resposta
 | 
			
		||||
no_reply_address_helper=Domínio para o endereço de e-mail do usuário nos registros do git se ele mantiver seu endereço de e-mail privado. Por exemplo. O usuário 'joe' e 'noreply.example.org' será 'joe@noreply.example.org'
 | 
			
		||||
 | 
			
		||||
@@ -121,6 +143,7 @@ uname_holder=Nome de usuário ou e-mail
 | 
			
		||||
password_holder=Senha
 | 
			
		||||
switch_dashboard_context=Trocar contexto do painel de controle
 | 
			
		||||
my_repos=Meus repositórios
 | 
			
		||||
show_more_repos=Mostrar mais repositórios...
 | 
			
		||||
collaborative_repos=Repositórios colaborativos
 | 
			
		||||
my_orgs=Minhas organizações
 | 
			
		||||
my_mirrors=Meus mirrors
 | 
			
		||||
@@ -134,9 +157,14 @@ repos=Repositórios
 | 
			
		||||
users=Usuários
 | 
			
		||||
organizations=Organizações
 | 
			
		||||
search=Pesquisar
 | 
			
		||||
repo_no_results=Nenhum repositório correspondente foi encontrado.
 | 
			
		||||
user_no_results=Nenhum usuário correspondente foi encontrado.
 | 
			
		||||
org_no_results=Nenhuma organização correspondente foi encontrada.
 | 
			
		||||
 | 
			
		||||
[auth]
 | 
			
		||||
create_new_account=Criar conta
 | 
			
		||||
register_helper_msg=Já tem uma conta? Entre agora!
 | 
			
		||||
social_register_helper_msg=Já tem uma conta? Entre agora!
 | 
			
		||||
disable_register_prompt=Desculpe, novos registros estão desabilitados. Por favor entre em contato com o administrador do site.
 | 
			
		||||
disable_register_mail=Desculpe, a confirmação de registro por e-mail foi desabilitada.
 | 
			
		||||
remember_me=Lembrar de mim
 | 
			
		||||
@@ -149,7 +177,10 @@ prohibit_login_desc=Sua conta foi proibida de fazer login, por favor contate o a
 | 
			
		||||
resent_limit_prompt=Desculpe, você já requisitou um e-mail de ativação recentemente. Por favor, espere 3 minutos para tentar novamente.
 | 
			
		||||
has_unconfirmed_mail=Oi %s, você possui um endereço de e-mail não confirmado (<b>%s</b>). Se você não recebeu um e-mail de confirmação ou precisa reenviar um novo, clique no botão abaixo.
 | 
			
		||||
resend_mail=Clique aqui para reenviar seu e-mail de ativação
 | 
			
		||||
email_not_associate=O endereço de e-mail não está associado à nenhuma conta.
 | 
			
		||||
send_reset_mail=Clique aqui para re-enviar seu e-mail de redefinição de senha
 | 
			
		||||
reset_password=Redefinir sua senha
 | 
			
		||||
invalid_code=Desculpe, seu código de confirmação expirou ou não é válido.
 | 
			
		||||
reset_password_helper=Clique aqui para redefinir sua senha
 | 
			
		||||
password_too_short=O comprimento da senha não pode ser menor que %d.
 | 
			
		||||
non_local_account=Contas não-locais não podem mudar sua senha através da interface web do Gitea.
 | 
			
		||||
@@ -157,6 +188,8 @@ verify=Verificar
 | 
			
		||||
scratch_code=Código de backup
 | 
			
		||||
use_scratch_code=Use um código de backup
 | 
			
		||||
twofa_scratch_used=Você usou seu código de backup. Você foi redirecionado para a página de configurações de dois fatores para que você possa remover a inscrição de seu dispositivo ou gerar um novo código de backup.
 | 
			
		||||
twofa_passcode_incorrect=Seu código de acesso está incorreto. Se você perdeu seu dispositivo, use seu código de backup para fazer login.
 | 
			
		||||
twofa_scratch_token_incorrect=Seu código de backup está incorreto.
 | 
			
		||||
login_userpass=Usuário / Senha
 | 
			
		||||
login_openid=OpenID
 | 
			
		||||
openid_connect_submit=Conectar
 | 
			
		||||
@@ -170,6 +203,7 @@ activate_account=Por favor, ative sua conta
 | 
			
		||||
activate_email=Verifique seu endereço de e-mail
 | 
			
		||||
reset_password=Resetar sua senha
 | 
			
		||||
register_success=Registro bem-sucedido
 | 
			
		||||
register_notify=Bem-vindo ao Gitea
 | 
			
		||||
 | 
			
		||||
[modal]
 | 
			
		||||
yes=Sim
 | 
			
		||||
@@ -207,10 +241,32 @@ email_error=` não é um endereço de e-mail válido.`
 | 
			
		||||
url_error=`não é uma URL válida.`
 | 
			
		||||
include_error=` deve conter '%s'.`
 | 
			
		||||
unknown_error=Erro desconhecido:
 | 
			
		||||
captcha_incorrect=Resposta ao CAPTCHA incorreta.
 | 
			
		||||
password_not_match=As senhas escolhidas não coincidem.
 | 
			
		||||
 | 
			
		||||
username_been_taken=O nome de usuário já está sendo usado.
 | 
			
		||||
repo_name_been_taken=O nome de repositório já está sendo usado.
 | 
			
		||||
org_name_been_taken=O nome da organização já está sendo usado.
 | 
			
		||||
team_name_been_taken=O nome de equipe já está sendo usado.
 | 
			
		||||
email_been_used=O endereço de e-mail já está sendo usado.
 | 
			
		||||
openid_been_used=O endereço OpenID '%s' já está sendo usado.
 | 
			
		||||
username_password_incorrect=Nome de usuário ou senha incorretos.
 | 
			
		||||
enterred_invalid_repo_name=Por favor certifique-se de que o nome do repositório está correto.
 | 
			
		||||
enterred_invalid_owner_name=Por favor certifique-se de que o nome do proprietário está correto.
 | 
			
		||||
enterred_invalid_password=Por favor certifique-se de que a senha está correta.
 | 
			
		||||
user_not_exist=O usuário não existe.
 | 
			
		||||
last_org_owner=Não é permitido remover o último usuário da equipe de proprietários, pois deve haver pelo menos um proprietário em uma organização.
 | 
			
		||||
cannot_add_org_to_team=Uma organização não pode ser adicionada como membro de uma equipe.
 | 
			
		||||
cannot_invite_org_to_org=Uma organização não pode ser convidada a fazer parte de outra organização.
 | 
			
		||||
 | 
			
		||||
invalid_ssh_key=Desculpe, não conseguimos verificar a sua chave SSH: %s
 | 
			
		||||
invalid_gpg_key=Desculpe, não conseguimos verificar a sua chave GPG: %s
 | 
			
		||||
unable_verify_ssh_key=A chave SSH não pôde ser verificada. Por favor cheque se não há nenhum problema com ela.
 | 
			
		||||
auth_failed=A autenticação falhou: %v
 | 
			
		||||
 | 
			
		||||
still_own_repo=Sua conta ainda é proprietária de ao menos um repositório; você tem que excluí-los ou transferi-los primeiro.
 | 
			
		||||
still_has_org=Sua conta ainda é membro de ao menos uma organização. Você precisa deixá-las primeiro.
 | 
			
		||||
org_still_own_repo=Esta organização ainda é proprietária de ao menos um repositório; você tem que excluí-los ou transferi-los primeiro.
 | 
			
		||||
 | 
			
		||||
target_branch_not_exist=O branch de destino não existe.
 | 
			
		||||
 | 
			
		||||
@@ -237,14 +293,19 @@ orgs=Organizações
 | 
			
		||||
delete=Excluir conta
 | 
			
		||||
twofa=Autenticação de dois fatores
 | 
			
		||||
account_link=Contas externas
 | 
			
		||||
organization=Organização
 | 
			
		||||
uid=Uid
 | 
			
		||||
 | 
			
		||||
public_profile=Perfil público
 | 
			
		||||
profile_desc=Seu endereço de e-mail é publico e será usado para quaisquer notificações relacionadas à sua conta, além de operações pela interface web do Gitea.
 | 
			
		||||
password_username_disabled=Usuários não-locais não podem alterar seus nomes de usuário. Por favor contate o administrador do sistema para mais informações.
 | 
			
		||||
full_name=Nome completo
 | 
			
		||||
website=Site
 | 
			
		||||
location=Localização
 | 
			
		||||
update_profile=Atualizar o perfil
 | 
			
		||||
update_profile_success=Seu perfil foi atualizado.
 | 
			
		||||
change_username=Nome de usuário alterado
 | 
			
		||||
change_username_prompt=Esta mudança vai alterar os links para sua conta.
 | 
			
		||||
continue=Continuar
 | 
			
		||||
cancel=Cancelar
 | 
			
		||||
 | 
			
		||||
@@ -260,6 +321,7 @@ change_password=Mudança de senha
 | 
			
		||||
old_password=Senha Atual
 | 
			
		||||
new_password=Nova senha
 | 
			
		||||
retype_new_password=Digite novamente a nova senha
 | 
			
		||||
password_incorrect=A senha atual está incorreta.
 | 
			
		||||
change_password_success=Sua senha foi alterada com sucesso. Agora você pode fazer login usando sua nova conta.
 | 
			
		||||
password_change_disabled=Usuários não-locais não são permitidos mudar suas senhas pela interface web.
 | 
			
		||||
 | 
			
		||||
@@ -270,6 +332,7 @@ email_desc=Seu endereço de e-mail principal será usado para notificações e o
 | 
			
		||||
primary=Principal
 | 
			
		||||
primary_email=Definir como principal
 | 
			
		||||
delete_email=Excluir
 | 
			
		||||
email_deletion=Excluir e-mail
 | 
			
		||||
email_deletion_success=O e-mail foi excluído com sucesso!
 | 
			
		||||
openid_deletion=Deleção de OpenID
 | 
			
		||||
openid_deletion_success=OpenID foi deletado com sucesso!
 | 
			
		||||
@@ -687,7 +750,6 @@ settings.wiki_delete_notices_1=- Isso irá excluir e desativar a wiki para %s
 | 
			
		||||
settings.delete=Excluir este repositório
 | 
			
		||||
settings.delete_desc=Uma vez que você remova um repositório, não tem volta. Por favor, tenha certeza.
 | 
			
		||||
settings.delete_notices_1=-Esta operação <strong>NÃO PODERÁ</strong> ser desfeita.
 | 
			
		||||
settings.delete_notices_fork_1=-Todos os forks se tornarão independentes após a exclusão.
 | 
			
		||||
settings.transfer_owner=Novo dono
 | 
			
		||||
settings.make_transfer=Fazer transferência
 | 
			
		||||
settings.confirm_delete=Confirmar exclusão
 | 
			
		||||
@@ -794,7 +856,6 @@ release.source_code=Código fonte
 | 
			
		||||
release.new_subheader=Publique lançamentos e gerencie as versões do projeto.
 | 
			
		||||
release.tag_name=Nome da tag
 | 
			
		||||
release.target=Destino
 | 
			
		||||
release.tag_helper=Escolha uma tag existente, ou crie uma nova tag em publicar.
 | 
			
		||||
release.title=Título
 | 
			
		||||
release.content=Conteúdo
 | 
			
		||||
release.write=Escrever
 | 
			
		||||
@@ -815,7 +876,6 @@ release.downloads=Downloads
 | 
			
		||||
branch.delete=Excluir branch %s
 | 
			
		||||
branch.delete_notices_1=- Esta operação <strong>NÃO PODE</strong> ser desfeita.
 | 
			
		||||
branch.deletion_failed=Falha ao excluir branch %s.
 | 
			
		||||
branch.delete_branch_has_new_commits=%s não pode ser deletado porque há novos commit após o merge.
 | 
			
		||||
 | 
			
		||||
[org]
 | 
			
		||||
org_name_holder=Nome da organização
 | 
			
		||||
@@ -849,7 +909,6 @@ settings.delete_account=Excluir esta organização
 | 
			
		||||
settings.delete_prompt=A operação irá excluir esta organização permanentemente, e <strong>NÃO PODERÁ</strong> ser desfeita!
 | 
			
		||||
settings.confirm_delete_account=Confirmar exclusão
 | 
			
		||||
settings.delete_org_title=Exclusão da organização
 | 
			
		||||
settings.hooks_desc=Adicionar webhooks que serão acionados para <strong>todos os repositórios</strong> dessa organização.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Visibilidade da associação:
 | 
			
		||||
members.public=Público
 | 
			
		||||
@@ -880,7 +939,6 @@ teams.update_settings=Atualizar configurações
 | 
			
		||||
teams.delete_team=Excluir esta equipe
 | 
			
		||||
teams.add_team_member=Adicionar membro na equipe
 | 
			
		||||
teams.delete_team_title=Exclusão da equipe
 | 
			
		||||
teams.delete_team_desc=Este equipe será excluída, você quer continuar? Membros desta equipe poderão perder acesso a alguns repositórios.
 | 
			
		||||
teams.read_permission_desc=Essa equipe concede acesso para <strong>Leitura</strong>: membros podem ver e clonar os repositórios da equipe.
 | 
			
		||||
teams.write_permission_desc=Esta equipe concede acesso para <strong>escrita</strong>: Membros podem ler e fazer push para os repositórios da equipe.
 | 
			
		||||
teams.admin_permission_desc=Esta equipe concede acesso de <strong>Administrador</strong>: Membros podem ler, fazer push e adicionar outros colaboradores para os repositórios da equipe.
 | 
			
		||||
@@ -912,11 +970,9 @@ dashboard.operation_switch=Trocar
 | 
			
		||||
dashboard.operation_run=Executar
 | 
			
		||||
dashboard.delete_inactivate_accounts=Excluir todas as contas inativas
 | 
			
		||||
dashboard.delete_repo_archives=Excluir todos os arquivos dos repositórios
 | 
			
		||||
dashboard.delete_missing_repos=Deletar todos os registros de repositórios que não possuem arquivos Git correspondentes
 | 
			
		||||
dashboard.git_gc_repos=Executar a coleção de lixo em todos os repositórios
 | 
			
		||||
dashboard.resync_all_sshkeys=Reescrever arquivo '.ssh/authorized_keys' (para chaves SSH do Gitea)
 | 
			
		||||
dashboard.resync_all_hooks=Resincronizar hooks pre-receive, update e post-receive de todos os repositórios.
 | 
			
		||||
dashboard.reinit_missing_repos=Reinicializar todos os repositórios Git perdidos cujos registros existem
 | 
			
		||||
dashboard.server_uptime=Uptime do Servidor
 | 
			
		||||
dashboard.current_goroutine=Goroutines Atuais
 | 
			
		||||
dashboard.current_memory_usage=Uso de memória atual
 | 
			
		||||
@@ -1010,7 +1066,6 @@ auths.smtp_auth=Tipo de autenticação SMTP
 | 
			
		||||
auths.smtphost=Host SMTP
 | 
			
		||||
auths.smtpport=Porta SMTP
 | 
			
		||||
auths.allowed_domains=Domínios autorizados
 | 
			
		||||
auths.allowed_domains_helper=Deixe em branco para permitir qualquer domínio do host SMTP. Vários domínios devem ser separados por vírgula ','.
 | 
			
		||||
auths.enable_tls=Habilitar Criptografia TLS
 | 
			
		||||
auths.skip_tls_verify=Ignorar verificação de TLS
 | 
			
		||||
auths.pam_service_name=Nome de Serviço PAM
 | 
			
		||||
@@ -1043,7 +1098,6 @@ config.reverse_auth_user=Usuário de autenticação reversa
 | 
			
		||||
 | 
			
		||||
config.ssh_config=Configuração de SSH
 | 
			
		||||
config.ssh_enabled=Habilitado
 | 
			
		||||
config.ssh_start_builtin_server=Iniciar servidor embutido
 | 
			
		||||
config.ssh_domain=Domínio
 | 
			
		||||
config.ssh_port=Porta
 | 
			
		||||
config.ssh_listen_port=Porta de escuta
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,7 @@ mirror=Зеркало
 | 
			
		||||
new_repo=Новый репозиторий
 | 
			
		||||
new_migrate=Новая миграция
 | 
			
		||||
new_mirror=Новое зеркало
 | 
			
		||||
new_fork=Новый форк репозитория
 | 
			
		||||
new_org=Новая организация
 | 
			
		||||
manage_org=Управление организациями
 | 
			
		||||
admin_panel=Панель администратора
 | 
			
		||||
@@ -43,6 +44,11 @@ your_profile=Ваш профиль
 | 
			
		||||
your_starred=Ваше избранное
 | 
			
		||||
your_settings=Ваши настройки
 | 
			
		||||
 | 
			
		||||
all=Все
 | 
			
		||||
sources=Источники
 | 
			
		||||
mirrors=Зеркала
 | 
			
		||||
forks=Ответвления
 | 
			
		||||
 | 
			
		||||
activities=Активность
 | 
			
		||||
pull_requests=Запросы на слияние
 | 
			
		||||
issues=Задачи
 | 
			
		||||
@@ -51,6 +57,7 @@ cancel=Отмена
 | 
			
		||||
 | 
			
		||||
[install]
 | 
			
		||||
install=Установка
 | 
			
		||||
title=Начальная конфигурация
 | 
			
		||||
docker_helper=Если вы запускаете Gitea внутри Docker, пожалуйста прочтите <a target="_blank" rel="noopener" href="%s">эти советы</a> внимательно перед тем как что-либо изменить на этой странице.
 | 
			
		||||
requite_db_desc=Gitea требует MySQL, PostgreSQL, SQLite3 или TiDB.
 | 
			
		||||
db_title=Настройки базы данных
 | 
			
		||||
@@ -68,8 +75,10 @@ err_invalid_tidb_name=Имя базы данных TiDB не может соде
 | 
			
		||||
no_admin_and_disable_registration=Вы не можете отключить регистрацию до создания учетной записи администратора.
 | 
			
		||||
err_empty_admin_password=Пароль администратора не может быть пустым.
 | 
			
		||||
 | 
			
		||||
general_title=Общие параметры приложения
 | 
			
		||||
app_name=Имя приложения
 | 
			
		||||
repo_path=Путь корня репозитория
 | 
			
		||||
repo_path_helper=Все удаленные Git репозиториии будут сохранены в этот каталог.
 | 
			
		||||
lfs_path=Корень LFS
 | 
			
		||||
lfs_path_helper=В этой папке будут храниться файлы, хранящиеся Git LFS. Оставьте пустым, чтобы отключить LFS.
 | 
			
		||||
run_user=Пользователь
 | 
			
		||||
@@ -118,6 +127,7 @@ save_config_failed=Не удалось сохранить конфигураци
 | 
			
		||||
invalid_admin_setting=Указан недопустимый параметр учетной записи администратора: %v
 | 
			
		||||
invalid_log_root_path=Недопустимый путь для логов: %v
 | 
			
		||||
default_keep_email_private_popup=Это значение по умолчанию видимости адреса электронной почты пользователей. Если задано значение true, адрес электронной почты всех новых пользователей будет скрыт до того, как пользователь сам изменит настройки приватности.
 | 
			
		||||
no_reply_address=No-reply адрес
 | 
			
		||||
 | 
			
		||||
[home]
 | 
			
		||||
uname_holder=Имя пользователя или E-mail
 | 
			
		||||
@@ -162,11 +172,16 @@ reset_password_helper=Нажмите здесь, чтобы сбросить с
 | 
			
		||||
password_too_short=Длина пароля не менее %d символов.
 | 
			
		||||
verify=Проверить
 | 
			
		||||
scratch_code=Одноразовый пароль
 | 
			
		||||
login_userpass=Пользователь / пароль
 | 
			
		||||
login_openid=OpenID
 | 
			
		||||
openid_register_title=Создать новый аккаунт
 | 
			
		||||
 | 
			
		||||
[mail]
 | 
			
		||||
activate_account=Пожалуйста активируйте свой аккаунт
 | 
			
		||||
activate_email=Подтвердите адрес своей электронной почты
 | 
			
		||||
reset_password=Восстановите ваш пароль
 | 
			
		||||
register_success=Регистрация прошла успешно
 | 
			
		||||
register_notify=Добро пожаловать на Gitea
 | 
			
		||||
 | 
			
		||||
[modal]
 | 
			
		||||
yes=Да
 | 
			
		||||
@@ -201,8 +216,23 @@ email_error=«не является адресом электронной поч
 | 
			
		||||
url_error=` не является допустимым URL-адресом.`
 | 
			
		||||
include_error=` должен содержать '%s'.`
 | 
			
		||||
unknown_error=Неизвестная ошибка:
 | 
			
		||||
captcha_incorrect=Капча не пройдена.
 | 
			
		||||
 | 
			
		||||
username_been_taken=Имя пользователя уже занято.
 | 
			
		||||
repo_name_been_taken=Имя репозитория уже используется.
 | 
			
		||||
org_name_been_taken=Название организации уже занято.
 | 
			
		||||
team_name_been_taken=Название команды уже занято.
 | 
			
		||||
email_been_used=Адрес электронной почты уже занят.
 | 
			
		||||
openid_been_used=Адрес OpenID '%s' уже используется.
 | 
			
		||||
username_password_incorrect=Неверное имя пользователя или пароль.
 | 
			
		||||
enterred_invalid_repo_name=Пожалуйста, убедитесь, что введено правильное имя репозитория.
 | 
			
		||||
enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное.
 | 
			
		||||
enterred_invalid_password=Убедитесь, что введенный пароль верен.
 | 
			
		||||
user_not_exist=Пользователь не существует.
 | 
			
		||||
last_org_owner=Удаление последнего пользователя из команды владельцев не разрешается, поскольку всегда должен быть по крайней мере один владелец в любой организации.
 | 
			
		||||
 | 
			
		||||
invalid_ssh_key=К сожалению, мы не смогли проверить ваш SSH-ключ: %s
 | 
			
		||||
invalid_gpg_key=К сожалению, мы не смогли проверить ваш GPG-ключ: %s
 | 
			
		||||
auth_failed=Ошибка аутентификации: %v
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -219,16 +249,21 @@ following=Подписан
 | 
			
		||||
follow=Подписаться
 | 
			
		||||
unfollow=Отписаться
 | 
			
		||||
 | 
			
		||||
form.name_reserved=Имя пользователя '%s' зарезервировано.
 | 
			
		||||
form.name_pattern_not_allowed=Шаблон имени пользователя '%s' не допускается.
 | 
			
		||||
 | 
			
		||||
[settings]
 | 
			
		||||
profile=Профиль
 | 
			
		||||
password=Пароль
 | 
			
		||||
avatar=Аватар
 | 
			
		||||
ssh_gpg_keys=SSH / GPG ключи
 | 
			
		||||
social=Учетные записи в соцсетях
 | 
			
		||||
applications=Приложения
 | 
			
		||||
orgs=Организации
 | 
			
		||||
delete=Удалить аккаунт
 | 
			
		||||
twofa=Двухфакторная аутентификация
 | 
			
		||||
account_link=Внешние учетные записи
 | 
			
		||||
organization=Организация
 | 
			
		||||
uid=UID
 | 
			
		||||
 | 
			
		||||
public_profile=Открытый профиль
 | 
			
		||||
@@ -236,7 +271,9 @@ full_name=ФИО
 | 
			
		||||
website=Веб-сайт
 | 
			
		||||
location=Местоположение
 | 
			
		||||
update_profile=Обновить профиль
 | 
			
		||||
update_profile_success=Ваш профиль успешно обновлен.
 | 
			
		||||
change_username=Имя пользователя изменено
 | 
			
		||||
change_username_prompt=Это изменение изменит ссылки на ваш аккаунт.
 | 
			
		||||
continue=Далее
 | 
			
		||||
cancel=Отмена
 | 
			
		||||
 | 
			
		||||
@@ -247,11 +284,13 @@ choose_new_avatar=Выбрать новый аватар
 | 
			
		||||
update_avatar=Обновить настройку аватара
 | 
			
		||||
delete_current_avatar=Удалить текущий аватар
 | 
			
		||||
uploaded_avatar_not_a_image=Загружаемый файл не является изображением.
 | 
			
		||||
update_avatar_success=Настройка вашего аватара обновлена.
 | 
			
		||||
 | 
			
		||||
change_password=Сменить пароль
 | 
			
		||||
old_password=Текущий пароль
 | 
			
		||||
new_password=Новый пароль
 | 
			
		||||
retype_new_password=Подтверждение нового пароля
 | 
			
		||||
password_incorrect=Текущий пароль неправильный.
 | 
			
		||||
 | 
			
		||||
emails=Адреса электронной почты
 | 
			
		||||
manage_emails=Управление адресами электронной почты
 | 
			
		||||
@@ -267,13 +306,26 @@ add_email_success=Новый адрес электронной почты усп
 | 
			
		||||
manage_ssh_keys=Управление SSH ключами
 | 
			
		||||
add_key=Добавить ключ
 | 
			
		||||
add_new_key=Добавить SSH ключ
 | 
			
		||||
add_new_gpg_key=Добавить GPG ключ
 | 
			
		||||
ssh_key_been_used=Этот публичный ключ уже был использован.
 | 
			
		||||
ssh_key_name_used=Публичный ключ с таким же именем уже существует.
 | 
			
		||||
gpg_key_id_used=Публичный GPG ключ с таким же идентификатором уже существует.
 | 
			
		||||
key_id=ИД ключа
 | 
			
		||||
key_name=Имя ключа
 | 
			
		||||
key_content=Содержимое
 | 
			
		||||
delete_key=Удалить
 | 
			
		||||
ssh_key_deletion=Удаление ключа SSH
 | 
			
		||||
ssh_key_deletion_success=SSH ключ был удален.
 | 
			
		||||
gpg_key_deletion_success=GPG ключ был удален.
 | 
			
		||||
add_on=Добавлено
 | 
			
		||||
valid_until=Действителен до
 | 
			
		||||
valid_forever=Действителен навсегда
 | 
			
		||||
last_used=Последний раз использовался
 | 
			
		||||
no_activity=Еще не применялся
 | 
			
		||||
key_state_desc=Этот ключ использовался в течение последних 7 дней
 | 
			
		||||
token_state_desc=Этот токен использовался в течение последних 7 дней
 | 
			
		||||
show_openid=Показывать в профиле
 | 
			
		||||
hide_openid=Скрыть из профиля
 | 
			
		||||
 | 
			
		||||
manage_social=Управление привязанными учетными записями в соцсетях
 | 
			
		||||
unbind=Отвязать
 | 
			
		||||
@@ -622,7 +674,6 @@ settings.wiki_delete_notices_1=-Это будет удалено и отключ
 | 
			
		||||
settings.delete=Удалить этот репозиторий
 | 
			
		||||
settings.delete_desc=Будьте внимательны! Как только вы удалите репозиторий — пути назад не будет.
 | 
			
		||||
settings.delete_notices_1=- Эта операция <strong>НЕ МОЖЕТ</strong> быть отменена.
 | 
			
		||||
settings.delete_notices_fork_1=- Все отвлетвления станут независимыми после удаления.
 | 
			
		||||
settings.transfer_owner=Новый владелец
 | 
			
		||||
settings.make_transfer=Выполнить передачу
 | 
			
		||||
settings.confirm_delete=Подтвердить удаление
 | 
			
		||||
@@ -708,7 +759,6 @@ release.ahead=<strong>%d</strong> коммитов %s начиная с этог
 | 
			
		||||
release.source_code=Исходный код
 | 
			
		||||
release.tag_name=Имя тега
 | 
			
		||||
release.target=Цель
 | 
			
		||||
release.tag_helper=Выберите существующий тег, или создайте новый.
 | 
			
		||||
release.title=Заголовок
 | 
			
		||||
release.content=Содержимое
 | 
			
		||||
release.write=Запись
 | 
			
		||||
@@ -757,7 +807,6 @@ settings.delete_account=Удалить Эту Организацию
 | 
			
		||||
settings.delete_prompt=Это действие безвозвратно удалит эту организацию навсегда.
 | 
			
		||||
settings.confirm_delete_account=Подтвердить удаление
 | 
			
		||||
settings.delete_org_title=Удаление Организации
 | 
			
		||||
settings.hooks_desc=Добавьте автоматическое обновление, который будет вызываться для <strong>всех репозиций</strong> под этой Группой.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Видимость участника команды:
 | 
			
		||||
members.public=Публичный
 | 
			
		||||
@@ -786,7 +835,6 @@ teams.update_settings=Обновить настройки
 | 
			
		||||
teams.delete_team=Удалить эту группу разработки
 | 
			
		||||
teams.add_team_member=Добавление члена группы разработки
 | 
			
		||||
teams.delete_team_title=Удалить группу разработки
 | 
			
		||||
teams.delete_team_desc=Эта команда будет удалена. Вы хотите продолжить? Члены этой группы могут потерять доступ к некоторым репозиториям.
 | 
			
		||||
teams.read_permission_desc=Эта команда предоставляет доступ на <strong>Чтение</strong>: члены могут просматривать и клонировать репозитории команды.
 | 
			
		||||
teams.write_permission_desc=Эта команда предоставляет доступ на <strong>Запись</strong>: члены могут получать и выполнять push команды в репозитории.
 | 
			
		||||
teams.admin_permission_desc=Эта команда дает <strong>административный</strong> доступ: участники могут читать, пушить и добавлять соавторов к ее репозиториям.
 | 
			
		||||
@@ -906,7 +954,6 @@ auths.smtp_auth=Тип аутентификации SMTP
 | 
			
		||||
auths.smtphost=Узел SMTP
 | 
			
		||||
auths.smtpport=SMTP-порт
 | 
			
		||||
auths.allowed_domains=Разрешенные домены
 | 
			
		||||
auths.allowed_domains_helper=Оставьте пустым чтобы не ограничивать домены. Несколько доменов должны быть разделены запятыми ','.
 | 
			
		||||
auths.enable_tls=Включение шифрования TLS
 | 
			
		||||
auths.skip_tls_verify=Пропустить проверку TLS
 | 
			
		||||
auths.pam_service_name=Имя службы PAM
 | 
			
		||||
@@ -934,7 +981,6 @@ config.reverse_auth_user=Заголовок с именем пользовате
 | 
			
		||||
 | 
			
		||||
config.ssh_config=Конфигурация SSH
 | 
			
		||||
config.ssh_enabled=Включено
 | 
			
		||||
config.ssh_start_builtin_server=Запустить встроенный сервер
 | 
			
		||||
config.ssh_domain=Домен
 | 
			
		||||
config.ssh_port=Порт
 | 
			
		||||
config.ssh_listen_port=Прослушиваемый порт
 | 
			
		||||
@@ -967,6 +1013,7 @@ config.active_code_lives=Время жизни кода для активаци
 | 
			
		||||
config.webhook_config=Настройка автоматического обновления репозиции
 | 
			
		||||
config.queue_length=Длина очереди
 | 
			
		||||
config.deliver_timeout=Задержка доставки
 | 
			
		||||
config.skip_tls_verify=Пропустить проверку TLS
 | 
			
		||||
 | 
			
		||||
config.mailer_config=Настройки почты
 | 
			
		||||
config.mailer_enabled=Включено
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ settings=Подешавања
 | 
			
		||||
your_profile=Ваш профил
 | 
			
		||||
your_settings=Ваша подешавања
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Активности
 | 
			
		||||
pull_requests=Захтеви за спајање
 | 
			
		||||
issues=Дискусије
 | 
			
		||||
@@ -551,7 +552,6 @@ settings.wiki_delete_notices_1=- Ова операција је избрисат
 | 
			
		||||
settings.delete=Уклони ово спремиште
 | 
			
		||||
settings.delete_desc=Нећете мочи повратити спремиште после брисања. Молимо вас, будите сигурни.
 | 
			
		||||
settings.delete_notices_1=- Ова операција <strong>НЕЋЕ МОЧИ</strong> бити укинута.
 | 
			
		||||
settings.delete_notices_fork_1=- Сви огранци ће постати независни после уклањање.
 | 
			
		||||
settings.transfer_owner=Нови власник
 | 
			
		||||
settings.make_transfer=Изврши пренос
 | 
			
		||||
settings.confirm_delete=Потврдите брисање
 | 
			
		||||
@@ -637,7 +637,6 @@ release.ahead=<strong>%d</strong> комита на %s почев од овог
 | 
			
		||||
release.source_code=Изворни код
 | 
			
		||||
release.tag_name=Име ознаке
 | 
			
		||||
release.target=Циљ
 | 
			
		||||
release.tag_helper=Изаберите посујућу ознаку, или креирај нову.
 | 
			
		||||
release.title=Наслов
 | 
			
		||||
release.content=Садржај
 | 
			
		||||
release.write=Напиши
 | 
			
		||||
@@ -686,7 +685,6 @@ settings.delete_account=Уклони ову организацију
 | 
			
		||||
settings.delete_prompt=Ова организација ће бото избрисана и операција <strong>НЕ МОЖЕ</strong> бити отказана у будућности!
 | 
			
		||||
settings.confirm_delete_account=Потврди брисање
 | 
			
		||||
settings.delete_org_title=Брисање организација
 | 
			
		||||
settings.hooks_desc=Додајте аутоматско ажурирање, које ће важити за <strong>сва спремишта</strong> под овој организацији.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Видљивост:
 | 
			
		||||
members.public=Јавно
 | 
			
		||||
@@ -715,7 +713,6 @@ teams.update_settings=Примени промене
 | 
			
		||||
teams.delete_team=Уклони овај тим
 | 
			
		||||
teams.add_team_member=Додај члан тиму
 | 
			
		||||
teams.delete_team_title=Уклони тим
 | 
			
		||||
teams.delete_team_desc=Овај потез ће чинити да чланови ове групе ће можта изгубе приступ неким спремиштима. Да ли желите да наставите?
 | 
			
		||||
teams.read_permission_desc=Овај тим даје приступ на <strong>Читање</strong>: чланови могу да виде и да клонира спремишта.
 | 
			
		||||
teams.write_permission_desc=Овај тим даје приступ на <strong>Писање</strong>: чланови могу да виде и врше push операције на спремишта.
 | 
			
		||||
teams.admin_permission_desc=Овај тим даје <strong>администраторки</strong> приступ: чланови могу да виде, врше push операције, и додавају сараднике.
 | 
			
		||||
@@ -833,7 +830,6 @@ auths.smtp_auth=Тип SMTP аутентикације
 | 
			
		||||
auths.smtphost=SMTP хост
 | 
			
		||||
auths.smtpport=SMTP порт
 | 
			
		||||
auths.allowed_domains=Дозвољени домени
 | 
			
		||||
auths.allowed_domains_helper=Оставите празно да не ограничавају домени. Више домена морају да буду одвојени зарезима ','.
 | 
			
		||||
auths.enable_tls=Омогући TLS шифровање
 | 
			
		||||
auths.skip_tls_verify=Прескочи TLS проверу
 | 
			
		||||
auths.pam_service_name=Назив PAM сервиса
 | 
			
		||||
@@ -859,7 +855,6 @@ config.reverse_auth_user=Корисничко име при обрнуту ау
 | 
			
		||||
 | 
			
		||||
config.ssh_config=SSH конфигурација
 | 
			
		||||
config.ssh_enabled=Омогућено
 | 
			
		||||
config.ssh_start_builtin_server=Покрени уграђени сервер
 | 
			
		||||
config.ssh_domain=Домен
 | 
			
		||||
config.ssh_port=Порт
 | 
			
		||||
config.ssh_listen_port=Порт за слушање
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,7 @@ your_profile=Din profil
 | 
			
		||||
your_starred=Dina Stjärnmärkta
 | 
			
		||||
your_settings=Dina inställningar
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Aktiviteter
 | 
			
		||||
pull_requests=Pull förfrågningar
 | 
			
		||||
issues=Problem
 | 
			
		||||
@@ -779,7 +780,6 @@ settings.wiki_deletion_success=Repots wikidata har tagits bort.
 | 
			
		||||
settings.delete=Ta Bort Detta Repo
 | 
			
		||||
settings.delete_desc=När du har tagit bort ett repo så finns det ingen återvändo. Var säker på vad du gör.
 | 
			
		||||
settings.delete_notices_1=- Denna åtgärd kan <strong>INTE</strong> ångras.
 | 
			
		||||
settings.delete_notices_fork_1=- Alla förgreningar kommer bli oberoende efter borttagning.
 | 
			
		||||
settings.transfer_owner=Ny Ägare
 | 
			
		||||
settings.make_transfer=Överför
 | 
			
		||||
settings.confirm_delete=Bekräfta Borttagelsen
 | 
			
		||||
@@ -867,7 +867,6 @@ release.ahead=<strong>%d</strong> ändringar mot %s sedan detta släpp
 | 
			
		||||
release.source_code=Källkod
 | 
			
		||||
release.tag_name=Taggnamn
 | 
			
		||||
release.target=Mål
 | 
			
		||||
release.tag_helper=Välj en befintlig tagg, eller skapa en ny tagg på publicera.
 | 
			
		||||
release.title=Titel
 | 
			
		||||
release.content=Innehåll
 | 
			
		||||
release.write=Skriv
 | 
			
		||||
@@ -926,7 +925,6 @@ settings.delete_account=Tag bort denna organisation
 | 
			
		||||
settings.delete_prompt=Organisationen kommer tas bort permanent, och det går <strong>INTE</strong> att ångra detta!
 | 
			
		||||
settings.confirm_delete_account=Bekräfta borttagning
 | 
			
		||||
settings.delete_org_title=Organisation borttagen
 | 
			
		||||
settings.hooks_desc=Lägg till webbkrokar som triggas för <strong>alla förråd</strong> under denna organisation.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Synlighet för medlemskap:
 | 
			
		||||
members.public=Publik
 | 
			
		||||
@@ -955,7 +953,6 @@ teams.update_settings=Uppdatera inställningar
 | 
			
		||||
teams.delete_team=Ta bort detta team
 | 
			
		||||
teams.add_team_member=Lägg till teammedlem
 | 
			
		||||
teams.delete_team_title=Borttagning av team
 | 
			
		||||
teams.delete_team_desc=Eftersom detta team tas bort kan medlemmar i teamet förlora sin tillgång till visa förråd. Vill du fortsätta?
 | 
			
		||||
teams.read_permission_desc=Medlemskap i detta team ger <strong>läsrättigheter</strong>: medlemmar kan visa och klona teamets förråd.
 | 
			
		||||
teams.write_permission_desc=Medlemskap i detta team ger <strong>skrivrättigheter</strong>: medlemmar kan läsa från och ladda upp till teamets förråd.
 | 
			
		||||
teams.admin_permission_desc=Medlemskap i detta team ger <strong>administratörsrättigheter</strong>: medlemmar kan läsa från, ladda upp till och lägga till deltagare till teamets förråd.
 | 
			
		||||
@@ -1044,7 +1041,6 @@ users.allow_import_local=Detta konto har tillåtelse att importera lokal förrå
 | 
			
		||||
users.allow_create_organization=Detta konto har tillåtelse att skapa organisationer
 | 
			
		||||
users.update_profile=Uppdatera kontoprofil
 | 
			
		||||
users.delete_account=Tag bort detta konto
 | 
			
		||||
users.still_has_org=Detta konto är fortfarande medlem i minst en organisation, du måste lämna eller ta bort organisationen först.
 | 
			
		||||
users.deletion_success=Kontot har tagits bort.
 | 
			
		||||
 | 
			
		||||
orgs.org_manage_panel=Organisationshantering
 | 
			
		||||
@@ -1091,7 +1087,6 @@ auths.smtp_auth=SMTP Autentiseringstyp
 | 
			
		||||
auths.smtphost=SMTP-server
 | 
			
		||||
auths.smtpport=SMTP-port
 | 
			
		||||
auths.allowed_domains=Tillåtna Domäner
 | 
			
		||||
auths.allowed_domains_helper=Lämnas tom för att tillåta alla domäner. Multipla domäner separeras med ett kommatecken ','.
 | 
			
		||||
auths.enable_tls=Aktivera TLS-kryptering
 | 
			
		||||
auths.skip_tls_verify=Skippa verifikation av TLS
 | 
			
		||||
auths.pam_service_name=PAM Tjänstnamn
 | 
			
		||||
@@ -1129,7 +1124,6 @@ config.script_type=Script-typ
 | 
			
		||||
 | 
			
		||||
config.ssh_config=SSH-konfiguration
 | 
			
		||||
config.ssh_enabled=Aktiverad
 | 
			
		||||
config.ssh_start_builtin_server=Starta Inbyggd Server
 | 
			
		||||
config.ssh_domain=Domän
 | 
			
		||||
config.ssh_port=Port
 | 
			
		||||
config.ssh_listen_port=Lyssningsport
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ settings=Ayarlar
 | 
			
		||||
your_profile=Profiliniz
 | 
			
		||||
your_settings=Ayarlarınız
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
activities=Aktiviteler
 | 
			
		||||
pull_requests=Değişiklik İsteği
 | 
			
		||||
issues=Sorunlar
 | 
			
		||||
@@ -498,7 +499,6 @@ settings.wiki_delete_notices_1=- Bu işlem %s için Wiki'yi silecek ve devre dı
 | 
			
		||||
settings.delete=Bu Depoyu Sil
 | 
			
		||||
settings.delete_desc=Bir depoyu bir kez sildiğiniz taktirde geri getiremezsiniz. Lütfen emin olun.
 | 
			
		||||
settings.delete_notices_1=- Bu işlem geri <strong>ALINAMAZ</strong>.
 | 
			
		||||
settings.delete_notices_fork_1=Silme işleminden sonra bütün çatallar bağımsız hale gelir.
 | 
			
		||||
settings.transfer_owner=Yeni Sahip
 | 
			
		||||
settings.make_transfer=Transfer Et
 | 
			
		||||
settings.confirm_delete=Silmeyi Onayla
 | 
			
		||||
@@ -582,7 +582,6 @@ release.ahead=%s son sürümden beri <strong>%d</strong> işleme
 | 
			
		||||
release.source_code=Kaynak Kodu
 | 
			
		||||
release.tag_name=Biçim imi adı
 | 
			
		||||
release.target=Hedef
 | 
			
		||||
release.tag_helper=Var olan bir biçim imi seçin veya yayında yenisini oluşturun.
 | 
			
		||||
release.title=Başlık
 | 
			
		||||
release.content=İçerik
 | 
			
		||||
release.write=Yaz
 | 
			
		||||
@@ -631,7 +630,6 @@ settings.delete_account=Bu Organizasyonu Sil
 | 
			
		||||
settings.delete_prompt=Organizasyon kalıcı olarak kaldırılacaktır ve bu işlem geri <strong>ALINAMAZ</strong>!
 | 
			
		||||
settings.confirm_delete_account=Silmeyi Onaylıyorum
 | 
			
		||||
settings.delete_org_title=Organizasyon Silme
 | 
			
		||||
settings.hooks_desc=Bu organizasyona bağlı <strong>tüm depoları</strong> tetikleyecek bir web isteği oluştur.
 | 
			
		||||
 | 
			
		||||
members.membership_visibility=Üyelik Görünürlüğü:
 | 
			
		||||
members.public=Herkese Açık
 | 
			
		||||
@@ -660,7 +658,6 @@ teams.update_settings=Ayarları Güncelle
 | 
			
		||||
teams.delete_team=Bu Ekibi Sil
 | 
			
		||||
teams.add_team_member=Ekip Üyesi Ekle
 | 
			
		||||
teams.delete_team_title=Takım Silme
 | 
			
		||||
teams.delete_team_desc=Bu takımı silerseniz üyeler bazı depolara olan erişimlerini kaybedebilirler. Devam etmek istiyor musunuz?
 | 
			
		||||
teams.read_permission_desc=Bu takımın yetkilerinden <strong>Okuma</strong> izni: üyeler görüntüleyebilir ve takımın depolarını klonlayabilir.
 | 
			
		||||
teams.write_permission_desc=Bu takımın yetkilerinden <strong>Yazma</strong> izni: üyeler okuyabilir ve takımın depolarına push yapabilir.
 | 
			
		||||
teams.admin_permission_desc=Bu takımın yetkilerinden <strong>Yönetici</strong> izni: üyeler okuyabilir, push yapabilir ve takımın depolarına yeni katkıcılar ekleyebilir.
 | 
			
		||||
@@ -779,7 +776,6 @@ auths.smtp_auth=SMTP Yetkilendirme Türü
 | 
			
		||||
auths.smtphost=SMTP Sunucusu
 | 
			
		||||
auths.smtpport=SMTP Portu
 | 
			
		||||
auths.allowed_domains=İzin Verilen Alan Adları
 | 
			
		||||
auths.allowed_domains_helper=Her alan adını kısıtlamak için burayı boş bırakın. Çoklu alan adları virgülle ',' ayrılmalıdır.
 | 
			
		||||
auths.enable_tls=TLS Şifrelemeyi Aktifleştir
 | 
			
		||||
auths.skip_tls_verify=TLS Doğrulamasını Atla
 | 
			
		||||
auths.pam_service_name=PAM Servis Adı
 | 
			
		||||
@@ -805,7 +801,6 @@ config.reverse_auth_user=Tersine Yetkilendirme Kullanıcısı
 | 
			
		||||
 | 
			
		||||
config.ssh_config=SSH Yapılandırması
 | 
			
		||||
config.ssh_enabled=Aktif
 | 
			
		||||
config.ssh_start_builtin_server=Hazır Sunucuyu Başlat
 | 
			
		||||
config.ssh_domain=Alan Adı
 | 
			
		||||
config.ssh_listen_port=Port'u Dinle
 | 
			
		||||
config.ssh_root_path=Kök Yol
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user