diff --git a/README.md b/README.md index 8e4cc83312e..9d61d852dbb 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 471cc79aa61..a11627a0578 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 7e167d0bfb5..1f8cd7b5ffa 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 ba82fc74d51..a34ef731b99 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 705b360856c..039c5d4cb0c 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 1cefa42f5a7..077e945c373 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 7436511c910..7ef0901cc78 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) - 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) + if err := pr.UpdatePatch(); err != nil { + log.Error(4, "UpdatePatch: %v", 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 166b369dca4..30dcf925789 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 eade4407f76..b69592411b2 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 b4080f5ea32..1ab1a873d43 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