Compare commits

..

165 Commits

Author SHA1 Message Date
Unknwon
6e03f61617 Update .gopmfile 2016-01-30 10:12:23 -05:00
Unknwon
055c1ea02d Merge pull request #2517 from fnkr/issue-2516
Allow modification of a release if Content is empty (fix #2516)
2016-01-30 09:47:37 -05:00
Florian Kaiser
abc5abce30 Allow modification of a release if Content is empty (fix #2516) 2016-01-30 13:39:02 +00:00
Unknwon
112a7cab31 #2497 incorrect error handle for team name 2016-01-29 17:06:14 -05:00
Unknwon
ee814bf8d6 #2491 minor fix for sr on dashboard 2016-01-29 15:28:24 -05:00
Unknwon
a4a23c0268 Merge pull request #2508 from MilesPong/develop
Fixed gravatar url
2016-01-29 05:44:00 -05:00
Unknwon
cd89d387b6 Merge pull request #2509 from 0rax/develop
Update Docker container with Alpine 3.3 & Fix RPi2 build
2016-01-29 05:15:08 -05:00
miles@Oscar
beefc53e59 Using https for gravatar 2016-01-29 13:06:17 +08:00
miles@Oscar
1becf01cfa Fixed gravatar url 2016-01-29 11:05:41 +08:00
Jean-Philippe Roemer
9fbf54ee6b Update Dockerfile.rpi to better match Dockerfile:
- Dockerfile.rpi now uses hypriot/rpi-alpine-scratch as base (build script are available w/ a better maintainer & more updates)
- Dockerfile.rpi updates alpine from v3.2 to v3.3 to be on par with Dockerfile
2016-01-28 21:31:45 +00:00
Jean-Philippe Roemer
12c8953381 Update Dockerfile to update alpine to v3.3 & fix virtual package and repository pinning on RPi
- Dockerfile now uses alpine:3.3 as base
- Dockerfile.rpi now uses v3.3/community repository without pinning
- Go package is no longer fetched using repository pinning
- Fixes problem while using repository pinning & virtual package at the same time
2016-01-28 21:31:45 +00:00
Unknwon
566163ab82 Merge pull request #2502 from bkcsoft/fix/split-view-diff
Split view fixed
2016-01-28 10:11:45 -05:00
Unknwon
e2dde6eb0a Record error when fail to health check repository 2016-01-28 06:46:25 -05:00
Unknwon
b900150b1d Update locales 2016-01-28 06:15:49 -05:00
Unknwon
4deb876343 Minor fix for #2494
- Change tooltip size from mini to tiny in profile page
2016-01-28 06:07:16 -05:00
Unknwon
0617720c0c Merge pull request #2494 from mhartkorn/pullreq-name-change
Change user name in Pull Requests to avoid errors (fixes #2495)
2016-01-28 05:58:37 -05:00
Unknwon
9b8ad01bc0 Merge pull request #2493 from andreynering/fix-2489
Refactoring of inline diff computing to prevent empty diff box.
2016-01-28 05:33:27 -05:00
Kim "BKC" Carlbäcker
96dee1c354 Split view fixed 2016-01-27 23:52:42 +01:00
Martin Hartkorn
674c5c37be Change user name in Pull Requests 2016-01-27 22:45:03 +01:00
Andrey Nering
5deb726f3f Refactoring of inline diff computing to prevent empty diff box. Fix #2489 2016-01-27 18:54:08 -02:00
Unknwon
8eb0577791 Merge pull request #2492 from SarenCurrie/patch-1
Fix grammar in deploy key section
2016-01-27 15:46:51 -05:00
Unknwon
93f40995b3 Merge pull request #2483 from bkcsoft/fix/mysql-webhook-url-length
Fixed Webhook URL-length Issue #2465
2016-01-27 04:04:01 -05:00
Saren Currie
646e90d833 Fix grammar in deploy key section 2016-01-27 15:32:47 +13:00
Kim "BKC" Carlbäcker
edc414c584 Fixed Webhook URL-length Issue #2465 2016-01-27 01:40:35 +01:00
Unknwon
a849ac0164 Merge pull request #2446 from jgsqware/develop
Add Docker Volume from 1.9
2016-01-26 13:45:24 -05:00
Unknwon
ab0ba4bbae Merge pull request #2425 from andreynering/make-test
Add command to run the test suite in Makefile.
2016-01-26 03:14:19 -05:00
Unknwon
86f841dd71 Merge pull request #2433 from xxxtonixxx/develop
To add spanish translation to home template
2016-01-26 03:11:54 -05:00
Unknwon
e3075865e4 Merge pull request #2480 from andreynering/fix-2462
Compute inline diff for pull request view, too. Fix #2462
2016-01-26 03:07:47 -05:00
Unknwon
3509f1f610 Merge pull request #2475 from 0rax/develop
Update Dockerfile & build script and add /etc/nsswitch.conf
2016-01-26 02:32:40 -05:00
Unknwon
7ca1821725 fix #2416 2016-01-26 02:00:16 -05:00
Andrey Nering
ee5d6fb025 Compute inline diff for pull request view, too. Fix #2462 2016-01-25 20:56:27 -02:00
Unknwon
1372cab35a Merge pull request #2445 from bkcsoft/feature/fix-2442
Admins are allowed to create repos for arbitrary Orgs
2016-01-25 15:11:56 -05:00
Unknwon
e33ddac9bf Minor fix for #2396 2016-01-25 14:04:46 -05:00
Unknwon
71b9537393 Merge pull request #2396 from bkcsoft/feature/markdown-checklist
[Feature] Markdown Checklist-rendering
2016-01-25 13:56:13 -05:00
Unknwon
b33abc6280 Merge pull request #2432 from nd/develop
Fix #2431 - handle requests waiting for reply
2016-01-25 13:16:32 -05:00
Jean-Philippe Roemer
9032bd097b Update Dockerfile & build script and add /etc/nsswitch.conf:
- Add nsswitch.conf to configure LibC Name Service inside the container
- Change my email in the Dockerfile
- Update build script to install software as a `build-deps` virtual package so that adding a package to it will be automatically	removed at the end of the build script
2016-01-25 13:07:37 +00:00
Unknwon
38efa72146 Update locales 2016-01-25 02:33:52 -05:00
Unknwon
4ae7e64e2a Merge pull request #2467 from pdan/patch-1
Fixed forgotten err variable assignment
2016-01-25 02:33:09 -05:00
Pourya Daneshvar
863ff19e1f Fixed forgotten err variable assignment 2016-01-24 10:24:21 +03:30
juliengarcia
eb14fbf95f Add Docker Volume from 1.9 2016-01-20 16:54:38 +01:00
Kim "BKC" Carlbäcker
a3eab8185d Admins are allowed to create repos for arbitrary Orgs 2016-01-20 14:46:45 +01:00
Toni Villena
1105a3139f Add es-ES to home template 2016-01-18 17:49:17 +01:00
Dmitry Neverov
fb99d50fa1 Fix #2431 - handle requests waiting for reply
According to the docs [1], the Reply method must be called for all
requests where WantReply is true. This fixes a hanging java ssh
implementation (jsch) which sets WantReply flag and waits for reply from
the server.

[1] https://godoc.org/golang.org/x/crypto/ssh#Request.Reply
2016-01-18 16:54:10 +01:00
Andrey Nering
b8d0367a6c Add command to run the test suite in Makefile. 2016-01-16 16:13:54 -02:00
Unknwon
7ef9a05588 #2179 use Go sub-repo ssh to verify public key content 2016-01-15 18:39:51 +08:00
Unknwon
c631a4a9b9 URL fix for #2287 2016-01-15 18:00:39 +08:00
Unknwon
dccfadf7b8 hide section with user has no organizations 2016-01-14 21:29:25 +08:00
Unknwon
d1675c2701 fix CSS of branch dropdown when view commits under revision 2016-01-14 21:27:36 +08:00
Unknwon
29b07693dd minor fix to #2383
- add tooltip for organization name in profile
2016-01-14 21:21:56 +08:00
Unknwon
f75b5f4287 Merge pull request #2383 from exmex/develop
Added organization display on profile
2016-01-14 21:07:17 +08:00
ExMex
40413c5c6c Added improvement from Unknwon 2016-01-14 11:48:24 +01:00
Unknwon
a72f57374d Merge pull request #2403 from ddelpero/master
Update repo.go
2016-01-14 14:55:45 +08:00
Unknwon
98306a5d8a Merge pull request #2399 from nanoant/patch/osx-launchd-script
OS X launchd script
2016-01-14 14:42:55 +08:00
Unknwon
cb92af4a6c Merge pull request #2398 from nanoant/patch/fix-refurl-arg
commit.RefUrl expects AppUrl argument
2016-01-14 14:41:13 +08:00
Unknwon
ae2c6d42fd Merge pull request #2393 from sapk/fix-issue-2375
Correction for issue #2375
2016-01-14 14:32:32 +08:00
Unknwon
ab89be33a9 fix #2385 2016-01-14 14:28:07 +08:00
Kim "BKC" Carlbäcker
a1a4f1103c Made Sanitizer-setup cleaner 2016-01-14 03:00:05 +01:00
Adam Strzelecki
653e1506ad OS X launchd script
Using this script:

1. Copy scripts/launchd/io.gogs.web.plist into /Library/LaunchDaemons

2. The script assumes Gogs is running under 'gogs' user and group, modify
   /Library/LaunchDaemons/io.gogs.web.plist if you want to user different user.

3. The script assumes Gogs is installed in /Users/git/gogs, modify
   /Library/LaunchDaemons/io.gogs.web.plist if you installed Gogs in different
   location.

4. Once you are sure that running Gogs manually via `gogs web` works fine, run
   it as a launchd service with:

       sudo launchctl load -F /Library/LaunchDaemons/io.gogs.web.plist

From now on launchd will ensure Gogs is running, eg. when system is restarted.
2016-01-13 19:32:07 +01:00
Adam Strzelecki
41fdaabcf7 commit.RefUrl expects AppUrl argument
This is fixup for ea375c0dcc. The bug was not
visible because commit.RefUrl was always returning empty url due regression
described in https://github.com/gogits/git-module/pull/4
2016-01-13 19:09:50 +01:00
Kim "BKC" Carlbäcker
8e09e03127 Checklist-rendering implemented 2016-01-13 13:25:52 +01:00
Antoine GIRARD
688fc515f8 Fix username display in lower-cased for comment in Dashboard 2016-01-12 21:30:14 +01:00
ExMex
53a63de9dc Added links to org profile icons 2016-01-12 03:19:46 +01:00
ExMex
f610bfa8a2 Added organization display on profile
Fixed "Follower" Icon too big
2016-01-12 03:09:59 +01:00
Unknwon
fc4a4d38d1 Merge pull request #2381 from philippechataignon/develop
Add fr-FR to home template
2016-01-11 23:59:45 +08:00
Philippe Chataignon
939d96813c Add fr-FR to home template 2016-01-11 13:55:52 +01:00
Unknwon
f43cc90841 #2287 Truncate repository name if too long 2016-01-11 20:41:43 +08:00
Unknwon
a2ef9a2b64 update locale 2016-01-11 18:30:44 +08:00
Unknwon
c199703e2a #2349 fix convert type 2016-01-11 15:47:23 +08:00
Unknwon
db719abff2 stop compile bindata for TRANSLATORS
- update required version of git-module for #2373
2016-01-11 15:01:38 +08:00
Unknwon
91bab801aa #2349 try to handle []int8 case 2016-01-11 14:34:32 +08:00
Unknwon
17c4400b12 Merge pull request #2374 from l2dy/develop
Minor fix (extra space)
2016-01-10 17:36:07 +08:00
l2dy
efa0e7b27a Minor fix 2016-01-10 17:29:33 +08:00
Unknwon
cd966787f3 Merge pull request #2369 from koenwtje/fix-freebsd-init-script
Fix status command in FreeBSD init script
2016-01-10 13:28:24 +08:00
Unknwon
e2f0587ca3 Merge pull request #2370 from andreynering/fix-tests
Fix test case after 86bce4a2ae.
2016-01-10 13:19:24 +08:00
Andrey Nering
9620f48ed0 Fix test case after 86bce4a2ae. 2016-01-09 17:05:21 -02:00
Koen Wilde
4db0e1d340 Fix status command in FreeBSD init script
If the init script is called with `status`, the rc.subr(8) routines check if
the first argument associated with the pid in the pidfile is equal to
`procname`. By default, `procname` is equal to the value of `command`. In our
case, `command` contains a space (i.e. has multiple arguments), so `procname`
can never be equal to the first argument of the command associated with the
pid.

Set `procname` to the first argument of `command` to fix the `status` command
of the init script.
2016-01-09 13:31:45 +01:00
Unknwon
8a93113192 roll back a small change 2016-01-09 15:04:28 +08:00
Unknwon
86bce4a2ae minor fix to #2335 2016-01-09 14:51:17 +08:00
Unknwon
21d7b5acaf fix #2367 2016-01-09 14:45:06 +08:00
Unknwon
bcf6aed452 Merge pull request #2335 from andreynering/highlight-diff
Highlight diff
2016-01-09 13:39:18 +08:00
Unknwon
4331d1d2a0 require token for list my orgs 2016-01-09 13:32:19 +08:00
Unknwon
62edc5c59a fix cannot show user public ssh keys 2016-01-09 13:28:05 +08:00
Unknwon
cc8c67ff29 fix markdown autolink error 2016-01-09 10:59:04 +08:00
Andrey Nering
697b0e2aba Fix: now highlights in diff view are getting the correct lines. 2016-01-08 16:33:27 -02:00
Unknwon
03427fb005 fix #2360 2016-01-08 08:49:03 +08:00
ddelpero
7655337a1f Update repo.go
Release download file name doesn't include tag number #2339
Download: Changed to use refName instead of commit.ID for downloaded file name
2016-01-07 14:28:38 -06:00
Andrey Nering
bf11ad19ea Semantic fixes. 2016-01-07 11:27:35 -02:00
Unknwon
e0f0f72a36 #2345 disallow access of some pages for empty repo 2016-01-07 11:07:17 +08:00
Unknwon
ca35ddd078 fix #2350 2016-01-07 09:24:19 +08:00
Unknwon
f4309bbb05 Merge pull request #2352 from zhuharev/develop
typo fix
2016-01-07 09:22:41 +08:00
Unknwon
6dc407c7d9 Merge pull request #2347 from ivanmarban/develop
Remove RSA1 keys as only SSH version 2 is used
2016-01-07 09:11:10 +08:00
Andrey Nering
81ed5c4bee Declaring specific types for enums constants.
This makes the code more strict since you can't assign or compare
values of different types without proper cast.
2016-01-06 18:00:40 -02:00
Andrey Nering
73474c043b Highlighting differences of lines in the diff view. 2016-01-06 17:46:56 -02:00
zhuharev
0d5dc8a064 typo fix 2016-01-06 22:41:42 +03:00
Unknwon
0cb7396840 update locale 2016-01-06 18:44:57 +08:00
Ivan Marban
4ea75dfcbe Remove RSA1 keys as only SSH version 2 is used 2016-01-06 10:26:37 +01:00
Unknwon
cc22c8a1ae update dep lib version requirement 2016-01-06 13:34:34 +08:00
Unknwon
2481fe2f56 Merge pull request #2296 from bkcsoft/feature/split-diff
Implement Split Diff-View
2016-01-06 13:31:36 +08:00
Kim "BKC" Carlbäcker
2087156119 Removed opticon-fold 2016-01-06 02:21:20 +01:00
Kim "BKC" Carlbäcker
3870a7a3c8 merged split/unified templates 2016-01-06 00:08:50 +01:00
Unknwon
19c234db39 Merge pull request #2336 from andreynering/scroll-always-visible
Making scroll always visible.
2016-01-06 04:57:14 +08:00
Kim "BKC" Carlbäcker
8fe5d887ae Changed name from inline to unified 2016-01-05 19:21:50 +01:00
Kim "BKC" Carlbäcker
4e6d048ba1 i18n-fix for split-view 2016-01-05 19:21:49 +01:00
Kim "BKC" Carlbäcker
0df39b33eb Implement Split Diff-View
- Unified/Inline Diff-View Selectable
2016-01-05 19:21:41 +01:00
Unknwon
7392b6a755 fix #2327 2016-01-05 12:43:19 +08:00
Andrey Nering
cb8134da52 Making scroll always visible. 2016-01-04 16:38:10 -02:00
Unknwon
590637246b Merge pull request #2323 from ggramlich/develop
Update s6 path in Dockerfile.rpi
2016-01-02 15:24:30 -06:00
Gregor Gramlich
053d1424b2 Update s6 path in Dockerfile.rpi
Apply the change from 0cbf56855a to the Dockerfile.rpi as well
2016-01-02 11:02:33 +01:00
Unknwon
4993ab1a76 #2185 fall back to use custom chardet lib 2015-12-31 22:13:47 -05:00
Unknwon
a62290de52 #2311 improve HTTP auth error message 2015-12-30 21:29:30 -05:00
Unknwon
8d58e06ad8 more fix on #2268 2015-12-30 18:47:32 -05:00
Unknwon
b8fbf6559d Merge pull request #2294 from joaopms/patch-1
Fix the description on head.tmpl
2015-12-27 17:28:25 -05:00
Unknwon
44637f03cc #2282 fast detection of utf-8 2015-12-27 17:02:36 -05:00
João Pedro
7bab3d682f Lowercase "Service" 2015-12-27 18:53:52 +00:00
João Pedro
34f01aab5e Update head.tmpl 2015-12-27 18:44:18 +00:00
Unknwon
240fe07287 #2273 URL consistency on webhook payload 2015-12-25 07:11:58 -05:00
Unknwon
93f03707a7 #2283 set text/plain for non-binary files in raw mode 2015-12-25 05:45:07 -05:00
Unknwon
85af36332b #2282 fix utf-8 recognized as windows-1252 2015-12-25 05:25:47 -05:00
Unknwon
13fe733037 #2264 use monospaced font for commit IDs in news feeds 2015-12-24 20:43:45 -05:00
Unknwon
4c896bb620 Merge pull request #2270 from novaeye/develop
PR for fix #2268
2015-12-24 10:30:24 -05:00
Unknwon
157d868254 Merge pull request #2262 from angus-g/fixes/user-following-migration
Add default for NumFollowing field (fixes #2261)
2015-12-24 10:13:13 -05:00
Unknwon
e16042010e Merge pull request #2257 from Jofkos/patch-1
Wiki pages containing question marks in their name weren't loading
2015-12-24 10:00:03 -05:00
novaeye
227dcc3cb9 fix #2268 2015-12-23 17:50:14 +08:00
Angus Gibson
e914969e4c Add default for NumFollowing field (fixes #2261)
We set the default value for the non-NULL field NumFollowing of the User
model to 0, which stops an error when the ORM tries to sync.
2015-12-22 11:09:28 +11:00
Unknwon
a49af93faf #1692 APIs: Users Followers
- User profile un/follow
- List user's followers/following
2015-12-21 04:24:11 -08:00
Jofkos
76d4af891f Removed empty line, multi return args 2015-12-20 21:13:12 +01:00
Jofkos
0721095944 Wiki pages containing question marks in their name weren't loading
(untested)
2015-12-20 18:02:54 +01:00
Unknwon
c62a6b7a12 #2014 allow switch branches between two orgs in compose PR 2015-12-20 01:06:54 -05:00
Unknwon
cadf03db68 #2180 fix avatar link when disable gravatar 2015-12-19 22:21:00 -05:00
Unknwon
5ff6eedf5e #2251 fix button name 2015-12-19 22:07:06 -05:00
Unknwon
53eb37d529 fix #1436 2015-12-19 21:43:32 -05:00
Unknwon
3bcdb3855c #2250 Use HTTP/HTTPS as default clone option 2015-12-19 21:12:13 -05:00
Unknwon
f00fef0cd0 #2251 show commits count in PR tabs 2015-12-19 21:09:03 -05:00
Unknwon
2d3ecbe5b2 make mailer log more verbose 2015-12-19 02:44:34 -05:00
Unknwon
09c981846b update locales 2015-12-18 07:54:44 -05:00
Unknwon
037a01c4e4 fix #2189 2015-12-18 05:49:28 -05:00
Unknwon
1d95844d55 prepare release 2015-12-18 00:54:27 -05:00
Unknwon
1c9dd11ba7 #1692 API: admin create repo 2015-12-17 22:57:41 -05:00
Unknwon
1e7e092992 #2103 Ability to map extensions for syntax highlighting in config 2015-12-17 22:31:34 -05:00
Unknwon
33a99d587a fix #2223 2015-12-17 21:57:34 -05:00
Unknwon
9cd16c5b12 #1692 add organization APIs 2015-12-17 02:28:47 -05:00
Unknwon
6673dcb038 #2103 #2181 improvments of highlight class name 2015-12-16 22:13:12 -05:00
Unknwon
71142929cc Merge pull request #2218 from xxxtonixxx/patch-2
Minor typo in en-US locale
2015-12-16 19:28:42 -05:00
Toni
d7b924f17d Minor typo in en-US locale
metadata*
2015-12-16 22:52:38 +01:00
Unknwon
b117befc2b #1692 add user email APIs 2015-12-15 22:57:18 -05:00
Unknwon
7786cb76f3 fix #2205 2015-12-15 21:32:17 -05:00
Unknwon
eb918c2368 fix only admin can view milestone desc 2015-12-15 21:25:38 -05:00
Unknwon
8ecbf0f16d fix #2204 2015-12-15 19:42:20 -05:00
Unknwon
b13caa23d9 Merge pull request #2203 from xxxtonixxx/patch-1
Minor typo in en-US locale
2015-12-15 18:52:23 -05:00
Toni
fd79fad2ec Fix typo
take*
2015-12-16 00:31:28 +01:00
Unknwon
19423957b1 rename import path 2015-12-15 17:25:45 -05:00
Unknwon
3362b3a44f fix possible disclosure 2015-12-14 17:06:54 -05:00
Unknwon
50264200f0 fix huge diff hangs 2015-12-14 09:38:21 -05:00
Unknwon
7436ce6403 emojify.js: ignore_emoticons 2015-12-14 06:04:24 -05:00
Unknwon
91789930bc #2176 fix 500 on /watchers & /stars for pg 2015-12-14 02:40:23 -05:00
Unknwon
ea375c0dcc new template func 2015-12-13 23:16:58 -05:00
Unknwon
7509fa2c33 improve get commits performance 2015-12-13 22:58:12 -05:00
Unknwon
acdb4d8bdd Drop Go 1.3 support 2015-12-13 20:20:52 -05:00
Unknwon
95f9c85bcc #2185 use Go sub-repo to detect encoding 2015-12-13 19:56:33 -05:00
Unknwon
79dcd7ee6e #2167 able to identify git version on Windows 2015-12-13 18:20:39 -05:00
Unknwon
ed001d70e4 #2171 fix wiki preview does not work on Firefox 2015-12-13 17:55:13 -05:00
Unknwon
42a8c15ad0 Merge pull request #2169 from bclermont/develop
Ignore invalid env for SSH Server (OSX fix)
2015-12-13 07:21:45 -05:00
Bruno
9a27e5ccdc ignore invalid env 2015-12-13 20:17:47 +08:00
Unknwon
71123c816d update hightlight.js 2015-12-13 00:58:30 -05:00
Unknwon
168c69273f fix #1720 2015-12-13 00:46:28 -05:00
138 changed files with 2931 additions and 1573 deletions

View File

@@ -13,7 +13,7 @@ watch_dirs = [
watch_exts = [".go"]
build_delay = 1500
cmds = [
["go", "install", "-race"], # sqlite redis memcache cert pam tidb
["go", "install", "-v", "-race"], # sqlite redis memcache cert pam tidb
["go", "build", "-race"],
["./gogs", "web"]
]

View File

@@ -2,8 +2,8 @@
path = github.com/gogits/gogs
[deps]
github.com/bradfitz/gomemcache = commit:72a68649ba
github.com/codegangsta/cli = commit:b5232bb
github.com/bradfitz/gomemcache = commit:fb1f79c
github.com/codegangsta/cli = commit:cf1f63a
github.com/go-macaron/binding = commit:2502aaf
github.com/go-macaron/cache = commit:5617353
github.com/go-macaron/captcha = commit:8aa5919
@@ -12,38 +12,39 @@ github.com/go-macaron/gzip = commit:4938e9b
github.com/go-macaron/i18n = commit:d2d3329
github.com/go-macaron/inject = commit:c5ab7bf
github.com/go-macaron/session = commit:66031fc
github.com/go-macaron/toolbox = commit:ab30a81
github.com/go-sql-driver/mysql = commit:d512f20
github.com/go-xorm/core = commit:acb6f00
github.com/go-xorm/xorm = commit:a8fba4d
github.com/go-macaron/toolbox = commit:82b5115
github.com/go-sql-driver/mysql = commit:b4db83c
github.com/go-xorm/core = commit:1e2868c
github.com/go-xorm/xorm = commit:24c1f3c
github.com/gogits/chardet = commit:2404f77725
github.com/gogits/git-shell = commit:1ffc4bc
github.com/gogits/go-gogs-client = commit:4b541fa
github.com/gogits/git-module = commit:3c8c495
github.com/gogits/go-gogs-client = commit:2f4342d
github.com/issue9/identicon = commit:f8c0d2c
github.com/kardianos/minwinsvc = commit:cad6b2b
github.com/klauspost/compress = commit:42eb574
github.com/klauspost/cpuid = commit:eebb3ea
github.com/klauspost/crc32 = commit:0aff1ea
github.com/lib/pq = commit:11fc39a
github.com/mattn/go-sqlite3 = commit:5651a9d
github.com/klauspost/compress = commit:91e7b09
github.com/klauspost/cpuid = commit:349c675
github.com/klauspost/crc32 = commit:999f312
github.com/lib/pq = commit:8ad2b29
github.com/mattn/go-sqlite3 = commit:0cc1174
github.com/mcuadros/go-version = commit:d52711f
github.com/microcosm-cc/bluemonday = commit:4ac6f27
github.com/msteinert/pam = commit:02ccfbf
github.com/nfnt/resize = commit:dc93e1b98c
github.com/russross/blackfriday = commit:d18b67a
github.com/nfnt/resize = commit:4d93a29
github.com/russross/blackfriday = commit:006144a
github.com/sergi/go-diff = commit:ec7fdbb
github.com/shurcooL/sanitized_anchor_name = commit:10ef21a
github.com/Unknwon/cae = commit:7f5e046
github.com/Unknwon/com = commit:28b053d
github.com/Unknwon/i18n = commit:3b48b66
github.com/Unknwon/paginater = commit:7748a72
golang.org/x/net = commit:d75b190
golang.org/x/text = commit:458f474
golang.org/x/crypto = commit:7b85b09
golang.org/x/net = commit:04b9de9
golang.org/x/text = commit:6fc2e00
golang.org/x/crypto = commit:1f22c01
gopkg.in/asn1-ber.v1 = commit:4e86f43
gopkg.in/gomail.v2 = commit:fbb71dd
gopkg.in/ini.v1 = commit:a4e5487
gopkg.in/ini.v1 = commit:afbd495
gopkg.in/ldap.v2 = commit:e9a325d
gopkg.in/macaron.v1 = commit:1c6dd87
gopkg.in/macaron.v1 = commit:564f398
gopkg.in/redis.v2 = commit:e617904962
[res]

View File

@@ -1,7 +1,6 @@
language: go
go:
- 1.3
- 1.4
- 1.5

View File

@@ -1,10 +1,9 @@
FROM alpine:3.2
MAINTAINER roemer.jp@gmail.com
FROM alpine:3.3
MAINTAINER jp@roemer.im
# Install system utils & Gogs runtime dependencies
ADD https://github.com/tianon/gosu/releases/download/1.6/gosu-amd64 /usr/sbin/gosu
RUN echo "@edge http://dl-4.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories \
&& echo "@community http://dl-4.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories \
&& apk -U --no-progress upgrade \
&& apk -U --no-progress add ca-certificates bash git linux-pam s6@edge curl openssh socat \
&& chmod +x /usr/sbin/gosu
@@ -15,6 +14,9 @@ COPY . /app/gogs/
WORKDIR /app/gogs/
RUN ./docker/build.sh
# Configure LibC Name Service
COPY docker/nsswitch.conf /etc/nsswitch.conf
# Configure Docker Container
VOLUME ["/data"]
EXPOSE 22 3000

View File

@@ -1,10 +1,11 @@
FROM sander85/rpi-alpine:latest
MAINTAINER roemer.jp@gmail.com, raxetul@gmail.com
FROM hypriot/rpi-alpine-scratch:v3.2
MAINTAINER jp@roemer.im, raxetul@gmail.com
# Install system utils & Gogs runtime dependencies
ADD https://github.com/tianon/gosu/releases/download/1.6/gosu-armhf /usr/sbin/gosu
RUN echo "@edge http://dl-4.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories \
&& echo "@community http://dl-4.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories \
RUN echo "http://dl-4.alpinelinux.org/alpine/v3.3/main/" | tee /etc/apk/repositories \
&& echo "http://dl-4.alpinelinux.org/alpine/v3.3/community/" | tee -a /etc/apk/repositories \
&& echo "@edge http://dl-4.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories \
&& apk -U --no-progress upgrade \
&& apk -U --no-progress add ca-certificates bash git linux-pam s6@edge curl openssh socat \
&& chmod +x /usr/sbin/gosu
@@ -15,8 +16,11 @@ COPY . /app/gogs/
WORKDIR /app/gogs/
RUN ./docker/build.sh
# Configure LibC Name Service
COPY docker/nsswitch.conf /etc/nsswitch.conf
# Configure Docker Container
VOLUME ["/data"]
EXPOSE 22 3000
ENTRYPOINT ["docker/start.sh"]
CMD ["/usr/bin/s6-svscan", "/app/gogs/docker/s6/"]
CMD ["/bin/s6-svscan", "/app/gogs/docker/s6/"]

View File

@@ -16,7 +16,7 @@ NOW = $(shell date -u '+%Y%m%d%I%M%S')
.IGNORE: public/css/gogs.css
build: $(GENERATED)
go install -ldflags '$(LDFLAGS)' -tags '$(TAGS)'
go install -v -ldflags '$(LDFLAGS)' -tags '$(TAGS)'
cp '$(GOPATH)/bin/gogs' .
govet:
@@ -34,7 +34,7 @@ release: build pack
bindata: modules/bindata/bindata.go
modules/bindata/bindata.go: $(DATA_FILES)
go-bindata -o=$@ -ignore="\\.DS_Store|README.md" -pkg=bindata conf/...
go-bindata -o=$@ -ignore="\\.DS_Store|README.md|TRANSLATORS" -pkg=bindata conf/...
less: public/css/gogs.css
@@ -46,3 +46,6 @@ clean:
clean-mac: clean
find . -name ".DS_Store" -print0 | xargs -0 rm
test:
go test ./...

View File

@@ -3,7 +3,7 @@ Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?bra
![](https://github.com/gogits/gogs/blob/master/public/img/gogs-large-resize.png?raw=true)
##### Current version: 0.8.0
##### Current version: 0.8.25
| Web | UI | Preview |
|:-------------:|:-------:|:-------:|
@@ -82,10 +82,11 @@ There are 5 ways to install Gogs:
- [阿里云上 Ubuntu 14.04 64 位安装 Gogs](http://my.oschina.net/luyao/blog/375654) (Chinese)
- [Installing Gogs on FreeBSD](https://www.codejam.info/2015/03/installing-gogs-on-freebsd.html)
- [Gogs on Raspberry Pi](http://blog.meinside.pe.kr/Gogs-on-Raspberry-Pi/)
- [Cloudflare Full SSL with GOGS (Go Git Service) using NGINX](http://www.listekconsulting.com/articles/cloudflare-full-ssl-with-gogs-go-git-service-using-nginx/)
### Screencasts
- [Instalando Gogs no Ubuntu](http://blog.linuxpro.com.br/2015/08/14/instalando-gogs-no-ubuntu/) (Português)
- [Instalando Gogs no Ubuntu](https://www.youtube.com/watch?v=4UkHAR1F7ZA) (Português)
### Deploy to Cloud
@@ -101,6 +102,9 @@ There are 5 ways to install Gogs:
- [Drone](https://github.com/drone/drone) (CI)
- [Fabric8](http://fabric8.io/) (DevOps)
- [Taiga](https://taiga.io/) (Project Management)
- [Puppet](https://forge.puppetlabs.com/Siteminds/gogs) (IT)
- [Kanboard](http://kanboard.net/plugin/gogs-webhook) (Project Management)
- [BearyChat](https://bearychat.com/) (Team Communication)
### Product Support

View File

@@ -73,6 +73,9 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
- [Drone](https://github.com/drone/drone)CI
- [Fabric8](http://fabric8.io/)DevOps
- [Taiga](https://taiga.io/)(项目管理)
- [Puppet](https://forge.puppetlabs.com/Siteminds/gogs)IT
- [Kanboard](http://kanboard.net/plugin/gogs-webhook)(项目管理)
- [BearyChat](https://bearychat.com/)(团队交流)
### 产品支持

View File

@@ -14,11 +14,10 @@ import (
)
var CmdCert = cli.Command{
Name: "cert",
Usage: "Generate self-signed certificate",
Description: `Generate a self-signed X.509 certificate for a TLS server.
Outputs to 'cert.pem' and 'key.pem' and will overwrite existing files.`,
Action: runCert,
Name: "cert",
Usage: "Generate self-signed certificate",
Description: `Please use build tags "cert" to rebuild Gogs in order to have this ability`,
Action: runCert,
}
func runCert(ctx *cli.Context) {

View File

@@ -17,6 +17,7 @@ import (
"github.com/codegangsta/cli"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/httplib"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting"
@@ -87,7 +88,7 @@ func fail(userMessage, logMessage string, args ...interface{}) {
os.Exit(1)
}
func handleUpdateTask(uuid string, user *models.User, username, reponame string, isWiki bool) {
func handleUpdateTask(uuid string, user, repoUser *models.User, reponame string, isWiki bool) {
task, err := models.GetUpdateTaskByUUID(uuid)
if err != nil {
if models.IsErrUpdateTaskNotExist(err) {
@@ -104,13 +105,13 @@ func handleUpdateTask(uuid string, user *models.User, username, reponame string,
}
if err = models.Update(task.RefName, task.OldCommitID, task.NewCommitID,
user.Name, username, reponame, user.Id); err != nil {
user.Name, repoUser.Name, reponame, user.Id); err != nil {
log.GitLogger.Error(2, "Update: %v", err)
}
// Ask for running deliver hook and test pull request tasks.
reqURL := setting.LocalUrl + username + "/" + reponame + "/tasks/trigger?branch=" +
strings.TrimPrefix(task.RefName, "refs/heads/")
reqURL := setting.LocalURL + repoUser.Name + "/" + reponame + "/tasks/trigger?branch=" +
strings.TrimPrefix(task.RefName, "refs/heads/") + "&secret=" + base.EncodeMD5(repoUser.Salt)
log.GitLogger.Trace("Trigger task: %s", reqURL)
resp, err := httplib.Head(reqURL).SetTLSClientConfig(&tls.Config{
@@ -163,7 +164,7 @@ func runServ(c *cli.Context) {
if models.IsErrUserNotExist(err) {
fail("Repository owner does not exist", "Unregistered owner: %s", username)
}
fail("Internal error", "Failed to get repository owner(%s): %v", username, err)
fail("Internal error", "Failed to get repository owner (%s): %v", username, err)
}
repo, err := models.GetRepositoryByName(repoUser.Id, reponame)
@@ -208,7 +209,7 @@ func runServ(c *cli.Context) {
}
// Check if this deploy key belongs to current repository.
if !models.HasDeployKey(key.ID, repo.ID) {
fail("Key access denied", "Key access denied: %d-%d", key.ID, repo.ID)
fail("Key access denied", "Deploy key access denied: [key_id: %d, repo_id: %d]", key.ID, repo.ID)
}
// Update deploy key activity.
@@ -266,7 +267,7 @@ func runServ(c *cli.Context) {
}
if requestedMode == models.ACCESS_MODE_WRITE {
handleUpdateTask(uuid, user, username, reponame, isWiki)
handleUpdateTask(uuid, user, repoUser, reponame, isWiki)
}
// Update user key activity.

View File

@@ -29,7 +29,8 @@ import (
"gopkg.in/ini.v1"
"gopkg.in/macaron.v1"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/go-gogs-client"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
@@ -88,7 +89,8 @@ func checkVersion() {
{"github.com/go-macaron/toolbox", toolbox.Version, "0.1.0"},
{"gopkg.in/ini.v1", ini.Version, "1.8.4"},
{"gopkg.in/macaron.v1", macaron.Version, "0.8.0"},
{"github.com/gogits/git-shell", git.Version, "0.1.0"},
{"github.com/gogits/git-module", git.Version, "0.2.4"},
{"github.com/gogits/go-gogs-client", gogs.Version, "0.7.2"},
}
for _, c := range checkers {
if !version.Compare(c.Version(), c.Expected, ">=") {
@@ -289,7 +291,13 @@ func runWeb(ctx *cli.Context) {
// ***** END: Admin *****
m.Group("", func() {
m.Get("/:username", user.Profile)
m.Group("/:username", func() {
m.Get("", user.Profile)
m.Get("/followers", user.Followers)
m.Get("/following", user.Following)
m.Get("/stars", user.Stars)
})
m.Get("/attachments/:uuid", func(ctx *middleware.Context) {
attach, err := models.GetAttachmentByUUID(ctx.Params(":uuid"))
if err != nil {
@@ -319,6 +327,10 @@ func runWeb(ctx *cli.Context) {
m.Post("/issues/attachments", repo.UploadIssueAttachment)
}, ignSignIn)
m.Group("/:username", func() {
m.Get("/action/:action", user.Action)
}, reqSignIn)
if macaron.Env == macaron.DEV {
m.Get("/template/*", dev.TemplatePreview)
}
@@ -420,9 +432,8 @@ func runWeb(ctx *cli.Context) {
})
}, reqSignIn, middleware.RepoAssignment(), reqRepoAdmin, middleware.RepoRef())
m.Get("/:username/:reponame/action/:action", reqSignIn, middleware.RepoAssignment(), repo.Action)
m.Group("/:username/:reponame", func() {
m.Get("/action/:action", repo.Action)
m.Group("/issues", func() {
m.Combo("/new", repo.MustEnableIssues).Get(middleware.RepoRef(), repo.NewIssue).
Post(bindIgnErr(auth.CreateIssueForm{}), repo.NewIssuePost)
@@ -464,7 +475,7 @@ func runWeb(ctx *cli.Context) {
m.Combo("/compare/*", repo.MustEnablePulls).Get(repo.CompareAndPullRequest).
Post(bindIgnErr(auth.CreateIssueForm{}), repo.CompareAndPullRequestPost)
}, reqSignIn, middleware.RepoAssignment())
}, reqSignIn, middleware.RepoAssignment(), repo.MustBeNotBare)
m.Group("/:username/:reponame", func() {
m.Group("", func() {
@@ -492,8 +503,8 @@ func runWeb(ctx *cli.Context) {
m.Get("/archive/*", repo.Download)
m.Group("/pulls/:index", func() {
m.Get("/commits", repo.ViewPullCommits)
m.Get("/files", repo.ViewPullFiles)
m.Get("/commits", middleware.RepoRef(), repo.ViewPullCommits)
m.Get("/files", middleware.RepoRef(), repo.ViewPullFiles)
m.Post("/merge", reqRepoAdmin, repo.MergePullRequest)
}, repo.MustEnablePulls)
@@ -502,13 +513,15 @@ func runWeb(ctx *cli.Context) {
m.Get("/raw/*", repo.SingleDownload)
m.Get("/commits/*", repo.RefCommits)
m.Get("/commit/*", repo.Diff)
m.Get("/stars", repo.Stars)
m.Get("/watchers", repo.Watchers)
m.Get("/forks", repo.Forks)
}, middleware.RepoRef())
m.Get("/compare/:before([a-z0-9]{40})...:after([a-z0-9]{40})", repo.CompareDiff)
}, ignSignIn, middleware.RepoAssignment())
}, ignSignIn, middleware.RepoAssignment(), repo.MustBeNotBare)
m.Group("/:username/:reponame", func() {
m.Get("/stars", repo.Stars)
m.Get("/watchers", repo.Watchers)
}, ignSignIn, middleware.RepoAssignment(), middleware.RepoRef())
m.Group("/:username", func() {
m.Group("/:reponame", func() {

View File

@@ -57,11 +57,12 @@ DISABLE_SSH = false
; Whether use builtin SSH server or not.
START_SSH_SERVER = false
SSH_PORT = 22
; Root path of SSH directory
SSH_ROOT_PATH =
; Disable CDN even in "prod" mode
OFFLINE_MODE = false
DISABLE_ROUTER_LOG = false
; Generate steps:
; $ cd path/to/gogs/custom/https
; $ ./gogs cert -ca=true -duration=8760h0m0s -host=myhost.example.com
;
; Or from a .pfx file exported from the Windows certificate store (do
@@ -119,21 +120,9 @@ ENABLE_NOTIFY_MAIL = false
; More detail: https://github.com/gogits/gogs/issues/165
ENABLE_REVERSE_PROXY_AUTHENTICATION = false
ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false
; Do not check minimum key size with corresponding type
DISABLE_MINIMUM_KEY_SIZE_CHECK = false
; Enable captcha validation for registration
ENABLE_CAPTCHA = true
; used to filter keys which are too short
[service.minimum_key_sizes]
ED25519 = 256
ECDSA = 256
NTRU = 1087
MCE = 1702
McE = 1702
RSA = 1024
DSA = 1024
[webhook]
; Hook task queue length
QUEUE_LENGTH = 1000
@@ -339,6 +328,10 @@ pl-PL = pl
bg-BG = bg
it-IT = it
; Extension mapping to highlight class
; e.g. .toml=ini
[highlight.mapping]
[other]
SHOW_FOOTER_BRANDING = false
; Show version information about gogs and go in the footer

View File

@@ -1,39 +0,0 @@
Creative Commons CC0 1.0 Universal
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER.
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.

View File

@@ -1,30 +1,43 @@
# This file lists all PUBLIC individuals having contributed content to the translation.
# Entries are in alphabetical order.
Adam Strzelecki <ono AT java DOT pl>
Adrian Verde <me AT adrianverde DOT com>
Akihiro YAGASAKI <yaggytter AT momiage DOT com>
Aleksejs Grocevs <aleksejs AT grocevs DOT pro>
Aleksey Tarakin <hukendo AT yandex DOT ru>
Alexander Steinhöfer <kontakt AT lx-s DOT de>
Alexandre Magno <alexandre DOT mbm AT gmail DOT com>
Andrey Nering <andrey AT nering DOT com DOT br>
Andrey Solomatin <toadron AT yandex DOT ru>
Antoine GIRARD <sapk AT sapk DOT fr>
Arthur Aslanyan <arthur DOT e DOT aslanyan AT gmail DOT com>
Barış Arda Yılmaz <ardayilmazgamer AT gmail DOT com>
Christoph Kisfeld <christoph DOT kisfeld AT gmail DOT com>
Cysioland
Daniel Speichert <daniel AT speichert DOT pl>
David Yzaguirre <dvdyzag AT gmail DOT com>
Dmitriy Nogay <me AT catwhocode DOT ga>
Ezequiel Gonzalez Rial <gonrial AT gmail DOT com>
Gregor Santner <gdev AT live DOT de>
Hamid Feizabadi <hamidfzm AT gmail DOT com>
Huimin Wang <wanghm2009 AT hotmail DOT co DOT jp>
ilko
ilko <kontact-mr.k AT outlook DOT com">
Ilya Makarov
Juraj Bubniak <contact AT jbub DOT eu>
Lafriks <lafriks AT gmail DOT com>
Lauri Ojansivu <x AT xet7 DOT org>
Luc Stepniewski <luc AT stepniewski DOT fr>
Marc Schiller <marc AT schiller DOT im>
Miguel de la Cruz <miguel AT mcrx DOT me>
Mikhail Burdin <xdshot9000 AT gmail DOT com>
Morten Sørensen <klim8d AT gmail DOT com>
Nakao Takamasa <at.mattenn AT gmail DOT com>
Natan Albuquerque <natanalbuquerque5 AT gmail DOT com>
Odilon Junior <odilon DOT junior93 AT gmail DOT com>
Thomas Fanninger <gogs DOT thomas AT fanninger DOT at>
Tilmann Bach <tilmann AT outlook DOT com>
Toni Villena Jiménez <tonivj5 AT gmail DOT com>
Vladimir Vissoultchev <wqweto AT gmail DOT com>
YJSoft <yjsoft AT yjsoft DOT pe DOT kr>
Łukasz Jan Niemier <lukasz AT niemier DOT pl>

View File

@@ -232,6 +232,8 @@ activity=Публична дейност
followers=Последователи
starred=Харесано
following=Следване
follow=Следване
unfollow=Не следвай
form.name_reserved=Потребителското име '%s' е запазено.
form.name_pattern_not_allowed=Потребителското име '%s' не е допустимо.
@@ -666,6 +668,8 @@ diff.parent=родител
diff.commit=ревизия
diff.data_not_available=Няма данни за разлики.
diff.show_diff_stats=Покажи статистика за разликите
diff.show_split_view=Разделен изглед
diff.show_unified_view=Обединен изглед
diff.stats_desc=променени са <strong>%d файла</strong>, в които са <strong>добавени %d</strong> реда и са <strong>изтрити %d</strong> реда
diff.bin=BIN
diff.view_file=Целия файл

View File

@@ -39,8 +39,8 @@ your_profile=Dein Profil
your_settings=Deine Einstellungen
news_feed=Neuigkeiten
pull_requests=Pull Requests
issues=Issues
pull_requests=Pull-Requests
issues=Tickets
cancel=Abbrechen
@@ -232,6 +232,8 @@ activity=Öffentliche Aktivität
followers=Followers
starred=Markiert
following=Folgt
follow=Folgen
unfollow=Nicht mehr folgen
form.name_reserved=Der Benutzername '%s' ist reserviert.
form.name_pattern_not_allowed=Benutzernamens-Muster "%s" ist nicht zulässig.
@@ -398,11 +400,11 @@ repo_is_empty=Das Repository ist leer, bitte komm später wieder!
code=Code
branch=Branch
tree=Struktur
filter_branch_and_tag=Nach Zweig oder Tag filtern
filter_branch_and_tag=Nach Branch oder Tag filtern
branches=Branches
tags=Tags
issues=Issues
pulls=Pull-Anforderung
pulls=Pull-Request
labels=Label
milestones=Meilensteine
commits=Commits
@@ -666,6 +668,8 @@ 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
diff.stats_desc=<strong> %d geänderte Dateien</strong> mit <strong>%d neuen Zeilen</strong> und <strong>%d gelöschten Zeilen</strong>
diff.bin=BIN
diff.view_file=Datei anzeigen

View File

@@ -203,7 +203,6 @@ repo_name_been_taken = Repository name has already been taken.
org_name_been_taken = Organization name has already been taken.
team_name_been_taken = Team name has already been taken.
email_been_used = Email address has already been used.
illegal_team_name = Team name contains illegal characters.
username_password_incorrect = Username or password is not correct.
enterred_invalid_repo_name = Please make sure that the repository name you entered is correct.
enterred_invalid_owner_name = Please make sure that the owner name you entered is correct.
@@ -217,7 +216,7 @@ auth_failed = Authentication failed: %v
still_own_repo = Your account still has ownership over at least one repository, you have to delete or transfer them first.
still_has_org = Your account still has membership in at least one organization, you have to leave or delete your memberships first.
org_still_own_repo = This organization still have ownership of repository, you have to delete or transfer them first.
org_still_own_repo = This organization still has ownership of repositories, you must delete or transfer them first.
still_own_user = This authentication is still in use by at least one user, please remove them from the authentication and try again.
@@ -230,8 +229,10 @@ join_on = Joined on
repositories = Repositories
activity = Public Activity
followers = Followers
starred = Starred
starred = Starred repositories
following = Following
follow = Follow
unfollow = Unfollow
form.name_reserved = Username '%s' is reserved.
form.name_pattern_not_allowed = Username pattern '%s' is not allowed.
@@ -294,8 +295,8 @@ add_key = Add Key
ssh_desc = This is a list of SSH keys associated with your account. As these keys allow anyone using them to gain access to your repositories, it is highly important that you make sure you recognize them.
ssh_helper = <strong>Don't know how?</strong> Check out GitHub's guide to <a href="%s">create your own SSH keys</a> or solve <a href="%s">common problems</a> you might encounter using SSH.
add_new_key = Add SSH Key
ssh_key_been_used = Public key content has been used.
ssh_key_name_used = Public key with same name has already existed.
ssh_key_been_used = Public key content has been used.
ssh_key_name_used = Public key with same name has already existed.
key_name = Key Name
key_content = Content
add_key_success = New SSH key '%s' has been added successfully!
@@ -523,7 +524,7 @@ milestones.new = New Milestone
milestones.open_tab = %d Open
milestones.close_tab = %d Closed
milestones.closed = Closed %s
milestones.no_due_date = No due date
milestones.no_due_date = No due date
milestones.open = Open
milestones.close = Close
milestones.new_subheader = Create milestones to organize your issues.
@@ -573,7 +574,7 @@ settings.wiki_desc = Enable wiki to allow people write documents
settings.use_external_wiki = Use external wiki
settings.external_wiki_url = External Wiki URL
settings.external_wiki_url_desc = Visitors will be redirected to URL when they click on the tab.
settings.issues_desc = Enable builtin lightweight issue tracker
settings.issues_desc = Enable builtin lightweight issue tracker
settings.use_external_issue_tracker = Use external issue tracker
settings.tracker_url_format = External Issue Tracker URL Format
settings.tracker_url_format_desc = You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
@@ -586,7 +587,7 @@ settings.delete = Delete This Repository
settings.delete_desc = Once you delete a repository, there is no going back. Please be certain.
settings.transfer_notices_1 = - You will lose access if new owner is a individual user.
settings.transfer_notices_2 = - You will conserve access if new owner is an organization and if you're one of the owners.
settings.transfer_form_title = Please enter following information to confirm your operation:
settings.transfer_form_title = Please enter following information to confirm your operation:
settings.delete_notices_1 = - This operation <strong>CANNOT</strong> be undone.
settings.delete_notices_2 = - This operation will permanently delete the everything of this repository, including Git data, issues, comments and accesses of collaborators.
settings.delete_notices_fork_1 = - If this repository is public, all forks will be became independent after deletion.
@@ -610,7 +611,7 @@ settings.webhook_deletion_desc = Delete this webhook will remove its information
settings.webhook_deletion_success = Webhook has been deleted successfully!
settings.webhook.test_delivery = Test Delivery
settings.webhook.test_delivery_desc = Send a fake push event delivery to test your webhook settings
settings.webhook.test_delivery_success = Test webhook has been added to delivery queue. It may taks few seconds before it shows up in the delivery history.
settings.webhook.test_delivery_success = Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history.
settings.webhook.request = Request
settings.webhook.response = Response
settings.webhook.headers = Headers
@@ -650,8 +651,8 @@ settings.slack_domain = Domain
settings.slack_channel = Channel
settings.deploy_keys = Deploy Keys
settings.add_deploy_key = Add Deploy Key
settings.deploy_key_desc = Deploy key only has read-only access. It is not same as personal account SSH keys.
settings.no_deploy_keys = You haven't added any deploy key.
settings.deploy_key_desc = Deploy keys have read-only access. They are not the same as personal account SSH keys.
settings.no_deploy_keys = You haven't added any deploy keys.
settings.title = Title
settings.deploy_key_content = Content
settings.key_been_used = Deploy key content has been used.
@@ -666,6 +667,8 @@ diff.parent = parent
diff.commit = commit
diff.data_not_available = Diff Data Not Available.
diff.show_diff_stats = Show Diff Stats
diff.show_split_view = Split View
diff.show_unified_view = Unified View
diff.stats_desc = <strong> %d changed files</strong> with <strong>%d additions</strong> and <strong>%d deletions</strong>
diff.bin = BIN
diff.view_file = View File
@@ -836,7 +839,7 @@ dashboard.mspan_structures_obtained = MSpan Structures Obtained
dashboard.mcache_structures_usage = MCache Structures Usage
dashboard.mcache_structures_obtained = MCache Structures Obtained
dashboard.profiling_bucket_hash_table_obtained = Profiling Bucket Hash Table Obtained
dashboard.gc_metadata_obtained = GC Metadada Obtained
dashboard.gc_metadata_obtained = GC Metadata Obtained
dashboard.other_system_allocation_obtained = Other System Allocation Obtained
dashboard.next_gc_recycle = Next GC Recycle
dashboard.last_gc_time = Since Last GC Time
@@ -1056,5 +1059,5 @@ raw_minutes = minutes
[dropzone]
default_message = Drop files here or click to upload.
invalid_input_type = You can't upload files of this type.
file_too_big = File size({{filesize}} MB) exceeds maximum size({{maxFilesize}} MB).
file_too_big = File size ({{filesize}} MB) exceeds maximum size ({{maxFilesize}} MB).
remove_file = Remove file

View File

@@ -232,6 +232,8 @@ activity=Actividad pública
followers=Seguidores
starred=Destacados
following=Siguiendo
follow=Seguir
unfollow=Dejar de seguir
form.name_reserved=El usuario '%s' está reservado.
form.name_pattern_not_allowed=El patrón de nombre de usuario '%s' no está permitido.
@@ -243,7 +245,7 @@ ssh_keys=Claves SSH
social=Redes Sociales
applications=Aplicaciones
orgs=Organizaciones
delete=Eliminar Cuenta
delete=Eliminar cuenta
uid=UUID
public_profile=Perfil Público
@@ -281,8 +283,8 @@ email_desc=Tu dirección de correo principal se utilizará para las notificacion
primary=Principal
primary_email=Marcar como principal
delete_email=Eliminar
email_deletion=Eliminación de Correo Electrónico
email_deletion_desc=Al eliminar esta dirección de correo electrónico se eliminará toda la información asociada a esta dirección de correo electrónico. ¿Deseas continuar?
email_deletion=Eliminar correo electrónico
email_deletion_desc=Al eliminar esta dirección de correo electrónico se eliminará toda la información asociada a esta. ¿Deseas continuar?
email_deletion_success=¡El correo electrónico ha sido eliminado correctamente!
add_new_email=Añadir nueva dirección de correo electrónico
add_email=Añadir correo electrónico
@@ -379,7 +381,7 @@ mirror_from=espejo de
forked_from=forked de
fork_from_self=Eres el propietario del repositorio, ¡no puedes hacer fork!
copy_link=Copiar
copy_link_success=Copiado!
copy_link_success=¡Copiado!
copy_link_error=Presione ⌘ + C o Ctrl-C para copiar
copied=Copiado correctamente
unwatch=Dejar de vigilar
@@ -540,7 +542,7 @@ milestones.cancel=Cancelar
milestones.modify=Modificar Milestone
milestones.edit_success=¡Los cambios al milestone '%s' se han guardado con éxito!
milestones.deletion=Borrar milestone
milestones.deletion_desc=El borrado de este milestone eliminará su información y las incidencias asociadas. ¿Desea continuar?
milestones.deletion_desc=Eliminar este Milestone eliminará su información y las incidencias asociadas. ¿Desea continuar?
milestones.deletion_success=¡El milestone ha sido eliminado con éxito!
wiki=Wiki
@@ -566,7 +568,7 @@ settings.hooks=Webhooks
settings.githooks=Git Hooks
settings.basic_settings=Configuración Básica
settings.site=Sitio Oficial
settings.update_settings=Actualizar Configuración
settings.update_settings=Actualizar configuración
settings.change_reponame_prompt=Este cambio afectará a los enlaces al repositorio.
settings.advanced_settings=Ajustes avanzados
settings.wiki_desc=Habilitar la Wiki para que los colaboradores documenten
@@ -576,7 +578,7 @@ settings.external_wiki_url_desc=Los visitantes serán redireccionados a la URL c
settings.issues_desc=Habilitar tracker ligero de incidencias
settings.use_external_issue_tracker=Usar tracker externo de incidencias
settings.tracker_url_format=Formato URL del tracker de incidencias externo
settings.tracker_url_format_desc=Puedes usar las plantillas <code>{user} {repo} {index}</code> para el nombre de usuario, nombre del repositorio e índice del issue.
settings.tracker_url_format_desc=Puedes usar las plantillas <code>{user} {repo} {index}</code> para el nombre de usuario, nombre del repositorio e índice de la incidencia.
settings.pulls_desc=Habilitar Pull Requests para aceptar contribuciones públicas
settings.danger_zone=Zona de Peligro
settings.transfer=Transferir la Propiedad
@@ -597,7 +599,7 @@ settings.update_settings_success=Las opciones del repositorio se han actualizado
settings.transfer_owner=Nuevo Propietario
settings.make_transfer=Transferir
settings.transfer_succeed=La propiedad del repositorio ha sido transferida exitosamente.
settings.confirm_delete=Confirmar Eliminación
settings.confirm_delete=Confirmar eliminación
settings.add_collaborator=Añadir Nuevo Colaborador
settings.add_collaborator_success=Se ha añadido el nuevo colaborador.
settings.remove_collaborator_success=Se ha eliminado el colaborador.
@@ -666,6 +668,8 @@ diff.parent=padre
diff.commit=commit
diff.data_not_available=Los datos del Diff no están disponibles.
diff.show_diff_stats=Mostrar Estadísticas de Diff
diff.show_split_view=Dividir vista
diff.show_unified_view=Unificar vista
diff.stats_desc=Se han <strong>modificado %d ficheros</strong> con <strong>%d adiciones</strong> y <strong>%d borrados</strong>
diff.bin=BIN
diff.view_file=Ver Fichero
@@ -692,10 +696,10 @@ release.prerelease_desc=Esta es una pre-release
release.prerelease_helper=Esta release está marcada como no apta para producción.
release.cancel=Cancelar
release.publish=Publicar Release
release.save_draft=Guardar Borrador
release.save_draft=Guardar borrador
release.edit_release=Editar Release
release.delete_release=Borrar este Release
release.deletion=Eliminación de Release
release.deletion=Eliminar Release
release.deletion_desc=Eliminar este Release eliminará la etiqueta correspondiente. ¿Desea continuar?
release.deletion_success=¡El release ha sido eliminado correctamente!
release.tag_name_already_exist=Ya existe una Release con esta etiqueta.
@@ -728,15 +732,15 @@ settings.options=Opciones
settings.full_name=Nombre Completo
settings.website=Página Web
settings.location=Localización
settings.update_settings=Actualizar Configuración
settings.update_setting_success=La configuración de la Organización se ha actualizado correctamente.
settings.update_settings=Actualizar configuración
settings.update_setting_success=La configuración de la organización se ha actualizado correctamente.
settings.change_orgname_prompt=Este cambio afectará a los enlaces que hacen referencia a la organización.
settings.update_avatar_success=La configuración de avatar de la organización ha sido actualizada con éxito.
settings.delete=Eliminar Organización
settings.delete_account=Eliminar esta Organización
settings.delete=Eliminar organización
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.confirm_delete_account=Confirmar eliminación
settings.delete_org_title=Eliminación de la organización
settings.delete_org_desc=Esta organización se va a eliminar permanentemente, ¿quieres continuar?
settings.hooks_desc=Añadir webhooks que serán ejecutados para <strong>todos los repositorios</strong> de esta organización.
@@ -765,7 +769,7 @@ teams.no_desc=Este equipo no tiene descripción
teams.settings=Configuración
teams.owners_permission_desc=Los propietarios tienen acceso completo a <strong>todos los repositorios</strong> y tienen <strong>derechos de administración</strong> en la organización.
teams.members=Miembros del Equipo
teams.update_settings=Actualizar Configuración
teams.update_settings=Actualizar configuración
teams.delete_team=Borrar este Equipo
teams.add_team_member=Añadir Miembro al Equipo
teams.delete_team_title=Eliminar Equipo
@@ -815,15 +819,15 @@ dashboard.resync_all_sshkeys_success=Todas las claves públicas se han reescrito
dashboard.resync_all_update_hooks=Reescribir todos los hooks de actualización de los repositorios (necesario cuando se modifica la ruta de configuración personalizada)
dashboard.resync_all_update_hooks_success=Todos los hooks de actualización de los repositorios se han reescrito correctamente.
dashboard.server_uptime=Uptime del Servidor
dashboard.current_goroutine=Gorutinas Actuales
dashboard.current_memory_usage=Uso de Memoria Actual
dashboard.server_uptime=Tiempo de actividad del servidor
dashboard.current_goroutine=Gorutinas actuales
dashboard.current_memory_usage=Uso de memoria actual
dashboard.total_memory_allocated=Total de Memoria Reservada
dashboard.memory_obtained=Memoria Obtenida
dashboard.pointer_lookup_times=Tiempos de Búsqueda de Punteros
dashboard.memory_allocate_times=Tiempos de Reserva de Memoria
dashboard.memory_free_times=Tiempos de Liberado de Memoria
dashboard.current_heap_usage=Uso de Heap Actual
dashboard.current_heap_usage=Uso de Heap actual
dashboard.heap_memory_obtained=Memoria de Heap Obtenida
dashboard.heap_memory_idle=Memoria de Heap Inactiva
dashboard.heap_memory_in_use=Memoria de Heap en Uso
@@ -902,7 +906,7 @@ auths.bind_password=Contraseña Bind
auths.bind_password_helper=Advertencia: La contraseña se almacena como texto plano. No utilice una cuenta con privilegios elevados.
auths.user_base=Base de Búsqueda de Usuarios
auths.user_dn=DN de Usuario
auths.attribute_username=Username attribute
auths.attribute_username=Atributo de nombre de usuario
auths.attribute_username_placeholder=Dejar vacío para usar el campo de inicio de sesión como nombre de usuario.
auths.attribute_name=Atributo nombre
auths.attribute_surname=Atributo apellido
@@ -924,9 +928,9 @@ auths.edit=Editar la Configuración de Autenticación
auths.activated=Esta autenticación ha sido activada
auths.new_success=¡La autenticación '%s' ha sido añadida con éxito!
auths.update_success=La configuración de autenticación ha sido actualizada con éxito.
auths.update=Actualizar la Configuración de Autenticación
auths.update=Actualizar la configuración de autenticación
auths.delete=Eliminar Autenticación
auths.delete_auth_title=Borrado de Autenticación
auths.delete_auth_title=Borrado de autenticación
auths.delete_auth_desc=Esta autenticación será eliminada. ¿Deseas continuar?
auths.deletion_success=¡La autenticación ha sido eliminada con éxito!
@@ -938,7 +942,7 @@ config.domain=Dominio
config.offline_mode=Modo Sin Conexión
config.disable_router_log=Deshabilitar Log del Router
config.run_user=Ejecutada como Usuario
config.run_mode=Modo de Ejecución
config.run_mode=Modo de ejecución
config.repo_root_path=Ruta del Repositorio
config.static_file_root_path=Ruta de los Ficheros Estáticos
config.log_file_root_path=Ruta de los Ficheros de Log
@@ -998,10 +1002,10 @@ config.log_mode=Modo del Log
monitor.cron=Tareas de Cron
monitor.name=Nombre
monitor.schedule=Agenda
monitor.next=Próxima Vez
monitor.previous=Vez Anterior
monitor.next=Siguiente
monitor.previous=Anterior
monitor.execute_times=Ejecuciones
monitor.process=Procesos en Ejecución
monitor.process=Procesos en ejecución
monitor.desc=Descripción
monitor.start=Hora de Inicio
monitor.execute_time=Tiempo de ejecución
@@ -1021,7 +1025,7 @@ notices.op=Op.
notices.delete_success=Las notificaciones del sistema han sido eliminadas satisfactoriamente.
[action]
create_repo=repositorio creado <a href="%s">%s</a>
create_repo=creó el repositorio <a href="%s">%s</a>
rename_repo=repositorio renombrado de <code>%[1]s</code> a <a href="%[2]s">%[3]s</a>
commit_repo=hizo push a <a href="%[1]s/src/%[2]s">%[3]s</a> en <a href="%[1]s">%[4]s</a>
create_issue=`incidencia abierta <a href="%s/issues/%s">%s#%[2]s</a>`

View File

@@ -6,9 +6,9 @@ explore=Explorer
help=Aide
sign_in=Connexion
sign_out=Déconnexion
sign_up=Créer un compte
register=Inscription
website=Site Web
sign_up=Inscription
register=S'inscrire
website=Site web
version=Version
page=Page
template=Modèle
@@ -27,9 +27,9 @@ repository=Dépôt
organization=Organisation
mirror=Miroir
new_repo=Nouveau Dépôt
new_migrate=Nouvelle Migration
new_migrate=Nouvelle migration
new_mirror=Nouveau miroir
new_fork=Nouvel embranchement
new_fork=Nouveau Fork
new_org=Nouvelle Organisation
manage_org=Gérer les Organisations
admin_panel=Administration
@@ -57,11 +57,11 @@ title=Instructions pour la première exécution
docker_helper=Si vous exécutez Gogs grâce à Docker, merci de lire la <a target="_blank" href="%s">procédure</a> attentivement avant de modifier quoi que ce soit sur cette page !
requite_db_desc=Gogs requiert MySQL, PostgreSQL, SQLite3 ou TiDB.
db_title=Paramètres de la base de données
db_type=Type de Base de Données
db_type=Type de base de données
host=Hôte
user=Utilisateur
password=Mot De Passe
db_name=Nom de la Base de Données
password=Mot de passe
db_name=Nom de base de données
db_helper=Veuillez utiliser le moteur INNODB avec le jeu de caractères utf8_general_ci pour MySQL.
ssl_mode=Mode SSL
path=Chemin
@@ -72,16 +72,16 @@ no_admin_and_disable_registration=Vous ne pouvez pas désactiver l'enregistremen
err_empty_admin_password=Le mot de passe du compte administrateur ne peut être vide.
general_title=Paramètres Généraux de Gogs
app_name=Nom de l'Application
app_name=Nom de l'application
app_name_helper=Inscrivez fièrement le nom de votre organisation ici !
repo_path=Emplacement Racine du Dépôt
repo_path_helper=Tous les Dépôts Git distants seront sauvegardés ici.
repo_path_helper=Tous les dépôts Git distants seront sauvegardés ici.
run_user=Entrer un Utilisateur
run_user_helper=L'utilisateur doit avoir accès à la Racine du Référentiel et éxécuter Gogs.
run_user_helper=L'utilisateur doit avoir accès à la racine des dépôts et exécuter Gogs.
domain=Domaine
domain_helper=Cela affecte les doublons d'URL SSH.
ssh_port=Port SSH
ssh_port_helper=C'est le numéro de port qui est utilisé par votre serveur SSH, le laisser vide pour désactiver la fonctionnalité.
ssh_port_helper=Numéro de port utilisé par votre serveur SSH, le laisser vide pour désactiver la fonctionnalité.
http_port=Port HTTP
http_port_helper=Numéro de port que l'application écoutera.
app_url=URL de l'Application
@@ -92,14 +92,14 @@ email_title=Paramètres du Service de Messagerie
smtp_host=Hôte SMTP
smtp_from=Provenant de
smtp_from_helper=Adresse de l'expéditeur, RFC 5322. Soit une adresse courriel simple, soit au format "Nom" <email@example.com>.
mailer_user=E-mail de l'Expéditeur
mailer_password=Mot de Passe de l'Expéditeur
register_confirm=Activer la Confirmation d'Enregistrement
mail_notify=Activer la Notification des Mails reçus
mailer_user=E-mail de l'expéditeur
mailer_password=Mot de passe de l'expéditeur
register_confirm=Activer la confirmation de l'inscription
mail_notify=Activer la notification par e-mail
server_service_title=Paramètres du serveur et des autres services
offline_mode=Activer le Mode hors connexion
offline_mode=Activer le mode hors connexion
offline_mode_popup=Désactiver le CDN, même en production. Toutes les ressources seront distribuées en local.
disable_gravatar=Désactiver le Service Gravatar
disable_gravatar=Désactiver le service Gravatar
disable_gravatar_popup=Désactiver Gravatar et les sources personnalisées, tous les avatars sont téléchargés par les utilisateurs ou par défaut.
disable_registration=Désactiver le formulaire d'inscription
disable_registration_popup=Désactiver le formulaire d'inscription, seuls les administrateurs peuvent créer des comptes.
@@ -107,17 +107,17 @@ enable_captcha=Activez le Captcha
enable_captcha_popup=Demande la validation Captcha pour l'auto-enregistrement de l'utilisateur.
require_sign_in_view=Demander une connexion pour afficher des pages
require_sign_in_view_popup=Seules les personnes connectées peuvent voir les pages. Les visiteurs anonymes ne pourront voir que les pages de connexion/enregistrement.
admin_setting_desc=Vous n'avez pas besoin de créer un compte admin. L'utilisateur ayant l'ID = 1 se verra automatiquement attribuer l'accès administrateur.
admin_title=Paramètres du Compte Administrateur
admin_name=Nom d'Utilisateur
admin_password=Mot de Passe
confirm_password=Confirmez le Mot de Passe
admin_setting_desc=Vous n'avez pas besoin de créer un compte administrateur. L'utilisateur ayant l'ID = 1 aura automatiquement accès à l'administration.
admin_title=Paramètres du compte administrateur
admin_name=Nom d'utilisateur
admin_password=Mot de passe
confirm_password=Confirmez le mot de passe
admin_email=E-mail de l'administrateur
install_gogs=Installer Gogs
test_git_failed=Tentative de commande "git" échouée : %v
test_git_failed=Le test de la commande "git" a échoué : %v
sqlite3_not_available=Votre version publiée ne prend pas en charge SQLite3. Veuillez télécharger la version binaire officielle à cette adresse %s.
invalid_db_setting=Paramètres de base de données incorrects : %v
invalid_repo_path=Chemin vers le répertoire racine invalide : %v
invalid_repo_path=Chemin vers la racine du dépôt invalide : %v
run_user_not_match=L'utilisateur entré n'est pas l'utilisateur actuel : %s -> %s
save_config_failed=La sauvegarde de la configuration a échoué : %v
invalid_admin_setting=Paramètres du compte administrateur invalides : %v
@@ -127,7 +127,7 @@ install_success=Bienvenue ! Nous sommes heureux que vous ayez choisi Gogs, amuse
uname_holder=Nom d'Utilisateur ou E-mail
password_holder=Mot de Passe
switch_dashboard_context=Basculer le Contexte du Tableau de Bord
my_repos=Mes Référentiels
my_repos=Mes dépôts
collaborative_repos=Référentiels collaboratifs
my_orgs=Mes Organisations
my_mirrors=Mes Miroirs
@@ -144,7 +144,7 @@ register_hepler_msg=Déjà enregistré ? Connectez-vous !
social_register_hepler_msg=Possesseur d'un compte ? Associez-le !
disable_register_prompt=Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site.
disable_register_mail=Désolé, la Confirmation par Mail des Enregistrements a été désactivée.
remember_me=Se souvenir de Moi
remember_me=Se souvenir de moi
forgot_password=Mot de Passe oublié
forget_password=Mot de Passe oublié ?
sign_up_now=Pas de compte ? Créer maintenant.
@@ -232,6 +232,8 @@ activity=Activités publiques
followers=Abonnés
starred=Votés
following=Abonnements
follow=Suivre
unfollow=Ne plus suivre
form.name_reserved=Le nom '%s' est réservé.
form.name_pattern_not_allowed=Motif '%s' interdit pour les noms d'utilisateur.
@@ -307,7 +309,7 @@ add_on=Ajouté le
last_used=Dernière utilisation le
no_activity=Aucune activité récente
key_state_desc=Cette clé a été utilisée durant les 7 derniers jours
token_state_desc=Cette clé a été utilisée durant les 7 derniers jours
token_state_desc=Ce jeton a été utilisé durant les 7 derniers jours
manage_social=Gérer les réseaux sociaux associés
social_desc=Ceci est la liste des comptes de réseaux sociaux associés. Supprimez ceux que vous ne reconnaissez pas.
@@ -326,24 +328,24 @@ access_token_deletion=Suppression du jeton d'accès
access_token_deletion_desc=Supprimer ce jeton d'accès supprimera tous les accès de l'application. Voulez-vous continuer ?
delete_token_success=Le jeton d'accèsa été supprimé avec succès ! N'oubliez pas de mettre à jour vos applications.
delete_account=Supprimer le Compte
delete_prompt=Votre compte sera supprimé définitivement et cette opération est <strong>IRRÉVERSIBLE</strong> !
delete_account=Supprimer votre compte
delete_prompt=Votre compte sera définitivement supprimé et cette opération est <strong>irréversible</strong> !
confirm_delete_account=Confirmer la suppression
delete_account_title=Suppression de compte
delete_account_desc=Ce compte sera supprimé définitivement. Voulez-vous continuer ?
[repo]
owner=Propriétaire
repo_name=Nom du Référentiel
repo_name=Nom du Dépôt
repo_name_helper=Idéalement, le nom d'un dépot devrait être court, mémorable et <strong>unique</strong>.
visibility=Visibilité
visiblity_helper=Ce dépôt est <span class="ui red text"> privé</span>
visiblity_helper_forced=L'administrateur du site a forcé tous les nouveaux dépôts à être <span class="ui red text">privés</span>
visiblity_fork_helper=(Les changement de cette valeur affecteront tous les embranchements)
clone_helper=Besoin d'aide pour dupliquer ? Visitez <a target="_blank" href="%s">l'aide</a> !
fork_repo=Scinder le dépôt
fork_repo=Créer un fork du dépôt
fork_from=Scission de
fork_visiblity_helper=Un dépôt scindé ne peut pas changer sa visiblité
fork_visiblity_helper=La visibilité d'un fork ne peut pas être modifiée.
repo_desc=Description
repo_lang=Langue
repo_lang_helper=Sélectionnez les fichiers .gitignore
@@ -377,7 +379,7 @@ migrate.failed=Echec de migration: %v
mirror_from=miroir de
forked_from=scindé depuis
fork_from_self=Vous nous ne pouvez pas scinder un dépôt que vous possédez déja !
fork_from_self=Vous ne pouvez pas forker un dépôt que vous possédez déja !
copy_link=Copier
copy_link_success=Copié!
copy_link_error=Appuyez sur ⌘-C ou Ctrl-C pour copier
@@ -392,8 +394,8 @@ no_desc=Aucune description
quick_guide=Introduction rapide
clone_this_repo=Cloner ce dépôt
create_new_repo_command=Créer un nouveau dépôt en ligne de commande
push_exist_repo=Soumettre un référentiel existant via la ligne de commande
repo_is_empty=Ce référentiel est vide, veuillez revenir plus tard !
push_exist_repo=Soumettre un dépôt existant par ligne de commande
repo_is_empty=Ce dépôt est vide, veuillez revenir plus tard !
code=Code
branch=Branche
@@ -405,7 +407,7 @@ issues=Problèmes
pulls=Pull Requests
labels=Etiquettes
milestones=Étapes
commits=Commissions
commits=Commits
releases=Publications
file_raw=Raw
file_history=Historique
@@ -455,8 +457,8 @@ issues.filter_sort.latest=Plus récent
issues.filter_sort.oldest=Plus ancien/ne
issues.filter_sort.recentupdate=Mis à jour récemment
issues.filter_sort.leastupdate=Moins récemment mis à jour
issues.filter_sort.mostcomment=Plus commentés
issues.filter_sort.leastcomment=Moins commenté
issues.filter_sort.mostcomment=Les plus commentés
issues.filter_sort.leastcomment=Les moins commentés
issues.opened_by=Ouvrir %[1]s by <a href="%[2]s">%[3]s</a>
issues.opened_by_fake=ouvert %[1]s par %[2]s
issues.previous=Page Précédente
@@ -464,15 +466,15 @@ issues.next=Page Suivante
issues.open_title=Ouvert
issues.closed_title=Fermé
issues.num_comments=%d commentaires
issues.commented_at='commenté à <a id="%[1]s" href="#%[1]s"> %[2]s'</a>
issues.commented_at=`commenté à <a id="%[1]s" href="#%[1]s"> %[2]s</a>`
issues.no_content=Il n'existe pas encore de contenu.
issues.close_issue=Fermer
issues.close_comment_issue=Commenter et fermer
issues.reopen_issue=Réouvrir
issues.reopen_comment_issue=Commenter et réouvrir
issues.create_comment=Créer un commentaire
issues.closed_at="fermé à <a id="%[1]s"href="#%[1]s"> %[2]s"</a>
issues.reopened_at='réouvert à <a id="%[1]s" href="#%[1]s"> %[2]s'</a>
issues.closed_at=`fermé à <a id="%[1]s"href="#%[1]s"> %[2]s"</a>`
issues.reopened_at=`réouvert à <a id="%[1]s" href="#%[1]s"> %[2]s</a>`
issues.commit_ref_at=`a référencé ce problème à partir d'un commit <a id="%[1]s" href="#%[1]s"> %[2]s</a>`
issues.poster=Publier
issues.admin=Admin
@@ -552,7 +554,7 @@ wiki.filter_page=Filtrer la page
wiki.new_page=Créer une nouvelle page
wiki.default_commit_message=Écrire une note concernant cette mise à jour (optionnel).
wiki.save_page=Enregistrer la page
wiki.last_commit_info=%s modifier cette page %s
wiki.last_commit_info=%s a édité cette page %s
wiki.edit_page_button=Modifier
wiki.new_page_button=Nouvelle Page
wiki.page_already_exists=Une page de wiki avec le même nom existe déjà.
@@ -580,16 +582,16 @@ settings.tracker_url_format_desc=Vous pouvez utiliser l'espace réservé <code>{
settings.pulls_desc=Activer les pull requests pour accepter les contributions publiques
settings.danger_zone=Zone de danger
settings.transfer=Transférer les propriétés
settings.transfer_desc=Transfèrer ce dépôt à un autre utilisateur ou une organisation dont vous possédez des droits d'administrateur.
settings.transfer_desc=Transférer ce dépôt à un autre utilisateur ou une organisation dont vous possédez des droits d'administrateur.
settings.new_owner_has_same_repo=Le nouveau propriétaire a déjà un dépôt nommé ainsi.
settings.delete=Supprimer ce Référentiel
settings.delete=Supprimer ce dépôt
settings.delete_desc=Attention, action irréversible. Soyez sûr de vous.
settings.transfer_notices_1=-Vous perdrez l'accès si le nouveau propriétaire est un utilisateur individuel.
settings.transfer_notices_2=-Vous préserverez l'accès si le nouveau propriétaire est une organisation et si vous y appartenez.
settings.transfer_form_title=Veuillez recopier le texte suivant afin de confirmer votre opération :
settings.delete_notices_1=- Cette opération <strong>ne peut pas </strong> être annulée.
settings.delete_notices_2=-Cette opération supprimera définitivement le dépôt, y compris les données Git, problèmes, commentaires et accès des collaborateurs.
settings.delete_notices_fork_1=-Si ce dépôt est public, tous les embranchements vont devenir indépendants après la suppression.
settings.delete_notices_fork_1=- Si ce dépôt est public, tous les forks vont devenir indépendant après sa suppression.
settings.delete_notices_fork_2=-Si ce dépôt est privé, tous les embranchements seront supprimés en même temps.
settings.delete_notices_fork_3=-Si vous souhaitez conserver tous les embranchements après suppression, veuillez tout d'abord modifier la visibilité de ce dépôt en public.
settings.deletion_success=Le dépôt a été supprimé avec succès!
@@ -666,6 +668,8 @@ diff.parent=Parent
diff.commit=commit
diff.data_not_available=Données Diff indisponibles.
diff.show_diff_stats=Afficher les stats Diff
diff.show_split_view=Vue séparée
diff.show_unified_view=Vue unifiée
diff.stats_desc=<strong> %d fichiers modifiés</strong> avec <strong>%d ajouts</strong> et <strong>%d suppressions</strong>
diff.bin=BIN
diff.view_file=Voir le fichier
@@ -1021,15 +1025,15 @@ notices.op=Opération
notices.delete_success=Notifications système supprimées avec succès.
[action]
create_repo=a crée le dépôt <a href="%s">%s</a>
create_repo=a créé le dépôt <a href="%s">%s</a>
rename_repo=rebaptisé le dépôt de <code>%[1]s</code> à <a href="%[2]s">%[3]s</a>
commit_repo=a soumis à <a href="%[1]s/src/%[2]s">%[3]s</a> chez <a href="%[1]s">%[4]s</a>
commit_repo=a soumis à <a href="%[1]s/src/%[2]s">%[3]s</a> sur <a href="%[1]s">%[4]s</a>
create_issue=`a ouvert un problème <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request=`pull request créée le <a href="%s/pulls/%s">%s#%[2]s</a>`
comment_issue=`a commenté le problème <a href="%s/issues/%s">%s#%[2]s</a>`
merge_pull_request=`pull request fusionné le <a href="%s/pulls/%s">%s#%[2]s</a>`
transfer_repo=a transféré le dépôt <code>%s</code> à <a href="%s">%s</a>
push_tag=a soumis le tag <a href="%s/src/%s">%[2]s</a> à <a href="%[1]s">%[3]s</a>
push_tag=a soumis le tag <a href="%s/src/%s">%[2]s</a> sur <a href="%[1]s">%[3]s</a>
compare_commits=Comparer ces %d commits
[tool]

View File

@@ -28,18 +28,18 @@ organization=Organizzazione
mirror=Mirror
new_repo=Nuovo Repository
new_migrate=Nuova Migrazione
new_mirror=New Mirror
new_mirror=Nuovo Mirror
new_fork=Nuovo Fork Repository
new_org=Nuova organizzazione
manage_org=Gestisci le organizzazioni
admin_panel=Pannello di amministrazione
account_settings=Impostazioni dell'account
settings=Impostazioni
your_profile=Profilo
your_profile=Il tuo profilo
your_settings=Impostazioni
news_feed=Notizie
pull_requests=Pull Requests
pull_requests=Pull Request
issues=Problemi
cancel=Annulla
@@ -232,6 +232,8 @@ activity=Attività pubblica
followers=Seguaci
starred=Votate
following=Seguiti
follow=Segui
unfollow=Non seguire più
form.name_reserved=L'username '%s' è riservato.
form.name_pattern_not_allowed=La struttura del nome utente '%s' non è consentita.
@@ -248,7 +250,7 @@ uid=Uid
public_profile=Profilo pubblico
profile_desc=Il tuo indirizzo e-mail è pubblico e sarà usato per ogni notifica inerente al tuo account, e per qualsiasi operazione web effettuata attraverso il sito.
password_username_disabled=Non-local type users are not allowed to change their username.
password_username_disabled=Gli utenti non locali non possono cambiare il proprio nome utente.
full_name=Nome Completo
website=Sito web
location=Posizione
@@ -273,7 +275,7 @@ new_password=Nuova Password
retype_new_password=Re-inserisci la password
password_incorrect=La Password attuale non è corretta.
change_password_success=La tua password è stata cambiata con successo. Ora puoi accedere usando la nuova password.
password_change_disabled=Non-local type users are not allowed to change their password.
password_change_disabled=Gli utenti non locali non possono cambiare la propria password.
emails=Indirizzi e-mail
manage_emails=Gestisci indirizzi email
@@ -301,7 +303,7 @@ key_content=Contenuto
add_key_success=La nuova chiave SSH '%s' è stata aggiunta con successo!
delete_key=Elimina
ssh_key_deletion=Eliminazione chiave SSH
ssh_key_deletion_desc=Delete this SSH key will remove all related accesses for your account. Do you want to continue?
ssh_key_deletion_desc=Cancellare la chiave SSH rimuoverà tutti i relativi accessi per il tuo account. Vuoi continuare?
ssh_key_deletion_success=La chiave SSH e' stata cancellata con successo!
add_on=Aggiunto il
last_used=Ultimo accesso il
@@ -316,15 +318,15 @@ unbind_success=Account sociale disassociato.
manage_access_token=Gestisci i Token di Accesso Personale
generate_new_token=Genera Nuovo Token
tokens_desc=Tokens you have generated that can be used to access the Gogs APIs.
tokens_desc=I Token che hai generato e che possono essere utilizzati per accedere alle API Gogs.
new_token_desc=Da questo momento, ogni token avrà pieno accesso al tuo account.
token_name=Nome Token
generate_token=Genera Token
generate_token_succees=Nuovo token di accesso generato con successo! Assicurarsi di copiare il nuovo token di accesso personale ora: non sarà possibile visualizzarlo nuovamente!
delete_token=Elimina
access_token_deletion=Eliminazione Token di accesso personale
access_token_deletion_desc=Delete this personal access token will remove all related accesses of application. Do you want to continue?
delete_token_success=Personal access token has been removed successfully! Don't forget to update your application as well.
access_token_deletion_desc=Eliminare questo token di accesso personale rimuoverà tutti i relativi accessi di applicazione. Si desidera continuare?
delete_token_success=Il token di accesso personale è stato eliminato! Non dimenticare di aggiornare anche l'applicazione.
delete_account=Elimina Account
delete_prompt=L'operazione eliminerà permanentemente l'account e <strong>NON POTRÀ</strong> essere annullata!
@@ -337,9 +339,9 @@ owner=Proprietario
repo_name=Nome Repository
repo_name_helper=I migliori nomi dei repository sono brevi, facili da memorizzare e <strong>univoci</strong>.
visibility=Visibilità
visiblity_helper=This repository is <span class="ui red text">Private</span>
visiblity_helper_forced=Site admin has forced all new repositories to be <span class="ui red text">Private</span>
visiblity_fork_helper=(Change of this value will affect all forks)
visiblity_helper=Questo repository è <span class="ui red text"> privato</span>
visiblity_helper_forced=L'amministratore del sito ha deciso che tutti i nuovi repository devono essere <span class="ui red text">privati</span>
visiblity_fork_helper=(La modifica di questo valore avrà effetto su tutti i fork)
clone_helper=Hai bisogno di aiuto per la clonazione? Visita <a target="_blank" href="%s">Aiuto</a>!
fork_repo=Forka Repository
fork_from=Forka da
@@ -351,36 +353,36 @@ license=Licenza
license_helper=Selezionare un file di licenza
readme=Readme
readme_helper=Seleziona un template per il readme
auto_init=Initialize this repository with selected files and template
auto_init=Inizializzare questo repository con i file e il modello selezionati
create_repo=Crea Repository
default_branch=Ramo (Branch) predefinito
mirror_interval=Intervallo Mirror (in ore)
mirror_address=Mirror Address
mirror_address_desc=Please include necessary user credentials in the address.
watchers=Watchers
stargazers=Stargazers
forks=Forks
mirror_address=Indirizzo del mirror
mirror_address_desc=Si prega di includere nell'indirizzo le credenziali utente necessarie.
watchers=Osservatori
stargazers=Fan
forks=Fork
form.reach_limit_of_creation=The owner has reached maximum creation limit of %d repositories.
form.reach_limit_of_creation=Il proprietario ha raggiunto il limite massimo di %d repository creati.
form.name_reserved=Il nome repository %s è riservato.
form.name_pattern_not_allowed=La struttura del nome del repository %s non è consentita.
need_auth=Richiesta di autorizzazione
migrate_type=Tipo di migrazione
migrate_type_helper=This repository will be a <span class="text blue">mirror</span>
migrate_type_helper=Questo repository sarà un <span class="text blue">mirror</span>
migrate_repo=Migra Repository
migrate.clone_address=Duplica Indirizzo
migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL or local server path.
migrate.permission_denied=You are not allowed to import local repositories.
migrate.clone_address_desc=Può essere un URL HTTP/HTTPS/GIT o il percorso del server locale.
migrate.permission_denied=Non è consentito importare repository locali.
migrate.invalid_local_path=Percorso locale non valido, non esiste o non è una cartella.
migrate.failed=Migration failed: %v
migrate.failed=Migrazione non riuscita: %v
mirror_from=mirror from
mirror_from=mirror da
forked_from=forkato da
fork_from_self=Non puoi forkare il tuo stesso repository!
copy_link=Copia
copy_link_success=Copiato!
copy_link_error=Press ⌘-C or Ctrl-C to copy
copy_link_error=Premere ⌘-C o Ctrl-C per copiare
copied=OK copiato
unwatch=Non seguire più
watch=Segui
@@ -393,12 +395,12 @@ quick_guide=Guida rapida
clone_this_repo=Clona questo repository
create_new_repo_command=Crea nuovo repository da riga di comando
push_exist_repo=Push un repo esistente dalla riga di comando
repo_is_empty=This repository is empty, please come back later!
repo_is_empty=Questo repository è vuoto, si prega di tornare più tardi!
code=Code
code=Codice
branch=Ramo (Branch)
tree=Albero (Tree)
filter_branch_and_tag=Filter branch or tag
filter_branch_and_tag=Filtra per branch o tag
branches=Rami (Branch)
tags=Tag
issues=Problemi
@@ -426,62 +428,62 @@ issues.new.labels=Etichette
issues.new.no_label=Nessuna etichetta
issues.new.clear_labels=Pulisci le etichette
issues.new.milestone=Traguardo
issues.new.no_milestone=No Milestone
issues.new.clear_milestone=Clear milestone
issues.new.open_milestone=Open Milestones
issues.new.closed_milestone=Closed Milestones
issues.new.no_milestone=Nessuna milestone
issues.new.clear_milestone=Milestone pulita
issues.new.open_milestone=Apri Milestone
issues.new.closed_milestone=Milestone chiuse
issues.new.assignee=Assegnatario
issues.new.clear_assignee=Clear assignee
issues.new.no_assignee=No assignee
issues.create=Create Issue
issues.new.clear_assignee=Cancella l'assegnatario
issues.new.no_assignee=Nessun assegnatario
issues.create=Crea Problema
issues.new_label=Nuova etichetta
issues.new_label_placeholder=Nome dell'etichetta...
issues.create_label=Create Label
issues.create_label=Crea Etichetta
issues.open_tab=%d Aperti
issues.close_tab=%d Chiusi
issues.filter_label=Etichetta
issues.filter_label_no_select=Nessuna etichetta selezionata
issues.filter_milestone=Traguardo
issues.filter_milestone_no_select=No selected milestone
issues.filter_milestone_no_select=Nessuna Milestone selezionata
issues.filter_assignee=Assegnatario
issues.filter_assginee_no_select=No selected Assignee
issues.filter_assginee_no_select=Nessun Assegnatario selezionato
issues.filter_type=Tipo
issues.filter_type.all_issues=Tutti i problemi
issues.filter_type.assigned_to_you=Assegnati a te
issues.filter_type.created_by_you=Creati da te
issues.filter_type.mentioning_you=Che ti riguardano
issues.filter_sort=Ordina
issues.filter_sort.latest=Newest
issues.filter_sort.oldest=Oldest
issues.filter_sort.recentupdate=Recently updated
issues.filter_sort.leastupdate=Least recently updated
issues.filter_sort.mostcomment=Most commented
issues.filter_sort.leastcomment=Least commented
issues.opened_by=opened %[1]s by <a href="%[2]s">%[3]s</a>
issues.opened_by_fake=opened %[1]s by %[2]s
issues.filter_sort.latest=Più recenti
issues.filter_sort.oldest=Più vecchi
issues.filter_sort.recentupdate=Aggiornati di recente
issues.filter_sort.leastupdate=Aggiornati tempo fa
issues.filter_sort.mostcomment=I più commentati
issues.filter_sort.leastcomment=I meno commentati
issues.opened_by=aperto %[1]s da <a href="/%[2]s">%[3]s</a>
issues.opened_by_fake=aperto %[1]s da %[2]s
issues.previous=Pagina precedente
issues.next=Pagina successiva
issues.open_title=Open
issues.closed_title=Closed
issues.num_comments=%d comments
issues.open_title=Aperto
issues.closed_title=Chiuso
issues.num_comments=%d commenti
issues.commented_at=`commented <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.no_content=There is no content yet.
issues.close_issue=Chiudi
issues.close_comment_issue=Comment and close
issues.reopen_issue=Reopen
issues.reopen_comment_issue=Comment and reopen
issues.close_comment_issue=Commenta e chiudi
issues.reopen_issue=Riapri
issues.reopen_comment_issue=Commenta e riapri
issues.create_comment=Commento
issues.closed_at=`closed <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.reopened_at=`reopened <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.commit_ref_at=`referenced this issue from a commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.poster=Poster
issues.poster=Autore
issues.admin=Amministratore
issues.owner=Proprietario
issues.sign_up_for_free=Registrati gratuitamente
issues.sign_in_require_desc=to join this conversation. Already have an account? <a href="%s">Sign in to comment</a>
issues.edit=Edit
issues.edit=Modifica
issues.cancel=Cancel
issues.save=Save
issues.save=Salva
issues.label_title=Nome etichetta
issues.label_color=Colore etichetta
issues.label_count=%d etichette
@@ -493,33 +495,33 @@ issues.label_deletion=Elimina Etichetta
issues.label_deletion_desc=Eliminare l'etichetta rimuovera le sue informazioni in tutti i problemi correlati. Vuoi continuare?
issues.label_deletion_success=Etichetta eliminata con successo!
pulls.new=New Pull Request
pulls.compare_changes=Compare Changes
pulls.compare_changes_desc=Compare two branches and make a pull request for changes.
pulls.new=Nuova Pull Request
pulls.compare_changes=Confronta le modifiche
pulls.compare_changes_desc=Confronta due branch e fai una pull request per le modifiche.
pulls.compare_base=base
pulls.compare_compare=compare
pulls.compare_compare=confronta
pulls.filter_branch=Filter branch
pulls.no_results=No results found.
pulls.no_results=Nessun risultato trovato.
pulls.nothing_to_compare=There is nothing to compare because base and head branches are even.
pulls.has_pull_request=`There is already a pull request between these two targets: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=Crea Pull Request
pulls.title_desc=wants to merge %[1]d commits from <code>%[2]s</code> into <code>%[3]s</code>
pulls.merged_title_desc=merged %[1]d commits from <code>%[2]s</code> into <code>%[3]s</code> %[4]s
pulls.tab_conversation=Conversation
pulls.tab_conversation=Conversazione
pulls.tab_commits=Commits
pulls.tab_files=Files changed
pulls.reopen_to_merge=Please reopen this pull request to perform merge operation.
pulls.tab_files=File modificati
pulls.reopen_to_merge=Riapri questa pull request per effettuare il merge.
pulls.merged=Merged
pulls.has_merged=This pull request has been merged successfully!
pulls.data_broken=Data of this pull request has been broken due to deletion of fork information.
pulls.is_checking=The conflict checking is still in progress, please refresh page in few moments.
pulls.can_auto_merge_desc=This pull request can be merged automatically.
pulls.cannot_auto_merge_desc=This pull request can't be merged automatically because there are conflicts.
pulls.cannot_auto_merge_helper=Please merge manually in order to resolve the conflicts.
pulls.cannot_auto_merge_helper=Effettua il merge manualmente per risolvere i conflitti.
pulls.merge_pull_request=Unisci Pull Request
pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
milestones.new=New Milestone
milestones.new=Nuova Milestone
milestones.open_tab=%d Open
milestones.close_tab=%d Closed
milestones.closed=Closed %s
@@ -527,37 +529,37 @@ milestones.no_due_date=No due date
milestones.open=Open
milestones.close=Close
milestones.new_subheader=Create milestones to organize your issues.
milestones.create=Create Milestone
milestones.title=Title
milestones.desc=Description
milestones.due_date=Due Date (optional)
milestones.create=Crea Milestone
milestones.title=Titolo
milestones.desc=Descrizione
milestones.due_date=Data di scadenza (opzionale)
milestones.clear=Clear
milestones.invalid_due_date_format=Due date format is invalid, must be 'yyyy-mm-dd'.
milestones.create_success=Milestone '%s' has been created successfully!
milestones.edit=Edit Milestone
milestones.edit_subheader=Use a better description for milestones so people won't be confused.
milestones.cancel=Cancel
milestones.modify=Modify Milestone
milestones.edit_success=Changes of milestone '%s' has been saved successfully!
milestones.deletion=Milestone Deletion
milestones.deletion_desc=Deleting this milestone will remove its information in all related issues. Do you want to continue?
milestones.deletion_success=Milestone has been deleted successfully!
milestones.invalid_due_date_format=Il formato della data di scadenza non è valido, deve essere 'yyyy-mm-dd'.
milestones.create_success=La Milestone '%s' è stata creata con successo!
milestones.edit=Modifica Milestone
milestones.edit_subheader=Scrivi una descrizione della Milestone, così la gente non si confonderà.
milestones.cancel=Annulla
milestones.modify=Modifica Milestone
milestones.edit_success=Le modifiche alla milestone '%s' sono state salvate con successo!
milestones.deletion=Cancellazione Milestone
milestones.deletion_desc=L'eliminazione di questa Milestone rimuoverà le sue informazioni in tutti i problemi correlati. Si desidera continuare?
milestones.deletion_success=La milestone è stata cancellata con successo!
wiki=Wiki
wiki.welcome=Welcome to Wiki!
wiki.welcome_desc=Wiki is the place where you would like to document your project together and make it better.
wiki.create_first_page=Create the first page
wiki.page=Page
wiki.filter_page=Filter page
wiki.new_page=Create New Page
wiki.default_commit_message=Write a note about this update (optional).
wiki.save_page=Save Page
wiki.last_commit_info=%s edited this page %s
wiki.edit_page_button=Edit
wiki.new_page_button=New Page
wiki.page_already_exists=Wiki page with same name already exists.
wiki.pages=Pages
wiki.last_updated=Last updated %s
wiki.welcome=Benvenuto nel Wiki!
wiki.welcome_desc=Wiki è il posto dove puoi documentare collaborativamente il tuo progetto così da renderlo migliore.
wiki.create_first_page=Crea la prima pagina
wiki.page=Pagina
wiki.filter_page=Filtra pagina
wiki.new_page=Crea nuova pagina
wiki.default_commit_message=Scrivere una nota su questo aggiornamento (opzionale).
wiki.save_page=Salva pagina
wiki.last_commit_info=%s ha modificato questa pagina %s
wiki.edit_page_button=Modifica
wiki.new_page_button=Nuova pagina
wiki.page_already_exists=Esiste già una pagina Wiki con questo stesso nome.
wiki.pages=Pagine
wiki.last_updated=Ultimo aggiornamento: %s
settings=Impostazioni
settings.options=Opzioni
@@ -567,14 +569,14 @@ settings.githooks=Git Hooks
settings.basic_settings=Impostazioni di Base
settings.site=Sito Ufficiale
settings.update_settings=Aggiorna Impostazioni
settings.change_reponame_prompt=This change will affect how links relate to the repository.
settings.advanced_settings=Advanced Settings
settings.wiki_desc=Enable wiki to allow people write documents
settings.use_external_wiki=Use external wiki
settings.external_wiki_url=External Wiki URL
settings.external_wiki_url_desc=Visitors will be redirected to URL when they click on the tab.
settings.change_reponame_prompt=Questa modifica influirà i link al repository.
settings.advanced_settings=Opzioni avanzate
settings.wiki_desc=Abilitare il wiki per consentire alle persone di scrivere documenti
settings.use_external_wiki=Usa Wiki esterno
settings.external_wiki_url=URL Wiki esterno
settings.external_wiki_url_desc=I visitatori verranno reindirizzati all'URL quando cliccano sulla scheda.
settings.issues_desc=Enable builtin lightweight issue tracker
settings.use_external_issue_tracker=Use external issue tracker
settings.use_external_issue_tracker=Utilizza gestore di problemi esterno
settings.tracker_url_format=External Issue Tracker URL Format
settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
settings.pulls_desc=Enable pull requests to accept public contributions
@@ -586,13 +588,13 @@ settings.delete=Elimina questo repository
settings.delete_desc=Una volta che hai cancellato il repository, non puoi tornare indietro. Si prega di fare attenzione.
settings.transfer_notices_1=- You will lose access if new owner is a individual user.
settings.transfer_notices_2=- You will conserve access if new owner is an organization and if you're one of the owners.
settings.transfer_form_title=Please enter following information to confirm your operation:
settings.delete_notices_1=- This operation <strong>CANNOT</strong> be undone.
settings.delete_notices_2=- This operation will permanently delete the everything of this repository, including Git data, issues, comments and accesses of collaborators.
settings.delete_notices_fork_1=- If this repository is public, all forks will be became independent after deletion.
settings.delete_notices_fork_2=- If this repository is private, all forks will be removed at the same time.
settings.transfer_form_title=Per favore inserisci le informazioni seguenti per confermare l'operazione:
settings.delete_notices_1=-Questa operazione <strong>NON PUÒ</strong> essere annullata.
settings.delete_notices_2=-Questa operazione eliminerà definitivamente il tutto il contenuto del repository, inclusi i dati di Git, incidenti, commenti e accessi dei collaboratori.
settings.delete_notices_fork_1=-Se questo repository è pubblico, tutti i fork diventeranno indipendenti dopo la sua cancellazione.
settings.delete_notices_fork_2=-Se questo repository è privato, tutti fork verranno rimossi assieme ad esso.
settings.delete_notices_fork_3=- If you want to keep all forks after deletion, please change visibility of this repository to public first.
settings.deletion_success=Repository has been deleted successfully!
settings.deletion_success=Il repository è stato eliminato con successo!
settings.update_settings_success=Le opzioni repository sono state aggiornate con successo.
settings.transfer_owner=Nuovo Proprietario
settings.make_transfer=Trasferisci
@@ -601,16 +603,16 @@ settings.confirm_delete=Conferma eliminazione
settings.add_collaborator=Aggiungi nuovo collaboratore
settings.add_collaborator_success=Il nuovo collaboratore è stato aggiunto.
settings.remove_collaborator_success=Il collaboratore è stato rimosso.
settings.search_user_placeholder=Search user...
settings.search_user_placeholder=Cerca utente...
settings.user_is_org_member=L'utente è un membro dell'organizzazione che non può essere aggiunto come collaboratore.
settings.add_webhook=Aggiungi Webhook
settings.hooks_desc=I Webhooks sono molto simili a un basilare evento trigger HTTP POST. Ogni volta che qualcosa si verifica in Gogs, tratteremo la notifica all'host di destinazione specificato. Ulteriori informazioni in questa <a target="_blank" href="%s">Guida ai Webhooks</a>.
settings.webhook_deletion=Delete Webhook
settings.webhook_deletion=Elimina Webhook
settings.webhook_deletion_desc=Delete this webhook will remove its information and all delivery history. Do you want to continue?
settings.webhook_deletion_success=Webhook has been deleted successfully!
settings.webhook.test_delivery=Test Delivery
settings.webhook.test_delivery_desc=Send a fake push event delivery to test your webhook settings
settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may taks few seconds before it shows up in the delivery history.
settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history.
settings.webhook.request=Request
settings.webhook.response=Response
settings.webhook.headers=Headers
@@ -626,7 +628,7 @@ settings.payload_url=Payload URL
settings.content_type=Content Type
settings.secret=Secret
settings.slack_username=Username
settings.slack_icon_url=Icon URL
settings.slack_icon_url=URL icona
settings.slack_color=Color
settings.event_desc=Quali eventi dovrebbero innescare questo webhook?
settings.event_push_only=Solo l'evento <code>push</code>.
@@ -650,8 +652,8 @@ settings.slack_domain=Dominio
settings.slack_channel=Canale
settings.deploy_keys=Dispiega Chiavi
settings.add_deploy_key=Add Deploy Key
settings.deploy_key_desc=Deploy key only has read-only access. It is not same as personal account SSH keys.
settings.no_deploy_keys=You haven't added any deploy key.
settings.deploy_key_desc=Deploy keys have read-only access. They are not the same as personal account SSH keys.
settings.no_deploy_keys=You haven't added any deploy keys.
settings.title=Title
settings.deploy_key_content=Content
settings.key_been_used=Deploy key content has been used.
@@ -666,6 +668,8 @@ diff.parent=parent
diff.commit=commit
diff.data_not_available=Diff Data non disponibile.
diff.show_diff_stats=Mostra Diff Stats
diff.show_split_view=Split View
diff.show_unified_view=Unified View
diff.stats_desc=<strong>%d ha cambiato i file</strong> con <strong>%d aggiunte</strong> e <strong>%d eliminazioni</strong>
diff.bin=BIN
diff.view_file=Vedi File
@@ -699,7 +703,7 @@ release.deletion=Release Deletion
release.deletion_desc=Deleting this release will delete the corresponding Git tag. Do you want to continue?
release.deletion_success=Release has been deleted successfully!
release.tag_name_already_exist=Un rilascio con questo tag esiste già.
release.downloads=Downloads
release.downloads=Download
[org]
org_name_holder=Nome dell'Organizzazione
@@ -750,7 +754,7 @@ members.owner=Proprietario
members.member=Membro
members.remove=Rimuovere
members.leave=Abbandona
members.invite_desc=Add a new member to %s:
members.invite_desc=Aggiungi un nuovo membro a %s:
members.invite_now=Invita ora
teams.join=Iscriviti
@@ -791,7 +795,7 @@ notices=Avvisi di sistema
monitor=Monitoraggio
first_page=First
last_page=Last
total=Total: %d
total=Totale: %d
dashboard.statistic=Statistiche
dashboard.operations=Operazioni
@@ -853,7 +857,7 @@ users.admin=Amministratore
users.repos=Repo
users.created=Creato
users.send_register_notify=Send Registration Notification To User
users.new_success=New account '%s' has been created successfully.
users.new_success=Il nuovo account '%s' è stato creato correttamente.
users.edit=Modifica
users.auth_source=Authentication Source
users.local=Locale
@@ -866,12 +870,12 @@ users.max_repo_creation_desc=(Set -1 to use global default limit)
users.is_activated=Questo account è attivato
users.is_admin=Questo account ha permessi di amministratore
users.allow_git_hook=Questo account ha il permesso di creare hooks di Git
users.allow_import_local=This account has permissions to import local repositories
users.allow_import_local=Questo account dispone delle autorizzazioni per importare repository locali
users.update_profile=Aggiornare Profilo Account
users.delete_account=Elimina Questo Account
users.still_own_repo=Questo account possiede ancora almeno un repository, devi prima cancellarli o trasferirli.
users.still_has_org=Questo account appartiene ancora ad almeno un'organizzazione, è necessario prima abbandonarle o eliminale.
users.deletion_success=Account has been deleted successfully!
users.deletion_success=Account eliminato correttamente!
orgs.org_manage_panel=Pannello Gestione Organizzazioni
orgs.name=Nome
@@ -916,7 +920,7 @@ auths.smtpport=Porta SMTP
auths.allowed_domains=Allowed Domains
auths.allowed_domains_helper=Leave it empty to not restrict any domains. Multiple domains should be separated by comma ','.
auths.enable_tls=Abilitare Crittografia TLS
auths.skip_tls_verify=Skip TLS Verify
auths.skip_tls_verify=Salta verifica TLS
auths.pam_service_name=Nome del Servizio PAM
auths.enable_auto_register=Abilitare Registrazione Automatica
auths.tips=Consigli
@@ -961,7 +965,7 @@ config.require_sign_in_view=Richiesto Accesso per Vedere
config.enable_cache_avatar=Abilitare Cache dell'Avatar
config.mail_notify=Email di Notifica
config.disable_key_size_check=Disable Minimum Key Size Check
config.enable_captcha=Enable Captcha
config.enable_captcha=Abilita Captcha
config.active_code_lives=Attiva Vita del Codice
config.reset_password_code_lives=Reimpostare Password della Vita del Codice
config.webhook_config=Configurazione Webhook
@@ -1022,7 +1026,7 @@ notices.delete_success=System notices have been deleted successfully.
[action]
create_repo=ha creato il repository <a href="%s">%s</a>
rename_repo=renamed repository from <code>%[1]s</code> to <a href="%[2]s">%[3]s</a>
rename_repo=repository rinominato da <code>%[1]s</code> a <a href="%[2]s">[3]s</a>
commit_repo=ha pushato nel <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a>
create_issue=`ha aperto il problema <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request=`creata pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
@@ -1056,6 +1060,6 @@ raw_minutes=minuti
[dropzone]
default_message=Drop files here or click to upload.
invalid_input_type=You can't upload files of this type.
file_too_big=File size({{filesize}} MB) exceeds maximum size({{maxFilesize}} MB).
file_too_big=File size ({{filesize}} MB) exceeds maximum size ({{maxFilesize}} MB).
remove_file=Remove file

View File

@@ -28,7 +28,7 @@ organization=組織
mirror=ミラー
new_repo=新しいリポジトリ
new_migrate=新しい移行
new_mirror=New Mirror
new_mirror=新しいミラー
new_fork=新しいフォークのリポジトリ
new_org=新しい組織
manage_org=組織を管理
@@ -68,7 +68,7 @@ path=パス
sqlite_helper=SQLite3 または TiDB のデータベースのファイル パス。
err_empty_db_path=SQLite3 または TiDB データベースのパスを空にすることはできません。
err_invalid_tidb_name=TiDB データベース名は文字"."と"-"を許可しない。
no_admin_and_disable_registration=You cannot disable registration without creating an admin account.
no_admin_and_disable_registration=管理者アカウントを作成せずに登録を無効にすることはできません。
err_empty_admin_password=管理者パスワードは空白にできません。
general_title=Gogs の全般設定
@@ -232,6 +232,8 @@ activity=パブリック・アクティビティ
followers=フォロワー
starred=スター
following=フォロー
follow=フォロー
unfollow=フォロー解除
form.name_reserved=ユーザー名 '%s' は予約されています。
form.name_pattern_not_allowed=ユーザ名のパターン '%s' は許可されていません。
@@ -248,7 +250,7 @@ uid=Uid
public_profile=パブリック プロフィール
profile_desc=あなたのメールアドレスは公開され、任意のアカウント関連の通知に使用されます。また、Webベースの操作はサイトを介して行います。
password_username_disabled=Non-local type users are not allowed to change their username.
password_username_disabled=ローカルユーザ以外はユーザ名を変更できません。
full_name=フルネーム
website=WEBサイト
location=ロケーション
@@ -273,7 +275,7 @@ new_password=新しいパスワード
retype_new_password=新しいパスワードを再入力します。
password_incorrect=現在のパスワードが正しくありません。
change_password_success=パスワードが正常に変更されました。今すぐ新しいパスワード経由でサインインすることができます。
password_change_disabled=Non-local type users are not allowed to change their password.
password_change_disabled=ローカルユーザ以外はパスワードを変更できません。
emails=E-mail アドレス
manage_emails=E-mail アドレスを管理
@@ -355,7 +357,7 @@ auto_init=選択されたファイルおよびテンプレートでリポジト
create_repo=リポジトリを作成
default_branch=デフォルトのブランチ
mirror_interval=ミラー 間隔(時)
mirror_address=Mirror Address
mirror_address=ミラー アドレス
mirror_address_desc=Please include necessary user credentials in the address.
watchers=ウォッチャー
stargazers=Stargazers
@@ -454,7 +456,7 @@ issues.filter_sort=並べ替え
issues.filter_sort.latest=最新
issues.filter_sort.oldest=最も古い
issues.filter_sort.recentupdate=最近更新された
issues.filter_sort.leastupdate=Least recently updated
issues.filter_sort.leastupdate=つい最近更新
issues.filter_sort.mostcomment=一番多いコメント
issues.filter_sort.leastcomment=一番少ないコメント
issues.opened_by=opened %[1]s by <a href="%[2]s">%[3]s</a>
@@ -515,7 +517,7 @@ pulls.data_broken=Data of this pull request has been broken due to deletion of f
pulls.is_checking=The conflict checking is still in progress, please refresh page in few moments.
pulls.can_auto_merge_desc=This pull request can be merged automatically.
pulls.cannot_auto_merge_desc=This pull request can't be merged automatically because there are conflicts.
pulls.cannot_auto_merge_helper=Please merge manually in order to resolve the conflicts.
pulls.cannot_auto_merge_helper=競合を解決するためには、手動でマージする必要があります。
pulls.merge_pull_request=プルリクエストをマージします。
pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
@@ -545,7 +547,7 @@ milestones.deletion_success=マイルス トーンは正常に削除されまし
wiki=Wiki
wiki.welcome=Wiki へようこそ!
wiki.welcome_desc=Wiki is the place where you would like to document your project together and make it better.
wiki.welcome_desc=Wikiとは、あなたのプロジェクトを文書化し、複数人で一緒に編集する場所です。
wiki.create_first_page=最初のページを作成する。
wiki.page=ページ
wiki.filter_page=フィルターページ
@@ -569,11 +571,11 @@ settings.site=公式サイト
settings.update_settings=設定の更新
settings.change_reponame_prompt=この変更はリンクがリポジトリに関連付ける方法に影響します。
settings.advanced_settings=拡張設定
settings.wiki_desc=Enable wiki to allow people write documents
settings.use_external_wiki=Use external wiki
settings.external_wiki_url=External Wiki URL
settings.wiki_desc=Wikiでドキュメントの作成を許可
settings.use_external_wiki=外部 wiki を使用します。
settings.external_wiki_url=外部 Wiki URL
settings.external_wiki_url_desc=Visitors will be redirected to URL when they click on the tab.
settings.issues_desc=Enable builtin lightweight issue tracker
settings.issues_desc=組み込み簡易課題トラッカーを有効
settings.use_external_issue_tracker=外部課題トラッキングシステムを使用
settings.tracker_url_format=外部課題トラッキングツール URLのフォーマット
settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
@@ -608,9 +610,9 @@ settings.hooks_desc=Webhooksは、Gogsで特定のイベントの発生時に指
settings.webhook_deletion=Webhook を削除
settings.webhook_deletion_desc=このwebhookを削除すると、すべての情報と配信履歴が削除されます。続行しますか
settings.webhook_deletion_success=Webhook が正常に削除されました。
settings.webhook.test_delivery=Test Delivery
settings.webhook.test_delivery=テスト配信
settings.webhook.test_delivery_desc=Send a fake push event delivery to test your webhook settings
settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may taks few seconds before it shows up in the delivery history.
settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history.
settings.webhook.request=リクエスト
settings.webhook.response=レスポンス
settings.webhook.headers=ヘッダ
@@ -666,6 +668,8 @@ diff.parent=親
diff.commit=コミット
diff.data_not_available=差分データは利用できません。
diff.show_diff_stats=差分情報を表示
diff.show_split_view=Split View
diff.show_unified_view=Unified View
diff.stats_desc=共有<strong>%d 個のファイルを変更した</strong>、<strong>%d 個の追加</strong> と <strong>%d 個の削除</strong>を含む
diff.bin=BIN
diff.view_file=ファイルの表示
@@ -1018,7 +1022,7 @@ notices.type=タイプ
notices.type_1=リポジトリ
notices.desc=説明
notices.op=Op。
notices.delete_success=System notices have been deleted successfully.
notices.delete_success=システム通知が正常に削除されました。
[action]
create_repo=リポジトリ <a href="%s"> %s</a>を作成しました
@@ -1030,7 +1034,7 @@ comment_issue=`問題 <a href="%s/issues/%s">%s#%[2]s</a> のコメント`
merge_pull_request=`プルリクエスト <a href="%s/pulls/%s"> %s[2]s</a>をマージしました`
transfer_repo=リポジトリ <code>%s</code> を <a href="%s">%s</a> へ転送しました
push_tag=<a href="%[1]s">%[3]s</a> に タグ <a href="%[1]s/src/%[2]s">%[2]s</a> をプッシュしました
compare_commits=View comparison for these %d commits
compare_commits=これらの %d コミットの比較を表示
[tool]
ago=

View File

@@ -28,7 +28,7 @@ organization=Organizācija
mirror=Spogulis
new_repo=Jauns repozitorijs
new_migrate=Jauna migrācija
new_mirror=New Mirror
new_mirror=Jauns spogulis
new_fork=Jauns atdalītais repozitorijs
new_org=Jauna organizācija
manage_org=Pārvaldīt organizācijas
@@ -232,6 +232,8 @@ activity=Publiskā aktivitāte
followers=Sekotāji
starred=Atzīmēti ar zvaigznīti
following=Seko
follow=Sekot
unfollow=Nesekot
form.name_reserved=Lietotāja vārds '%s' jau ir aizņemts.
form.name_pattern_not_allowed=Lietotāja vārds '%s' nav atļauts.
@@ -248,7 +250,7 @@ uid=Lietotāja ID
public_profile=Publiskais profils
profile_desc=Jūsu e-pasta adrese ir publiska un tiks izmantota, lai nosūtītju Jums paziņojumus, kas saistīti ar Jūsu kontu vai darbībām veiktām caur šo mājas lapu.
password_username_disabled=Non-local type users are not allowed to change their username.
password_username_disabled=Ne-lokālie lietotāji nevar mainīt savus lietotājvārdus.
full_name=Pilns vārds
website=Mājas lapa
location=Atrašanās vieta
@@ -273,7 +275,7 @@ new_password=Jauna parole
retype_new_password=Ievadīt paroli atkāroti
password_incorrect=Ievadīta nepareiza pašreizējā parole.
change_password_success=Parole tika veiksmīgi nomainīta. Tagad jūs varat pieraksītites, izmantojot jauno paroli.
password_change_disabled=Non-local type users are not allowed to change their password.
password_change_disabled=Ne-lokālie lietotāji nevar mainīt savas paroles.
emails=E-pasta adreses
manage_emails=Pārvaldīt e-pasta adreses
@@ -355,13 +357,13 @@ auto_init=Inicializēt šo repozitoriju ar izvēlētajiem failiem un sagatavi
create_repo=Izveidot repozitoriju
default_branch=Noklusējuma atzars
mirror_interval=Spoguļošanas intervāls (stundās)
mirror_address=Mirror Address
mirror_address_desc=Please include necessary user credentials in the address.
mirror_address=Spoguļa adrese
mirror_address_desc=Lūdzu iekļaujiet adresē nepieciešamo lietotājvārdu/paroli.
watchers=Novērotāji
stargazers=Zvaigžņdevēji
forks=Atdalītie repozitoriji
form.reach_limit_of_creation=The owner has reached maximum creation limit of %d repositories.
form.reach_limit_of_creation=Īpašnieks sasniedza maksimālu pieļaujamo (%d) izveidoto repozitoriju skaitu.
form.name_reserved=Repozitorija nosaukums '%s' ir rezervēts.
form.name_pattern_not_allowed=Repozitorija nosaukums '%s' nav atļauts.
@@ -375,7 +377,7 @@ migrate.permission_denied=Jums nav tiesību importēt lokālu repozitoriju.
migrate.invalid_local_path=Nekorents lokālais ceļš, tas neeksistē vai nav direktorijs.
migrate.failed=Migrācija neizdevās: %v
mirror_from=mirror from
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
@@ -395,7 +397,7 @@ create_new_repo_command=Izveidot jaunu repozitoriju komandrindā
push_exist_repo=Nosūtīt izmaiņas no komandrindas eksistējošam repozitorijam
repo_is_empty=Šis repozitorijs ir tukšs, apskatiet atkal vēlāk!
code=Code
code=Kods
branch=Atzars
tree=Koks
filter_branch_and_tag=Filtrēt atzarus vai tagus
@@ -513,9 +515,9 @@ pulls.merged=Sapludināts
pulls.has_merged=Šo izmaiņu pieprasījums tika veiksmīgi sapludināts!
pulls.data_broken=Nepieejami izmaiņu pieprasījuma dati, jo dzēsta informācija no atdalītā repozitorija.
pulls.is_checking=Notiek konfliktu pārbaude, mirkli uzgaidiet un atjaunojiet lapu.
pulls.can_auto_merge_desc=This pull request can be merged automatically.
pulls.cannot_auto_merge_desc=This pull request can't be merged automatically because there are conflicts.
pulls.cannot_auto_merge_helper=Please merge manually in order to resolve the conflicts.
pulls.can_auto_merge_desc=Šo izmaiņu pieprasījumu var automātiski saplūdināt.
pulls.cannot_auto_merge_desc=Šis izmaiņu pieprasījums nevar tikt automātiski saplūdināts konfliktu dēļ.
pulls.cannot_auto_merge_helper=Lūdzu sapludiniet manuāli, lai atrisinātu konfliktus.
pulls.merge_pull_request=Izmaiņu pieprasījuma sapludināšana
pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) no šī repozitorija ar tādu pašu sapludināšanas informāciju un gaida sapludināšanu.`
@@ -568,16 +570,16 @@ settings.basic_settings=Pamatiestatījumi
settings.site=Oficiālā mājas lapa
settings.update_settings=Mainīt iestatījumus
settings.change_reponame_prompt=Šī izmaiņa ietekmēs saites, kas ir saistītas ar šo repozitoriju.
settings.advanced_settings=Advanced Settings
settings.wiki_desc=Enable wiki to allow people write documents
settings.use_external_wiki=Use external wiki
settings.external_wiki_url=External Wiki URL
settings.external_wiki_url_desc=Visitors will be redirected to URL when they click on the tab.
settings.issues_desc=Enable builtin lightweight issue tracker
settings.use_external_issue_tracker=Use external issue tracker
settings.tracker_url_format=External Issue Tracker URL Format
settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
settings.pulls_desc=Enable pull requests to accept public contributions
settings.advanced_settings=Papildu iestatījumi
settings.wiki_desc=Iespējot vikivietni, lai atļautu cilvēkiem rakstīt dokumentus
settings.use_external_wiki=Izmantot ārējo vikivietni
settings.external_wiki_url=Ārējās Vikivietnes adrese
settings.external_wiki_url_desc=Apmeklētāji tiks novirzīti uz adresi, kad viņi uzklikšķinās uz cilnes.
settings.issues_desc=Iespējot iebūvētu vieglu problēmu sekotāju
settings.use_external_issue_tracker=Izmantot ārējo problēmu sekotāju
settings.tracker_url_format=Ārējā problēmu sekotāja adreses formāts
settings.tracker_url_format_desc=Jūs varat izmantot <code>{user}{repo}{index}</code> lietotājvārdam, repozitorija nosaukumam un problēmas identifikātoram.
settings.pulls_desc=Iespējot izmaiņu pieprasījumus lai saņemtu publiskus ieguldījumus
settings.danger_zone=Bīstamā zona
settings.transfer=Mainīt īpašnieku
settings.transfer_desc=Mainīt šī repozitorija īpašnieku uz citu lietotāju vai organizāciju, kurai Jums ir administratora tiesībs.
@@ -592,7 +594,7 @@ settings.delete_notices_2=- Šī darbība neatgriezeniski izdzēsīs visus šī
settings.delete_notices_fork_1=- Ja repozitorijs ir publisks, visi atdalītie repozitoriji kļūs neatkarīgi.
settings.delete_notices_fork_2=- Ja repozitorijs ir privāts, tiks dzēsti arī visi atdalītie repozitoriji.
settings.delete_notices_fork_3=- Ja vēlaties saglabāt atdalīts repozitorijus pēc dzēšanas, sākumā nomainiet repozitorija redzamību uz publisku.
settings.deletion_success=Repository has been deleted successfully!
settings.deletion_success=Repozitorijs tika veiksmīgi dzēsts!
settings.update_settings_success=Repozitorija opcijas ir veiksmīgi saglabātas.
settings.transfer_owner=Jaunais īpašnieks
settings.make_transfer=Mainīt
@@ -608,9 +610,9 @@ settings.hooks_desc=Tīmekļa āķi ļauj paziņot ārējiem servisiem par notei
settings.webhook_deletion=Dzēst tīmekļa āķi
settings.webhook_deletion_desc=Dzēšot tīmekļa āķi tiks dzēsta visa ar to saistītā informācija un izpildes vēsture. Vai vēlaties turpināt?
settings.webhook_deletion_success=Tīmekļa āķis tika veiksmīgi izdzēsts!
settings.webhook.test_delivery=Test Delivery
settings.webhook.test_delivery_desc=Send a fake push event delivery to test your webhook settings
settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may taks few seconds before it shows up in the delivery history.
settings.webhook.test_delivery=Testa piegāde
settings.webhook.test_delivery_desc=Veikt viltus push-notikuma piegādi lai notestētu Jūsu tīmekļa āķa iestatījumus
settings.webhook.test_delivery_success=Testa web-āķis ir pievienots piegādes rindai. Var paiet dažas sekundes, kamēr tas parādīsies piegāžu vēsturē.
settings.webhook.request=Pieprasījums
settings.webhook.response=Atbilde
settings.webhook.headers=Galvenes
@@ -666,6 +668,8 @@ diff.parent=vecāks
diff.commit=revīzija
diff.data_not_available=Salīdzināšanas dati nav pieejami.
diff.show_diff_stats=Rādīt salīdzināšanas statistiku
diff.show_split_view=Dalītais skats
diff.show_unified_view=Apvienotais skats
diff.stats_desc=<strong>%d mainītis faili</strong> ar <strong>%d papildinājumiem</strong> un <strong>%d dzēšanām</strong>
diff.bin=BIN
diff.view_file=Parādīt failu
@@ -861,8 +865,8 @@ users.auth_login_name=Autentifikācijas pieteikšanās vārds
users.password_helper=Atstājiet tukšu, ja nevēlaties mainīt.
users.update_profile_success=Konta profils tika veiksmīgi saglabāts.
users.edit_account=Labot kontu
users.max_repo_creation=Maximum Repository Creation Limit
users.max_repo_creation_desc=(Set -1 to use global default limit)
users.max_repo_creation=Maksimāls repozitoriju veidošanas limits
users.max_repo_creation_desc=(Uzlikt -1 lai izmantotu globālu limitu pēc noklusējuma)
users.is_activated=Konts ir aktivizēts
users.is_admin=Šim kontam ir administratora piekļuves tiesības
users.allow_git_hook=Šim kontam ir tiesības pievienot/labot Git āķus
@@ -1007,18 +1011,18 @@ monitor.start=Sākuma laiks
monitor.execute_time=Izpildes laiks
notices.system_notice_list=Sistēmas paziņojumi
notices.view_detail_header=View Notice Detail
notices.actions=Actions
notices.select_all=Select All
notices.deselect_all=Deselect All
notices.inverse_selection=Inverse Selection
notices.delete_selected=Delete Selected
notices.delete_all=Delete All Notices
notices.view_detail_header=Skatīt paziņojuma detaļas
notices.actions=Darbības
notices.select_all=Iezīmēt visu
notices.deselect_all=Atcelt visa iezīmēšanu
notices.inverse_selection=Apgriezeniskā iezīmēšana
notices.delete_selected=Dzēst iezīmēto
notices.delete_all=Dzēst visus paziņojumus
notices.type=Veids
notices.type_1=Repozitorijs
notices.desc=Apraksts
notices.op=Op.
notices.delete_success=System notices have been deleted successfully.
notices.delete_success=Sistēmas paziņojumi tika veiksmīgi izdzēstas.
[action]
create_repo=izveidoja repozitoriju <a href="%s">%s</a>
@@ -1030,7 +1034,7 @@ comment_issue=`pievienoja komentāru problēmai <a href="%s/issues/%s">%s#%[2]s<
merge_pull_request=`sapludināja izmaiņu pieprasījumu <a href="%s/pulls/%s">%s#%[2]s</a>`
transfer_repo=mainīja repozitorija <code>%s</code> īpašnieku uz <a href="%s">%s</a>
push_tag=pievienoja tagu <a href="%s/src/%s">%[2]s</a> repozitorijam <a href="%[1]s">%[3]s</a>
compare_commits=View comparison for these %d commits
compare_commits=Salīdzināt šīs %d revīzijas
[tool]
ago=atpakaļ

View File

@@ -1,6 +1,6 @@
app_desc=Een eenvoudige zelfgehoste Git service geschreven in Go
home=Huis
home=Home
dashboard=Dashboard
explore=Verkennen
help=Help
@@ -13,7 +13,7 @@ version=Versie
page=Pagina
template=Sjabloon
language=Taal
create_new=Create...
create_new=Creëren...
user_profile_and_more=Gebruikersprofiel en meer
signed_in_as=Aangemeld als
@@ -28,7 +28,7 @@ organization=Organisatie
mirror=Spiegel
new_repo=Nieuwe repositorie
new_migrate=Nieuwe migratie
new_mirror=New Mirror
new_mirror=Nieuwe Kopie
new_fork=Nieuwe vork Repository
new_org=Nieuwe organisatie
manage_org=Beheer organisaties
@@ -54,8 +54,8 @@ code=Code
[install]
install=Installatie
title=Installatiestappen voor de eerste keer opstarten
docker_helper=If you're running Gogs inside Docker, please read <a target="_blank" href="%s">Guidelines</a> carefully before you change anything in this page!
requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB.
docker_helper=Als u gebruik maakt Gogs binnen Docker, lees dan de <a target="_blank" href="%s">richtlijnen</a> voordat u iets veranderen op deze pagina!
requite_db_desc=Gogs vereist MySQL, PostgreSQL, SQite3 of TiDB.
db_title=Database instellingen
db_type=Database-type
host=Host
@@ -65,11 +65,11 @@ db_name=Database naam
db_helper=Gebruik InnoDB engine met utf8_general_ci karakterset voor MySQL.
ssl_mode=SSL-modus
path=Pad
sqlite_helper=The file path of SQLite3 or TiDB database.
err_empty_db_path=SQLite3 or TiDB database path cannot be empty.
err_invalid_tidb_name=TiDB database name does not allow characters "." and "-".
no_admin_and_disable_registration=You cannot disable registration without creating an admin account.
err_empty_admin_password=Admin password cannot be empty.
sqlite_helper=Het bestandspad van de SQLite3 of TiDB databank.
err_empty_db_path=SQLite3 of TiDB databankpad mag niet leeg.
err_invalid_tidb_name=TiDB databank naam niet tekens kunnen "." en "-".
no_admin_and_disable_registration=Je kunt niet de registratie uit te schakelen zonder een beheerders account.
err_empty_admin_password=Beheerder wachtwoord kan niet leeg zijn.
general_title=Toepassing algemene instellingen
app_name=Applicatienaam
@@ -103,8 +103,8 @@ disable_gravatar=Gravatar Service uitschakelen
disable_gravatar_popup=Schakel Gravatar en andere bronnen uit, alle avatars worden door gebruikers geüpload of zijn standaard.
disable_registration=Schakel zelfregistratie uit
disable_registration_popup=Schakel zelfregistratie uit, alleen admins kunnen accounts maken.
enable_captcha=Enable Captcha
enable_captcha_popup=Require validate captcha for user self-registration.
enable_captcha=Inschakelen Captcha
enable_captcha_popup=Vereis captcha validatie voor zelf-registratie van gebruiker.
require_sign_in_view=Schakel vereiste aanmelding om pagina's te zien in
require_sign_in_view_popup=Alleen ingelogde gebruikers kunnen pagina's bekijken, bezoekers kunnen alleen de login/registratie pagina's zien.
admin_setting_desc=U hoeft niet meteen een administratie account te maken, de gebruiker met ID=1 krijgt automatisch administratierechten.
@@ -112,7 +112,7 @@ admin_title=Instellingen beheerdersaccount
admin_name=Gebruikersnaam
admin_password=Wachtwoord
confirm_password=Verifieer wachtwoord
admin_email=Admin Email
admin_email=Beheerder E-mail
install_gogs=Installeer Gogs
test_git_failed=Git test niet gelukt: 'git' commando %v
sqlite3_not_available=Uw versie biedt geen ondersteuning voor SQLite3, download de officiële binaire versie van %s, niet de gobuild versie.
@@ -161,11 +161,11 @@ reset_password_helper=Klik hier om uw wachtwoord opnieuw in te stellen.
password_too_short=De lengte van uw wachtwoord moet minimaal zes karakters zijn.
[mail]
activate_account=Please activate your account
activate_email=Verify your email address
reset_password=Reset your password
register_success=Registration successful, welcome
register_notify=Welcome on board
activate_account=Activeer uw account
activate_email=Verifieer je e-mailadres
reset_password=Stel je wachtwoord opnieuw in
register_success=Registratie succesvol, welkom
register_notify=Welkom aan boord
[modal]
yes=Ja
@@ -193,7 +193,7 @@ min_size_error=moet minimaal %s karakters bevatten.
max_size_error=mag maximaal %s karakters bevatten.
email_error=is niet een valide e-mail adres.
url_error=is niet een valide URL.
include_error=` must contain substring '%s'.`
include_error=` moet substring '%s' bevatten.`
unknown_error=Onbekende fout:
captcha_incorrect=Captcha komt niet overeen.
password_not_match=Wachtwoord en verificatie wachtwoord komen niet overeen.
@@ -232,6 +232,8 @@ activity=Openbare activiteit
followers=Volgers
starred=Sterren
following=Volgt
follow=Volg
unfollow=Niet meer volgen
form.name_reserved=De gebruikersnaam '%s' is gereserveerd.
form.name_pattern_not_allowed=Het gebruikersnaam patroon '%s' is niet toegestaan.
@@ -248,14 +250,14 @@ uid=uid
public_profile=Openbaar profiel
profile_desc=Uw e-mailadres is openbaar en zal gebruikt worden voor alle account gerelateerde berichtgevingen en bewerkingingen die via de website worden gedaan.
password_username_disabled=Non-local type users are not allowed to change their username.
password_username_disabled=Extern opgeslagen gebruikers zijn niet toegestaan om hun gebruikersnaam veranderen.
full_name=Volledige naam
website=Website
location=Locatie
update_profile=Profile bijwerken
update_profile_success=Uw profiel is succesvol bijgewerkt.
change_username=Username veranderd
change_username_prompt=This change will affect the way how links relate to your account.
change_username_prompt=Deze verandering zal de weg links hebben betrekking op uw account beïnvloeden.
continue=Doorgaan
cancel=Annuleren
@@ -270,10 +272,10 @@ update_avatar_success=Instellingen voor avatar succesvol bijgewerkt.
change_password=Verander wachtwoord
old_password=Huidige wachtwoord
new_password=Nieuw wachtwoord
retype_new_password=Retype New Password
retype_new_password=Herhaal Nieuw Wachtwoord
password_incorrect=Huidig wachtwoord is niet correct.
change_password_success=Wachtwoord is succesvol gewijzigd. U kunt nu met uw nieuwe wachtwoord inloggen.
password_change_disabled=Non-local type users are not allowed to change their password.
password_change_disabled=Extern opgeslagen gebruikers zijn niet toegestaan om hun wachtwoord te wijzigen.
emails=E-mailadressen
manage_emails=E-mailadressen beheren
@@ -281,9 +283,9 @@ email_desc=Uw primaire e-mailadres zal worden gebruikt voor meldingen en andere
primary=Primair
primary_email=Instellen als primair
delete_email=Verwijder
email_deletion=Email Deletion
email_deletion_desc=Deleting this email address will remove related information from your account. Do you want to continue?
email_deletion_success=Email has been deleted successfully!
email_deletion=E-mail Verwijderen
email_deletion_desc=Dit e-mailadres verwijdert, worden gerelateerde informatie van uw account te verwijderen. Wil je verdergaan?
email_deletion_success=E-mail is succesvol verwijderd!
add_new_email=Nieuw e-mailadres toevoegen
add_email=E-mailadres toevoegen
add_email_confirmation_sent=Een nieuwe bevestiging e-mail werd verstuurd naar '%s', gelieve uw inbox in de komende %d uren te controleren om het bevestigingsproces te voltooien.
@@ -338,7 +340,7 @@ repo_name=Repositorie naam
repo_name_helper=Een goede repositorie naam is kort, memorabel en <strong>uniek</strong>.
visibility=Zichtbaarheid
visiblity_helper=Deze repositorie is <span class="ui red text">privaat</span>
visiblity_helper_forced=Site admin has forced all new repositories to be <span class="ui red text">Private</span>
visiblity_helper_forced=Sitebeheerder heeft alle nieuwe repositories gedwongen <span class="ui red text">privé</span> te zijn
visiblity_fork_helper=(Verandering van deze waarde zal van invloed zijn op alle forks)
clone_helper=De behoeftehulp van klonen? Bezoek <a target="_blank" href="%s"> helpen</a>!
fork_repo=Vork Repository
@@ -355,13 +357,13 @@ auto_init=Initialiseer deze repositorie met de geselecteerde bestanden en sjablo
create_repo=Nieuwe Repositorie
default_branch=Standaard branch
mirror_interval=Mirror interval(uur)
mirror_address=Mirror Address
mirror_address_desc=Please include necessary user credentials in the address.
mirror_address=Kopie-adres
mirror_address_desc=Gelieve noodzakelijke gebruikersgegevens in de adresbalk.
watchers=Watchers
stargazers=Stargazers
forks=Forks
form.reach_limit_of_creation=The owner has reached maximum creation limit of %d repositories.
form.reach_limit_of_creation=De eigenaar heeft maximale creatie limiet van %d repositories bereikt.
form.name_reserved=Repositorienaam '%s' is gereserveerd.
form.name_pattern_not_allowed=Repositorie naampatroon '%s' is niet toegestaan.
@@ -371,16 +373,16 @@ migrate_type_helper=Deze repositorie zal een <span class="text blue">mirror</spa
migrate_repo=Migreer repositorie
migrate.clone_address=Clone adres
migrate.clone_address_desc=Dit kan een HTTP/HTTPS/GIT URL zijn of een lokaal pad.
migrate.permission_denied=You are not allowed to import local repositories.
migrate.permission_denied=U bent niet toegestaan om deze lokale repositories te importeren.
migrate.invalid_local_path=Ongeldig lokaal pad, het pad bestaat niet of het is geen map.
migrate.failed=Migration failed: %v
migrate.failed=Migratie is mislukt: %v
mirror_from=mirror from
mirror_from=spiegel van
forked_from=geforked van
fork_from_self=U kunt geen repository forken die u al beheert!
copy_link=Kopieer
copy_link_success=Copied!
copy_link_error=Press ⌘-C or Ctrl-C to copy
copy_link_success=Gekopieerd!
copy_link_error=Druk op ⌘-C of Ctrl-C om te kopiëren
copied=Gekopieerd
unwatch=Negeren
watch=Volgen
@@ -393,12 +395,12 @@ quick_guide=Snelstart gids
clone_this_repo=Kloon deze repositorie
create_new_repo_command=Maak een nieuwe repositorie aan vanaf de console
push_exist_repo=Push een bestaande repositorie vanaf de console
repo_is_empty=This repository is empty, please come back later!
repo_is_empty=Deze repositories is leeg is, probeer het later opnieuw!
code=Code
branch=Aftakking
tree=Boom
filter_branch_and_tag=Filter branch or tag
filter_branch_and_tag=Filter branch of tag
branches=Aftakkingen
tags=Labels
issues=Kwesties
@@ -493,7 +495,7 @@ issues.label_deletion=Verwijder label
issues.label_deletion_desc=Het verwijderen van dit label zal alle informatie in de gerelateerde problemen verwijderen. Wilt u doorgaan?
issues.label_deletion_success=Label werd met succes verwijderd!
pulls.new=New Pull Request
pulls.new=Nieuwe Pull aanvraag
pulls.compare_changes=Vergelijk veranderingen
pulls.compare_changes_desc=Vergelijk twee vertakkingen en maak een pull verzoek voor wijzigingen.
pulls.compare_base=base
@@ -504,16 +506,16 @@ pulls.nothing_to_compare=Er is niets te vergelijken omdat base en head branches
pulls.has_pull_request=' Er is al een pull-aanvraag tussen deze twee targets: <a href="%[1]s/pulls/%[3]d"> %[2]s #% [3]d</a>'
pulls.create=Pull verzoek aanmaken
pulls.title_desc=wil %[1]d commits van <code>%[2]s</code> samenvoegen met <code>%[3]s</code>
pulls.merged_title_desc=merged %[1]d commits from <code>%[2]s</code> into <code>%[3]s</code> %[4]s
pulls.merged_title_desc=%[1] commits samengevoegd van <code>%[2]s</code> naar <code>%[3]s</code> %[4]s
pulls.tab_conversation=Discussie
pulls.tab_commits=Commits
pulls.tab_files=Bestanden gewijzigd
pulls.reopen_to_merge=Please reopen this pull request to perform merge operation.
pulls.merged=Merged
pulls.has_merged=This pull request has been merged successfully!
pulls.merged=Samengevoegd
pulls.has_merged=Dit pull-request is samengevoegd!
pulls.data_broken=Data of this pull request has been broken due to deletion of fork information.
pulls.is_checking=The conflict checking is still in progress, please refresh page in few moments.
pulls.can_auto_merge_desc=This pull request can be merged automatically.
pulls.is_checking=Controle van conflicten is nog bezig, ververs deze pagina in enkele ogenblikken.
pulls.can_auto_merge_desc=Dit pull-request kan automatisch samengevoegd worden.
pulls.cannot_auto_merge_desc=This pull request can't be merged automatically because there are conflicts.
pulls.cannot_auto_merge_helper=Please merge manually in order to resolve the conflicts.
pulls.merge_pull_request=Samenvoegen van pull verzoek
@@ -546,14 +548,14 @@ milestones.deletion_success=Mijlpaal is met succes verwijderd!
wiki=Wiki
wiki.welcome=Welcome to Wiki!
wiki.welcome_desc=Wiki is the place where you would like to document your project together and make it better.
wiki.create_first_page=Create the first page
wiki.page=Page
wiki.filter_page=Filter page
wiki.new_page=Create New Page
wiki.default_commit_message=Write a note about this update (optional).
wiki.save_page=Save Page
wiki.create_first_page=Maak de eerste pagina
wiki.page=Pagina
wiki.filter_page=Filter pagina
wiki.new_page=Maak nieuwe pagina
wiki.default_commit_message=Schrijf een notitie over deze aanpassing (optioneel).
wiki.save_page=Pagina opslaan
wiki.last_commit_info=%s edited this page %s
wiki.edit_page_button=Edit
wiki.edit_page_button=Bewerken
wiki.new_page_button=New Page
wiki.page_already_exists=Wiki page with same name already exists.
wiki.pages=Pages
@@ -610,7 +612,7 @@ settings.webhook_deletion_desc=Delete this webhook will remove its information a
settings.webhook_deletion_success=Webhook has been deleted successfully!
settings.webhook.test_delivery=Test Delivery
settings.webhook.test_delivery_desc=Send a fake push event delivery to test your webhook settings
settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may taks few seconds before it shows up in the delivery history.
settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history.
settings.webhook.request=Verzoek
settings.webhook.response=Antwoord
settings.webhook.headers=Headers
@@ -650,7 +652,7 @@ settings.slack_domain=Slack domein
settings.slack_channel=Slack kanaal
settings.deploy_keys=Installeer sleutels
settings.add_deploy_key=Toevoegen deploy sleutel
settings.deploy_key_desc=Deploy key only has read-only access. It is not same as personal account SSH keys.
settings.deploy_key_desc=Deploy keys have read-only access. They are not the same as personal account SSH keys.
settings.no_deploy_keys=U hebt nog geen deploy sleutels toegevoegd.
settings.title=Titel
settings.deploy_key_content=Inhoud
@@ -666,6 +668,8 @@ diff.parent=bovenliggende
diff.commit=commit
diff.data_not_available=Diff gegevens niet beschikbaar.
diff.show_diff_stats=Toon Diff Stats
diff.show_split_view=Split View
diff.show_unified_view=Unified View
diff.stats_desc=<strong>%d gewijzigde bestanden</strong> met <strong>toevoegingen van %d</strong> en <strong>%d verwijderingen</strong>
diff.bin=BIN
diff.view_file=Bestand weergeven

View File

@@ -133,7 +133,7 @@ my_orgs=Moje organizacje
my_mirrors=Moje kopie lustrzane
view_home=Zobacz %s
issues.in_your_repos=W twoich repozytoriach
issues.in_your_repos=W Twoich repozytoriach
[explore]
repos=Repozytoria
@@ -156,7 +156,7 @@ resend_mail=Kliknij tutaj, aby wysłać e-mail aktywacyjny
email_not_associate=Ten adres e-mail nie jest skojarzony z żadnym kontem.
send_reset_mail=Kliknij tutaj, aby (ponownie) wysłać e-mail z instrukcjami resetowania hasła
reset_password=Resetowanie hasła
invalid_code=Niestety, twój kod potwierdzający wygasł lub jest nieprawidłowy.
invalid_code=Niestety, Twój kod potwierdzający wygasł lub jest nieprawidłowy.
reset_password_helper=Kliknij tutaj, aby zresetować hasło
password_too_short=Długość hasła nie może być mniejsza niż 6 znaków.
@@ -211,8 +211,8 @@ enterred_invalid_password=Proszę upewnij się, że wprowadzono hasło jest popr
user_not_exist=Podany użytkownik nie istnieje.
last_org_owner=Usuwany użytkownik jest ostatnim członkiem ekipy właścicieli. Musi być inny właściciel.
invalid_ssh_key=Niestety, nie jesteśmy stanie zweryfikować twojego klucza SSH: %s
unable_verify_ssh_key=Gogs nie może zweryfikować twojego klucza SSH, ale zakładamy, że jest poprawny, proszę sprawdź to samodzielnie.
invalid_ssh_key=Niestety, nie jesteśmy stanie zweryfikować Twojego klucza SSH: %s
unable_verify_ssh_key=Gogs nie może zweryfikować Twojego klucza SSH, ale zakładamy, że jest poprawny, proszę sprawdź to samodzielnie.
auth_failed=Uwierzytelnianie nie powiodło się: %v
still_own_repo=Twoje konto dalej posiada przynajmniej jedno repozytorium, które musisz usunąć lub przekazać.
@@ -232,6 +232,8 @@ activity=Publiczna aktywność
followers=Obserwujący
starred=Polubionych
following=Obserwowani
follow=Follow
unfollow=Unfollow
form.name_reserved=Nazwa użytkownika "%s" jest zarezerwowana.
form.name_pattern_not_allowed=Wzorzec nazwy użytkownika "%s" jest niedozwolony.
@@ -301,7 +303,7 @@ key_content=Treść
add_key_success=Pomyślnie dodano nowy klucz SSH '%s'!
delete_key=Usuń
ssh_key_deletion=Usunięcie klucza SSH
ssh_key_deletion_desc=Usunięcie tego klucza SSH będzie skutkować usunięciem wszystkich powiązanych dostępów do twojego konta. Czy chcesz kontynuować?
ssh_key_deletion_desc=Usunięcie tego klucza SSH będzie skutkować usunięciem wszystkich powiązanych dostępów do Twojego konta. Czy chcesz kontynuować?
ssh_key_deletion_success=Klucz SSH został usunięty pomyślnie!
add_on=Dodano
last_used=Ostatnio użyto
@@ -666,6 +668,8 @@ diff.parent=rodzic
diff.commit=commit
diff.data_not_available=Informacje nt. zmiany nie są dostępne.
diff.show_diff_stats=Pokaż statystyki zmian
diff.show_split_view=Split View
diff.show_unified_view=Unified View
diff.stats_desc=<strong>%d zmienionych plików</strong> z <strong>%d dodań</strong> i <strong>%d usunięć</strong>
diff.bin=BIN
diff.view_file=Wyświetl plik

View File

@@ -28,7 +28,7 @@ organization=Organização
mirror=Espelho
new_repo=Novo Repositório
new_migrate=Nova Migração
new_mirror=New Mirror
new_mirror=Novo espelho
new_fork=Novo Fork de Repositório
new_org=Nova Organização
manage_org=Gerenciar Organizações
@@ -39,7 +39,7 @@ your_profile=Seu perfil
your_settings=Suas configurações
news_feed=Feed de Notícias
pull_requests=Solicitações de Pull
pull_requests=Pull Requests
issues=Problemas
cancel=Cancelar
@@ -232,6 +232,8 @@ activity=Atividade Pública
followers=Seguidores
starred=Favorito
following=Seguindo
follow=Seguir
unfollow=Deixar de seguir
form.name_reserved=O nome de usuário '%s' não pode ser usado.
form.name_pattern_not_allowed=Não é permitido usar o padrão '%s' para o nome de usuário.
@@ -248,7 +250,7 @@ uid=Uid
public_profile=Perfil Público
profile_desc=Seu endereço de E-mail é publico e será usado para qualquer notificação relacionada à conta, e qualquer operação na web feita através do site.
password_username_disabled=Non-local type users are not allowed to change their username.
password_username_disabled=Usuários do tipo não-local não são permitidos de mudarem seu nome de usuário.
full_name=Nome Completo
website=Site
location=Localização
@@ -273,7 +275,7 @@ new_password=Nova Senha
retype_new_password=Digite novamente a nova senha
password_incorrect=A senha atual não está correta.
change_password_success=A senha está alterada com sucesso. Você pode agora entrar com a senha nova.
password_change_disabled=Non-local type users are not allowed to change their password.
password_change_disabled=Usuários do tipo não-local não são permitidos de mudarem sua senha.
emails=Endereços de E-mail
manage_emails=Gerenciar endereços de e-mail
@@ -361,7 +363,7 @@ watchers=Observadores
stargazers=Usuários que estrelaram
forks=Forks
form.reach_limit_of_creation=The owner has reached maximum creation limit of %d repositories.
form.reach_limit_of_creation=O proprietário atingiu o limite máximo de criação de repositórios de %d.
form.name_reserved=O nome de repositório '%s' não pode ser usado.
form.name_pattern_not_allowed=Não é permitido usar o padrão '%s' para o nome de repositório.
@@ -513,9 +515,9 @@ pulls.merged=Merge realizado
pulls.has_merged=Este pull request foi mesclado com sucesso!
pulls.data_broken=Dados deste pull request foram quebrados devido à deleção de informação do fork.
pulls.is_checking=A verificação do conflito ainda está em progresso, por favor recarregue a página em instantes.
pulls.can_auto_merge_desc=This pull request can be merged automatically.
pulls.cannot_auto_merge_desc=This pull request can't be merged automatically because there are conflicts.
pulls.cannot_auto_merge_helper=Please merge manually in order to resolve the conflicts.
pulls.can_auto_merge_desc=Este pull request foi mesclado automaticamente.
pulls.cannot_auto_merge_desc=Este pull request não pode ser mesclado automaticamente pois há conflitos.
pulls.cannot_auto_merge_helper=Por favor, mescle manualmente para resolver os conflitos.
pulls.merge_pull_request=Merge Pull Request
pulls.open_unmerged_pull_exists=' Você não pode executar a operação de reabrir porque já existe uma solicitação de pull aberta (#%d) do mesmo repositório com as mesmas informações de merge e está esperando pelo merge.'
@@ -570,9 +572,9 @@ settings.update_settings=Configurações de Atualização
settings.change_reponame_prompt=Este mudanças vai afetar os links para este repositório.
settings.advanced_settings=Configurações avançadas
settings.wiki_desc=Habilitar o wiki para permitir que as pessoas escrevam documentos
settings.use_external_wiki=Use external wiki
settings.external_wiki_url=External Wiki URL
settings.external_wiki_url_desc=Visitors will be redirected to URL when they click on the tab.
settings.use_external_wiki=Usar wiki externa
settings.external_wiki_url=URL externa da wiki
settings.external_wiki_url_desc=Os visitantes serão redirecionados para a URL quando clicarem na aba.
settings.issues_desc=Habilitar gerenciamento de "problemas" nativo
settings.use_external_issue_tracker=Usar issue tracker externo
settings.tracker_url_format=Formato de URL do issue tracker externo
@@ -666,6 +668,8 @@ diff.parent=pai
diff.commit=commit
diff.data_not_available=Dados de Diff não disponíveis.
diff.show_diff_stats=Mostrar estatísticas do Diff
diff.show_split_view=Visão dividida
diff.show_unified_view=Visão unificada
diff.stats_desc=<strong> %d arquivos alterados</strong> com <strong>%d adições</strong> e <strong>%d exclusões</strong>
diff.bin=BIN
diff.view_file=Ver Arquivo
@@ -861,8 +865,8 @@ users.auth_login_name=Nome de login da autenticação
users.password_helper=Deixe em branco para não mudar.
users.update_profile_success=O perfil da conta foi atualizado com sucesso.
users.edit_account=Editar Conta
users.max_repo_creation=Maximum Repository Creation Limit
users.max_repo_creation_desc=(Set -1 to use global default limit)
users.max_repo_creation=Limite máximo de criação de repositórios
users.max_repo_creation_desc=(Use "-1" para utilizar o limite padrão)
users.is_activated=Esta conta está ativada
users.is_admin=Esta conta tem permissões de administrador
users.allow_git_hook=Esta conta tem permissões para criar hooks do Git
@@ -1030,7 +1034,7 @@ comment_issue='comentou sobre a questão <a href="%s/issues/%s">%s#%[2]s</a>'
merge_pull_request=`mesclou o pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
transfer_repo=repositório transferido de <code>%s</code> para <a href="%s">%s</a>
push_tag=Foi feito push na tag <a href="%s/src/%s">%[2]s</a> para <a href="%[1]s">%[3]s</a>
compare_commits=View comparison for these %d commits
compare_commits=Ver comparação entre esses %d commits
[tool]
ago=atrás

View File

@@ -7,7 +7,7 @@ help=Помощь
sign_in=Войти
sign_out=Выход
sign_up=Регистрация
register=Зарегистрироваться
register=Регистрация
website=Веб-сайт
version=Версия
page=Страница
@@ -28,10 +28,10 @@ organization=Организация
mirror=Зеркало
new_repo=Новый репозиторий
new_migrate=Новая Миграция
new_mirror=New Mirror
new_mirror=Новое зеркало
new_fork=Новый проект из репозитория
new_org=Новая Организация
manage_org=Управление Организацией
new_org=Новая организация
manage_org=Управление организацией
admin_panel=Панель администратора
account_settings=Настройки аккаунта
settings=Настройки
@@ -39,8 +39,8 @@ your_profile=Ваш профиль
your_settings=Ваши настройки
news_feed=Лента новостей
pull_requests=Pull Requests
issues=Вопросы
pull_requests=Запросы на слияние
issues=Задачи
cancel=Отмена
@@ -48,13 +48,13 @@ cancel=Отмена
search=Поиск...
repository=Репозиторий
user=Пользователь
issue=Проблема
issue=Задача
code=Код
[install]
install=Установка
title=Установочные шаги для первого запуска
docker_helper=Если вы используете Gogs в Docker-контейнере, пожалуйста прочтите <a target="_blank" href="%s">эти советы</a>, перед тем как что-либо изменить!
docker_helper=Если вы запускаете Gogs внутри Docker, пожалуйста прочтите <a target="_blank" href="%s">эти советы</a> внимательно перед тем как что-либо изменить на этой странице!
requite_db_desc=Gogs требует MySQL, PostgreSQL, SQLite3 или TiDB.
db_title=Настройки базы данных
db_type=Тип базы данных
@@ -65,17 +65,17 @@ db_name=Имя базы данных
db_helper=Для MySQL используйте тип таблиц InnoDB с кодировкой utf8_general_ci.
ssl_mode=Режим SSL
path=Путь
sqlite_helper=Путь до базы данных SQLite или TiDB.
sqlite_helper=Путь к файлу базы данных SQLite3 или TiDB.
err_empty_db_path=Путь к базе данных SQLite3 или TiDB не может быть пустым.
err_invalid_tidb_name=Название базы данных TiDB не может содержать символы "." и "-".
no_admin_and_disable_registration=Вы не можете отключить регистрацию, не создав аккаунт администратора.
err_invalid_tidb_name=Имя базы данных TiDB не может содержать символы "." и "-".
no_admin_and_disable_registration=Вы не можете отключить регистрацию до создания учетной записи администратора.
err_empty_admin_password=Пароль администратора не может быть пустым.
general_title=Общие параметры Gogs
app_name=Имя приложения
app_name_helper=Укажите здесь название вашей потрясающей организации!
repo_path=Путь корня репозитория
repo_path_helper=Все удаленные репозитории Git будут сохранены в этой директории.
repo_path_helper=Все сетевые репозитории Git будут сохранены в этой директории.
run_user=Пользователь
run_user_helper=У пользователя должен быть доступ к пути к корню репозитория и к запуску Gogs.
domain=Домен
@@ -133,7 +133,7 @@ my_orgs=Моя Организация
my_mirrors=Мои зеркала
view_home=Показать %s
issues.in_your_repos=В вашем репозитории
issues.in_your_repos=В ваших репозиториях
[explore]
repos=Репозитории
@@ -226,12 +226,14 @@ target_branch_not_exist=Целевая ветка не существует
[user]
change_avatar=Измените ваш аватар на gravatar.com
change_custom_avatar=Измените ваш аватар в настройках
join_on=Присоединилась к
join_on=Присоединился
repositories=Репозитории
activity=Активность
followers=Подписчики
starred=Избранное
following=Подписан
follow=Подписаться
unfollow=Отписаться
form.name_reserved=Имя пользователя '%s' зарезервировано.
form.name_pattern_not_allowed=Имя пользователя «%s» не допускается.
@@ -248,7 +250,7 @@ uid=UID
public_profile=Открытый профиль
profile_desc=Адрес вашей электронной почты является публичным и будет использован для любых уведомлений, связанных с аккаунтом, а также для любых действий, совершенных через сайт.
password_username_disabled=Non-local type users are not allowed to change their username.
password_username_disabled=Нелокальные пользователи не могут изменить своё имя.
full_name=ФИО
website=Веб-сайт
location=Местоположение
@@ -273,7 +275,7 @@ new_password=Новый пароль
retype_new_password=Подтверждение нового пароля
password_incorrect=Текущий пароль не правильный.
change_password_success=Пароль сменен успешно. Теперь вы можете войти с новым паролем.
password_change_disabled=Non-local type users are not allowed to change their password.
password_change_disabled=Нелокальные пользователи не могут изменить свой пароль.
emails=Адреса электронной почты
manage_emails=Управление адресами электронной почты
@@ -355,13 +357,13 @@ auto_init=Инициализировать этот репозиторий вы
create_repo=Создать репозиторий
default_branch=Ветка по умолчанию
mirror_interval=Интервал зеркалирования (час)
mirror_address=Mirror Address
mirror_address_desc=Please include necessary user credentials in the address.
mirror_address=Адрес зеркала
mirror_address_desc=Укажите необходимые учетные данные в адрес.
watchers=Наблюдатели
stargazers=Звездочеты
forks=Форки
form.reach_limit_of_creation=The owner has reached maximum creation limit of %d repositories.
form.reach_limit_of_creation=У владельца достигнут максимальный предел в %d создаваемых репозиториев.
form.name_reserved=Имя репозитория '%s' зарезервировано.
form.name_pattern_not_allowed=Шаблон имени репозитория '%s' не допускается.
@@ -375,7 +377,7 @@ migrate.permission_denied=У вас нет прав на импорт локал
migrate.invalid_local_path=Недопустимый локальный путь. Возможно он не существует или является не папкой.
migrate.failed=Миграция не удалась: %v
mirror_from=mirror from
mirror_from=зеркало из
forked_from=форк от
fork_from_self=Вы не можете форкнуть репозитарий, так как Вы уже его владелец!
copy_link=Скопировать
@@ -402,7 +404,7 @@ filter_branch_and_tag=Фильтр по ветке или тегу
branches=Ветки
tags=Метки
issues=Обсуждения
pulls=Пулл реквесты
pulls=Запросы на слияние
labels=Метки
milestones=Этапы
commits=Коммиты
@@ -423,7 +425,7 @@ commits.newer=Новее
issues.new=Новая задача
issues.new.labels=Метки
issues.new.no_label=Не метка
issues.new.no_label=Нет меток
issues.new.clear_labels=Отчистить метки
issues.new.milestone=Этап
issues.new.no_milestone=Нет этапа
@@ -437,8 +439,8 @@ issues.create=Добавить задачу
issues.new_label=Новая метка
issues.new_label_placeholder=Имя метки...
issues.create_label=Добавить метку
issues.open_tab=%d Открыть
issues.close_tab=%d Закрыть
issues.open_tab=%d открыто(ы)
issues.close_tab=%d закрыто(ы)
issues.filter_label=Метка
issues.filter_label_no_select=Нет выбранной метки
issues.filter_milestone=Этап
@@ -447,7 +449,7 @@ issues.filter_assignee=Назначено
issues.filter_assginee_no_select=Ответственный не выбран
issues.filter_type=Тип
issues.filter_type.all_issues=Все задачи
issues.filter_type.assigned_to_you=Назначено Вам
issues.filter_type.assigned_to_you=Назначено вам
issues.filter_type.created_by_you=Созданные вами
issues.filter_type.mentioning_you=Вы упомянуты
issues.filter_sort=Сортировать
@@ -457,19 +459,19 @@ issues.filter_sort.recentupdate=Недавно обновленные
issues.filter_sort.leastupdate=Давно обновленные
issues.filter_sort.mostcomment=Большего комментариев
issues.filter_sort.leastcomment=Меньше комментариев
issues.opened_by=%[1] открыта <a href="%[2]s">%[3]s</a>
issues.opened_by=%[1]s открыта <a href="%[2]s">%[3]s</a>
issues.opened_by_fake=%[1]s открыта %[2]s
issues.previous=Предыдущая страница
issues.next=Следующая страница
issues.open_title=Открыта
issues.closed_title=Закрыта
issues.open_title=Открыто
issues.closed_title=Закрыто
issues.num_comments=комментариев: %d
issues.commented_at=` прокомментировал <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.no_content=Пока нет содержимого.
issues.close_issue=Закрыть
issues.close_comment_issue=Прокомментировать и закрыть
issues.reopen_issue=Открыть снова
issues.reopen_comment_issue=Прокомментировать и открыть
issues.reopen_comment_issue=Прокомментировать и открыть снова
issues.create_comment=Комментировать
issues.closed_at=`закрыл <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.reopened_at=`открыл снова <a id="%[1]s" href="#%[1]s">%[2]s</a>`
@@ -493,40 +495,40 @@ issues.label_deletion=Удаление метки
issues.label_deletion_desc=Удаление ярлыка затронет все связанные задачи. Продолжить?
issues.label_deletion_success=Метка была удалена успешно!
pulls.new=Новый пул реквест
pulls.new=Новый запрос на слияние
pulls.compare_changes=Сравнить изменения
pulls.compare_changes_desc=Сравнить две ветки и создать пулл реквест для изменений.
pulls.compare_changes_desc=Сравнить две ветки и создать запрос на слияние для изменений.
pulls.compare_base=родительская ветка
pulls.compare_compare=сравнить
pulls.filter_branch=Фильтр по ветке
pulls.no_results=Результатов не найдено.
pulls.nothing_to_compare=Нечего сравнивать, родительская и текущая ветка одинаковые.
pulls.has_pull_request=`Уже существует пулл-реквест между двумя целями <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=Создать пулл-реквест
pulls.create=Создать запрос на слияние
pulls.title_desc=хочет смерджить %[1]d коммит(ов) из <code>%[2]s</code> в <code>%[3]s</code>
pulls.merged_title_desc=слито %[1]d коммит(ов) из <code>%[2]s</code> в <code>%[3]s</code> %[4]s
pulls.tab_conversation=Обсуждение
pulls.tab_commits=Коммиты
pulls.tab_files=Измененные файлы
pulls.reopen_to_merge=Пожалуйста пересоздайте пулл-реквест для слияния.
pulls.reopen_to_merge=Пожалуйста снова откройте этот запрос для слияния.
pulls.merged=Слито
pulls.has_merged=Слияние этого пулл-реквеста успешно завершено!
pulls.has_merged=Слияние этого запроса успешно завершено!
pulls.data_broken=Содержимое этого пулл-реквеста было нарушено, вследствии удаления или клонирования информации.
pulls.is_checking=Продолжается проверка конфликтов, пожалуйста обновите страницу несколько позже.
pulls.can_auto_merge_desc=This pull request can be merged automatically.
pulls.cannot_auto_merge_desc=This pull request can't be merged automatically because there are conflicts.
pulls.cannot_auto_merge_helper=Please merge manually in order to resolve the conflicts.
pulls.can_auto_merge_desc=Этот запрос на слияние может быть объединён автоматически.
pulls.cannot_auto_merge_desc=Этот запрос на слияние не может быть объединён автоматически.
pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов.
pulls.merge_pull_request=Слить пулл-реквест
pulls.open_unmerged_pull_exists=`Вы не можете произвести операцию переоткрытия, потому что уже существует пулл-реквест (#%d) из этого же репозитория, с такими же параметрами слияния, который ожидает слияния.`
pulls.open_unmerged_pull_exists=`Вы не можете снова открыть, поскольку уже существует запрос на слияние (#%d) из того же репозитория с той же информацией о слиянии и ожидающий слияния. `
milestones.new=Новая контрольная точка
milestones.open_tab=%d открыты
milestones.close_tab=%d Закрыт
milestones.close_tab=%d закрыты
milestones.closed=Закрыт %s
milestones.no_due_date=Срок не указан
milestones.open=Открыть
milestones.close=Закрыть
milestones.new_subheader=Создавайте контрольные точки для трекинга ваших вопросов.
milestones.new_subheader=Создавайте этапы для организации ваших задач.
milestones.create=Создать контрольную точку
milestones.title=Заголовок
milestones.desc=Описание
@@ -540,7 +542,7 @@ milestones.cancel=Отмена
milestones.modify=Изменить контрольную точку
milestones.edit_success=Изменения контрольной точки '%s' успешно сохранены!
milestones.deletion=Удаление контрольной точки
milestones.deletion_desc=Удаление этой контрольной точки приведет с удалению всей информации, во всех вопросах (Issues). Вы действительно хотите продолжить?
milestones.deletion_desc=Удаление этого этапа приведет к удалению связанной информации во всех связанных задачах. Вы хотите продолжить?
milestones.deletion_success=Контрольная точка успешно удалена!
wiki=Вики
@@ -569,15 +571,15 @@ settings.site=Официальный сайт
settings.update_settings=Обновить настройки
settings.change_reponame_prompt=Это изменение повлияет на отношения ссылок к этому репозиторию.
settings.advanced_settings=Расширенные настройки
settings.wiki_desc=Включить Вики, чтобы позволить людям ипсать документы
settings.use_external_wiki=Use external wiki
settings.external_wiki_url=External Wiki URL
settings.external_wiki_url_desc=Visitors will be redirected to URL when they click on the tab.
settings.wiki_desc=Включить Вики, чтобы позволить людям писать документы
settings.use_external_wiki=Использовать внешнюю Wiki
settings.external_wiki_url=URL-адрес внешней вики
settings.external_wiki_url_desc=Посетители будут перенаправлены на URL-адрес, когда они кликнут по вкладке.
settings.issues_desc=Включить встроенную, легковесную систему отслеживания ошибок
settings.use_external_issue_tracker=Использовать внешнюю систему отслеживания ошибок
settings.tracker_url_format=Внешний формат ссылки системы отслеживания ошибок.
settings.tracker_url_format_desc=Вы можете использовать шаблон <code>{user} {repo} {index}</code> для имени пользователя, репозитория и номера обсуждения.
settings.pulls_desc=Включить публичные пулл-реквесты
settings.tracker_url_format_desc=Вы можете использовать шаблон <code>{user} {repo} {index}</code> для имени пользователя, репозитория и номера задачи.
settings.pulls_desc=Включить публичные запросы на слияние
settings.danger_zone=Опасная зона
settings.transfer=Передать права собственности
settings.transfer_desc=Передать репозиторий другому пользователю или организации где у вас есть права администратора.
@@ -588,7 +590,7 @@ settings.transfer_notices_1=- Вы можете потерять доступ,
settings.transfer_notices_2=- Вы сохраните доступ, если новым владельцем станет организация, владельцем которой вы являетесь.
settings.transfer_form_title=Введите сопутствующую информацию для подтверждения операции:
settings.delete_notices_1=- Эта операция <strong>НЕ МОЖЕТ</strong> быть отменена.
settings.delete_notices_2=- Эта операция перманентно удалит всё из этого репозитория, включая данные Git, связанные с ним вопросы, комментарии и права доступа для сотрудников.
settings.delete_notices_2=- Эта операция навсегда удалит всё из этого репозитория, включая данные Git, связанные с ним задачи, комментарии и права доступа для сотрудников.
settings.delete_notices_fork_1=- Если данный репозиторий является публичным, все склонированные репозитории останутся независимыми, после его удаления.
settings.delete_notices_fork_2=- Если данный репозиторий является приватным, все его форки будут удалены вместе с ним.
settings.delete_notices_fork_3=- Если вы хотите сохранить все форки после удаления репозитория, то сначала сделайте его публичным.
@@ -608,9 +610,9 @@ settings.hooks_desc=Webhooks позволяют внешним службам п
settings.webhook_deletion=Удалить веб-хук
settings.webhook_deletion_desc=Удаление этого веб-хука приведет к удалению всей, связанной с ним, информации, включая историю. Хотите продолжить?
settings.webhook_deletion_success=Веб-хук успешно удален!
settings.webhook.test_delivery=Test Delivery
settings.webhook.test_delivery_desc=Send a fake push event delivery to test your webhook settings
settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may taks few seconds before it shows up in the delivery history.
settings.webhook.test_delivery=Проверить доставку
settings.webhook.test_delivery_desc=Отправить push для тестирования настройки веб-хуков
settings.webhook.test_delivery_success=Тест веб-хука была добавлен в очередь доставки. Это может занять несколько секунд, прежде чем он отобразится в истории доставки.
settings.webhook.request=Запрос
settings.webhook.response=Ответ
settings.webhook.headers=Заголовки
@@ -650,7 +652,7 @@ settings.slack_domain=Домен
settings.slack_channel=Канал
settings.deploy_keys=Ключи развертывания
settings.add_deploy_key=Добавить ключ развертывания
settings.deploy_key_desc=Deploy key only has read-only access. It is not same as personal account SSH keys.
settings.deploy_key_desc=Ключи развёртывания доступны только для чтения. Это не то же самое что и SSH-ключи аккаунта.
settings.no_deploy_keys=Вы не добавляли ключи развертывания.
settings.title=Заголовок
settings.deploy_key_content=Содержимое
@@ -666,6 +668,8 @@ diff.parent=Родитель
diff.commit=Сommit
diff.data_not_available=Данные Diff не доступны.
diff.show_diff_stats=Показать статистику Diff
diff.show_split_view=Разделённый вид
diff.show_unified_view=Единый вид
diff.stats_desc=<strong> %d измененных файлов</strong> с <strong>%d добавлено</strong> и <strong>%d удалено</strong>
diff.bin=BIN
diff.view_file=Просмотреть файл
@@ -796,7 +800,7 @@ total=Всего: %d
dashboard.statistic=Статистика
dashboard.operations=Операции
dashboard.system_status=Статус системного монитора
dashboard.statistic_info=В базе данных Gogs записано <b>%d</b> пользователей, <b>%d</b> организаций, <b>%d</b> публичных ключей, <b>%d</b> репозиторий, <b>%d</b> подписок на репозитории, <b>%d</b> добавлений в избранное, <b>%d</b> действий, <b>%d</b> доступов, <b>%d</b> обсуждений, <b>%d</b> комментариев, <b>%d</b> социальных учетных записей, <b>%d</b> подписок на пользователей, <b>%d</b> зеркал, <b>%d</b> релизов, <b>%d</b> источников входа, <b>%d</b> веб-хуков, <b>%d</b> вех, <b>%d</b> меток, <b>%d</b> задач хуков, <b>%d</b> команд, <b>%d</b> задач по обновлению, <b>%d</b> присоединенных файлов.
dashboard.statistic_info=В базе данных Gogs записано <b>%d</b> пользователей, <b>%d</b> организаций, <b>%d</b> публичных ключей, <b>%d</b> репозиториев, <b>%d</b> подписок на репозитории, <b>%d</b> добавлений в избранное, <b>%d</b> действий, <b>%d</b> доступов, <b>%d</b> задач, <b>%d</b> комментариев, <b>%d</b> социальных учетных записей, <b>%d</b> подписок на пользователей, <b>%d</b> зеркал, <b>%d</b> релизов, <b>%d</b> источников входа, <b>%d</b> веб-хуков, <b>%d</b> этапов, <b>%d</b> меток, <b>%d</b> задач хуков, <b>%d</b> команд, <b>%d</b> задач по обновлению, <b>%d</b> присоединенных файлов.
dashboard.operation_name=Наименование Операции
dashboard.operation_switch=Переключить
dashboard.operation_run=Запуск
@@ -861,8 +865,8 @@ users.auth_login_name=Логин для авторизации
users.password_helper=Оставьте пустым, чтобы оставить без изменений.
users.update_profile_success=Профиль учетной записи обновлен успешно.
users.edit_account=Изменение учетной записи
users.max_repo_creation=Maximum Repository Creation Limit
users.max_repo_creation_desc=(Set -1 to use global default limit)
users.max_repo_creation=Ограничение максимального количества создаваемых репозиториев
users.max_repo_creation_desc=(Установить -1 для использования стандартного глобального значения предела)
users.is_activated=Эта учетная запись активирована
users.is_admin=У этой учетной записи есть права администратора
users.allow_git_hook=Пользователь имеет право создать Git перехватчик
@@ -884,7 +888,7 @@ repos.name=Имя
repos.private=Приватный
repos.watches=Следят
repos.stars=В избранном
repos.issues=Вопросы
repos.issues=Задачи
auths.auth_manage_panel=Панель управления аутнентификациями
auths.new=Добавить новый источник
@@ -903,7 +907,7 @@ auths.bind_password_helper=Внимание: Этот пароль сохран
auths.user_base=База для поиска пользователя
auths.user_dn=DN пользователя
auths.attribute_username=Атрибут username
auths.attribute_username_placeholder=Leave empty to use sign-in form field value for user name.
auths.attribute_username_placeholder=Оставьте пустым, чтобы использовать имя пользователя для регистрации.
auths.attribute_name=Имя аттрибута
auths.attribute_surname=Фамилия аттрибута
auths.attribute_mail=Электронная почта аттрибута
@@ -1021,16 +1025,16 @@ notices.op=Op.
notices.delete_success=Системное уведомление успешно удалено.
[action]
create_repo=создан репозиторий <a href="%s"> %s</a>
create_repo=создал репозиторий <a href="%s"> %s</a>
rename_repo=репозиторий переименован из <code>%[1]s</code>на <a href="%[2]s">%[3]s</a>
commit_repo=запушил <a href="%[1]s/src/%[2]s">%[3]s</a> в <a href="%[1]s">%[4]s</a>
create_issue=`открытый вопрос <a href="%s/issues/%s">%s#%[2]</a>`
create_issue=`открыл(а) задачу <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request=`созданный пулл-реквест <a href="%s/pulls/%s">%s#%[2]s</a>`
comment_issue=`прокомментировал(а) вопрос <a href="%s/issues/%s">%s#%[2]s</a>`
merge_pull_request=`слил пул реквест <a href="%s/pulls/%s">%s#%[2]s</a>`
transfer_repo=перенес репозиторий <code>%s</code> в <a href="%s">%s</a>
push_tag=запушил тэг <a href="%s/src/%s">%[2]s</a> в <a href="%[1]s">%[3]s</a>
compare_commits=View comparison for these %d commits
compare_commits=Просмотр сравнение для этих %d коммитов
[tool]
ago=назад

View File

@@ -232,6 +232,8 @@ activity=公开活动
followers=关注者
starred=已点赞
following=关注中
follow=关注
unfollow=取消关注
form.name_reserved=用户名 '%s' 是被保留的。
form.name_pattern_not_allowed=用户名不允许 '%s' 的格式。
@@ -666,6 +668,8 @@ diff.parent=父节点
diff.commit=当前提交
diff.data_not_available=暂无可用数据
diff.show_diff_stats=显示文件统计
diff.show_split_view=分列视图
diff.show_unified_view=合并视图
diff.stats_desc=共有 <strong> %d 个文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong>
diff.bin=二进制
diff.view_file=查看文件

View File

@@ -3,44 +3,44 @@ app_desc=基於 Go 語言的自助 Git 服務
home=首頁
dashboard=控制面版
explore=探索
help=幫助
sign_in=
sign_out=退
help=說明
sign_in=
sign_out=
sign_up=註冊
register=註冊
website=官方網站
version=當前版本
website=網站
version=版本
page=頁面
template=模版
language=語言選項
template=樣板
language=語言
create_new=創建...
user_profile_and_more=用戶信息及更多
signed_in_as=已登錄用戶
username=用戶名
email=郵箱
username=用戶名
email=電子郵件
password=密碼
re_type=確認密碼
captcha=驗證碼
repository=
repository=儲存
organization=組織
mirror=鏡像
new_repo=創建新的倉
new_repo=新增儲存
new_migrate=遷移外部倉庫
new_mirror=New Mirror
new_fork=的派生倉庫
new_org=創建新的組織
manage_org=管理我的組織
admin_panel=管理面
account_settings=戶設置
settings=帳戶設置
your_profile=個人信息
your_settings=用戶設
new_mirror=新鏡像
new_fork=增程式庫分支
new_org=新增組織
manage_org=管理組織
admin_panel=管理面
account_settings=號設定
settings=設定
your_profile=個人資料
your_settings=用戶設
news_feed=最新活
news_feed=態消息
pull_requests=合併請求
issues=問題管理
issues=問題
cancel=取消
@@ -53,15 +53,15 @@ code=程式碼
[install]
install=安裝頁面
title=首次執行安裝程序
title=首次安裝步驟
docker_helper=如果您正在使用 Docker 容器運行 Gogs請務必先仔細閱讀 <a target="_blank" href="%s">官方文檔</a> 後再對本頁面進行填寫。
requite_db_desc=Gogs 要求安裝 MySQL、PostgreSQL、SQLite3 或 TiDB。
db_title=數據庫設置
db_type=數據庫類型
host=數據庫主機
user=數據庫用戶
password=數據庫用戶密碼
db_name=數據庫名稱
db_type=資料庫類型
host=主機
user=帳號
password=密碼
db_name=資料庫名稱
db_helper=如果您使用 MySQL請使用 INNODB 引擎以及 utf8_general_ci 字符集。
ssl_mode=SSL 模式
path=數據庫文件路徑
@@ -74,25 +74,25 @@ err_empty_admin_password=管理員密碼不能為空。
general_title=應用基本設置
app_name=應用名稱
app_name_helper=為您的組織取個響亮而又偉大的名稱
repo_path=倉庫根目錄
repo_path_helper=所有 Git 遠程倉庫都將被存放於該目錄
run_user=執行系統用戶
run_user_helper=該用戶必須具有對庫根目錄和執行 Gogs 的操作權限。
repo_path=儲存庫的根目錄
repo_path_helper=所有Git遠端儲存庫將會儲存在這個目錄之下
run_user=執行使用者
run_user_helper=該用戶必須具有對儲存庫根目錄和執行 Gogs 的操作權限。
domain=域名
domain_helper=該設置影響 SSH 複製地址。
ssh_port=SSH 埠
ssh_port_helper=您的 SSH 服務正在使用此埠號若要禁用SSH 功能請保持欄位空白。
http_port=HTTP 端口號
http_port_helper=應用監聽的端口號
app_url=應用 URL
app_url=應用程式網址
app_url_helper=該設置影響 HTTP/HTTPS 複製地址和一些郵箱中的連結。
optional_title=可選設置
email_title=電子郵件服務設定
smtp_host=SMTP 主機
smtp_from=郵件來自
smtp_from=寄件者
smtp_from_helper=郵件來自地址,遵循 RFC 5322 標准。可以是一個單純的郵箱地址或使用 "name" <email@example.com> 的格式。
mailer_user=發送郵箱
mailer_user=寄件者 E-mail
mailer_password=發送郵箱密碼
register_confirm=啟用註冊郵箱確認
mail_notify=啟用郵件通知提醒
@@ -174,7 +174,7 @@ modify=確認修改
[form]
UserName=用戶名
RepoName=庫名稱
RepoName=儲存庫名稱
Email=郵箱地址
Password=密碼
Retype=確認密碼
@@ -232,6 +232,8 @@ activity=公開活動
followers=關註者
starred=已讚好
following=關註中
follow=關注
unfollow=取消關注
form.name_reserved=用戶名 '%s' 是被保留的。
form.name_pattern_not_allowed=用戶名不允許 '%s' 的格式。
@@ -248,7 +250,7 @@ uid=用戶 ID
public_profile=公開信息
profile_desc=您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。
password_username_disabled=Non-local type users are not allowed to change their username.
password_username_disabled=不允許非本地類型使用者更改他們的使用者名。
full_name=自定義名稱
website=個人網站
location=所在地區
@@ -273,7 +275,7 @@ new_password=新的密碼
retype_new_password=重新輸入新的密碼
password_incorrect=當前密碼不正確!
change_password_success=密碼修改成功!您現在可以使用新的密碼登錄。
password_change_disabled=Non-local type users are not allowed to change their password.
password_change_disabled=不允許非本地類型使用者,更改其密碼。
emails=電子郵件地址
manage_emails=管理電子郵件地址
@@ -355,13 +357,13 @@ auto_init=使用選定的文件和模板初始化倉庫
create_repo=創建倉庫
default_branch=默認分支
mirror_interval=鏡像同步周期(小時)
mirror_address=Mirror Address
mirror_address_desc=Please include necessary user credentials in the address.
mirror_address=鏡像地址
mirror_address_desc=請在位址中包括必要的使用者憑據。
watchers=關注者
stargazers=稱讚者
forks=派生倉庫
form.reach_limit_of_creation=The owner has reached maximum creation limit of %d repositories.
form.reach_limit_of_creation=擁有者已達到儲存庫最大的新增上限 %d。
form.name_reserved=倉庫名稱 '%s' 是被保留的。
form.name_pattern_not_allowed=倉庫名稱不允許 '%s' 的格式。
@@ -375,14 +377,14 @@ migrate.permission_denied=您並沒有導入本地倉庫的權限。
migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄!
migrate.failed=遷移失敗:%v
mirror_from=mirror from
mirror_from=镜像来自
forked_from=派生自
fork_from_self=無法派生已經擁有的倉庫!
copy_link=複製連結
copy_link_success=複製成功!
copy_link_error=請按下 ⌘-C 或 Ctrl-C 複製
copied=複製成功
unwatch=取消關
unwatch=取消關
watch=關註
unstar=取消讚好
star=讚好
@@ -513,9 +515,9 @@ pulls.merged=已合併
pulls.has_merged=該合併請求已經成功合併!
pulls.data_broken=該合併請求的數據由於派生倉庫的相關信息被刪除而被破壞。
pulls.is_checking=該合併請求正在進行衝突檢查,請稍後再刷新頁面。
pulls.can_auto_merge_desc=This pull request can be merged automatically.
pulls.cannot_auto_merge_desc=This pull request can't be merged automatically because there are conflicts.
pulls.cannot_auto_merge_helper=Please merge manually in order to resolve the conflicts.
pulls.can_auto_merge_desc=這個拉請求可以自動合併。
pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請求。
pulls.cannot_auto_merge_helper=請手動合併來解決衝突。
pulls.merge_pull_request=合併請求
pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d您無法執行重新開啟操作。`
@@ -570,9 +572,9 @@ settings.update_settings=更新倉庫設置
settings.change_reponame_prompt=該操作將會影響到所有與該倉庫有關的鏈接
settings.advanced_settings=高級設置
settings.wiki_desc=啟用 Wiki 以允許用戶協作文檔
settings.use_external_wiki=Use external wiki
settings.external_wiki_url=External Wiki URL
settings.external_wiki_url_desc=Visitors will be redirected to URL when they click on the tab.
settings.use_external_wiki=使用外部 wiki
settings.external_wiki_url=外部 Wiki 連結
settings.external_wiki_url_desc=當分頁上按一下,訪客將會重新導到 URL。
settings.issues_desc=啟用內置的輕量級問題管理系統
settings.use_external_issue_tracker=使用外部的問題管理系統
settings.tracker_url_format=外部問題管理系統的 URL 格式
@@ -666,6 +668,8 @@ diff.parent=父節點
diff.commit=當前提交
diff.data_not_available=暫無可用數據
diff.show_diff_stats=顯示文件統計
diff.show_split_view=分割檢視
diff.show_unified_view=統一視圖
diff.stats_desc=共有 <strong> %d 個文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong>
diff.bin=二進制
diff.view_file=查看文件
@@ -692,7 +696,7 @@ release.prerelease_desc=這是一個預發佈版本
release.prerelease_helper=我們會告知用戶不建議將本發佈投入生產環境使用。
release.cancel=取消
release.publish=發佈版本
release.save_draft=保在草稿
release.save_draft=儲存草稿
release.edit_release=編輯發佈信息
release.delete_release=刪除此次發布
release.deletion=刪除版本發布操作
@@ -861,8 +865,8 @@ users.auth_login_name=認證登錄名稱
users.password_helper=留空使其保持不變。
users.update_profile_success=該用戶信息更新成功!
users.edit_account=編輯用戶信息
users.max_repo_creation=Maximum Repository Creation Limit
users.max_repo_creation_desc=(Set -1 to use global default limit)
users.max_repo_creation=最大儲存庫新增限制
users.max_repo_creation_desc=(設定 -1 使用全域預設限制)
users.is_activated=該用戶已被激活
users.is_admin=該用戶具有管理員權限
users.allow_git_hook=該帳戶具有創建 Git 鉤子的權限
@@ -1021,16 +1025,16 @@ notices.op=操作
notices.delete_success=系統提示刪除成功!
[action]
create_repo=創建了庫 <a href="%s">%s</a>
create_repo=創建了儲存庫 <a href="%s">%s</a>
rename_repo=重新命名倉庫 <code>%[1]s</code> 為 <a href="%[2]s">%[3]s</a>
commit_repo=推送了 <a href="%[1]s/src/%[2]s">%[3]s</a> 分支的代碼到 <a href="%[1]s">%[4]s</a>
create_issue=`創建了問題 <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request=`創建了合併請求 <a href="%s/pulls/%s">%s#%[2]s</a>`
comment_issue=`評論了問題 <a href="%s/issues/%s">%s#%[2]s</a>`
merge_pull_request=`合併了合併請求 <a href="%s/pulls/%s">%s#%[2]s</a>`
transfer_repo=庫 <code>%s</code> 轉移至 <a href="%s">%s</a>
transfer_repo=儲存庫 <code>%s</code> 轉移至 <a href="%s">%s</a>
push_tag=推送了標籤 <a href="%s/src/%s">%[2]s</a> 到 <a href="%[1]s">%[3]s</a>
compare_commits=View comparison for these %d commits
compare_commits=查看 %d 次提交的內容比對
[tool]
ago=之前

View File

@@ -44,6 +44,15 @@ docker run --name=gogs-data --entrypoint /bin/true gogs/gogs
# Use `docker run` for the first time.
docker run --name=gogs --volumes-from gogs-data -p 10022:22 -p 10080:3000 gogs/gogs
```
#### Using Docker 1.9 Volume command
```
# Create docker volume.
$ docker volume create --name gogs-data
# Use `docker run` for the first time.
$ docker run --name=gogs -p 10022:22 -p 10080:3000 -v gogs-data:/data gogs/gogs
```
## Settings
@@ -52,7 +61,7 @@ Most of settings are obvious and easy to understand, but there are some settings
- **Repository Root Path**: keep it as default value `/home/git/gogs-repositories` because `start.sh` already made a symbolic link for you.
- **Run User**: keep it as default value `git` because `start.sh` already setup a user with name `git`.
- **Domain**: fill in with Docker container IP(e.g. `192.168.99.100`). But if you want to access your Gogs instance from a different physical machine, please fill in with the hostname or IP address of the Docker host machine.
- **SSH Port**: Use the exposed port from Docker container. For example, your SSH server listens on `22` inside Docker, but you expose it by `10022:22`, then use `10022` for this value.
- **SSH Port**: Use the exposed port from Docker container. For example, your SSH server listens on `22` inside Docker, but you expose it by `10022:22`, then use `10022` for this value. **Builtin SSH server is not recommended inside Docker Container**
- **HTTP Port**: Use port you want Gogs to listen on inside Docker container. For example, your Gogs listens on `3000` inside Docker, and you expose it by `10080:3000`, but you still use `3000` for this value.
- **Application URL**: Use combination of **Domain** and **exposed HTTP Port** values(e.g. `http://192.168.99.100:10080/`).

View File

@@ -7,7 +7,7 @@ export GOPATH=/tmp/go
export PATH=${PATH}:${GOPATH}/bin
# Install build deps
apk -U --no-progress add linux-pam-dev go@community gcc musl-dev
apk -U --no-progress add --virtual build-deps linux-pam-dev go gcc musl-dev
# Init go environment to build Gogs
mkdir -p ${GOPATH}/src/github.com/gogits/
@@ -20,7 +20,7 @@ go build -tags "sqlite cert pam"
rm -r $GOPATH
# Remove build deps
apk --no-progress del linux-pam-dev go gcc musl-dev
apk --no-progress del build-deps
# Create git user for Gogs
adduser -H -D -g 'Gogs Git User' git -h /data/git -s /bin/bash && passwd -u git

16
docker/nsswitch.conf Normal file
View File

@@ -0,0 +1,16 @@
# /etc/nsswitch.conf
passwd: compat
group: compat
shadow: compat
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis

View File

@@ -1,10 +1,6 @@
#!/bin/sh
# Check if host keys are present, else create them
if ! test -f /data/ssh/ssh_host_key; then
ssh-keygen -q -f /data/ssh/ssh_host_key -N '' -t rsa1
fi
if ! test -f /data/ssh/ssh_host_rsa_key; then
ssh-keygen -q -f /data/ssh/ssh_host_rsa_key -N '' -t rsa
fi

View File

@@ -4,7 +4,6 @@ ListenAddress 0.0.0.0
ListenAddress ::
Protocol 2
LogLevel INFO
HostKey /data/ssh/ssh_host_key
HostKey /data/ssh/ssh_host_rsa_key
HostKey /data/ssh/ssh_host_dsa_key
HostKey /data/ssh/ssh_host_ecdsa_key

View File

@@ -1,4 +1,4 @@
// +build go1.3
// +build go1.4
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
@@ -12,13 +12,12 @@ import (
"runtime"
"github.com/codegangsta/cli"
_ "github.com/kardianos/minwinsvc"
"github.com/gogits/gogs/cmd"
"github.com/gogits/gogs/modules/setting"
)
const APP_VER = "0.8.0.1212"
const APP_VER = "0.8.25.0129"
func init() {
runtime.GOMAXPROCS(runtime.NumCPU())

View File

@@ -17,7 +17,7 @@ import (
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
api "github.com/gogits/go-gogs-client"
"github.com/gogits/gogs/modules/base"
@@ -90,54 +90,70 @@ func (a *Action) AfterSet(colName string, _ xorm.Cell) {
}
}
func (a Action) GetOpType() int {
func (a *Action) GetOpType() int {
return int(a.OpType)
}
func (a Action) GetActUserName() string {
func (a *Action) GetActUserName() string {
return a.ActUserName
}
func (a Action) GetActEmail() string {
func (a *Action) ShortActUserName() string {
return base.EllipsisString(a.ActUserName, 20)
}
func (a *Action) GetActEmail() string {
return a.ActEmail
}
func (a Action) GetRepoUserName() string {
func (a *Action) GetRepoUserName() string {
return a.RepoUserName
}
func (a Action) GetRepoName() string {
func (a *Action) ShortRepoUserName() string {
return base.EllipsisString(a.RepoUserName, 20)
}
func (a *Action) GetRepoName() string {
return a.RepoName
}
func (a Action) GetRepoPath() string {
func (a *Action) ShortRepoName() string {
return base.EllipsisString(a.RepoName, 33)
}
func (a *Action) GetRepoPath() string {
return path.Join(a.RepoUserName, a.RepoName)
}
func (a Action) GetRepoLink() string {
func (a *Action) ShortRepoPath() string {
return path.Join(a.ShortRepoUserName(), a.ShortRepoName())
}
func (a *Action) GetRepoLink() string {
if len(setting.AppSubUrl) > 0 {
return path.Join(setting.AppSubUrl, a.GetRepoPath())
}
return "/" + a.GetRepoPath()
}
func (a Action) GetBranch() string {
func (a *Action) GetBranch() string {
return a.RefName
}
func (a Action) GetContent() string {
func (a *Action) GetContent() string {
return a.Content
}
func (a Action) GetCreate() time.Time {
func (a *Action) GetCreate() time.Time {
return a.Created
}
func (a Action) GetIssueInfos() []string {
func (a *Action) GetIssueInfos() []string {
return strings.SplitN(a.Content, "|", 2)
}
func (a Action) GetIssueTitle() string {
func (a *Action) GetIssueTitle() string {
index := com.StrTo(a.GetIssueInfos()[0]).MustInt64()
issue, err := GetIssueByIndex(a.RepoID, index)
if err != nil {
@@ -147,7 +163,7 @@ func (a Action) GetIssueTitle() string {
return issue.Name
}
func (a Action) GetIssueContent() string {
func (a *Action) GetIssueContent() string {
index := com.StrTo(a.GetIssueInfos()[0]).MustInt64()
issue, err := GetIssueByIndex(a.RepoID, index)
if err != nil {

View File

@@ -559,5 +559,26 @@ func IsErrAuthenticationNotExist(err error) bool {
}
func (err ErrAuthenticationNotExist) Error() string {
return fmt.Sprintf("Authentication does not exist [id: %d]", err.ID)
return fmt.Sprintf("authentication does not exist [id: %d]", err.ID)
}
// ___________
// \__ ___/___ _____ _____
// | |_/ __ \\__ \ / \
// | |\ ___/ / __ \| Y Y \
// |____| \___ >____ /__|_| /
// \/ \/ \/
type ErrTeamAlreadyExist struct {
OrgID int64
Name string
}
func IsErrTeamAlreadyExist(err error) bool {
_, ok := err.(ErrTeamAlreadyExist)
return ok
}
func (err ErrTeamAlreadyExist) Error() string {
return fmt.Sprintf("team already exists [org_id: %d, name: %s]", err.OrgID, err.Name)
}

View File

@@ -8,46 +8,53 @@ import (
"bufio"
"bytes"
"fmt"
"html"
"html/template"
"io"
"io/ioutil"
"os"
"os/exec"
"strings"
"github.com/Unknwon/com"
"github.com/sergi/go-diff/diffmatchpatch"
"golang.org/x/net/html/charset"
"golang.org/x/text/transform"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/process"
)
// Diff line types.
type DiffLineType uint8
const (
DIFF_LINE_PLAIN = iota + 1
DIFF_LINE_PLAIN DiffLineType = iota + 1
DIFF_LINE_ADD
DIFF_LINE_DEL
DIFF_LINE_SECTION
)
type DiffFileType uint8
const (
DIFF_FILE_ADD = iota + 1
DIFF_FILE_ADD DiffFileType = iota + 1
DIFF_FILE_CHANGE
DIFF_FILE_DEL
DIFF_FILE_RENAME
)
type DiffLine struct {
LeftIdx int
RightIdx int
Type int
Content string
LeftIdx int
RightIdx int
Type DiffLineType
Content string
}
func (d DiffLine) GetType() int {
return d.Type
func (d *DiffLine) GetType() int {
return int(d.Type)
}
type DiffSection struct {
@@ -55,12 +62,99 @@ type DiffSection struct {
Lines []*DiffLine
}
var (
addedCodePrefix = []byte("<span class=\"added-code\">")
removedCodePrefix = []byte("<span class=\"removed-code\">")
codeTagSuffix = []byte("</span>")
)
func diffToHTML(diffs []diffmatchpatch.Diff, lineType DiffLineType) template.HTML {
var buf bytes.Buffer
for i := range diffs {
if diffs[i].Type == diffmatchpatch.DiffInsert && lineType == DIFF_LINE_ADD {
buf.Write(addedCodePrefix)
buf.WriteString(html.EscapeString(diffs[i].Text))
buf.Write(codeTagSuffix)
} else if diffs[i].Type == diffmatchpatch.DiffDelete && lineType == DIFF_LINE_DEL {
buf.Write(removedCodePrefix)
buf.WriteString(html.EscapeString(diffs[i].Text))
buf.Write(codeTagSuffix)
} else if diffs[i].Type == diffmatchpatch.DiffEqual {
buf.WriteString(html.EscapeString(diffs[i].Text))
}
}
return template.HTML(buf.Bytes())
}
// get an specific line by type (add or del) and file line number
func (diffSection *DiffSection) GetLine(lineType DiffLineType, idx int) *DiffLine {
difference := 0
for _, diffLine := range diffSection.Lines {
if diffLine.Type == DIFF_LINE_PLAIN {
// get the difference of line numbers between ADD and DEL versions
difference = diffLine.RightIdx - diffLine.LeftIdx
continue
}
if lineType == DIFF_LINE_DEL {
if diffLine.RightIdx == 0 && diffLine.LeftIdx == idx-difference {
return diffLine
}
} else if lineType == DIFF_LINE_ADD {
if diffLine.LeftIdx == 0 && diffLine.RightIdx == idx+difference {
return diffLine
}
}
}
return nil
}
// computes inline diff for the given line
func (diffSection *DiffSection) GetComputedInlineDiffFor(diffLine *DiffLine) template.HTML {
var compareDiffLine *DiffLine
var diff1, diff2 string
getDefaultReturn := func() template.HTML {
return template.HTML(html.EscapeString(diffLine.Content[1:]))
}
// just compute diff for adds and removes
if diffLine.Type != DIFF_LINE_ADD && diffLine.Type != DIFF_LINE_DEL {
return getDefaultReturn()
}
// try to find equivalent diff line. ignore, otherwise
if diffLine.Type == DIFF_LINE_ADD {
compareDiffLine = diffSection.GetLine(DIFF_LINE_DEL, diffLine.RightIdx)
if compareDiffLine == nil {
return getDefaultReturn()
}
diff1 = compareDiffLine.Content
diff2 = diffLine.Content
} else {
compareDiffLine = diffSection.GetLine(DIFF_LINE_ADD, diffLine.LeftIdx)
if compareDiffLine == nil {
return getDefaultReturn()
}
diff1 = diffLine.Content
diff2 = compareDiffLine.Content
}
dmp := diffmatchpatch.New()
diffRecord := dmp.DiffMain(diff1[1:], diff2[1:], true)
diffRecord = dmp.DiffCleanupSemantic(diffRecord)
return diffToHTML(diffRecord, diffLine.Type)
}
type DiffFile struct {
Name string
OldName string
Index int
Addition, Deletion int
Type int
Type DiffFileType
IsCreated bool
IsDeleted bool
IsBin bool
@@ -68,6 +162,10 @@ type DiffFile struct {
Sections []*DiffSection
}
func (diffFile *DiffFile) GetType() int {
return int(diffFile.Type)
}
type Diff struct {
TotalAddition, TotalDeletion int
Files []*DiffFile
@@ -124,6 +222,7 @@ func ParsePatch(maxlines int, reader io.Reader) (*Diff, error) {
// Diff data too large, we only show the first about maxlines lines
if lineCount >= maxlines {
log.Warn("Diff data too large")
io.Copy(ioutil.Discard, reader)
diff.Files = nil
return diff, nil
}

70
models/git_diff_test.go Normal file
View File

@@ -0,0 +1,70 @@
package models
import (
dmp "github.com/sergi/go-diff/diffmatchpatch"
"html/template"
"testing"
)
func assertEqual(t *testing.T, s1 string, s2 template.HTML) {
if s1 != string(s2) {
t.Errorf("%s should be equal %s", s2, s1)
}
}
func assertLineEqual(t *testing.T, d1 *DiffLine, d2 *DiffLine) {
if d1 != d2 {
t.Errorf("%v should be equal %v", d1, d2)
}
}
func TestDiffToHTML(t *testing.T) {
assertEqual(t, "foo <span class=\"added-code\">bar</span> biz", diffToHTML([]dmp.Diff{
dmp.Diff{dmp.DiffEqual, "foo "},
dmp.Diff{dmp.DiffInsert, "bar"},
dmp.Diff{dmp.DiffDelete, " baz"},
dmp.Diff{dmp.DiffEqual, " biz"},
}, DIFF_LINE_ADD))
assertEqual(t, "foo <span class=\"removed-code\">bar</span> biz", diffToHTML([]dmp.Diff{
dmp.Diff{dmp.DiffEqual, "foo "},
dmp.Diff{dmp.DiffDelete, "bar"},
dmp.Diff{dmp.DiffInsert, " baz"},
dmp.Diff{dmp.DiffEqual, " biz"},
}, DIFF_LINE_DEL))
}
// test if GetLine is return the correct lines
func TestGetLine(t *testing.T) {
ds := DiffSection{Lines: []*DiffLine{
&DiffLine{LeftIdx: 28, RightIdx: 28, Type: DIFF_LINE_PLAIN},
&DiffLine{LeftIdx: 29, RightIdx: 29, Type: DIFF_LINE_PLAIN},
&DiffLine{LeftIdx: 30, RightIdx: 30, Type: DIFF_LINE_PLAIN},
&DiffLine{LeftIdx: 31, RightIdx: 0, Type: DIFF_LINE_DEL},
&DiffLine{LeftIdx: 0, RightIdx: 31, Type: DIFF_LINE_ADD},
&DiffLine{LeftIdx: 0, RightIdx: 32, Type: DIFF_LINE_ADD},
&DiffLine{LeftIdx: 32, RightIdx: 33, Type: DIFF_LINE_PLAIN},
&DiffLine{LeftIdx: 33, RightIdx: 0, Type: DIFF_LINE_DEL},
&DiffLine{LeftIdx: 34, RightIdx: 0, Type: DIFF_LINE_DEL},
&DiffLine{LeftIdx: 35, RightIdx: 0, Type: DIFF_LINE_DEL},
&DiffLine{LeftIdx: 36, RightIdx: 0, Type: DIFF_LINE_DEL},
&DiffLine{LeftIdx: 0, RightIdx: 34, Type: DIFF_LINE_ADD},
&DiffLine{LeftIdx: 0, RightIdx: 35, Type: DIFF_LINE_ADD},
&DiffLine{LeftIdx: 0, RightIdx: 36, Type: DIFF_LINE_ADD},
&DiffLine{LeftIdx: 0, RightIdx: 37, Type: DIFF_LINE_ADD},
&DiffLine{LeftIdx: 37, RightIdx: 38, Type: DIFF_LINE_PLAIN},
&DiffLine{LeftIdx: 38, RightIdx: 39, Type: DIFF_LINE_PLAIN},
}}
assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 31), ds.Lines[4])
assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 31), ds.Lines[3])
assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 33), ds.Lines[11])
assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 34), ds.Lines[12])
assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 35), ds.Lines[13])
assertLineEqual(t, ds.GetLine(DIFF_LINE_ADD, 36), ds.Lines[14])
assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 34), ds.Lines[7])
assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 35), ds.Lines[8])
assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 36), ds.Lines[9])
assertLineEqual(t, ds.GetLine(DIFF_LINE_DEL, 37), ds.Lines[10])
}

View File

@@ -665,6 +665,47 @@ func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int
return ius, err
}
func UpdateMentions(userNames []string, issueId int64) error {
for i := range userNames {
userNames[i] = strings.ToLower(userNames[i])
}
users := make([]*User, 0, len(userNames))
if err := x.Where("lower_name IN (?)", strings.Join(userNames, "\",\"")).OrderBy("lower_name ASC").Find(&users); err != nil {
return err
}
ids := make([]int64, 0, len(userNames))
for _, user := range users {
ids = append(ids, user.Id)
if !user.IsOrganization() {
continue
}
if user.NumMembers == 0 {
continue
}
tempIds := make([]int64, 0, user.NumMembers)
orgUsers, err := GetOrgUsersByOrgId(user.Id)
if err != nil {
return err
}
for _, orgUser := range orgUsers {
tempIds = append(tempIds, orgUser.ID)
}
ids = append(ids, tempIds...)
}
if err := UpdateIssueUsersByMentions(ids, issueId); err != nil {
return err
}
return nil
}
// IssueStats represents issue statistic information.
type IssueStats struct {
OpenCount, ClosedCount int64
@@ -1554,13 +1595,13 @@ func createComment(e *xorm.Session, u *User, repo *Repository, issue *Issue, com
// Notify watchers.
act := &Action{
ActUserID: u.Id,
ActUserName: u.LowerName,
ActUserName: u.Name,
ActEmail: u.Email,
OpType: COMMENT_ISSUE,
Content: fmt.Sprintf("%d|%s", issue.Index, strings.Split(content, "\n")[0]),
RepoID: repo.ID,
RepoUserName: repo.Owner.LowerName,
RepoName: repo.LowerName,
RepoUserName: repo.Owner.Name,
RepoName: repo.Name,
IsPrivate: repo.IsPrivate,
}
if err = notifyWatchers(e, act); err != nil {

View File

@@ -105,10 +105,21 @@ type LoginSource struct {
Updated time.Time `xorm:"UPDATED"`
}
// Cell2Int64 converts a xorm.Cell type to int64,
// and handles possible irregular cases.
func Cell2Int64(val xorm.Cell) int64 {
switch (*val).(type) {
case []uint8:
log.Trace("Cell2Int64 ([]uint8): %v", *val)
return com.StrTo(string((*val).([]uint8))).MustInt64()
}
return (*val).(int64)
}
func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) {
switch colName {
case "type":
switch LoginType((*val).(int64)) {
switch LoginType(Cell2Int64(val)) {
case LOGIN_LDAP, LOGIN_DLDAP:
source.Cfg = new(LDAPConfig)
case LOGIN_SMTP:

View File

@@ -18,6 +18,7 @@ import (
"github.com/go-xorm/xorm"
"gopkg.in/ini.v1"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting"
gouuid "github.com/gogits/gogs/modules/uuid"
@@ -57,12 +58,13 @@ type Version struct {
// If you want to "retire" a migration, remove it from the top of the list and
// update _MIN_VER_DB accordingly
var migrations = []Migration{
NewMigration("fix locale file load panic", fixLocaleFileLoadPanic), // V4 -> V5:v0.6.0
NewMigration("trim action compare URL prefix", trimCommitActionAppUrlPrefix), // V5 -> V6:v0.6.3
NewMigration("generate issue-label from issue", issueToIssueLabel), // V6 -> V7:v0.6.4
NewMigration("refactor attachment table", attachmentRefactor), // V7 -> V8:v0.6.4
NewMigration("rename pull request fields", renamePullRequestFields), // V8 -> V9:v0.6.16
NewMigration("clean up migrate repo info", cleanUpMigrateRepoInfo), // V9 -> V10:v0.6.20
NewMigration("fix locale file load panic", fixLocaleFileLoadPanic), // V4 -> V5:v0.6.0
NewMigration("trim action compare URL prefix", trimCommitActionAppUrlPrefix), // V5 -> V6:v0.6.3
NewMigration("generate issue-label from issue", issueToIssueLabel), // V6 -> V7:v0.6.4
NewMigration("refactor attachment table", attachmentRefactor), // V7 -> V8:v0.6.4
NewMigration("rename pull request fields", renamePullRequestFields), // V8 -> V9:v0.6.16
NewMigration("clean up migrate repo info", cleanUpMigrateRepoInfo), // V9 -> V10:v0.6.20
NewMigration("generate rands and salt for organizations", generateOrgRandsAndSalt), // V10 -> V11:v0.8.5
}
// Migrate database to current version
@@ -422,3 +424,32 @@ func cleanUpMigrateRepoInfo(x *xorm.Engine) (err error) {
return nil
}
func generateOrgRandsAndSalt(x *xorm.Engine) (err error) {
type User struct {
ID int64 `xorm:"pk autoincr"`
Rands string `xorm:"VARCHAR(10)"`
Salt string `xorm:"VARCHAR(10)"`
}
orgs := make([]*User, 0, 10)
if err = x.Where("type=1").And("rands=''").Find(&orgs); err != nil {
return fmt.Errorf("select all organizations: %v", err)
}
sess := x.NewSession()
defer sessionRelease(sess)
if err = sess.Begin(); err != nil {
return err
}
for _, org := range orgs {
org.Rands = base.GetRandomString(10)
org.Salt = base.GetRandomString(10)
if _, err = sess.Id(org.ID).Update(org); err != nil {
return err
}
}
return sess.Commit()
}

View File

@@ -14,10 +14,8 @@ import (
)
var (
ErrOrgNotExist = errors.New("Organization does not exist")
ErrTeamAlreadyExist = errors.New("Team already exist")
ErrTeamNotExist = errors.New("Team does not exist")
ErrTeamNameIllegal = errors.New("Team name contains illegal characters")
ErrOrgNotExist = errors.New("Organization does not exist")
ErrTeamNotExist = errors.New("Team does not exist")
)
// IsOwnedBy returns true if given user is in the owner team.
@@ -108,6 +106,8 @@ func CreateOrganization(org, owner *User) (err error) {
org.LowerName = strings.ToLower(org.Name)
org.FullName = org.Name
org.Rands = GetUserSalt()
org.Salt = GetUserSalt()
org.UseCustomAvatar = true
org.MaxRepoCreation = -1
org.NumTeams = 1
@@ -272,10 +272,15 @@ func GetOwnedOrgsByUserIDDesc(userID int64, desc string) ([]*User, error) {
return getOwnedOrgsByUserID(sess.Desc(desc), userID)
}
// GetOrgUsersByUserId returns all organization-user relations by user ID.
func GetOrgUsersByUserId(uid int64) ([]*OrgUser, error) {
// GetOrgUsersByUserID returns all organization-user relations by user ID.
func GetOrgUsersByUserID(uid int64, all bool) ([]*OrgUser, error) {
ous := make([]*OrgUser, 0, 10)
err := x.Where("uid=?", uid).Find(&ous)
sess := x.Where("uid=?", uid)
if !all {
// Only show public organizations
sess.And("is_public=?", true)
}
err := sess.Find(&ous)
return ous, err
}
@@ -591,9 +596,9 @@ func (t *Team) RemoveRepository(repoID int64) error {
// NewTeam creates a record of new team.
// It's caller's responsibility to assign organization ID.
func NewTeam(t *Team) (err error) {
if err = IsUsableName(t.Name); err != nil {
return err
func NewTeam(t *Team) error {
if len(t.Name) == 0 {
return errors.New("empty team name")
}
has, err := x.Id(t.OrgID).Get(new(User))
@@ -608,7 +613,7 @@ func NewTeam(t *Team) (err error) {
if err != nil {
return err
} else if has {
return ErrTeamAlreadyExist
return ErrTeamAlreadyExist{t.OrgID, t.LowerName}
}
sess := x.NewSession()
@@ -667,8 +672,8 @@ func GetTeamById(teamId int64) (*Team, error) {
// UpdateTeam updates information of team.
func UpdateTeam(t *Team, authChanged bool) (err error) {
if err = IsUsableName(t.Name); err != nil {
return err
if len(t.Name) == 0 {
return errors.New("empty team name")
}
if len(t.Description) > 255 {
@@ -682,6 +687,13 @@ func UpdateTeam(t *Team, authChanged bool) (err error) {
}
t.LowerName = strings.ToLower(t.Name)
has, err := x.Where("org_id=?", t.OrgID).And("lower_name=?", t.LowerName).And("id!=?", t.ID).Get(new(Team))
if err != nil {
return err
} else if has {
return ErrTeamAlreadyExist{t.OrgID, t.LowerName}
}
if _, err = sess.Id(t.ID).AllCols().Update(t); err != nil {
return fmt.Errorf("update: %v", err)
}

View File

@@ -14,7 +14,7 @@ import (
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
api "github.com/gogits/go-gogs-client"
"github.com/gogits/gogs/modules/log"
@@ -525,6 +525,14 @@ func AddTestPullRequestTask(repoID int64, branch string) {
}
}
func ChangeUsernameInPullRequests(oldUserName, newUserName string) error {
pr := PullRequest{
HeadUserName: strings.ToLower(newUserName),
}
_, err := x.Cols("head_user_name").Where("head_user_name = ?", strings.ToLower(oldUserName)).Update(pr)
return err
}
// checkAndUpdateStatus checks if pull request is possible to levaing checking status,
// and set to be either conflict or mergeable.
func (pr *PullRequest) checkAndUpdateStatus() {

View File

@@ -12,7 +12,7 @@ import (
"github.com/go-xorm/xorm"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/modules/process"
)

View File

@@ -27,7 +27,7 @@ import (
"github.com/mcuadros/go-version"
"gopkg.in/ini.v1"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
api "github.com/gogits/go-gogs-client"
"github.com/gogits/gogs/modules/base"
@@ -129,6 +129,8 @@ func NewRepoContext() {
log.Fatal(4, "Fail to execute 'git config --global core.quotepath false': %s", stderr)
}
// Clean up temporary data.
os.RemoveAll(filepath.Join(setting.AppDataPath, "tmp"))
}
// Repository represents a git repository.
@@ -400,7 +402,7 @@ func (repo *Repository) ComposePayload() *api.PayloadRepo {
cl := repo.CloneLink()
return &api.PayloadRepo{
ID: repo.ID,
Name: repo.LowerName,
Name: repo.Name,
URL: repo.FullRepoLink(),
SSHURL: cl.SSH,
CloneURL: cl.HTTPS,
@@ -1301,12 +1303,14 @@ func DeleteRepository(uid, repoID int64) error {
}
}
wikiPath := repo.WikiPath()
if err = os.RemoveAll(wikiPath); err != nil {
desc := fmt.Sprintf("delete repository wiki [%s]: %v", wikiPath, err)
log.Warn(desc)
if err = CreateRepositoryNotice(desc); err != nil {
log.Error(4, "CreateRepositoryNotice: %v", err)
wikiPaths := []string{repo.WikiPath(), repo.LocalWikiPath()}
for _, wikiPath := range wikiPaths {
if err = os.RemoveAll(wikiPath); err != nil {
desc := fmt.Sprintf("delete repository wiki [%s]: %v", wikiPath, err)
log.Warn(desc)
if err = CreateRepositoryNotice(desc); err != nil {
log.Error(4, "CreateRepositoryNotice: %v", err)
}
}
}
@@ -1598,7 +1602,7 @@ func GitFsck() {
repo := bean.(*Repository)
repoPath := repo.RepoPath()
if err := git.Fsck(repoPath, setting.Cron.RepoHealthCheck.Timeout, setting.Cron.RepoHealthCheck.Args...); err != nil {
desc := fmt.Sprintf("Fail to health check repository(%s)", repoPath)
desc := fmt.Sprintf("Fail to health check repository (%s): %v", repoPath, err)
log.Warn(desc)
if err = CreateRepositoryNotice(desc); err != nil {
log.Error(4, "CreateRepositoryNotice: %v", err)
@@ -1886,8 +1890,13 @@ func GetWatchers(repoID int64) ([]*Watch, error) {
// Repository.GetWatchers returns range of users watching given repository.
func (repo *Repository) GetWatchers(page int) ([]*User, error) {
users := make([]*User, 0, ItemsPerPage)
return users, x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).
Where("repo_id=?", repo.ID).Join("LEFT", "watch", "user.id=watch.user_id").Find(&users)
sess := x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).Where("watch.repo_id=?", repo.ID)
if setting.UsePostgreSQL {
sess = sess.Join("LEFT", "watch", `"user".id=watch.user_id`)
} else {
sess = sess.Join("LEFT", "watch", "user.id=watch.user_id")
}
return users, sess.Find(&users)
}
func notifyWatchers(e Engine, act *Action) error {
@@ -1969,8 +1978,13 @@ func IsStaring(uid, repoId int64) bool {
func (repo *Repository) GetStargazers(page int) ([]*User, error) {
users := make([]*User, 0, ItemsPerPage)
return users, x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).
Where("repo_id=?", repo.ID).Join("LEFT", "star", "user.id=star.uid").Find(&users)
sess := x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).Where("star.repo_id=?", repo.ID)
if setting.UsePostgreSQL {
sess = sess.Join("LEFT", "star", `"user".id=star.uid`)
} else {
sess = sess.Join("LEFT", "star", "user.id=star.uid")
}
return users, sess.Find(&users)
}
// ___________ __

View File

@@ -21,6 +21,7 @@ import (
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
"golang.org/x/crypto/ssh"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/process"
@@ -33,24 +34,6 @@ const (
)
var sshOpLocker = sync.Mutex{}
var SSHPath string // SSH directory.
// homeDir returns the home directory of current user.
func homeDir() string {
home, err := com.HomeDir()
if err != nil {
log.Fatal(4, "Fail to get home directory: %v", err)
}
return home
}
func init() {
// Determine and create .ssh path.
SSHPath = filepath.Join(homeDir(), ".ssh")
if err := os.MkdirAll(SSHPath, 0700); err != nil {
log.Fatal(4, "fail to create '%s': %v", SSHPath, err)
}
}
type KeyType int
@@ -182,48 +165,20 @@ func CheckPublicKeyString(content string) (_ string, err error) {
return "", errors.New("only a single line with a single key please")
}
// write the key to a file…
tmpFile, err := ioutil.TempFile(os.TempDir(), "keytest")
fields := strings.Fields(content)
if len(fields) < 2 {
return "", errors.New("too less fields")
}
key, err := base64.StdEncoding.DecodeString(fields[1])
if err != nil {
return "", err
return "", fmt.Errorf("StdEncoding.DecodeString: %v", err)
}
tmpPath := tmpFile.Name()
defer os.Remove(tmpPath)
tmpFile.WriteString(content)
tmpFile.Close()
// Check if ssh-keygen recognizes its contents.
stdout, stderr, err := process.Exec("CheckPublicKeyString", "ssh-keygen", "-lf", tmpPath)
pkey, err := ssh.ParsePublicKey([]byte(key))
if err != nil {
return "", errors.New("ssh-keygen -lf: " + stderr)
} else if len(stdout) < 2 {
return "", errors.New("ssh-keygen returned not enough output to evaluate the key: " + stdout)
}
// The ssh-keygen in Windows does not print key type, so no need go further.
if setting.IsWindows {
return content, nil
}
sshKeygenOutput := strings.Split(stdout, " ")
if len(sshKeygenOutput) < 4 {
return content, ErrKeyUnableVerify{stdout}
}
// Check if key type and key size match.
if !setting.Service.DisableMinimumKeySizeCheck {
keySize := com.StrTo(sshKeygenOutput[0]).MustInt()
if keySize == 0 {
return "", errors.New("cannot get key size of the given key")
}
keyType := strings.Trim(sshKeygenOutput[len(sshKeygenOutput)-1], " ()\n")
if minimumKeySize := setting.Service.MinimumKeySizes[keyType]; minimumKeySize == 0 {
return "", fmt.Errorf("unrecognized public key type: %s", keyType)
} else if keySize < minimumKeySize {
return "", fmt.Errorf("the minimum accepted size of a public key %s is %d", keyType, minimumKeySize)
}
return "", fmt.Errorf("ParsePublicKey: %v", err)
}
log.Trace("Key type: %s", pkey.Type())
return content, nil
}
@@ -233,7 +188,7 @@ func saveAuthorizedKeyFile(keys ...*PublicKey) error {
sshOpLocker.Lock()
defer sshOpLocker.Unlock()
fpath := filepath.Join(SSHPath, "authorized_keys")
fpath := filepath.Join(setting.SSHRootPath, "authorized_keys")
f, err := os.OpenFile(fpath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
if err != nil {
return err
@@ -449,8 +404,8 @@ func deletePublicKey(e *xorm.Session, keyID int64) error {
return nil
}
fpath := filepath.Join(SSHPath, "authorized_keys")
tmpPath := filepath.Join(SSHPath, "authorized_keys.tmp")
fpath := filepath.Join(setting.SSHRootPath, "authorized_keys")
tmpPath := filepath.Join(setting.SSHRootPath, "authorized_keys.tmp")
if err = rewriteAuthorizedKeys(key, fpath, tmpPath); err != nil {
return err
} else if err = os.Remove(fpath); err != nil {
@@ -492,7 +447,7 @@ func RewriteAllPublicKeys() error {
sshOpLocker.Lock()
defer sshOpLocker.Unlock()
tmpPath := filepath.Join(SSHPath, "authorized_keys.tmp")
tmpPath := filepath.Join(setting.SSHRootPath, "authorized_keys.tmp")
f, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
return err
@@ -508,7 +463,7 @@ func RewriteAllPublicKeys() error {
return err
}
fpath := filepath.Join(SSHPath, "authorized_keys")
fpath := filepath.Join(setting.SSHRootPath, "authorized_keys")
if com.IsExist(fpath) {
if err = os.Remove(fpath); err != nil {
return err

View File

@@ -57,8 +57,8 @@ func ListAccessTokens(uid int64) ([]*AccessToken, error) {
return tokens, nil
}
// UpdateAccessToekn updates information of access token.
func UpdateAccessToekn(t *AccessToken) error {
// UpdateAccessToken updates information of access token.
func UpdateAccessToken(t *AccessToken) error {
_, err := x.Id(t.ID).AllCols().Update(t)
return err
}

View File

@@ -10,7 +10,7 @@ import (
"os/exec"
"strings"
git "github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/modules/log"
)

View File

@@ -25,7 +25,7 @@ import (
"github.com/go-xorm/xorm"
"github.com/nfnt/resize"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/modules/avatar"
"github.com/gogits/gogs/modules/base"
@@ -56,7 +56,7 @@ type User struct {
LowerName string `xorm:"UNIQUE NOT NULL"`
Name string `xorm:"UNIQUE NOT NULL"`
FullName string
// Email is the primary email address (to be used for communication).
// Email is the primary email address (to be used for communication)
Email string `xorm:"NOT NULL"`
Passwd string `xorm:"NOT NULL"`
LoginType LoginType
@@ -78,24 +78,24 @@ type User struct {
// Maximum repository creation limit, -1 means use gloabl default
MaxRepoCreation int `xorm:"NOT NULL DEFAULT -1"`
// Permissions.
// Permissions
IsActive bool
IsAdmin bool
AllowGitHook bool
AllowImportLocal bool // Allow migrate repository by local path
// Avatar.
// Avatar
Avatar string `xorm:"VARCHAR(2048) NOT NULL"`
AvatarEmail string `xorm:"NOT NULL"`
UseCustomAvatar bool
// Counters.
NumFollowers int
NumFollowings int
NumStars int
NumRepos int
// Counters
NumFollowers int
NumFollowing int `xorm:"NOT NULL DEFAULT 0"`
NumStars int
NumRepos int
// For organization.
// For organization
Description string
NumTeams int
NumMembers int
@@ -263,6 +263,34 @@ func (u *User) AvatarLink() string {
return link
}
// User.GetFollwoers returns range of user's followers.
func (u *User) GetFollowers(page int) ([]*User, error) {
users := make([]*User, 0, ItemsPerPage)
sess := x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).Where("follow.follow_id=?", u.Id)
if setting.UsePostgreSQL {
sess = sess.Join("LEFT", "follow", `"user".id=follow.user_id`)
} else {
sess = sess.Join("LEFT", "follow", "user.id=follow.user_id")
}
return users, sess.Find(&users)
}
func (u *User) IsFollowing(followID int64) bool {
return IsFollowing(u.Id, followID)
}
// GetFollowing returns range of user's following.
func (u *User) GetFollowing(page int) ([]*User, error) {
users := make([]*User, 0, ItemsPerPage)
sess := x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).Where("follow.user_id=?", u.Id)
if setting.UsePostgreSQL {
sess = sess.Join("LEFT", "follow", `"user".id=follow.follow_id`)
} else {
sess = sess.Join("LEFT", "follow", "user.id=follow.follow_id")
}
return users, sess.Find(&users)
}
// NewGitSig generates and returns the signature of given user.
func (u *User) NewGitSig() *git.Signature {
return &git.Signature{
@@ -376,8 +404,8 @@ func (u *User) GetOwnedOrganizations() (err error) {
}
// GetOrganizations returns all organizations that user belongs to.
func (u *User) GetOrganizations() error {
ous, err := GetOrgUsersByUserId(u.Id)
func (u *User) GetOrganizations(all bool) error {
ous, err := GetOrgUsersByUserID(u.Id, all)
if err != nil {
return err
}
@@ -401,13 +429,8 @@ func (u *User) DisplayName() string {
return u.Name
}
// ShortName returns shorted user name with given maximum length,
// it adds "..." at the end if user name has more length than maximum.
func (u *User) ShortName(length int) string {
if len(u.Name) < length {
return u.Name
}
return u.Name[:length] + "..."
return base.EllipsisString(u.Name, length)
}
// IsUserExist checks if given user name exist,
@@ -576,7 +599,12 @@ func ChangeUserName(u *User, newUserName string) (err error) {
return ErrUserAlreadyExist{newUserName}
}
return os.Rename(UserPath(u.LowerName), UserPath(newUserName))
err = ChangeUsernameInPullRequests(u.Name, newUserName)
if err != nil {
return fmt.Errorf("ChangeUsernameInPullRequests: %v", err)
}
return os.Rename(UserPath(u.Name), UserPath(newUserName))
}
func updateUser(e Engine, u *User) error {
@@ -888,7 +916,7 @@ func GetEmailAddresses(uid int64) ([]*EmailAddress, error) {
}
func AddEmailAddress(email *EmailAddress) error {
email.Email = strings.ToLower(email.Email)
email.Email = strings.ToLower(strings.TrimSpace(email.Email))
used, err := IsEmailUsed(email.Email)
if err != nil {
return err
@@ -900,6 +928,29 @@ func AddEmailAddress(email *EmailAddress) error {
return err
}
func AddEmailAddresses(emails []*EmailAddress) error {
if len(emails) == 0 {
return nil
}
// Check if any of them has been used
for i := range emails {
emails[i].Email = strings.ToLower(strings.TrimSpace(emails[i].Email))
used, err := IsEmailUsed(emails[i].Email)
if err != nil {
return err
} else if used {
return ErrEmailAlreadyUsed{emails[i].Email}
}
}
if _, err := x.Insert(emails); err != nil {
return fmt.Errorf("Insert: %v", err)
}
return nil
}
func (email *EmailAddress) Activate() error {
email.IsActivated = true
if _, err := x.Id(email.ID).AllCols().Update(email); err != nil {
@@ -914,20 +965,23 @@ func (email *EmailAddress) Activate() error {
}
}
func DeleteEmailAddress(email *EmailAddress) error {
has, err := x.Get(email)
if err != nil {
return err
} else if !has {
return ErrEmailNotExist
func DeleteEmailAddress(email *EmailAddress) (err error) {
if email.ID > 0 {
_, err = x.Id(email.ID).Delete(new(EmailAddress))
} else {
_, err = x.Where("email=?", email.Email).Delete(new(EmailAddress))
}
return err
}
if _, err = x.Id(email.ID).Delete(email); err != nil {
return err
func DeleteEmailAddresses(emails []*EmailAddress) (err error) {
for i := range emails {
if err = DeleteEmailAddress(emails[i]); err != nil {
return err
}
}
return nil
}
func MakeEmailPrimary(email *EmailAddress) error {
@@ -1051,100 +1105,73 @@ func SearchUserByName(opt SearchOption) (us []*User, err error) {
return us, err
}
// Follow is connection request for receiving user notification.
// ___________ .__ .__
// \_ _____/___ | | | | ______ _ __
// | __)/ _ \| | | | / _ \ \/ \/ /
// | \( <_> ) |_| |_( <_> ) /
// \___ / \____/|____/____/\____/ \/\_/
// \/
// Follow represents relations of user and his/her followers.
type Follow struct {
ID int64 `xorm:"pk autoincr"`
UserID int64 `xorm:"UNIQUE(follow)"`
FollowID int64 `xorm:"UNIQUE(follow)"`
}
func IsFollowing(userID, followID int64) bool {
has, _ := x.Get(&Follow{UserID: userID, FollowID: followID})
return has
}
// FollowUser marks someone be another's follower.
func FollowUser(userId int64, followId int64) (err error) {
func FollowUser(userID, followID int64) (err error) {
if userID == followID || IsFollowing(userID, followID) {
return nil
}
sess := x.NewSession()
defer sess.Close()
sess.Begin()
if _, err = sess.Insert(&Follow{UserID: userId, FollowID: followId}); err != nil {
sess.Rollback()
defer sessionRelease(sess)
if err = sess.Begin(); err != nil {
return err
}
rawSql := "UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?"
if _, err = sess.Exec(rawSql, followId); err != nil {
sess.Rollback()
if _, err = sess.Insert(&Follow{UserID: userID, FollowID: followID}); err != nil {
return err
}
rawSql = "UPDATE `user` SET num_followings = num_followings + 1 WHERE id = ?"
if _, err = sess.Exec(rawSql, userId); err != nil {
sess.Rollback()
if _, err = sess.Exec("UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil {
return err
}
if _, err = sess.Exec("UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil {
return err
}
return sess.Commit()
}
// UnFollowUser unmarks someone be another's follower.
func UnFollowUser(userId int64, unFollowId int64) (err error) {
session := x.NewSession()
defer session.Close()
session.Begin()
// UnfollowUser unmarks someone be another's follower.
func UnfollowUser(userID, followID int64) (err error) {
if userID == followID || !IsFollowing(userID, followID) {
return nil
}
if _, err = session.Delete(&Follow{UserID: userId, FollowID: unFollowId}); err != nil {
session.Rollback()
sess := x.NewSession()
defer sessionRelease(sess)
if err = sess.Begin(); err != nil {
return err
}
rawSql := "UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?"
if _, err = session.Exec(rawSql, unFollowId); err != nil {
session.Rollback()
if _, err = sess.Delete(&Follow{UserID: userID, FollowID: followID}); err != nil {
return err
}
rawSql = "UPDATE `user` SET num_followings = num_followings - 1 WHERE id = ?"
if _, err = session.Exec(rawSql, userId); err != nil {
session.Rollback()
if _, err = sess.Exec("UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil {
return err
}
return session.Commit()
}
func UpdateMentions(userNames []string, issueId int64) error {
for i := range userNames {
userNames[i] = strings.ToLower(userNames[i])
}
users := make([]*User, 0, len(userNames))
if err := x.Where("lower_name IN (?)", strings.Join(userNames, "\",\"")).OrderBy("lower_name ASC").Find(&users); err != nil {
return err
}
ids := make([]int64, 0, len(userNames))
for _, user := range users {
ids = append(ids, user.Id)
if !user.IsOrganization() {
continue
}
if user.NumMembers == 0 {
continue
}
tempIds := make([]int64, 0, user.NumMembers)
orgUsers, err := GetOrgUsersByOrgId(user.Id)
if err != nil {
return err
}
for _, orgUser := range orgUsers {
tempIds = append(tempIds, orgUser.ID)
}
ids = append(ids, tempIds...)
}
if err := UpdateIssueUsersByMentions(ids, issueId); err != nil {
return err
}
return nil
if _, err = sess.Exec("UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil {
return err
}
return sess.Commit()
}

View File

@@ -285,7 +285,7 @@ type HookTask struct {
HookID int64
UUID string
Type HookTaskType
URL string
URL string `xorm:"TEXT"`
api.Payloader `xorm:"-"`
PayloadContent string `xorm:"TEXT"`
ContentType HookContentType

View File

@@ -10,7 +10,7 @@ import (
"fmt"
"strings"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
api "github.com/gogits/go-gogs-client"
)

View File

@@ -12,10 +12,11 @@ import (
"path/filepath"
"strings"
"sync"
"net/url"
"github.com/Unknwon/com"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/modules/setting"
)
@@ -65,12 +66,13 @@ var wikiWorkingPool = &workingPool{
// ToWikiPageURL formats a string to corresponding wiki URL name.
func ToWikiPageURL(name string) string {
return strings.Replace(name, " ", "-", -1)
return url.QueryEscape(strings.Replace(name, " ", "-", -1))
}
// ToWikiPageName formats a URL back to corresponding wiki page name.
func ToWikiPageName(name string) string {
return strings.Replace(name, "-", " ", -1)
func ToWikiPageName(urlString string) string {
name, _ := url.QueryUnescape(strings.Replace(urlString, "-", " ", -1))
return name
}
// WikiCloneLink returns clone URLs of repository wiki.

View File

@@ -55,8 +55,8 @@ func SignedInID(ctx *macaron.Context, sess session.Store) int64 {
return 0
}
t.Updated = time.Now()
if err = models.UpdateAccessToekn(t); err != nil {
log.Error(4, "UpdateAccessToekn: %v", err)
if err = models.UpdateAccessToken(t); err != nil {
log.Error(4, "UpdateAccessToken: %v", err)
}
return t.UID
}

View File

@@ -45,9 +45,9 @@ func (f *UpdateOrgSettingForm) Validate(ctx *macaron.Context, errs binding.Error
// \/ \/ \/
type CreateTeamForm struct {
TeamName string `form:"team_name" binding:"Required;AlphaDashDot;MaxSize(30)"`
Description string `form:"desc" binding:"MaxSize(255)"`
Permission string `form:"permission"`
TeamName string `binding:"Required;AlphaDashDot;MaxSize(30)"`
Description string `binding:"MaxSize(255)"`
Permission string
}
func (f *CreateTeamForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {

View File

@@ -239,7 +239,7 @@ func (f *NewReleaseForm) Validate(ctx *macaron.Context, errs binding.Errors) bin
type EditReleaseForm struct {
Title string `form:"title" binding:"Required"`
Content string `form:"content" binding:"Required"`
Content string `form:"content"`
Draft string `form:"draft"`
Prerelease bool `form:"prerelease"`
}

View File

@@ -83,21 +83,73 @@ func IsReadmeFile(name string) bool {
return false
}
var (
MentionPattern = regexp.MustCompile(`(\s|^)@[0-9a-zA-Z_\.]+`)
commitPattern = regexp.MustCompile(`(\s|^)https?.*commit/[0-9a-zA-Z]+(#+[0-9a-zA-Z-]*)?`)
issueFullPattern = regexp.MustCompile(`(\s|^)https?.*issues/[0-9]+(#+[0-9a-zA-Z-]*)?`)
issueIndexPattern = regexp.MustCompile(`( |^|\()#[0-9]+\b`)
sha1CurrentPattern = regexp.MustCompile(`\b[0-9a-f]{40}\b`)
)
type CustomRender struct {
blackfriday.Renderer
urlPrefix string
}
func (options *CustomRender) Link(out *bytes.Buffer, link []byte, title []byte, content []byte) {
func (r *CustomRender) Link(out *bytes.Buffer, link []byte, title []byte, content []byte) {
if len(link) > 0 && !isLink(link) {
if link[0] == '#' {
// link = append([]byte(options.urlPrefix), link...)
} else {
link = []byte(path.Join(options.urlPrefix, string(link)))
link = []byte(path.Join(r.urlPrefix, string(link)))
}
}
options.Renderer.Link(out, link, title, content)
r.Renderer.Link(out, link, title, content)
}
func (r *CustomRender) AutoLink(out *bytes.Buffer, link []byte, kind int) {
if kind != 1 {
r.Renderer.AutoLink(out, link, kind)
return
}
// This method could only possibly serve one link at a time, no need to find all.
m := commitPattern.Find(link)
if m != nil {
m = bytes.TrimSpace(m)
i := strings.Index(string(m), "commit/")
j := strings.Index(string(m), "#")
if j == -1 {
j = len(m)
}
out.WriteString(fmt.Sprintf(` <code><a href="%s">%s</a></code>`, m, ShortSha(string(m[i+7:j]))))
return
}
m = issueFullPattern.Find(link)
if m != nil {
m = bytes.TrimSpace(m)
i := strings.Index(string(m), "issues/")
j := strings.Index(string(m), "#")
if j == -1 {
j = len(m)
}
out.WriteString(fmt.Sprintf(` <a href="%s">#%s</a>`, m, ShortSha(string(m[i+7:j]))))
return
}
r.Renderer.AutoLink(out, link, kind)
}
func (options *CustomRender) ListItem(out *bytes.Buffer, text []byte, flags int) {
switch {
case bytes.HasPrefix(text, []byte("[ ] ")):
text = append([]byte(`<input type="checkbox" disabled="" />`), text[3:]...)
case bytes.HasPrefix(text, []byte("[x] ")):
text = append([]byte(`<input type="checkbox" disabled="" checked="" />`), text[3:]...)
}
options.Renderer.ListItem(out, text, flags)
}
var (
@@ -105,13 +157,13 @@ var (
svgSuffixWithMark = []byte(".svg?")
)
func (options *CustomRender) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) {
prefix := strings.Replace(options.urlPrefix, "/src/", "/raw/", 1)
func (r *CustomRender) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) {
prefix := strings.Replace(r.urlPrefix, "/src/", "/raw/", 1)
if len(link) > 0 {
if isLink(link) {
// External link with .svg suffix usually means CI status.
if bytes.HasSuffix(link, svgSuffix) || bytes.Contains(link, svgSuffixWithMark) {
options.Renderer.Image(out, link, title, alt)
r.Renderer.Image(out, link, title, alt)
return
}
} else {
@@ -125,18 +177,10 @@ func (options *CustomRender) Image(out *bytes.Buffer, link []byte, title []byte,
out.WriteString(`<a href="`)
out.Write(link)
out.WriteString(`">`)
options.Renderer.Image(out, link, title, alt)
r.Renderer.Image(out, link, title, alt)
out.WriteString("</a>")
}
var (
MentionPattern = regexp.MustCompile(`(\s|^)@[0-9a-zA-Z_\.]+`)
commitPattern = regexp.MustCompile(`(\s|^)https?.*commit/[0-9a-zA-Z]+(#+[0-9a-zA-Z-]*)?`)
issueFullPattern = regexp.MustCompile(`(\s|^)https?.*issues/[0-9]+(#+[0-9a-zA-Z-]*)?`)
issueIndexPattern = regexp.MustCompile(`( |^|\()#[0-9]+\b`)
sha1CurrentPattern = regexp.MustCompile(`\b[0-9a-f]{40}\b`)
)
func cutoutVerbosePrefix(prefix string) string {
count := 0
for i := 0; i < len(prefix); i++ {
@@ -229,33 +273,6 @@ var (
var noEndTags = []string{"img", "input", "br", "hr"}
// PreProcessMarkdown renders full links of commits, issues and pulls to shorter version.
func PreProcessMarkdown(rawHTML []byte, urlPrefix string) []byte {
ms := commitPattern.FindAll(rawHTML, -1)
for _, m := range ms {
m = bytes.TrimSpace(m)
i := strings.Index(string(m), "commit/")
j := strings.Index(string(m), "#")
if j == -1 {
j = len(m)
}
rawHTML = bytes.Replace(rawHTML, m, []byte(fmt.Sprintf(
` <code><a href="%s">%s</a></code>`, m, ShortSha(string(m[i+7:j])))), -1)
}
ms = issueFullPattern.FindAll(rawHTML, -1)
for _, m := range ms {
m = bytes.TrimSpace(m)
i := strings.Index(string(m), "issues/")
j := strings.Index(string(m), "#")
if j == -1 {
j = len(m)
}
rawHTML = bytes.Replace(rawHTML, m, []byte(fmt.Sprintf(
` <a href="%s">#%s</a>`, m, ShortSha(string(m[i+7:j])))), -1)
}
return rawHTML
}
// PostProcessMarkdown treats different types of HTML differently,
// and only renders special links for plain text blocks.
func PostProcessMarkdown(rawHtml []byte, urlPrefix string, metas map[string]string) []byte {
@@ -327,8 +344,7 @@ OUTER_LOOP:
}
func RenderMarkdown(rawBytes []byte, urlPrefix string, metas map[string]string) []byte {
result := PreProcessMarkdown(rawBytes, urlPrefix)
result = RenderRawMarkdown(result, urlPrefix)
result := RenderRawMarkdown(rawBytes, urlPrefix)
result = PostProcessMarkdown(result, urlPrefix, metas)
result = Sanitizer.SanitizeBytes(result)
return result

View File

@@ -18,6 +18,7 @@ import (
"regexp"
"strings"
"time"
"unicode/utf8"
"github.com/Unknwon/com"
"github.com/Unknwon/i18n"
@@ -26,10 +27,20 @@ import (
"github.com/gogits/chardet"
"github.com/gogits/gogs/modules/avatar"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting"
)
var Sanitizer = bluemonday.UGCPolicy().AllowAttrs("class").Matching(regexp.MustCompile(`[\p{L}\p{N}\s\-_',:\[\]!\./\\\(\)&]*`)).OnElements("code")
func BuildSanitizer() (p *bluemonday.Policy) {
p = bluemonday.UGCPolicy()
p.AllowAttrs("class").Matching(regexp.MustCompile(`[\p{L}\p{N}\s\-_',:\[\]!\./\\\(\)&]*`)).OnElements("code")
p.AllowAttrs("type").Matching(regexp.MustCompile(`^checkbox$`)).OnElements("input")
p.AllowAttrs("checked", "disabled").OnElements("input")
return p
}
var Sanitizer = BuildSanitizer()
// EncodeMD5 encodes string to md5 hex value.
func EncodeMD5(str string) string {
@@ -53,11 +64,18 @@ func ShortSha(sha1 string) string {
}
func DetectEncoding(content []byte) (string, error) {
detector := chardet.NewTextDetector()
result, err := detector.DetectBest(content)
if utf8.Valid(content) {
log.Debug("Detected encoding: utf-8 (fast)")
return "UTF-8", nil
}
result, err := chardet.NewTextDetector().DetectBest(content)
if result.Charset != "UTF-8" && len(setting.Repository.AnsiCharset) > 0 {
log.Debug("Using default AnsiCharset: %s", setting.Repository.AnsiCharset)
return setting.Repository.AnsiCharset, err
}
log.Debug("Detected encoding: %s", result.Charset)
return result.Charset, err
}
@@ -444,6 +462,15 @@ func Subtract(left interface{}, right interface{}) interface{} {
}
}
// EllipsisString returns a truncated short string,
// it appends '...' in the end of the length of string is too large.
func EllipsisString(str string, length int) string {
if len(str) < length {
return str
}
return str[:length-3] + "..."
}
// StringsToInt64s converts a slice of string to a slice of int64.
func StringsToInt64s(strs []string) []int64 {
ints := make([]int64, len(strs))

File diff suppressed because one or more lines are too long

View File

@@ -111,7 +111,7 @@ func (s *Sender) Send(from string, to []string, msg io.WriterTo) error {
client, err := smtp.NewClient(conn, host)
if err != nil {
return err
return fmt.Errorf("NewClient: %v", err)
}
if !setting.MailService.DisableHelo {
@@ -124,7 +124,7 @@ func (s *Sender) Send(from string, to []string, msg io.WriterTo) error {
}
if err = client.Hello(hostname); err != nil {
return err
return fmt.Errorf("Hello: %v", err)
}
}
@@ -132,7 +132,7 @@ func (s *Sender) Send(from string, to []string, msg io.WriterTo) error {
hasStartTLS, _ := client.Extension("STARTTLS")
if !isSecureConn && hasStartTLS {
if err = client.StartTLS(tlsconfig); err != nil {
return err
return fmt.Errorf("StartTLS: %v", err)
}
}
@@ -151,28 +151,28 @@ func (s *Sender) Send(from string, to []string, msg io.WriterTo) error {
if auth != nil {
if err = client.Auth(auth); err != nil {
return err
return fmt.Errorf("Auth: %v", err)
}
}
}
if err = client.Mail(from); err != nil {
return err
return fmt.Errorf("Mail: %v", err)
}
for _, rec := range to {
if err = client.Rcpt(rec); err != nil {
return err
return fmt.Errorf("Rcpt: %v", err)
}
}
w, err := client.Data()
if err != nil {
return err
return fmt.Errorf("Data: %v", err)
} else if _, err = msg.WriteTo(w); err != nil {
return err
return fmt.Errorf("WriteTo: %v", err)
} else if err = w.Close(); err != nil {
return err
return fmt.Errorf("Close: %v", err)
}
return client.Quit()

View File

@@ -18,7 +18,7 @@ import (
"github.com/go-macaron/session"
"gopkg.in/macaron.v1"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
@@ -125,6 +125,7 @@ func (ctx *Context) HasValue(name string) bool {
// HTML calls Context.HTML and converts template name to string.
func (ctx *Context) HTML(status int, name base.TplName) {
log.Debug("Template: %s", name)
ctx.Context.HTML(status, string(name))
}
@@ -241,6 +242,8 @@ func Contexter() macaron.Handler {
ctx.Data["CsrfToken"] = x.GetToken()
ctx.Data["CsrfTokenHtml"] = template.HTML(`<input type="hidden" name="_csrf" value="` + x.GetToken() + `">`)
log.Debug("Session ID: %s", sess.ID())
log.Debug("CSRF Token: %v", ctx.Data["CsrfToken"])
ctx.Data["ShowRegistrationButton"] = setting.Service.ShowRegistrationButton
ctx.Data["ShowFooterBranding"] = setting.ShowFooterBranding

View File

@@ -11,7 +11,7 @@ import (
"gopkg.in/macaron.v1"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/log"

View File

@@ -0,0 +1,15 @@
// +build miniwinsvc
// Copyright 2015 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 setting
import (
_ "github.com/kardianos/minwinsvc"
)
func init() {
SupportMiniWinService = true
}

View File

@@ -43,11 +43,11 @@ const (
)
var (
// Build information.
// Build information
BuildTime string
BuildGitHash string
// App settings.
// App settings
AppVer string
AppName string
AppUrl string
@@ -55,15 +55,16 @@ var (
AppPath string
AppDataPath = "data"
// Server settings.
// Server settings
Protocol Scheme
Domain string
HttpAddr, HttpPort string
LocalUrl string
LocalURL string
DisableSSH bool
StartSSHServer bool
SSHDomain string
SSHPort int
SSHRootPath string
OfflineMode bool
DisableRouterLog bool
CertFile, KeyFile string
@@ -71,7 +72,7 @@ var (
EnableGzip bool
LandingPageUrl LandingPage
// Security settings.
// Security settings
InstallLock bool
SecretKey string
LogInRememberDays int
@@ -79,13 +80,13 @@ var (
CookieRememberName string
ReverseProxyAuthUser string
// Database settings.
// Database settings
UseSQLite3 bool
UseMySQL bool
UsePostgreSQL bool
UseTiDB bool
// Webhook settings.
// Webhook settings
Webhook struct {
QueueLength int
DeliverTimeout int
@@ -94,7 +95,7 @@ var (
PagingNum int
}
// Repository settings.
// Repository settings
Repository struct {
AnsiCharset string
ForcePrivate bool
@@ -104,7 +105,7 @@ var (
RepoRootPath string
ScriptType string
// UI settings.
// UI settings
ExplorePagingNum int
IssuePagingNum int
FeedMaxCommitNum int
@@ -113,47 +114,47 @@ var (
AdminNoticePagingNum int
AdminOrgPagingNum int
// Markdown sttings.
// Markdown sttings
Markdown struct {
EnableHardLineBreak bool
}
// Picture settings.
// Picture settings
PictureService string
AvatarUploadPath string
GravatarSource string
DisableGravatar bool
// Log settings.
// Log settings
LogRootPath string
LogModes []string
LogConfigs []string
// Attachment settings.
// Attachment settings
AttachmentPath string
AttachmentAllowedTypes string
AttachmentMaxSize int64
AttachmentMaxFiles int
AttachmentEnabled bool
// Time settings.
// Time settings
TimeFormat string
// Cache settings.
// Cache settings
CacheAdapter string
CacheInternal int
CacheConn string
// Session settings.
// Session settings
SessionConfig session.Options
// Git settings.
// Git settings
Git struct {
MaxGitDiffLines int
GcArgs []string `delim:" "`
}
// Cron tasks.
// Cron tasks
Cron struct {
UpdateMirror struct {
Enabled bool
@@ -174,17 +175,20 @@ var (
} `ini:"cron.check_repo_stats"`
}
// I18n settings.
// I18n settings
Langs, Names []string
dateLangs map[string]string
// Other settings.
ShowFooterBranding bool
ShowFooterVersion bool
// Highlight settings are loaded in modules/template/hightlight.go
// Global setting objects.
// Other settings
ShowFooterBranding bool
ShowFooterVersion bool
SupportMiniWinService bool
// Global setting objects
Cfg *ini.File
CustomPath string // Custom directory path.
CustomPath string // Custom directory path
CustomConf string
ProdMode bool
RunUser string
@@ -270,10 +274,16 @@ func NewContext() {
log.Fatal(4, "Fail to load custom conf '%s': %v", CustomConf, err)
}
} else {
log.Warn("Custom config (%s) not found, ignore this if you're running first time", CustomConf)
log.Warn("Custom config '%s' not found, ignore this if you're running first time", CustomConf)
}
Cfg.NameMapper = ini.AllCapsUnderscore
homeDir, err := com.HomeDir()
if err != nil {
log.Fatal(4, "Fail to get home directory: %v", err)
}
homeDir = strings.Replace(homeDir, "\\", "/", -1)
LogRootPath = Cfg.Section("log").Key("ROOT_PATH").MustString(path.Join(workDir, "log"))
forcePathSeparator(LogRootPath)
@@ -287,7 +297,7 @@ func NewContext() {
// Check if has app suburl.
url, err := url.Parse(AppUrl)
if err != nil {
log.Fatal(4, "Invalid ROOT_URL(%s): %s", AppUrl, err)
log.Fatal(4, "Invalid ROOT_URL '%s': %s", AppUrl, err)
}
AppSubUrl = strings.TrimSuffix(url.Path, "/")
@@ -302,13 +312,17 @@ func NewContext() {
Domain = sec.Key("DOMAIN").MustString("localhost")
HttpAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0")
HttpPort = sec.Key("HTTP_PORT").MustString("3000")
LocalUrl = sec.Key("LOCAL_ROOT_URL").MustString("http://localhost:" + HttpPort + "/")
LocalURL = sec.Key("LOCAL_ROOT_URL").MustString("http://localhost:" + HttpPort + "/")
DisableSSH = sec.Key("DISABLE_SSH").MustBool()
if !DisableSSH {
StartSSHServer = sec.Key("START_SSH_SERVER").MustBool()
}
SSHDomain = sec.Key("SSH_DOMAIN").MustString(Domain)
SSHPort = sec.Key("SSH_PORT").MustInt(22)
SSHRootPath = sec.Key("SSH_ROOT_PATH").MustString(path.Join(homeDir, ".ssh"))
if err := os.MkdirAll(SSHRootPath, 0700); err != nil {
log.Fatal(4, "Fail to create '%s': %v", SSHRootPath, err)
}
OfflineMode = sec.Key("OFFLINE_MODE").MustBool()
DisableRouterLog = sec.Key("DISABLE_ROUTER_LOG").MustBool()
StaticRootPath = sec.Key("STATIC_ROOT_PATH").MustString(workDir)
@@ -365,12 +379,6 @@ func NewContext() {
}
// Determine and create root git repository path.
homeDir, err := com.HomeDir()
if err != nil {
log.Fatal(4, "Fail to get home directory: %v", err)
}
homeDir = strings.Replace(homeDir, "\\", "/", -1)
sec = Cfg.Section("repository")
RepoRootPath = sec.Key("ROOT").MustString(path.Join(homeDir, "gogs-repositories"))
forcePathSeparator(RepoRootPath)
@@ -407,7 +415,7 @@ func NewContext() {
case "duoshuo":
GravatarSource = "http://gravatar.duoshuo.com/avatar/"
case "gravatar":
GravatarSource = "//1.gravatar.com/avatar/"
GravatarSource = "https://secure.gravatar.com/avatar/"
default:
GravatarSource = source
}
@@ -420,7 +428,7 @@ func NewContext() {
log.Fatal(4, "Fail to map Markdown settings: %v", err)
} else if err = Cfg.Section("git").MapTo(&Git); err != nil {
log.Fatal(4, "Fail to map Git settings: %v", err)
} else if Cfg.Section("cron").MapTo(&Cron); err != nil {
} else if err = Cfg.Section("cron").MapTo(&Cron); err != nil {
log.Fatal(4, "Fail to map Cron settings: %v", err)
}
@@ -445,8 +453,6 @@ var Service struct {
EnableNotifyMail bool
EnableReverseProxyAuth bool
EnableReverseProxyAutoRegister bool
DisableMinimumKeySizeCheck bool
MinimumKeySizes map[string]int
EnableCaptcha bool
}
@@ -460,14 +466,7 @@ func newService() {
Service.EnableCacheAvatar = sec.Key("ENABLE_CACHE_AVATAR").MustBool()
Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool()
Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool()
Service.DisableMinimumKeySizeCheck = sec.Key("DISABLE_MINIMUM_KEY_SIZE_CHECK").MustBool()
Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool()
minimumKeySizes := Cfg.Section("service.minimum_key_sizes").Keys()
Service.MinimumKeySizes = make(map[string]int)
for _, key := range minimumKeySizes {
Service.MinimumKeySizes[key.Name()] = key.MustInt()
}
}
var logLevels = map[string]string{

View File

@@ -1,5 +1,3 @@
// +build go1.4
// Copyright 2014 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.
@@ -53,7 +51,8 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) {
case "env":
args := strings.Split(strings.Replace(payload, "\x00", "", -1), "\v")
if len(args) != 2 {
return
log.Warn("Invalid env arguments: '%#v'", args)
continue
}
args[0] = strings.TrimLeft(args[0], "\x04")
_, _, err := com.ExecCmdBytes("env", args[0]+"="+args[1])
@@ -92,6 +91,7 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) {
return
}
req.Reply(true, nil)
go io.Copy(input, ch)
io.Copy(ch, stdout)
io.Copy(ch.Stderr(), stderr)

View File

@@ -1,7 +0,0 @@
// +build !go1.4
package ssh
func Listen(port int) {
panic("Gogs requires Go 1.4 for starting a SSH server")
}

View File

@@ -0,0 +1,97 @@
// Copyright 2015 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 template
import (
"path"
"strings"
"github.com/gogits/gogs/modules/setting"
)
var (
// File name should ignore highlight.
ignoreFileNames = map[string]bool{
"license": true,
"copying": true,
}
// File names that are representing highlight classes.
highlightFileNames = map[string]bool{
"dockerfile": true,
"makefile": true,
}
// Extensions that are same as highlight classes.
highlightExts = map[string]bool{
".arm": true,
".as": true,
".sh": true,
".cs": true,
".cpp": true,
".c": true,
".css": true,
".cmake": true,
".bat": true,
".dart": true,
".patch": true,
".elixir": true,
".erlang": true,
".go": true,
".html": true,
".xml": true,
".hs": true,
".ini": true,
".json": true,
".java": true,
".js": true,
".less": true,
".lua": true,
".php": true,
".py": true,
".rb": true,
".scss": true,
".sql": true,
".scala": true,
".swift": true,
".ts": true,
".vb": true,
}
// Extensions that are not same as highlight classes.
highlightMapping = map[string]string{}
)
func NewContext() {
keys := setting.Cfg.Section("highlight.mapping").Keys()
for i := range keys {
highlightMapping[keys[i].Name()] = keys[i].Value()
}
}
// FileNameToHighlightClass returns the best match for highlight class name
// based on the rule of highlight.js.
func FileNameToHighlightClass(fname string) string {
fname = strings.ToLower(fname)
if ignoreFileNames[fname] {
return "nohighlight"
}
if highlightFileNames[fname] {
return fname
}
ext := path.Ext(fname)
if highlightExts[ext] {
return ext[1:]
}
name, ok := highlightMapping[ext]
if ok {
return name
}
return ""
}

View File

@@ -34,6 +34,9 @@ var Funcs template.FuncMap = map[string]interface{}{
"AppSubUrl": func() string {
return setting.AppSubUrl
},
"AppUrl": func() string {
return setting.AppUrl
},
"AppVer": func() string {
return setting.AppVer
},
@@ -130,21 +133,18 @@ func ToUtf8WithErr(content []byte) (error, string) {
charsetLabel, err := base.DetectEncoding(content)
if err != nil {
return err, ""
}
if charsetLabel == "UTF-8" {
} else if charsetLabel == "UTF-8" {
return nil, string(content)
}
encoding, _ := charset.Lookup(charsetLabel)
if encoding == nil {
return fmt.Errorf("unknown char decoder %s", charsetLabel), string(content)
return fmt.Errorf("Unknown encoding: %s", charsetLabel), string(content)
}
result, n, err := transform.String(encoding.NewDecoder(), string(content))
// If there is an error, we concatenate the nicely decoded part and the
// original left over. This way we won't loose data.
result, n, err := transform.String(encoding.NewDecoder(), string(content))
if err != nil {
result = result + string(content[n:])
}

View File

@@ -47,20 +47,20 @@
"outputPathIsOutsideProject": 0,
"outputPathIsSetByUser": 0
},
"\/css\/highlight-8.9.1\/default.css": {
"\/css\/highlight-9.0.0\/default.css": {
"fileType": 16,
"ignore": 0,
"ignoreWasSetByUser": 0,
"inputAbbreviatedPath": "\/css\/highlight-8.9.1\/default.css",
"inputAbbreviatedPath": "\/css\/highlight-9.0.0\/default.css",
"outputAbbreviatedPath": "No Output Path",
"outputPathIsOutsideProject": 0,
"outputPathIsSetByUser": 0
},
"\/css\/highlight-8.9.1\/github.css": {
"\/css\/highlight-9.0.0\/github.css": {
"fileType": 16,
"ignore": 0,
"ignoreWasSetByUser": 0,
"inputAbbreviatedPath": "\/css\/highlight-8.9.1\/github.css",
"inputAbbreviatedPath": "\/css\/highlight-9.0.0\/github.css",
"outputAbbreviatedPath": "No Output Path",
"outputPathIsOutsideProject": 0,
"outputPathIsSetByUser": 0

View File

@@ -718,6 +718,7 @@
body {
font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif, '微软雅黑';
background-color: #FAFAFA;
overflow-y: scroll;
}
img {
border-radius: 3px;
@@ -735,6 +736,11 @@ pre.raw {
line-height: 1.5;
overflow: auto;
}
pre.wrap {
white-space: pre-wrap;
/* CSS 3 */
word-break: break-word;
}
.full.height {
padding: 0;
margin: 0 0 -80px 0;
@@ -803,6 +809,9 @@ pre.raw {
.ui.right {
float: right;
}
.ui.container.fluid.padded {
padding: 0 10px 0 10px;
}
.ui .text.red {
color: #d95c5c !important;
}
@@ -1484,6 +1493,9 @@ footer .container .links > *:first-child {
border-radius: 3px;
box-shadow: inset 0 -1px 0 #bbb;
}
.markdown input[type="checkbox"] {
vertical-align: middle !important;
}
.markdown .csv-data td,
.markdown .csv-data th {
padding: 5px;
@@ -1902,14 +1914,14 @@ footer .container .links > *:first-child {
margin-top: -2px;
}
.repository.file.list #file-content .view-raw * {
width: 100%;
max-width: 100%;
}
.repository.file.list #file-content .view-raw img {
padding: 5px 5px 0 5px;
}
.repository.file.list #file-content .code-view * {
font-size: 13px;
font-family: monospace;
font-size: 12px;
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
line-height: 20px;
}
.repository.file.list #file-content .code-view table {
@@ -1923,7 +1935,6 @@ footer .container .links > *:first-child {
width: 1%;
}
.repository.file.list #file-content .code-view .lines-num span {
font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
line-height: 20px;
padding: 0 10px;
cursor: pointer;
@@ -2301,9 +2312,10 @@ footer .container .links > *:first-child {
}
.repository .diff-box .count {
margin-right: 12px;
font-size: 13px;
}
.repository .diff-box .count .bar {
background-color: #e75316;
background-color: #bd2c00;
height: 12px;
width: 40px;
display: inline-block;
@@ -2311,7 +2323,7 @@ footer .container .links > *:first-child {
vertical-align: text-top;
}
.repository .diff-box .count .bar .add {
background-color: #77c64a;
background-color: #55a532;
height: 12px;
}
.repository .diff-box .file {
@@ -2322,23 +2334,27 @@ footer .container .links > *:first-child {
}
.repository .diff-file-box .file-body.file-code .lines-num {
text-align: right;
color: #999;
color: #A7A7A7;
background: #fafafa;
width: 1%;
}
.repository .diff-file-box .file-body.file-code .lines-num span.fold {
display: block;
text-align: center;
}
.repository .diff-file-box .file-body.file-code .lines-num-old {
border-right: 1px solid #DDD;
}
.repository .diff-file-box .code-diff {
font-size: 13px;
font-size: 12px;
}
.repository .diff-file-box .code-diff td {
padding: 0;
padding-left: 10px;
border-top: none;
}
.repository .diff-file-box .code-diff pre {
margin: 0;
font-size: 13px;
}
.repository .diff-file-box .code-diff .lines-num {
border-right: 1px solid #d4d4d5;
@@ -2346,25 +2362,43 @@ footer .container .links > *:first-child {
}
.repository .diff-file-box .code-diff tbody tr.tag-code td,
.repository .diff-file-box .code-diff tbody tr.tag-code pre {
background-color: #E0E0E0 !important;
border-color: #ADADAD!important;
background-color: #F0F0F0 !important;
border-color: #D2CECE!important;
padding-top: 4px;
padding-bottom: 4px;
}
.repository .diff-file-box .code-diff tbody tr.tag-code td.halfwidth {
width: 50%;
}
.repository .diff-file-box .code-diff tbody tr.del-code td.add-code {
background-color: #eaffea !important;
border-color: #c1e9c1 !important;
}
.repository .diff-file-box .code-diff tbody tr.del-code td.add-code pre {
background-color: #eaffea !important;
border-color: #c1e9c1 !important;
}
.repository .diff-file-box .code-diff tbody tr.del-code td,
.repository .diff-file-box .code-diff tbody tr.del-code pre {
background-color: #ffe2dd !important;
border-color: #e9aeae !important;
background-color: #ffecec !important;
border-color: #f1c0c0 !important;
}
.repository .diff-file-box .code-diff tbody tr.del-code td.halfwidth {
width: 50%;
}
.repository .diff-file-box .code-diff tbody tr.add-code td,
.repository .diff-file-box .code-diff tbody tr.add-code pre {
background-color: #d1ffd6 !important;
border-color: #b4e2b4 !important;
background-color: #eaffea !important;
border-color: #c1e9c1 !important;
}
.repository .diff-file-box .code-diff tbody tr:hover td {
background-color: #FFF8D2 !important;
border-color: #F0DB88 !important;
.repository .diff-file-box .code-diff tbody tr.add-code td.halfwidth {
width: 50%;
}
.repository .diff-file-box .code-diff tbody tr:hover pre {
background-color: transparent !important;
.repository .diff-file-box .code-diff tbody tr .removed-code {
background-color: #ff9999;
}
.repository .diff-file-box .code-diff tbody tr .added-code {
background-color: #99ff99;
}
.repository .diff-file-box.file-content img {
max-width: 100%;
@@ -2471,31 +2505,6 @@ footer .container .links > *:first-child {
.repository.new.release .prerelease.field {
margin-bottom: 0;
}
.repository.watchers .list {
padding: 0;
}
.repository.watchers .list .item {
list-style: none;
width: 32%;
margin: 10px 10px 10px 0;
padding-bottom: 14px;
float: left;
}
.repository.watchers .list .item .avatar {
width: 48px;
height: 48px;
float: left;
display: block;
margin-right: 10px;
}
.repository.watchers .list .item .name {
margin-top: 0;
margin-bottom: 0;
font-weight: normal;
}
.repository.watchers .list .item .meta {
margin-top: 5px;
}
.repository.forks .list {
margin-top: 0;
}
@@ -2557,6 +2566,31 @@ footer .container .links > *:first-child {
margin-left: 5px;
margin-top: -3px;
}
.user-cards .list {
padding: 0;
}
.user-cards .list .item {
list-style: none;
width: 32%;
margin: 10px 10px 10px 0;
padding-bottom: 14px;
float: left;
}
.user-cards .list .item .avatar {
width: 48px;
height: 48px;
float: left;
display: block;
margin-right: 10px;
}
.user-cards .list .item .name {
margin-top: 0;
margin-bottom: 0;
font-weight: normal;
}
.user-cards .list .item .meta {
margin-top: 5px;
}
#search-repo-box .results,
#search-user-box .results {
padding: 0;
@@ -2868,7 +2902,7 @@ footer .container .links > *:first-child {
margin-left: 5px;
margin-top: -3px;
}
.user {
.user:not(.icon) {
padding-top: 15px;
padding-bottom: 80px;
}
@@ -2899,9 +2933,24 @@ footer .container .links > *:first-child {
.user.profile .ui.card .extra.content ul li:not(:last-child) {
border-bottom: 1px solid #eaeaea;
}
.user.profile .ui.card .extra.content ul li .octicon {
margin-left: 1px;
margin-right: 5px;
}
.user.profile .ui.card .extra.content ul li.follow .ui.button {
width: 100%;
}
.user.profile .ui.repository.list {
margin-top: 25px;
}
.user.followers .header.name {
font-size: 20px;
line-height: 24px;
vertical-align: middle;
}
.user.followers .follow .ui.button {
padding: 8px 15px;
}
.dashboard {
padding-top: 15px;
padding-bottom: 80px;
@@ -2984,6 +3033,16 @@ footer .container .links > *:first-child {
width: 80%;
margin-bottom: -5px;
}
.feeds .news .commit-id {
font-family: Consolas, monospace;
}
.feeds .news code {
padding: 1px;
font-size: 85%;
background-color: rgba(0, 0, 0, 0.04);
border-radius: 3px;
word-break: break-all;
}
.feeds .list .header {
padding-top: 10px;
padding-bottom: 5px;
@@ -3011,6 +3070,18 @@ footer .container .links > *:first-child {
margin-right: 6px;
color: #888;
}
.feeds .list .repo-owner-name-list .item-name {
max-width: 70%;
margin-bottom: -4px;
}
.feeds .list #collaborative-repo-list .owner-and-repo {
max-width: 80%;
margin-bottom: -5px;
}
.feeds .list #collaborative-repo-list .owner-name {
max-width: 120px;
margin-bottom: -5px;
}
.admin {
padding-top: 15px;
padding-bottom: 80px;
@@ -3071,6 +3142,9 @@ footer .container .links > *:first-child {
font-size: 1.5rem;
padding-bottom: 10px;
}
.ui.repository.list .item .ui.header .name {
word-break: break-all;
}
.ui.repository.list .item .ui.header .metas {
color: #888;
font-size: 13px;

View File

@@ -1,123 +0,0 @@
/*
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
background: #f8f8f8;
-webkit-text-size-adjust: none;
}
.hljs-comment,
.diff .hljs-header {
color: #998;
font-style: italic;
}
.hljs-keyword,
.css .rule .hljs-keyword,
.hljs-winutils,
.nginx .hljs-title,
.hljs-subst,
.hljs-request,
.hljs-status {
color: #333;
font-weight: bold;
}
.hljs-number,
.hljs-hexcolor,
.ruby .hljs-constant {
color: #008080;
}
.hljs-string,
.hljs-tag .hljs-value,
.hljs-doctag,
.tex .hljs-formula {
color: #d14;
}
.hljs-title,
.hljs-id,
.scss .hljs-preprocessor {
color: #900;
font-weight: bold;
}
.hljs-list .hljs-keyword,
.hljs-subst {
font-weight: normal;
}
.hljs-class .hljs-title,
.hljs-type,
.vhdl .hljs-literal,
.tex .hljs-command {
color: #458;
font-weight: bold;
}
.hljs-tag,
.hljs-tag .hljs-title,
.hljs-rule .hljs-property,
.django .hljs-tag .hljs-keyword {
color: #000080;
font-weight: normal;
}
.hljs-attribute,
.hljs-variable,
.lisp .hljs-body,
.hljs-name {
color: #008080;
}
.hljs-regexp {
color: #009926;
}
.hljs-symbol,
.ruby .hljs-symbol .hljs-string,
.lisp .hljs-keyword,
.clojure .hljs-keyword,
.scheme .hljs-keyword,
.tex .hljs-special,
.hljs-prompt {
color: #990073;
}
.hljs-built_in {
color: #0086b3;
}
.hljs-preprocessor,
.hljs-pragma,
.hljs-pi,
.hljs-doctype,
.hljs-shebang,
.hljs-cdata {
color: #999;
font-weight: bold;
}
.hljs-deletion {
background: #fdd;
}
.hljs-addition {
background: #dfd;
}
.diff .hljs-change {
background: #0086b3;
}
.hljs-chunk {
color: #aaa;
}

View File

@@ -0,0 +1,99 @@
/*
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
background: #f8f8f8;
}
.hljs-comment,
.hljs-quote {
color: #998;
font-style: italic;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-subst {
color: #333;
font-weight: bold;
}
.hljs-number,
.hljs-literal,
.hljs-variable,
.hljs-template-variable,
.hljs-tag .hljs-attr {
color: #008080;
}
.hljs-string,
.hljs-doctag {
color: #d14;
}
.hljs-title,
.hljs-section,
.hljs-selector-id {
color: #900;
font-weight: bold;
}
.hljs-subst {
font-weight: normal;
}
.hljs-type,
.hljs-class .hljs-title {
color: #458;
font-weight: bold;
}
.hljs-tag,
.hljs-name,
.hljs-attribute {
color: #000080;
font-weight: normal;
}
.hljs-regexp,
.hljs-link {
color: #009926;
}
.hljs-symbol,
.hljs-bullet {
color: #990073;
}
.hljs-built_in,
.hljs-builtin-name {
color: #0086b3;
}
.hljs-meta {
color: #999;
font-weight: bold;
}
.hljs-deletion {
background: #fdd;
}
.hljs-addition {
background: #dfd;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

View File

@@ -464,10 +464,7 @@ function initWiki() {
element: $edit_area[0],
previewRender: function (plainText, preview) { // Async method
setTimeout(function () {
if ($('.editor-preview-active').length == 0) {
return;
}
// FIXME: still send render request when return back to edit mode
$.post($edit_area.data('url'), {
"_csrf": csrf,
"mode": "gfm",
@@ -870,7 +867,8 @@ $(document).ready(function () {
// Emojify
emojify.setConfig({
img_dir: suburl + '/img/emoji'
img_dir: suburl + '/img/emoji',
ignore_emoticons: true
});
emojify.run();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -3,6 +3,7 @@
body {
font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif,'微软雅黑';
background-color: #FAFAFA;
overflow-y: scroll;
}
img {
border-radius: 3px;
@@ -19,6 +20,13 @@ pre {
line-height: 1.5;
overflow: auto;
}
&.wrap {
white-space: pre-wrap; /* CSS 3 */
// white-space: -moz-normal; /* Mozilla, since 1999 */
// white-space: -normal; /* Opera 4-6 */
// white-space: -o-normal; /* Opera 7 */
word-break: break-word;
}
}
.full.height {
padding: 0;
@@ -93,6 +101,14 @@ pre {
float: right;
}
&.container {
&.fluid {
&.padded {
padding: 0 10px 0 10px;
}
}
}
.text {
&.red {
color: #d95c5c !important;

View File

@@ -83,6 +83,16 @@
margin-bottom: -5px;
}
}
.commit-id {
font-family: Consolas, monospace;
}
code {
padding: 1px;
font-size: 85%;
background-color: rgba(0, 0, 0, 0.04);
border-radius: 3px;
word-break: break-all;
}
}
.list {
@@ -120,5 +130,23 @@
}
}
}
.repo-owner-name-list {
.item-name {
max-width: 70%;
margin-bottom: -4px;
}
}
#collaborative-repo-list {
.owner-and-repo {
max-width: 80%;
margin-bottom: -5px;
}
.owner-name {
max-width: 120px;
margin-bottom: -5px;
}
}
}
}

View File

@@ -15,6 +15,11 @@
.ui.header {
font-size: 1.5rem;
padding-bottom: 10px;
.name {
word-break: break-all;
}
.metas {
color: #888;
font-size: 13px;

View File

@@ -458,6 +458,10 @@
box-shadow:inset 0 -1px 0 #bbb;
}
input[type="checkbox"] {
vertical-align: middle !important;
}
.csv-data td,
.csv-data th {
padding:5px;

View File

@@ -181,7 +181,7 @@
}
.view-raw {
* {
width: 100%;
max-width: 100%;
}
img {
padding: 5px 5px 0 5px;
@@ -190,8 +190,8 @@
.code-view {
* {
font-size: 13px;
font-family: monospace;
font-size: 12px;
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
line-height: 20px;
}
@@ -206,7 +206,6 @@
width: 1%;
span {
font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
line-height: 20px;
padding: 0 10px;
cursor: pointer;
@@ -642,15 +641,17 @@
.diff-box {
.count {
margin-right: 12px;
font-size: 13px;
.bar {
background-color: #e75316;
background-color: #bd2c00;
height: 12px;
width: 40px;
display: inline-block;
margin: 2px 4px 0 4px;
vertical-align: text-top;
.add {
background-color: #77c64a;
background-color: #55a532;
height: 12px;
}
}
@@ -666,24 +667,29 @@
.file-body.file-code {
.lines-num {
text-align: right;
color: #999;
color: #A7A7A7;
background: #fafafa;
width: 1%;
span.fold {
display: block;
text-align: center;
}
}
.lines-num-old {
border-right: 1px solid #DDD;
}
}
.code-diff {
font-size: 13px;
font-size: 12px;
td {
padding: 0;
padding-left: 10px;
border-top: none;
}
pre {
margin: 0;
font-size: 13px;
}
.lines-num {
border-right: 1px solid #d4d4d5;
@@ -691,10 +697,16 @@
}
tbody {
tr {
&.tag-code {
td, pre {
background-color: #E0E0E0 !important;
border-color: #ADADAD!important;
background-color: #F0F0F0 !important;
border-color: #D2CECE!important;
padding-top: 4px;
padding-bottom: 4px;
}
td.halfwidth {
width: 50%;
}
// td.selected-line, td.selected-line pre {
// background-color: #ffffdd !important;
@@ -706,9 +718,23 @@
// }
// }
&.del-code {
// Duplicate here to enforce add code color.
td.add-code {
background-color: #eaffea !important;
border-color: #c1e9c1 !important;
pre {
background-color: #eaffea !important;
border-color: #c1e9c1 !important;
}
}
td, pre {
background-color: #ffe2dd !important;
border-color: #e9aeae !important;
background-color: #ffecec !important;
border-color: #f1c0c0 !important;
}
td.halfwidth {
width: 50%;
}
// td.selected-line, td.selected-line pre {
// background-color: #ffffdd !important;
@@ -716,21 +742,22 @@
}
&.add-code {
td, pre {
background-color: #d1ffd6 !important;
border-color: #b4e2b4 !important;
background-color: #eaffea !important;
border-color: #c1e9c1 !important;
}
td.halfwidth {
width: 50%;
}
// td.selected-line, td.selected-line pre {
// background-color: #ffffdd !important;
// }
}
&:hover {
td {
background-color: #FFF8D2 !important;
border-color: #F0DB88 !important;
}
pre {
background-color: transparent !important;
}
.removed-code {
background-color: #ff9999;
}
.added-code {
background-color: #99ff99;
}
}
}
@@ -866,35 +893,6 @@
}
}
&.watchers {
.list {
padding: 0;
.item {
list-style: none;
width: 32%;
margin: 10px 10px 10px 0;
padding-bottom: 14px;
float: left;
.avatar {
width: 48px;
height: 48px;
float: left;
display: block;
margin-right: 10px;
}
.name {
margin-top: 0;
margin-bottom: 0;
font-weight: normal;
}
.meta {
margin-top: 5px;
}
}
}
}
&.forks {
.list {
margin-top: 0;
@@ -989,6 +987,36 @@
}
// End of .repository
&.user-cards {
.list {
padding: 0;
.item {
list-style: none;
width: 32%;
margin: 10px 10px 10px 0;
padding-bottom: 14px;
float: left;
.avatar {
width: 48px;
height: 48px;
float: left;
display: block;
margin-right: 10px;
}
.name {
margin-top: 0;
margin-bottom: 0;
font-weight: normal;
}
.meta {
margin-top: 5px;
}
}
}
}
#search-repo-box,
#search-user-box {
.results {
@@ -1199,3 +1227,5 @@
width: 100%!important;
}
}

View File

@@ -1,6 +1,8 @@
.user {
padding-top: 15px;
padding-bottom: @footer-margin * 2;
&:not(.icon) {
padding-top: 15px;
padding-bottom: @footer-margin * 2;
}
&.settings {
.list {
@@ -38,6 +40,17 @@
&:not(:last-child) {
border-bottom: 1px solid #eaeaea;
}
.octicon {
margin-left: 1px;
margin-right: 5px;
}
&.follow {
.ui.button {
width: 100%;
}
}
}
}
}
@@ -47,4 +60,18 @@
margin-top: 25px;
}
}
&.followers {
.header.name {
font-size: 20px;
line-height: 24px;
vertical-align: middle;
}
.follow {
.ui.button {
padding: 8px 15px;
}
}
}
}

View File

@@ -0,0 +1,44 @@
// Copyright 2015 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 admin
import (
api "github.com/gogits/go-gogs-client"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/routers/api/v1/convert"
"github.com/gogits/gogs/routers/api/v1/user"
)
// https://github.com/gogits/go-gogs-client/wiki/Administration-Organizations#create-a-new-organization
func CreateOrg(ctx *middleware.Context, form api.CreateOrgOption) {
u := user.GetUserByParams(ctx)
if ctx.Written() {
return
}
org := &models.User{
Name: form.UserName,
FullName: form.FullName,
Description: form.Description,
Website: form.Website,
Location: form.Location,
IsActive: true,
Type: models.ORGANIZATION,
}
if err := models.CreateOrganization(org, u); err != nil {
if models.IsErrUserAlreadyExist(err) ||
models.IsErrNameReserved(err) ||
models.IsErrNamePatternNotAllowed(err) {
ctx.APIError(422, "CreateOrganization", err)
} else {
ctx.APIError(500, "CreateOrganization", err)
}
return
}
ctx.JSON(201, convert.ToApiOrganization(org))
}

View File

@@ -0,0 +1,23 @@
// Copyright 2015 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 admin
import (
api "github.com/gogits/go-gogs-client"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/routers/api/v1/repo"
"github.com/gogits/gogs/routers/api/v1/user"
)
// https://github.com/gogits/go-gogs-client/wiki/Administration-Repositories#create-a-new-repository
func CreateRepo(ctx *middleware.Context, form api.CreateRepoOption) {
owner := user.GetUserByParams(ctx)
if ctx.Written() {
return
}
repo.CreateUserRepo(ctx, owner, form)
}

View File

@@ -12,8 +12,8 @@ import (
"github.com/gogits/gogs/modules/mailer"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting"
"github.com/gogits/gogs/routers/api/v1/convert"
"github.com/gogits/gogs/routers/api/v1/user"
to "github.com/gogits/gogs/routers/api/v1/utils"
)
func parseLoginSource(ctx *middleware.Context, u *models.User, sourceID int64, loginName string) {
@@ -69,7 +69,7 @@ func CreateUser(ctx *middleware.Context, form api.CreateUserOption) {
mailer.SendRegisterNotifyMail(ctx.Context, u)
}
ctx.JSON(201, to.ApiUser(u))
ctx.JSON(201, convert.ToApiUser(u))
}
// https://github.com/gogits/go-gogs-client/wiki/Administration-Users#edit-an-existing-user
@@ -118,7 +118,7 @@ func EditUser(ctx *middleware.Context, form api.EditUserOption) {
}
log.Trace("Account profile updated by admin (%s): %s", ctx.User.Name, u.Name)
ctx.JSON(200, to.ApiUser(u))
ctx.JSON(200, convert.ToApiUser(u))
}
// https://github.com/gogits/go-gogs-client/wiki/Administration-Users#delete-a-user

View File

@@ -17,6 +17,7 @@ import (
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/routers/api/v1/admin"
"github.com/gogits/gogs/routers/api/v1/misc"
"github.com/gogits/gogs/routers/api/v1/org"
"github.com/gogits/gogs/routers/api/v1/repo"
"github.com/gogits/gogs/routers/api/v1/user"
)
@@ -134,10 +135,26 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/users", func() {
m.Group("/:username", func() {
m.Get("/keys", user.ListPublicKeys)
m.Get("/followers", user.ListFollowers)
m.Group("/following", func() {
m.Get("", user.ListFollowing)
m.Get("/:target", user.CheckFollowing)
})
})
}, ReqToken())
m.Group("/user", func() {
m.Combo("/emails").Get(user.ListEmails).
Post(bind(api.CreateEmailOption{}), user.AddEmail).
Delete(bind(api.CreateEmailOption{}), user.DeleteEmail)
m.Get("/followers", user.ListMyFollowers)
m.Group("/following", func() {
m.Get("", user.ListMyFollowing)
m.Combo("/:username").Get(user.CheckMyFollowing).Put(user.Follow).Delete(user.Unfollow)
})
m.Group("/keys", func() {
m.Combo("").Get(user.ListMyPublicKeys).
Post(bind(api.CreateKeyOption{}), user.CreatePublicKey)
@@ -176,6 +193,11 @@ func RegisterRoutes(m *macaron.Macaron) {
}, RepoAssignment())
}, ReqToken())
// Organizations
m.Get("/user/orgs", ReqToken(), org.ListMyOrgs)
m.Get("/users/:username/orgs", org.ListUserOrgs)
m.Combo("/orgs/:orgname").Get(org.Get).Patch(bind(api.EditOrgOption{}), org.Edit)
m.Any("/*", func(ctx *middleware.Context) {
ctx.Error(404)
})
@@ -187,7 +209,9 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/:username", func() {
m.Combo("").Patch(bind(api.EditUserOption{}), admin.EditUser).
Delete(admin.DeleteUser)
m.Post("/keys", admin.CreatePublicKey)
m.Post("/keys", bind(api.CreateKeyOption{}), admin.CreatePublicKey)
m.Post("/orgs", bind(api.CreateOrgOption{}), admin.CreateOrg)
m.Post("/repos", bind(api.CreateRepoOption{}), admin.CreateRepo)
})
})
}, ReqAdmin())

View File

@@ -2,7 +2,7 @@
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package utils
package convert
import (
"fmt"
@@ -15,8 +15,8 @@ import (
"github.com/gogits/gogs/modules/setting"
)
// ApiUser converts user to its API format.
func ApiUser(u *models.User) *api.User {
// ToApiUser converts user to its API format.
func ToApiUser(u *models.User) *api.User {
return &api.User{
ID: u.Id,
UserName: u.Name,
@@ -26,12 +26,20 @@ func ApiUser(u *models.User) *api.User {
}
}
// ApiRepository converts repository to API format.
func ApiRepository(owner *models.User, repo *models.Repository, permission api.Permission) *api.Repository {
func ToApiEmail(email *models.EmailAddress) *api.Email {
return &api.Email{
Email: email.Email,
Verified: email.IsActivated,
Primary: email.IsPrimary,
}
}
// ToApiRepository converts repository to API format.
func ToApiRepository(owner *models.User, repo *models.Repository, permission api.Permission) *api.Repository {
cl := repo.CloneLink()
return &api.Repository{
Id: repo.ID,
Owner: *ApiUser(owner),
Owner: *ToApiUser(owner),
FullName: owner.Name + "/" + repo.Name,
Private: repo.IsPrivate,
Fork: repo.IsFork,
@@ -42,8 +50,8 @@ func ApiRepository(owner *models.User, repo *models.Repository, permission api.P
}
}
// ApiPublicKey converts public key to its API format.
func ApiPublicKey(apiLink string, key *models.PublicKey) *api.PublicKey {
// ToApiPublicKey converts public key to its API format.
func ToApiPublicKey(apiLink string, key *models.PublicKey) *api.PublicKey {
return &api.PublicKey{
ID: key.ID,
Key: key.Content,
@@ -53,8 +61,8 @@ func ApiPublicKey(apiLink string, key *models.PublicKey) *api.PublicKey {
}
}
// ApiHook converts webhook to its API format.
func ApiHook(repoLink string, w *models.Webhook) *api.Hook {
// ToApiHook converts webhook to its API format.
func ToApiHook(repoLink string, w *models.Webhook) *api.Hook {
config := map[string]string{
"url": w.URL,
"content_type": w.ContentType.Name(),
@@ -79,8 +87,8 @@ func ApiHook(repoLink string, w *models.Webhook) *api.Hook {
}
}
// ApiDeployKey converts deploy key to its API format.
func ApiDeployKey(apiLink string, key *models.DeployKey) *api.DeployKey {
// ToApiDeployKey converts deploy key to its API format.
func ToApiDeployKey(apiLink string, key *models.DeployKey) *api.DeployKey {
return &api.DeployKey{
ID: key.ID,
Key: key.Content,
@@ -90,3 +98,15 @@ func ApiDeployKey(apiLink string, key *models.DeployKey) *api.DeployKey {
ReadOnly: true, // All deploy keys are read-only.
}
}
func ToApiOrganization(org *models.User) *api.Organization {
return &api.Organization{
ID: org.Id,
AvatarUrl: org.AvatarLink(),
UserName: org.Name,
FullName: org.FullName,
Description: org.Description,
Website: org.Website,
Location: org.Location,
}
}

74
routers/api/v1/org/org.go Normal file
View File

@@ -0,0 +1,74 @@
// Copyright 2015 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 org
import (
api "github.com/gogits/go-gogs-client"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/routers/api/v1/convert"
"github.com/gogits/gogs/routers/api/v1/user"
)
func listUserOrgs(ctx *middleware.Context, u *models.User, all bool) {
if err := u.GetOrganizations(all); err != nil {
ctx.APIError(500, "GetOrganizations", err)
return
}
apiOrgs := make([]*api.Organization, len(u.Orgs))
for i := range u.Orgs {
apiOrgs[i] = convert.ToApiOrganization(u.Orgs[i])
}
ctx.JSON(200, &apiOrgs)
}
// https://github.com/gogits/go-gogs-client/wiki/Organizations#list-your-organizations
func ListMyOrgs(ctx *middleware.Context) {
listUserOrgs(ctx, ctx.User, true)
}
// https://github.com/gogits/go-gogs-client/wiki/Organizations#list-user-organizations
func ListUserOrgs(ctx *middleware.Context) {
u := user.GetUserByParams(ctx)
if ctx.Written() {
return
}
listUserOrgs(ctx, u, false)
}
// https://github.com/gogits/go-gogs-client/wiki/Organizations#get-an-organization
func Get(ctx *middleware.Context) {
org := user.GetUserByParamsName(ctx, ":orgname")
if ctx.Written() {
return
}
ctx.JSON(200, convert.ToApiOrganization(org))
}
// https://github.com/gogits/go-gogs-client/wiki/Organizations#edit-an-organization
func Edit(ctx *middleware.Context, form api.EditOrgOption) {
org := user.GetUserByParamsName(ctx, ":orgname")
if ctx.Written() {
return
}
if !org.IsOwnedBy(ctx.User.Id) {
ctx.Error(403)
return
}
org.FullName = form.FullName
org.Description = form.Description
org.Website = form.Website
org.Location = form.Location
if err := models.UpdateUser(org); err != nil {
ctx.APIError(500, "UpdateUser", err)
return
}
ctx.JSON(200, convert.ToApiOrganization(org))
}

View File

@@ -5,7 +5,7 @@
package repo
import (
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/middleware"

View File

@@ -13,7 +13,7 @@ import (
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/middleware"
to "github.com/gogits/gogs/routers/api/v1/utils"
"github.com/gogits/gogs/routers/api/v1/convert"
)
// https://github.com/gogits/go-gogs-client/wiki/Repositories#list-hooks
@@ -26,7 +26,7 @@ func ListHooks(ctx *middleware.Context) {
apiHooks := make([]*api.Hook, len(hooks))
for i := range hooks {
apiHooks[i] = to.ApiHook(ctx.Repo.RepoLink, hooks[i])
apiHooks[i] = convert.ToApiHook(ctx.Repo.RepoLink, hooks[i])
}
ctx.JSON(200, &apiHooks)
@@ -94,7 +94,7 @@ func CreateHook(ctx *middleware.Context, form api.CreateHookOption) {
return
}
ctx.JSON(201, to.ApiHook(ctx.Repo.RepoLink, w))
ctx.JSON(201, convert.ToApiHook(ctx.Repo.RepoLink, w))
}
// https://github.com/gogits/go-gogs-client/wiki/Repositories#edit-a-hook
@@ -104,7 +104,7 @@ func EditHook(ctx *middleware.Context, form api.EditHookOption) {
if models.IsErrWebhookNotExist(err) {
ctx.Error(404)
} else {
ctx.APIError(500, "GetWebhookById", err)
ctx.APIError(500, "GetWebhookByID", err)
}
return
}
@@ -161,5 +161,5 @@ func EditHook(ctx *middleware.Context, form api.EditHookOption) {
return
}
ctx.JSON(200, to.ApiHook(ctx.Repo.RepoLink, w))
ctx.JSON(200, convert.ToApiHook(ctx.Repo.RepoLink, w))
}

View File

@@ -12,7 +12,7 @@ import (
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting"
to "github.com/gogits/gogs/routers/api/v1/utils"
"github.com/gogits/gogs/routers/api/v1/convert"
)
func composeDeployKeysAPILink(repoPath string) string {
@@ -34,7 +34,7 @@ func ListDeployKeys(ctx *middleware.Context) {
ctx.APIError(500, "GetContent", err)
return
}
apiKeys[i] = to.ApiDeployKey(apiLink, keys[i])
apiKeys[i] = convert.ToApiDeployKey(apiLink, keys[i])
}
ctx.JSON(200, &apiKeys)
@@ -58,7 +58,7 @@ func GetDeployKey(ctx *middleware.Context) {
}
apiLink := composeDeployKeysAPILink(ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name)
ctx.JSON(200, to.ApiDeployKey(apiLink, key))
ctx.JSON(200, convert.ToApiDeployKey(apiLink, key))
}
func HandleCheckKeyStringError(ctx *middleware.Context, err error) {
@@ -96,7 +96,7 @@ func CreateDeployKey(ctx *middleware.Context, form api.CreateKeyOption) {
key.Content = content
apiLink := composeDeployKeysAPILink(ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name)
ctx.JSON(201, to.ApiDeployKey(apiLink, key))
ctx.JSON(201, convert.ToApiDeployKey(apiLink, key))
}
// https://github.com/gogits/go-gogs-client/wiki/Repositories-Deploy-Keys#remove-a-deploy-key

View File

@@ -16,7 +16,7 @@ import (
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting"
to "github.com/gogits/gogs/routers/api/v1/utils"
"github.com/gogits/gogs/routers/api/v1/convert"
)
// https://github.com/gogits/go-gogs-client/wiki/Repositories#search-repositories
@@ -97,12 +97,12 @@ func ListMyRepos(ctx *middleware.Context) {
repos := make([]*api.Repository, numOwnRepos+len(accessibleRepos))
for i := range ownRepos {
repos[i] = to.ApiRepository(ctx.User, ownRepos[i], api.Permission{true, true, true})
repos[i] = convert.ToApiRepository(ctx.User, ownRepos[i], api.Permission{true, true, true})
}
i := numOwnRepos
for repo, access := range accessibleRepos {
repos[i] = to.ApiRepository(repo.Owner, repo, api.Permission{
repos[i] = convert.ToApiRepository(repo.Owner, repo, api.Permission{
Admin: access >= models.ACCESS_MODE_ADMIN,
Push: access >= models.ACCESS_MODE_WRITE,
Pull: true,
@@ -113,7 +113,7 @@ func ListMyRepos(ctx *middleware.Context) {
ctx.JSON(200, &repos)
}
func createRepo(ctx *middleware.Context, owner *models.User, opt api.CreateRepoOption) {
func CreateUserRepo(ctx *middleware.Context, owner *models.User, opt api.CreateRepoOption) {
repo, err := models.CreateRepository(owner, models.CreateRepoOptions{
Name: opt.Name,
Description: opt.Description,
@@ -139,7 +139,7 @@ func createRepo(ctx *middleware.Context, owner *models.User, opt api.CreateRepoO
return
}
ctx.JSON(201, to.ApiRepository(owner, repo, api.Permission{true, true, true}))
ctx.JSON(201, convert.ToApiRepository(owner, repo, api.Permission{true, true, true}))
}
// https://github.com/gogits/go-gogs-client/wiki/Repositories#create
@@ -149,7 +149,7 @@ func Create(ctx *middleware.Context, opt api.CreateRepoOption) {
ctx.APIError(422, "", "not allowed creating repository for organization")
return
}
createRepo(ctx, ctx.User, opt)
CreateUserRepo(ctx, ctx.User, opt)
}
func CreateOrgRepo(ctx *middleware.Context, opt api.CreateRepoOption) {
@@ -167,7 +167,7 @@ func CreateOrgRepo(ctx *middleware.Context, opt api.CreateRepoOption) {
ctx.APIError(403, "", "Given user is not owner of organization.")
return
}
createRepo(ctx, org, opt)
CreateUserRepo(ctx, org, opt)
}
// https://github.com/gogits/go-gogs-client/wiki/Repositories#migrate
@@ -239,7 +239,7 @@ func Migrate(ctx *middleware.Context, form auth.MigrateRepoForm) {
}
log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName)
ctx.JSON(201, to.ApiRepository(ctxUser, repo, api.Permission{true, true, true}))
ctx.JSON(201, convert.ToApiRepository(ctxUser, repo, api.Permission{true, true, true}))
}
func parseOwnerAndRepo(ctx *middleware.Context) (*models.User, *models.Repository) {
@@ -273,7 +273,7 @@ func Get(ctx *middleware.Context) {
return
}
ctx.JSON(200, to.ApiRepository(owner, repo, api.Permission{true, true, true}))
ctx.JSON(200, convert.ToApiRepository(owner, repo, api.Permission{true, true, true}))
}
// https://github.com/gogits/go-gogs-client/wiki/Repositories#delete

View File

@@ -0,0 +1,81 @@
// Copyright 2015 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 user
import (
api "github.com/gogits/go-gogs-client"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting"
"github.com/gogits/gogs/routers/api/v1/convert"
)
// https://github.com/gogits/go-gogs-client/wiki/Users-Emails#list-email-addresses-for-a-user
func ListEmails(ctx *middleware.Context) {
emails, err := models.GetEmailAddresses(ctx.User.Id)
if err != nil {
ctx.Handle(500, "GetEmailAddresses", err)
return
}
apiEmails := make([]*api.Email, len(emails))
for i := range emails {
apiEmails[i] = convert.ToApiEmail(emails[i])
}
ctx.JSON(200, &apiEmails)
}
// https://github.com/gogits/go-gogs-client/wiki/Users-Emails#add-email-addresses
func AddEmail(ctx *middleware.Context, form api.CreateEmailOption) {
if len(form.Emails) == 0 {
ctx.Status(422)
return
}
emails := make([]*models.EmailAddress, len(form.Emails))
for i := range form.Emails {
emails[i] = &models.EmailAddress{
UID: ctx.User.Id,
Email: form.Emails[i],
IsActivated: !setting.Service.RegisterEmailConfirm,
}
}
if err := models.AddEmailAddresses(emails); err != nil {
if models.IsErrEmailAlreadyUsed(err) {
ctx.APIError(422, "", "Email address has been used: "+err.(models.ErrEmailAlreadyUsed).Email)
} else {
ctx.APIError(500, "AddEmailAddresses", err)
}
return
}
apiEmails := make([]*api.Email, len(emails))
for i := range emails {
apiEmails[i] = convert.ToApiEmail(emails[i])
}
ctx.JSON(201, &apiEmails)
}
// https://github.com/gogits/go-gogs-client/wiki/Users-Emails#delete-email-addresses
func DeleteEmail(ctx *middleware.Context, form api.CreateEmailOption) {
if len(form.Emails) == 0 {
ctx.Status(204)
return
}
emails := make([]*models.EmailAddress, len(form.Emails))
for i := range form.Emails {
emails[i] = &models.EmailAddress{
Email: form.Emails[i],
}
}
if err := models.DeleteEmailAddresses(emails); err != nil {
ctx.APIError(500, "DeleteEmailAddresses", err)
return
}
ctx.Status(204)
}

View File

@@ -0,0 +1,121 @@
// Copyright 2015 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 user
import (
api "github.com/gogits/go-gogs-client"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/routers/api/v1/convert"
)
func responseApiUsers(ctx *middleware.Context, users []*models.User) {
apiUsers := make([]*api.User, len(users))
for i := range users {
apiUsers[i] = convert.ToApiUser(users[i])
}
ctx.JSON(200, &apiUsers)
}
func listUserFollowers(ctx *middleware.Context, u *models.User) {
users, err := u.GetFollowers(ctx.QueryInt("page"))
if err != nil {
ctx.APIError(500, "GetUserFollowers", err)
return
}
responseApiUsers(ctx, users)
}
func ListMyFollowers(ctx *middleware.Context) {
listUserFollowers(ctx, ctx.User)
}
// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#list-followers-of-a-user
func ListFollowers(ctx *middleware.Context) {
u := GetUserByParams(ctx)
if ctx.Written() {
return
}
listUserFollowers(ctx, u)
}
func listUserFollowing(ctx *middleware.Context, u *models.User) {
users, err := u.GetFollowing(ctx.QueryInt("page"))
if err != nil {
ctx.APIError(500, "GetFollowing", err)
return
}
responseApiUsers(ctx, users)
}
func ListMyFollowing(ctx *middleware.Context) {
listUserFollowing(ctx, ctx.User)
}
// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#list-users-followed-by-another-user
func ListFollowing(ctx *middleware.Context) {
u := GetUserByParams(ctx)
if ctx.Written() {
return
}
listUserFollowing(ctx, u)
}
func checkUserFollowing(ctx *middleware.Context, u *models.User, followID int64) {
if u.IsFollowing(followID) {
ctx.Status(204)
} else {
ctx.Error(404)
}
}
// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#check-if-you-are-following-a-user
func CheckMyFollowing(ctx *middleware.Context) {
target := GetUserByParams(ctx)
if ctx.Written() {
return
}
checkUserFollowing(ctx, ctx.User, target.Id)
}
// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#check-if-one-user-follows-another
func CheckFollowing(ctx *middleware.Context) {
u := GetUserByParams(ctx)
if ctx.Written() {
return
}
target := GetUserByParamsName(ctx, ":target")
if ctx.Written() {
return
}
checkUserFollowing(ctx, u, target.Id)
}
// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#follow-a-user
func Follow(ctx *middleware.Context) {
target := GetUserByParams(ctx)
if ctx.Written() {
return
}
if err := models.FollowUser(ctx.User.Id, target.Id); err != nil {
ctx.APIError(500, "FollowUser", err)
return
}
ctx.Status(204)
}
// https://github.com/gogits/go-gogs-client/wiki/Users-Followers#unfollow-a-user
func Unfollow(ctx *middleware.Context) {
target := GetUserByParams(ctx)
if ctx.Written() {
return
}
if err := models.UnfollowUser(ctx.User.Id, target.Id); err != nil {
ctx.APIError(500, "UnfollowUser", err)
return
}
ctx.Status(204)
}

View File

@@ -10,13 +10,12 @@ import (
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting"
"github.com/gogits/gogs/routers/api/v1/convert"
"github.com/gogits/gogs/routers/api/v1/repo"
to "github.com/gogits/gogs/routers/api/v1/utils"
)
// GetUserByParams returns user whose name is presented in URL paramenter.
func GetUserByParams(ctx *middleware.Context) *models.User {
user, err := models.GetUserByName(ctx.Params(":username"))
func GetUserByParamsName(ctx *middleware.Context, name string) *models.User {
user, err := models.GetUserByName(ctx.Params(name))
if err != nil {
if models.IsErrUserNotExist(err) {
ctx.Error(404)
@@ -28,6 +27,11 @@ func GetUserByParams(ctx *middleware.Context) *models.User {
return user
}
// GetUserByParams returns user whose name is presented in URL paramenter.
func GetUserByParams(ctx *middleware.Context) *models.User {
return GetUserByParamsName(ctx, ":username")
}
func composePublicKeysAPILink() string {
return setting.AppUrl + "api/v1/user/keys/"
}
@@ -42,7 +46,7 @@ func listPublicKeys(ctx *middleware.Context, uid int64) {
apiLink := composePublicKeysAPILink()
apiKeys := make([]*api.PublicKey, len(keys))
for i := range keys {
apiKeys[i] = to.ApiPublicKey(apiLink, keys[i])
apiKeys[i] = convert.ToApiPublicKey(apiLink, keys[i])
}
ctx.JSON(200, &apiKeys)
@@ -75,7 +79,7 @@ func GetPublicKey(ctx *middleware.Context) {
}
apiLink := composePublicKeysAPILink()
ctx.JSON(200, to.ApiPublicKey(apiLink, key))
ctx.JSON(200, convert.ToApiPublicKey(apiLink, key))
}
// CreateUserPublicKey creates new public key to given user by ID.
@@ -92,7 +96,7 @@ func CreateUserPublicKey(ctx *middleware.Context, form api.CreateKeyOption, uid
return
}
apiLink := composePublicKeysAPILink()
ctx.JSON(201, to.ApiPublicKey(apiLink, key))
ctx.JSON(201, convert.ToApiPublicKey(apiLink, key))
}
// https://github.com/gogits/go-gogs-client/wiki/Users-Public-Keys#create-a-public-key

View File

@@ -17,7 +17,7 @@ import (
"gopkg.in/ini.v1"
"gopkg.in/macaron.v1"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/models/cron"
@@ -28,6 +28,7 @@ import (
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting"
"github.com/gogits/gogs/modules/ssh"
"github.com/gogits/gogs/modules/template"
"github.com/gogits/gogs/modules/user"
)
@@ -55,6 +56,7 @@ func NewServices() {
// GlobalInit is for global configuration reload-able.
func GlobalInit() {
setting.NewContext()
template.NewContext()
log.Trace("Custom path: %s", setting.CustomPath)
log.Trace("Log path: %s", setting.LogRootPath)
models.LoadConfigs()
@@ -80,6 +82,9 @@ func GlobalInit() {
if models.EnableTidb {
log.Info("TiDB Supported")
}
if setting.SupportMiniWinService {
log.Info("Builtin Windows Service Supported")
}
checkRunMode()
if setting.StartSSHServer {

View File

@@ -60,6 +60,8 @@ func SettingsPost(ctx *middleware.Context, form auth.UpdateOrgSettingForm) {
}
return
}
// reset ctx.org.OrgLink with new name
ctx.Org.OrgLink = setting.AppSubUrl + "/org/" + form.Name
log.Trace("Organization name changed: %s -> %s", org.Name, form.Name)
}
// In case it's just a case change.

View File

@@ -157,12 +157,6 @@ func NewTeamPost(ctx *middleware.Context, form auth.CreateTeamForm) {
ctx.Data["Title"] = ctx.Org.Organization.FullName
ctx.Data["PageIsOrgTeams"] = true
ctx.Data["PageIsOrgTeamsNew"] = true
ctx.Data["Team"] = &models.Team{}
if ctx.HasError() {
ctx.HTML(200, TEAM_NEW)
return
}
// Validate permission level.
var auth models.AccessMode
@@ -178,28 +172,30 @@ func NewTeamPost(ctx *middleware.Context, form auth.CreateTeamForm) {
return
}
org := ctx.Org.Organization
t := &models.Team{
OrgID: org.Id,
OrgID: ctx.Org.Organization.Id,
Name: form.TeamName,
Description: form.Description,
Authorize: auth,
}
ctx.Data["Team"] = t
if ctx.HasError() {
ctx.HTML(200, TEAM_NEW)
return
}
if err := models.NewTeam(t); err != nil {
switch err {
case models.ErrTeamNameIllegal:
ctx.Data["Err_TeamName"] = true
ctx.RenderWithErr(ctx.Tr("form.illegal_team_name"), TEAM_NEW, &form)
case models.ErrTeamAlreadyExist:
ctx.Data["Err_TeamName"] = true
ctx.Data["Err_TeamName"] = true
switch {
case models.IsErrTeamAlreadyExist(err):
ctx.RenderWithErr(ctx.Tr("form.team_name_been_taken"), TEAM_NEW, &form)
default:
ctx.Handle(500, "NewTeam", err)
}
return
}
log.Trace("Team created: %s/%s", org.Name, t.Name)
log.Trace("Team created: %s/%s", ctx.Org.Organization.Name, t.Name)
ctx.Redirect(ctx.Org.OrgLink + "/teams/" + t.LowerName)
}
@@ -235,8 +231,7 @@ func EditTeamPost(ctx *middleware.Context, form auth.CreateTeamForm) {
t := ctx.Org.Team
ctx.Data["Title"] = ctx.Org.Organization.FullName
ctx.Data["PageIsOrgTeams"] = true
ctx.Data["team_name"] = t.Name
ctx.Data["desc"] = t.Description
ctx.Data["Team"] = t
if ctx.HasError() {
ctx.HTML(200, TEAM_NEW)
@@ -267,10 +262,11 @@ func EditTeamPost(ctx *middleware.Context, form auth.CreateTeamForm) {
}
t.Description = form.Description
if err := models.UpdateTeam(t, isAuthChanged); err != nil {
if err == models.ErrTeamNameIllegal {
ctx.Data["Err_TeamName"] = true
ctx.RenderWithErr(ctx.Tr("form.illegal_team_name"), TEAM_NEW, &form)
} else {
ctx.Data["Err_TeamName"] = true
switch {
case models.IsErrTeamAlreadyExist(err):
ctx.RenderWithErr(ctx.Tr("form.team_name_been_taken"), TEAM_NEW, &form)
default:
ctx.Handle(500, "UpdateTeam", err)
}
return

View File

@@ -10,7 +10,7 @@ import (
"github.com/Unknwon/paginater"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/base"
@@ -168,6 +168,7 @@ func Diff(ctx *middleware.Context) {
}
}
ctx.Data["IsSplitStyle"] = ctx.Query("style") == "split"
ctx.Data["Username"] = userName
ctx.Data["Reponame"] = repoName
ctx.Data["IsImageFile"] = commit.IsImageFile
@@ -213,6 +214,7 @@ func CompareDiff(ctx *middleware.Context) {
}
commits = models.ValidateCommitsWithEmails(commits)
ctx.Data["IsSplitStyle"] = ctx.Query("style") == "split"
ctx.Data["CommitRepoLink"] = ctx.Repo.RepoLink
ctx.Data["Commits"] = commits
ctx.Data["CommitCount"] = commits.Len()

View File

@@ -8,7 +8,7 @@ import (
"io"
"path"
"github.com/gogits/git-shell"
"github.com/gogits/git-module"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/middleware"
@@ -28,6 +28,8 @@ func ServeData(ctx *middleware.Context, name string, reader io.Reader) error {
ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+path.Base(ctx.Repo.TreeName))
ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary")
}
} else {
ctx.Resp.Header().Set("Content-Type", "text/plain")
}
ctx.Resp.Write(buf)
_, err := io.Copy(ctx.Resp, reader)

View File

@@ -126,12 +126,12 @@ func HTTP(ctx *middleware.Context) {
return
}
token.Updated = time.Now()
if err = models.UpdateAccessToekn(token); err != nil {
ctx.Handle(500, "UpdateAccessToekn", err)
if err = models.UpdateAccessToken(token); err != nil {
ctx.Handle(500, "UpdateAccessToken", err)
}
authUser, err = models.GetUserByID(token.UID)
if err != nil {
ctx.Handle(500, "GetUserById", err)
ctx.Handle(500, "GetUserByID", err)
return
}
authUsername = authUser.Name
@@ -145,23 +145,26 @@ func HTTP(ctx *middleware.Context) {
has, err := models.HasAccess(authUser, repo, tp)
if err != nil {
ctx.HandleText(401, "no basic auth and digit auth")
ctx.Handle(500, "HasAccess", err)
return
} else if !has {
if tp == models.ACCESS_MODE_READ {
has, err = models.HasAccess(authUser, repo, models.ACCESS_MODE_WRITE)
if err != nil || !has {
ctx.HandleText(401, "no basic auth and digit auth")
if err != nil {
ctx.Handle(500, "HasAccess2", err)
return
} else if !has {
ctx.HandleText(403, "User permission denied")
return
}
} else {
ctx.HandleText(401, "no basic auth and digit auth")
ctx.HandleText(403, "User permission denied")
return
}
}
if !isPull && repo.IsMirror {
ctx.HandleText(401, "mirror repository is read-only")
ctx.HandleText(403, "mirror repository is read-only")
return
}
}

Some files were not shown because too many files have changed in this diff Show More