diff --git a/README.md b/README.md
index 8e4cc8331..9d61d852d 100644
--- a/README.md
+++ b/README.md
@@ -77,7 +77,7 @@ The goal of this project is to make the easiest, fastest, and most painless way
## Installation
-Make sure you install the [prerequisites](http://gogs.io/docs/installation/) first.
+Make sure you install the [prerequisites](http://gogs.io/docs/installation) first.
There are 5 ways to install Gogs:
@@ -108,8 +108,8 @@ There are 5 ways to install Gogs:
## Acknowledgments
-- Router and middleware mechanism of [Macaron](https://github.com/Unknwon/macaron).
-- Mail Service, modules design is inspired by [WeTalk](https://github.com/beego/wetalk).
+- Router and middleware mechanism of [Macaron](https://github.com/go-macaron/macaron).
+- Modules design is inspired by [WeTalk](https://github.com/beego/wetalk).
- System Monitor Status is inspired by [GoBlog](https://github.com/fuxiaohei/goblog).
- Thanks [lavachen](http://www.lavachen.cn/) and [Rocker](http://weibo.com/rocker1989) for designing Logo.
- Thanks [Crowdin](https://crowdin.com/project/gogs) for providing open source translation plan.
diff --git a/README_ZH.md b/README_ZH.md
index 471cc79aa..a11627a05 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -44,7 +44,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
## 安装部署
-在安装 Gogs 之前,您需要先安装 [基本环境](http://gogs.io/docs/installation/)。
+在安装 Gogs 之前,您需要先安装 [基本环境](http://gogs.io/docs/installation)。
然后,您可以通过以下 5 种方式来安装 Gogs:
@@ -56,8 +56,8 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
## 特别鸣谢
-- 基于 [Macaron](https://github.com/Unknwon/macaron) 的路由与中间件机制。
-- 基于 [WeTalk](https://github.com/beego/wetalk) 修改的邮件服务和模块设计。
+- 基于 [Macaron](https://github.com/go-macaron/macaron) 的路由与中间件机制。
+- 基于 [WeTalk](https://github.com/beego/wetalk) 修改的模块设计。
- 基于 [GoBlog](https://github.com/fuxiaohei/goblog) 修改的系统监视状态。
- 感谢 [lavachen](http://www.lavachen.cn/) 和 [Rocker](http://weibo.com/rocker1989) 设计的 Logo。
- 感谢 [Crowdin](https://crowdin.com/project/gogs) 提供免费的开源项目本地化支持。
diff --git a/conf/locale/locale_lv-LV.ini b/conf/locale/locale_lv-LV.ini
index 7e167d0bf..1f8cd7b5f 100755
--- a/conf/locale/locale_lv-LV.ini
+++ b/conf/locale/locale_lv-LV.ini
@@ -444,14 +444,14 @@ issues.filter_sort.recentupdate=Nesen atjaunotās
issues.filter_sort.leastupdate=Vissenāk atjaunotās
issues.filter_sort.mostcomment=Visvairāk komentētās
issues.filter_sort.leastcomment=Vismazāk komentētās
-issues.opened_by=opened %[1]s by %[3]s
-issues.opened_by_fake=opened %[1]s by %[2]s
+issues.opened_by=%[3]s atvēra %[1]s
+issues.opened_by_fake=%[2]s atvēra %[1]s
issues.previous=Iepriekšējā
issues.next=Nākamā
issues.open_title=Atvērta
issues.closed_title=Slēgta
issues.num_comments=%d komentāri
-issues.commented_at=`commented %[2]s`
+issues.commented_at=`komentēja %[2]s`
issues.no_content=Vēl nav satura.
issues.close_issue=Aizvērt
issues.close_comment_issue=Komentēt un aizvērt
@@ -489,44 +489,45 @@ pulls.no_results=Nekas netika atrasts.
pulls.nothing_to_compare=Nav ko salīdzināt, jo bāzes un salīdzināmie atzari ir vienādi.
pulls.has_pull_request=`Jau eksistē izmaiņu pieprasījums starp šiem diviem atzariem: %[2]s#%[3]d`
pulls.create=Izveidot izmaiņu pieprasījumu
-pulls.title_desc=wants to merge %[1]d commits from %[2]s
into %[3]s
-pulls.merged_title_desc=merged %[1]d commits from %[2]s
into %[3]s
%[4]s
+pulls.title_desc=vēlas sapludināt %[1]d revīzijas no %[2]s
uz %[3]s
+pulls.merged_title_desc=sapludināja %[1]d revīzijas no %[2]s
uz %[3]s
%[4]s
pulls.tab_conversation=Saruna
pulls.tab_commits=Revīzijas
pulls.tab_files=Izmainītie faili
pulls.reopen_to_merge=Lūdzu, atkārtoti atveriet šo izmaiņu pieprasījumu, lai veiktu sapludināšanu.
pulls.merged=Sapludināts
pulls.has_merged=Šo izmaiņu pieprasījums tika veiksmīgi sapludināts!
-pulls.data_broken=Data of this pull request has been broken due to deletion of fork information.
-pulls.can_auto_merge_desc=You can perform auto-merge operation on this pull request.
-pulls.cannot_auto_merge_desc=You can't perform auto-merge operation because there are conflicts between commits.
+pulls.data_broken=Nepieejami izmaiņu pieprasījuma dati, jo dzēsta informācija no atdalītā repozitorija.
+pulls.is_checking=Notiek konfliktu pārbaude, mirkli uzgaidiet un atjaunojiet lapu.
+pulls.can_auto_merge_desc=Ir iespējams veikt automātisko sapludināšanas darbību šim izmaiņu pieprasījumam.
+pulls.cannot_auto_merge_desc=Nav iespējams veikt automātisko sapludināšanas darbību, jo starp revīzijām ir konflikti.
pulls.cannot_auto_merge_helper=Lūdzu, izmantojiet komandrindas rīku, lai to atrisinātu.
pulls.merge_pull_request=Izmaiņu pieprasījuma sapludināšana
-pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
+pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) no šī repozitorija ar tādu pašu sapludināšanas informāciju un gaida sapludināšanu.`
-milestones.new=New Milestone
+milestones.new=Jauns atskaites punkts
milestones.open_tab=%d atvērti
milestones.close_tab=%d aizvērti
milestones.closed=Aizvērts %s
-milestones.no_due_date=No due date
+milestones.no_due_date=Bez termiņa
milestones.open=Atvērt
milestones.close=Aizvērt
milestones.new_subheader=Izveidojiet atskaites punktus, lai organizētu problēmas.
milestones.create=Izveidot atskaites punktu
milestones.title=Virsraksts
milestones.desc=Apraksts
-milestones.due_date=Due Date (optional)
+milestones.due_date=Termiņš (neobligāts)
milestones.clear=Notīrīt
-milestones.invalid_due_date_format=Due date format is invalid, must be 'year-mm-dd'.
-milestones.create_success=Milestone '%s' has been created successfully!
-milestones.edit=Edit Milestone
-milestones.edit_subheader=Use better description for milestones so people won't be confused.
+milestones.invalid_due_date_format=Termiņa datuma formāts ir nekorekts, jābūt formātā 'gggg-mm-dd'.
+milestones.create_success=Atskaites punkts '%s' tika veiksmīgi izveidots!
+milestones.edit=Labot atskaites punktu
+milestones.edit_subheader=Izmantojiet pēc iespējas labāku aprakstu atskaites punktiem, lai citiem tas būtu saprotamāks.
milestones.cancel=Atcelt
-milestones.modify=Modify Milestone
-milestones.edit_success=Changes of milestone '%s' has been saved successfully!
-milestones.deletion=Milestone Deletion
-milestones.deletion_desc=Delete this milestone will remove its information in all related issues. Do you want to continue?
-milestones.deletion_success=Milestone has been deleted successfully!
+milestones.modify=Mainīt atskaites punktu
+milestones.edit_success=Izmaiņas atskaites punktā '%s' tika veiksmīgi saglabātas!
+milestones.deletion=Atskaites punkta dzēšana
+milestones.deletion_desc=Dzēšot šo atskaites punktu tiks noņemta arī saistītā informācija no problēmu ziņojumiem. Vai vēlaties turpināt?
+milestones.deletion_success=Atskaites punkts tika veiksmīgi izdzēsts!
settings=Iestatījumi
settings.options=Opcijas
@@ -537,20 +538,20 @@ settings.basic_settings=Pamatiestatījumi
settings.danger_zone=Bīstamā zona
settings.site=Oficiālā mājas lapa
settings.update_settings=Mainīt iestatījumus
-settings.change_reponame_prompt=This change will affect how links relate to the repository.
+settings.change_reponame_prompt=Šī izmaiņa ietekmēs saites, kas ir saistītas ar šo repozitoriju.
settings.transfer=Mainīt īpašnieku
settings.transfer_desc=Mainīt šī repozitorija īpašnieku uz citu lietotāju vai organizāciju, kurai Jums ir administratora tiesībs.
settings.new_owner_has_same_repo=Jaunajam īpašniekam jau ir repozitorijs ar šādu nosaukumu.
settings.delete=Dzēst šo repozitoriju
settings.delete_desc=Dzēšot repozitoriju, tā datus vairs nebūs iespējams atgūt. Pirms dzēšanas pārliecinieites vai patiešām vēlaties to darīt.
-settings.transfer_notices_1=- You will lose access if new owner is a individual user.
-settings.transfer_notices_2=- You will conserve access if new owner is an organization and if you're one of the owners.
-settings.transfer_form_title=Please enter following information to confirm your operation:
-settings.delete_notices_1=- This operation CANNOT be undone.
-settings.delete_notices_2=- This operation will permanently delete the everything of this repository, including Git data, issues, comments and accesses of collaborators.
-settings.delete_notices_fork_1=- If this repository is public, all forks will be became independent after deletion.
-settings.delete_notices_fork_2=- If this repository is private, all forks will be removed at the same time.
-settings.delete_notices_fork_3=- If you want to keep all forks after deletion, please change visibility of this repository to public first.
+settings.transfer_notices_1=- Jūs pazaudēsiet piekļuvi, ja jaunais īpašnieks ir lietotājs.
+settings.transfer_notices_2=- Jūs saglabāsiet piekļuvi, ja jaunais īpašnieks ir organizācija un Jūs esat viens no tās īpašniekiem.
+settings.transfer_form_title=Lūdzu, ievadiet sekojošu informāciju, lai apstiprinātu šo darbību:
+settings.delete_notices_1=- Šī darbība ir NEATGRIEZENISKA.
+settings.delete_notices_2=- Šī darbība neatgriezeniski izdzēsīs visus šī repozitorija datus, tai skaitā Git datus, problēmu ziņojumus, komentārus un definētās piekļuves tiesības.
+settings.delete_notices_fork_1=- Ja repozitorijs ir publisks, visi atdalītie repozitoriji kļūs neatkarīgi.
+settings.delete_notices_fork_2=- Ja repozitorijs ir privāts, tiks dzēsti arī visi atdalītie repozitoriji.
+settings.delete_notices_fork_3=- Ja vēlaties saglabāt atdalīts repozitorijus pēc dzēšanas, sākumā nomainiet repozitorija redzamību uz publisku.
settings.update_settings_success=Repozitorija opcijas ir veiksmīgi saglabātas.
settings.transfer_owner=Jaunais īpašnieks
settings.make_transfer=Mainīt
@@ -562,9 +563,9 @@ settings.remove_collaborator_success=Līdzstrādnieks tika noņemts.
settings.user_is_org_member=Lietotājs ir organizācijas biedrs, kas nevar tikt pievienots kā līdzstrādnieks.
settings.add_webhook=Pievienot tīmekļa āķi
settings.hooks_desc=Tīmekļa āķi ļauj paziņot ārējiem servisiem par noteiktiem notikomiem, kas notiek Git servisā. Kad iestāsies kāds notikums, katram ārējā servisa URL tiks nosūtīts POST pieprasījums. Lai uzzinātu sīkāk skatieties Tīmekļa āķu rokasgrāmatā.
-settings.webhook_deletion=Delete Webhook
-settings.webhook_deletion_desc=Delete this webhook will remove its information and all delivery history. Do you want to continue?
-settings.webhook_deletion_success=Webhook has been deleted successfully!
+settings.webhook_deletion=Dzēst tīmekļa āķi
+settings.webhook_deletion_desc=Dzēšot tīmekļa āķi tiks dzēsta visa ar to saistītā informācija un izpildes vēsture. Vai vēlaties turpināt?
+settings.webhook_deletion_success=Tīmekļa āķis tika veiksmīgi izdzēsts!
settings.webhook.request=Pieprasījums
settings.webhook.response=Atbilde
settings.webhook.headers=Galvenes
@@ -587,9 +588,9 @@ settings.event_push_only=Tikai izmaiņu nosūtīšanas notikumiem.
settings.event_send_everything=Vēlos saņemt visu.
settings.event_choose=Atzīmēt, ko vēlos saņemt.
settings.event_create=Izveidot
-settings.event_create_desc=Branch, or tag created
-settings.event_push=Push
-settings.event_push_desc=Git push to a repository
+settings.event_create_desc=Atzara vai taga izveidošana
+settings.event_push=Izmaiņu nosūtīšana
+settings.event_push_desc=Git izmaiņu nosūtīšana uz repozitoriju
settings.active=Aktīvs
settings.active_helper=Tiks nosūtīti notikuma dati, kad nostrādās šis āķis.
settings.add_hook_success=Jauns tīmekļa āķis tika veiksmīgi pievienots.
@@ -604,15 +605,15 @@ settings.slack_domain=Domēns
settings.slack_channel=Kanāls
settings.deploy_keys=Izvietot atslēgas
settings.add_deploy_key=Pievienot izvietošanas atslēgu
-settings.no_deploy_keys=You haven't added any deploy key.
+settings.no_deploy_keys=Nav pievienota neviena izvietošanas atslēga.
settings.title=Virsraksts
settings.deploy_key_content=Saturs
-settings.key_been_used=Deploy key content has been used.
-settings.key_name_used=Deploy key with same name has already existed.
-settings.add_key_success=New deploy key '%s' has been added successfully!
+settings.key_been_used=Šāda izvietošanas atslēga jau eksistē.
+settings.key_name_used=Izvietošanas atslēga ar šādu nosaukumu jau eksistē.
+settings.add_key_success=Izvietošanas atslēga '%s' tik veiksmīgi pievienota!
settings.deploy_key_deletion=Dzēst izvietošanas atslēgu
-settings.deploy_key_deletion_desc=Delete this deploy key will remove all related accesses for this repository. Do you want to continue?
-settings.deploy_key_deletion_success=Deploy key has been deleted successfully!
+settings.deploy_key_deletion_desc=Dzēšot šo izvietošanas atslēgu tiks noņemta arī ar to saistītā piekļuve šim repozitorijam. Vai vēlaties turpināt?
+settings.deploy_key_deletion_success=Izvietošanas atslēga tika veiksmīgi izdzēsta!
diff.browse_source=Pārlūkot izejas kodu
diff.parent=vecāks
@@ -665,8 +666,8 @@ team_name_helper=Šo nosaukumu varēs izmantot, lai pieminētu komandu sarunās.
team_desc_helper=Komandas apraksts
team_permission_desc=Kādām tiesībām šai komandai būtu jābūt?
-form.name_reserved=Organization name '%s' is reserved.
-form.name_pattern_not_allowed=Organization name pattern '%s' is not allowed.
+form.name_reserved=Organizācijas nosaukums '%s' ir rezervēts.
+form.name_pattern_not_allowed=Organizācijas nosaukums '%s' nav atļauts.
settings=Iestatījumi
settings.options=Opcijas
@@ -675,8 +676,8 @@ settings.website=Mājas lapa
settings.location=Atrašanās vieta
settings.update_settings=Mainīt iestatījumus
settings.update_setting_success=Organizācijas iestatījumi tika veiksmīgi saglabāti.
-settings.change_orgname_prompt=This change will affect how links relate to the organization.
-settings.update_avatar_success=Organization avatar setting has been updated successfully.
+settings.change_orgname_prompt=Šī izmaiņa ietekmēs saites, kas ir saistītas ar šo organizāciju.
+settings.update_avatar_success=Organizācijas avatara iestatījumi tika veiksmīgi saglabāti.
settings.delete=Dzēst organizāciju
settings.delete_account=Dzēst šo organizāciju
settings.delete_prompt=Šī darbība pilnībā dzēsīs šo organizāciju, kā arī tā ir NEATGRIEZENISKA!
@@ -732,8 +733,8 @@ authentication=Autentifikācijas
config=Konfigurācija
notices=Sistēmas paziņojumi
monitor=Uzraudzība
-first_page=First
-last_page=Last
+first_page=Pirmā
+last_page=Pēdējā
total=Kopā: %d
dashboard.statistic=Statistika
@@ -793,13 +794,13 @@ users.activated=Aktivizēts
users.admin=Administrators
users.repos=Repozitoriji
users.created=Izveidots
-users.send_register_notify=Send Registration Notification To User
-users.new_success=New account '%s' has been created successfully.
+users.send_register_notify=Nosūtīt lietotājam reģistrācijas paziņojumu
+users.new_success=Jauns konts '%s' tika veiksmīgi izveidots.
users.edit=Labot
-users.auth_source=Authentication Source
+users.auth_source=Autentificēšanas avots
users.local=Iebūvētā
-users.auth_login_name=Authentication Login Name
-users.password_helper=Leave it empty to remain unchanged.
+users.auth_login_name=Autentifikācijas pieteikšanās vārds
+users.password_helper=Atstājiet tukšu, ja nevēlaties mainīt.
users.update_profile_success=Konta profils tika veiksmīgi saglabāts.
users.edit_account=Labot kontu
users.is_activated=Konts ir aktivizēts
@@ -809,7 +810,7 @@ users.update_profile=Mainīt konta profilu
users.delete_account=Dzēst šo kontu
users.still_own_repo=Šis konts ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai nomainīt to īpašnieku.
users.still_has_org=Šis konts ir vismaz vienas organizācijas biedrs, sākumā nepieciešams pamest vai izdzēst šo organizāciju.
-users.deletion_success=Account has been deleted successfully!
+users.deletion_success=Konts tika veiksmīgi izdzēsts!
orgs.org_manage_panel=Organizāciju pārvaldības panelis
orgs.name=Nosaukums
@@ -824,8 +825,8 @@ repos.watches=Vērošana
repos.stars=Atzīmētās zvaigznītes
repos.issues=Problēmas
-auths.auth_manage_panel=Authentication Manage Panel
-auths.new=Add New Source
+auths.auth_manage_panel=Autentifikācijas pārvaldības panelis
+auths.new=Pievienot jaunu avotu
auths.name=Nosaukums
auths.type=Veids
auths.enabled=Iespējota
@@ -850,17 +851,17 @@ auths.smtp_auth=SMTP autentifikācijas tips
auths.smtphost=SMTP resursdators
auths.smtpport=SMTP ports
auths.allowed_domains=Atļautie domēni
-auths.allowed_domains_helper=Leave it empty to not restrict any domains. Multiple domains should be separated by comma ','.
+auths.allowed_domains_helper=Atstājiet tukšu, ja nevēlaties ierobežot domēnu vārdus. Domēna vārdus nepieciešams atdalīt ar komatu ','.
auths.enable_tls=Iespējot TLS šifrēšanu
auths.skip_tls_verify=Izlaist TLS verifikāciju
auths.pam_service_name=PAM servisa nosaukums
auths.enable_auto_register=Iespējot automātisko reģistrāciju
auths.tips=Padomi
-auths.edit=Edit Authentication Setting
+auths.edit=Labot autentifikācijas iestatījumus
auths.activated=Autentifikācija ir aktivizēta
-auths.new_success=New authentication '%s' has been added successfully.
-auths.update_success=Authentication setting has been updated successfully.
-auths.update=Update Authentication Setting
+auths.new_success=Jauna autentifikācija '%s' tika veiksmīgi pievienota.
+auths.update_success=Autentifikācijas iestatījumi tika veiksmīgi saglabāti.
+auths.update=Mainīt autentifikācijas iestatījumus
auths.delete=Dzēst šo autentifikāciju
auths.delete_auth_title=Autentifikācijas dzēšana
auths.delete_auth_desc=Šī autentifikācija tiks dzēsta, vai vēlaties turpināt?
@@ -896,8 +897,8 @@ config.show_registration_button=Rādīt reģistrēšanās pogu
config.require_sign_in_view=Nepieciešama autorizācija
config.enable_cache_avatar=Glabāt profila attēlus kešatmiņā
config.mail_notify=Pasta paziņojumi
-config.disable_key_size_check=Disable Minimum Key Size Check
-config.enable_captcha=Enable Captcha
+config.disable_key_size_check=Atspējot atslēgas minimālā garuma pārbaudi
+config.enable_captcha=Iespējot drošības kodu
config.active_code_lives=Aktīvā koda ilgums
config.reset_password_code_lives=Paroles atiestatīšanas koda ilgums
config.webhook_config=Tīkla āķu konfigurācija
@@ -951,12 +952,12 @@ notices.delete_success=Sistēmas paziņojums tika veiksmīgi izdzēsts.
[action]
create_repo=izveidoja repozitoriju %s
-rename_repo=renamed repository from %[1]s
to %[3]s
+rename_repo=pārsauca repozitoriju no %[1]s
uz %[3]s
commit_repo=veica izmaiņu nosūtīšanu atzaram %[2]s repozitorijā %[3]s
create_issue=`reģistrēja problēmu %s#%[2]s`
-create_pull_request=`created pull request %s#%[2]s`
+create_pull_request=`izveidoja izmaiņu pieprasījumu %s#%[2]s`
comment_issue=`pievienoja komentāru problēmai %s#%[2]s`
-merge_pull_request=`merged pull request %s#%[2]s`
+merge_pull_request=`sapludināja izmaiņu pieprasījumu %s#%[2]s`
transfer_repo=mainīja repozitorija %s
īpašnieku uz %s
push_tag=pievienoja tagu %[2]s repozitorijam %[3]s
compare_2_commits=Veikt salīdzināšanu starp šīm 2 revīzijām
diff --git a/conf/locale/locale_pt-BR.ini b/conf/locale/locale_pt-BR.ini
index ba82fc74d..a34ef731b 100755
--- a/conf/locale/locale_pt-BR.ini
+++ b/conf/locale/locale_pt-BR.ini
@@ -444,7 +444,7 @@ issues.filter_sort.recentupdate=Mais recentemente atualizados
issues.filter_sort.leastupdate=Menos recentemente atualizados
issues.filter_sort.mostcomment=Mais comentados
issues.filter_sort.leastcomment=Menos comentados
-issues.opened_by=%[1]s foi aberto por %[3]s
+issues.opened_by=%[1]s foi aberto por %[3]s
issues.opened_by_fake=aberto %[1]s por %[2]s
issues.previous=Página anterior
issues.next=Próxima página
@@ -498,6 +498,7 @@ pulls.reopen_to_merge=Por favor reabra esse pull request para executar a operaç
pulls.merged=Merge realizado
pulls.has_merged=Este pull request foi mesclado com sucesso!
pulls.data_broken=Dados deste pull request foram quebrados devido à deleção de informação do fork.
+pulls.is_checking=The conflict checking is still in progress, please refresh page in few moments.
pulls.can_auto_merge_desc=Você pode realizar uma auto-mescla neste pull request.
pulls.cannot_auto_merge_desc=Você não pode realizar uma auto-mescla porque há conflitos entre os commits.
pulls.cannot_auto_merge_helper=Por favor, utilize linha de comando para solucionar isto.
diff --git a/gogs.go b/gogs.go
index 705b36085..039c5d4cb 100644
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting"
)
-const APP_VER = "0.6.17.1024 Beta"
+const APP_VER = "0.6.17.1025 Beta"
func init() {
runtime.GOMAXPROCS(runtime.NumCPU())
diff --git a/models/issue.go b/models/issue.go
index 1cefa42f5..077e945c3 100644
--- a/models/issue.go
+++ b/models/issue.go
@@ -92,15 +92,6 @@ func (i *Issue) AfterSet(colName string, _ xorm.Cell) {
if err != nil {
log.Error(3, "GetUserByID[%d]: %v", i.ID, err)
}
- case "is_pull":
- if !i.IsPull {
- return
- }
-
- i.PullRequest, err = GetPullRequestByIssueID(i.ID)
- if err != nil {
- log.Error(3, "GetPullRequestByIssueID[%d]: %v", i.ID, err)
- }
case "created":
i.Created = regulateTimeZone(i.Created)
}
@@ -282,6 +273,15 @@ func (i *Issue) ChangeStatus(doer *User, isClosed bool) (err error) {
return sess.Commit()
}
+func (i *Issue) GetPullRequest() (err error) {
+ if i.PullRequest != nil {
+ return nil
+ }
+
+ i.PullRequest, err = GetPullRequestByIssueID(i.ID)
+ return err
+}
+
// It's caller's responsibility to create action.
func newIssue(e *xorm.Session, repo *Repository, issue *Issue, labelIDs []int64, uuids []string, isPull bool) (err error) {
if _, err = e.Insert(issue); err != nil {
diff --git a/models/pull.go b/models/pull.go
index 7436511c9..7ef0901cc 100644
--- a/models/pull.go
+++ b/models/pull.go
@@ -226,6 +226,12 @@ func (pr *PullRequest) testPatch() (err error) {
return fmt.Errorf("BaseRepo.PatchPath: %v", err)
}
+ // Fast fail if patch does not exist, this assumes data is cruppted.
+ if !com.IsFile(patchPath) {
+ log.Trace("PullRequest[%d].testPatch: ignored cruppted data", pr.ID)
+ return nil
+ }
+
log.Trace("PullRequest[%d].testPatch(patchPath): %s", pr.ID, patchPath)
if err := pr.BaseRepo.UpdateLocalCopy(); err != nil {
@@ -373,28 +379,47 @@ func (pr *PullRequest) UpdateCols(cols ...string) error {
var PullRequestQueue = NewUniqueQueue(setting.Repository.PullRequestQueueLength)
-// checkAndUpdateStatus checks if pull request is possible to levaing checking status,
-// and set to be either conflict or mergeable.
-func (pr *PullRequest) checkAndUpdateStatus() {
- // Status is not changed to conflict means mergeable.
- if pr.Status == PULL_REQUEST_STATUS_CHECKING {
- pr.Status = PULL_REQUEST_STATUS_MERGEABLE
+// UpdatePatch generates and saves a new patch.
+func (pr *PullRequest) UpdatePatch() error {
+ if err := pr.GetHeadRepo(); err != nil {
+ return fmt.Errorf("GetHeadRepo: %v", err)
+ } else if pr.HeadRepo == nil {
+ log.Trace("PullRequest[%d].UpdatePatch: ignored cruppted data", pr.ID)
+ return nil
}
- // Make sure there is no waiting test to process before levaing the checking status.
- if !PullRequestQueue.Exist(pr.ID) {
- if err := pr.UpdateCols("status"); err != nil {
- log.Error(4, "Update[%d]: %v", pr.ID, err)
- }
+ if err := pr.GetBaseRepo(); err != nil {
+ return fmt.Errorf("GetBaseRepo: %v", err)
}
+
+ headRepoPath, err := pr.HeadRepo.RepoPath()
+ if err != nil {
+ return fmt.Errorf("HeadRepo.RepoPath: %v", err)
+ }
+
+ headGitRepo, err := git.OpenRepository(headRepoPath)
+ if err != nil {
+ return fmt.Errorf("OpenRepository: %v", err)
+ }
+
+ patch, err := headGitRepo.GetPatch(pr.MergeBase, pr.HeadBranch)
+ if err != nil {
+ return fmt.Errorf("GetPatch: %v", err)
+ }
+
+ if err = pr.BaseRepo.SavePatch(pr.Index, patch); err != nil {
+ return fmt.Errorf("BaseRepo.SavePatch: %v", err)
+ }
+
+ return nil
}
-// addToTaskQueue adds itself to pull request test task queue.
-func (pr *PullRequest) addToTaskQueue() {
+// AddToTaskQueue adds itself to pull request test task queue.
+func (pr *PullRequest) AddToTaskQueue() {
go PullRequestQueue.AddFunc(pr.ID, func() {
pr.Status = PULL_REQUEST_STATUS_CHECKING
if err := pr.UpdateCols("status"); err != nil {
- log.Error(5, "addToTaskQueue.UpdateCols[%d].(add to queue): %v", pr.ID, err)
+ log.Error(5, "AddToTaskQueue.UpdateCols[%d].(add to queue): %v", pr.ID, err)
}
})
}
@@ -402,44 +427,12 @@ func (pr *PullRequest) addToTaskQueue() {
func addHeadRepoTasks(prs []*PullRequest) {
for _, pr := range prs {
log.Trace("addHeadRepoTasks[%d]: composing new test task", pr.ID)
- if err := pr.GetHeadRepo(); err != nil {
- log.Error(4, "GetHeadRepo[%d]: %v", pr.ID, err)
- continue
- } else if pr.HeadRepo == nil {
- log.Trace("addHeadRepoTasks[%d]: ignored cruppted data", pr.ID)
+ if err := pr.UpdatePatch(); err != nil {
+ log.Error(4, "UpdatePatch: %v", err)
continue
}
- if err := pr.GetBaseRepo(); err != nil {
- log.Error(4, "GetBaseRepo[%d]: %v", pr.ID, err)
- continue
- }
-
- headRepoPath, err := pr.HeadRepo.RepoPath()
- if err != nil {
- log.Error(4, "HeadRepo.RepoPath[%d]: %v", pr.ID, err)
- continue
- }
-
- headGitRepo, err := git.OpenRepository(headRepoPath)
- if err != nil {
- log.Error(4, "OpenRepository[%d]: %v", pr.ID, err)
- continue
- }
-
- // Generate patch.
- patch, err := headGitRepo.GetPatch(pr.MergeBase, pr.HeadBranch)
- if err != nil {
- log.Error(4, "GetPatch[%d]: %v", pr.ID, err)
- continue
- }
-
- if err = pr.BaseRepo.SavePatch(pr.Index, patch); err != nil {
- log.Error(4, "BaseRepo.SavePatch[%d]: %v", pr.ID, err)
- continue
- }
-
- pr.addToTaskQueue()
+ pr.AddToTaskQueue()
}
}
@@ -461,7 +454,23 @@ func AddTestPullRequestTask(repoID int64, branch string) {
return
}
for _, pr := range prs {
- pr.addToTaskQueue()
+ pr.AddToTaskQueue()
+ }
+}
+
+// checkAndUpdateStatus checks if pull request is possible to levaing checking status,
+// and set to be either conflict or mergeable.
+func (pr *PullRequest) checkAndUpdateStatus() {
+ // Status is not changed to conflict means mergeable.
+ if pr.Status == PULL_REQUEST_STATUS_CHECKING {
+ pr.Status = PULL_REQUEST_STATUS_MERGEABLE
+ }
+
+ // Make sure there is no waiting test to process before levaing the checking status.
+ if !PullRequestQueue.Exist(pr.ID) {
+ if err := pr.UpdateCols("status"); err != nil {
+ log.Error(4, "Update[%d]: %v", pr.ID, err)
+ }
}
}
diff --git a/routers/repo/issue.go b/routers/repo/issue.go
index 166b369dc..30dcf9257 100644
--- a/routers/repo/issue.go
+++ b/routers/repo/issue.go
@@ -476,6 +476,11 @@ func ViewIssue(ctx *middleware.Context) {
}
if issue.IsPull {
+ if err = issue.GetPullRequest(); err != nil {
+ ctx.Handle(500, "GetPullRequest", err)
+ return
+ }
+
ctx.Data["PageIsPullList"] = true
ctx.Data["PageIsPullConversation"] = true
} else {
@@ -747,6 +752,12 @@ func NewComment(ctx *middleware.Context, form auth.CreateCommentForm) {
}
return
}
+ if issue.IsPull {
+ if err = issue.GetPullRequest(); err != nil {
+ ctx.Handle(500, "GetPullRequest", err)
+ return
+ }
+ }
var attachments []string
if setting.AttachmentEnabled {
@@ -766,6 +777,7 @@ func NewComment(ctx *middleware.Context, form auth.CreateCommentForm) {
(form.Status == "reopen" || form.Status == "close") &&
!(issue.IsPull && issue.HasMerged) {
+ // Duplication and conflict check should apply to reopen pull request.
var pr *models.PullRequest
if form.Status == "reopen" && issue.IsPull {
@@ -777,6 +789,16 @@ func NewComment(ctx *middleware.Context, form auth.CreateCommentForm) {
return
}
}
+
+ // Regenerate patch and test conflict.
+ if pr == nil {
+ if err = issue.UpdatePatch(); err != nil {
+ ctx.Handle(500, "UpdatePatch", err)
+ return
+ }
+
+ issue.AddToTaskQueue()
+ }
}
if pr != nil {
diff --git a/routers/repo/pull.go b/routers/repo/pull.go
index eade4407f..b69592411 100644
--- a/routers/repo/pull.go
+++ b/routers/repo/pull.go
@@ -149,7 +149,10 @@ func checkPullInfo(ctx *middleware.Context) *models.Issue {
if err = issue.GetPoster(); err != nil {
ctx.Handle(500, "GetPoster", err)
return nil
- } else if issue.GetHeadRepo(); err != nil {
+ } else if err = issue.GetPullRequest(); err != nil {
+ ctx.Handle(500, "GetPullRequest", err)
+ return nil
+ } else if err = issue.GetHeadRepo(); err != nil {
ctx.Handle(500, "GetHeadRepo", err)
return nil
}
diff --git a/templates/.VERSION b/templates/.VERSION
index b4080f5ea..1ab1a873d 100644
--- a/templates/.VERSION
+++ b/templates/.VERSION
@@ -1 +1 @@
-0.6.17.1024 Beta
\ No newline at end of file
+0.6.17.1025 Beta
\ No newline at end of file