Compare commits

..

86 Commits

Author SHA1 Message Date
jasder c9c2aac882 Merge pull request '修改branch_tag_count接口' (#33) from wonderful/gitea-1120-rc1:fix_pulls into develop 2021-10-26 11:53:09 +08:00
hang e19cd0998e fix:branch_tag_count 2021-10-26 11:41:25 +08:00
jasder 987ac773f6 Merge pull request '新增/{repo}/branch_tag_count接口' (#32) from wonderful/gitea-1120-rc1:fix_pulls into develop 2021-10-14 11:39:40 +08:00
hang 52d9414a29 fix:branch_tag_count 2021-10-14 11:37:54 +08:00
hang 6576006a78 add a new branchTagCount 2021-10-14 11:10:03 +08:00
jasder e9a6a54229 Merge pull request '在pulls/{index}接口添加字段' (#31) from wonderful/gitea-1120-rc1:fix_pulls into develop 2021-10-13 15:13:07 +08:00
hang a6ac790d1a fix pulls/{index} 2021-10-13 10:27:46 +08:00
yystopf de0f7764c7 fix merge from hh_file_commits 2021-10-08 14:26:21 +08:00
yystopf 15882844c6 add: tags list page info 2021-09-30 16:09:11 +08:00
yystopf d78a760be7 Merge pull request '返回commit 的branch' (#28) from wonderful/gitea-1120-rc1:develop_m into develop 2021-09-29 15:29:48 +08:00
hang 06dd55c49f add commit's branch 2021-09-29 15:22:06 +08:00
yystopf 9ee3486d44 add: commit detail branch 2021-09-29 10:31:09 +08:00
yystopf 52232e2431 发行版增加提交id字段输出 2021-09-27 16:54:42 +08:00
yystopf c37047eeaf add: release list sha 2021-09-27 16:51:08 +08:00
jasder bfbd16b7df Merge pull request '项目标签增加提交和打标签的信息' (#26) from yystopf/gitea-1120-rc1:hh_tag_addition into develop 2021-09-24 17:54:20 +08:00
yystopf b82b5bf80b add: add tag message 2021-09-24 17:49:54 +08:00
yystopf 796c78996b add: commits by file 2021-09-23 16:36:12 +08:00
jasder 705694ff88 Merge pull request '对tags接口修改' (#25) from wonderful/gitea-1120-rc1:develop_w into develop 2021-09-23 15:56:43 +08:00
hang 6270454d59 fix:tags 2021-09-23 15:48:36 +08:00
jasder 04f3e061cb Merge pull request '添加tags/releases接口' (#24) from wonderful/gitea-1120-rc1:develop_w into develop 2021-09-23 10:48:38 +08:00
hang 8f47d8df52 add:tags/releases 2021-09-23 10:36:59 +08:00
jasder dfc39ebda0 Merge pull request '添加 reamde/{dir}接口' (#23) from wonderful/gitea-1120-rc1:develop_w into develop 2021-09-23 10:30:42 +08:00
hang ad3ccfb22f add:readme dir 2021-09-23 10:25:02 +08:00
jasder 4e0a133712 Merge pull request '仓库获取文件添加分支、commit、tag参数' (#20) from yystopf/gitea-1120-rc1:hh_raw_delay into develop 2021-09-10 11:37:47 +08:00
yystopf 9f80111504 fix: get file need ref to select 2021-09-10 11:26:49 +08:00
jasder 20c13e8352 Merge pull request '添加branches分组接口' (#19) from wonderful/gitea-1120-rc1:develop into develop 2021-09-07 14:04:11 +08:00
wonderful 71df4fdfa1 add:grouping the branches and sort by time 2021-09-07 12:06:31 +08:00
jasder 20e2cb271e Merge pull request '根据时间排序commits并分组' (#18) from wonderful/gitea-1120-rc1:develop into develop 2021-09-07 12:00:56 +08:00
wonderful fdfe572500 add:sort the branches by time 2021-09-07 11:30:02 +08:00
yystopf 86fb4bb8d8 fix: edit wiki name not exsit error 2021-08-20 14:56:49 +08:00
yystopf 0c897c660f fix: create or update exsit name error 2021-08-19 22:20:48 +08:00
yystopf 2b54b5c39a wiki相关功能以及接口 2021-08-19 18:05:04 +08:00
yystopf 9d53ff793b fix:merge from wmh_develop 2021-08-19 18:02:04 +08:00
wonderful 3072fc7e4e fix:first wikies 2021-08-19 17:44:25 +08:00
wonderful b228c9f602 fix: 2021-08-19 14:38:07 +08:00
yystopf f13f296790 add: get first and last commit by path 2021-08-19 14:25:37 +08:00
wonderful 64ef5a1567 wikies 2021-08-18 18:53:11 +08:00
wonderful b8599a9fa2 fix 2021-08-18 13:29:44 +08:00
wonderful fd05b7938e fix 2021-08-18 13:16:28 +08:00
wonderful 89eb38f44c fix:wikit 2021-08-18 12:57:31 +08:00
wonderful 5decf76ec3 fix:wiki 2021-08-18 09:58:50 +08:00
wonderful 925a7b18cb fix:wiki 2021-08-18 08:11:25 +08:00
wonderful 6f2fdf1159 fix:wiki 2021-08-17 23:49:14 +08:00
wonderful 98122e3cb6 fix:wiki 2021-08-17 18:32:17 +08:00
wonderful fd02b7beb9 fix:wiki 2021-08-17 17:50:39 +08:00
wonderful 10e2b49064 fix:wikies 2021-08-17 14:45:45 +08:00
wonderful 554fd29ebb fix:wikies 2021-08-17 11:41:26 +08:00
wonderful e6c3986962 fix:wiki 2021-08-16 17:43:59 +08:00
wonderful ad679b575e fix:wiki 2021-08-16 16:12:20 +08:00
wonderful e26a306415 fix:delete wiki 2021-08-16 15:14:55 +08:00
wonderful c2392616b5 fix:filename 2021-08-16 13:49:18 +08:00
wonderful 0e9fd60786 fix:wiki 2021-08-15 17:38:12 +08:00
wonderful 7e486f8038 fix:wiki content 2021-08-15 13:58:27 +08:00
wonderful 3e792b0c0f add:WContent 2021-08-13 17:39:58 +08:00
wonderful 6b34e16a7c fix:add htmlcontent 2021-08-13 17:14:18 +08:00
wonderful d3f8e67e57 fix:wikies 2021-08-13 13:57:02 +08:00
wonderful 2d5a3202bd fix: add wiki_clone_link 2021-08-12 18:18:16 +08:00
wonderful 7a98e1ad9a add wikies repository 2021-08-12 09:51:29 +08:00
yystopf 94d7873f11 Merge branch 'develop' of https://git.trustie.net/jasder/gitea-1120-rc1 into develop 2021-08-09 15:05:34 +08:00
yystopf a22ccad9f9 repository wikies modules 2021-08-09 15:05:15 +08:00
wonderful 23f2dc9c23 fix modules/wikies/wiki.go /api/v1/repo/wiki.go 2021-08-09 14:38:48 +08:00
yystopf d9495f6822 fix: api use restful and back data example 2021-08-06 16:58:04 +08:00
yystopf 30537e038a Merge branch 'develop' of https://git.trustie.net/jasder/gitea-1120-rc1 into develop 2021-08-06 09:53:05 +08:00
wonderful ca7dad0ebc fix wiki.go api.go content.go 2021-08-05 17:35:03 +08:00
wonderful 8033fc6a45 fix repo.go 2021-08-05 17:20:53 +08:00
wonderful 757a3816f7 new wiki.go content.go, fix api.go 2021-08-05 16:53:03 +08:00
wonderful dbd0b2661e add wiki.go content.go fix, api.go repo.go 2021-08-05 16:35:04 +08:00
viletyy 611e58f5ae Merge branch 'hh_develop' into develop 2021-08-05 16:28:52 +08:00
viletyy 3b5dff2e23 Merge branch 'wmh_develop' of https://git.trustie.net/jasder/gitea-1120-rc1 into wmh_develop 2021-07-28 21:46:29 +08:00
wonderful aa27fd6457 HookTasks list 2021-07-28 19:32:33 +08:00
wonderful ac62431593 HookTasks list 2021-07-28 18:42:39 +08:00
viletyy 2a73cddad1 Merge branch 'hh_develop' into develop 2021-07-28 18:17:33 +08:00
viletyy fa35eaab21 fix 2021-07-28 18:17:13 +08:00
viletyy 8e64f038ac fix: webhook change secret\branch_filter\eventtype 2021-07-28 17:31:39 +08:00
yystopf 1014b45ec1 webhook的http_method和branch_filter字段返回 2021-07-27 18:34:45 +08:00
viletyy 6050736a0b fix: remove http_method to config 2021-07-27 18:19:07 +08:00
viletyy 8609403fe9 fix: remove repo edit from file 2021-07-27 17:31:43 +08:00
yystopf 747b6205e2 修改webhook API的返回参数
- http_method
- branch_filter
2021-07-27 17:29:33 +08:00
wonderful 9c568c2a59 fix: utils/hook webhook 2021-07-27 17:12:38 +08:00
viletyy 6dd4ff2c87 Merge branch 'develop' of https://git.trustie.net/jasder/gitea-1120-rc1 into develop 2021-07-09 11:08:23 +08:00
viletyy 4674286786 fix: repo submodule is nil 2021-07-09 11:08:17 +08:00
yystopf a3f760ac2d API:用户贡献度支持时间筛选 2021-06-04 18:56:58 +08:00
vilet.yy ff366f6c6a fix: include timestamp critical value 2021-06-02 15:05:24 +08:00
vilet.yy b8fd0c3f98 add: user headmap timestamp range 2021-05-26 14:14:09 +08:00
vilet.yy 90f228fd3e fix: start project 2021-05-26 10:10:31 +08:00
vilet.yy 0792049f59 fix: change passwordcomplex default 2021-04-23 15:50:46 +08:00
74 changed files with 56166 additions and 488 deletions

79
conf/locale/TRANSLATORS Normal file
View File

@ -0,0 +1,79 @@
# This file lists all PUBLIC individuals having contributed content to the translation.
# Entries are in alphabetical order.
Adam Jurkiewicz <a DOT jurkiewicz5 AT gmail DOT com>
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>
Anderi Azuki <k1nzy AT outlook 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>
Antonio Briola <briolantonio AT gmail DOT com>
Arthur Aslanyan <arthur DOT e DOT aslanyan AT gmail DOT com>
Aurelien Darragon <aurelien DOT darragon AT gmail DOT com>
Barış Arda Yılmaz <ardayilmazgamer AT gmail DOT com>
bugreport0
Camille Baronnet <gogs AT camillebaronnet DOT fr>
Christoph Kisfeld <christoph DOT kisfeld AT gmail DOT com>
Cysioland
Damaris Padieu <damizx AT hotmail DOT fr>
Daniel Speichert <daniel AT speichert DOT pl>
David Yzaguirre <dvdyzag AT gmail DOT com>
Dmitriy Nogay <me AT catwhocode DOT ga>
Emanuel Angelo <emanuel DOT angelo AT gmail DOT com>
Enrico Testori hypertesto AT gmail DOT com
Ezequiel Gonzalez Rial <gonrial AT gmail DOT com>
Gabriel Dugny <gabriel DOT dugny AT gmail DOT com>
Gregor Santner <gdev AT live DOT de>
Guilhem Marion <gmarion AT netc DOT fr>
Halil Kaya <halil AT halilkaya DOT net>
Hamid Feizabadi <hamidfzm AT gmail DOT com>
Hilton Wichwski Silva <hilton AT hiltonws DOT com DOT br>
Huimin Wang <wanghm2009 AT hotmail DOT co DOT jp>
ilko <kontact-mr DOT k AT outlook DOT com>
Ilya Makarov
Jamie Mansfield <dev AT jamierocks DOT uk>
Jean THOMAS <contact AT tibounise DOT com>
Joan Sánchez <dev AT discusal DOT com>
Joel da Rosa <webjoel AT hotmail DOT com>
Joubert RedRat <me+github AT redrat DOT com DOT br>
Jonathan Lozada De La Matta <jlozada2426 AT protonmail DOT com>
Juraj Bubniak <contact AT jbub DOT eu>
Kazuki Sawada <kazuki AT 6715 DOT jp>
Lafriks <lafriks AT gmail DOT com>
Lauri Ojansivu <x AT xet7 DOT org>
Luc Stepniewski <luc AT stepniewski DOT fr>
Luca Bozzo <luca AT bozzo DOT it>
Luca Kröger <l DOT kroeger01 AT gmail DOT com>
Marc Schiller <marc AT schiller DOT im>
Marvin Menzerath <github AT marvin-menzerath DOT de>
Michael Härtl <haertl DOT mike AT gmail DOT com>
Miguel de la Cruz <miguel AT mcrx DOT me>
Mikhail Burdin <xdshot9000 AT gmail DOT com>
Morten Sørensen <klim8d AT gmail DOT com>
Muhammad Fawwaz Orabi <mfawwaz93 AT gmail DOT com>
Nakao Takamasa <at.mattenn AT gmail DOT com>
Natan Albuquerque <natanalbuquerque5 AT gmail DOT com>
Niclas Kroon <niclas DOT kroon AT gmail DOT com>
Odilon Junior <odilon DOT junior93 AT gmail DOT com>
Pablo Saavedra <psaavedra AT igalia DOT com>
Piotr Orzechowski <piotr AT orzechowski DOT tech>
Richard Bukovansky <richard DOT bukovansky AT gmail DOT com>
Robert Nuske <robert DOT nuske AT web DOT de>
Robin Hübner <profan AT prfn DOT se>
SeongJae Park <sj38 DOT park AT gmail DOT com>
Thiago Avelino <thiago AT avelino DOT xxx>
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>
Viktor Sperl <viktike32 AT gmail DOT com>
Vladimir Jigulin mogaika AT yandex DOT ru
Vladimir Vissoultchev <wqweto AT gmail DOT com>
Yaşar Çiv <yasarciv67 AT gmail DOT com>
YJSoft <yjsoft AT yjsoft DOT pe DOT kr>
Łukasz Jan Niemier <lukasz AT niemier DOT pl>

1290
conf/locale/locale_bg-BG.ini Normal file

File diff suppressed because it is too large Load Diff

2376
conf/locale/locale_cs-CZ.ini Normal file

File diff suppressed because it is too large Load Diff

2388
conf/locale/locale_de-DE.ini Normal file

File diff suppressed because it is too large Load Diff

2388
conf/locale/locale_en-US.ini Normal file

File diff suppressed because it is too large Load Diff

2385
conf/locale/locale_es-ES.ini Normal file

File diff suppressed because it is too large Load Diff

2121
conf/locale/locale_fa-IR.ini Normal file

File diff suppressed because it is too large Load Diff

1351
conf/locale/locale_fi-FI.ini Normal file

File diff suppressed because it is too large Load Diff

2329
conf/locale/locale_fr-FR.ini Normal file

File diff suppressed because it is too large Load Diff

1776
conf/locale/locale_hu-HU.ini Normal file

File diff suppressed because it is too large Load Diff

1440
conf/locale/locale_id-ID.ini Normal file

File diff suppressed because it is too large Load Diff

2263
conf/locale/locale_it-IT.ini Normal file

File diff suppressed because it is too large Load Diff

2388
conf/locale/locale_ja-JP.ini Normal file

File diff suppressed because it is too large Load Diff

1631
conf/locale/locale_ko-KR.ini Normal file

File diff suppressed because it is too large Load Diff

2383
conf/locale/locale_lv-LV.ini Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,816 @@
home=പൂമുഖം
dashboard=ഡാഷ്ബോർഡ്
explore=കണ്ടെത്തൂ
help=സഹായം
sign_in=പ്രവേശിക്കുക
sign_in_with=ഉപയോഗിച്ചു് പ്രവേശിയ്ക്കുക
sign_out=പുറത്തുകടക്കുക
sign_up=രജിസ്റ്റർ
link_account=അക്കൌണ്ട് ബന്ധിപ്പിയ്ക്കുക
register=രജിസ്റ്റർ
website=വെബ് സൈറ്റ്
version=പതിപ്പ്
page=പേജ്
template=ടെംപ്ലേറ്റ്
language=ഭാഷ
notifications=അറിയിപ്പുകൾ
create_new=സൃഷ്ടിക്കുക…
user_profile_and_more=പ്രൊഫൈലും ക്രമീകരണങ്ങളും…
signed_in_as=ഇയാളായി പ്രവേശിയ്ക്കുക
enable_javascript=ഈ വെബ്‌സൈറ്റ് ജാവാസ്ക്രിപ്റ്റിനൊപ്പം മികച്ച രീതിയിൽ പ്രവർത്തിക്കുന്നു.
username=ഉപയോക്ത്രു നാമം
email=ഈമെയില്‍ വിലാസം
password=രഹസ്യവാക്കു്
re_type=രഹസ്യവാക്കു് വീണ്ടും നല്‍കുക
captcha=ക്യാപ്ച
twofa=ഇരട്ട ഘടക പ്രാമാണീകരണം
twofa_scratch=ഇരട്ട ഫാക്ടർ സ്ക്രാച്ച് കോഡ്
passcode=രഹസ്യ കോഡ്
u2f_insert_key=സെക്യൂരിറ്റി കീ ഇന്‍സേര്‍ട്ടു് ചെയ്യുക
u2f_sign_in=സെക്യൂരിറ്റി കീയിലെ ബട്ടണ്‍ അമര്‍ത്തുക. സെക്യൂരിറ്റി കീയില്‍ ബട്ടണൊന്നും ഇല്ലെങ്കില്‍ വീണ്ടും ഇന്‍സേര്‍ട്ടു് ചെയ്യുക.
u2f_press_button=ദയവായി സെക്യൂരിറ്റി കീയിലെ ബട്ടണ്‍ അമര്‍ത്തൂ…
u2f_use_twofa=നിങ്ങളുടെ ഫോണിൽ നിന്നുള്ള ഇരട്ട-ഘടക കോഡ് ഉപയോഗിക്കുക
u2f_error=സെക്യൂരിറ്റി കീ വായിയ്ക്കാനാകുന്നില്ല.
u2f_unsupported_browser=നീങ്ങളുടെ ബ്രൗസര്‍ ഇരട്ട ഘടക സെക്യൂരിറ്റി പിന്തുണയ്ക്കുന്നില്ല.
u2f_error_1=ഒരു അവിചാരിതമായ പിശക് സംഭവിച്ചു. ദയവായി വീണ്ടും ശ്രമിക്കുക.
u2f_error_2=നിങ്ങള്‍ ഉപയോഗിക്കുന്നത് ശരിയായ, എൻ‌ക്രിപ്റ്റ് ചെയ്ത (https://) യുആർഎൽ ആണെന്നു ദയവായി ഉറപ്പാക്കുക.
u2f_error_3=നിങ്ങളുടെ അഭ്യർത്ഥന പ്രോസസ്സ് ചെയ്യാൻ സെർവറിന് കഴിഞ്ഞില്ല.
u2f_error_4=ഈ അഭ്യർത്ഥന പൂര്‍ത്തിയാക്കാന്‍ സുരക്ഷാ കീ അനുവദനിയ്ക്കുന്നില്ല. ഈ കീ ഇതിനോടകം രജിസ്റ്റർ ചെയ്തിട്ടില്ലെന്ന് ഉറപ്പു വരുത്തുക.
u2f_error_5=നിങ്ങളുടെ കീ വായിക്കുന്നതിന് പൂര്‍ത്തിയാക്കാനായില്ല. ദയവായി ഈ പേജ് പുതുക്കി വീണ്ടും ശ്രമിക്കുക.
u2f_reload=പുതുക്കുക
repository=കലവറ
organization=സംഘടന
mirror=മിറര്‍
new_repo=പുതിയ കലവറ
new_migrate=പുതിയ കുടിയേറ്റിപ്പാര്‍പ്പിക്കല്‍
new_mirror=പുതിയ മിറര്‍
new_fork=കലവറയുടെ പുതിയ ശിഖരം
new_org=പുതിയ സംഘടന
manage_org=സംഘടനകളെ നിയന്ത്രിക്കുക
admin_panel=സൈറ്റിന്റെ കാര്യനിര്‍വ്വാഹണം
account_settings=അക്കൌണ്ട് ക്രമീകരണങള്‍
settings=ക്രമീകരണങ്ങള്‍
your_profile=പ്രൊഫൈൽ
your_starred=നക്ഷത്ര ചിഹ്നമിട്ടവ
your_settings=ക്രമീകരണങ്ങള്‍
all=എല്ലാം
sources=ഉറവിടങ്ങൾ
mirrors=മിററുകള്‍
collaborative=സഹകരിക്കുന്ന
forks=ശാഖകള്‍
activities=പ്രവര്‍ത്തനങ്ങള്‍
pull_requests=ലയന അഭ്യർത്ഥനകൾ
issues=പ്രശ്നങ്ങൾ
cancel=റദ്ദാക്കുക
write=എഴുതുക
preview=തിരനോട്ടം
loading=ലഭ്യമാക്കുന്നു…
[error]
[startpage]
[install]
install=സന്നിവേശിപ്പിയ്ക്കുക
title=പ്രാരംഭ ക്രമീകരണങ്ങള്‍
docker_helper=ഡോക്കറിനുള്ളിലാണ് ഗിറ്റീ പ്രവര്‍ത്തിപ്പിയ്ക്കുന്നതെങ്കില്‍, മാറ്റങ്ങള്‍ വരുത്തുന്നതിനു മുമ്പു് ദയവായി <a target="_blank" rel="noopener noreferrer" href="%s">ഡോക്യുമെന്റേഷൻ</a> വായിയ്ക്കുക.
requite_db_desc=ഗിറ്റീയ്ക്കു് MySQL, PostgreSQL, MSSQL അല്ലെങ്കിൽ SQLite3 ആവശ്യമാണ്.
db_title=ഡാറ്റാബേസ് ക്രമീകരണങ്ങൾ
db_type=ഡാറ്റാബേസിന്റെ തരം
host=ഹോസ്റ്റ്
user=ഉപയോക്ത്രു നാമം
password=രഹസ്യവാക്കു്
db_name=ഡാറ്റാബേസിന്റെ പേര്
db_helper=MySQL ഉപയോക്താക്കൾക്കുള്ള കുറിപ്പ്: ദയവായി InnoDB സ്റ്റോറേജ് എഞ്ചിൻ ഉപയോഗിക്കുക. നിങ്ങൾ "utf8mb4" ഉപയോഗിക്കുകയാണെങ്കിൽ, InnoDB പതിപ്പ് 5.6 നേക്കാൾ വലുതായിരിക്കണം.
ssl_mode=SSL
charset=ക്യാര്‍സെറ്റ്
path=പാത
sqlite_helper=SQLite3 ഡാറ്റാബേസിന്റെ ഫയല്‍ പാത്ത്.<br>നിങ്ങൾ ഗിറ്റീയെ ഒരു സേവനമായി പ്രവർത്തിപ്പിക്കുകയാണെങ്കിൽ സമ്പൂര്‍ണ്ണ ഫയല്‍ പാത നൽകുക.
err_empty_db_path=SQLite3 ഡാറ്റാബേസ് പാത്ത് ശൂന്യമായിരിക്കരുത്.
no_admin_and_disable_registration=ഒരു അഡ്മിനിസ്ട്രേറ്റർ അക്കൌണ്ട് സൃഷ്ടിക്കാതെ നിങ്ങൾക്ക് ഉപയോക്തൃ സ്വയം രജിസ്ട്രേഷൻ അപ്രാപ്തമാക്കാൻ കഴിയില്ല.
err_empty_admin_password=അഡ്മിനിസ്ട്രേറ്ററുടെ രഹസ്യവാക്കു് ശൂന്യമായിരിക്കരുത്.
err_empty_admin_email=അഡ്മിനിസ്ട്രേറ്ററുടെ ഇമെയില്‍ വിലാസം ശൂന്യമായിരിക്കരുത്.
err_admin_name_is_reserved=അഡ്മിനിസ്ട്രേറ്റര്‍ ഉപയോക്തൃനാമം അസാധുവാണ്, ഉപയോക്തൃനാമം റിസര്‍വ്വ് ചെയ്തതാണ്
err_admin_name_is_invalid=അഡ്മിനിസ്ട്രേറ്റർ ഉപയോക്തൃനാമം അസാധുവാണ്
general_title=പൊതുവായ ക്രമീകരണങ്ങൾ
app_name=സൈറ്റ് ശീർഷകം
app_name_helper=നിങ്ങളുടെ കമ്പനിയുടെ പേര് ഇവിടെ നൽകാം.
repo_path=സംഭരണിയുടെ റൂട്ട് പാത്ത്
repo_path_helper=വിദൂര ഗിറ്റു് സംഭരണികള്‍ ഈ ഡയറക്ടറിയിലേക്ക് സംരക്ഷിക്കും.
lfs_path=Git LFS റൂട്ട് പാത്ത്
lfs_path_helper=Git LFS ട്രാക്കുചെയ്ത ഫയലുകൾ ഈ ഡയറക്ടറിയിൽ സൂക്ഷിക്കും. പ്രവർത്തനരഹിതമാക്കാൻ ഈ കളം ശൂന്യമായി വിടുക.
run_user=ഉപയോക്താവായി പ്രവര്‍ത്തിപ്പിക്കുക
run_user_helper=ഗിറ്റീ പ്രവർത്തിക്കുന്ന ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന്റെ ഉപയോക്തൃനാമം നല്കുക. ഈ ഉപയോക്താവിന് സംഭരണിയുടെ റൂട്ട് പാത്തിലേക്ക് പ്രവേശനം ഉണ്ടായിരിക്കണം.
domain=SSH സെർവർ ഡൊമെയ്ൻ
domain_helper=SSH ക്ലോൺ URL- കൾക്കായുള്ള ഡൊമെയ്ൻ അല്ലെങ്കിൽ ഹോസ്റ്റ് വിലാസം.
ssh_port=SSH സെർവർ പോര്‍ട്ട്
ssh_port_helper=നിങ്ങളുടെ SSH സെർവർ ശ്രവിക്കുന്ന പോർട്ട് നമ്പർ നല്‍കുക. പ്രവർത്തനരഹിതമാക്കാൻ കളം ശൂന്യമായി വിടുക.
http_port=ഗിറ്റീ എച്ച്ടിടിപി ശ്രവിയ്ക്കുന്ന പോർട്ട്
http_port_helper=ഗിറ്റീ വെബ് സെർവർ ശ്രവിയ്ക്കുന്ന പോർട്ട് നമ്പർ.
app_url=ഗിറ്റീയുടെ അടിസ്ഥാന വിലാസം
app_url_helper=എച്ച്ടിടിപി(എസ്) ക്ലോണുകള്‍ക്കും ഇമെയിൽ അറിയിപ്പുകൾക്കുമായുള്ള അടിസ്ഥാന വിലാസം.
log_root_path=ലോഗ് പാത്ത്
log_root_path_helper=ലോഗ് ഫയലുകൾ ഈ ഡയറക്ടറിയിലേക്ക് എഴുതപ്പെടും.
optional_title=ഐച്ഛികമായ ക്രമീകരണങ്ങൾ
email_title=ഇമെയിൽ ക്രമീകരണങ്ങൾ
smtp_host=SMTP ഹോസ്റ്റ്
smtp_from=ഈ വിലാസത്തില്‍ ഇമെയിൽ അയയ്‌ക്കുക
smtp_from_helper=ഗിറ്റീ ഉപയോഗിയ്ക്കുന്ന ഇമെയില്‍ വിലാസം. ഒരു സാധാ ഇമെയിൽ വിലാസം നൽകുക അല്ലെങ്കിൽ "പേര്"<email@example.com> എന്ന ഘടന ഉപയോഗിക്കുക.
mailer_user=SMTP ഉപയോക്തൃനാമം
mailer_password=SMTP രഹസ്യവാക്കു്
register_confirm=രജിസ്റ്റർ ചെയ്യുന്നതിന് ഇമെയിൽ സ്ഥിരീകരണം ആവശ്യമാക്കുക
mail_notify=ഇമെയിൽ അറിയിപ്പുകൾ പ്രാപ്തമാക്കുക
server_service_title=സെർവറിന്റെയും മൂന്നാം കക്ഷി സേവനങ്ങളുടെയും ക്രമീകരണങ്ങള്‍
offline_mode=പ്രാദേശിക മോഡ് പ്രവർത്തനക്ഷമമാക്കുക
offline_mode_popup=മൂന്നാം കക്ഷി ഉള്ളടക്ക ഡെലിവറി നെറ്റ്‌വർക്കുകൾ അപ്രാപ്‌തമാക്കി എല്ലാ വിഭവങ്ങളും പ്രാദേശികമായി നല്‍കുക.
disable_gravatar=ഗ്രവതാര്‍ പ്രവർത്തനരഹിതമാക്കുക
disable_gravatar_popup=ഗ്രവതാര്‍ അല്ലെങ്കില്‍ മൂന്നാം കക്ഷി അവതാർ ഉറവിടങ്ങൾ പ്രവർത്തനരഹിതമാക്കുക. ഒരു ഉപയോക്താവ് പ്രാദേശികമായി ഒരു അവതാർ അപ്‌ലോഡുചെയ്യുന്നില്ലെങ്കിൽ സ്ഥിരസ്ഥിതി അവതാർ ഉപയോഗിക്കും.
federated_avatar_lookup=കേന്ദ്രീകൃത അവതാര്‍ പ്രാപ്തമാക്കുക
federated_avatar_lookup_popup=ലിബ്രാവതാർ ഉപയോഗിച്ച് കേന്ദ്രീക്രത അവതാർ തിരയൽ പ്രാപ്തമാക്കുക.
disable_registration=സ്വയം രജിസ്ട്രേഷൻ അപ്രാപ്തമാക്കുക
disable_registration_popup=ഉപയോക്താക്കള്‍ സ്വയം രജിസ്റ്റര്‍ ചെയ്യുന്നതു അപ്രാപ്യമാക്കുക. അഡ്മിനിസ്ട്രേറ്റർമാർക്ക് മാത്രമേ പുതിയ ഉപയോക്തൃ അക്കൌണ്ടുകൾ സൃഷ്ടിക്കാന്‍ കഴിയൂ.
allow_only_external_registration_popup=ബാഹ്യ സേവനങ്ങളിലൂടെ മാത്രം രജിസ്ട്രേഷന്‍ അനുവദിക്കുക
openid_signin=OpenID പ്രവേശനം പ്രവർത്തനക്ഷമമാക്കുക
openid_signin_popup=OpenID വഴി ഉപയോക്തൃ പ്രവേശനം പ്രാപ്തമാക്കുക.
openid_signup=OpenID സ്വയം രജിസ്ട്രേഷൻ പ്രാപ്തമാക്കുക
openid_signup_popup=OpenID അടിസ്ഥാനമാക്കിയുള്ള ഉപയോക്തൃ സ്വയം രജിസ്ട്രേഷൻ പ്രാപ്തമാക്കുക.
enable_captcha_popup=ഉപയോക്താക്കള്‍ സ്വയം രജിസ്ട്രേഷന്‍ ചെയ്യുന്നതിനു് ഒരു ക്യാപ്ച ആവശ്യമാണ്.
require_sign_in_view=പേജുകൾ കാണുന്നതിന് സൈറ്റില്‍ പ്രവേശിക്കണം
require_sign_in_view_popup=പേജ് ആക്‌സസ്സ്, പ്രവേശിച്ച ഉപയോക്താക്കൾക്കുമാത്രമായി പരിമിതപ്പെടുത്തുക. സന്ദർശകർ 'പ്രവേശനം', രജിസ്ട്രേഷൻ പേജുകൾ എന്നിവ മാത്രമേ കാണൂ.
admin_setting_desc=ഒരു അഡ്മിനിസ്ട്രേറ്റര്‍ അക്കൗണ്ട് സൃഷ്ടിക്കുന്നത് ഐച്ഛികമാണ്. ആദ്യം രജിസ്റ്റര്‍ ചെയ്ത ഉപയോക്താവ് യാന്ത്രികമായി ഒരു അഡ്മിനിസ്ട്രേറ്ററായി മാറും.
admin_title=അഡ്മിനിസ്ട്രേറ്റര്‍ അക്കൗണ്ട് ക്രമീകരണങ്ങൾ
admin_name=അഡ്മിനിസ്ട്രേറ്ററുടെ ഉപയോക്തൃനാമം
admin_password=രഹസ്യവാക്കു്
confirm_password=രഹസ്യവാക്കു് സ്ഥിരീകരിക്കുക
admin_email=ഇ-മെയില്‍ വിലാസം
install_btn_confirm=ഗിറ്റീ സന്നിവേശിപ്പിയ്ക്കുക
test_git_failed='git' കമാന്‍ഡ് പരീക്ഷിക്കാന്‍ കഴിഞ്ഞില്ല: %v
sqlite3_not_available=ഗിറ്റീയുടെ ഈ വേര്‍ഷന്‍ SQLite3യെ പിന്തുണക്കുന്നില്ല. %s ൽ നിന്നും ഔദ്യോഗിക ബൈനറി പതിപ്പ് ഡൌണ്‍‌ലോഡ് ചെയ്യുക ('gobuild' പതിപ്പല്ല).
invalid_db_setting=ഡാറ്റാബേസ് ക്രമീകരണങ്ങൾ അസാധുവാണ്: %v
invalid_repo_path=കലവറയുടെ റൂട്ട് പാത്ത് അസാധുവാണ്: %v
run_user_not_match='റൺ ആസ്' ഉപയോക്തൃനാമം നിലവിലെ ഉപയോക്തൃനാമമല്ല: %s -> %s
save_config_failed=കോൺഫിഗറേഷൻ സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു: %v
invalid_admin_setting=അഡ്മിനിസ്ട്രേറ്റര്‍ അക്കൌണ്ട് ക്രമീകരണം അസാധുവാണ്: %v
install_success=സ്വാഗതം! ഗിറ്റീ തിരഞ്ഞെടുത്തതിന് നന്ദി. സൂക്ഷിക്കുക, ആസ്വദിക്കൂ,!
invalid_log_root_path=ലോഗ് പാത്ത് അസാധുവാണ്: %v
default_keep_email_private=സ്ഥിരസ്ഥിതിയായി ഇമെയില്‍ വിലാസങ്ങള്‍ മറയ്‌ക്കുക
default_keep_email_private_popup=സ്ഥിരസ്ഥിതിയായി പുതിയ ഉപയോക്തൃ അക്കൗണ്ടുകളുടെ ഇമെയില്‍ വിലാസങ്ങള്‍ മറയ്ക്കുക.
default_allow_create_organization=സ്ഥിരസ്ഥിതിയായി സംഘടനകള്‍ സൃഷ്ടിക്കാന്‍ അനുവദിക്കുക
default_allow_create_organization_popup=സ്ഥിരസ്ഥിതിയായി സംഘടനകള്‍ സൃഷ്ടിക്കാന്‍ പുതിയ ഉപയോക്തൃ അക്കൗണ്ടുകളെ അനുവദിക്കുക.
default_enable_timetracking=സ്ഥിരസ്ഥിതിയായി സമയം ട്രാക്കു് ചെയ്യുന്നതു പ്രാപ്തമാക്കുക
default_enable_timetracking_popup=സ്ഥിരസ്ഥിതിയായി പുതിയ കലവറകള്‍ക്കു് സമയം ട്രാക്കു് ചെയ്യുന്നതു് പ്രാപ്തമാക്കുക.
no_reply_address=മറച്ച ഇമെയിൽ ഡൊമെയ്ൻ
no_reply_address_helper=മറഞ്ഞിരിക്കുന്ന ഇമെയിൽ വിലാസമുള്ള ഉപയോക്താക്കൾക്കുള്ള ഡൊമെയ്ൻ നാമം. ഉദാഹരണത്തിന്, മറഞ്ഞിരിക്കുന്ന ഇമെയിൽ ഡൊമെയ്ൻ 'noreply.example.org' ആയി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ 'joe' എന്ന ഉപയോക്താവു് 'joe@noreply.example.org' ആയി ലോഗിൻ ചെയ്യും.
[home]
uname_holder=ഉപയോക്തൃനാമമോ ഇമെയിൽ വിലാസമോ
password_holder=രഹസ്യവാക്കു്
switch_dashboard_context=ഡാഷ്‌ബോർഡ് സന്ദർഭം മാറ്റുക
my_repos=കലവറകള്‍
show_more_repos=കൂടുതൽ കലവറകള്‍ കാണിക്കുക…
collaborative_repos=സഹകരിക്കാവുന്ന കലവറകള്‍
my_orgs=എന്റെ സംഘടനകള്‍
my_mirrors=എന്റെ മിററുകള്‍
view_home=%s കാണുക
search_repos=ഒരു കലവറ കണ്ടെത്തുക…
issues.in_your_repos=നിങ്ങളുടെ കലവറകളില്‍
[explore]
repos=കലവറകള്‍
users=ഉപയോക്താക്കള്‍
organizations=സംഘടനകള്‍
search=തിരയുക
code=കോഡ്
repo_no_results=പൊരുത്തപ്പെടുന്ന കലവറകളൊന്നും കണ്ടെത്താനായില്ല.
user_no_results=പൊരുത്തപ്പെടുന്ന ഉപയോക്താക്കളെയൊന്നും കണ്ടെത്താനായില്ല.
org_no_results=പൊരുത്തപ്പെടുന്ന സംഘടനകളൊന്നും കണ്ടെത്താനായില്ല.
code_no_results=നിങ്ങളുടെ തിരയൽ പദവുമായി പൊരുത്തപ്പെടുന്ന സോഴ്സ് കോഡുകളൊന്നും കണ്ടെത്താനായില്ല.
code_search_results=%s എന്നതിനായുള്ള തിരയൽ ഫലങ്ങൾ
[auth]
create_new_account=അക്കൗണ്ട് രജിസ്റ്റർ ചെയ്യുക
register_helper_msg=ഇതിനകം ഒരു അക്കൗണ്ട് ഉണ്ടോ? ഇപ്പോൾ പ്രവേശിക്കുക!
social_register_helper_msg=ഇതിനകം ഒരു അക്കൗണ്ട് ഉണ്ടോ? ഇത് ഇപ്പോൾ ബന്ധിപ്പിയ്ക്കുക!
disable_register_prompt=രജിസ്ട്രേഷൻ അപ്രാപ്തമാക്കി. നിങ്ങളുടെ സൈറ്റ് അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.
disable_register_mail=രജിസ്ട്രേഷനായുള്ള ഇമെയിൽ സ്ഥിരീകരണം അപ്രാപ്തമാക്കി.
remember_me=ഓര്‍മ്മിയ്ക്കുക
forgot_password_title=അടയാളവാക്യം മറന്നുപോയോ
forgot_password=അടയാള വാക്ക് ഓർക്കുന്നില്ലേ?
sign_up_now=ഒരു അക്കൗണ്ട് ആവശ്യമുണ്ടോ? ഇപ്പോള്‍ രജിസ്റ്റര്‍ ചെയ്യുക.
sign_up_successful=അക്കൗണ്ട് വിജയകരമായി സൃഷ്ടിച്ചു.
confirmation_mail_sent_prompt=<b>%s</b> ലേക്ക് ഒരു പുതിയ സ്ഥിരീകരണ ഇമെയിൽ അയച്ചു. രജിസ്ട്രേഷൻ പ്രക്രിയ പൂർത്തിയാക്കുന്നതിന് അടുത്ത %s നുള്ളിൽ നിങ്ങളുടെ ഇൻ‌ബോക്സ് പരിശോധിക്കുക.
must_change_password=നിങ്ങളുടെ രഹസ്യവാക്കു് പുതുക്കുക
allow_password_change=രഹസ്യവാക്കു് മാറ്റാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടുക (ശുപാർശിതം)
reset_password_mail_sent_prompt=<b>%s</b> ലേക്ക് ഒരു പുതിയ സ്ഥിരീകരണ ഇമെയിൽ അയച്ചു. അക്കൗണ്ട് വീണ്ടെടുക്കൽ പ്രക്രിയ പൂർത്തിയാക്കുന്നതിന് അടുത്ത %s നുള്ളിൽ നിങ്ങളുടെ ഇൻ‌ബോക്സ് പരിശോധിക്കുക.
active_your_account=നിങ്ങളുടെ അക്കൗണ്ട് സജീവമാക്കുക
account_activated=നിങ്ങളുടെ അക്കൗണ്ട് സജീവമാക്കി
prohibit_login=പ്രവേശനം നിരോധിച്ചിരിക്കുന്നു
prohibit_login_desc=നിങ്ങളുടെ അക്കൗണ്ടിലേയ്ക്കുള്ള പ്രവേശനം നിരോധിച്ചിരിക്കുന്നു, ദയവായി നിങ്ങളുടെ സൈറ്റ് അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.
resent_limit_prompt=നിങ്ങൾ അടുത്തിടെ ഒരു സജീവമാക്കൽ ഇമെയിൽ അഭ്യർത്ഥിച്ചു. 3 മിനിറ്റ് കാത്തിരുന്ന് വീണ്ടും ശ്രമിക്കുക.
has_unconfirmed_mail=ഹായ് %s, നിങ്ങൾക്ക് സ്ഥിരീകരിക്കാത്ത ഇമെയിൽ വിലാസം (<b>%s</b>) ഉണ്ട്. നിങ്ങൾക്ക് ഒരു സ്ഥിരീകരണ ഇമെയിൽ ലഭിച്ചില്ലെങ്കിലോ പുതിയതൊന്ന് വീണ്ടും അയയ്‌ക്കേണ്ടതുണ്ടെങ്കിലോ, ചുവടെയുള്ള ബട്ടണിൽ ക്ലിക്കുചെയ്യുക.
resend_mail=നിങ്ങളുടെ സജീവമാക്കൽ ഇമെയിൽ വീണ്ടും അയയ്‌ക്കാൻ ഇവിടെ ക്ലിക്കുചെയ്യുക
email_not_associate=ഇമെയിൽ വിലാസം ഏതെങ്കിലും അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്തിയിട്ടില്ല.
send_reset_mail=അക്കൗണ്ട് വീണ്ടെടുക്കൽ ഇമെയിൽ അയയ്‌ക്കുക
reset_password=അക്കൗണ്ട് വീണ്ടെടുക്കൽ
invalid_code=നിങ്ങളുടെ സ്ഥിരീകരണ കോഡ് അസാധുവാണ് അല്ലെങ്കിൽ കാലഹരണപ്പെട്ടു.
reset_password_helper=അക്കൗണ്ട് വീണ്ടെടുക്കുക
reset_password_wrong_user=നിങ്ങൾ %s ആയി സൈൻ ഇൻ ചെയ്‌തു, പക്ഷേ അക്കൗണ്ട് വീണ്ടെടുക്കൽ ലിങ്ക് %s എന്നതിനാണ്
password_too_short=പാസ്‌വേഡ് ദൈർഘ്യം %d അക്ഷരങ്ങളിലും കുറവായിരിക്കരുത്.
non_local_account=പ്രാദേശിക ഇതര ഉപയോക്താക്കൾക്ക് ഗിറ്റീ വെബ് വഴി പാസ്‌വേഡ് പുതുക്കാന്‍ ചെയ്യാൻ കഴിയില്ല.
verify=പ്രമാണീകരിയ്ക്കുക
scratch_code=സ്ക്രാച്ച് കോഡ്
use_scratch_code=ഒരു സ്ക്രാച്ച് കോഡ് ഉപയോഗിക്കുക
twofa_scratch_used=നിങ്ങളുടെ സ്ക്രാച്ച് കോഡ് ഉപയോഗിച്ചു. നിങ്ങളെ രണ്ട്-ഘടക ക്രമീകരണ പേജിലേക്ക് റീഡയറക്‌ട് ചെയ്‌തിരിക്കുന്നതിനാൽ നിങ്ങളുടെ ഉപകരണ എൻറോൾമെന്റ് നീക്കംചെയ്യാനോ പുതിയ സ്‌ക്രാച്ച് കോഡ് സൃഷ്‌ടിക്കാനോ കഴിയും.
twofa_passcode_incorrect=നിങ്ങളുടെ പാസ്‌കോഡ് തെറ്റാണ്. നിങ്ങളുടെ ഉപകരണം തെറ്റായി സ്ഥാപിച്ചിട്ടുണ്ടെങ്കിൽ, പ്രവേശിക്കാൻ നിങ്ങളുടെ സ്ക്രാച്ച് കോഡ് ഉപയോഗിക്കുക.
twofa_scratch_token_incorrect=നിങ്ങളുടെ സ്ക്രാച്ച് കോഡ് തെറ്റാണ്.
login_userpass=പ്രവേശിക്കുക
login_openid=OpenID
oauth_signup_tab=പുതിയ അക്കൗണ്ട് രജിസ്റ്റർ ചെയ്യുക
oauth_signup_title=ഇമെയിലും പാസ്‌വേഡും ചേർക്കുക (അക്കൗണ്ട് വീണ്ടെടുക്കലിനായി)
oauth_signup_submit=അക്കൗണ്ട് പൂർത്തിയാക്കുക
oauth_signin_tab=നിലവിലുള്ള അക്കൌണ്ടുമായി ബന്ധിപ്പിയ്ക്കുക
oauth_signin_title=അക്കൗണ്ട് ബന്ധിപ്പിയ്ക്കുന്നതു് അംഗീകരിക്കുന്നതിനായി സൈറ്റിലേയ്ക്കു് പ്രവേശിക്കുക
oauth_signin_submit=അക്കൌണ്ട് ബന്ധിപ്പിയ്ക്കുക
openid_connect_submit=ബന്ധിപ്പിക്കുക
openid_connect_title=നിലവിലുള്ള അക്കൗണ്ടുമായി ബന്ധിപ്പിയ്ക്കുക
openid_connect_desc=തിരഞ്ഞെടുത്ത ഓപ്പൺഐഡി യുആർഐ അജ്ഞാതമാണ്. ഇവിടെ നിന്നും ഒരു പുതിയ അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്തുക.
openid_register_title=അംഗത്വമെടുക്കുക
openid_register_desc=തിരഞ്ഞെടുത്ത ഓപ്പൺഐഡി യുആർഐ അജ്ഞാതമാണ്. ഇവിടെ നിന്നും ഒരു പുതിയ അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്തുക.
openid_signin_desc=നിങ്ങളുടെ OpenID URI നൽകുക. ഉദാഹരണത്തിന്: https://anne.me, bob.openid.org.cn അല്ലെങ്കിൽ gnusocial.net/carry.
disable_forgot_password_mail=അക്കൗണ്ട് വീണ്ടെടുക്കൽ പ്രവർത്തനരഹിതമാണ്. നിങ്ങളുടെ സൈറ്റ് അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.
email_domain_blacklisted=നിങ്ങളുടെ ഇമെയിൽ വിലാസത്തിൽ രജിസ്റ്റർ ചെയ്യാൻ കഴിയില്ല.
authorize_application=അപ്ലിക്കേഷനു് അംഗീകാരം നല്കുക
authorize_application_created_by=%s സൃഷ്‌ടിച്ച അപ്ലിക്കേഷൻ ആണ്.
authorize_application_description=നിങ്ങൾ പ്രവേശനം അനുവദിക്കുകയാണെങ്കിൽ, സ്വകാര്യ റിപ്പോകളും ഓർഗനൈസേഷനുകളും ഉൾപ്പെടെ നിങ്ങളുടെ എല്ലാ അക്കൌണ്ട് വിവരങ്ങള്‍ നേടാനും വേണമെങ്കില്‍‍ മാറ്റങ്ങള്‍ വരുത്താനും അതിന് കഴിയും.
authorize_title=നിങ്ങളുടെ അക്കൌണ്ടില്‍ പ്രവേശിയ്ക്കുന്നതിനു് "%s"നു് അംഗീകാരം നൽകണോ?
authorization_failed=അംഗീകാരം നല്‍കുന്നതില്‍ പരാജയപ്പെട്ടു
authorization_failed_desc=അസാധുവായ ഒരു അഭ്യർത്ഥന കണ്ടെത്തിയതിനാൽ ഞങ്ങൾ അംഗീകാരം പരാജയപ്പെടുത്തി. ദയവായി നിങ്ങൾ അംഗീകരിക്കാൻ ശ്രമിച്ച അപ്ലിക്കേഷന്റെ പരിപാലകനുമായി ബന്ധപ്പെടുക.
[mail]
activate_account=നിങ്ങളുടെ അക്കൗണ്ട് സജീവമാക്കുക
activate_email=ഇമെയില്‍ വിലാസം സ്ഥിരീകരിയ്ക്കുക
reset_password=നിങ്ങളുടെ അക്കൗണ്ട് വീണ്ടെടുക്കുക
register_success=രജിസ്ട്രേഷൻ വിജയകരം
register_notify=ഗിറ്റീയിലേയ്ക്കു് സ്വാഗതം
[modal]
yes=അതെ
no=ഇല്ല
modify=പുതുക്കുക
[form]
UserName=ഉപയോക്ത്രു നാമം
RepoName=കലവറയുടെ പേരു്
Email=ഇ-മെയില്‍ വിലാസം
Password=രഹസ്യവാക്കു്
Retype=രഹസ്യവാക്കു് വീണ്ടും നല്‍കുക
SSHTitle=SSH കീയുടെ പേരു്
HttpsUrl=HTTPS URL
PayloadUrl=പേലോഡ് URL
TeamName=ടീമിന്റെ പേരു്
AuthName=അംഗീകാരത്തിന്റെ പേരു്
AdminEmail=അഡ്‌മിൻ ഇമെയിൽ
NewBranchName=പുതിയ ശാഖയുടെ പേരു്
CommitSummary=നിയോഗത്തിന്റെ സംഗ്രഹം
CommitMessage=നിയോഗത്തിന്റെ സന്ദേശം
CommitChoice=നിയോഗത്തിന്റെ തിരഞ്ഞെടുക്കല്‍
TreeName=ഫയല്‍ പാത്ത്
Content=ഉള്ളടക്കം
require_error=`ശൂന്യമായിരിക്കരുത്.`
alpha_dash_error=`ആൽ‌ഫാന്യൂമെറിക്, ഡാഷ് ('-'), അടിവരയിട്ട ('_') എന്നീ ചിഹ്നങ്ങള്‍ മാത്രം അടങ്ങിയിരിക്കണം.`
alpha_dash_dot_error=`ആൽ‌ഫാന്യൂമെറിക്, ഡാഷ് ('-'), അടിവരയിടുക ('_'), ഡോട്ട് ('.') എന്നീ ച്ഹ്നങ്ങള്‍ മാത്രം അടങ്ങിയിരിക്കണം.`
git_ref_name_error=`നന്നായി രൂപപ്പെടുത്തിയ Git റഫറൻസ് നാമമായിരിക്കണം.`
size_error=`വലുപ്പം %s ആയിരിക്കണം.`
min_size_error=`കുറഞ്ഞത് %s അക്ഷരങ്ങള്‍ അടങ്ങിയിരിക്കണം.`
max_size_error=`പരമാവധി %s അക്ഷരങ്ങള്‍ അടങ്ങിയിരിക്കണം.`
email_error=സാധുവായ ഒരു ഈ-മെയിൽ വിലാസം അല്ല
url_error=`സാധുവായ ഒരു URL അല്ല.`
include_error=`%s'എന്ന ഉപവാക്യം അടങ്ങിയിരിക്കണം.`
glob_pattern_error=ഗ്ലോബു് ശൃേണി തെറ്റാണു്: %s
unknown_error=അജ്ഞാതമായ പിശക്:
captcha_incorrect=ക്യാപ്ച കോഡ് തെറ്റാണ്.
password_not_match=രഹസ്യവാക്കുകള്‍ യോജിക്കുന്നില്ല.
username_been_taken=ഉപയോക്തൃനാമം ലഭ്യമല്ല.
repo_name_been_taken=കലവറയുടെ പേരു് ഇതിനോടകം ഉപയോഗിച്ചിട്ടുണ്ടു്.
visit_rate_limit=വിദൂര വിലാസം വിവരകൈമാറ്റത്തിനു് പരിധി നിശ്ചയിച്ചിട്ടുണ്ടു്.
2fa_auth_required=വിദൂര വിലാസം ഇരട്ട ഘടക പ്രാമാണീകരണം ആവശ്യപ്പെടുന്നുണ്ടു്.
org_name_been_taken=സംഘടനയുടെ പേര് ഇതിനകം എടുത്തിട്ടുണ്ട്.
team_name_been_taken=ടീമിന്റെ പേര് ഇതിനകം എടുത്തിട്ടുണ്ട്.
team_no_units_error=കുറഞ്ഞത് ഒരു കലവറ വിഭാഗത്തിലേക്ക് പ്രവേശനം അനുവദിക്കുക.
email_been_used=ഈ ഇമെയിൽ വിലാസം ഇതിനു മുന്നേ എടുത്തിട്ടുണ്ട്.
openid_been_used=%s എന്ന ഓപ്പണ്‍ഐഡി വിലാസം ഇതിനു മുന്നേ എടുത്തിട്ടുണ്ട്.
username_password_incorrect=ഉപഭോക്തൃനാമമോ രഹസ്യവാക്കോ തെറ്റാണ്.
enterred_invalid_repo_name=ഈ കവവറയുടെ പേരു് തെറ്റാണു്.
enterred_invalid_owner_name=പുതിയ ഉടമസ്ഥന്റെ പേരു് സാധുവല്ല.
enterred_invalid_password=താങ്കള്‍ നല്‍കിയ രഹസ്യവാക്കു് തെറ്റാണ്.
user_not_exist=ഉപയോക്താവ് നിലവിലില്ല.
last_org_owner='ഉടമകളുടെ' ടീമിൽ നിന്നും അവസാനത്തെ ഉപയോക്താവിനെ നീക്കംചെയ്യാൻ നിങ്ങൾക്ക് കഴിയില്ല. ടീമിൽ കുറഞ്ഞത് ഒരു ഉടമയെങ്കിലും ഉണ്ടായിരിക്കണം.
cannot_add_org_to_team=ഒരു സംഘടനയെ ടീം അംഗമായി ചേർക്കാൻ കഴിയില്ല.
invalid_ssh_key=നിങ്ങളുടെ SSH കീ സ്ഥിരീകരിക്കാൻ കഴിയില്ല: %s
invalid_gpg_key=നിങ്ങളുടെ GPG കീ സ്ഥിരീകരിക്കാൻ കഴിയില്ല: %s
unable_verify_ssh_key=SSH കീ സ്ഥിരീകരിക്കാൻ കഴിയില്ല; തെറ്റുകളുണ്ടോയെന്നു് ഒന്നുകൂടി പരിശോധിക്കുക.
auth_failed=പ്രാമാണീകരണം പരാജയപ്പെട്ടു: %v
still_own_repo=നിങ്ങളുടെ അക്കൗണ്ടിന് ഒന്നോ അതിലധികമോ കലവറകള്‍ ഉണ്ട്; ആദ്യം അവ ഇല്ലാതാക്കുക അല്ലെങ്കിൽ കൈമാറുക.
still_has_org=നിങ്ങളുടെ അക്കൗണ്ട് ഒന്നോ അതിലധികമോ സംഘടനകളില്‍ അംഗമാണ്; ആദ്യം അവ വിടുക.
org_still_own_repo=നിങ്ങളുടെ സംഘടന ഇനിയും ഒന്നോ അതിലധികമോ കലവറകളുടെ ഉടമസ്ഥനാണു്; ആദ്യം അവ ഇല്ലാതാക്കുക അല്ലെങ്കിൽ കൈമാറുക.
target_branch_not_exist=ലക്ഷ്യമാക്കിയ ശാഖ നിലവിലില്ല.
[user]
change_avatar=നിങ്ങളുടെ അവതാർ മാറ്റുക…
join_on=ചേർന്നതു്
repositories=കലവറകള്‍
activity=പൊതുവായ പ്രവർത്തനങ്ങള്‍
followers=പിന്തുടരുന്നവര്‍‌
starred=നക്ഷത്രമിട്ട കലവറകള്‍
following=പിന്തുടരുന്നവര്‍
follow=പിന്തുടരൂ
unfollow=പിന്തുടരുന്നത് നിര്‍ത്തുക
heatmap.loading=ഹീറ്റ്മാപ്പ് ലോഡുചെയ്യുന്നു…
user_bio=ജീവചരിത്രം
form.name_reserved='%s' എന്ന ഉപയോക്തൃനാമം മറ്റാവശ്യങ്ങള്‍ക്കായി നീക്കിവച്ചിരിക്കുന്നു.
form.name_pattern_not_allowed=ഉപയോക്തൃനാമത്തിൽ '%s' എന്ന ശ്രേണി അനുവദനീയമല്ല.
[settings]
profile=പ്രൊഫൈൽ
account=അക്കൗണ്ട്
password=രഹസ്യവാക്കു്
security=സുരക്ഷ
avatar=അവതാര്‍
ssh_gpg_keys=SSH / GPG കീകള്‍
social=സോഷ്യൽ അക്കൗണ്ടുകൾ
applications=അപ്ലിക്കേഷനുകൾ
orgs=സംഘടനകളെ നിയന്ത്രിക്കുക
repos=കലവറകള്‍
delete=അക്കൗണ്ട് ഇല്ലാതാക്കുക
twofa=ഇരട്ട ഘടക പ്രാമാണീകരണം
account_link=ബന്ധിപ്പിച്ച അക്കൌണ്ടുകള്‍
organization=സംഘടനകള്‍
uid=Uid
u2f=സുരക്ഷാ കീകൾ
public_profile=പരസ്യമായ പ്രൊഫൈൽ
profile_desc=അറിയിപ്പുകൾക്കും മറ്റ് പ്രവർത്തനങ്ങൾക്കുമായി നിങ്ങളുടെ ഇമെയിൽ വിലാസം ഉപയോഗിക്കും.
password_username_disabled=പ്രാദേശികമല്ലാത്ത ഉപയോക്താക്കൾക്ക് അവരുടെ ഉപയോക്തൃനാമം മാറ്റാൻ അനുവാദമില്ല. കൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ സൈറ്റ് അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.
full_name=പൂർണ്ണമായ പേര്
website=വെബ് സൈറ്റ്
location=സ്ഥലം
update_theme=പ്രമേയം പുതുക്കുക
update_profile=പ്രോഫൈല്‍ പരിഷ്കരിക്കുക
update_profile_success=നിങ്ങളുടെ പ്രൊഫൈൽ പരിഷ്കരിച്ചിരിക്കുന്നു.
change_username=നിങ്ങളുടെ ഉപയോക്തൃനാമം മാറ്റി.
change_username_prompt=കുറിപ്പ്: ഉപയോക്തൃനാമത്തിലെ മാറ്റം നിങ്ങളുടെ അക്കൗണ്ട് URLഉ മാറ്റുന്നു.
continue=തുടരുക
cancel=റദ്ദാക്കുക
language=ഭാഷ
ui=പ്രമേയങ്ങള്‍
lookup_avatar_by_mail=ഇമെയിൽ വിലാസം അനുസരിച്ച് അവതാർ കണ്ടെത്തുക
federated_avatar_lookup=കേന്ദ്രീക്രത അവതാര്‍ കണ്ടെത്തല്‍
enable_custom_avatar=ഇഷ്‌ടാനുസൃത അവതാർ ഉപയോഗിക്കുക
choose_new_avatar=പുതിയ അവതാർ തിരഞ്ഞെടുക്കുക
update_avatar=അവതാർ പുതുക്കുക
delete_current_avatar=നിലവിലെ അവതാർ ഇല്ലാതാക്കുക
uploaded_avatar_not_a_image=അപ്‌ലോഡുചെയ്‌ത ഫയൽ ഒരു ചിത്രമല്ല.
uploaded_avatar_is_too_big=അപ്‌ലോഡുചെയ്‌ത ഫയൽ പരമാവധി വലുപ്പം കവിഞ്ഞു.
update_avatar_success=നിങ്ങളുടെ അവതാര്‍ പരിഷ്കരിച്ചിരിക്കുന്നു.
change_password=പാസ്‌വേഡ് പുതുക്കുക
old_password=നിലവിലുള്ള രഹസ്യവാക്കു്
new_password=പുതിയ രഹസ്യവാക്കു്
retype_new_password=പുതിയ രഹസ്യവാക്കു് വീണ്ടും നല്‍കുക
password_incorrect=നിലവിലെ പാസ്‌വേഡ് തെറ്റാണ്.
change_password_success=നിങ്ങളുടെ പാസ്‌വേഡ് അപ്‌ഡേറ്റുചെയ്‌തു. ഇനി മുതൽ നിങ്ങളുടെ പുതിയ പാസ്‌വേഡ് ഉപയോഗിച്ച് പ്രവേശിക്കുക.
password_change_disabled=പ്രാദേശിക ഇതര ഉപയോക്താക്കൾക്ക് ഗിറ്റീ വെബ് വഴി പാസ്‌വേഡ് പുതുക്കാന്‍ ചെയ്യാൻ കഴിയില്ല.
emails=ഇ-മെയില്‍ വിലാസങ്ങള്‍
manage_emails=ഇമെയിൽ വിലാസങ്ങൾ നിയന്ത്രിക്കുക
manage_themes=സ്ഥിരസ്ഥിതി പ്രമേയം തിരഞ്ഞെടുക്കുക
manage_openid=ഓപ്പൺഐഡി വിലാസങ്ങൾ നിയന്ത്രിക്കുക
email_desc=അറിയിപ്പുകൾക്കും മറ്റ് പ്രവർത്തനങ്ങൾക്കുമായി നിങ്ങളുടെ പ്രാഥമിക ഇമെയിൽ വിലാസം ഉപയോഗിക്കും.
theme_desc=സൈറ്റിലുടനീളം ഇത് നിങ്ങളുടെ സ്ഥിരസ്ഥിതി പ്രമേയം ആയിരിക്കും.
primary=പ്രാഥമികം
primary_email=പ്രാഥമികമാക്കുക
delete_email=നീക്കം ചെയ്യുക
email_deletion=ഈ-മെയില്‍ വിലാസം നീക്കം ചെയ്യുക
email_deletion_desc=ഇമെയിൽ വിലാസവും അനുബന്ധ വിവരങ്ങളും നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്ന് നീക്കംചെയ്യും. ഈ ഇമെയിൽ വിലാസം വഴിയുള്ള ഗിറ്റു് നിയോഗങ്ങളും മാറ്റമില്ലാതെ ഉണ്ടാകും. തുടരട്ടെ?
email_deletion_success=ഇമെയിൽ വിലാസം നീക്കംചെയ്‌തു.
theme_update_success=നിങ്ങളുടെ പ്രമേയം പുതുക്കി.
theme_update_error=തിരഞ്ഞെടുത്ത പ്രമേയം നിലവിലില്ല.
openid_deletion=OpenID വിലാസം നീക്കം ചെയ്യുക
openid_deletion_desc=നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്ന് ഓപ്പൺഐഡി വിലാസം നീക്കംചെയ്യുന്നത് ഇതുപയോഗിച്ചു് ഇനി പ്രവേശിക്കുന്നതിൽ നിന്ന് നിങ്ങളെ തടയും. തുടരട്ടെ?
openid_deletion_success=ഓപ്പൺഐഡി വിലാസം നീക്കംചെയ്‌തു.
add_new_email=ഈ-മെയില്‍ വിലാസം ചേര്‍ക്കുക
add_new_openid=പുതിയ ഓപ്പണ്‍ ഐഡി വിലാസം ചേര്‍ക്കുക
add_email=ഈ-മെയില്‍ വിലാസം ചേര്‍ക്കുക
add_openid=ഓപ്പണ്‍ ഐഡി വിലാസം ചേര്‍ക്കുക
add_email_confirmation_sent=ഒരു സ്ഥിരീകരണ ഇമെയിൽ '%s' ലേക്ക് അയച്ചു. നിങ്ങളുടെ ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കുന്നതിന് അടുത്ത %s നുള്ളിൽ നിങ്ങളുടെ ഇൻ‌ബോക്സ് പരിശോധിക്കുക.
add_email_success=പുതിയ ഇമെയിൽ വിലാസം ചേര്‍ത്തു.
add_openid_success=പുതിയ ഓപ്പണ്‍ഐഡി വിലാസം ചേര്‍ത്തു.
keep_email_private=ഈ-മെയില്‍ വിലാസം മറയ്ക്കുക
keep_email_private_popup=നിങ്ങളുടെ ഇമെയിൽ വിലാസം മറ്റ് ഉപയോക്താക്കു് കാണാനാകില്ല.
openid_desc=ഒരു ബാഹ്യ ദാതാവിന് പ്രാമാണീകരണം നിയുക്തമാക്കാൻ ഓപ്പൺഐഡി നിങ്ങളെ അനുവദിക്കുന്നു.
manage_ssh_keys=​എസ്. എസ്. എച്ച് കീകള്‍ നിയന്ത്രിക്കുക
manage_gpg_keys=ജീ പീ. ജി കീകള്‍ നിയന്ത്രിക്കുക
add_key=കീ ചേര്‍ക്കുക
ssh_desc=ഇവയാണു് നിങ്ങളുടെ അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്തിയിരിക്കുന്ന പൊതുവായ എസ്. എസ്. എച്ച് കീകൾ. ഇതിനോടനു ബന്ധിപ്പിച്ചിട്ടുള്ള സ്വകാര്യ കീകൾ നിങ്ങളുടെ കലവറകളിലേയ്ക്കു് പൂർണ്ണ ആക്സസ് അനുവദിക്കുന്നു.
gpg_desc=ഈ പൊതു GPG കീകൾ നിങ്ങളുടെ അക്കൗണ്ടുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു. കമ്മിറ്റുകളെ പരിശോധിച്ചുറപ്പിക്കാൻ നിങ്ങളുടെ സ്വകാര്യ കീകൾ അനുവദിക്കുന്നതിനാൽ അവ സുരക്ഷിതമായി സൂക്ഷിക്കുക.
ssh_helper=<strong>സഹായം ആവശ്യമുണ്ടോ?</strong> <a href="%s"> നിങ്ങളുടെ സ്വന്തം SSH കീകൾ സൃഷ്ടിക്കുക,</a> അല്ലെങ്കിൽ <a href="%s"> പൊതുവായ പ്രശ്നങ്ങൾ </a> എന്നിവയ്ക്കായുള്ള ഗിറ്റ്ഹബ്ബിന്റെ മാര്‍ഗദര്‍ശനങ്ങള്‍ ഉപയോഗിച്ചു് നിങ്ങൾക്ക് എസ്. എസ്. എച്ചുമായി ബന്ധപ്പെട്ട പ്രശ്നങ്ങള്‍ പരിഹരിക്കാം.
gpg_helper=<strong> സഹായം ആവശ്യമുണ്ടോ? </strong> ജിപിജിയെക്കുറിച്ച് ഗിറ്റ്ഹബിന്റെ മാര്‍ഗ്ഗനിര്‍ദ്ദേശങ്ങള്‍ <a href="%s"> പരിശോധിയ്ക്കുക</a>.
add_new_key=SSH കീ ചേർക്കുക
add_new_gpg_key=GPG കീ ചേർക്കുക
ssh_key_been_used=ഈ SSH കീ ഇതിനകം ചേർത്തു.
ssh_key_name_used=ഇതേ പേരിലുള്ള ഒരു SSH കീ ഇതിനകം നിങ്ങളുടെ അക്കൗണ്ടിലേക്ക് ചേർത്തിട്ടുണ്ടു്.
gpg_key_id_used=സമാന ഐഡിയുള്ള ഒരു പൊതു ജിപിജി കീ ഇതിനകം നിലവിലുണ്ട്.
gpg_no_key_email_found=നിങ്ങളുടെ അക്കൗണ്ടുമായി ബന്ധപ്പെട്ട ഏതെങ്കിലും ഇമെയിൽ വിലാസത്തിൽ ഈ GPG കീ ഉപയോഗിക്കാൻ കഴിയില്ല.
subkeys=സബ് കീകള്‍
key_id=കീ ഐഡി
key_name=കീയുടെ പേരു്
key_content=ഉള്ളടക്കം
add_key_success='%s' എന്ന SSH കീ ചേർത്തു.
add_gpg_key_success='%s' എന്ന GPG കീ ചേർത്തു.
delete_key=നീക്കം ചെയ്യുക
ssh_key_deletion=SSH കീ നീക്കം ചെയ്യുക
gpg_key_deletion=GPG കീ നീക്കം ചെയ്യുക
ssh_key_deletion_desc=ഒരു SSH കീ നീക്കംചെയ്യുന്നത് നിങ്ങളുടെ അക്കൌണ്ടിലേക്കുള്ള പ്രവേശനം അസാധുവാക്കുന്നു. തുടരട്ടെ?
gpg_key_deletion_desc=ഒരു ജി‌പി‌ജി കീ നീക്കംചെയ്യുന്നത് അതിൽ ഒപ്പിട്ട കമ്മിറ്റുകളെ സ്ഥിരീകരിക്കില്ല. തുടരട്ടെ?
ssh_key_deletion_success=SSH കീ നീക്കംചെയ്‌തു.
gpg_key_deletion_success=GPG കീ നീക്കംചെയ്‌തു.
add_on=ചേര്‍ത്തതു്
valid_until=വരെ സാധുവാണ്
valid_forever=എന്നും സാധുവാണു്
last_used=അവസാനം ഉപയോഗിച്ചത്
no_activity=സമീപകാലത്തു് പ്രവർത്തനങ്ങളൊന്നുമില്ല
can_read_info=വായിയ്ക്കുക
can_write_info=എഴുതുക
key_state_desc=കഴിഞ്ഞ 7 ദിവസങ്ങളിൽ ഈ കീ ഉപയോഗിച്ചു
token_state_desc=ഈ ടോക്കൺ കഴിഞ്ഞ 7 ദിവസങ്ങളിൽ ഉപയോഗിച്ചു
show_openid=പ്രൊഫൈലിൽ കാണുക
hide_openid=പ്രൊഫൈലിൽ നിന്ന് മറയ്‌ക്കുക
ssh_disabled=SSH അപ്രാപ്‌തമാക്കി
manage_social=സഹവസിക്കുന്ന സോഷ്യൽ അക്കൗണ്ടുകളെ നിയന്ത്രിക്കുക
social_desc=ഈ സോഷ്യൽ അക്കൗണ്ടുകൾ നിങ്ങളുടെ ഗിറ്റീ അക്കൗണ്ടുമായി ലിങ്കുചെയ്‌തു. ഇവ നിങ്ങളുടെ ഗീറ്റീ അക്കൗണ്ടിലേക്ക് പ്രവേശിക്കാൻ ഉപയോഗിക്കാവുന്നതിനാൽ അവയെല്ലാം നിങ്ങൾ തിരിച്ചറിഞ്ഞുവെന്ന് ഉറപ്പാക്കുക.
unbind=അൺലിങ്ക് ചെയ്യുക
unbind_success=നിങ്ങളുടെ ഗീറ്റീ അക്കൗണ്ടിൽ നിന്ന് സോഷ്യൽ അക്കൗണ്ട് അൺലിങ്ക് ചെയ്തു.
manage_access_token=ആക്‌സസ്സ് ടോക്കണുകൾ നിയന്ത്രിക്കുക
generate_new_token=പുതിയ ടോക്കൺ സൃഷ്‌ടിക്കുക
tokens_desc=ഈ ടോക്കണുകൾ ഗിറ്റീ API ഉപയോഗിച്ച് നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് പ്രവേശനം നൽകുന്നു.
new_token_desc=ഒരു ടോക്കൺ ഉപയോഗിക്കുന്ന അപ്ലിക്കേഷനുകൾക്ക് നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് പൂർണ്ണ പ്രവേശനം ഉണ്ട്.
token_name=ടോക്കണിന്റെ പേരു്
generate_token=ടോക്കൺ സൃഷ്‌ടിക്കുക
generate_token_success=നിങ്ങളുടെ പുതിയ ടോക്കൺ ജനറേറ്റുചെയ്‌തു. ഇത് വീണ്ടും കാണിക്കാത്തതിനാൽ ഇപ്പോൾ തന്നെ പകർത്തുക.
delete_token=നീക്കം ചെയ്യുക
access_token_deletion=ആക്‌സസ്സ് ടോക്കണ്‍ നീക്കം ചെയ്യുക
access_token_deletion_desc=ഒരു ടോക്കൺ ഇല്ലാതാക്കുന്നത് നിങ്ങളുടെ അക്കൗണ്ട് ഉപയോഗിക്കുന്ന അപ്ലിക്കേഷനുകൾക്കുള്ള പ്രവേശനം അസാധുവാക്കും. തുടരട്ടേ?
delete_token_success=ടോക്കൺ ഇല്ലാതാക്കി. ഇനി ഇത് ഉപയോഗിക്കുന്ന അപ്ലിക്കേഷനുകൾക്ക് നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് പ്രവേശനം ഉണ്ടാകില്ല.
manage_oauth2_applications=OAuth2 അപ്ലിക്കേഷനുകൾ നിയന്ത്രിക്കുക
edit_oauth2_application=OAuth2 അപ്ലിക്കേഷൻ എഡിറ്റുചെയ്യുക
oauth2_applications_desc=നിങ്ങളുടെ മൂന്നാം കക്ഷി അപ്ലിക്കേഷനെ, ഈ ഗിറ്റീ ഇന്‍സ്റ്റാളേഷനുമായി സുരക്ഷിതമായി ഉപയോക്താക്കളെ പ്രാമാണീകരിക്കാൻ OAuth2 അപ്ലിക്കേഷനുകൾ പ്രാപ്തമാക്കുന്നു.
remove_oauth2_application=OAuth2 അപ്ലിക്കേഷനുകൾ നീക്കംചെയ്യുക
remove_oauth2_application_desc=ഒരു OAuth2 അപ്ലിക്കേഷൻ നീക്കംചെയ്യുന്നത് ഒപ്പിട്ട എല്ലാ ആക്സസ് ടോക്കണുകളിലേക്കും പ്രവേശനം റദ്ദാക്കും. തുടരട്ടെ?
remove_oauth2_application_success=അപ്ലിക്കേഷൻ ഇല്ലാതാക്കി.
create_oauth2_application=ഒരു പുതിയ OAuth2 അപ്ലിക്കേഷൻ സൃഷ്ടിക്കുക
create_oauth2_application_button=അപ്ലിക്കേഷൻ സൃഷ്ടിക്കുക
create_oauth2_application_success=നിങ്ങൾ വിജയകരമായി ഒരു പുതിയ OAuth2 അപ്ലിക്കേഷൻ സൃഷ്ടിച്ചു.
update_oauth2_application_success=നിങ്ങൾ വിജയകരമായി ഒരു പുതിയ OAuth2 അപ്ലിക്കേഷൻ പുതുക്കി.
oauth2_application_name=അപ്ലിക്കേഷന്റെ പേര്
oauth2_select_type=ഏത് തരം അപ്ലിക്കേഷനാണ് ഇതു്?
oauth2_type_web=വെബ് (e.g. Node.JS, Tomcat, Go)
oauth2_type_native=നേറ്റീവ് (ഉദാ. മൊബൈൽ, ഡെസ്ക്ടോപ്പ്, ബ്രൌസർ)
oauth2_redirect_uri=URI റീഡയറക്‌ട് ചെയ്യുക
save_application=സംരക്ഷിയ്ക്കുക
oauth2_client_id=ക്ലൈന്റ് ഐഡി
oauth2_client_secret=ക്ലൈന്റു് രഹസ്യം
oauth2_regenerate_secret=രഹസ്യം പുനഃസൃഷ്ടിയ്ക്കുക
oauth2_regenerate_secret_hint=നിങ്ങളുടെ രഹസ്യം നഷ്ടപ്പെട്ടോ?
oauth2_client_secret_hint=നിങ്ങൾ ഈ പേജ് വീണ്ടും സന്ദർശിക്കുകയാണെങ്കിൽ രഹസ്യം ദൃശ്യമാകില്ല. നിങ്ങളുടെ രഹസ്യം സംരക്ഷിക്കുക.
oauth2_application_edit=ക്രമീകരിക്കുക
oauth2_application_create_description=OAuth2 ആപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ മൂന്നാം കക്ഷി ആപ്ലിക്കേഷൻ ഉപയോക്തൃ അക്കൌണ്ടുകളിലേക്ക് ആക്സസ് നൽകുന്നു.
oauth2_application_remove_description=ഒരു OAuth2 ആപ്ലിക്കേഷൻ നീക്കംചെയ്യുന്നത് ഈ സന്ദർഭത്തിൽ അംഗീകൃത ഉപയോക്തൃ അക്കൌണ്ടുകളിലേക്ക് പ്രവേശിക്കുന്നത് തടയും. തുടരട്ടെ?
authorized_oauth2_applications=അംഗീകൃത OAuth2 അപ്ലിക്കേഷനുകൾ
authorized_oauth2_applications_description=ഈ മൂന്നാം കക്ഷി അപ്ലിക്കേഷനുകളിലേക്ക് നിങ്ങളുടെ സ്വകാര്യ ഗീറ്റീ അക്കൗണ്ടിലേക്ക് പ്രവേശനം അനുവദിച്ചു. അപ്ലിക്കേഷനുകൾക്കായുള്ള നിയന്ത്രണം ഇനി ആവശ്യമില്ല.
revoke_key=അസാധുവാക്കുക
revoke_oauth2_grant=നിയന്ത്രണം തിരിച്ചെടുക്കുക
revoke_oauth2_grant_description=ഈ മൂന്നാം കക്ഷി ആപ്ലിക്കേഷനായി ആക്സസ് അസാധുവാക്കുന്നത് നിങ്ങളുടെ ഡാറ്റ ആക്സസ് ചെയ്യുന്നതിൽ നിന്ന് ഈ ആപ്ലിക്കേഷനെ തടയും. നിങ്ങള്‍ക്ക് ഉറപ്പാണോ?
revoke_oauth2_grant_success=നിങ്ങൾ വിജയകരമായി പ്രവേശനം റദ്ദാക്കി.
twofa_desc=ഇരട്ട ഘടക പ്രാമാണീകരണം നിങ്ങളുടെ അക്കൗണ്ടിന്റെ സുരക്ഷ വർദ്ധിപ്പിക്കുന്നു.
twofa_is_enrolled=നിങ്ങളുടെ അക്കൗണ്ട് നിലവിൽ ഇരട്ട ഘടക പ്രമാണീകരണത്തിനു് <strong> എൻറോൾ ചെയ്തിട്ടുണ്ട്. </strong>.
twofa_not_enrolled=നിങ്ങളുടെ അക്കൗണ്ട് നിലവിൽ ഇരട്ട ഘടക പ്രമാണീകരണത്തിനു് <strong> എൻറോൾ ചെയ്തിട്ടില്ല.</strong>.
twofa_disable=ഇരട്ട ഘടക പ്രാമാണീകരണം റദ്ദാക്കി
twofa_scratch_token_regenerate=സ്ക്രാച്ച് ടോക്കൺ പുനഃനിര്‍മ്മിയ്ക്കുക
twofa_scratch_token_regenerated=%s ആണ് ഇപ്പോൾ നിങ്ങളുടെ സ്ക്രാച്ച് ടോക്കൺ. സുരക്ഷിതമായ സ്ഥലത്ത് സൂക്ഷിക്കുക.
twofa_enroll=ഇരട്ട ഘടക പ്രാമാണീകരണത്തില്‍ അംഗമാകുക
twofa_disable_note=ആവശ്യമെങ്കിൽ നിങ്ങൾക്ക് രണ്ട്-ഘടക പ്രാമാണീകരണം അപ്രാപ്തമാക്കാൻ കഴിയും.
twofa_disable_desc=രണ്ട്-ഘടക പ്രാമാണീകരണം അപ്രാപ്‌തമാക്കുന്നത് നിങ്ങളുടെ അക്കൗണ്ട് സുരക്ഷിതമല്ലാത്തതാക്കും. തുടരട്ടെ?
regenerate_scratch_token_desc=നിങ്ങളുടെ സ്ക്രാച്ച് ടോക്കൺ തെറ്റായി സ്ഥാപിക്കുകയോ അല്ലെങ്കിൽ സൈൻ ഇൻ ചെയ്യാൻ ഇതിനകം ഉപയോഗിക്കുകയോ ചെയ്തിട്ടുണ്ടെങ്കിൽ അത് ഇവിടെനിന്നു് പുനഃസജ്ജമാക്കാൻ കഴിയും.
twofa_disabled=രണ്ട്-ഘട്ട പ്രാമാണീകരണം അപ്രാപ്‌തമാക്കി.
scan_this_image=നിങ്ങളുടെ പ്രാമാണീകരണ ആപ്ലിക്കേഷൻ ഉപയോഗിച്ച് ഈ ചിത്രം സൂക്ഷ്‌മപരിശോധന നടത്തുക:
or_enter_secret=അല്ലെങ്കിൽ രഹസ്യ കോഡ് നൽകുക: %s
then_enter_passcode=അപ്ലിക്കേഷനിൽ കാണിച്ചിരിക്കുന്ന പാസ്‌കോഡ് നൽകുക:
passcode_invalid=പാസ്‌കോഡ് തെറ്റാണ്. വീണ്ടും ശ്രമിക്കുക.
twofa_enrolled=നിങ്ങളുടെ അക്കൌണ്ട് രണ്ട്-ഘട്ട പ്രാമാണീകരണത്തിലേക്ക് ചേർത്തിട്ടുണ്ട്. നിങ്ങളുടെ സ്ക്രാച്ച് ടോക്കൺ (%s) ഒരു തവണ മാത്രം കാണിക്കുന്നതിനാൽ അതു് സുരക്ഷിതമായ സ്ഥലത്ത് സൂക്ഷിക്കുക!
u2f_desc=ക്രിപ്‌റ്റോഗ്രാഫിക് കീകൾ അടങ്ങിയ ഹാർഡ്‌വെയർ ഉപകരണങ്ങളാണ് സുരക്ഷാ കീകൾ. രണ്ട്-ഘട്ട പ്രാമാണീകരണത്തിനായി അവ ഉപയോഗിക്കാം. പക്ഷേ സുരക്ഷാ കീകൾ <a rel="noreferrer" href="https://fidoalliance.org/"> FIDO U2F </a> സ്റ്റാൻഡേർഡിനെ പിന്തുണയ്‌ക്കുന്നവയാകണം.
u2f_require_twofa=സുരക്ഷാ കീകൾ‌ ഉപയോഗിക്കുന്നതിന് നിങ്ങളുടെ അക്കൌണ്ട് രണ്ട്-ഘട്ട പ്രാമാണീകരണത്തിൽ‌ ചേർ‌ത്തിരിക്കണം.
u2f_register_key=സുരക്ഷാ കീ ചേർക്കുക
u2f_nickname=വിളിപ്പേരു്
u2f_press_button=രജിസ്റ്റർ ചെയ്യുന്നതിന് നിങ്ങളുടെ സുരക്ഷാ കീയിലെ ബട്ടൺ അമർത്തുക.
u2f_delete_key=സുരക്ഷാ കീ നീക്കംചെയ്യുക
u2f_delete_key_desc=നിങ്ങൾ ഒരു സുരക്ഷാ കീ നീക്കംചെയ്യുകയാണെങ്കിൽ, നിങ്ങൾക്ക് ഇത് ഉപയോഗിച്ച് പ്രവേശിയ്ക്കാന്‍ കഴിയില്ല. തുടരട്ടെ?
manage_account_links=ബന്ധിപ്പിച്ചിട്ടുള്ള അക്കൗണ്ടുകൾ നിയന്ത്രിക്കുക
manage_account_links_desc=ഈ ബാഹ്യ അക്കൗണ്ടുകൾ നിങ്ങളുടെ ഗിറ്റീ അക്കൗണ്ടുമായി ലിങ്കുചെയ്‌തു.
account_links_not_available=നിങ്ങളുടെ ഗിറ്റീ അക്കൌണ്ടുമായി നിലവിൽ മറ്റു് ബാഹ്യ അക്കൌണ്ടുകളൊന്നും ബന്ധിപ്പിച്ചിട്ടില്ല.
remove_account_link=ബന്ധിപ്പിച്ച അക്കൗണ്ട് നീക്കംചെയ്യുക
remove_account_link_desc=ഒരു ബന്ധിപ്പിച്ച അക്കൗണ്ട് നീക്കംചെയ്യുന്നത് നിങ്ങളുടെ ഗിറ്റീ അക്കൗണ്ടിലേക്കുള്ള പ്രവേശനം അസാധുവാക്കും. തുടരട്ടെ?
remove_account_link_success=ബന്ധിപ്പിച്ച അക്കൗണ്ട് നീക്കംചെയ്‌തു.
orgs_none=നിങ്ങൾ ഏതെങ്കിലും സംഘടനയില്‍ അംഗമല്ല.
repos_none=നിങ്ങൾക്ക് ഒരു കലവറയും സ്വന്തമായി ഇല്ല
delete_account=അക്കൗണ്ട് ഇല്ലാതാക്കുക
delete_prompt=ഈ പ്രവർത്തനം നിങ്ങളുടെ ഉപയോക്തൃ അക്കൗണ്ട് ശാശ്വതമായി ഇല്ലാതാക്കും. ഇത് <strong> പൂർ‌വ്വാവസ്ഥയിലാക്കാൻ‌ കഴിയില്ല.</strong>.
confirm_delete_account=ഇല്ലാതാക്കൽ സ്ഥിരീകരിക്കുക
delete_account_title=ഉപയോക്തൃ അക്കൗണ്ട് ഇല്ലാതാക്കുക
delete_account_desc=ഈ ഉപയോക്തൃ അക്കൗണ്ട് ശാശ്വതമായി ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?
email_notifications.enable=ഇമെയിൽ അറിയിപ്പുകൾ പ്രാപ്തമാക്കുക
email_notifications.onmention=ഇ-മെയിൽ പരാമര്‍ശിച്ചാൽ മാത്രം അയയ്ക്കുക
email_notifications.disable=ഇമെയിൽ അറിയിപ്പുകൾ അപ്രാപ്തമാക്കുക
email_notifications.submit=ഇ-മെയില്‍ മുൻഗണനകള്‍
[repo]
owner=ഉടമസ്ഥന്‍
repo_name=കലവറയുടെ പേരു്
repo_name_helper=നല്ല കലവറയുടെ പേരു് ഹ്രസ്വവും അവിസ്മരണീയവും അതുല്യവുമായ കീവേഡുകൾ ഉപയോഗിക്കുന്നു.
visibility=കാണാനാവുന്നതു്
visibility_description=ഉടമയ്‌ക്കോ ഓർഗനൈസേഷൻ അംഗങ്ങൾക്കോ അവകാശങ്ങളുണ്ടെങ്കിൽ മാത്രമേ കാണാൻ കഴിയൂ.
visibility_helper=കലവറ സ്വകാര്യമാക്കുക
visibility_helper_forced=നിങ്ങളുടെ സൈറ്റ് അഡ്മിനിസ്ട്രേറ്റർ പുതിയ കലവറകളെ സ്വകാര്യമാക്കാൻ നിർബന്ധിക്കുന്നു.
visibility_fork_helper=(മാറ്റം എല്ലാ ഫോർക്കുകളെയും ബാധിക്കും.)
clone_helper=ക്ലോണ്‍ ചെയ്യാന്‍ സഹായം വേണോ? <a target="_blank" rel="noopener noreferrer" href="%s">സഹായം</a> സന്ദര്‍ശിക്കുക.
fork_repo=കലവറ ഫോര്‍ക്കു് ചെയ്യുക
fork_from=ല്‍ നിന്നും ഫോര്‍ക്കു് ചെയ്യൂ
fork_visibility_helper=ഒരു കലവറയുടെ ഫോര്‍ക്കിന്റെ ദൃശ്യപരത മാറ്റാൻ കഴിയില്ല.
repo_desc=വിരരണം
repo_lang=ഭാഷ
repo_gitignore_helper=.gitignore ടെംപ്ലേറ്റുകൾ തിരഞ്ഞെടുക്കുക.
license=ലൈസൻസ്
license_helper=ഒരു ലൈസൻസ് ഫയൽ തിരഞ്ഞെടുക്കുക.
readme=റീഡ്‍മീ
readme_helper=ഒരു റീഡ്‍മീ ഫയൽ ടെംപ്ലേറ്റ് തിരഞ്ഞെടുക്കുക.
auto_init=കലവറ സമാരംഭിക്കുക (.gitignore, ലൈസൻസ്, റീഡ്‍മീ എന്നിവ ചേർക്കുന്നു)
create_repo=കലവറ സൃഷ്ടിക്കുക
default_branch=സ്ഥിരസ്ഥിതി ശാഖ
mirror_prune=വെട്ടിഒതുക്കുക
mirror_prune_desc=കാലഹരണപ്പെട്ട വിദൂര ട്രാക്കിംഗ് റഫറൻസുകൾ നീക്കംചെയ്യുക
mirror_interval=മിറർ ചെയ്യാനുള്ള ഇടവേള (സാധുവായ സമയ യൂണിറ്റുകൾ 'h', 'm', 's' എന്നിവയാണ്). യാന്ത്രിക സമന്വയം പ്രവർത്തനരഹിതമാക്കാൻ 0 നല്‍കുക.
mirror_interval_invalid=മിറർ ചെയ്യാനുള്ള ഇടവേള സാധുവല്ല.
mirror_address=URL- ൽ നിന്നുള്ള ക്ലോൺ
mirror_address_url_invalid=നൽകിയ url അസാധുവാണ്. നിങ്ങൾ url- ന്റെ എല്ലാ ഘടകങ്ങളും ശരിയായി നല്‍കണം.
mirror_address_protocol_invalid=നൽകിയ url അസാധുവാണ്. http(s):// അല്ലെങ്കിൽ git:// ലൊക്കേഷനുകൾ മാത്രമേ മിറർ ചെയ്യാൻ കഴിയൂ.
mirror_last_synced=അവസാനം സമന്വയിപ്പിച്ചതു്
watchers=നിരീക്ഷകർ
stargazers=സ്റ്റാർഗാസറുകൾ
forks=ശാഖകള്‍
pick_reaction=നിങ്ങളുടെ പ്രതികരണം തിരഞ്ഞെടുക്കുക
reactions_more=കൂടാതെ %d അധികം
archive.title=ഈ കലവറ ചരിത്രരേഖാപരമായി നിലനിര്‍ത്തിയിരിക്കുന്നു. നിങ്ങൾക്ക് ഫയലുകൾ കാണാനും ക്ലോൺ ചെയ്യാനും കഴിയും, പക്ഷേ പ്രശ്‌നങ്ങൾ / ലയന അഭ്യർത്ഥനകൾ ഉണ്ടാക്കാനോ തുറക്കാനോ കഴിയില്ല.
archive.issue.nocomment=ഈ കലവറ ചരിത്രപരമായി നിലനിര്‍ത്തിയിരിക്കുന്നതാണു്. നിങ്ങൾക്ക് പ്രശ്നങ്ങളിൽ അഭിപ്രായമിടാൻ കഴിയില്ല.
archive.pull.nocomment=ഈ കലവറ ചരിത്രപരമായി നിലനിര്‍ത്തിയിരിക്കുന്നതാണു്. നിങ്ങൾക്ക് ലയന അഭ്യർത്ഥനകളില്‍ അഭിപ്രായമിടാൻ കഴിയില്ല.
form.reach_limit_of_creation=നിങ്ങളുടെ കലവറകളുടെ പരിധിയായ %d നിങ്ങൾ ഇതിനകം എത്തി.
form.name_reserved='%s' എന്ന കലവറയുടെ പേരു് മറ്റാവശ്യങ്ങള്‍ക്കായി നീക്കിവച്ചിരിക്കുന്നു.
form.name_pattern_not_allowed=കലവറനാമത്തിൽ '%s' എന്ന ശ്രേണി അനുവദനീയമല്ല.
need_auth=ക്ലോൺ അംഗീകാരിയ്ക്കുക
migrate_type=മൈഗ്രേഷൻ തരം
migrate_type_helper=ഈ കലവറ ഒരു <span class="text blue"> മിറർ </span> ആയിരിക്കും
migrate_items=മൈഗ്രേഷൻ ഇനങ്ങൾ
migrate_items_wiki=വിക്കി
migrate_items_milestones=നാഴികക്കല്ലുകള്‍
migrate_items_labels=ലേബലുകള്‍
migrate_items_issues=പ്രശ്നങ്ങൾ
migrate_items_pullrequests=ലയന അഭ്യർത്ഥനകൾ
migrate_items_releases=പ്രസിദ്ധീകരണങ്ങള്‍
migrate_repo=കലവറ മൈഗ്രേറ്റ് ചെയ്യുക
migrate.clone_address=URL- ൽ നിന്ന് മൈഗ്രേറ്റ് / ക്ലോൺ ചെയ്യുക
migrate.clone_address_desc=നിലവിലുള്ള ഒരു കലവറയുടെ HTTP(S) അല്ലെങ്കിൽ ഗിറ്റു് 'ക്ലോൺ' URL
migrate.clone_local_path=അല്ലെങ്കിൽ ഒരു പ്രാദേശിക സെർവർ പാത
migrate.permission_denied=പ്രാദേശിക കലവറകള്‍ ഇറക്കുമതി ചെയ്യാൻ നിങ്ങള്‍ക്കു് അനുവാദമില്ല.
migrate.invalid_local_path=പ്രാദേശിക പാത അസാധുവാണ്. ഇത് നിലവിലില്ല അല്ലെങ്കിൽ ഒരു ഡയറക്ടറിയല്ല.
migrate.failed=മൈഗ്രേഷൻ പരാജയപ്പെട്ടു: %v
migrate.lfs_mirror_unsupported=എൽ‌എഫ്‌എസ് ഒബ്‌ജക്റ്റുകളുടെ മിററിംഗ് പിന്തുണയ്‌ക്കുന്നില്ല - പകരം 'git lfs fetch --all', 'git lfs push --all' എന്നിവ ഉപയോഗിക്കുക.
migrate.migrate_items_options=ഗിറ്റ്ഹബിൽ നിന്ന് മൈഗ്രേറ്റ് ചെയ്യുമ്പോൾ, ഒരു ഉപയോക്തൃനാമവും മൈഗ്രേഷൻ ഓപ്ഷനുകളും നല്‍കാം.
migrated_from=<a href="%[1]s">%[2]s</a> നിന്ന് മൈഗ്രേറ്റുചെയ്‌തു
migrated_from_fake=%[1]s നിന്ന് മൈഗ്രേറ്റുചെയ്തു
mirror_from=ന്റെ കണ്ണാടി
forked_from=ല്‍ നിന്നും വഴിപിരിഞ്ഞതു്
fork_from_self=നിങ്ങളുടെ ഉടമസ്ഥതയിലുള്ള ഒരു ശേഖരം നിങ്ങൾക്ക് ഫോര്‍ക്കു് ചെയ്യാൻ കഴിയില്ല.
fork_guest_user=ഈ ശേഖരം ഫോർക്ക് ചെയ്യുന്നതിന് സൈൻ ഇൻ ചെയ്യുക.
copy_link=പകര്‍ത്തുക
copy_link_success=കണ്ണി പകർത്തി
copy_link_error=പകർത്താൻ ⌘C അല്ലെങ്കിൽ Ctrl-C ഉപയോഗിക്കുക
copied=പകര്‍ത്തല്‍ പൂര്‍ത്തിയായി
unwatch=ശ്രദ്ധിക്കാതിരിയ്ക്കുക
watch=ശ്രദ്ധിയ്ക്കുക
unstar=നക്ഷത്രം നീക്കുക
star=നക്ഷത്രം നല്‍ക്കുക
fork=ഫോര്‍ക്കു്
download_archive=കലവറ ഡൗൺലോഡുചെയ്യുക
no_desc=വിവരണം ലഭ്യമല്ല
quick_guide=ദ്രുത മാര്‍ഗദര്‍ശനം
clone_this_repo=ഈ കലവറ ക്ലോൺ ചെയ്യുക
create_new_repo_command=കമാൻഡ് ലൈന്‍ വഴി ഒരു പുതിയ കലവറ സൃഷ്ടിക്കുക
push_exist_repo=കമാൻഡ് ലൈനിൽ നിന്ന് നിലവിലുള്ള ഒരു കലവറ തള്ളിക്കയറ്റുക
empty_message=ഈ കലവറയില്‍ ഉള്ളടക്കമൊന്നും അടങ്ങിയിട്ടില്ല.
code=കോഡ്
code.desc=ഉറവിട കോഡ്, ഫയലുകൾ, കമ്മിറ്റുകളും ശാഖകളും പ്രവേശിയ്ക്കുക.
branch=ശാഖ
tree=മരം
filter_branch_and_tag=ശാഖ അല്ലെങ്കിൽ ടാഗ് അരിച്ചെടുക്കുക
branches=ശാഖകള്‍
tags=ടാഗുകള്‍
issues=പ്രശ്നങ്ങൾ
pulls=ലയന അഭ്യർത്ഥനകൾ
labels=ലേബലുകള്‍
milestones=നാഴികക്കല്ലുകള്‍
commits=കമ്മിറ്റുകള്‍
commit=കമ്മിറ്റ്
releases=പ്രസിദ്ധപ്പെടുത്തുക
file_raw=കലര്‍പ്പില്ലാത്തതു്
file_history=നാള്‍വഴി
file_view_raw=കലര്‍പ്പില്ലാതെ കാണുക
file_permalink=സ്ഥിരമായ കണ്ണി
file_too_large=ഈ ഫയൽ കാണിക്കാൻ കഴിയാത്തത്ര വലുതാണ്.
video_not_supported_in_browser=നിങ്ങളുടെ ബ്രൌസർ HTML5 'വീഡിയോ' ടാഗിനെ പിന്തുണയ്ക്കുന്നില്ല.
audio_not_supported_in_browser=നിങ്ങളുടെ ബ്ര browser സർ HTML5 'ഓഡിയോ' ടാഗിനെ പിന്തുണയ്ക്കുന്നില്ല.
stored_lfs=ഗിറ്റു് LFS ഉപയോഗിച്ച് സംഭരിച്ചു
commit_graph=കമ്മിറ്റ് ഗ്രാഫ്
blame=ചുമതല
normal_view=സാധാരണ കാഴ്ച
editor.new_file=പുതിയ ഫയൽ
editor.upload_file=ഫയൽ അപ്‌ലോഡ്
editor.edit_file=ഫയൽ തിരുത്തുക
editor.preview_changes=മാറ്റങ്ങൾ കാണുക
editor.cannot_edit_lfs_files=വെബ് ഇന്റർഫേസിൽ LFS ഫയലുകൾ എഡിറ്റുചെയ്യാൻ കഴിയില്ല.
editor.cannot_edit_non_text_files=വെബ് ഇന്റർഫേസിൽ ബൈനറി ഫയലുകൾ എഡിറ്റുചെയ്യാൻ കഴിയില്ല.
editor.edit_this_file=ഫയൽ തിരുത്തുക
editor.must_be_on_a_branch=ഈ ഫയലിൽ മാറ്റങ്ങൾ വരുത്താനോ നിർദ്ദേശിക്കാനോ നിങ്ങൾ ഏതെങ്കിലും ഒരു ശാഖയിൽ ആയിരിക്കണം.
editor.fork_before_edit=ഈ ഫയലിൽ മാറ്റങ്ങൾ വരുത്താനോ നിർദ്ദേശിക്കാനോ നിങ്ങൾ ഈ ശേഖരം ഫോര്‍ക്കു ചെയ്തിരിക്കണം.
editor.delete_this_file=ഫയൽ ഇല്ലാതാക്കുക
editor.must_have_write_access=ഈ ഫയലിൽ മാറ്റങ്ങൾ വരുത്താനോ നിർദ്ദേശിക്കാനോ നിങ്ങൾക്ക് എഴുതാനുള്ള അനുമതി ഉണ്ടായിരിക്കണം.
editor.file_delete_success=%s ഫയൽ ഇല്ലാതാക്കി.
editor.name_your_file=നിങ്ങളുടെ ഫയലിന് പേര് നൽകുക…
editor.filename_help=ഒരു ഡയറക്‌ടറിയുടെ പേര് ടൈപ്പുചെയ്‌ത് സ്ലാഷും ('/') ചേർത്ത് ചേർക്കുക. ഇൻപുട്ട് ഫീൽഡിന്റെ തുടക്കത്തിൽ ബാക്ക്‌സ്‌പെയ്‌സ് ടൈപ്പുചെയ്‌ത് ഒരു ഡയറക്‌ടറി നീക്കംചെയ്യുക.
editor.or=അഥവാ
editor.cancel_lower=റദ്ദാക്കുക
editor.commit_changes=മാറ്റങ്ങൾ വരുത്തുക
editor.add_tmpl='<ഫയല്‍>' ചേർക്കുക
editor.add=%s ചേര്‍ക്കുക
editor.update=%s പുതുക്കുക
editor.delete=%s നീക്കം ചെയ്യുക
editor.propose_file_change=ഫയലിനു് മാറ്റങ്ങള്‍ നിർദ്ദേശിക്കുക
editor.new_branch_name_desc=പുതിയ ശാഖയുടെ പേരു്…
editor.cancel=റദ്ദാക്കുക
editor.filename_cannot_be_empty=ഫയലിന്റെ പേരു് ശൂന്യമായിരിക്കരുത്.
editor.add_subdir=ഒരു ഡയറക്ടറി ചേർക്കുക…
editor.upload_files_to_dir=ഫയലുകൾ %s ലേക്ക് അപ്‌ലോഡുചെയ്യുക
issues.new.clear_labels=ലേബലുകൾ മായ്‌ക്കുക
issues.new.milestone=നാഴികക്കല്ല്
issues.new.no_milestone=നാഴികക്കല്ല് ഇല്ല
issues.new.clear_milestone=നാഴികക്കല്ല് എടുത്തു മാറ്റുക
issues.new.open_milestone=നാഴികക്കല്ലുകൾ തുറക്കുക
issues.new.closed_milestone=അടച്ച നാഴികക്കല്ലുകൾ
issues.new.assignees=നിശ്ചയിക്കുന്നവര്‍
issues.new.clear_assignees=നിശ്ചയിക്കുന്നവരെ നീക്കം ചെയ്യുക
issues.new.no_assignees=നിശ്ചയിക്കുന്നവര്‍ ഇല്ല
issues.no_ref=ശാഖാ അഥവാ ടാഗ് വ്യക്തമാക്കിയിട്ടില്ല
issues.create=പ്രശ്നം സൃഷ്ടിക്കുക
issues.new_label=പുതിയ അടയാളം
issues.new_label_placeholder=അടയാള നാമം
issues.new_label_desc_placeholder=വിരരണം
issues.create_label=അടയാളം സൃഷ്ടിക്കുക
issues.label_templates.title=മുൻ‌നിശ്ചയിച്ച ഒരു കൂട്ടം ലേബലുകൾ‌ നിറയ്‌ക്കുക
issues.label_templates.info=ലേബലുകളൊന്നും ഇതുവരെ നിലവിലില്ല. 'പുതിയ ലേബൽ' ഉപയോഗിച്ച് ഒരു ലേബൽ സൃഷ്ടിക്കുക അല്ലെങ്കിൽ മുൻ‌നിശ്ചയിച്ച ലേബൽ സെറ്റ് ഉപയോഗിക്കുക:
issues.label_templates.helper=ഒരു ലേബൽ സെറ്റ് തിരഞ്ഞെടുക്കുക
issues.label_templates.use=ലേബൽ സെറ്റ് ഉപയോഗിക്കുക
issues.deleted_milestone=`(ഇല്ലാതാക്കി)`
issues.filter_type.all_issues=എല്ലാ ഇഷ്യൂകളും
issues.label_open_issues=%d തുറന്നനിലയിലുള്ള ഇഷ്യൂകള്‍
issues.label_deletion_desc=ഒരു ലേബൽ ഇല്ലാതാക്കിയാല്‍, അതു് നിയുകതമാക്കിയ എല്ലാ ഇഷ്യൂകളില്‍ നിന്നും നീക്കംചെയ്യും. തുടരട്ടെ?
issues.dependency.issue_closing_blockedby=ഈ ലയന അഭ്യര്‍ത്ഥന അടയ്‌ക്കുന്നത് ഇനിപ്പറയുന്ന ഇഷ്യൂകള്‍ തടയുന്നു്
issues.dependency.pr_closing_blockedby=ഈ ഇഷ്യു അടയ്‌ക്കുന്നത് ഇനിപ്പറയുന്ന ലയന അഭ്യര്‍ത്ഥന തടയുന്നു്
issues.dependency.issue_close_blocks=ഈ ഇഷ്യു അടയ്‌ക്കുന്നത് ഇനിപ്പറയുന്ന ഇഷ്യൂകള്‍ തടയുന്നു്
issues.dependency.pr_close_blocks=ഈ ഇഷ്യൂകള്‍ അടയ്‌ക്കുന്നത് ഈ ലയന അഭ്യര്‍ത്ഥന തടയുന്നു്
issues.dependency.issue_close_blocked=ഈ ഇഷ്യൂ അടയ്‌ക്കുന്നതിന് മുമ്പ് ഇതിനെ തടയുന്ന എല്ലാ ഇഷ്യൂകളും നിങ്ങൾ അടയ്‌ക്കേണ്ടതുണ്ട്.
issues.dependency.pr_close_blocked=ഈ ലയന അഭ്യര്‍ത്ഥന സ്ഥിരീകരിയ്ക്കുന്നതിനു മുമ്പ് ഇതിനെ തടയുന്ന എല്ലാ ഇഷ്യൂകളും നിങ്ങൾ അടയ്‌ക്കേണ്ടതുണ്ട്.
issues.dependency.setting=ലയന അഭ്യര്‍ത്ഥനകള്‍ക്കും ഇഷ്യൂകള്‍ക്കുമായി ആശ്രിതത്വം സജ്ജമാക്കുക
issues.dependency.add_error_cannot_create_circular=രണ്ട് ഇഷ്യൂകളും പരസ്പരം തടയുന്നതാകുന്നതിലൂടെ നിങ്ങൾക്ക് ഒരു ആശ്രയത്വം സൃഷ്ടിക്കാൻ കഴിയില്ല.
issues.dependency.add_error_dep_not_same_repo=രണ്ട് പ്രശ്നങ്ങളും ഒരേ കലവറയിലേതു് ആയിരിക്കണം.
milestones.filter_sort.most_issues=മിക്ക ഇഷ്യൂകളും
milestones.filter_sort.least_issues=കുറഞ്ഞ ഇഷ്യൂകളെങ്കിലും
activity.active_issues_count_n=<strong>%d</strong> സജ്ജീവ ഇഷ്യൂകള്‍
activity.closed_issues_count_n=അടച്ച ഇഷ്യൂകള്‍
activity.title.issues_n=%d ഇഷ്യൂകള്‍
activity.new_issues_count_n=പുതിയ ഇഷ്യൂകള്‍
settings.event_issues=ഇഷ്യൂകള്‍
[org]
[admin]
repos.issues=ഇഷ്യൂകള്‍
[action]
[tool]
[dropzone]
[notification]
[gpg]
[units]

2107
conf/locale/locale_nl-NL.ini Normal file

File diff suppressed because it is too large Load Diff

2332
conf/locale/locale_pl-PL.ini Normal file

File diff suppressed because it is too large Load Diff

2235
conf/locale/locale_pt-BR.ini Normal file

File diff suppressed because it is too large Load Diff

2351
conf/locale/locale_pt-PT.ini Normal file

File diff suppressed because it is too large Load Diff

2306
conf/locale/locale_ru-RU.ini Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,732 @@
home=Почетна
dashboard=Контролни панел
explore=Преглед
help=Помоћ
sign_in=Пријавите Се
sign_out=Одјава
register=Регистрација
website=Веб-страница
version=Верзија
page=Страница
template=Шаблон
language=Језик
signed_in_as=Пријављени сте као
username=Корисничко име
password=Лозинка
repository=Спремиште
organization=Организација
mirror=Огледало
new_repo=Ново спремиште
new_migrate=Нова миграција
new_mirror=Ново огледало
new_org=Нова организација
manage_org=Управљање организацијама
account_settings=Подешавања налога
settings=Подешавања
activities=Активности
pull_requests=Захтеви за спајање
issues=Дискусије
cancel=Откажи
[error]
[startpage]
[install]
install=Инсталација
db_title=Подешавања базе
db_type=Тип базе података
host=Хост
password=Лозинка
db_name=Име базе података
path=Пут
repo_path=Пут до корена спремишта
log_root_path=Пут до журнала
optional_title=Напредна подешавања
smtp_host=SMTP сервер
federated_avatar_lookup_popup=Омогућите federated avatars lookup да би сте користили федеративни сервис помоћу libravatar.
enable_captcha_popup=Тражи Captcha приликом регистрације корисника.
admin_password=Лозинка
confirm_password=Потврдите лозинку
install_btn_confirm=Успостави Gitea
test_git_failed=Команда 'git' није успела: %v
[home]
password_holder=Лозинка
switch_dashboard_context=Пребаците контекст контролној панели
collaborative_repos=Заједничка спремишта
my_orgs=Моје организације
my_mirrors=Моја огледала
view_home=Прикажи %s
issues.in_your_repos=У вашим спремиштима
[explore]
repos=Спремишта
users=Корисници
search=Претрага
[auth]
register_helper_msg=Већ имате налог? Пријавите се!
remember_me=Запамти ме
active_your_account=Активирајте ваш налог
has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (<b>%s</b>). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме.
resend_mail=Кликните овде да поново пошаљете писмо
[mail]
activate_account=Молимо вас активирајте ваш налог
activate_email=Потврдите вашу адресу е-поште
[modal]
yes=Да
no=Не
[form]
UserName=Корисничко име
RepoName=Име спремишта
Email=Адреса ел. поште
Password=Лозинка
SSHTitle=Име SSH кључа
HttpsUrl=HTTPS URL адреса
PayloadUrl=URL адреса за слање
TeamName=Име тима
AuthName=Ауторизацијско име
AdminEmail=Адреса е-поште администратора
NewBranchName=Име нове гране
CommitSummary=Опис за ревизију
CommitMessage=Ревизни текст
CommitChoice=Избор ревизије
TreeName=Пут до датотеке
Content=Садржај
require_error=` не може бити празно.`
size_error=` мора бити величине %s.`
min_size_error=` мора да садржи најмање %s карактера.`
max_size_error=` мора да садржи највише %s карактера.`
email_error=` није важећа адреса е-поште.`
url_error=` није исправна URL адреса.`
include_error=` мора да садржи текст '%s'.`
unknown_error=Непозната грешка:
auth_failed=Грешка идентитета: %v
target_branch_not_exist=Ова грана не постоји.
[user]
join_on=Регистриран
repositories=Спремишта
activity=Активности
followers=Пратиоци
following=Пратим
follow=Прати
unfollow=Престани да пратиш
[settings]
profile=Профил
password=Лозинка
avatar=Аватар
social=Налози на друштвеним мрежама
delete=Уклоните налог
public_profile=Јавни профил
full_name=Име и презиме
website=Веб страница
location=Локација
update_profile=Ажурирај профил
continue=Настави
cancel=Откажи
federated_avatar_lookup=Federated Avatar претрага
enable_custom_avatar=Укључи ваш аватар
choose_new_avatar=Изаберите нови аватар
delete_current_avatar=Обришите тренутни аватар
old_password=Тренутна лозинка
new_password=Нова лозинка
emails=Адреса ел. поште
email_desc=Ваша главна адреса ће се користити за обавештења и других операција.
primary=Главно
manage_ssh_keys=Управљање SSH кључева
add_key=Додај кључ
add_new_key=Додај SSH кључ
key_name=Име кључа
key_content=Садржај
add_on=Додато
last_used=Задње корршћено
no_activity=Нема недавних активности
manage_social=Управљање прикључених друштвеним мрежама
generate_new_token=Генериши нови токен
token_name=Име токена
generate_token=Генериши токен
delete_token=Уклони
delete_account=Уклоните ваш налог
confirm_delete_account=Потврдите брисање
[repo]
owner=Власник
repo_name=Име спремишта
visibility=Видљивост
fork_repo=Креирај огранак спремишта
fork_from=Огранак од
repo_desc=Опис
repo_lang=Језик
license=Лиценца
create_repo=Ново спремиште
default_branch=Главна грана
mirror_prune=Очисти
watchers=Посматрачи
stargazers=Пратиоци
forks=Огранци
migrate_type=Тип миграције
migrate_type_helper=Ово спремиште ће бити <span class="text blue">огледало</span>
migrate_repo=Мигрирајте спремиште
migrate.permission_denied=Немате права на увезете локално спремиште.
migrate.failed=Миграција није успела: %v
mirror_from=огледало од
forked_from=изданак од
copy_link=Копирај
copied=Успешно ископирано
unwatch=Престани пратити
watch=Прати
unstar=Улкони звезду
star=Волим
fork=Креирај огранак
no_desc=Нема описа
quick_guide=Кратак водич
clone_this_repo=Клонирај спремиште
code=Код
branch=Грана
tree=Дрво
filter_branch_and_tag=Профилтрирај по грани или ознаци
branches=Гране
tags=Ознаке
issues=Дискусије
pulls=Захтеви за спајање
labels=Лабеле
milestones=Фазе
commits=Комити
releases=Издања
file_raw=Датотека
file_history=Историја
file_view_raw=Прегледај саму датотеку
file_permalink=Пермалинк
editor.preview_changes=Преглед промена
editor.or=или
editor.commit_changes=Изврши комит промена
editor.add=Додај '%s'
editor.update=Ажурирај '%s'
editor.delete=Уклони '%s'
editor.commit_directly_to_this_branch=Изврши комит директно на <strong class="branch-name">%s</strong> грану.
editor.create_new_branch=Креирај <strong>нову грану</strong> за овај комит и поднеси захтев за спајање.
editor.cancel=Откажи
editor.branch_already_exists=Грана '%s' већ постоји за ово спремиште.
editor.no_changes_to_show=Нема никаквих промена.
editor.fail_to_update_file=Промена над '%s' није успело са грешком: %v
editor.unable_to_upload_files=Учитање датотеке '%s' није успело са грешкном: %v
editor.upload_files_to_dir=Пошаљи датотеке на '%s'
commits.commits=Комити
commits.author=Аутор
commits.message=Порука
commits.date=Датум
commits.older=Старије
commits.newer=Новије
issues.new=Нови задатак
issues.new.labels=Лавеле
issues.new.no_label=Нема лабеле
issues.new.clear_labels=Уклони лабеле
issues.new.milestone=Фаза
issues.new.no_milestone=Нема фазе
issues.new.clear_milestone=Уклони фазу
issues.new.open_milestone=Отворене фазе
issues.new.closed_milestone=Затворене фазе
issues.create=Додај задатак
issues.new_label=Нова лабела
issues.create_label=Креирај лабелу
issues.label_templates.title=Преузмите унапред дефинисани скуп лабела
issues.label_templates.helper=Изаберите скуп лабела
issues.label_templates.fail_to_load_file=Није могуће преузети датотеку '%s': %v
issues.open_tab=%d отворено
issues.close_tab=%d затворено
issues.filter_label=Лабела
issues.filter_milestone=Фаза
issues.filter_assignee=Одговорни
issues.filter_type=Тип
issues.filter_type.all_issues=Сви задаци
issues.filter_type.assigned_to_you=Заказано вама
issues.filter_type.created_by_you=креирано од вас
issues.filter_type.mentioning_you=Помењује вас
issues.filter_sort=Сортирај
issues.filter_sort.latest=Најновије
issues.filter_sort.oldest=Најстарије
issues.filter_sort.recentupdate=Недавно ажурирано
issues.filter_sort.leastupdate=Давно ажуриано
issues.filter_sort.mostcomment=Највише коментара
issues.filter_sort.leastcomment=Најмање коментара
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.num_comments=%d коментара
issues.commented_at=`коментирира <a href="#%s">%s</a>`
issues.delete_comment_confirm=Да ли желите да избришете овај коментар?
issues.no_content=Још нема садржаја.
issues.close_issue=Затвори
issues.reopen_issue=Поново отвори
issues.create_comment=Коментирај
issues.commit_ref_at=`поменуо овај задатак у комит <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.poster=Аутор
issues.collaborator=Коаутор
issues.owner=Власник
issues.sign_in_require_desc=<a href="%s">Пријавите се</a> да се прикључе у овом разговору.
issues.edit=Уреди
issues.cancel=Откажи
issues.save=Сачувај
issues.label_title=Име лабеле
issues.label_color=Боја лабеле
issues.label_count=%d лабела
issues.label_open_issues=%d отворених задатака
issues.label_edit=Уреди
issues.label_delete=Уклони
issues.num_participants=%d учесника
issues.attachment.open_tab=`Кликните "%s" да видите у новом прозору`
issues.attachment.download=`Кликните да преузмете "%s"`
pulls.new=Нови захтев за спајање
pulls.filter_branch=Филтер по грани
pulls.no_results=Нема резултата.
pulls.create=Поднеси захтев за спајање
pulls.merged_title_desc=споји(ла) %[1]d комит(е) из <code>%[2]s</code> у <code>%[3]s</code> %[4]s
pulls.tab_conversation=Дискусија
pulls.tab_commits=Комити
pulls.merged=Спојено
pulls.can_auto_merge_desc=Овај захтев за спајање може бити обављен аутоматски.
pulls.merge_pull_request=Обави спајање
milestones.new=Нова фаза
milestones.open_tab=%d отворено
milestones.close_tab=%d затворено
milestones.closed=Затворено %s
milestones.no_due_date=Рок није наведен
milestones.open=Отвори
milestones.close=Затвори
milestones.create=Креирај фазу
milestones.title=Наслов
milestones.desc=Опис
milestones.due_date=Датум завршетка (опционо)
milestones.clear=Уклони
milestones.edit=Ажурирај фазу
milestones.cancel=Откажи
wiki=Вики
wiki.page=Страница
wiki.filter_page=Филтер странице
wiki.save_page=Сачувај страницу
wiki.last_commit_info=%s урећивао ову страницу %s
wiki.edit_page_button=Уреди
wiki.new_page_button=Нова страница
wiki.delete_page_button=Уклони страницу
wiki.page_already_exists=Страница са овим именом већ постоји.
wiki.pages=Странице
wiki.last_updated=Последње ажурирано %s
settings=Подешавања
settings.collaboration.write=За писање
settings.collaboration.read=Читање
settings.collaboration.undefined=Није дефинисано
settings.githooks=Git хуки
settings.basic_settings=Основна подешавања
settings.mirror_settings=Подешавања огледала
settings.update_settings=Примени промене
settings.advanced_settings=Напредна подешавања
settings.external_wiki_url=URL адреса спољног Вики
settings.tracker_url_format=Спољни формат везе система за праћење грешака
settings.tracker_issue_style.numeric=Нумерично
settings.tracker_issue_style.alphanumeric=Алфанумерично
settings.danger_zone=Опасна зона
settings.new_owner_has_same_repo=Нови власник већ има спремиште по истим називом. Молимо вас изаберите друго име.
settings.transfer=Пренеси власништво
settings.delete=Уклони ово спремиште
settings.delete_notices_1=- Ова операција <strong>НЕЋЕ МОЧИ</strong> бити укинута.
settings.transfer_owner=Нови власник
settings.add_webhook=Додај Webhook
settings.webhook.test_delivery=Провери испоруку
settings.webhook.request=Захтев
settings.webhook.response=Одговор
settings.webhook.headers=Наслови
settings.webhook.body=Тело
settings.githook_edit_desc=о Webhook није активан, примерни садржај ће бити представљен. Ако оставите празно, Webhook ће бити онемогућен.
settings.githook_name=Име Hook-а
settings.githook_content=Садржај Hook-а
settings.update_githook=Ажурирај Hook
settings.secret=Тајна
settings.slack_username=Корисничко име
settings.slack_icon_url=URL адреса иконице
settings.slack_color=Боја
settings.event_create=Креирај
settings.event_pull_request=Захтев за спајање
settings.update_webhook=Ажурирај Webhook
settings.recent_deliveries=Недавне испоруке
settings.hook_type=Тип Hook-а
settings.slack_token=Токен
settings.slack_domain=Домен
settings.slack_channel=Канал
settings.deploy_keys=Кључеви за распоређивање
settings.add_deploy_key=Додај кључ за распоређивање
settings.title=Наслов
settings.deploy_key_content=Садржај
diff.browse_source=Преглед изворни кода
diff.parent=родитељ
diff.commit=комит
diff.show_split_view=Подељен поглед
diff.show_unified_view=Један поглед
diff.stats_desc=<strong> %d измењених фајлова</strong> са <strong>%d додато</strong> и <strong>%d уклоњено</strong>
diff.view_file=Прегледај датотеку
diff.file_suppressed=Разлика између датотеке није приказан због своје велике величине
diff.too_many_files=Неке датотеке нису приказане због велике количине промена
release.releases=Издања
release.new_release=Ново издање
release.draft=Нацрт
release.prerelease=Пред-верзија
release.stable=Стабилно
release.edit=уреди
release.source_code=Изворни код
release.tag_name=Име ознаке
release.target=Циљ
release.title=Наслов
release.content=Садржај
release.cancel=Откажи
release.publish=Објави издање
release.save_draft=Сачувај нацрт
release.downloads=Преузимања
[org]
org_name_holder=Име организације
org_full_name_holder=Пун назив организације
create_org=Створи Организацију
repo_updated=Ажурирано
people=Особе
teams=Тимови
lower_members=чланови
lower_repositories=спремишта
org_desc=Опис
team_name=Име тима
team_desc=Опис
settings=Подешавања
settings.full_name=Пуно име
settings.website=Саит
settings.location=Локација
settings.update_settings=Ажурирај подешавања
settings.delete=Уклони организацију
settings.delete_account=Уклони ову организацију
settings.confirm_delete_account=Потврди брисање
members.membership_visibility=Видљивост:
members.member_role=Улога учесника:
members.owner=Власник
members.member=Члан
members.remove=Уклони
members.leave=Изађи
members.invite_desc=Додја новог члана %s:
members.invite_now=Позовите сада
teams.join=Придружи се
teams.leave=Изаћи
teams.read_access=Приступ за читање
teams.write_access=Приступ за писање
teams.no_desc=Овај тим нема описа
teams.settings=Подешавања
teams.members=Чланови тима
teams.update_settings=Примени промене
teams.add_team_member=Додај члан тиму
teams.repositories=Тимска спремишта
teams.add_nonexistent_repo=Овакво спремиште не постоји, молим вас прво да га направите.
[admin]
dashboard=Контролни панел
organizations=Организације
repositories=Спремишта
config=Подешавања
notices=Системска обавештења
monitor=Праћење
first_page=Први
last_page=Последњи
total=Укупно: %d
dashboard.operation_name=Име операције
dashboard.operation_switch=Пребаци
dashboard.operation_run=Покрени
dashboard.server_uptime=Време непрекидног рада сервера
dashboard.current_goroutine=Тренутнe Goroutine
dashboard.current_memory_usage=Тренутна употреба меморије
dashboard.total_memory_allocated=Укупно меморије алоцирано
dashboard.memory_obtained=Коришћена меморија
dashboard.pointer_lookup_times=Захтева показивача
dashboard.current_heap_usage=Тренутна употреба динамичке меморије
dashboard.heap_memory_obtained=Слободно динамичке меморије
dashboard.heap_memory_idle=Неактиво динамичке меморије
dashboard.heap_memory_in_use=Динамичка меморија у употреби
dashboard.heap_memory_released=Ослобођено динамичке меморије
dashboard.heap_objects=Објекти динамичке меморије
dashboard.bootstrap_stack_usage=Коришћење стек меморије
dashboard.stack_memory_obtained=Слободно стек меморије
dashboard.mspan_structures_usage=Употреба структуре MSpan
dashboard.mspan_structures_obtained=Добијено структуре MSpan
dashboard.mcache_structures_usage=Употреба структурa MCache
dashboard.mcache_structures_obtained=Добијено структурa MCache
dashboard.profiling_bucket_hash_table_obtained=Хеш-таблеа постигнуто за Profiling Bucket
dashboard.gc_metadata_obtained=Добијених метаподатака cакупљању смећа
dashboard.other_system_allocation_obtained=Добијено друга системска меморија
dashboard.next_gc_recycle=Следећа рециклажа cакупљању смећа
dashboard.last_gc_time=Времена од прошлог cакупљању смећа
dashboard.total_gc_time=Укупно време cакупљању смећа
dashboard.total_gc_pause=Укупно време cакупљању смећа
dashboard.last_gc_pause=Задња пауза у cакупљању смећа
dashboard.gc_times=Времена cакупљању смећа
users.activated=Активиран
users.admin=Администратор
users.repos=Спремишта
users.created=Креирано
users.edit=Уреди
users.auth_source=Извор аутентикације
users.local=Локално
orgs.name=Име
orgs.teams=Тимови
orgs.members=Чланови
repos.owner=Власник
repos.name=Име
repos.private=Приватно
repos.stars=Фаворити
repos.issues=Задаци
auths.name=Име
auths.type=Тип
auths.enabled=Омогућено
auths.updated=Ажурирано
auths.auth_type=Врста провере аутентичности
auths.auth_name=Име провере аутентичности
auths.security_protocol=Протокол безбедности
auths.domain=Домен
auths.host=Хост
auths.port=Порт
auths.bind_password=Bind лозинкa
auths.user_base=База претраживање корисника
auths.user_dn=DN корисника
auths.filter=Филтер корисника
auths.admin_filter=Филтер администратора
auths.smtp_auth=Тип SMTP аутентикације
auths.smtphost=SMTP хост
auths.smtpport=SMTP порт
auths.allowed_domains=Дозвољени домени
auths.enable_tls=Омогући TLS шифровање
auths.skip_tls_verify=Прескочи TLS проверу
auths.pam_service_name=Назив PAM сервиса
auths.enable_auto_register=Омогући аутоматску регистрацију
auths.tips=Савети
config.server_config=Конфигурација сервера
config.disable_router_log=Онемогући журнал рутера
config.run_mode=Режим извршавања
config.repo_root_path=Пут до корена спремишта
config.static_file_root_path=Пут до статичке датотеке
config.script_type=Врста скрипта
config.reverse_auth_user=Корисничко име при обрнуту аутентикацију
config.ssh_config=SSH конфигурација
config.ssh_enabled=Омогућено
config.ssh_port=Порт
config.ssh_listen_port=Порт за слушање
config.ssh_root_path=Основни пут
config.ssh_key_test_path=Пут до кључу
config.ssh_keygen_path=Пут до генератор кључева ('ssh-keygen')
config.ssh_minimum_key_size_check=Минимална величина провера кључа
config.ssh_minimum_key_sizes=Минимална величина кључева
config.db_config=Конфигурација базе података
config.db_type=Тип
config.db_host=Хост
config.db_name=Име
config.db_path=Пут
config.service_config=Подешавања сервиса
config.show_registration_button=Прикажи дугме за регистрацију
config.disable_key_size_check=Онемогући проверу на минималној величини кључа
config.active_code_lives=Дужина живота активних кодова
config.webhook_config=Подешавања Webhook
config.queue_length=Дужина реда
config.deliver_timeout=Време до отказивање слања
config.mailer_enabled=Омогућено
config.mailer_disable_helo=Онемогући HELO
config.mailer_name=Име
config.mailer_host=Хост
config.mailer_user=Корисник
config.oauth_config=Подешавања OAuth
config.oauth_enabled=Укључено
config.cache_config=Подешавања кеша
config.cache_adapter=Кеш адаптер
config.cache_interval=Кеш интервал
config.cache_conn=Кеш на вези
config.session_config=Подешавања сесије
config.session_provider=Добављач сесија
config.provider_config=Конфигурација на добављачу
config.cookie_name=Име датотеке cookie
config.enable_set_cookie=Укључи поставку cookie
config.gc_interval_time=Интервал cакупљања смећа
config.session_life_time=Дужина живота сесјие
config.https_only=Само HTTPS
config.cookie_life_time=Дужина живота датотеке cookie
config.picture_service=Услуга за слике
config.disable_gravatar=Онемогући Gravatar
config.enable_federated_avatar=Омогући Federated Avatars
config.git_config=Git конфигурација
config.git_disable_diff_highlight=Онемогући бојење синтаксе када гледате разлике
config.git_max_diff_lines=Максималан број различитих редова (у датотеци)
config.git_max_diff_line_characters=Максималан број различитих карактера (у реду)
config.git_max_diff_files=Максималан број измењених датотека (приказаних)
config.git_gc_args=Аргументи на cакупљање смећа
config.git_migrate_timeout=Време до отказања миграције
config.git_mirror_timeout=Време до отазање синхронизацији огледала
config.git_clone_timeout=Време до отказивања клонирањем
config.git_pull_timeout=Време до отказивања pull операцији
config.git_gc_timeout=Време до отказивања cакупљање смећа
config.log_config=Kонфигурација журнала
config.log_mode=Режим журналовања
monitor.cron=Cron задаци
monitor.name=Име
monitor.schedule=Распоред
monitor.next=Следећи пут
monitor.previous=Претходни пут
monitor.process=Покренути процеси
monitor.desc=Опис
monitor.start=Почетно време
monitor.execute_time=Време извршивања
notices.system_notice_list=Системска обавештавања
notices.actions=Акције
notices.select_all=Изабери све
notices.deselect_all=Уклоните избор свих
notices.inverse_selection=Обрна селекција
notices.delete_selected=Избриши изабране
notices.delete_all=Уклони сва обавештења
notices.type=Тип
notices.type_1=Спремиште
notices.desc=Опис
notices.op=Oп.
[action]
create_repo=креира спремиште <a href="%s">%s</a>
rename_repo=преимензје спремиште од <code>%[1]s</code> на <a href="%[2]s">%[3]s</a>
create_issue=`отвара задатак <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue=`затвара задатак <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue=`поново отвара задатак <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request=`шаље захтев за спајање <a href="%s/pulls/%s">%s#%[2]s</a>`
close_pull_request=`затвара захтев за спајање <a href="%s/pulls/%s">%s#%[2]s</a>`
reopen_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>
[tool]
ago=пре %s
from_now=од сада %s
now=сада
1s=1 секунд
1m=1 минут
1h=1 час
1d=1 дан
1w=1 недеља
1mon=1 месец
1y=1 година
seconds=%d секунди
minutes=%d минута
hours=%d часа
days=%d дана
weeks=%d недеља
months=%d месеци
years=%d година
raw_seconds=секунди
raw_minutes=минута
[dropzone]
remove_file=Уклони датотеку
[notification]
[gpg]
[units]

2113
conf/locale/locale_sv-SE.ini Normal file

File diff suppressed because it is too large Load Diff

2388
conf/locale/locale_tr-TR.ini Normal file

File diff suppressed because it is too large Load Diff

2262
conf/locale/locale_uk-UA.ini Normal file

File diff suppressed because it is too large Load Diff

2353
conf/locale/locale_zh-CN.ini Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,875 @@
home=首頁
dashboard=控制面版
explore=探索
help=說明
sign_in=登入
sign_out=登出
link_account=連結帳戶
register=註冊
website=網站
version=版本
page=頁面
template=樣板
language=語言
notifications=訊息
password=密碼
passcode=驗證碼
repository=儲存庫
organization=組織
mirror=鏡像
new_repo=新增儲存庫
new_migrate=遷移外部儲存庫
new_mirror=新鏡像
new_fork=Fork 新的儲存庫
new_org=新增組織
manage_org=管理組織
account_settings=帳號設定
settings=設定
all=所有
sources=來源
mirrors=鏡像
collaborative=協同者
forks=複製列表
activities=活動
pull_requests=合併請求
issues=問題
cancel=取消
[error]
[startpage]
[install]
install=安裝頁面
db_title=資料庫設定
db_type=資料庫類型
host=主機
password=密碼
db_name=資料庫名稱
path=資料庫文件路徑
repo_path=儲存庫的根目錄
log_root_path=日誌路徑
optional_title=可選設定
smtp_host=SMTP 主機
federated_avatar_lookup_popup=開啟聯合頭像查詢並使用基於開放源碼的 libravatar 服務
enable_captcha_popup=要求在用戶註冊時輸入驗證碼
admin_password=管理員密碼
confirm_password=確認密碼
install_btn_confirm=立即安裝
test_git_failed=無法識別 'git' 命令:%v
save_config_failed=儲存設定失敗:%v
[home]
password_holder=密碼
switch_dashboard_context=切換控制面版用戶
collaborative_repos=參與協作的儲存庫
my_orgs=我的組織
my_mirrors=我的鏡像
view_home=訪問 %s
issues.in_your_repos=屬於該用戶儲存庫的
[explore]
repos=儲存庫
users=使用者
organizations=組織
search=搜尋
[auth]
register_helper_msg=已經註冊?立即登錄!
remember_me=記住登錄
forgot_password_title=忘記密碼
forgot_password=忘記密碼?
confirmation_mail_sent_prompt=一封新的確認郵件已發送至 <b>%s</b>。請檢查您的收件箱並在 %s 小時內完成確認註冊操作。
active_your_account=啟用您的帳戶
has_unconfirmed_mail=%s 您好,您有一封發送至( <b>%s</b>) 但未被確認的郵件。如果您未收到啟用郵件,或需要重新發送,請單擊下方的按鈕。
resend_mail=單擊此處重新發送確認郵件
email_not_associate=此電子郵件地址未與任何帳戶連結
verify=驗證
scratch_code=備用碼
use_scratch_code=使用備用碼
twofa_scratch_used=你已經使用了你的備用碼。你將會被轉到兩步驟驗證設定頁面以便移除你已註冊設備或重新產生新的備用碼。
twofa_scratch_token_incorrect=您的備用碼不正確
openid_connect_submit=連接
openid_connect_title=連接到現有帳戶
openid_register_title=建立新帳戶
[mail]
activate_account=請啟用您的帳戶
activate_email=請驗證您的郵箱地址
register_success=註冊成功
register_notify=歡迎來到 Gitea
[modal]
yes=確認操作
no=取消操作
[form]
UserName=使用者名稱
RepoName=儲存庫名稱
Email=郵箱地址
Password=密碼
SSHTitle=SSH 金鑰名稱
HttpsUrl=HTTPS URL 地址
PayloadUrl=推送地址
TeamName=團隊名稱
AuthName=認證名稱
AdminEmail=管理員郵箱
NewBranchName=新的分支名稱
CommitSummary=提交摘要
CommitMessage=提交訊息
CommitChoice=提交選擇
TreeName=檔案路徑
Content=內容
require_error=不能為空。
size_error=長度必須為 %s。
min_size_error=長度最小為 %s 個字符。
max_size_error=長度最大為 %s 個字符。
email_error=不是一個有效的郵箱地址。
url_error=不是一個有效的 URL。
include_error=必須包含子字符串 '%s'。
unknown_error=未知錯誤:
user_not_exist=該使用者名稱並不存在
auth_failed=授權驗證失敗:%v
target_branch_not_exist=目標分支不存在
[user]
join_on=加入於
repositories=儲存庫列表
activity=公開活動
followers=關註者
following=關註中
follow=關注
unfollow=取消關注
form.name_reserved=這個使用者名稱已被系統保留,請改用其他名稱。
[settings]
profile=個人訊息
password=修改密碼
avatar=頭像
ssh_gpg_keys=SSH / GPG 金鑰
social=社交帳號綁定
delete=刪除帳戶
twofa=兩步驟驗證
uid=使用者 ID
public_profile=公開訊息
full_name=自定義名稱
website=個人網站
location=所在地區
update_profile=更新訊息
update_profile_success=您的個人資料已被更新
continue=繼續操作
cancel=取消操作
federated_avatar_lookup=Federated Avatar 查詢
enable_custom_avatar=啟動自定義頭像
choose_new_avatar=選擇新的頭像
delete_current_avatar=刪除當前頭像
old_password=當前密碼
new_password=新的密碼
emails=電子郵件地址
email_desc=您的主要邮箱地址将被用于通知提醒和其它操作。
primary=主要
add_openid=新增 OpenID URI
manage_ssh_keys=管理 SSH 金鑰
manage_gpg_keys=管理 GPG 金鑰
add_key=增加金鑰
ssh_helper=<strong>需要協助?</strong> 查詢GitHub的文件以 <a href="%s">您自有SSH金鑰</a> or solve <a href="%s">common problems</a> you may encounter using SSH.
gpg_helper=<strong>需要協助嗎?</strong>建議可看看 GitHub 的 <a href="%s">about GPG</a> 文件。
add_new_key=增加 SSH 金鑰
add_new_gpg_key=新增 GPG 金鑰
subkeys=次金鑰
key_id=金鑰 ID
key_name=金鑰名稱
key_content=金鑰內容
add_on=增加於
valid_until=有效期至
valid_forever=永遠有效
last_used=上次使用在
no_activity=沒有最近活動
key_state_desc=該金鑰在 7 天內被使用過
token_state_desc=此 token 在過去七天內曾經被使用過
show_openid=在設定檔顯示
hide_openid=從設定檔隱藏
manage_social=管理關聯社交帳戶
generate_new_token=生成新的令牌
token_name=令牌名稱
generate_token=生成令牌
delete_token=删除令牌
twofa_is_enrolled=您的帳號已經<strong>啟用</strong>兩步驟驗證。
twofa_not_enrolled=您的帳號目前尚未啟用兩步驟驗證。
twofa_disabled=兩步驟驗證已經被關閉。
scan_this_image=使用您的授權應用程式來掃瞄圖片:
or_enter_secret=或者輸入密碼: %s
orgs_none=您尚未成為任一組織的成員。
repos_none=您不擁有任何存儲庫
delete_account=刪除當前帳戶
confirm_delete_account=確認刪除帳戶
[repo]
owner=擁有者
repo_name=儲存庫名稱
visibility=可見度
fork_repo=複製儲存庫
fork_from=複製自
repo_desc=儲存庫描述
repo_lang=儲存庫語言
license=授權許可
create_repo=建立儲存庫
default_branch=默認分支
mirror_prune=裁減
watchers=關注者
stargazers=稱讚者
forks=複製儲存庫
form.reach_limit_of_creation=您已經達到了儲存庫 %d 的上限。
form.name_reserved=儲存庫名稱 '%s' 是預留的。
migrate_type=遷移類型
migrate_type_helper=該儲存庫將是一個 <span class="text blue">鏡像</span>
migrate_repo=遷移儲存庫
migrate.permission_denied=您並沒有導入本地儲存庫的權限。
migrate.failed=遷移失敗:%v
mirror_from=镜像来自
forked_from=複製自
copy_link=複製連結
copied=複製成功
unwatch=取消關注
watch=關註
unstar=取消收藏
star=收藏
fork=複製
no_desc=暫無描述
quick_guide=快速幫助
clone_this_repo=複製當前儲存庫
create_new_repo_command=從命令列建立新儲存庫。
push_exist_repo=從命令列推送已存在的儲存庫
code=程式碼
branch=分支
tree=目錄樹
filter_branch_and_tag=過濾分支或標籤
branches=分支列表
tags=標籤列表
issues=問題管理
pulls=合併請求
labels=標籤
milestones=里程碑
commits=提交歷史
releases=版本發佈
file_raw=原始文件
file_history=文件歷史
file_view_raw=查看原始文件
file_permalink=永久連結
stored_lfs=儲存到到 Git LFS
editor.preview_changes=預覽更改
editor.or=
editor.commit_changes=提交更改嗎?
editor.add=新增 '%s'
editor.update=更新 '%s'
editor.delete=刪除 '%s'
editor.commit_directly_to_this_branch=直接提交到 <strong class="branch-name">%s</strong> 分支。
editor.create_new_branch=建立 <strong>新的分支</strong> 為此提交和開始合併請求。
editor.cancel=取消
editor.branch_already_exists='%s' 已存在於此存儲庫。
editor.no_changes_to_show=沒有可以顯示的變更。
editor.fail_to_update_file=上傳/建立檔案 '%s' 失敗, 錯誤訊息: %v
editor.unable_to_upload_files=上傳檔案失敗到 '%s', 錯誤訊息: %v
editor.upload_files_to_dir=上傳檔案到 '%s'
commits.commits=次程式碼提交
commits.find=搜尋
commits.author=作者
commits.message=備註
commits.date=提交日期
commits.older=更舊的提交
commits.newer=更新的提交
commits.signed_by=簽署人
issues.new=建立問題
issues.new.labels=標籤
issues.new.no_label=未選擇標籤
issues.new.clear_labels=清除已選取標籤
issues.new.milestone=里程碑
issues.new.no_milestone=未選擇里程碑
issues.new.clear_milestone=清除已選取里程碑
issues.new.open_milestone=開啟中的里程碑
issues.new.closed_milestone=已關閉的里程碑
issues.create=建立問題
issues.new_label=建立標籤
issues.create_label=建立標籤
issues.label_templates.title=載入一組預定義的標籤
issues.label_templates.helper=選擇一個標籤集
issues.label_templates.fail_to_load_file=載入標籤範本檔案 '%s' 失敗: %v
issues.add_milestone_at=`新增至<b>%s</b> 里程碑 %s`
issues.change_milestone_at=`%[3]s 修改了里程碑 <b>%[1]s</b> 到 <b>%[2]s</b>`
issues.remove_milestone_at=`從里程碑 %[2]s 刪除 <b>%[1]s</b>`
issues.deleted_milestone=`(已刪除)`
issues.self_assign_at=將 %s 指派給自己
issues.add_assignee_at=`被<b>%s</b> %s指派`
issues.delete_branch_at=`刪除分支 <b>%s</b> %s`
issues.open_tab=%d 個開啓中
issues.close_tab=%d 個已關閉
issues.filter_label=標籤篩選
issues.filter_milestone=里程碑篩選
issues.filter_assignee=指派人篩選
issues.filter_type=類型篩選
issues.filter_type.all_issues=所有問題
issues.filter_type.assigned_to_you=指派給您的
issues.filter_type.created_by_you=由您建立的
issues.filter_type.mentioning_you=提及您的
issues.filter_sort=排序
issues.filter_sort.latest=最新建立
issues.filter_sort.oldest=最早建立
issues.filter_sort.recentupdate=最近更新
issues.filter_sort.leastupdate=最少更新
issues.filter_sort.mostcomment=最多評論
issues.filter_sort.leastcomment=最少評論
issues.action_open=開啟
issues.action_close=關閉
issues.action_label=標籤
issues.action_milestone=里程碑
issues.action_milestone_no_select=無里程碑
issues.action_assignee=負責人
issues.action_assignee_no_select=無負責人
issues.opened_by=由 <a href="%[2]s">%[3]s</a> 於 %[1]s建立
issues.opened_by_fake=由 %[2]s 於 %[1]s建立
issues.previous=上一頁
issues.next=下一頁
issues.open_title=開啟中
issues.closed_title=已關閉
issues.num_comments=%d 條評論
issues.commented_at=` 評論 <a href="#%s"> %s</a>`
issues.delete_comment_confirm=您確定要刪除該條評論嗎?
issues.no_content=尚未有任何內容
issues.close_issue=關閉
issues.reopen_issue=重新開啟
issues.create_comment=評論
issues.commit_ref_at=`在代碼提交 <a id="%[1]s" href="#%[1]s">%[2]s</a> 中引用了該問題`
issues.poster=發佈者
issues.collaborator=協同者
issues.owner=所有者
issues.sign_in_require_desc=<a href="%s"> 登入</a> 才能加入這對話。
issues.edit=編輯
issues.cancel=取消
issues.save=儲存
issues.label_title=標籤名稱
issues.label_color=標籤顏色
issues.label_count=%d 個標籤
issues.label_open_issues=%d 個開啓的問題
issues.label_edit=編輯
issues.label_delete=刪除
issues.label.filter_sort.alphabetically=按字母顺序排序
issues.label.filter_sort.reverse_alphabetically=按字母反向排序
issues.num_participants=%d 參與者
issues.attachment.open_tab=`在新的標籤頁中查看 '%s'`
issues.attachment.download=`點擊下載 '%s'`
issues.subscribe=訂閱
issues.unsubscribe=取消訂閱
pulls.new=建立合併請求
pulls.filter_branch=過濾分支
pulls.no_results=未找到結果
pulls.create=建立合併請求
pulls.merged_title_desc=於 %[4]s 將 %[1]d 次代碼提交從 <code>%[2]s</code>合併至 <code>%[3]s</code>
pulls.tab_conversation=對話內容
pulls.tab_commits=程式碼提交
pulls.reopen_to_merge=請重新開啟合併請求來完成合併操作。
pulls.merged=已合併
pulls.can_auto_merge_desc=這個拉請求可以自動合併。
pulls.merge_pull_request=合併請求
milestones.new=新的里程碑
milestones.open_tab=%d 開啟中
milestones.close_tab=%d 已關閉
milestones.closed=於 %s關閉
milestones.no_due_date=暫無截止日期
milestones.open=開啟
milestones.close=關閉
milestones.create=建立里程碑
milestones.title=標題
milestones.desc=描述
milestones.due_date=截止日期(可選)
milestones.clear=清除
milestones.edit=編輯里程碑
milestones.cancel=取消
milestones.filter_sort.closest_due_date=到期日由近到遠
milestones.filter_sort.furthest_due_date=到期日由遠到近
milestones.filter_sort.least_complete=完成度由低到高
milestones.filter_sort.most_complete=完成度由高到低
milestones.filter_sort.most_issues=問題由多到少
milestones.filter_sort.least_issues=問題由少到多
wiki.page=頁面
wiki.filter_page=過濾頁面
wiki.default_commit_message=關於此次頁面修改的說明(非必要)。
wiki.save_page=儲存頁面
wiki.last_commit_info=%s 於 %s 修改了此頁面
wiki.edit_page_button=修改
wiki.new_page_button=新的頁面
wiki.delete_page_button=刪除頁面
wiki.page_already_exists=相同名稱的 Wiki 頁面已經存在。
wiki.pages=所有頁面
wiki.last_updated=最後更新於 %s
settings=儲存庫設定
settings.desc=設定是您可以管理儲存庫設定的地方
settings.collaboration.write=可寫權限
settings.collaboration.read=可讀權限
settings.collaboration.undefined=未定義
settings.hooks=管理 Webhooks
settings.githooks=管理 Git Hooks
settings.basic_settings=基本設定
settings.mirror_settings=鏡像設定
settings.update_settings=更新儲存庫設定
settings.advanced_settings=高級設定
settings.external_wiki_url=外部 Wiki 連結
settings.external_tracker_url=外部 Issue 追蹤網址
settings.tracker_url_format=外部問題管理系統的 URL 格式
settings.tracker_issue_style.numeric=數字
settings.tracker_issue_style.alphanumeric=字母及數字
settings.danger_zone=危險操作區
settings.new_owner_has_same_repo=新的儲存庫擁有者已經存在同名儲存庫!
settings.transfer=轉移儲存庫所有權
settings.delete=刪除本儲存庫
settings.delete_notices_1=- 此操作 <strong>不可以</strong> 被回滾。
settings.transfer_owner=新擁有者
settings.add_webhook=建立 Webhook
settings.webhook.test_delivery=測試推送
settings.webhook.request=請求內容
settings.webhook.response=響應內容
settings.webhook.headers=標題
settings.webhook.body=響應內容
settings.githook_edit_desc=如果 Hook 未啟動,則會顯示樣例文件中的內容。如果想要刪除某個 Hook則提交空白文本即可。
settings.githook_name=Hook 名稱
settings.githook_content=Hook 內容
settings.update_githook=更新 Hook 設定
settings.secret=金鑰文本
settings.slack_username=服務名稱
settings.slack_icon_url=圖標 URL
settings.slack_color=顏色代碼
settings.event_create=建立
settings.event_push=推送
settings.event_pull_request=合併請求
settings.update_webhook=更新 Webhook
settings.recent_deliveries=最近推送記錄
settings.hook_type=Hook 類型
settings.slack_token=令牌
settings.slack_domain=域名
settings.slack_channel=頻道
settings.deploy_keys=管理部署金鑰
settings.add_deploy_key=新增部署金鑰
settings.title=標題
settings.deploy_key_content=金鑰文本
settings.branches=分支列表
settings.protected_branch=分支保護
settings.protected_branch_can_push=允許推送?
settings.protected_branch_can_push_yes=你可以推送
settings.protected_branch_can_push_no=你不能推送
settings.add_protected_branch=啟用保護
settings.delete_protected_branch=停用保護
diff.browse_source=瀏覽代碼
diff.parent=父節點
diff.commit=當前提交
diff.data_not_available=沒有內容比較可以使用
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=查看文件
diff.file_suppressed=文件差異過大導致無法顯示
diff.too_many_files=部分文件因文件數量過多而無法顯示
release.releases=版本發佈
release.new_release=發佈新版本
release.draft=草稿
release.prerelease=預發佈版本
release.stable=穩定
release.edit=編輯
release.source_code=程式碼
release.tag_name=標籤名稱
release.target=目標分支
release.title=標題
release.content=內容
release.cancel=取消
release.publish=發佈版本
release.save_draft=儲存草稿
release.deletion_success=已刪除此版本發佈。
release.downloads=下載附件
[org]
org_name_holder=組織名稱
org_full_name_holder=組織全名
create_org=建立組織
repo_updated=最後更新於
people=組織成員
teams=組織團隊
lower_members=名成員
lower_repositories=個儲存庫
org_desc=組織描述
team_name=團隊名稱
team_desc=團隊描述
settings=組織設定
settings.full_name=組織全名
settings.website=官方網站
settings.location=所在地區
settings.update_settings=更新組織設定
settings.update_setting_success=組織設定已更新。
settings.delete=刪除組織
settings.delete_account=刪除當前組織
settings.confirm_delete_account=確認刪除組織
settings.hooks_desc=新增 webhooks 將觸發在這個組織下 <strong>全部的儲存庫</strong> 。
members.membership_visibility=成員可見性:
members.member_role=成員角色:
members.owner=管理員
members.member=普通成員
members.remove=移除成員
members.leave=離開組織
members.invite_desc=邀請新的用戶加入 %s
members.invite_now=立即邀請
teams.join=加入團隊
teams.leave=離開團隊
teams.read_access=讀取權限
teams.write_access=寫入權限
teams.no_desc=該團隊暫無描述
teams.settings=團隊設定
teams.members=團隊成員
teams.update_settings=更新團隊設定
teams.add_team_member=新增團隊成員
teams.delete_team_success=該團隊已被刪除。
teams.repositories=團隊儲存庫
teams.add_nonexistent_repo=您嘗試新增到團隊的儲存庫不存在,請先建立儲存庫!
[admin]
dashboard=控制面版
organizations=組織管理
repositories=儲存庫管理
config=應用設定管理
notices=系統提示管理
monitor=應用監控面版
first_page=首頁
last_page=末頁
total=總計:%d
dashboard.operation_name=操作名稱
dashboard.operation_switch=開關
dashboard.operation_run=執行
dashboard.clean_unbind_oauth=清理未綁定OAuth的連結
dashboard.clean_unbind_oauth_success=所有未綁定 OAuth 的連結已刪除。
dashboard.reinit_missing_repos=重新初始化所有遺失具已存在記錄的Git 儲存庫
dashboard.sync_external_users=同步外部使用者資料
dashboard.server_uptime=服務執行時間
dashboard.current_goroutine=當前 Goroutines 數量
dashboard.current_memory_usage=當前內存使用量
dashboard.total_memory_allocated=所有被分配的內存
dashboard.memory_obtained=內存佔用量
dashboard.pointer_lookup_times=指針查找次數
dashboard.current_heap_usage=當前 Heap 內存使用量
dashboard.heap_memory_obtained=Heap 內存佔用量
dashboard.heap_memory_idle=Heap 內存空閒量
dashboard.heap_memory_in_use=正在使用的 Heap 內存
dashboard.heap_memory_released=被釋放的 Heap 內存
dashboard.heap_objects=Heap 對象數量
dashboard.bootstrap_stack_usage=啟動 Stack 使用量
dashboard.stack_memory_obtained=被分配的 Stack 內存
dashboard.mspan_structures_usage=MSpan 結構內存使用量
dashboard.mspan_structures_obtained=被分配的 MSpan 結構內存
dashboard.mcache_structures_usage=MCache 結構內存使用量
dashboard.mcache_structures_obtained=被分配的 MCache 結構內存
dashboard.profiling_bucket_hash_table_obtained=被分配的剖析哈希表內存
dashboard.gc_metadata_obtained=被分配的垃圾收集元資料內存
dashboard.other_system_allocation_obtained=其它被分配的系統內存
dashboard.next_gc_recycle=下次垃圾收集內存回收量
dashboard.last_gc_time=距離上次垃圾收集時間
dashboard.total_gc_time=垃圾收集執行時間總量
dashboard.total_gc_pause=垃圾收集暫停時間總量
dashboard.last_gc_pause=上次垃圾收集暫停時間
dashboard.gc_times=垃圾收集執行次數
users.activated=已啟用
users.admin=管理員
users.repos=儲存庫數
users.created=建立時間
users.edit=編輯
users.auth_source=認證源
users.local=本地
orgs.org_manage_panel=組織管理
orgs.name=組織名稱
orgs.teams=團隊數
orgs.members=成員數
repos.repo_manage_panel=儲存庫管理
repos.owner=所有者
repos.name=儲存庫名稱
repos.private=私有庫
repos.watches=關註數
repos.stars=讚好數
repos.issues=問題數
repos.size=大小
auths.name=認證名稱
auths.type=認證類型
auths.enabled=已啟用
auths.updated=最後更新時間
auths.auth_type=認證類型
auths.auth_name=認證名稱
auths.security_protocol=安全協定
auths.domain=域名
auths.host=主機地址
auths.port=主機端口
auths.bind_dn=綁定DN
auths.bind_password=綁定密碼
auths.user_base=用戶搜尋基準
auths.user_dn=用戶 DN
auths.filter=使用者篩選器
auths.admin_filter=管理者篩選器
auths.smtp_auth=SMTP 驗證類型
auths.smtphost=SMTP 主機地址
auths.smtpport=SMTP 主機端口
auths.allowed_domains=域名白名單
auths.enable_tls=啟用 TLS 加密
auths.skip_tls_verify=忽略 TLS 驗證
auths.pam_service_name=PAM 服務名稱
auths.oauth2_provider=OAuth2 提供者
auths.oauth2_clientID=用戶端 ID (金鑰)
auths.oauth2_clientSecret=用戶端金鑰
auths.openIdConnectAutoDiscoveryURL=OpenID 連接自動探索 URL
auths.oauth2_authURL=授權 URL
auths.oauth2_profileURL=個人訊息 URL
auths.oauth2_emailURL=電子郵件 URL
auths.enable_auto_register=允許授權用戶自動註冊
auths.tips=幫助提示
auths.tips.oauth2.general=OAuth2 認證
auths.tips.oauth2.general.tip=當註冊一個新的 OAuth2 認證callback/redirect 網址應該是:<host>/user/oauth2/<Authentication Name>/callback
auths.tip.oauth2_provider=OAuth2 提供者
auths.tip.dropbox=建立新 App 在 https://www.dropbox.com/developers/apps
auths.tip.facebook=在 https://developers.facebook.com/apps 註冊一個新的應用,並且新增一個產品 "Facebook Login
auths.tip.github=在 https://github.com/settings/applications/new 註冊一個新的 OAuth 應用程式
auths.tip.gitlab=在 https://gitlab.com/profile/applications 註冊一個新的應用程式
auths.tip.openid_connect=使用 OpenID 連接探索 URL (<server>/.well-known/openid-configuration) 來指定節點
auths.new_success=已增加認證'%s'。
auths.delete_auth_title=刪除認證來源
config.server_config=伺服器設定
config.custom_conf=設定檔案路徑
config.disable_router_log=關閉路由日誌
config.run_mode=執行模式
config.git_version=Git 版本
config.repo_root_path=儲存庫目錄
config.lfs_root_path=LFS 根目錄
config.static_file_root_path=靜態檔案目錄
config.script_type=腳本類型
config.reverse_auth_user=反向代理認證
config.ssh_config=SSH 設定
config.ssh_enabled=已啟用
config.ssh_port=
config.ssh_listen_port=監聽埠
config.ssh_root_path=根路徑
config.ssh_key_test_path=金鑰測試路徑
config.ssh_keygen_path=金鑰產生 (' ssh-keygen ') 路徑
config.ssh_minimum_key_size_check=金鑰最小大小檢查
config.ssh_minimum_key_sizes=金鑰最小大小
config.db_config=資料庫設定
config.db_type=資料庫類型
config.db_host=主機地址
config.db_name=資料庫名稱
config.db_path=資料庫路徑
config.service_config=服務設定
config.show_registration_button=顯示註冊按鈕
config.disable_key_size_check=禁用金鑰最小長度檢查
config.active_code_lives=啟用用戶連結有效期
config.webhook_config=Webhook 設定
config.queue_length=隊列長度
config.deliver_timeout=推送超時
config.skip_tls_verify=略過 TLS 驗證
config.mailer_enabled=啟用服務
config.mailer_disable_helo=禁用 HELO 操作
config.mailer_name=發送者名稱
config.mailer_host=郵件主機地址
config.mailer_user=發送者帳號
config.oauth_config=社交帳號設定
config.oauth_enabled=啟用服務
config.cache_config=Cache 設定
config.cache_adapter=Cache 適配器
config.cache_interval=Cache 周期
config.cache_conn=Cache 連接字符串
config.session_config=Session 設定
config.session_provider=Session 提供者
config.provider_config=提供者設定
config.cookie_name=Cookie 名稱
config.enable_set_cookie=啟用設定 Cookie
config.gc_interval_time=垃圾收集周期
config.session_life_time=Session 生命周期
config.https_only=僅限 HTTPS
config.cookie_life_time=Cookie 生命周期
config.picture_service=圖片服務
config.disable_gravatar=禁用 Gravatar 頭像
config.enable_federated_avatar=開啟聯合頭像
config.git_config=Git 設定
config.git_disable_diff_highlight=禁用比較語法高亮
config.git_max_diff_lines=Max Diff 線 (對於單個檔)
config.git_max_diff_line_characters=最大比較的字元 (單行)
config.git_max_diff_files=Max Diff 檔 (顯示)
config.git_gc_args=GC 參數
config.git_migrate_timeout=移動超時
config.git_mirror_timeout=鏡像更新超時
config.git_clone_timeout=複製操作超時
config.git_pull_timeout=操作超時
config.git_gc_timeout=GC 操作超時
config.log_config=日誌設定
config.log_mode=日誌模式
monitor.cron=Cron 任務
monitor.name=任務名稱
monitor.schedule=任務安排
monitor.next=下次執行時間
monitor.previous=上次執行時間
monitor.process=執行中進程
monitor.desc=進程描述
monitor.start=開始時間
monitor.execute_time=已執行時間
notices.system_notice_list=系統提示管理
notices.view_detail_header=查看提示細節
notices.actions=操作
notices.select_all=選取全部
notices.deselect_all=取消所有選取
notices.inverse_selection=反向選取
notices.delete_selected=刪除選取項
notices.delete_all=刪除所有提示
notices.type=提示類型
notices.type_1=儲存庫
notices.desc=描述
notices.op=操作
notices.delete_success=已刪除系統提示。
[action]
create_repo=建立了儲存庫 <a href="%s">%s</a>
rename_repo=重新命名儲存庫 <code>%[1]s</code> 為 <a href="%[2]s">%[3]s</a>
create_issue=`建立了問題 <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue=`已關閉問題 <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue=`已重新開啟問題 <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request=`建立了合併請求 <a href="%s/pulls/%s">%s#%[2]s</a>`
close_pull_request=`已關閉合併請求 <a href="%s/pulls/%s">%s#%[2]s</a>`
reopen_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>
compare_commits=比較 %d 提交
[tool]
ago=%s之前
from_now=%s之後
now=現在
future=未來
1s=1 秒
1m=1 分鐘
1h=1 小時
1d=1 天
1w=1 周
1mon=1 月
1y=1 年
seconds=%d 秒
minutes=%d 分
hours=%d 小時
days=%d 天
weeks=%d 週
months=%d 月
years=%d 年
raw_seconds=
raw_minutes=分鐘
[dropzone]
file_too_big=檔案大小({{filesize}} MB) 超過了最大允許大小({{maxFilesize}} MB)
remove_file=移除文件
[notification]
notifications=訊息
unread=未讀
read=已讀
pin=固定通知
mark_as_read=標記為已讀
mark_as_unread=標記為未讀
[gpg]
error.extract_sign=無法提取簽署
error.generate_hash=無法產生提交的雜湊值
error.no_gpg_keys_found=沒有發現已知的金鑰在資料庫的簽署中
error.not_signed_commit=未簽名的提交
[units]

1410
conf/locale/locale_zh-TW.ini Normal file

File diff suppressed because it is too large Load Diff

48
go.mod
View File

@ -19,23 +19,16 @@ require (
gitea.com/macaron/toolbox v0.0.0-20190822013122-05ff0fc766b7
github.com/BurntSushi/toml v0.3.1
github.com/PuerkitoBio/goquery v1.5.1
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/RoaringBitmap/roaring v0.4.23 // indirect
github.com/alecthomas/chroma v0.8.0
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bgentry/speakeasy v0.1.0 // indirect
github.com/blevesearch/bleve v1.0.7
github.com/couchbase/gomemcached v0.0.0-20191004160342-7b5da2ec40b2 // indirect
github.com/couchbase/goutils v0.0.0-20191018232750-b49639060d85 // indirect
github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d // indirect
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect
github.com/cznic/strutil v0.0.0-20181122101858-275e90344537 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/dlclark/regexp2 v1.2.0 // indirect
github.com/dustin/go-humanize v1.0.0
github.com/editorconfig/editorconfig-core-go/v2 v2.1.1
github.com/emirpasic/gods v1.12.0
@ -43,64 +36,39 @@ require (
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 // indirect
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect
github.com/fatih/color v1.9.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
github.com/gliderlabs/ssh v0.2.2
github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a // indirect
github.com/go-enry/go-enry/v2 v2.5.2
github.com/go-git/gcfg v1.5.0 // indirect
github.com/go-git/go-billy/v5 v5.0.0
github.com/go-git/go-git/v5 v5.1.0
github.com/go-macaron/gzip v0.0.0-20200329073552-98214d7a897e // indirect
github.com/go-macaron/toolbox v0.0.0-20200329073429-4401f4ce0f55 // indirect
github.com/go-openapi/analysis v0.19.5 // indirect
github.com/go-openapi/errors v0.19.2 // indirect
github.com/go-openapi/inflect v0.19.0 // indirect
github.com/go-openapi/jsonreference v0.19.3 // indirect
github.com/go-openapi/loads v0.19.3 // indirect
github.com/go-openapi/runtime v0.19.5 // indirect
github.com/go-openapi/spec v0.19.3 // indirect
github.com/go-openapi/strfmt v0.19.3 // indirect
github.com/go-openapi/swag v0.19.5 // indirect
github.com/go-openapi/validate v0.19.3 // indirect
github.com/go-redis/redis v6.15.2+incompatible
github.com/go-sql-driver/mysql v1.5.0
github.com/go-stack/stack v1.8.0 // indirect
github.com/go-swagger/go-swagger v0.21.0
github.com/go-testfixtures/testfixtures/v3 v3.2.0
github.com/gobwas/glob v0.2.3
github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28
github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14
github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721 // indirect
github.com/golang/protobuf v1.4.1 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/google/go-github/v32 v32.1.0
github.com/google/go-querystring v1.0.0 // indirect
github.com/google/uuid v1.1.1
github.com/gorilla/context v1.1.1
github.com/gorilla/css v1.0.0 // indirect
github.com/gorilla/handlers v1.4.2 // indirect
github.com/hashicorp/go-retryablehttp v0.6.6 // indirect
github.com/huandu/xstrings v1.3.0
github.com/issue9/assert v1.3.2 // indirect
github.com/issue9/identicon v1.0.1
github.com/jaytaylor/html2text v0.0.0-20160923191438-8fb95d837f7d
github.com/jessevdk/go-flags v1.4.0 // indirect
github.com/jmhodges/levigo v1.0.0 // indirect
github.com/kballard/go-shellquote v0.0.0-20170619183022-cd60e84ee657
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4
github.com/klauspost/compress v1.10.3
github.com/kr/pretty v0.1.0 // indirect
github.com/lafriks/xormstore v1.3.2
github.com/lib/pq v1.7.0
github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96
github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de // indirect
github.com/lunny/nodb v0.0.0-20160621015157-fc1ef06ad4af // indirect
github.com/mailru/easyjson v0.7.0 // indirect
github.com/markbates/goth v1.61.2
github.com/mattn/go-isatty v0.0.12
github.com/mattn/go-sqlite3 v2.0.2+incompatible
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/mcuadros/go-version v0.0.0-20190308113854-92cdf37c5b75
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81
github.com/mgechev/revive v1.0.2
@ -110,30 +78,22 @@ require (
github.com/msteinert/pam v0.0.0-20151204160544-02ccfbfaf0cc
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5
github.com/niklasfasching/go-org v0.1.9
github.com/olekukonko/tablewriter v0.0.4 // indirect
github.com/oliamb/cutter v0.2.2
github.com/olivere/elastic/v7 v7.0.9
github.com/philhofer/fwd v1.0.0 // indirect
github.com/pierrec/lz4 v2.0.5+incompatible // indirect
github.com/pkg/errors v0.9.1
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/pquerna/otp v1.2.0
github.com/prometheus/client_golang v1.1.0
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 // indirect
github.com/prometheus/common v0.6.0 // indirect
github.com/prometheus/procfs v0.0.4 // indirect
github.com/quasoft/websspi v1.0.0
github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 // indirect
github.com/sergi/go-diff v1.1.0
github.com/shurcooL/httpfs v0.0.0-20190527155220-6a4d4a70508b // indirect
github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd
github.com/siddontang/go-snappy v0.0.0-20140704025258-d8f7bb82a96d // indirect
github.com/spf13/viper v1.4.0 // indirect
github.com/smartystreets/goconvey v1.6.4 // indirect
github.com/stretchr/testify v1.4.0
github.com/syndtr/goleveldb v1.0.0 // indirect
github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 // indirect
github.com/tinylib/msgp v1.1.2 // indirect
github.com/toqueteos/webbrowser v1.2.0 // indirect
github.com/tstranex/u2f v1.0.0
github.com/unknwon/com v1.0.1
github.com/unknwon/i18n v0.0.0-20190805065654-5c6446a380b6
@ -144,25 +104,19 @@ require (
github.com/yuin/goldmark v1.2.1
github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691
github.com/yuin/goldmark-meta v0.0.0-20191126180153-f0638e958b60
go.mongodb.org/mongo-driver v1.1.1 // indirect
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9
golang.org/x/mod v0.2.0 // indirect
golang.org/x/net v0.0.0-20200602114024-627f9648deb9
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1
golang.org/x/text v0.3.2
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect
golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect
google.golang.org/appengine v1.6.5 // indirect
google.golang.org/protobuf v1.22.0 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175 // indirect
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ini.v1 v1.52.0
gopkg.in/ldap.v3 v3.0.2
gopkg.in/macaron.v1 v1.4.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.3.0
mvdan.cc/xurls/v2 v2.1.0
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251

17
go.sum
View File

@ -237,12 +237,6 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
github.com/go-macaron/gzip v0.0.0-20200329073552-98214d7a897e h1:PlmAvovRGUTW15weOGR3gny33PCUL2Ko65rN1w1XBog=
github.com/go-macaron/gzip v0.0.0-20200329073552-98214d7a897e/go.mod h1:1if9hBU2ZPlrmuwN27VIn11Ur9OXBiZDLDPmCKbb7N4=
github.com/go-macaron/inject v0.0.0-20160627170012-d8a0b8677191 h1:NjHlg70DuOkcAMqgt0+XA+NHwtu66MkTVVgR4fFWbcI=
github.com/go-macaron/inject v0.0.0-20160627170012-d8a0b8677191/go.mod h1:VFI2o2q9kYsC4o7VP1HrEVosiZZTd+MVT3YZx4gqvJw=
github.com/go-macaron/toolbox v0.0.0-20200329073429-4401f4ce0f55 h1:aDDZ2v9fvO9xGIw+WkmOm65f4jImmRgv7QKqLe8u5bU=
github.com/go-macaron/toolbox v0.0.0-20200329073429-4401f4ce0f55/go.mod h1:YFNJ/JT4yLnpuIXTFef30SZkxGHUczjGZGFaZpPcdn0=
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
@ -452,8 +446,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.9.2 h1:LfVyl+ZlLlLDeQ/d2AqfGIIH4qEDu0Ed2S5GyhCWIWY=
github.com/klauspost/compress v1.9.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.10.2 h1:Znfn6hXZAHaLPNnlqUYRrBSReFHYybslgv4PTiyz6P0=
github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8=
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
@ -644,6 +636,7 @@ github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:X
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8=
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@ -837,7 +830,6 @@ golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190730183949-1393eb018365/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190907184412-d223b2b6db03/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
@ -878,7 +870,6 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190802220118-1d1727260058/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200225230052-807dcd883420 h1:4RJNOV+2rLxMEfr6QIpC7GEv9MjD6ApGXTCLrNF9+eA=
@ -951,12 +942,6 @@ gopkg.in/ini.v1 v1.52.0 h1:j+Lt/M1oPPejkniCg1TkWE2J3Eh1oZTsHSXzMTzUXn4=
gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ldap.v3 v3.0.2 h1:R6RBtabK6e1GO0eQKtkyOFbAHO73QesLzI2w2DZ6b9w=
gopkg.in/ldap.v3 v3.0.2/go.mod h1:oxD7NyBuxchC+SgJDE1Q5Od05eGt29SDQVBmV+HYbzw=
gopkg.in/macaron.v1 v1.3.4 h1:HvIscOwxhFhx3swWM/979wh2QMYyuXrNmrF9l+j3HZs=
gopkg.in/macaron.v1 v1.3.4/go.mod h1:/RoHTdC8ALpyJ3+QR36mKjwnT1F1dyYtsGM9Ate6ZFI=
gopkg.in/macaron.v1 v1.3.5 h1:FUA16VFBojxzfU75KqWrV/6BPv9O2R1GnybSGRie9QQ=
gopkg.in/macaron.v1 v1.3.5/go.mod h1:uMZCFccv9yr5TipIalVOyAyZQuOH3OkmXvgcWwhJuP4=
gopkg.in/macaron.v1 v1.4.0 h1:RJHC09fAnQ8tuGUiZNjG0uyL1BWSdSWd9SpufIcEArQ=
gopkg.in/macaron.v1 v1.4.0/go.mod h1:uMZCFccv9yr5TipIalVOyAyZQuOH3OkmXvgcWwhJuP4=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=

View File

@ -65,6 +65,10 @@ type PullRequest struct {
MergedUnix timeutil.TimeStamp `xorm:"updated INDEX"`
isHeadRepoLoaded bool `xorm:"-"`
//add configure
CommitNum int
ChangedFiles int
}
// MustHeadUserName returns the HeadRepo's username if failed return blank

View File

@ -96,6 +96,7 @@ func (r *Release) APIFormat() *api.Release {
TagName: r.TagName,
Target: r.Target,
Title: r.Title,
Sha1: r.Sha1,
Note: r.Note,
URL: r.APIURL(),
HTMLURL: r.HTMLURL(),

View File

@ -994,7 +994,9 @@ func (repo *Repository) cloneLink(isWiki bool) *CloneLink {
func (repo *Repository) CloneLink() (cl *CloneLink) {
return repo.cloneLink(false)
}
func (repo *Repository) CloneWikiLink() (cl *CloneLink) {
return repo.cloneLink(true)
}
// CheckCreateRepository check if could created a repository
func CheckCreateRepository(doer, u *User, name string) error {
if !doer.CanCreateRepo() {

View File

@ -0,0 +1,18 @@
package models
import "code.gitea.io/gitea/modules/timeutil"
type TimestampOptions struct {
Start timeutil.TimeStamp
End timeutil.TimeStamp
}
func (opts *TimestampOptions) setDefaultValues() {
if opts.Start <= 0 {
opts.Start = timeutil.TimeStampNow() - 365*24*60*60
}
if opts.End <= 0 {
opts.End = timeutil.TimeStampNow()
}
}

View File

@ -56,3 +56,42 @@ func GetUserHeatmapDataByUser(user *User) ([]*UserHeatmapData, error) {
return hdata, err
}
func GetUserHeatMapDataByUserWithTimeStamp(user *User, opts TimestampOptions) ([]*UserHeatmapData, error) {
opts.setDefaultValues()
hdata := make([]*UserHeatmapData, 0)
if user.KeepActivityPrivate {
return hdata, nil
}
var groupBy string
var groupByName = "timestamp"
switch {
case setting.Database.UseSQLite3:
groupBy = "strftime('%s', strftime('%Y-%m-%d', created_unix, 'unixepoch'))"
case setting.Database.UseMySQL:
groupBy = "UNIX_TIMESTAMP(DATE(FROM_UNIXTIME(created_unix)))"
case setting.Database.UsePostgreSQL:
groupBy = "extract(epoch from data_trunc('day', to_timestamp(created_unix)))"
case setting.Database.UseMSSQL:
groupBy = "datediff(SECOND, '19700101', dateadd(DAY, 0, datediff(day, 0, dateadd(s, created_unix, '19700101'))))"
groupByName = groupBy
}
sess := x.Select(groupBy+" AS timestamp, count(user_id) as contributions").
Table("action").
Where("user_id = ?", user.ID).
And(groupBy+" >= ?", opts.Start).
And(groupBy+" <= ?", opts.End)
if user.Type == UserTypeIndividual {
sess = sess.And("act_user_id = ?", user.ID)
}
err := sess.GroupBy(groupByName).
OrderBy("timestamp").
Find(&hdata)
return hdata, err
}

View File

@ -55,6 +55,13 @@ func IsValidHookContentType(name string) bool {
return ok
}
func IsValidHookHttpMethod(name string) bool {
if name == "POST" || name == "GET" {
return true
}
return false
}
// HookEvents is a set of web hook events
type HookEvents struct {
Create bool `json:"create"`
@ -115,6 +122,7 @@ type Webhook struct {
HookTaskType HookTaskType
Meta string `xorm:"TEXT"` // store hook-specific attributes
LastStatus HookStatus // Last delivery status
BranchFilter string `xorm:"TEXT"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
@ -748,6 +756,18 @@ func (t *HookTask) simpleMarshalJSON(v interface{}) string {
return string(p)
}
func GetHookTasksByRepoIDAndHookID(repoID int64, hookID int64, listOptions ListOptions) ([]*HookTask, error) {
if listOptions.Page == 0 {
hookTasks := make([]*HookTask, 0, 5)
return hookTasks, x.Find(&hookTasks, &HookTask{RepoID: repoID, HookID: hookID})
}
sess := listOptions.getPaginatedSession()
hookTasks := make([]*HookTask, 0, listOptions.PageSize)
return hookTasks, sess.Find(&hookTasks, &HookTask{RepoID: repoID, HookID: hookID})
}
// HookTasks returns a list of hook tasks by given conditions.
func HookTasks(hookID int64, page int) ([]*HookTask, error) {
tasks := make([]*HookTask, 0, setting.Webhook.PagingNum)

View File

@ -234,7 +234,7 @@ func ReferencesGitRepo(allowEmpty bool) macaron.Handler {
// NotFound handles 404s for APIContext
// String will replace message, errors will be added to a slice
func (ctx *APIContext) NotFound(objs ...interface{}) {
var message = "Not Found"
var message = "Not Found (ownerName,repo etc...)"
var errors []string
for _, obj := range objs {
// Ignore nil
@ -255,3 +255,94 @@ func (ctx *APIContext) NotFound(objs ...interface{}) {
"errors": errors,
})
}
func (ctx *APIContext) FileNameError(objs ...interface{}){
var message = "FileName too long"
var errors []string
for _, obj := range objs {
// Ignore nil
if obj == nil {
continue
}
if err, ok := obj.(error); ok {
errors = append(errors, err.Error())
} else {
message = obj.(string)
}
}
ctx.JSON(500, map[string]interface{}{
"message": message,
"documentation_url": setting.API.SwaggerURL,
"errors": errors,
})
}
func (ctx *APIContext) SameFileNameError(objs ...interface{}){
var message = "Same name exists"
var errors []string
for _, obj := range objs {
// Ignore nil
if obj == nil {
continue
}
if err, ok := obj.(error); ok {
errors = append(errors, err.Error())
} else {
message = obj.(string)
}
}
ctx.JSON(500, map[string]interface{}{
"message": message,
"documentation_url": setting.API.SwaggerURL,
"errors": errors,
})
}
func (ctx *APIContext) FileExistError(objs ...interface{}){
var message = "file does not exist"
var errors []string
for _, obj := range objs {
// Ignore nil
if obj == nil {
continue
}
if err, ok := obj.(error); ok {
errors = append(errors, err.Error())
} else {
message = obj.(string)
}
}
ctx.JSON(500, map[string]interface{}{
"message": message,
"documentation_url": setting.API.SwaggerURL,
"errors": errors,
})
}
func (ctx *APIContext) CheckHasWiki(objs ...interface{}){
var message = "No wikies"
var errors []string
for _, obj := range objs {
// Ignore nil
if obj == nil {
continue
}
if err, ok := obj.(error); ok {
errors = append(errors, err.Error())
} else {
message = obj.(string)
}
}
ctx.JSON(500, map[string]interface{}{
"message": message,
"documentation_url": setting.API.SwaggerURL,
"errors": errors,
})
}

View File

@ -46,6 +46,7 @@ type Context struct {
Repo *Repository
Org *Organization
}
// IsUserSiteAdmin returns true if current user is a site admin

View File

@ -5,6 +5,7 @@
package convert
import (
"encoding/json"
"fmt"
"time"
@ -29,8 +30,19 @@ func ToEmail(email *models.EmailAddress) *api.Email {
}
}
type BranchKind int
const (
None BranchKind = iota
DefaultBranch
ProtectedBranch
OtherBranch
)
// ToBranch convert a git.Commit and git.Branch to an api.Branch
func ToBranch(repo *models.Repository, b *git.Branch, c *git.Commit, bp *models.ProtectedBranch, user *models.User, isRepoAdmin bool) (*api.Branch, error) {
var branchKind BranchKind
if bp == nil {
var hasPerm bool
var err error
@ -40,9 +52,15 @@ func ToBranch(repo *models.Repository, b *git.Branch, c *git.Commit, bp *models.
return nil, err
}
}
if b.Name == repo.DefaultBranch {
branchKind = DefaultBranch
} else {
branchKind = OtherBranch
}
return &api.Branch{
Name: b.Name,
CommitID: c.ID.String(), //add configure
Commit: ToCommit(repo, c),
Protected: false,
RequiredApprovals: 0,
@ -50,16 +68,28 @@ func ToBranch(repo *models.Repository, b *git.Branch, c *git.Commit, bp *models.
StatusCheckContexts: []string{},
UserCanPush: hasPerm,
UserCanMerge: hasPerm,
CommitTime: c.Author.When.Format(time.RFC3339),
DefaultBranch: repo.DefaultBranch,
BranchKind: int(branchKind),
}, nil
}
if b.Name == repo.DefaultBranch {
branchKind = DefaultBranch
} else {
branchKind = ProtectedBranch
}
branch := &api.Branch{
Name: b.Name,
CommitID: c.ID.String(), // add configure
Commit: ToCommit(repo, c),
Protected: true,
RequiredApprovals: bp.RequiredApprovals,
EnableStatusCheck: bp.EnableStatusCheck,
StatusCheckContexts: bp.StatusCheckContexts,
CommitTime: c.Author.When.Format(time.RFC3339),
DefaultBranch: repo.DefaultBranch,
BranchKind: int(branchKind),
}
if isRepoAdmin {
@ -128,16 +158,42 @@ func ToBranchProtection(bp *models.ProtectedBranch) *api.BranchProtection {
}
// ToTag convert a git.Tag to an api.Tag
// func ToTag(repo *models.Repository, t *git.Tag) *api.Tag {
// return &api.Tag{
// Name: t.Name,
// ID: t.ID.String(),
// Commit: ToCommitMeta(repo, t),
// ZipballURL: util.URLJoin(repo.HTMLURL(), "archive", t.Name+".zip"),
// TarballURL: util.URLJoin(repo.HTMLURL(), "archive", t.Name+".tar.gz"),
// }
// }
func ToTag(repo *models.Repository, t *git.Tag) *api.Tag {
return &api.Tag{
Name: t.Name,
ID: t.ID.String(),
Commit: ToCommitMeta(repo, t),
Commit: ToTagCommit(repo, t),
Tagger: ToCommitUser(t.Tagger),
Message: t.Message,
ZipballURL: util.URLJoin(repo.HTMLURL(), "archive", t.Name+".zip"),
TarballURL: util.URLJoin(repo.HTMLURL(), "archive", t.Name+".tar.gz"),
}
}
func ToTagCommit(repo *models.Repository, t *git.Tag) *api.TagCommit {
commit, err := t.Commit()
if err != nil {
log.Error("Commit", err)
return &api.TagCommit{}
}
return &api.TagCommit{
CommitMeta: ToCommitMeta(repo, t),
Commiter: ToCommitUser(commit.Committer),
Author: ToCommitUser(commit.Author),
Message: commit.CommitMessage,
}
}
// ToCommit convert a git.Commit to api.PayloadCommit
func ToCommit(repo *models.Repository, c *git.Commit) *api.PayloadCommit {
authorUsername := ""
@ -255,6 +311,7 @@ func ToHook(repoLink string, w *models.Webhook) *api.Hook {
config := map[string]string{
"url": w.URL,
"content_type": w.ContentType.Name(),
"http_method": w.HTTPMethod,
}
if w.HookTaskType == models.SLACK {
s := webhook.GetSlackHook(w)
@ -265,14 +322,45 @@ func ToHook(repoLink string, w *models.Webhook) *api.Hook {
}
return &api.Hook{
ID: w.ID,
Type: w.HookTaskType.Name(),
URL: fmt.Sprintf("%s/settings/hooks/%d", repoLink, w.ID),
Active: w.IsActive,
Config: config,
Events: w.EventsArray(),
Updated: w.UpdatedUnix.AsTime(),
Created: w.CreatedUnix.AsTime(),
ID: w.ID,
Type: w.HookTaskType.Name(),
URL: fmt.Sprintf("%s/settings/hooks/%d", repoLink, w.ID),
BranchFilter: w.HookEvent.BranchFilter,
Active: w.IsActive,
Config: config,
Events: w.EventsArray(),
Updated: w.UpdatedUnix.AsTime(),
Created: w.CreatedUnix.AsTime(),
}
}
func ToHookTask(t *models.HookTask) *api.HookTask {
config := map[string]string{
"url": t.URL,
"content_type": t.ContentType.Name(),
"http_method": t.HTTPMethod,
}
payloadContent := make(map[string]interface{})
requestContent := make(map[string]interface{})
responseContent := make(map[string]interface{})
_ = json.Unmarshal([]byte(t.PayloadContent), &payloadContent)
_ = json.Unmarshal([]byte(t.RequestContent), &requestContent)
_ = json.Unmarshal([]byte(t.ResponseContent), &responseContent)
return &api.HookTask{
ID: t.ID,
UUID: t.UUID,
Type: t.Type.Name(),
Config: config,
PayloadContent: payloadContent,
EventType: string(t.EventType),
IsSSL: t.IsSSL,
IsDelivered: t.IsDelivered,
Delivered: t.Delivered,
IsSucceed: t.IsSucceed,
RequestContent: requestContent,
ResponseContent: responseContent,
}
}
@ -391,6 +479,16 @@ func ToCommitMeta(repo *models.Repository, tag *git.Tag) *api.CommitMeta {
}
}
func ToCommitUserFolk(user *models.User) *api.CommitUser {
return &api.CommitUser{
Identity: api.Identity{
Name: user.Name,
Email: user.Email,
},
Date: user.CreatedUnix.AsTime().String(),
}
}
// ToTopicResponse convert from models.Topic to api.TopicResponse
func ToTopicResponse(topic *models.Topic) *api.TopicResponse {
return &api.TopicResponse{

View File

@ -42,28 +42,29 @@ func ToAPIPullRequest(pr *models.PullRequest) *api.PullRequest {
}
apiPullRequest := &api.PullRequest{
ID: pr.ID,
URL: pr.Issue.HTMLURL(),
Index: pr.Index,
Poster: apiIssue.Poster,
Title: apiIssue.Title,
Body: apiIssue.Body,
Labels: apiIssue.Labels,
Milestone: apiIssue.Milestone,
Assignee: apiIssue.Assignee,
Assignees: apiIssue.Assignees,
State: apiIssue.State,
IsLocked: apiIssue.IsLocked,
Comments: apiIssue.Comments,
HTMLURL: pr.Issue.HTMLURL(),
DiffURL: pr.Issue.DiffURL(),
PatchURL: pr.Issue.PatchURL(),
HasMerged: pr.HasMerged,
MergeBase: pr.MergeBase,
Deadline: apiIssue.Deadline,
Created: pr.Issue.CreatedUnix.AsTimePtr(),
Updated: pr.Issue.UpdatedUnix.AsTimePtr(),
ID: pr.ID,
URL: pr.Issue.HTMLURL(),
Index: pr.Index,
Poster: apiIssue.Poster,
Title: apiIssue.Title,
Body: apiIssue.Body,
Labels: apiIssue.Labels,
Milestone: apiIssue.Milestone,
Assignee: apiIssue.Assignee,
Assignees: apiIssue.Assignees,
State: apiIssue.State,
IsLocked: apiIssue.IsLocked,
Comments: apiIssue.Comments,
CommitNum: pr.CommitNum,
ChangedFiles: pr.ChangedFiles,
HTMLURL: pr.Issue.HTMLURL(),
DiffURL: pr.Issue.DiffURL(),
PatchURL: pr.Issue.PatchURL(),
HasMerged: pr.HasMerged,
MergeBase: pr.MergeBase,
Deadline: apiIssue.Deadline,
Created: pr.Issue.CreatedUnix.AsTimePtr(),
Updated: pr.Issue.UpdatedUnix.AsTimePtr(),
Base: &api.PRBranchInfo{
Name: pr.BaseBranch,
Ref: pr.BaseBranch,

View File

@ -5,7 +5,10 @@
package convert
import (
"strings"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/structs"
)
// ToCorrectPageSize makes sure page size is in allowed range.
@ -17,3 +20,36 @@ func ToCorrectPageSize(size int) int {
}
return size
}
// ToGitServiceType return GitServiceType based on string
func ToGitServiceType(value string) structs.GitServiceType {
switch strings.ToLower(value) {
case "github":
return structs.GithubService
case "gitea":
return structs.GiteaService
case "gitlab":
return structs.GitlabService
case "gogs":
return structs.GogsService
default:
return structs.PlainGitService
}
}
//
func ToBranchType(index int) structs.BranchKind{
switch(index){
case 1:
return structs.DefaultBranch
case 2:
return structs.ProtectedBranch
case 3:
return structs.OtherBranch
default:
return structs.None
}
}

View File

@ -293,6 +293,11 @@ func CommitsCount(repoPath, revision string) (int64, error) {
return commitsCount(repoPath, []string{revision}, []string{})
}
// CommitsCountByFile returns number of total commits of unitl given revision and file
func CommitsCountByFile(repoPath, revision, file string) (int64, error) {
return commitsCount(repoPath, []string{revision}, []string{file})
}
// CommitsCount returns number of total commits of until current revision.
func (c *Commit) CommitsCount() (int64, error) {
return CommitsCount(c.repo.Path, c.ID.String())
@ -303,6 +308,11 @@ func (c *Commit) CommitsByRange(page, pageSize int) (*list.List, error) {
return c.repo.commitsByRange(c.ID, page, pageSize)
}
// CommitsByFileAndRange returns the specific page page commits before current revision and file, every page's number default by CommitsRangeSize
func (c *Commit) CommitsByFileAndRange(file string, page, pageSize int) (*list.List, error) {
return c.repo.CommitsByFileAndRange(c.ID.String(), file, page, pageSize)
}
// CommitsBefore returns all the commits before current revision
func (c *Commit) CommitsBefore() (*list.List, error) {
return c.repo.getCommitsBefore(c.ID)

View File

@ -198,7 +198,6 @@ func (repo *Repository) GetCommitByPath(relpath string) (*Commit, error) {
if err != nil {
return nil, err
}
commits, err := repo.parsePrettyFormatLogToList(stdout)
if err != nil {
return nil, err
@ -206,6 +205,19 @@ func (repo *Repository) GetCommitByPath(relpath string) (*Commit, error) {
return commits.Front().Value.(*Commit), nil
}
// GetFirstAndLastCommitByPath returns the first commit and the last commit of relative path.
func (repo *Repository) GetFirstAndLastCommitByPath(revision, relpath string) (*Commit, *Commit, error) {
stdout, err := NewCommand("log", revision, prettyLogFormat, "--", relpath).RunInDirBytes(repo.Path)
if err != nil {
return nil, nil, err
}
commits, err := repo.parsePrettyFormatLogToList(stdout)
if err != nil {
return nil, nil, err
}
return commits.Front().Value.(*Commit), commits.Back().Value.(*Commit), nil
}
// CommitsRangeSize the default commits range size
var CommitsRangeSize = 50
@ -323,8 +335,8 @@ func (repo *Repository) FileCommitsCount(revision, file string) (int64, error) {
}
// CommitsByFileAndRange return the commits according revison file and the page
func (repo *Repository) CommitsByFileAndRange(revision, file string, page int) (*list.List, error) {
stdout, err := NewCommand("log", revision, "--follow", "--skip="+strconv.Itoa((page-1)*50),
func (repo *Repository) CommitsByFileAndRange(revision, file string, page, pageSize int) (*list.List, error) {
stdout, err := NewCommand("log", revision, "--follow", "--skip="+strconv.Itoa((page-1)*pageSize),
"--max-count="+strconv.Itoa(CommitsRangeSize), prettyLogFormat, "--", file).RunInDirBytes(repo.Path)
if err != nil {
return nil, err
@ -333,8 +345,8 @@ func (repo *Repository) CommitsByFileAndRange(revision, file string, page int) (
}
// CommitsByFileAndRangeNoFollow return the commits according revison file and the page
func (repo *Repository) CommitsByFileAndRangeNoFollow(revision, file string, page int) (*list.List, error) {
stdout, err := NewCommand("log", revision, "--skip="+strconv.Itoa((page-1)*50),
func (repo *Repository) CommitsByFileAndRangeNoFollow(revision, file string, page, pageSize int) (*list.List, error) {
stdout, err := NewCommand("log", revision, "--skip="+strconv.Itoa((page-1)*pageSize),
"--max-count="+strconv.Itoa(CommitsRangeSize), prettyLogFormat, "--", file).RunInDirBytes(repo.Path)
if err != nil {
return nil, err

View File

@ -186,6 +186,16 @@ func (repo *Repository) GetTag(name string) (*Tag, error) {
return tag, nil
}
func (repo *Repository) GetTagCount() (int64, error) {
stdout, err := NewCommand("tag").RunInDir(repo.Path)
if err != nil {
return 0, err
}
tagNames := strings.Split(strings.TrimRight(stdout, "\n"), "\n")
return int64(len(tagNames)), nil
}
// GetTagInfos returns all tag infos of the repository.
func (repo *Repository) GetTagInfos(page, pageSize int) ([]*Tag, error) {
// TODO this a slow implementation, makes one git command per tag

View File

@ -63,15 +63,15 @@ func setupComplexity(values []string) {
}
if len(requiredList) == 0 {
// No valid character classes found; use all classes as default
for _, complex := range charComplexities {
validChars += complex.ValidChars
requiredList = append(requiredList, complex)
}
// for _, complex := range charComplexities {
// validChars += complex.ValidChars
// requiredList = append(requiredList, complex)
// }
}
}
if validChars == "" {
// No complexities to check; provide a sensible default for password generation
validChars = charComplexities["lower"].ValidChars + charComplexities["upper"].ValidChars + charComplexities["digit"].ValidChars
// validChars = charComplexities["lower"].ValidChars + charComplexities["upper"].ValidChars + charComplexities["digit"].ValidChars
}
}

View File

@ -5,13 +5,14 @@
package repofiles
import (
"code.gitea.io/gitea/modules/log"
"fmt"
"net/url"
"path"
"strings"
"time"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/git"
api "code.gitea.io/gitea/modules/structs"
@ -40,12 +41,12 @@ func (ct *ContentType) String() string {
// GetContentsOrList gets the meta data of a file's contents (*ContentsResponse) if treePath not a tree
// directory, otherwise a listing of file contents ([]*ContentsResponse). Ref can be a branch, commit or tag
func GetContentsOrList(repo *models.Repository, treePath, ref string) (interface{}, error) {
startTotal:=time.Now()
log.Info("Enter time:%v",startTotal.Format("2006-01-02 15:04:05.000"))
startTotal := time.Now()
log.Info("Enter time:%v", startTotal.Format("2006-01-02 15:04:05.000"))
defer func() {
log.Info("***GetContentsOrList耗时:%v",time.Now().Sub(startTotal))
log.Info("***GetContentsOrList耗时:%v", time.Now().Sub(startTotal))
}()
start:=time.Now()
start := time.Now()
if repo.IsEmpty {
return make([]interface{}, 0), nil
}
@ -54,7 +55,7 @@ func GetContentsOrList(repo *models.Repository, treePath, ref string) (interface
}
origRef := ref
start=time.Now()
start = time.Now()
// Check that the path given in opts.treePath is valid (not a git path)
cleanTreePath := CleanUploadFileName(treePath)
if cleanTreePath == "" && treePath != "" {
@ -62,61 +63,61 @@ func GetContentsOrList(repo *models.Repository, treePath, ref string) (interface
Path: treePath,
}
}
log.Info("*****************GetContentsOrList.CleanUploadFileName:%v",time.Now().Sub(start))
start=time.Now()
log.Info("*****************GetContentsOrList.CleanUploadFileName:%v", time.Now().Sub(start))
start = time.Now()
treePath = cleanTreePath
gitRepo, err := git.OpenRepository(repo.RepoPath())
if err != nil {
return nil, err
}
defer gitRepo.Close()
log.Info("*****************GetContentsOrList.OpenRepository:%v",time.Now().Sub(start))
start=time.Now()
log.Info("*****************GetContentsOrList.OpenRepository:%v", time.Now().Sub(start))
start = time.Now()
// Get the commit object for the ref
commit, err := gitRepo.GetCommit(ref)
if err != nil {
return nil, err
}
log.Info("*****************GetContentsOrList.GetCommit:ret:%s treepath:%s", ref, treePath)
log.Info("*****************GetContentsOrList.GetCommit:%v",time.Now().Sub(start)," ref:",ref," treePath:",treePath)
start=time.Now()
log.Info("*****************GetContentsOrList.GetCommit:%v", time.Now().Sub(start), " ref:", ref, " treePath:", treePath)
start = time.Now()
entry, err := commit.GetTreeEntryByPath(treePath)
if err != nil {
return nil, err
}
log.Info("*****************GetContentsOrList.GetTreeEntryByPath:%v",time.Now().Sub(start))
log.Info("*****************GetContentsOrList.GetTreeEntryByPath:%v", time.Now().Sub(start))
if entry.Type() != "tree" {
a,b:= GetContents(repo, treePath, origRef, false)
log.Info("*****************GetContentsOrList.GetContents***:%v",time.Now().Sub(start))
return a,b
a, b := GetContents(repo, treePath, origRef, false)
log.Info("*****************GetContentsOrList.GetContents***:%v", time.Now().Sub(start))
return a, b
}
// We are in a directory, so we return a list of FileContentResponse objects
var fileList []*api.ContentsResponse
start=time.Now()
start = time.Now()
gitTree, err := commit.SubTree(treePath)
if err != nil {
return nil, err
}
log.Info("*****************GetContentsOrList.SubTree:%v",time.Now().Sub(start))
log.Info("*****************GetContentsOrList.SubTree:%v", time.Now().Sub(start))
entries, err := gitTree.ListEntries()
if err != nil {
return nil, err
}
start=time.Now()
start = time.Now()
//add by qiubing
commitsInfo, _, err := entries.GetCommitsInfo(commit, treePath, nil)
if err != nil {
return nil, err
}
//end by qiubing
start1:=time.Now()
log.Info("****GetContentsOrList.GetCommitsInfo:%v",time.Now().Sub(start))
start1 := time.Now()
log.Info("****GetContentsOrList.GetCommitsInfo:%v", time.Now().Sub(start))
for _, e := range entries {
subTreePath := path.Join(treePath, e.Name())
start2:=time.Now()
fileContentResponse, err := GetContentsExt(gitRepo,commit,repo, subTreePath, origRef, true)
log.Info("*****GetContentsOrList.GetContents:%s %v",e.Name(),time.Now().Sub(start2))
start2 := time.Now()
fileContentResponse, err := GetContentsExt(gitRepo, commit, repo, subTreePath, origRef, true)
log.Info("*****GetContentsOrList.GetContents:%s %v", e.Name(), time.Now().Sub(start2))
// add by qiubing
for _, commitInfo := range commitsInfo {
if treeEntry, ok := commitInfo[0].(*git.TreeEntry); ok {
@ -128,9 +129,9 @@ func GetContentsOrList(repo *models.Repository, treePath, ref string) (interface
entryCommit = value.Commit
}
fileContentResponse.LatestCommit = api.ContentsResponseCommit{
Message: entryCommit.CommitMessage,
Message: entryCommit.CommitMessage,
LatestCommitSha: entryCommit.ID.String(),
Created: entryCommit.Author.When.Unix(),
Created: entryCommit.Author.When.Unix(),
}
break
}
@ -143,14 +144,12 @@ func GetContentsOrList(repo *models.Repository, treePath, ref string) (interface
}
fileList = append(fileList, fileContentResponse)
}
log.Info("*****************GetContentsOrList.for-entries:%v",time.Now().Sub(start1))
log.Info("*****************GetContentsOrList.for-entries:%v", time.Now().Sub(start1))
return fileList, nil
}
// GetContents gets the meta data on a file's contents. Ref can be a branch, commit or tag
func GetContentsExt(gitRepo *git.Repository, commit *git.Commit,repo *models.Repository, treePath, ref string, forList bool) (*api.ContentsResponse, error) {
func GetContentsExt(gitRepo *git.Repository, commit *git.Commit, repo *models.Repository, treePath, ref string, forList bool) (*api.ContentsResponse, error) {
if ref == "" {
ref = repo.DefaultBranch
}
@ -223,7 +222,9 @@ func GetContentsExt(gitRepo *git.Repository, commit *git.Commit,repo *models.Rep
if err != nil {
return nil, err
}
contentsResponse.SubmoduleGitURL = &submodule.URL
if submodule != nil {
contentsResponse.SubmoduleGitURL = &submodule.URL
}
}
// Handle links
if entry.IsRegular() || entry.IsLink() {
@ -254,6 +255,7 @@ func GetContentsExt(gitRepo *git.Repository, commit *git.Commit,repo *models.Rep
return contentsResponse, nil
}
// GetContents gets the meta data on a file's contents. Ref can be a branch, commit or tag
func GetContents(repo *models.Repository, treePath, ref string, forList bool) (*api.ContentsResponse, error) {
if ref == "" {

View File

@ -19,12 +19,13 @@ var (
// Hook a hook is a web hook when one repository changed
type Hook struct {
ID int64 `json:"id"`
Type string `json:"type"`
URL string `json:"-"`
Config map[string]string `json:"config"`
Events []string `json:"events"`
Active bool `json:"active"`
ID int64 `json:"id"`
Type string `json:"type"`
URL string `json:"-"`
Config map[string]string `json:"config"`
Events []string `json:"events"`
Active bool `json:"active"`
BranchFilter string `json:"branch_filter"`
// swagger:strfmt date-time
Updated time.Time `json:"updated_at"`
// swagger:strfmt date-time
@ -34,6 +35,21 @@ type Hook struct {
// HookList represents a list of API hook.
type HookList []*Hook
type HookTask struct {
ID int64 `json:"id"`
UUID string `json:"uuid"`
Type string `json:"type"`
Config map[string]string `json:"config"`
PayloadContent map[string]interface{} `json:"payload_content"`
EventType string `json:"event_type"`
IsSSL bool `json:"is_ssl"`
IsDelivered bool `json:"is_delivered"`
Delivered int64 `json:"delivered"`
IsSucceed bool `json:"is_succeed"`
RequestContent map[string]interface{} `json:"request_info"`
ResponseContent map[string]interface{} `json:"response_content"`
}
// CreateHookOptionConfig has all config options in it
// required are "content_type" and "url" Required
type CreateHookOptionConfig map[string]string

View File

@ -10,19 +10,21 @@ import (
// PullRequest represents a pull request
type PullRequest struct {
ID int64 `json:"id"`
URL string `json:"url"`
Index int64 `json:"number"`
Poster *User `json:"user"`
Title string `json:"title"`
Body string `json:"body"`
Labels []*Label `json:"labels"`
Milestone *Milestone `json:"milestone"`
Assignee *User `json:"assignee"`
Assignees []*User `json:"assignees"`
State StateType `json:"state"`
IsLocked bool `json:"is_locked"`
Comments int `json:"comments"`
ID int64 `json:"id"`
URL string `json:"url"`
Index int64 `json:"number"`
Poster *User `json:"user"`
Title string `json:"title"`
Body string `json:"body"`
Labels []*Label `json:"labels"`
Milestone *Milestone `json:"milestone"`
Assignee *User `json:"assignee"`
Assignees []*User `json:"assignees"`
State StateType `json:"state"`
IsLocked bool `json:"is_locked"`
Comments int `json:"comments"`
CommitNum int `json:"commit_num"`
ChangedFiles int `json:"changed_files"`
HTMLURL string `json:"html_url"`
DiffURL string `json:"diff_url"`

View File

@ -1,3 +1,11 @@
/*
* @Description: Do not edit
* @Date: 2021-07-09 10:47:30
* @LastEditors: viletyy
* @Author: viletyy
* @LastEditTime: 2021-09-27 16:46:33
* @FilePath: /gitea-1120-rc1/modules/structs/release.go
*/
// Copyright 2016 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
@ -14,6 +22,7 @@ type Release struct {
TagName string `json:"tag_name"`
Target string `json:"target_commitish"`
Title string `json:"name"`
Sha1 string `json:"sha"`
Note string `json:"body"`
URL string `json:"url"`
HTMLURL string `json:"html_url"`

View File

@ -8,6 +8,12 @@ import (
"time"
)
//add
type RepoBranchAndTagCount struct {
BranchCount int `json:"branch_count"`
TagCount int `json:"tag_count"`
}
// Permission represents a set of permissions
type Permission struct {
Admin bool `json:"admin"`
@ -230,6 +236,7 @@ type MigrateRepoOption struct {
CloneAddr string `json:"clone_addr" binding:"Required"`
AuthUsername string `json:"auth_username"`
AuthPassword string `json:"auth_password"`
AuthToken string `json:"auth_token"`
// required: true
UID int `json:"uid" binding:"Required"`
// required: true

View File

@ -5,12 +5,14 @@
package structs
import (
"strings"
"time"
)
// Branch represents a repository branch
type Branch struct {
Name string `json:"name"`
CommitID string `json:"commit_id"` // add configure
Commit *PayloadCommit `json:"commit"`
Protected bool `json:"protected"`
RequiredApprovals int64 `json:"required_approvals"`
@ -19,7 +21,56 @@ type Branch struct {
UserCanPush bool `json:"user_can_push"`
UserCanMerge bool `json:"user_can_merge"`
EffectiveBranchProtectionName string `json:"effective_branch_protection_name"`
CommitTime string `json:"commit_time"` // add configure
DefaultBranch string `json:"default_branch"`
BranchKind int `json:"branch_kind"`
}
type BranchKind int
const (
None BranchKind = iota
DefaultBranch
ProtectedBranch
OtherBranch
)
func (bk BranchKind) Name() string{
return strings.ToLower(bk.Title())
}
func (bk BranchKind) Title() string {
switch bk {
case DefaultBranch:
return "default"
case ProtectedBranch:
return "protected"
case OtherBranch:
return "other"
}
return ""
}
type BranchesSlice struct {
BranchName string `json:"branch_name"`
// BranchKind int `json:"branch_kind"`
Branches []Branch `json:"branches"`
}
// sort by branchkind
type SortBranch []Branch
func (s SortBranch) Len() int { return len(s) }
func (s SortBranch) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s SortBranch) Less(i, j int) bool { return s[i].BranchKind < s[j].BranchKind}
// sort by CommiTime of the branch
type SortBranchTime []Branch
func (s SortBranchTime) Len() int { return len(s) }
func (s SortBranchTime) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s SortBranchTime) Less(i, j int) bool { return s[i].CommitTime > s[j].CommitTime}
// BranchProtection represents a branch protection for a repository
type BranchProtection struct {

View File

@ -1,3 +1,11 @@
/*
* @Description: Do not edit
* @Date: 2021-09-07 17:24:32
* @LastEditors: viletyy
* @Author: viletyy
* @LastEditTime: 2021-09-29 10:16:48
* @FilePath: /gitea-1120-rc1/modules/structs/repo_commit.go
*/
// Copyright 2018 The Gogs Authors. All rights reserved.
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
@ -38,6 +46,7 @@ type RepoCommit struct {
}
// Commit contains information generated from a Git commit.
type SortCommit []Commit
type Commit struct {
*CommitMeta
HTMLURL string `json:"html_url"`
@ -45,8 +54,19 @@ type Commit struct {
Author *User `json:"author"`
Committer *User `json:"committer"`
Parents []*CommitMeta `json:"parents"`
CommitDate string `json:"commit_date"`
Branch string `json:"branch"`
}
type CommitsSlice struct {
CommitDate string `json:"commit_date"`
Commits []Commit
}
func (s SortCommit) Len() int { return len(s) }
func (s SortCommit) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s SortCommit) Less(i, j int) bool { return s[i].CommitDate > s[j].CommitDate }
// CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE
type CommitDateOptions struct {
// swagger:strfmt date-time

View File

@ -1,3 +1,11 @@
/*
* @Description: Do not edit
* @Date: 2021-09-23 17:10:03
* @LastEditors: viletyy
* @Author: viletyy
* @LastEditTime: 2021-09-24 17:45:38
* @FilePath: /gitea-1120-rc1/modules/structs/repo_tag.go
*/
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
@ -8,11 +16,20 @@ package structs
type Tag struct {
Name string `json:"name"`
ID string `json:"id"`
Commit *CommitMeta `json:"commit"`
Commit *TagCommit `json:"commit"`
Tagger *CommitUser `json:"tagger"`
Message string `json:"message"`
ZipballURL string `json:"zipball_url"`
TarballURL string `json:"tarball_url"`
}
type TagCommit struct {
*CommitMeta
Commiter *CommitUser `json:"commiter"`
Author *CommitUser `json:"author"`
Message string `json:"message"`
}
// AnnotatedTag represents an annotated tag
type AnnotatedTag struct {
Tag string `json:"tag"`

50
modules/structs/wiki.go Normal file
View File

@ -0,0 +1,50 @@
/*
* @Date: 2021-08-06 14:28:55
* @LastEditors: viletyy
* @LastEditTime: 2021-08-19 18:00:34
* @FilePath: /gitea-1120-rc1/modules/structs/wiki.go
*/
package structs
type WikiesResponse struct {
WikiMeta
WikiCloneLink CloneLink `json:"wiki_clone_link"`
}
type WikiMeta struct {
Name string `json:"name"`
Commit WikiCommit `json:"commit"`
FirstCommit WikiCommit `json:"-"`
//WikiCloneLink CloneLink `json:"wiki_clone_link"`
}
type WikiCommit struct {
ID string `json:"id"`
Message string `json:"message"`
Author WikiUser `json:"author"`
Commiter WikiUser `json:"-"`
}
type WikiUser struct {
Name string `json:"name"`
Email string `json:"email"`
When int64 `json:"when"`
}
type WikiResponse struct {
WikiMeta
CommitCounts int64 `json:"commit_counts"`
MdContent string `json:"md_content"`
SimpleContent string `json:"simple_content"`
WikiCloneLink CloneLink `json:"wiki_clone_link"`
}
type WikiOption struct {
Name string `json:"name"`
Content string `json:"content"`
CommitMessage string `json:"commit_message"`
}
type CloneLink struct {
SSH string `json:"ssh"`
HTTPS string `json:"https"`
}

308
modules/wikies/wiki.go Normal file
View File

@ -0,0 +1,308 @@
/*
* @Date: 2021-08-06 09:53:43
* @LastEditors: viletyy
* @LastEditTime: 2021-08-19 17:58:21
* @FilePath: /gitea-1120-rc1/modules/wikies/wiki.go
*/
package wikies
import (
"fmt"
"code.gitea.io/gitea/models"
repo_module "code.gitea.io/gitea/modules/repository"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/sync"
"code.gitea.io/gitea/modules/util"
"github.com/unknwon/com"
//"github.com/unknwon/com"
"io/ioutil"
"net/url"
"strings"
//"code.gitea.io/gitea/modules/wikies"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
wiki_service "code.gitea.io/gitea/services/wiki"
)
var (
reservedWikiNames = []string{"_pages", "_new", "_edit", "raw"}
wikiWorkingPool = sync.NewExclusivePool()
)
func nameAllowed(name string) error {
if util.IsStringInSlice(name, reservedWikiNames) {
return models.ErrWikiReservedName{
Title: name,
}
}
return nil
}
func InitWiki(repo *models.Repository) error {
if repo.HasWiki() {
return nil
}
if err := git.InitRepository(repo.WikiPath(), true); err != nil {
return fmt.Errorf("InitRepository: %v", err)
} else if err = repo_module.CreateDelegateHooks(repo.WikiPath()); err != nil {
return fmt.Errorf("createDelegateHooks: %v", err)
}
return nil
}
func FindWikiRepoCommit(ctx *context.APIContext) (*git.Repository, *git.Commit, error) {
wikiRepo, err := git.OpenRepository(ctx.Repo.Repository.WikiPath())
if err != nil {
ctx.ServerError("OpenRepository", err)
return nil, nil, err
}
commit, err := wikiRepo.GetBranchCommit("master")
if err != nil {
return wikiRepo, nil, err
}
return wikiRepo, commit, nil
}
func WikiContentsByName(ctx *context.APIContext, commit *git.Commit, wikiName string) ([]byte, *git.TreeEntry, string, bool) {
pageFilename := wiki_service.NameToFilename(wikiName)
entry, err := findEntryForFile(commit, pageFilename)
if err != nil && !git.IsErrNotExist(err) {
ctx.ServerError("findEntryForFile", err)
return nil, nil, "", false
} else if entry == nil {
return nil, nil, "", true
}
return wikiContentsByEntry(ctx, entry), entry, pageFilename, false
}
func findEntryForFile(commit *git.Commit, target string) (*git.TreeEntry, error) {
entry, err := commit.GetTreeEntryByPath(target)
if err != nil && !git.IsErrNotExist(err) {
return nil, err
}
if entry != nil {
return entry, nil
}
// Then the unescaped, shortest alternative
var unescapedTarget string
if unescapedTarget, err = url.QueryUnescape(target); err != nil {
return nil, err
}
return commit.GetTreeEntryByPath(unescapedTarget)
}
func wikiContentsByEntry(ctx *context.APIContext, entry *git.TreeEntry) []byte {
reader, err := entry.Blob().DataAsync()
if err != nil {
ctx.ServerError("Blob.Data", err)
return nil
}
defer reader.Close()
content, err := ioutil.ReadAll(reader)
if err != nil {
ctx.ServerError("ReadAll", err)
return nil
}
return content
}
func CreateWikiPage(doer *models.User, repo *models.Repository, wikiName, content, message string) error {
return updateWikiPage(doer, repo, "", wikiName, content, message, true)
}
func EditWikiPage(doer *models.User, repo *models.Repository, oldWikiName, newWikiName, content, message string) error {
return updateWikiPage(doer, repo, oldWikiName, newWikiName, content, message, false)
}
func updateWikiPage(doer *models.User, repo *models.Repository, oldWikiName, newWikiName, content, message string, isNew bool) (err error) {
if err = nameAllowed(newWikiName); err != nil {
return err
}
wikiWorkingPool.CheckIn(com.ToStr(repo.ID))
defer wikiWorkingPool.CheckOut(com.ToStr(repo.ID))
if err = InitWiki(repo); err != nil {
return fmt.Errorf("InitWiki: %v", err)
}
hasMasterBranch := git.IsBranchExist(repo.WikiPath(), "master")
basePath, err := models.CreateTemporaryPath("update-wiki")
if err != nil {
return err
}
defer func() {
if err := models.RemoveTemporaryPath(basePath); err != nil {
log.Error("Merge: RemoveTemporaryPath: %s", err)
}
}()
cloneOpts := git.CloneRepoOptions{
Bare: true,
Shared: true,
}
if hasMasterBranch {
cloneOpts.Branch = "master"
}
if err := git.Clone(repo.WikiPath(), basePath, cloneOpts); err != nil {
log.Error("Failed to clone repository: %s (%v)", repo.FullName(), err)
return fmt.Errorf("Failed to clone repository: %s (%v)", repo.FullName(), err)
}
gitRepo, err := git.OpenRepository(basePath)
if err != nil {
log.Error("Unable to open temporary repository: %s (%v)", basePath, err)
return fmt.Errorf("Failed to open new temporary repository in: %s %v", basePath, err)
}
defer gitRepo.Close()
if hasMasterBranch {
if err := gitRepo.ReadTreeToIndex("HEAD"); err != nil {
log.Error("Unable to read HEAD tree to index in: %s %v", basePath, err)
return fmt.Errorf("Unable to read HEAD tree to index in: %s %v", basePath, err)
}
}
newWikiPath := wiki_service.NameToFilename(newWikiName)
if isNew {
filesInIndex, err := gitRepo.LsFiles(newWikiPath)
if err != nil {
log.Error("%v", err)
return err
}
if util.IsStringInSlice(newWikiPath, filesInIndex) {
return models.ErrWikiAlreadyExist{
Title: newWikiPath,
}
}
} else {
oldWikiPath := wiki_service.NameToFilename(oldWikiName)
filesInIndex, err := gitRepo.LsFiles(oldWikiPath)
if err != nil {
log.Error("%v", err)
return err
}
if util.IsStringInSlice(oldWikiPath, filesInIndex) {
err := gitRepo.RemoveFilesFromIndex(oldWikiPath)
if err != nil {
log.Error("%v", err)
return err
}
}
}
// FIXME: The wiki doesn't have lfs support at present - if this changes need to check attributes here
objectHash, err := gitRepo.HashObject(strings.NewReader(content))
if err != nil {
log.Error("%v", err)
return err
}
if err := gitRepo.AddObjectToIndex("100644", objectHash, newWikiPath); err != nil {
log.Error("%v", err)
return err
}
tree, err := gitRepo.WriteTree()
if err != nil {
log.Error("%v", err)
return err
}
commitTreeOpts := git.CommitTreeOpts{
Message: message,
}
sign, signingKey, _ := repo.SignWikiCommit(doer)
if sign {
commitTreeOpts.KeyID = signingKey
} else {
commitTreeOpts.NoGPGSign = true
}
if hasMasterBranch {
commitTreeOpts.Parents = []string{"HEAD"}
}
commitHash, err := gitRepo.CommitTree(doer.NewGitSig(), tree, commitTreeOpts)
if err != nil {
log.Error("%v", err)
return err
}
if err := git.Push(basePath, git.PushOptions{
Remote: "origin",
Branch: fmt.Sprintf("%s:%s%s", commitHash.String(), git.BranchPrefix, "master"),
Env: models.FullPushingEnvironment(
doer,
doer,
repo,
repo.Name+".wiki",
0,
),
}); err != nil {
log.Error("%v", err)
if git.IsErrPushOutOfDate(err) || git.IsErrPushRejected(err) {
return err
}
return fmt.Errorf("Push: %v", err)
}
return nil
}
// NewWikiPost response for wiki create request
func NewWikiPost(ctx *context.APIContext, form api.WikiOption) {
ctx.Data["Title"] = ctx.Tr("repo.wiki.new_page")
ctx.Data["PageIsWiki"] = true
ctx.Data["RequireSimpleMDE"] = true
if util.IsEmptyString(form.Name) {
//ctx.RenderWithErr(ctx.Tr("repo.issues.new.title_empty"), nil, form)
return
}
wikiName := wiki_service.NormalizeWikiName(form.Name)
if len(form.CommitMessage) == 0 {
form.CommitMessage = ctx.Tr("repo.editor.add", form.Name)
}
if err := wiki_service.AddWikiPage(ctx.User, ctx.Repo.Repository, wikiName, form.Content, form.CommitMessage); err != nil {
if models.IsErrWikiReservedName(err) {
ctx.Data["Err_Title"] = true
//ctx.RenderWithErr(ctx.Tr("repo.wiki.reserved_page", wikiName), tplWikiNew, &form)
} else if models.IsErrWikiAlreadyExist(err) {
ctx.Data["Err_Title"] = true
//ctx.RenderWithErr(ctx.Tr("repo.wiki.page_already_exists"), tplWikiNew, &form)
} else {
//ctx.ServerError("AddWikiPage", err)
}
return
}
//ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + wiki_service.NameToSubURL(wikiName))
}
func EditWikiPost(ctx *context.APIContext, form api.WikiOption) {
ctx.Data["Title"] = ctx.Tr("repo.wiki.new_page")
ctx.Data["PageIsWiki"] = true
ctx.Data["RequireSimpleMDE"] = true
oldWikiName := wiki_service.NormalizeWikiName(ctx.Params(":page"))
newWikiName := wiki_service.NormalizeWikiName(form.Name)
//newWikiName, _= url.QueryUnescape(newWikiName)
if len(form.CommitMessage) == 0 {
form.CommitMessage = ctx.Tr("repo.editor.update", form.Name)
}
if err := wiki_service.EditWikiPage(ctx.User, ctx.Repo.Repository, oldWikiName, newWikiName, form.Content, form.CommitMessage); err != nil {
ctx.ServerError("EditWikiPage", err)
return
}
}

View File

@ -65,6 +65,9 @@
package v1
import (
"net/http"
"strings"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/auth"
"code.gitea.io/gitea/modules/context"
@ -81,13 +84,33 @@ import (
_ "code.gitea.io/gitea/routers/api/v1/swagger" // for swagger generation
"code.gitea.io/gitea/routers/api/v1/user"
"code.gitea.io/gitea/routers/api/v1/viewfile"
"net/http"
"strings"
"gitea.com/macaron/binding"
"gitea.com/macaron/macaron"
)
func MustEnableWiki(ctx *context.Context) {
if !ctx.Repo.CanRead(models.UnitTypeWiki) &&
!ctx.Repo.CanRead(models.UnitTypeExternalWiki) {
if log.IsTrace() {
log.Trace("Permission Denied: User %-v cannot read %-v or %-v of repo %-v\n"+
"User in repo has Permissions: %-+v",
ctx.User,
models.UnitTypeWiki,
models.UnitTypeExternalWiki,
ctx.Repo.Repository,
ctx.Repo.Permission)
}
ctx.NotFound("MustEnableWiki", nil)
return
}
unit, err := ctx.Repo.Repository.GetUnit(models.UnitTypeExternalWiki)
if err == nil {
ctx.Redirect(unit.ExternalWikiConfig().ExternalWikiURL)
return
}
}
func sudo() macaron.Handler {
return func(ctx *context.APIContext) {
sudo := ctx.Query("sudo")
@ -206,7 +229,7 @@ func reqBasicAuth() macaron.Handler {
return func(ctx *context.APIContext) {
if !ctx.Context.IsBasicAuth {
// fmt.Println("***********:",http.StatusUnauthorized)
// fmt.Println("***********:",http.StatusUnauthorized)
ctx.Context.Error(http.StatusUnauthorized)
return
}
@ -551,7 +574,6 @@ func RegisterRoutes(m *macaron.Macaron) {
Patch(notify.ReadThread)
}, reqToken())
m.Group("/users", func() {
m.Get("/search", user.Search)
@ -585,7 +607,6 @@ func RegisterRoutes(m *macaron.Macaron) {
})
}, reqToken())
//数据统计
m.Group("/activity", func() {
m.Get("", report.GetActivity)
@ -653,9 +674,8 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Combo("/repositories/:id", reqToken()).Get(repo.GetByID)
//
m.Group("/repos", func() {
m.Get("/search", repo.Search)
m.Get("/issues/search", repo.SearchIssues)
@ -672,30 +692,30 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Get("/ext", viewfile.RepoRefByType(context.RepoRefBranch), viewfile.ViewFile)
m.Get("/branch/*", viewfile.RepoRefByType(context.RepoRefBranch), viewfile.ViewFile)
m.Get("/tag/*",viewfile.RepoRefByType(context.RepoRefTag), viewfile.ViewFile)
m.Get("/tag/*", viewfile.RepoRefByType(context.RepoRefTag), viewfile.ViewFile)
m.Get("/commit/*", viewfile.RepoRefByType(context.RepoRefCommit), viewfile.ViewFile)
//update by 2021-01-12 end 引用自定义包;
// alter on 2021/01/15
m.Get("", viewfile.Readme) // reqRepoReader(models.UnitTypeCode),
},reqToken())
m.Get("", viewfile.Readme) // reqRepoReader(models.UnitTypeCode),
m.Get("/*", viewfile.ReadmeByPath) // reqRepoReader(models.UnitTypeCode),
})
m.Group("/count", func() {
m.Get("", viewfile.CommitCount) //****
m.Get("", viewfile.CommitCount) //****
})
m.Group("/releases", func() {
m.Get("/latest", viewfile.LatestRelease) //响应数据待确认 to do;
m.Get("/latest", viewfile.LatestRelease) //响应数据待确认 to do;
})
//
m.Group("/find", func() {
m.Get("", viewfile.FindFiles) //文件搜索 ****
m.Get("", viewfile.FindFiles) //文件搜索 ****
})
m.Group("/contributors", func() {
m.Get("", report.GetContributors) //获取仓库的所有构建者信息 ****
m.Get("", report.GetContributors) //获取仓库的所有构建者信息 ****
})
m.Combo("").Get(reqAnyRepoReader(), repo.Get).
Delete(reqToken(), reqOwner(), repo.Delete).
Patch(reqToken(), reqAdmin(), bind(api.EditRepoOption{}), context.RepoRef(), repo.Edit)
@ -703,6 +723,16 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Combo("/notifications").
Get(reqToken(), notify.ListRepoNotifications).
Put(reqToken(), notify.ReadRepoNotifications)
m.Group("/wikies", func() {
m.Combo("").Get(repo.WikiList).
Post(bind(api.WikiOption{}), repo.CreateWiki)
m.Group("/:page", func() {
m.Combo("").Get(repo.GetWiki).
Patch(bind(api.WikiOption{}), repo.EditWiki).
Delete(repo.DeleteWiki)
})
})
m.Group("/hooks", func() {
m.Combo("").Get(repo.ListHooks).
Post(bind(api.CreateHookOption{}), repo.CreateHook)
@ -711,7 +741,9 @@ func RegisterRoutes(m *macaron.Macaron) {
Patch(bind(api.EditHookOption{}), repo.EditHook).
Delete(repo.DeleteHook)
m.Post("/tests", context.RepoRef(), repo.TestHook)
m.Get("/hooktasks", repo.ListHookTask)
})
m.Group("/git", func() {
m.Combo("").Get(repo.ListGitHooks)
m.Group("/:id", func() {
@ -757,6 +789,7 @@ func RegisterRoutes(m *macaron.Macaron) {
Post(reqToken(), reqRepoReader(models.UnitTypeCode), bind(api.CreateForkOption{}), repo.CreateFork)
m.Group("/branches", func() {
m.Get("", repo.ListBranches)
m.Get("/branches_slice", repo.ListBranchesSlice)
m.Get("/*", context.RepoRefByType(context.RepoRefBranch), repo.GetBranch)
m.Delete("/*", reqRepoWriter(models.UnitTypeCode), context.RepoRefByType(context.RepoRefBranch), repo.DeleteBranch)
m.Post("", reqRepoWriter(models.UnitTypeCode), bind(api.CreateBranchRepoOption{}), repo.CreateBranch)
@ -773,6 +806,9 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/tags", func() {
m.Get("", repo.ListTags)
}, reqRepoReader(models.UnitTypeCode), context.ReferencesGitRepo(true))
m.Group("/branch_tag_count", func() {
m.Get("", repo.GetRepoBranchAndTagCount)
}, reqRepoReader(models.UnitTypeCode), context.ReferencesGitRepo(true))
m.Group("/keys", func() {
m.Combo("").Get(repo.ListDeployKeys).
Post(bind(api.CreateKeyOption{}), repo.CreateDeployKey)
@ -913,11 +949,16 @@ func RegisterRoutes(m *macaron.Macaron) {
}, reqRepoReader(models.UnitTypeCode))
m.Group("/commits", func() {
m.Get("", repo.GetAllCommits)
m.Group("/:ref", func() {
m.Get("/status", repo.GetCombinedCommitStatusByRef)
m.Get("/statuses", repo.GetCommitStatusesByRef)
})
}, reqRepoReader(models.UnitTypeCode))
m.Get("/commits_slice", repo.GetAllCommitsSliceByTime)
m.Group("/file_commits", func() {
m.Get("/*", repo.GetFileAllCommits)
})
m.Group("/git", func() {
m.Group("/commits", func() {
m.Get("/:sha", repo.GetSingleCommit)
@ -954,8 +995,8 @@ func RegisterRoutes(m *macaron.Macaron) {
// Organizations
m.Get("/user/orgs", reqToken(), org.ListMyOrgs)
m.Get("/users/:username/orgs", org.ListUserOrgs)
// modified on 2021-01-14 begin 创建组织时返回默认的团队 begin
//m.Post("/orgs", reqToken(), bind(api.CreateOrgOption{}), org.Create)
// modified on 2021-01-14 begin 创建组织时返回默认的团队 begin
//m.Post("/orgs", reqToken(), bind(api.CreateOrgOption{}), org.Create)
m.Post("/orgs", reqToken(), bind(api.CreateOrgOption{}), org.CreateExt)
// modified on 2021-01-14 begin 创建组织时返回默认的团队 end

View File

@ -6,6 +6,10 @@
package repo
import (
"fmt"
"net/http"
"sort"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
@ -14,8 +18,6 @@ import (
"code.gitea.io/gitea/modules/repofiles"
repo_module "code.gitea.io/gitea/modules/repository"
api "code.gitea.io/gitea/modules/structs"
"fmt"
"net/http"
)
// GetBranch get a branch of a repository
@ -45,8 +47,6 @@ func GetBranch(ctx *context.APIContext) {
// "200":
// "$ref": "#/responses/Branch"
if ctx.Repo.TreePath != "" {
// if TreePath != "", then URL contained extra slashes
// (i.e. "master/subbranch" instead of "master"), so branch does
@ -328,6 +328,92 @@ func ListBranches(ctx *context.APIContext) {
ctx.JSON(http.StatusOK, &apiBranches)
}
// ListBranches list all the branches of a repository
func ListBranchesSlice(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/branches/branches_slice repository repoListBranchesSlice
// ---
// summary: List a repository's branches, Group sort.
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/BranchList"
//start:=time.Now()
branches, err := repo_module.GetBranches(ctx.Repo.Repository)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetBranches", err)
return
}
//fmt.Println("***************** *GetBranches:",time.Now().Sub(start)," ",branches,len(branches))
apiBranches := make([]*api.Branch, len(branches))
// add configure
apiBranchesList := []api.Branch{}
for i := range branches {
c, err := branches[i].GetCommit()
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetCommit", err)
return
}
//fmt.Println("****branches[i]:",branches[i])
branchProtection, err := ctx.Repo.Repository.GetBranchProtection(branches[i].Name)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetBranchProtection", err)
return
}
//fmt.Println("****branchProtection:",branchProtection)
apiBranches[i], err = convert.ToBranch(ctx.Repo.Repository, branches[i], c, branchProtection, ctx.User, ctx.Repo.IsAdmin())
if err != nil {
ctx.Error(http.StatusInternalServerError, "convert.ToBranch", err)
return
}
apiBranchesList = append(apiBranchesList, *apiBranches[i])
//fmt.Println("****apiBranches[i]:",apiBranches[i])
}
ctx.JSON(http.StatusOK, BranchesSliceByProtection(ctx, apiBranchesList))
}
// branches slice. Group by protection
func BranchesSliceByProtection(ctx *context.APIContext, branchList []api.Branch) []api.BranchesSlice {
// group by protection
sort.Sort(api.SortBranch(branchList))
branchSlice := make([]api.BranchesSlice, 0)
i := 0
var j int
for {
if i >= len(branchList) {
break
}
for j = i + 1; j < len(branchList) && (branchList[i].BranchKind == branchList[j].BranchKind); j++ {
}
// get the same branches
sameBranchSlice := branchList[i:j]
// sort by time
sort.Sort(api.SortBranchTime(sameBranchSlice))
branchSlice = append(branchSlice, api.BranchesSlice{
BranchName: convert.ToBranchType(branchList[i].BranchKind).Name(),
Branches: sameBranchSlice,
})
i = j
}
return branchSlice
}
// GetBranchProtection gets a branch protection
func GetBranchProtection(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/branch_protections/{name} repository repoGetBranchProtection

View File

@ -9,18 +9,19 @@ import (
"fmt"
"math"
"net/http"
"sort"
"strconv"
"time"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/gitgraph"
"code.gitea.io/gitea/services/gitdiff"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/validation"
"code.gitea.io/gitea/routers/api/v1/utils"
"code.gitea.io/gitea/services/gitdiff"
)
// GetSingleCommit get a commit via sha
@ -83,6 +84,140 @@ func getCommit(ctx *context.APIContext, identifier string) {
ctx.JSON(http.StatusOK, json)
}
// GetFileCommits get all commits by path on a repository
func GetFileAllCommits(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/file_commits/{filepath} repository repoGetFileAllCommits
// ---
// summary: Get a list of all commits by filepath from a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: filepath
// in: path
// description: filepath of the file to get
// type: string
// required: true
// - name: sha
// in: query
// description: SHA or branch to start listing commits from (usually 'master')
// type: string
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
// description: page size of results
// type: integer
// responses:
// "200":
// "$ref": "#/responses/FileCommitList"
// "404":
// "$ref": "#/responses/notFound"
// "409":
// "$ref": "#/responses/EmptyRepository"
if ctx.Repo.Repository.IsEmpty {
ctx.JSON(http.StatusConflict, api.APIError{
Message: "Git Repository is empty.",
URL: setting.API.SwaggerURL,
})
return
}
gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath())
if err != nil {
ctx.ServerError("OpenRepository", err)
return
}
defer gitRepo.Close()
listOptions := utils.GetListOptions(ctx)
if listOptions.Page <= 0 {
listOptions.Page = 1
}
if listOptions.PageSize > git.CommitsRangeSize {
listOptions.PageSize = git.CommitsRangeSize
}
sha := ctx.Query("sha")
treePath := ctx.Params("*")
var baseCommit *git.Commit
var commitsCountTotal int64
if len(sha) == 0 {
head, err := gitRepo.GetHEADBranch()
if err != nil {
ctx.ServerError("GetHEADBranch", err)
return
}
baseCommit, err = gitRepo.GetBranchCommit(head.Name)
if err != nil {
ctx.ServerError("GetCommit", err)
return
}
commitsCountTotal, err = git.CommitsCountByFile(gitRepo.Path, head.Name, treePath)
if err != nil {
ctx.ServerError("CommitsCount", err)
return
}
} else {
baseCommit, err = gitRepo.GetCommit(sha)
if err != nil {
ctx.ServerError("GetCommit", err)
return
}
commitsCountTotal, err = git.CommitsCountByFile(gitRepo.Path, sha, treePath)
if err != nil {
ctx.ServerError("CommitsCount", err)
return
}
}
pageCount := int(math.Ceil(float64(commitsCountTotal) / float64(listOptions.PageSize)))
commits, err := baseCommit.CommitsByFileAndRange(treePath, listOptions.Page, listOptions.PageSize)
if err != nil {
ctx.ServerError("CommitsByRange", err)
return
}
userCache := make(map[string]*models.User)
apiCommits := make([]*api.Commit, commits.Len())
i := 0
for commitPointer := commits.Front(); commitPointer != nil; commitPointer = commitPointer.Next() {
commit := commitPointer.Value.(*git.Commit)
apiCommits[i], err = toCommit(ctx, ctx.Repo.Repository, commit, userCache)
if err != nil {
ctx.ServerError("toCommit", err)
return
}
i++
}
ctx.Header().Set("X-Page", strconv.Itoa(listOptions.Page))
ctx.Header().Set("X-PerPage", strconv.Itoa(listOptions.PageSize))
ctx.Header().Set("X-Total", strconv.FormatInt(commitsCountTotal, 10))
ctx.Header().Set("X-PageCount", strconv.Itoa(pageCount))
ctx.Header().Set("X-HasMore", strconv.FormatBool(listOptions.Page < pageCount))
ctx.SetLinkHeader(int(commitsCountTotal), listOptions.PageSize)
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", commitsCountTotal))
ctx.JSON(http.StatusOK, apiCommits)
}
// GetAllCommits get all commits via
func GetAllCommits(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/commits repository repoGetAllCommits
@ -189,7 +324,10 @@ func GetAllCommits(ctx *context.APIContext) {
userCache := make(map[string]*models.User)
apiCommits := make([]*api.Commit, commits.Len())
// =============================================================
// apiCommitsList := []api.Commit{}
// =================================================================
i := 0
for commitPointer := commits.Front(); commitPointer != nil; commitPointer = commitPointer.Next() {
commit := commitPointer.Value.(*git.Commit)
@ -200,6 +338,7 @@ func GetAllCommits(ctx *context.APIContext) {
ctx.ServerError("toCommit", err)
return
}
// apiCommitsList = append(apiCommitsList,*apiCommits[i])
i++
}
@ -214,7 +353,168 @@ func GetAllCommits(ctx *context.APIContext) {
ctx.SetLinkHeader(int(commitsCountTotal), listOptions.PageSize)
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", commitsCountTotal))
ctx.JSON(http.StatusOK, &apiCommits)
ctx.JSON(http.StatusOK, apiCommits)
}
// GetAllCommits get all commits via
func GetAllCommitsSliceByTime(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/commits_slice repository repoGetAllCommitsSlice
// ---
// summary: Get a list of all commits from a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: sha
// in: query
// description: SHA or branch to start listing commits from (usually 'master')
// type: string
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
// description: page size of results
// type: integer
// responses:
// "200":
// "$ref": "#/responses/CommitList"
// "404":
// "$ref": "#/responses/notFound"
// "409":
// "$ref": "#/responses/EmptyRepository"
if ctx.Repo.Repository.IsEmpty {
ctx.JSON(http.StatusConflict, api.APIError{
Message: "Git Repository is empty.",
URL: setting.API.SwaggerURL,
})
return
}
gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath())
if err != nil {
ctx.ServerError("OpenRepository", err)
return
}
defer gitRepo.Close()
listOptions := utils.GetListOptions(ctx)
if listOptions.Page <= 0 {
listOptions.Page = 1
}
if listOptions.PageSize > git.CommitsRangeSize {
listOptions.PageSize = git.CommitsRangeSize
}
sha := ctx.Query("sha")
var baseCommit *git.Commit
if len(sha) == 0 {
// no sha supplied - use default branch
head, err := gitRepo.GetHEADBranch()
if err != nil {
ctx.ServerError("GetHEADBranch", err)
return
}
baseCommit, err = gitRepo.GetBranchCommit(head.Name)
if err != nil {
ctx.ServerError("GetCommit", err)
return
}
} else {
// get commit specified by sha
baseCommit, err = gitRepo.GetCommit(sha)
if err != nil {
ctx.ServerError("GetCommit", err)
return
}
}
// Total commit count
commitsCountTotal, err := baseCommit.CommitsCount()
if err != nil {
ctx.ServerError("GetCommitsCount", err)
return
}
pageCount := int(math.Ceil(float64(commitsCountTotal) / float64(listOptions.PageSize)))
// Query commits
commits, err := baseCommit.CommitsByRange(listOptions.Page, listOptions.PageSize)
if err != nil {
ctx.ServerError("CommitsByRange", err)
return
}
userCache := make(map[string]*models.User)
apiCommits := make([]*api.Commit, commits.Len())
apiCommitsList := []api.Commit{}
i := 0
for commitPointer := commits.Front(); commitPointer != nil; commitPointer = commitPointer.Next() {
commit := commitPointer.Value.(*git.Commit)
// Create json struct
apiCommits[i], err = toCommit(ctx, ctx.Repo.Repository, commit, userCache)
if err != nil {
ctx.ServerError("toCommit", err)
return
}
apiCommitsList = append(apiCommitsList, *apiCommits[i])
i++
}
// kept for backwards compatibility
ctx.Header().Set("X-Page", strconv.Itoa(listOptions.Page))
ctx.Header().Set("X-PerPage", strconv.Itoa(listOptions.PageSize))
ctx.Header().Set("X-Total", strconv.FormatInt(commitsCountTotal, 10))
ctx.Header().Set("X-PageCount", strconv.Itoa(pageCount))
ctx.Header().Set("X-HasMore", strconv.FormatBool(listOptions.Page < pageCount))
ctx.SetLinkHeader(int(commitsCountTotal), listOptions.PageSize)
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", commitsCountTotal))
ctx.JSON(http.StatusOK, CommitSplitSlice(apiCommitsList))
}
func CommitSplitSlice(CommitsList []api.Commit) []api.CommitsSlice {
// sort by time
sort.Sort(api.SortCommit(CommitsList))
Commits := make([]api.CommitsSlice, 0)
i := 0
var j int
for {
if i >= len(CommitsList) {
break
}
// Detect equal CommitData,
for j = i + 1; j < len(CommitsList) && CommitsList[i].CommitDate == CommitsList[j].CommitDate; j++ {
}
// if equal, put commitdata in an array
commitDate := CommitsList[i].CommitDate
commitDatalist := CommitsList[i:j]
i = j // variable value
// get all the values,,,Commits
Commits = append(Commits, api.CommitsSlice{
CommitDate: commitDate,
Commits: commitDatalist,
})
}
return Commits
}
func toCommit(ctx *context.APIContext, repo *models.Repository, commit *git.Commit, userCache map[string]*models.User) (*api.Commit, error) {
@ -277,8 +577,9 @@ func toCommit(ctx *context.APIContext, repo *models.Repository, commit *git.Comm
SHA: sha.String(),
}
}
commit.LoadBranchName()
return &api.Commit{
CommitDate: commit.Committer.When.Format("2006-01-02"), // new time format, year-moon-day
CommitMeta: &api.CommitMeta{
URL: repo.APIURL() + "/git/commits/" + commit.ID.String(),
SHA: commit.ID.String(),
@ -309,14 +610,16 @@ func toCommit(ctx *context.APIContext, repo *models.Repository, commit *git.Comm
Author: apiAuthor,
Committer: apiCommitter,
Parents: apiParents,
Branch: commit.Branch,
}, nil
}
// add by qiubing
// 获取 Graph
func GetGraph(ctx *context.APIContext) {
if ctx.Repo.Repository.IsEmpty { // 项目是否为空
ctx.JSON(409, api.APIError{
ctx.JSON(http.StatusConflict, api.APIError{
Message: "Git Repository is empty.",
URL: setting.API.SwaggerURL,
})
@ -334,7 +637,7 @@ func GetGraph(ctx *context.APIContext) {
return
}
ctx.JSON(200, &graph)
ctx.JSON(http.StatusOK, &graph)
}
// 获取 commit diff
@ -350,7 +653,7 @@ func Diff(ctx *context.APIContext) {
ctx.NotFound("GetDiffCommit", err)
return
}
ctx.JSON(200, &diff)
ctx.JSON(http.StatusOK, &diff)
}
// 获取文件 blame 信息
@ -415,7 +718,7 @@ func GetCommitsCount(ctx *context.APIContext) {
ctx.ServerError("GetCommitsCount", err)
return
}
ctx.JSON(200, &ctx.Repo)
ctx.JSON(http.StatusOK, &ctx.Repo)
}
// end by qiubing

View File

@ -57,6 +57,11 @@ func GetRawFile(ctx *context.APIContext) {
// description: filepath of the file to get
// type: string
// required: true
// - name: ref
// in: query
// description: "The name of the commit/branch/tag. Default the repositorys default branch (usually master)"
// type: string
// required: false
// responses:
// 200:
// description: success
@ -68,7 +73,14 @@ func GetRawFile(ctx *context.APIContext) {
return
}
blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreePath)
ref := ctx.QueryTrim("ref")
commit, err := ctx.Repo.GitRepo.GetCommit(ref)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetCommit", err)
return
}
blob, err := commit.GetBlobByPath(ctx.Repo.TreePath)
if err != nil {
if git.IsErrNotExist(err) {
ctx.NotFound()
@ -528,8 +540,7 @@ func GetContents(ctx *context.APIContext) {
// "404":
// "$ref": "#/responses/notFound"
start:=time.Now()
start := time.Now()
if !canReadFiles(ctx.Repo) {
ctx.Error(http.StatusInternalServerError, "GetContentsOrList", models.ErrUserDoesNotHaveAccessToRepo{
@ -542,8 +553,8 @@ func GetContents(ctx *context.APIContext) {
treePath := ctx.Params("*")
ref := ctx.QueryTrim("ref")
fmt.Println("***GetContents.treePath:",treePath)
fmt.Println("***GetContents.ref:",ref)
fmt.Println("***GetContents.treePath:", treePath)
fmt.Println("***GetContents.ref:", ref)
if fileList, err := repofiles.GetContentsOrList(ctx.Repo.Repository, treePath, ref); err != nil {
if git.IsErrNotExist(err) {
ctx.NotFound("GetContentsOrList", err)
@ -553,7 +564,7 @@ func GetContents(ctx *context.APIContext) {
} else {
ctx.JSON(http.StatusOK, fileList)
}
log.Info("*****************GetContents:%v",time.Now().Sub(start))
log.Info("*****************GetContents:%v", time.Now().Sub(start))
}
// add by qiubing

View File

@ -6,6 +6,7 @@
package repo
import (
_ "fmt"
"net/http"
"code.gitea.io/gitea/models"
@ -264,3 +265,56 @@ func DeleteHook(ctx *context.APIContext) {
}
ctx.Status(http.StatusNoContent)
}
func ListHookTask(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/hooks/{id}/hooktasks repository repoGetHookTasks
// ---
// summary: Get a hooktasks
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: id
// in: path
// description: id of the hook
// type: integer
// format: int64
// required: true
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
// description: page size of results
// type: integer
// responses:
// "200":
// "$ref": "#/responses/HookTaskList"
hook, err := utils.GetRepoHook(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
if err != nil {
ctx.NotFound()
return
}
hookTasks, err := models.GetHookTasksByRepoIDAndHookID(ctx.Repo.Repository.ID, hook.ID, utils.GetListOptions(ctx))
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetHookTasksByRepoIDAndHookID", err)
return
}
apiHookTasks := make([]*api.HookTask, len(hookTasks))
for i := range hookTasks {
apiHookTasks[i] = convert.ToHookTask(hookTasks[i])
}
ctx.JSON(http.StatusOK, &apiHookTasks)
}

View File

@ -169,6 +169,72 @@ func GetPullRequest(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "LoadHeadRepo", err)
return
}
issue := checkPullInfo(ctx.Context)
if issue == nil {
ctx.NotFound()
return
}
if ctx.Written() {
return
}
pull := issue.PullRequest
// get pull commits nums
var commits *list.List
var prInfo *git.CompareInfo
if pull.HasMerged {
prInfo = PrepareMergedViewPullInfo(ctx.Context, issue)
} else {
prInfo = PrepareViewPullInfo(ctx.Context, issue)
}
if ctx.Written() {
return
} else if prInfo == nil {
ctx.NotFound("ViewPullCommits", nil)
return
}
var commitNum int
commits = prInfo.Commits
commits = models.ValidateCommitsWithEmails(commits)
commits = models.ParseCommitsWithSignature(commits, ctx.Repo.Repository)
commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository)
commitNum = commits.Len()
//get pull changedfils
var (
diffRepoPath string
startCommitID string
endCommitID string
gitRepo *git.Repository
)
diffRepoPath = ctx.Repo.GitRepo.Path
gitRepo = ctx.Repo.GitRepo
headCommitId, err := gitRepo.GetRefCommitID(pull.GetGitRefName())
if err != nil {
ctx.ServerError("GetRefCommitID", err)
return
}
startCommitID = prInfo.MergeBase
endCommitID = headCommitId
whitespaceFlags := map[string]string{
"ignore-all": "-w",
"ignore-change": "-b",
"ignore-eol": "--ignore-space-at-eol",
"": ""}
ctx.Data["WhitespaceBehavior"] = ""
diff, err1 := gitdiff.GetDiffRangeWithWhitespaceBehavior(diffRepoPath, startCommitID, endCommitID, setting.Git.MaxGitDiffLines,
setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles,
whitespaceFlags[ctx.Data["WhitespaceBehavior"].(string)])
if err1 != nil {
ctx.ServerError("GetDiffRangeWithWhitespaceBehavior", err1)
return
}
var changedFiles int
changedFiles = diff.NumFiles
pr.CommitNum = commitNum
pr.ChangedFiles = changedFiles
ctx.JSON(http.StatusOK, convert.ToAPIPullRequest(pr))
}

View File

@ -5,10 +5,14 @@
package repo
import (
"fmt"
"math"
"net/http"
"strconv"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
repo_module "code.gitea.io/gitea/modules/repository"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/routers/api/v1/utils"
)
@ -56,6 +60,22 @@ func ListTags(ctx *context.APIContext) {
apiTags[i] = convert.ToTag(ctx.Repo.Repository, tags[i])
}
tagsCountTotal, err := ctx.Repo.GitRepo.GetTagCount()
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetTagCount", err)
return
}
pageCount := int(math.Ceil(float64(tagsCountTotal) / float64(listOpts.PageSize)))
ctx.Header().Set("X-Page", strconv.Itoa(listOpts.Page))
ctx.Header().Set("X-PerPage", strconv.Itoa(listOpts.PageSize))
ctx.Header().Set("X-Total", strconv.FormatInt(tagsCountTotal, 10))
ctx.Header().Set("X-PageCount", strconv.Itoa(pageCount))
ctx.Header().Set("X-HasMore", strconv.FormatBool(listOpts.Page < pageCount))
ctx.SetLinkHeader(int(tagsCountTotal), listOpts.PageSize)
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", tagsCountTotal))
ctx.JSON(http.StatusOK, &apiTags)
}
@ -104,3 +124,43 @@ func GetTag(ctx *context.APIContext) {
ctx.JSON(http.StatusOK, convert.ToAnnotatedTag(ctx.Repo.Repository, tag, commit))
}
}
func GetRepoBranchAndTagCount(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/branch_tag_count repository repoBranchAndTagCountGet
// ---
// summary: Get branche and tag of a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/RepoBranchAndTagCount"
tags, err := ctx.Repo.GitRepo.GetTagInfos(0, 0)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetTags", err)
return
}
repo := ctx.Repo.Repository
branches, err := repo_module.GetBranches(repo)
if err != nil {
ctx.ServerError("GetBranches", err)
return
}
result := api.RepoBranchAndTagCount{
BranchCount: len(branches),
TagCount: len(tags),
}
ctx.JSON(http.StatusOK, result)
}

434
routers/api/v1/repo/wiki.go Normal file
View File

@ -0,0 +1,434 @@
package repo
//
import (
"net/http"
"sort"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/markup/markdown"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/wikies"
wiki_service "code.gitea.io/gitea/services/wiki"
)
func WikiList(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/wikies repository repoWikiList
// ---
// summary: List the wikies in a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/WikiList"
if !ctx.Repo.Repository.HasWiki() {
ctx.CheckHasWiki()
return
}
repository := ctx.Repo.Repository
wikiCloneLink := repository.CloneWikiLink()
wikiRepo, commit, err := wikies.FindWikiRepoCommit(ctx)
if err != nil {
if wikiRepo != nil {
wikiRepo.Close()
}
return
}
entries, err := commit.ListEntries()
if err != nil {
if wikiRepo != nil {
wikiRepo.Close()
}
return
}
wikiesList := make([]api.WikiesResponse, 0, len(entries))
for _, entry := range entries {
if !entry.IsRegular() {
continue
}
//c, err := wikiRepo.GetCommitByPath(entry.Name())
lastCommit, firstCommit, err := wikiRepo.GetFirstAndLastCommitByPath("master", entry.Name())
if err != nil {
if wikiRepo != nil {
wikiRepo.Close()
}
ctx.ServerError("GetCommit", err)
return
}
wikiName, err := wiki_service.FilenameToName(entry.Name())
if err != nil {
if models.IsErrWikiInvalidFileName(err) {
continue
}
if wikiRepo != nil {
wikiRepo.Close()
}
ctx.ServerError("WikiFilenameToName", err)
return
}
wikiesList = append(wikiesList, api.WikiesResponse{
WikiCloneLink: api.CloneLink{
HTTPS: wikiCloneLink.HTTPS,
SSH: wikiCloneLink.SSH,
},
WikiMeta: api.WikiMeta{
Name: wikiName,
Commit: api.WikiCommit{
Author: api.WikiUser{
Name: lastCommit.Author.Name,
Email: lastCommit.Author.Email,
When: lastCommit.Author.When.Unix(),
},
Commiter: api.WikiUser{
Name: lastCommit.Committer.Name,
Email: lastCommit.Committer.Email,
When: lastCommit.Author.When.Unix(),
},
ID: lastCommit.ID.String(),
Message: lastCommit.Message(),
},
FirstCommit: api.WikiCommit{
Author: api.WikiUser{
Name: firstCommit.Author.Name,
Email: firstCommit.Author.Email,
When: firstCommit.Author.When.Unix(),
},
Commiter: api.WikiUser{
Name: firstCommit.Committer.Name,
Email: firstCommit.Committer.Email,
When: firstCommit.Author.When.Unix(),
},
ID: firstCommit.ID.String(),
Message: firstCommit.Message(),
},
},
})
}
//根据创建时间,按最新的时间排序
sort.Slice(wikiesList, func(i, j int) bool {
return wikiesList[i].FirstCommit.Author.When > wikiesList[j].FirstCommit.Author.When
})
ctx.JSON(http.StatusOK, wikiesList)
}
func GetWiki(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/wikies/{pagename} repository repoGetWiki
// ---
// summary: Get a Wiki
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: pagename
// in: path
// description: name of the wikipage
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/Wiki"
wikiRepo, commit, _ := wikies.FindWikiRepoCommit(ctx)
repository := ctx.Repo.Repository
wikiCloneLink := repository.CloneWikiLink()
pageName := wiki_service.NormalizeWikiName(ctx.Params(":page"))
if len(pageName) == 0 {
pageName = "Home"
}
data, entry, pageFilename, noEntry := wikies.WikiContentsByName(ctx, commit, pageName)
if noEntry {
ctx.NotFound()
return
}
if entry == nil || ctx.Written() {
if wikiRepo != nil {
wikiRepo.Close()
}
}
metas := ctx.Repo.Repository.ComposeDocumentMetas()
PageContent := markdown.RenderWiki(data, ctx.Repo.RepoLink, metas)
c, err := wikiRepo.GetCommitByPath(entry.Name())
if err != nil {
if models.IsErrWikiInvalidFileName(err) {
return
}
}
commitsCount, _ := wikiRepo.FileCommitsCount("master", pageFilename)
wiki := api.WikiResponse{
WikiCloneLink: api.CloneLink{
HTTPS: wikiCloneLink.HTTPS,
SSH: wikiCloneLink.SSH,
},
WikiMeta: api.WikiMeta{
Name: pageName,
Commit: api.WikiCommit{
Author: api.WikiUser{
Name: c.Author.Name,
Email: c.Author.Email,
When: c.Author.When.Unix(),
},
Commiter: api.WikiUser{
Name: c.Committer.Name,
Email: c.Committer.Email,
When: c.Author.When.Unix(),
},
ID: c.ID.String(),
Message: c.Message(),
},
},
CommitCounts: commitsCount,
MdContent: string(data),
SimpleContent: PageContent,
}
ctx.JSON(http.StatusOK, wiki)
}
func CreateWiki(ctx *context.APIContext, form api.WikiOption) {
// swagger:operation POST /repos/{owner}/{repo}/wikies repository repoCreateWiki
// ---
// summary: Create a wiki in a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/WikiOption"
// responses:
// "200":
// "$ref": "#/responses/Wiki"
err1 := wiki_service.CheckFile(form.Name)
if err1 != nil {
ctx.FileNameError()
return
}
repository := ctx.Repo.Repository
wikiCloneLink := repository.CloneWikiLink()
if util.IsEmptyString(form.Name) {
//ctx.RenderWithErr(ctx.Tr("repo.issues.new.title_empty"), nil, form)
return
}
wikiName := wiki_service.NormalizeWikiName(form.Name)
if len(form.CommitMessage) == 0 {
form.CommitMessage = ctx.Tr("repo.editor.add", form.Name)
}
if err := wiki_service.AddWikiPage(ctx.User, ctx.Repo.Repository, wikiName, form.Content, form.CommitMessage); err != nil {
if models.IsErrWikiReservedName(err) {
ctx.Error(http.StatusInternalServerError, "WikiNameIsReservedPage", "wiki名称是被保留的.")
} else if models.IsErrWikiAlreadyExist(err) {
ctx.Error(http.StatusConflict, "WikiNameAlreadyExist", "wiki名称已存在")
} else {
ctx.Error(http.StatusInternalServerError, "AddWikiPage", err)
}
return
}
wikiRepo, commit, _ := wikies.FindWikiRepoCommit(ctx)
data, entry, pageFilename, _ := wikies.WikiContentsByName(ctx, commit, form.Name)
metas := ctx.Repo.Repository.ComposeDocumentMetas()
PageContent := markdown.RenderWiki(data, ctx.Repo.RepoLink, metas)
commitsCount, _ := wikiRepo.FileCommitsCount("master", pageFilename)
c, err := wikiRepo.GetCommitByPath(entry.Name())
if err != nil {
if models.IsErrWikiInvalidFileName(err) {
return
}
}
wiki := api.WikiResponse{
WikiCloneLink: api.CloneLink{
HTTPS: wikiCloneLink.HTTPS,
SSH: wikiCloneLink.SSH,
},
WikiMeta: api.WikiMeta{
Name: form.Name,
Commit: api.WikiCommit{
Author: api.WikiUser{
Name: c.Author.Name,
Email: c.Author.Email,
When: c.Author.When.Unix(),
},
Commiter: api.WikiUser{
Name: c.Committer.Name,
Email: c.Committer.Email,
When: c.Author.When.Unix(),
},
ID: c.ID.String(),
Message: c.Message(),
},
},
CommitCounts: commitsCount,
MdContent: string(data),
SimpleContent: PageContent,
}
ctx.JSON(http.StatusOK, wiki)
}
func EditWiki(ctx *context.APIContext, form api.WikiOption) {
// swagger:operation PATCH /repos/{owner}/{repo}/wikies/{pagename} repository repoEditWiki
// ---
// summary: Edit a wiki in a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: pagename
// in: path
// description: name of the wiki
// type: string
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/WikiOption"
// responses:
// "201":
// "$ref": "#/responses/Wiki"
oldWikiName := wiki_service.NormalizeWikiName(ctx.Params(":page"))
newWikiName := wiki_service.NormalizeWikiName(form.Name)
err1 := wiki_service.CheckFile(newWikiName)
if err1 != nil {
ctx.FileNameError()
return
}
wikiRepo, commit, _ := wikies.FindWikiRepoCommit(ctx)
if _, _, _, noEntry := wikies.WikiContentsByName(ctx, commit, oldWikiName); noEntry {
ctx.Error(http.StatusNotFound, "WikiNotFound", "wiki不存在")
return
}
if _, _, _, noEntry := wikies.WikiContentsByName(ctx, commit, newWikiName); oldWikiName != newWikiName && !noEntry {
ctx.Error(http.StatusConflict, "WikiNameAlreadyExist", "wiki名称已存在")
return
}
if len(form.CommitMessage) == 0 {
form.CommitMessage = ctx.Tr("repo.editor.update", form.Name)
}
if err := wiki_service.EditWikiPage(ctx.User, ctx.Repo.Repository, oldWikiName, newWikiName, form.Content, form.CommitMessage); err != nil {
ctx.Error(http.StatusInternalServerError, "EditWikiPage", err)
return
}
_, newCommit, _ := wikies.FindWikiRepoCommit(ctx)
data, entry, pageFilename, _ := wikies.WikiContentsByName(ctx, newCommit, newWikiName)
c, err := wikiRepo.GetCommitByPath(entry.Name())
if err != nil {
if models.IsErrWikiInvalidFileName(err) {
return
}
}
metas := ctx.Repo.Repository.ComposeDocumentMetas()
PageContent := markdown.RenderWiki(data, ctx.Repo.RepoLink, metas)
commitsCount, _ := wikiRepo.FileCommitsCount("master", pageFilename)
wiki := api.WikiResponse{
WikiMeta: api.WikiMeta{
Name: form.Name,
Commit: api.WikiCommit{
Author: api.WikiUser{
Name: c.Author.Name,
Email: c.Author.Email,
When: c.Author.When.Unix(),
},
Commiter: api.WikiUser{
Name: c.Committer.Name,
Email: c.Committer.Email,
When: c.Author.When.Unix(),
},
ID: c.ID.String(),
Message: c.Message(),
},
},
CommitCounts: commitsCount,
MdContent: string(data),
SimpleContent: PageContent,
}
ctx.JSON(http.StatusOK, wiki)
}
func DeleteWiki(ctx *context.APIContext) {
// swagger:operation DELETE /repos/{owner}/{repo}/wikies/{pagename} repository repoDeleteWiki
// ---
// summary: Delete a wiki in a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: pagename
// in: path
// description: name of the wiki
// type: string
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
// "500":
// "$ref": "#/responses/noFound"
wikiName := wiki_service.NormalizeWikiName(ctx.Params(":page"))
if len(wikiName) == 0 {
wikiName = "Home"
}
err2 := wiki_service.DeleteWikiPage(ctx.User, ctx.Repo.Repository, wikiName)
if err2 != nil {
ctx.FileExistError()
return
}
}

View File

@ -23,6 +23,9 @@ type swaggerParameterBodies struct {
// in:body
DeleteEmailOption api.DeleteEmailOption
// in:body
WikiOption api.WikiOption
// in:body
CreateHookOption api.CreateHookOption
// in:body

View File

@ -53,6 +53,21 @@ type swaggerResponseBranchProtectionList struct {
// TagList
// swagger:response TagList
type swaggerResponseTagList struct {
// The current page
Page int `json:"X-Page"`
// Commits per page
PerPage int `json:"X-PerPage"`
// Total commit count
Total int `json:"X-Total"`
// Total number of pages
PageCount int `json:"X-PageCount"`
// True if there is another page
HasMore bool `json:"X-HasMore"`
// in:body
Body []api.Tag `json:"body"`
}
@ -64,6 +79,13 @@ type swaggerResponseTag struct {
Body api.Tag `json:"body"`
}
// RepoBranchAndTagCount
// swagger:response RepoBranchAndTagCount
type swaggerResponseRepoBranchAndTagCount struct {
// in:body
Body api.RepoBranchAndTagCount `json:"body"`
}
// AnnotatedTag
// swagger:response AnnotatedTag
type swaggerResponseAnnotatedTag struct {
@ -85,6 +107,20 @@ type swaggerResponseReferenceList struct {
Body []api.Reference `json:"body"`
}
// Wiki
// swagger:response Wiki
type swaggerResponseWiki struct {
// in:body
Body api.WikiResponse `json:"body"`
}
// WikiList
// swagger:response WikiList
type swaggerResponseWikiList struct {
// in:body
Body api.WikiesResponse `json:"body"`
}
// Hook
// swagger:response Hook
type swaggerResponseHook struct {
@ -99,6 +135,13 @@ type swaggerResponseHookList struct {
Body []api.Hook `json:"body"`
}
// HookTaskList
// swagger:response HookTaskList
type swaggerResponseHookTaskList struct {
// in:body
Body []api.HookTask `json:"body"`
}
// GitHook
// swagger:response GitHook
type swaggerResponseGitHook struct {
@ -254,6 +297,28 @@ type swaggerCommitList struct {
Body []api.Commit `json:"body"`
}
// FileCommitList
// swagger:response FileCommitList
type swaggerFileCommitList struct {
// The current page
Page int `json:"X-Page"`
// Commits per page
PerPage int `json:"X-PerPage"`
// Total commit count
Total int `json:"X-Total"`
// Total number of pages
PageCount int `json:"X-PageCount"`
// True if there is another page
HasMore bool `json:"X-HasMore"`
// in: body
Body []api.Commit `json:"body"`
}
// EmptyRepository
// swagger:response EmptyRepository
type swaggerEmptyRepository struct {

View File

@ -148,12 +148,24 @@ func GetUserHeatmapData(ctx *context.APIContext) {
// description: username of user to get
// type: string
// required: true
// - name: start
// in: query
// description: Query start timestamp
// type: string
// required: false
// - name: end
// in: query
// description: Query end timestamp
// type: string
// required: false
// responses:
// "200":
// "$ref": "#/responses/UserHeatmapData"
// "404":
// "$ref": "#/responses/notFound"
timeStampOptions := utils.GetTimestampOptions(ctx)
// Get the user to throw an error if it does not exist
user, err := models.GetUserByName(ctx.Params(":username"))
if err != nil {
@ -164,8 +176,8 @@ func GetUserHeatmapData(ctx *context.APIContext) {
}
return
}
heatmap, err := models.GetUserHeatmapDataByUser(user)
heatmap, err := models.GetUserHeatMapDataByUserWithTimeStamp(user, timeStampOptions)
// heatmap, err := models.GetUserHeatmapDataByUser(user)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetUserHeatmapDataByUser", err)
return

View File

@ -66,6 +66,11 @@ func CheckCreateHookOption(ctx *context.APIContext, form *api.CreateHookOption)
ctx.Error(http.StatusUnprocessableEntity, "", "Invalid content type")
return false
}
if !models.IsValidHookHttpMethod(form.Config["http_method"]) {
ctx.Error(http.StatusUnprocessableEntity, "", "Invalid http method")
return false
}
return true
}
@ -101,13 +106,14 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID
if len(form.Events) == 0 {
form.Events = []string{"push"}
}
w := &models.Webhook{
OrgID: orgID,
RepoID: repoID,
URL: form.Config["url"],
ContentType: models.ToHookContentType(form.Config["content_type"]),
Secret: form.Config["secret"],
HTTPMethod: "POST",
HTTPMethod: form.Config["http_method"],
HookEvent: &models.HookEvent{
ChooseEvents: true,
HookEvents: models.HookEvents{
@ -211,6 +217,9 @@ func editHook(ctx *context.APIContext, form *api.EditHookOption, w *models.Webho
if url, ok := form.Config["url"]; ok {
w.URL = url
}
if secret, ok := form.Config["secret"]; ok {
w.Secret = secret
}
if ct, ok := form.Config["content_type"]; ok {
if !models.IsValidHookContentType(ct) {
ctx.Error(http.StatusUnprocessableEntity, "", "Invalid content type")
@ -219,6 +228,14 @@ func editHook(ctx *context.APIContext, form *api.EditHookOption, w *models.Webho
w.ContentType = models.ToHookContentType(ct)
}
if hm, ok := form.Config["http_method"]; ok {
if !models.IsValidHookHttpMethod(hm) {
ctx.Error(http.StatusUnprocessableEntity, "", "Invalid http method")
return false
}
w.HTTPMethod = hm
}
if w.HookTaskType == models.SLACK {
if channel, ok := form.Config["channel"]; ok {
meta, err := json.Marshal(&webhook.SlackMeta{
@ -244,18 +261,25 @@ func editHook(ctx *context.APIContext, form *api.EditHookOption, w *models.Webho
w.SendEverything = false
w.ChooseEvents = true
w.Create = com.IsSliceContainsStr(form.Events, string(models.HookEventCreate))
w.Push = com.IsSliceContainsStr(form.Events, string(models.HookEventPush))
w.PullRequest = com.IsSliceContainsStr(form.Events, string(models.HookEventPullRequest))
w.Create = com.IsSliceContainsStr(form.Events, string(models.HookEventCreate))
w.Delete = com.IsSliceContainsStr(form.Events, string(models.HookEventDelete))
w.Fork = com.IsSliceContainsStr(form.Events, string(models.HookEventFork))
w.Issues = com.IsSliceContainsStr(form.Events, string(models.HookEventIssues))
w.IssueComment = com.IsSliceContainsStr(form.Events, string(models.HookEventIssueComment))
w.Issues = issuesHook(form.Events, "issues_only")
w.IssueAssign = issuesHook(form.Events, string(models.HookEventIssueAssign))
w.IssueLabel = issuesHook(form.Events, string(models.HookEventIssueLabel))
w.IssueMilestone = issuesHook(form.Events, string(models.HookEventIssueMilestone))
w.IssueComment = issuesHook(form.Events, string(models.HookEventIssueComment))
w.Push = com.IsSliceContainsStr(form.Events, string(models.HookEventPush))
w.PullRequest = com.IsSliceContainsStr(form.Events, string(models.HookEventPullRequest))
w.PullRequest = pullHook(form.Events, "pull_request_only")
w.PullRequestAssign = pullHook(form.Events, string(models.HookEventPullRequestAssign))
w.PullRequestLabel = pullHook(form.Events, string(models.HookEventPullRequestLabel))
w.PullRequestMilestone = pullHook(form.Events, string(models.HookEventPullRequestMilestone))
w.PullRequestComment = pullHook(form.Events, string(models.HookEventPullRequestComment))
w.PullRequestReview = pullHook(form.Events, "pull_request_review")
w.PullRequestSync = pullHook(form.Events, string(models.HookEventPullRequestSync))
w.Repository = com.IsSliceContainsStr(form.Events, string(models.HookEventRepository))
w.Release = com.IsSliceContainsStr(form.Events, string(models.HookEventRelease))
w.BranchFilter = form.BranchFilter
w.HookEvent.BranchFilter = form.BranchFilter
if err := w.UpdateEvent(); err != nil {
ctx.Error(http.StatusInternalServerError, "UpdateEvent", err)

View File

@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
"code.gitea.io/gitea/modules/timeutil"
)
// GetQueryBeforeSince return parsed time (unix format) from URL query's before and since
@ -46,3 +47,10 @@ func GetListOptions(ctx *context.APIContext) models.ListOptions {
PageSize: convert.ToCorrectPageSize(ctx.QueryInt("limit")),
}
}
func GetTimestampOptions(ctx *context.APIContext) models.TimestampOptions {
return models.TimestampOptions{
Start: timeutil.TimeStamp(ctx.QueryInt("start")),
End: timeutil.TimeStamp(ctx.QueryInt("end")),
}
}

View File

@ -2,6 +2,17 @@ package viewfile
import (
"bytes"
"encoding/base64"
"fmt"
gotemplate "html/template"
"io/ioutil"
"net/http"
"net/url"
"path"
"path/filepath"
"strconv"
"strings"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/charset"
@ -13,32 +24,21 @@ import (
"code.gitea.io/gitea/modules/repofiles"
repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting"
"encoding/base64"
"fmt"
"gitea.com/macaron/macaron"
gotemplate "html/template"
"io/ioutil"
"net/http"
"net/url"
"path"
"path/filepath"
"strconv"
"strings"
)
func Map2DTO(ctx *context.APIContext) (dto *ReadmeDTO) {
dto=&ReadmeDTO{}
dto.Type="file"
dto.Encoding=ctx.Data["Encoding"].(string)
dto.Size=ctx.Data["FileSize"].(int64)
dto.Name=ctx.Repo.TreePath
dto.Path=ctx.Repo.TreePath
dto.Content=ctx.Data["FileContent"].(string)
dto.Sha=ctx.Repo.CommitID
dto = &ReadmeDTO{}
dto.Type = "file"
dto.Encoding = ctx.Data["Encoding"].(string)
dto.Size = ctx.Data["FileSize"].(int64)
dto.Name = ctx.Repo.TreePath
dto.Path = ctx.Repo.TreePath
dto.Content = ctx.Data["FileContent"].(string)
dto.Sha = ctx.Repo.CommitID
return
}
// RepoRefByType handles repository reference name for a specific type
// of repository reference
func RepoRefByType(refType context.RepoRefType) macaron.Handler {
@ -162,7 +162,6 @@ func RepoRefByType(refType context.RepoRefType) macaron.Handler {
}
}
func getRefName(ctx *context.APIContext, pathType context.RepoRefType) string {
path := ctx.Params("*")
switch pathType {
@ -198,7 +197,7 @@ func getRefName(ctx *context.APIContext, pathType context.RepoRefType) string {
}
return path
default:
ctx.Error(http.StatusBadRequest,"Unrecognized path type: %v", path)
ctx.Error(http.StatusBadRequest, "Unrecognized path type: %v", path)
}
return ""
}
@ -218,13 +217,11 @@ func getRefNameFromPath(ctx *context.APIContext, path string, isExist func(strin
func GetRefType() macaron.Handler {
return func(ctx *context.APIContext) {
ref:=ctx.ParamsInt64(":ref")
fmt.Println("ref:",ref)
ref := ctx.ParamsInt64(":ref")
fmt.Println("ref:", ref)
}
}
func CommitCount(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/count repository Count
// ---
@ -253,7 +250,6 @@ func CommitCount(ctx *context.APIContext) {
// "404":
// "$ref": "#/responses/notFound"
ref := ctx.QueryTrim("ref")
if ref == "" {
ref = ctx.Params(":ref")
@ -281,18 +277,17 @@ func CommitCount(ctx *context.APIContext) {
}()
}
// Get the commit object for the ref
commit, err := ctx.Repo.GitRepo.GetCommit(ref)
if err != nil || commit==nil{
ctx.Error(http.StatusInternalServerError,"ctx.Repo.GitRepo.GetCommit", err)
if err != nil || commit == nil {
ctx.Error(http.StatusInternalServerError, "ctx.Repo.GitRepo.GetCommit", err)
return
}
ctx.Repo.Commit=commit
ctx.Repo.Commit = commit
CommitCount,err:=ctx.Repo.Commit.CommitsCount()
if err !=nil {
ctx.Error(http.StatusInternalServerError,"ctx.Repo.Commit.CommitsCount", err)
CommitCount, err := ctx.Repo.Commit.CommitsCount()
if err != nil {
ctx.Error(http.StatusInternalServerError, "ctx.Repo.Commit.CommitsCount", err)
return
}
opts := models.FindReleasesOptions{
@ -316,29 +311,28 @@ func CommitCount(ctx *context.APIContext) {
return
}
tags,err:=ctx.Repo.GitRepo.GetTags()
tags, err := ctx.Repo.GitRepo.GetTags()
if err != nil {
ctx.Error(http.StatusInternalServerError, "ctx.Repo.GitRepo.GetTags", err)
return
}
dto:=&CountDTO{}
dto.Branch.CommitCount=CommitCount
dto.Branch.BranchName=ref
dto.BranchCount=int64(len(branches))
dto.TagCount=int64(len(tags))
dto.ReleaseCount=ReleaseCount
dto := &CountDTO{}
dto.Branch.CommitCount = CommitCount
dto.Branch.BranchName = ref
dto.BranchCount = int64(len(branches))
dto.TagCount = int64(len(tags))
dto.ReleaseCount = ReleaseCount
ctx.JSON(http.StatusOK, dto)
}
type CountDTO struct {
Branch struct{
CommitCount int64 `json:"commit_count"`
BranchName string `json:"branch_name"`
Branch struct {
CommitCount int64 `json:"commit_count"`
BranchName string `json:"branch_name"`
} `json:"branch"`
ReleaseCount int64 `json:"release_count"`
TagCount int64 `json:"tag_count"`
ReleaseCount int64 `json:"release_count"`
TagCount int64 `json:"tag_count"`
BranchCount int64 `json:"branch_count"`
}
@ -383,7 +377,6 @@ func LatestRelease(ctx *context.APIContext) {
}()
}
release, err := models.GetLatestReleaseByRepoIDExt(ctx.Repo.Repository.ID)
//fmt.Println("****************ctx.Repo.Repository.ID:",ctx.Repo.Repository.ID," ",release," ",err)
if err != nil {
@ -400,11 +393,10 @@ func LatestRelease(ctx *context.APIContext) {
return
}
release.Publisher.Passwd=""
release.Publisher.Passwd = ""
ctx.JSON(http.StatusOK, release)
}
func Readme(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/readme repository readme
// ---
@ -433,115 +425,28 @@ func Readme(ctx *context.APIContext) {
// "404":
// "$ref": "#/responses/notFound"
ctx.Data["Encoding"]="base64"
ctx.Data["Encoding"] = "base64"
treePath := ctx.Repo.TreePath
ref:= ctx.QueryTrim("ref")
ref := ctx.QueryTrim("ref")
if ref == "" {
ref= ctx.Params(":ref")
if ref=="" {
ref = ctx.Params(":ref")
if ref == "" {
ref = ctx.Repo.Repository.DefaultBranch
}
}
fmt.Println("***ref:",ref)
fmt.Println("***ref:", ref)
namedBlob,err:=getReadmeFileFromPathExt(ctx,treePath,ref)
if err !=nil || namedBlob==nil{
ctx.NotFound("getReadmeFileFromPath", err)
namedBlob, err := getReadmeFileFromPathExt(ctx, treePath, ref)
if err != nil || namedBlob == nil {
ctx.NotFound("getReadmeFileFromPath", err)
return
}
//fmt.Println("********getReadmeFileFromPathExt:",err," ",namedBlob)
FoundFileItem:=namedBlob.name
ctx.Repo.TreePath=FoundFileItem //找到指定文件;
FoundFileItem := namedBlob.name
ctx.Repo.TreePath = FoundFileItem //找到指定文件;
//fmt.Println("**** reqRepoReader(models.UnitTypeCode):",FoundFileItem)
ctx.Data["PageIsViewCode"] = true
if ctx.Repo.Repository.IsEmpty {
ctx.NotFound("Home", fmt.Errorf(ctx.Tr("Repository is empty")))
return
}
title := ctx.Repo.Repository.Owner.Name + "/" + ctx.Repo.Repository.Name
if len(ctx.Repo.Repository.Description) > 0 {
title += ": " + ctx.Repo.Repository.Description
}
ctx.Data["Title"] = title
ctx.Repo.RepoLink=`/`+ctx.Repo.Owner.Name+`/`+ctx.Repo.Repository.Name
ctx.Repo.IsViewCommit=true //此处无实际意义;加上为了编译
branchLink := ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchNameSubURL()
treeLink := branchLink
rawLink := ctx.Repo.RepoLink + "/raw/" + ctx.Repo.BranchNameSubURL()
//fmt.Println("******rawLink:",rawLink)
if len(ctx.Repo.TreePath) > 0 {
treeLink += "/" + ctx.Repo.TreePath
treeLink=strings.ReplaceAll(treeLink,"//","/")
}
// Get current entry user currently looking at.
entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath)
//fmt.Println("*********GetTreeEntryByPath:",entry," ",err)
if err != nil {
ctx.NotFound("Repo.Commit.GetTreeEntryByPath", err)
return
}
if entry==nil {
ctx.NotFound("Repo.Commit.GetTreeEntryByPath", err)
return
}
renderFile(ctx, entry, treeLink, rawLink)
//if ctx.Written() {
// return
//}
var treeNames []string
paths := make([]string, 0, 5)
if len(ctx.Repo.TreePath) > 0 {
treeNames = strings.Split(ctx.Repo.TreePath, "/")
fmt.Println("***treeNames:",treeNames)
for i := range treeNames {
paths = append(paths, strings.Join(treeNames[:i+1], "/"))
fmt.Println("***paths:",paths)
}
ctx.Data["HasParentPath"] = true
if len(paths)-2 >= 0 {
ctx.Data["ParentPath"] = "/" + paths[len(paths)-2]
}
}
ctx.Data["Paths"] = paths
ctx.Data["TreeLink"] = treeLink
ctx.Data["TreeNames"] = treeNames
ctx.Data["BranchLink"] = branchLink
fmt.Println("***rawLink:",rawLink)
fmt.Println("***paths:",paths)
fmt.Println("***treeLink:",treeLink)
fmt.Println("***treeNames:",treeNames)
fmt.Println("***branchLink:",branchLink)
ctx.JSON(http.StatusOK, Map2DTO(ctx))
}
func ViewFile(ctx *context.APIContext) {
ctx.Data["Encoding"]="base64"
fmt.Println("*********viewFile.ctx.Repo.TreePath:",ctx.Repo.TreePath)
namedBlob,err:=getReadmeFileFromPath(ctx.Repo.Commit,ctx.Repo.TreePath)
if err !=nil || namedBlob==nil{
ctx.NotFound("getReadmeFileFromPath", err)
return
}
FoundFileItem:=namedBlob.name
ctx.Repo.TreePath=FoundFileItem //找到指定文件;
fmt.Println("****getReadmeFileFromPath:",FoundFileItem)
ctx.Data["PageIsViewCode"] = true
if ctx.Repo.Repository.IsEmpty {
ctx.NotFound("Home", fmt.Errorf(ctx.Tr("Repository is empty")))
@ -554,7 +459,165 @@ func ViewFile(ctx *context.APIContext) {
}
ctx.Data["Title"] = title
ctx.Repo.RepoLink=`/`+ctx.Repo.Owner.Name+`/`+ctx.Repo.Repository.Name
ctx.Repo.RepoLink = `/` + ctx.Repo.Owner.Name + `/` + ctx.Repo.Repository.Name
ctx.Repo.IsViewCommit = true //此处无实际意义;加上为了编译
branchLink := ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchNameSubURL()
treeLink := branchLink
rawLink := ctx.Repo.RepoLink + "/raw/" + ctx.Repo.BranchNameSubURL()
//fmt.Println("******rawLink:",rawLink)
if len(ctx.Repo.TreePath) > 0 {
treeLink += "/" + ctx.Repo.TreePath
treeLink = strings.ReplaceAll(treeLink, "//", "/")
}
// Get current entry user currently looking at.
entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath)
//fmt.Println("*********GetTreeEntryByPath:",entry," ",err)
if err != nil {
ctx.NotFound("Repo.Commit.GetTreeEntryByPath", err)
return
}
if entry == nil {
ctx.NotFound("Repo.Commit.GetTreeEntryByPath", err)
return
}
renderFile(ctx, entry, treeLink, rawLink)
//if ctx.Written() {
// return
//}
var treeNames []string
paths := make([]string, 0, 5)
if len(ctx.Repo.TreePath) > 0 {
treeNames = strings.Split(ctx.Repo.TreePath, "/")
fmt.Println("***treeNames:", treeNames)
for i := range treeNames {
paths = append(paths, strings.Join(treeNames[:i+1], "/"))
fmt.Println("***paths:", paths)
}
ctx.Data["HasParentPath"] = true
if len(paths)-2 >= 0 {
ctx.Data["ParentPath"] = "/" + paths[len(paths)-2]
}
}
ctx.Data["Paths"] = paths
ctx.Data["TreeLink"] = treeLink
ctx.Data["TreeNames"] = treeNames
ctx.Data["BranchLink"] = branchLink
fmt.Println("***rawLink:", rawLink)
fmt.Println("***paths:", paths)
fmt.Println("***treeLink:", treeLink)
fmt.Println("***treeNames:", treeNames)
fmt.Println("***branchLink:", branchLink)
ctx.JSON(http.StatusOK, Map2DTO(ctx))
}
/////////////
func ReadmeByPath(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/readme/{dir} repository readmePathContents
// ---
// summary: Gets the metadata and contents (if a file) of an entry in a repository, or a list of entries if a dir
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: dir
// in: path
// description: name of the path
// type: string
// required: true
// - name: ref
// in: query
// description: "The name of the commit/branch/tag. Default the repositorys default branch (usually master)"
// type: string
// required: false
// responses:
// "200":
// "$ref": "#/responses/ContentsResponse"
// "404":
// "$ref": "#/responses/notFound"
treePath := ctx.Params("*")
ref := ctx.QueryTrim("ref")
if ref == "" {
ref = ctx.Params(":ref")
if ref == "" {
ref = ctx.Repo.Repository.DefaultBranch
}
}
namedBlob, err := getReadmeFileFromPathExt(ctx, treePath, ref)
if err != nil || namedBlob == nil {
// ctx.NotFound("getReadmeFileFromPath", err)
fileList, err1 := repofiles.GetContentsOrList(ctx.Repo.Repository, treePath, ref)
if err1 != nil {
if git.IsErrNotExist(err1) {
ctx.NotFound("fileList", err1)
return
}
ctx.Error(http.StatusInternalServerError, "GetFileListByPath", err)
} else {
ctx.JSON(http.StatusOK, fileList)
}
} else {
FoundFileItem := namedBlob.name
newTreePath := treePath + "/" + FoundFileItem
contents, err2 := repofiles.GetContents(ctx.Repo.Repository, newTreePath, ref, false)
if err2 != nil {
if git.IsErrNotExist(err2) {
ctx.NotFound("GetReadmeContentByPath", err2)
return
}
ctx.Error(http.StatusInternalServerError, "GetReadmeContentByPath", err)
} else {
ctx.JSON(http.StatusOK, contents)
}
}
}
func ViewFile(ctx *context.APIContext) {
ctx.Data["Encoding"] = "base64"
fmt.Println("*********viewFile.ctx.Repo.TreePath:", ctx.Repo.TreePath)
namedBlob, err := getReadmeFileFromPath(ctx.Repo.Commit, ctx.Repo.TreePath)
if err != nil || namedBlob == nil {
ctx.NotFound("getReadmeFileFromPath", err)
return
}
FoundFileItem := namedBlob.name
ctx.Repo.TreePath = FoundFileItem //找到指定文件;
fmt.Println("****getReadmeFileFromPath:", FoundFileItem)
ctx.Data["PageIsViewCode"] = true
if ctx.Repo.Repository.IsEmpty {
ctx.NotFound("Home", fmt.Errorf(ctx.Tr("Repository is empty")))
return
}
title := ctx.Repo.Repository.Owner.Name + "/" + ctx.Repo.Repository.Name
if len(ctx.Repo.Repository.Description) > 0 {
title += ": " + ctx.Repo.Repository.Description
}
ctx.Data["Title"] = title
ctx.Repo.RepoLink = `/` + ctx.Repo.Owner.Name + `/` + ctx.Repo.Repository.Name
branchLink := ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchNameSubURL()
//fmt.Println("******branchLink:",branchLink)
@ -576,13 +639,13 @@ func ViewFile(ctx *context.APIContext) {
// Get current entry user currently looking at.
entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath)
fmt.Println("*********GetTreeEntryByPath:",entry," ",err)
if err != nil {
ctx.NotFound("Repo.Commit.GetTreeEntryByPath", err)
fmt.Println("*********GetTreeEntryByPath:", entry, " ", err)
if err != nil {
ctx.NotFound("Repo.Commit.GetTreeEntryByPath", err)
return
}
if entry==nil {
ctx.NotFound("Repo.Commit.GetTreeEntryByPath", err)
if entry == nil {
ctx.NotFound("Repo.Commit.GetTreeEntryByPath", err)
return
}
renderFile(ctx, entry, treeLink, rawLink)
@ -594,10 +657,10 @@ func ViewFile(ctx *context.APIContext) {
paths := make([]string, 0, 5)
if len(ctx.Repo.TreePath) > 0 {
treeNames = strings.Split(ctx.Repo.TreePath, "/")
fmt.Println("***treeNames:",treeNames)
fmt.Println("***treeNames:", treeNames)
for i := range treeNames {
paths = append(paths, strings.Join(treeNames[:i+1], "/"))
fmt.Println("***paths:",paths)
fmt.Println("***paths:", paths)
}
ctx.Data["HasParentPath"] = true
@ -606,17 +669,16 @@ func ViewFile(ctx *context.APIContext) {
}
}
ctx.Data["Paths"] = paths
ctx.Data["TreeLink"] = treeLink
ctx.Data["TreeNames"] = treeNames
ctx.Data["BranchLink"] = branchLink
fmt.Println("***rawLink:",rawLink)
fmt.Println("***paths:",paths)
fmt.Println("***treeLink:",treeLink)
fmt.Println("***treeNames:",treeNames)
fmt.Println("***branchLink:",branchLink)
fmt.Println("***rawLink:", rawLink)
fmt.Println("***paths:", paths)
fmt.Println("***treeLink:", treeLink)
fmt.Println("***treeNames:", treeNames)
fmt.Println("***branchLink:", branchLink)
ctx.JSON(http.StatusOK, Map2DTO(ctx))
@ -627,7 +689,7 @@ func renderFile(ctx *context.APIContext, entry *git.TreeEntry, treeLink, rawLink
blob := entry.Blob()
dataRc, err := blob.DataAsync()
if err != nil {
ctx.Error(http.StatusInternalServerError,"DataAsync", err)
ctx.Error(http.StatusInternalServerError, "DataAsync", err)
return
}
defer dataRc.Close()
@ -640,9 +702,9 @@ func renderFile(ctx *context.APIContext, entry *git.TreeEntry, treeLink, rawLink
ctx.Data["FileName"] = blob.Name()
ctx.Data["RawFileLink"] = rawLink + "/" + ctx.Repo.TreePath
Base64Encoding:=base64.StdEncoding
if ctx.Data["Encoding"]=="base64url" {
Base64Encoding=base64.RawURLEncoding
Base64Encoding := base64.StdEncoding
if ctx.Data["Encoding"] == "base64url" {
Base64Encoding = base64.RawURLEncoding
}
buf := make([]byte, 1024)
n, _ := dataRc.Read(buf)
@ -657,11 +719,11 @@ func renderFile(ctx *context.APIContext, entry *git.TreeEntry, treeLink, rawLink
if meta != nil {
meta, err = ctx.Repo.Repository.GetLFSMetaObjectByOid(meta.Oid)
if err != nil && err != models.ErrLFSObjectNotExist {
ctx.Error(http.StatusInternalServerError,"GetLFSMetaObject", err)
ctx.Error(http.StatusInternalServerError, "GetLFSMetaObject", err)
return
}
}
fmt.Println("***setting.LFS.StartServer:",meta)
fmt.Println("***setting.LFS.StartServer:", meta)
if meta != nil {
ctx.Data["IsLFSFile"] = true
isLFSFile = true
@ -670,7 +732,7 @@ func renderFile(ctx *context.APIContext, entry *git.TreeEntry, treeLink, rawLink
var err error
dataRc, err = lfs.ReadMetaObject(meta)
if err != nil {
ctx.Error(http.StatusInternalServerError,"ReadMetaObject", err)
ctx.Error(http.StatusInternalServerError, "ReadMetaObject", err)
return
}
defer dataRc.Close()
@ -678,7 +740,7 @@ func renderFile(ctx *context.APIContext, entry *git.TreeEntry, treeLink, rawLink
buf = make([]byte, 1024)
n, err = dataRc.Read(buf)
if err != nil {
ctx.Error(http.StatusInternalServerError,"Data", err)
ctx.Error(http.StatusInternalServerError, "Data", err)
return
}
buf = buf[:n]
@ -696,7 +758,7 @@ func renderFile(ctx *context.APIContext, entry *git.TreeEntry, treeLink, rawLink
lfsLock, err := ctx.Repo.Repository.GetTreePathLock(ctx.Repo.TreePath)
ctx.Data["LFSLock"] = lfsLock
if err != nil {
ctx.Error(http.StatusInternalServerError,"GetTreePathLock", err)
ctx.Error(http.StatusInternalServerError, "GetTreePathLock", err)
return
}
if lfsLock != nil {
@ -727,7 +789,7 @@ func renderFile(ctx *context.APIContext, entry *git.TreeEntry, treeLink, rawLink
ctx.Data["MarkupType"] = markupType
//ctx.Data["FileContent"] = string(markup.Render(blob.Name(), buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeDocumentMetas()))
filenameBase64 := Base64Encoding.EncodeToString(buf)
ctx.Data["FileContent"] =filenameBase64
ctx.Data["FileContent"] = filenameBase64
//fmt.Println("************FileContent1:",ctx.Data["FileContent"].(string))
} else if readmeExist {
ctx.Data["IsRenderedHTML"] = true
@ -742,7 +804,7 @@ func renderFile(ctx *context.APIContext, entry *git.TreeEntry, treeLink, rawLink
//ctx.Data["FileContent"] = highlight.File(lineNums, blob.Name(), buf)
filenameBase64 := Base64Encoding.EncodeToString(buf)
ctx.Data["FileContent"] =filenameBase64
ctx.Data["FileContent"] = filenameBase64
//fmt.Println("************FileContent2:",ctx.Data["FileContent"].(string))
}
if !isLFSFile {
@ -783,12 +845,12 @@ func renderFile(ctx *context.APIContext, entry *git.TreeEntry, treeLink, rawLink
//ctx.Data["FileContent"] = string(markup.Render(blob.Name(), buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeDocumentMetas()))
filenameBase64 := Base64Encoding.EncodeToString(buf)
ctx.Data["FileContent"] =filenameBase64
fmt.Println("************FileContent3:",ctx.Data["FileContent"].(string))
ctx.Data["FileContent"] = filenameBase64
fmt.Println("************FileContent3:", ctx.Data["FileContent"].(string))
}
}
}
}
func safeURL(address string) string {
u, err := url.Parse(address)
if err != nil {
@ -798,7 +860,6 @@ func safeURL(address string) string {
return u.String()
}
func linesBytesCount(s []byte) int {
nl := []byte{'\n'}
n := bytes.Count(s, nl)
@ -820,7 +881,6 @@ func linesBytesCount(s []byte) int {
}
*/
// FIXME: There has to be a more efficient way of doing this
func getReadmeFileFromPath(commit *git.Commit, treePath string) (*namedBlob, error) {
@ -897,13 +957,13 @@ func getReadmeFileFromPath(commit *git.Commit, treePath string) (*namedBlob, err
// FIXME: There has to be a more efficient way of doing this
func getReadmeFileFromPathExt(ctx *context.APIContext, treePath, ref string) (*namedBlob, error) {
log.Info("*****************getReadmeFileFromPathExt.GetCommit:ref:%s treepath:%s", ref, treePath)
var err error
var err error
if ctx.Repo.GitRepo == nil {
repoPath := models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
ctx.Repo.GitRepo, err = git.OpenRepository(repoPath)
if err != nil {
ctx.ServerError("RepoRef Invalid repo "+repoPath, err)
return nil,err
return nil, err
}
// We opened it, we should close it
defer func() {
@ -914,7 +974,6 @@ func getReadmeFileFromPathExt(ctx *context.APIContext, treePath, ref string) (*n
}()
}
// Get the commit object for the ref
commit, err := ctx.Repo.GitRepo.GetCommit(ref)
if err != nil {
@ -922,7 +981,7 @@ func getReadmeFileFromPathExt(ctx *context.APIContext, treePath, ref string) (*n
}
//log.Info("********GetCommit:%v",commit)
ctx.Repo.Commit=commit
ctx.Repo.Commit = commit
tree, err := commit.SubTree(treePath)
if err != nil {
@ -995,7 +1054,6 @@ func getReadmeFileFromPathExt(ctx *context.APIContext, treePath, ref string) (*n
return readmeFile, nil
}
func FindFiles(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/find repository find
// ---
@ -1030,23 +1088,23 @@ func FindFiles(ctx *context.APIContext) {
// "$ref": "#/responses/notFound"
treePath := ctx.Repo.TreePath
ref:= ctx.QueryTrim("ref")
ref := ctx.QueryTrim("ref")
if ref == "" {
ref = ctx.Repo.Repository.DefaultBranch
}
fmt.Println("***ref:",ref)
keyword:= ctx.QueryTrim("q")
fmt.Println("***ref:", ref)
keyword := ctx.QueryTrim("q")
if keyword == "" {
//keyword="README" //test
}
FindList,err:=FindFileFromPathExt(ctx,treePath,ref,keyword)
if err !=nil {
ctx.NotFound("FindFiles", err)
FindList, err := FindFileFromPathExt(ctx, treePath, ref, keyword)
if err != nil {
ctx.NotFound("FindFiles", err)
return
}
ctx.JSON(http.StatusOK,FindList)
ctx.JSON(http.StatusOK, FindList)
}
// TO DO
@ -1056,7 +1114,7 @@ func FindFileFromPathExt(ctx *context.APIContext, treePath, ref, key string) (fi
ctx.Repo.GitRepo, err = git.OpenRepository(repoPath)
if err != nil {
ctx.ServerError("RepoRef Invalid repo "+repoPath, err)
return nil,err
return nil, err
}
// We opened it, we should close it
defer func() {
@ -1067,14 +1125,12 @@ func FindFileFromPathExt(ctx *context.APIContext, treePath, ref, key string) (fi
}()
}
// Get the commit object for the ref
commit, err := ctx.Repo.GitRepo.GetCommit(ref)
if err != nil {
return nil, err
}
tree, err := commit.SubTree(treePath)
if err != nil {
return nil, err
@ -1089,21 +1145,20 @@ func FindFileFromPathExt(ctx *context.APIContext, treePath, ref, key string) (fi
return nil, err
}
fileList =make([]*SearchFileItem,0,0)
fileList = make([]*SearchFileItem, 0, 0)
for _, entry := range entries {
if entry.IsDir() {
continue
}
fileName := filepath.Base(entry.Name())
fileName:=filepath.Base(entry.Name())
if strings.Contains(strings.ToLower(fileName),strings.ToLower(key)) || key=="" {
if strings.Contains(strings.ToLower(fileName), strings.ToLower(key)) || key == "" {
name := entry.Name()
//isSymlink := entry.IsLink()
//target := entry
//_=target
//_=target
//
//if isSymlink {
// target, err = entry.FollowLinks()
@ -1111,7 +1166,7 @@ func FindFileFromPathExt(ctx *context.APIContext, treePath, ref, key string) (fi
// return nil, err
// }
//}
treePath=name
treePath = name
selfURL, err := url.Parse(fmt.Sprintf("%s/contents/%s?ref=%s", ctx.Repo.Repository.APIURL(), treePath, ref))
if err != nil {
return nil, err
@ -1129,15 +1184,14 @@ func FindFileFromPathExt(ctx *context.APIContext, treePath, ref, key string) (fi
}
htmlURLString := htmlURL.String()
Item := &SearchFileItem{
Name:fileName,
Path:treePath,
SHA:entry.ID.String(),
Type:entry.Type(),
Size:entry.Size(),
URL:&selfURLString,
HTMLURL:&htmlURLString,
Name: fileName,
Path: treePath,
SHA: entry.ID.String(),
Type: entry.Type(),
Size: entry.Size(),
URL: &selfURLString,
HTMLURL: &htmlURLString,
}
// Now populate the rest of the ContentsResponse based on entry type
@ -1152,29 +1206,28 @@ func FindFileFromPathExt(ctx *context.APIContext, treePath, ref, key string) (fi
} else if entry.IsSubModule() {
Item.Type = string(repofiles.ContentTypeSubmodule)
}
fileList=append(fileList,Item)
fileList = append(fileList, Item)
}
}
return
}
type SearchFileItem struct {
Name string `json:"name"`
Path string `json:"path"`
SHA string `json:"sha"`
// `type` will be `file`, `dir`, `symlink`, or `submodule`
Type string `json:"type"`
Size int64 `json:"size"`
URL *string `json:"url"`
HTMLURL *string `json:"html_url"`
// GitURL *string `json:"git_url"`
// DownloadURL *string `json:"download_url"`
// // `submodule_git_url` is populated when `type` is `submodule`, otherwise null
// SubmoduleGitURL *string `json:"submodule_git_url"`
// Links *api.FileLinksResponse `json:"_links"`
}
Type string `json:"type"`
Size int64 `json:"size"`
URL *string `json:"url"`
HTMLURL *string `json:"html_url"`
// GitURL *string `json:"git_url"`
// DownloadURL *string `json:"download_url"`
// // `submodule_git_url` is populated when `type` is `submodule`, otherwise null
// SubmoduleGitURL *string `json:"submodule_git_url"`
// Links *api.FileLinksResponse `json:"_links"`
}
func IsReadmeFileExt(name string, ext ...string) bool {
name = strings.ToLower(name)
@ -1189,7 +1242,6 @@ func IsReadmeFileExt(name string, ext ...string) bool {
return name[:7] == "readme_zh."
}
type namedBlob struct {
name string
isSymlink bool
@ -1197,13 +1249,13 @@ type namedBlob struct {
}
type ReadmeDTO struct {
Type string `json:"type"`
Encoding string `json:"encoding"`
Size int64 `json:"size"`
Name string `json:"name"`
Path string `json:"path"`
Content string `json:"content"`
Sha string `json:"sha"`
Type string `json:"type"`
Encoding string `json:"encoding"`
Size int64 `json:"size"`
Name string `json:"name"`
Path string `json:"path"`
Content string `json:"content"`
Sha string `json:"sha"`
//URL string `json:"url"`
//GitURL string `json:"git_url"`
//HTMLURL string `json:"html_url"`
@ -1216,7 +1268,7 @@ type ReadmeDTO struct {
}
type ReadmeResponeDTO struct {
Msg string
Code int
Msg string
Code int
ReadmeDTO *ReadmeDTO
}

View File

@ -179,7 +179,7 @@ func FileHistory(ctx *context.Context) {
page = 1
}
commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(branchName, fileName, page)
commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(branchName, fileName, page, 50)
if err != nil {
ctx.ServerError("CommitsByFileAndRange", err)
return

View File

@ -277,7 +277,7 @@ func renderRevisionPage(ctx *context.Context) (*git.Repository, *git.TreeEntry)
}
// get Commit Count
commitsHistory, err := wikiRepo.CommitsByFileAndRangeNoFollow("master", pageFilename, page)
commitsHistory, err := wikiRepo.CommitsByFileAndRangeNoFollow("master", pageFilename, page, 50)
if err != nil {
if wikiRepo != nil {
wikiRepo.Close()

View File

@ -6,6 +6,7 @@
package wiki
import (
"errors"
"fmt"
"net/url"
"os"
@ -65,6 +66,16 @@ func FilenameToName(filename string) (string, error) {
}
return NormalizeWikiName(unescaped), nil
}
// check filename
func CheckFile(filename string) error {
if(len(filename) <= 150 ){
return nil
}else {
err := errors.New("The name is too long, please be less than 200 bytes")
return err
}
}
// InitWiki initializes a wiki for repository,
// it does nothing when repository already has wiki.
@ -134,6 +145,10 @@ func updateWikiPage(doer *models.User, repo *models.Repository, oldWikiName, new
}
newWikiPath := NameToFilename(newWikiName)
//进行url解码
//newWikiPath, _ = url.QueryUnescape(newWikiPath)
if isNew {
filesInIndex, err := gitRepo.LsFiles(newWikiPath)
if err != nil {
@ -170,6 +185,8 @@ func updateWikiPage(doer *models.User, repo *models.Repository, oldWikiName, new
return err
}
fmt.Println("newWikiPath======================",newWikiPath)
if err := gitRepo.AddObjectToIndex("100644", objectHash, newWikiPath); err != nil {
log.Error("%v", err)
return err

File diff suppressed because it is too large Load Diff

52
vendor/modules.txt vendored
View File

@ -58,7 +58,6 @@ github.com/PuerkitoBio/goquery
# github.com/PuerkitoBio/purell v1.1.1
github.com/PuerkitoBio/purell
# github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578
## explicit
github.com/PuerkitoBio/urlesc
# github.com/RoaringBitmap/roaring v0.4.23
## explicit
@ -101,15 +100,12 @@ github.com/andybalholm/brotli
# github.com/andybalholm/cascadia v1.1.0
github.com/andybalholm/cascadia
# github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239
## explicit
github.com/anmitsu/go-shlex
# github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
github.com/asaskevich/govalidator
# github.com/aymerick/douceur v0.2.0
## explicit
github.com/aymerick/douceur/css
# github.com/beorn7/perks v1.0.1
## explicit
github.com/beorn7/perks/quantile
# github.com/bgentry/speakeasy v0.1.0
## explicit
@ -180,7 +176,6 @@ github.com/chris-ramon/douceur/parser
github.com/couchbase/gomemcached
github.com/couchbase/gomemcached/client
# github.com/couchbase/goutils v0.0.0-20191018232750-b49639060d85
## explicit
github.com/couchbase/goutils/logging
github.com/couchbase/goutils/scramsha
# github.com/couchbase/vellum v1.0.1
@ -199,7 +194,6 @@ github.com/couchbaselabs/go-couchbase
# github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964
github.com/danwakefield/fnmatch
# github.com/davecgh/go-spew v1.1.1
## explicit
github.com/davecgh/go-spew/spew
# github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc
## explicit
@ -211,7 +205,6 @@ github.com/denisenkom/go-mssqldb/internal/querytext
## explicit
github.com/dgrijalva/jwt-go
# github.com/dlclark/regexp2 v1.2.0
## explicit
github.com/dlclark/regexp2
github.com/dlclark/regexp2/syntax
# github.com/dsnet/compress v0.0.1
@ -245,10 +238,8 @@ github.com/ethantkoenig/rupture
# github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870
## explicit
# github.com/fatih/color v1.9.0
## explicit
github.com/fatih/color
# github.com/fatih/structtag v1.2.0
## explicit
github.com/fatih/structtag
# github.com/fsnotify/fsnotify v1.4.7
github.com/fsnotify/fsnotify
@ -269,7 +260,6 @@ github.com/go-enry/go-enry/v2/regex
# github.com/go-enry/go-oniguruma v1.2.1
github.com/go-enry/go-oniguruma
# github.com/go-git/gcfg v1.5.0
## explicit
github.com/go-git/gcfg
github.com/go-git/gcfg/scanner
github.com/go-git/gcfg/token
@ -327,19 +317,12 @@ github.com/go-git/go-git/v5/utils/merkletrie/filesystem
github.com/go-git/go-git/v5/utils/merkletrie/index
github.com/go-git/go-git/v5/utils/merkletrie/internal/frame
github.com/go-git/go-git/v5/utils/merkletrie/noder
# github.com/go-macaron/gzip v0.0.0-20200329073552-98214d7a897e
## explicit
# github.com/go-macaron/toolbox v0.0.0-20200329073429-4401f4ce0f55
## explicit
# github.com/go-openapi/analysis v0.19.5
## explicit
github.com/go-openapi/analysis
github.com/go-openapi/analysis/internal
# github.com/go-openapi/errors v0.19.2
## explicit
github.com/go-openapi/errors
# github.com/go-openapi/inflect v0.19.0
## explicit
github.com/go-openapi/inflect
# github.com/go-openapi/jsonpointer v0.19.3
github.com/go-openapi/jsonpointer
@ -347,11 +330,9 @@ github.com/go-openapi/jsonpointer
## explicit
github.com/go-openapi/jsonreference
# github.com/go-openapi/loads v0.19.3
## explicit
github.com/go-openapi/loads
github.com/go-openapi/loads/fmts
# github.com/go-openapi/runtime v0.19.5
## explicit
github.com/go-openapi/runtime
github.com/go-openapi/runtime/logger
github.com/go-openapi/runtime/middleware
@ -360,16 +341,12 @@ github.com/go-openapi/runtime/middleware/header
github.com/go-openapi/runtime/middleware/untyped
github.com/go-openapi/runtime/security
# github.com/go-openapi/spec v0.19.3
## explicit
github.com/go-openapi/spec
# github.com/go-openapi/strfmt v0.19.3
## explicit
github.com/go-openapi/strfmt
# github.com/go-openapi/swag v0.19.5
## explicit
github.com/go-openapi/swag
# github.com/go-openapi/validate v0.19.3
## explicit
github.com/go-openapi/validate
# github.com/go-redis/redis v6.15.2+incompatible
## explicit
@ -384,7 +361,6 @@ github.com/go-redis/redis/internal/util
## explicit
github.com/go-sql-driver/mysql
# github.com/go-stack/stack v1.8.0
## explicit
github.com/go-stack/stack
# github.com/go-swagger/go-swagger v0.21.0
## explicit
@ -418,20 +394,17 @@ github.com/gogs/cron
# github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe
github.com/golang-sql/civil
# github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721
## explicit
github.com/golang/gddo/httputil
github.com/golang/gddo/httputil/header
# github.com/golang/protobuf v1.4.1
## explicit
github.com/golang/protobuf/proto
# github.com/golang/snappy v0.0.1
## explicit
github.com/golang/snappy
# github.com/google/go-github/v32 v32.1.0
## explicit
github.com/google/go-github/v32/github
# github.com/google/go-querystring v1.0.0
## explicit
github.com/google/go-querystring/query
# github.com/google/uuid v1.1.1
## explicit
@ -440,10 +413,8 @@ github.com/google/uuid
## explicit
github.com/gorilla/context
# github.com/gorilla/css v1.0.0
## explicit
github.com/gorilla/css/scanner
# github.com/gorilla/handlers v1.4.2
## explicit
github.com/gorilla/handlers
# github.com/gorilla/mux v1.7.3
github.com/gorilla/mux
@ -483,7 +454,6 @@ github.com/jaytaylor/html2text
# github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99
github.com/jbenet/go-context/io
# github.com/jessevdk/go-flags v1.4.0
## explicit
github.com/jessevdk/go-flags
# github.com/jmhodges/levigo v1.0.0
## explicit
@ -519,7 +489,6 @@ github.com/klauspost/compress/zstd/internal/xxhash
# github.com/klauspost/pgzip v1.2.1
github.com/klauspost/pgzip
# github.com/kr/pretty v0.1.0
## explicit
github.com/kr/pretty
# github.com/kr/text v0.2.0
github.com/kr/text
@ -536,10 +505,8 @@ github.com/lib/pq/scram
## explicit
github.com/lunny/dingtalk_webhook
# github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de
## explicit
github.com/lunny/log
# github.com/lunny/nodb v0.0.0-20160621015157-fc1ef06ad4af
## explicit
github.com/lunny/nodb
github.com/lunny/nodb/config
github.com/lunny/nodb/store
@ -580,7 +547,6 @@ github.com/mattn/go-runewidth
## explicit
github.com/mattn/go-sqlite3
# github.com/matttproud/golang_protobuf_extensions v1.0.1
## explicit
github.com/matttproud/golang_protobuf_extensions/pbutil
# github.com/mcuadros/go-version v0.0.0-20190308113854-92cdf37c5b75
## explicit
@ -620,7 +586,6 @@ github.com/niklasfasching/go-org/org
# github.com/nwaples/rardecode v1.0.0
github.com/nwaples/rardecode
# github.com/olekukonko/tablewriter v0.0.4
## explicit
github.com/olekukonko/tablewriter
# github.com/oliamb/cutter v0.2.2
## explicit
@ -633,17 +598,14 @@ github.com/olivere/elastic/v7/uritemplates
# github.com/pelletier/go-toml v1.4.0
github.com/pelletier/go-toml
# github.com/philhofer/fwd v1.0.0
## explicit
github.com/philhofer/fwd
# github.com/pierrec/lz4 v2.0.5+incompatible
## explicit
github.com/pierrec/lz4
github.com/pierrec/lz4/internal/xxh32
# github.com/pkg/errors v0.9.1
## explicit
github.com/pkg/errors
# github.com/pmezard/go-difflib v1.0.0
## explicit
github.com/pmezard/go-difflib/difflib
# github.com/pquerna/otp v1.2.0
## explicit
@ -659,7 +621,6 @@ github.com/prometheus/client_golang/prometheus/promhttp
## explicit
github.com/prometheus/client_model/go
# github.com/prometheus/common v0.6.0
## explicit
github.com/prometheus/common/expfmt
github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg
github.com/prometheus/common/model
@ -684,8 +645,9 @@ github.com/shurcooL/httpfs/vfsutil
## explicit
github.com/shurcooL/vfsgen
# github.com/siddontang/go-snappy v0.0.0-20140704025258-d8f7bb82a96d
## explicit
github.com/siddontang/go-snappy/snappy
# github.com/smartystreets/goconvey v1.6.4
## explicit
# github.com/spf13/afero v1.2.2
github.com/spf13/afero
github.com/spf13/afero/mem
@ -696,7 +658,6 @@ github.com/spf13/jwalterweatherman
# github.com/spf13/pflag v1.0.5
github.com/spf13/pflag
# github.com/spf13/viper v1.4.0
## explicit
github.com/spf13/viper
# github.com/steveyen/gtreap v0.1.0
github.com/steveyen/gtreap
@ -705,7 +666,6 @@ github.com/steveyen/gtreap
github.com/stretchr/testify/assert
github.com/stretchr/testify/require
# github.com/syndtr/goleveldb v1.0.0
## explicit
github.com/syndtr/goleveldb/leveldb
github.com/syndtr/goleveldb/leveldb/cache
github.com/syndtr/goleveldb/leveldb/comparer
@ -724,7 +684,6 @@ github.com/syndtr/goleveldb/leveldb/util
## explicit
github.com/tinylib/msgp/msgp
# github.com/toqueteos/webbrowser v1.2.0
## explicit
github.com/toqueteos/webbrowser
# github.com/tstranex/u2f v1.0.0
## explicit
@ -778,7 +737,6 @@ github.com/yuin/goldmark-meta
# go.etcd.io/bbolt v1.3.4
go.etcd.io/bbolt
# go.mongodb.org/mongo-driver v1.1.1
## explicit
go.mongodb.org/mongo-driver/bson
go.mongodb.org/mongo-driver/bson/bsoncodec
go.mongodb.org/mongo-driver/bson/bsonrw
@ -814,7 +772,6 @@ golang.org/x/crypto/ssh/agent
golang.org/x/crypto/ssh/internal/bcrypt_pbkdf
golang.org/x/crypto/ssh/knownhosts
# golang.org/x/mod v0.2.0
## explicit
golang.org/x/mod/module
golang.org/x/mod/semver
# golang.org/x/net v0.0.0-20200602114024-627f9648deb9
@ -891,7 +848,6 @@ golang.org/x/tools/internal/gopathwalk
golang.org/x/tools/internal/imports
golang.org/x/tools/internal/packagesinternal
# golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
## explicit
golang.org/x/xerrors
golang.org/x/xerrors/internal
# google.golang.org/appengine v1.6.5
@ -907,7 +863,6 @@ google.golang.org/appengine/internal/remote_api
google.golang.org/appengine/internal/urlfetch
google.golang.org/appengine/urlfetch
# google.golang.org/protobuf v1.22.0
## explicit
google.golang.org/protobuf/encoding/prototext
google.golang.org/protobuf/encoding/protowire
google.golang.org/protobuf/internal/descfmt
@ -950,10 +905,7 @@ gopkg.in/ini.v1
# gopkg.in/ldap.v3 v3.0.2
## explicit
gopkg.in/ldap.v3
# gopkg.in/macaron.v1 v1.4.0
## explicit
# gopkg.in/warnings.v0 v0.1.2
## explicit
gopkg.in/warnings.v0
# gopkg.in/yaml.v2 v2.3.0
## explicit