1
0
mirror of https://github.com/go-gitea/gitea synced 2024-12-24 03:35:55 +01:00

Merge branch 'dev' of https://github.com/gogits/gogs into dev

This commit is contained in:
Stefan-Code 2015-02-18 11:12:41 +01:00
commit b508fb041f
41 changed files with 126 additions and 165 deletions

@ -2,35 +2,34 @@
path = github.com/gogits/gogs path = github.com/gogits/gogs
[deps] [deps]
github.com/beego/memcache = commit:2aea774416 github.com/bradfitz/gomemcache = commit:72a68649ba
github.com/bradfitz/gomemcache =
github.com/Unknwon/cae = commit:2e70a1351b github.com/Unknwon/cae = commit:2e70a1351b
github.com/Unknwon/com = commit:d9bcf409c8 github.com/Unknwon/com = commit:188d690b1a
github.com/Unknwon/i18n = commit:1e88666229 github.com/Unknwon/i18n = commit:1e88666229
github.com/Unknwon/macaron = github.com/Unknwon/macaron = commit:e089393c3f
github.com/codegangsta/cli = commit:a14c5b47c7 github.com/codegangsta/cli = commit:6086d7927e
github.com/go-sql-driver/mysql = commit:04cf947760 github.com/go-sql-driver/mysql = commit:27633f0519
github.com/go-xorm/core = commit:e7882d8b00 github.com/go-xorm/core = commit:16cb27928f
github.com/go-xorm/xorm = commit:dcc529b68a github.com/go-xorm/xorm = commit:f2d3be988e
github.com/gogits/chardet = commit:2404f77725 github.com/gogits/chardet = commit:2404f77725
github.com/gogits/go-gogs-client = commit:92e76d616a github.com/gogits/go-gogs-client = commit:92e76d616a
github.com/lib/pq = commit:3e3efe51a0 github.com/lib/pq = commit:835d5eb08d
github.com/macaron-contrib/binding = commit:0fbe4b9707 github.com/macaron-contrib/binding = commit:dc739fabc3
github.com/macaron-contrib/cache = github.com/macaron-contrib/cache = commit:b68f6b448f
github.com/macaron-contrib/captcha = commit:3567dc48b8 github.com/macaron-contrib/captcha = commit:066c50c7eb
github.com/macaron-contrib/csrf = commit:3ea14e7ee7 github.com/macaron-contrib/csrf = commit:98ddf5a710
github.com/macaron-contrib/i18n = commit:0ee0539c84 github.com/macaron-contrib/i18n = commit:eeebd44f64
github.com/macaron-contrib/oauth2 = commit:8f394c3629 github.com/macaron-contrib/oauth2 = commit:8f394c3629
github.com/macaron-contrib/session = github.com/macaron-contrib/session = commit:8e8d938b27
github.com/macaron-contrib/toolbox = commit:57127bcc89 github.com/macaron-contrib/toolbox = commit:acbfe36e16
github.com/mattn/go-sqlite3 = commit:a80c27ba33 github.com/mattn/go-sqlite3 = commit:25d045f12a
github.com/microcosm-cc/bluemonday = github.com/microcosm-cc/bluemonday = commit:fcd0f5074e
github.com/nfnt/resize = commit:8f44931448 github.com/nfnt/resize = commit:8f44931448
github.com/russross/blackfriday = commit:05b8cefd6a github.com/russross/blackfriday = commit:77efab57b2
github.com/shurcooL/go = commit:48293cbc7a github.com/shurcooL/go = commit:329f57438c
golang.org/x/net = golang.org/x/net =
golang.org/x/text = golang.org/x/text =
gopkg.in/ini.v1 = commit:28ad8c408b gopkg.in/ini.v1 = commit:4febc4104c
gopkg.in/redis.v2 = commit:e617904962 gopkg.in/redis.v2 = commit:e617904962
[res] [res]

@ -13,3 +13,4 @@ script: go build -v
notifications: notifications:
email: email:
- u@gogs.io - u@gogs.io
slack: gophercn:o5pSanyTeNhnfYc3QnG0X7Wx

@ -2,20 +2,20 @@
> This guidelines sheet is forked from [CONTRIBUTING.md](https://github.com/drone/drone/blob/master/CONTRIBUTING.md). > This guidelines sheet is forked from [CONTRIBUTING.md](https://github.com/drone/drone/blob/master/CONTRIBUTING.md).
Gogs is not perfect and it has bugs, or incomplete features for rare cases. You're welcome to tell us or contribute some code. This document describes details about how can you contribute to Gogs project. Gogs is not perfect, and it has bugs or incomplete features in rare cases. You're welcome to tell us, or to contribute some code. This document describes details about how can you contribute to Gogs project.
## Contribution guidelines ## Contribution guidelines
Depends on the situation, you will: Depends on the situation, you will:
- Find bug, create an issue - Find a bug and create an issue
- Need more functionality, make a feature request - Need more functionality and make a feature request
- Want to contribute code, open a pull request - Want to contribute code and open a pull request
- Run into issue, need help - Run into issue and need help
### Bug Report ### Bug Report
If you find or consider something is a bug, please create a issue on [GitHub](https://github.com/gogits/gogs/issues). To reduce unnecessary time wasting of interacting and waiting with team members, please include following information in the first place with a comfortable form for you: If you find something you consider a bug, please create a issue on [GitHub](https://github.com/gogits/gogs/issues). To avoid wasting time and reduce back-and-forth communication with team members, please include at least the following information in a form comfortable for you:
- Bug Description - Bug Description
- Gogs Version - Gogs Version
@ -28,7 +28,7 @@ Please take a moment to check that an issue on [GitHub](https://github.com/gogit
#### Bug Report Example #### Bug Report Example
Gogs crashed when create repository with license, using v0.5.13.0207, SQLite3, Git 1.9.0, Ubuntu 12.04. Gogs crashed when creating a repository with a license, using v0.5.13.0207, SQLite3, Git 1.9.0, Ubuntu 12.04.
Error log: Error log:
@ -38,11 +38,11 @@ Error log:
### Feature Request ### Feature Request
There is no standard form of making a feature request, just try to describe the feature as clear as possible because team members may not have experience with the functionality you're talking about. There is no standard form of making a feature request. Just try to describe the feature as clearly as possible, because team members may not have experience with the functionality you're talking about.
### Pull Request ### Pull Request
Pull requests are always welcome, but note that **ALL PULL REQUESTS MUST SEND TO `DEV` BRANCH**. Pull requests are always welcome, but note that **ALL PULL REQUESTS MUST APPLY TO THE `DEV` BRANCH**.
We are always thrilled to receive pull requests, and do our best to process them as fast as possible. Not sure if that typo is worth a pull request? Do it! We will appreciate it. We are always thrilled to receive pull requests, and do our best to process them as fast as possible. Not sure if that typo is worth a pull request? Do it! We will appreciate it.
@ -52,7 +52,7 @@ We're trying very hard to keep Gogs lean and focused. We don't want it to do eve
### Ask For Help ### Ask For Help
Before open any new issue, please check your problem on [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md) and [FAQs](http://gogs.io/docs/intro/faqs.html) pages. Before opening a new issue, please check to make sure your problem isn't already addressed on the [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md) and [FAQs](http://gogs.io/docs/intro/faqs.html) pages.
## Things To Notice ## Things To Notice

@ -3,7 +3,7 @@ Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?bra
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gogits/gogs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gogits/gogs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
Gogs(Go Git Service) is a painless self-hosted Git Service written in Go. Gogs (Go Git Service) is a painless self-hosted Git service written in Go.
![Demo](http://gogs.qiniudn.com/gogs_demo.gif) ![Demo](http://gogs.qiniudn.com/gogs_demo.gif)
@ -12,9 +12,9 @@ Gogs(Go Git Service) is a painless self-hosted Git Service written in Go.
### NOTICES ### NOTICES
- Due to testing purpose, data of [try.gogs.io](https://try.gogs.io) has been reset in **Jan 28, 2015** and will reset multiple times after. Please do **NOT** put your important data on the site. - Due to testing purpose, data of [try.gogs.io](https://try.gogs.io) has been reset in **Jan 28, 2015** and will reset multiple times after. Please do **NOT** put your important data on the site.
- Demo site [try.gogs.io](https://try.gogs.io) is running under `dev` branch. - The demo site [try.gogs.io](https://try.gogs.io) is running under `dev` branch.
- You **MUST** read [CONTRIBUTING.md](CONTRIBUTING.md) before you start filing a issue or making a Pull Request. - You **MUST** read [CONTRIBUTING.md](CONTRIBUTING.md) before you start filing a issue or making a Pull Request.
- If you think there are vulnerabilities in the project, please talk private to **u@gogs.io**, thanks! - If you think there are vulnerabilities in the project, please talk privately to **u@gogs.io**. Thanks!
#### Other language version #### Other language version
@ -22,15 +22,15 @@ Gogs(Go Git Service) is a painless self-hosted Git Service written in Go.
## Purpose ## Purpose
The goal of this project is to make the easiest, fastest and most painless way to set up a self-hosted Git service. With Go, this can be done in independent binary distribution across **ALL platforms** that Go supports, including Linux, Mac OS X, and Windows. The goal of this project is to make the easiest, fastest, and most painless way to set up a self-hosted Git service. With Go, this can be done via an independent binary distribution across **ALL platforms** that Go supports, including Linux, Mac OS X, and Windows.
## Overview ## Overview
- Please see [Documentation](http://gogs.io/docs/intro/) for project design, known issues, and change log. - Please see the [Documentation](http://gogs.io/docs/intro/) for project design, known issues, and change log.
- See [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team. - See the [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team.
- Try it before anything? Do it [online](https://try.gogs.io/unknwon/gogs) or go down to **Installation -> Install from binary** section! - Want to try it before doing anything else? Do it [online](https://try.gogs.io/unknwon/gogs) or go down to the **Installation -> Install from binary** section!
- Having troubles? Get help from [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md). - Having trouble? Get help with [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md).
- Want to help on localization? Check out [Crowdin](https://crowdin.com/project/gogs)! - Want to help with localization? Check out [Crowdin](https://crowdin.com/project/gogs)!
## Features ## Features
@ -46,22 +46,22 @@ The goal of this project is to make the easiest, fastest and most painless way t
- Repository Git hooks - Repository Git hooks
- Add/remove repository collaborators - Add/remove repository collaborators
- Gravatar and cache support - Gravatar and cache support
- Mail service(register, issue) - Mail service (register, issue)
- Administration panel - Administration panel
- Slack webhook integration - Slack webhook integration
- Drone CI integration - Drone CI integration
- Supports MySQL, PostgreSQL and SQLite3 - Supports MySQL, PostgreSQL and SQLite3
- Social account login(GitHub, Google, QQ, Weibo) - Social account login (GitHub, Google, QQ, Weibo)
- Multi-language support([10 languages](https://crowdin.com/project/gogs)) - Multi-language support ([10 languages](https://crowdin.com/project/gogs))
## System Requirements ## System Requirements
- A cheap Raspberry Pi is powerful enough to match the minimal requirement. - A cheap Raspberry Pi is powerful enough for basic functionality.
- 4 CPU Cores and 1GB RAM would be the baseline for teamwork. - At least 4 CPU cores and 1GB RAM would be the baseline for teamwork.
## Installation ## Installation
Make sure you install [Prerequirements](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: There are 5 ways to install Gogs:

@ -166,12 +166,11 @@ func newMacaron() *macaron.Macaron {
} }
func runWeb(ctx *cli.Context) { func runWeb(ctx *cli.Context) {
checkVersion()
if ctx.IsSet("config") { if ctx.IsSet("config") {
setting.CustomConf = ctx.String("config") setting.CustomConf = ctx.String("config")
} }
routers.GlobalInit() routers.GlobalInit()
checkVersion()
m := newMacaron() m := newMacaron()

@ -90,7 +90,7 @@ TASK_INTERVAL = 1
; Deliver timeout in seconds ; Deliver timeout in seconds
DELIVER_TIMEOUT = 5 DELIVER_TIMEOUT = 5
; Allow insecure certification ; Allow insecure certification
ALLOW_INSECURE_CERTIFICATION = false SKIP_TLS_VERIFY = false
[mailer] [mailer]
ENABLED = false ENABLED = false

@ -647,6 +647,7 @@ config.reset_password_code_lives=Passwortcode Lebensdauer
config.webhook_config=Webhook-Einstellungen config.webhook_config=Webhook-Einstellungen
config.task_interval=Task-Intervall config.task_interval=Task-Intervall
config.deliver_timeout=Zeitlimit für Zustellung config.deliver_timeout=Zeitlimit für Zustellung
config.skip_tls_verify=Skip TLS Verify
config.mailer_config=Mailer-Einstellungen config.mailer_config=Mailer-Einstellungen
config.mailer_enabled=Aktiviert config.mailer_enabled=Aktiviert
config.mailer_name=Name config.mailer_name=Name

@ -281,8 +281,6 @@ init_readme = Initialize this repository with a README.md
create_repo = Create Repository create_repo = Create Repository
default_branch = Default Branch default_branch = Default Branch
mirror_interval = Mirror Interval (hour) mirror_interval = Mirror Interval (hour)
goget_meta = Go-Get Meta
goget_meta_helper = This repository will be <span class="label label-blue label-radius">Go-Getable</span>
need_auth = Need Authorization need_auth = Need Authorization
migrate_type = Migration Type migrate_type = Migration Type
@ -647,7 +645,7 @@ config.reset_password_code_lives = Reset Password Code Lives
config.webhook_config = Webhook Configuration config.webhook_config = Webhook Configuration
config.task_interval = Task Interval config.task_interval = Task Interval
config.deliver_timeout = Deliver Timeout config.deliver_timeout = Deliver Timeout
config.allow_insecure_certification = Allow Insecure Certification config.skip_tls_verify = Skip TLS Verify
config.mailer_config = Mailer Configuration config.mailer_config = Mailer Configuration
config.mailer_enabled = Enabled config.mailer_enabled = Enabled
config.mailer_name = Name config.mailer_name = Name

@ -647,6 +647,7 @@ config.reset_password_code_lives=Reset Password Code Lives
config.webhook_config=Webhook Configuration config.webhook_config=Webhook Configuration
config.task_interval=Task Interval config.task_interval=Task Interval
config.deliver_timeout=Deliver Timeout config.deliver_timeout=Deliver Timeout
config.skip_tls_verify=Skip TLS Verify
config.mailer_config=Mailer Configuration config.mailer_config=Mailer Configuration
config.mailer_enabled=Enabled config.mailer_enabled=Enabled
config.mailer_name=Name config.mailer_name=Name

@ -647,6 +647,7 @@ config.reset_password_code_lives=Réinitialiser le Mot De Passe des Limites de C
config.webhook_config=Configuration Webhook config.webhook_config=Configuration Webhook
config.task_interval=Intervalles de Tâches config.task_interval=Intervalles de Tâches
config.deliver_timeout=Expiration d'Envoi config.deliver_timeout=Expiration d'Envoi
config.skip_tls_verify=Skip TLS Verify
config.mailer_config=Configuration du Maileur config.mailer_config=Configuration du Maileur
config.mailer_enabled=Activé config.mailer_enabled=Activé
config.mailer_name=Nom config.mailer_name=Nom

@ -647,6 +647,7 @@ config.reset_password_code_lives=パスワードリンクの有効期限をリ
config.webhook_config=Webhook設定 config.webhook_config=Webhook設定
config.task_interval=タスクの間隔 config.task_interval=タスクの間隔
config.deliver_timeout=送信タイムアウト config.deliver_timeout=送信タイムアウト
config.skip_tls_verify=TLSの確認を省略
config.mailer_config=メーラーの構成 config.mailer_config=メーラーの構成
config.mailer_enabled=有効にした config.mailer_enabled=有効にした
config.mailer_name=名前 config.mailer_name=名前

@ -647,6 +647,7 @@ config.reset_password_code_lives=Paroles atiestatīšanas koda ilgums
config.webhook_config=Tīkla āķu konfigurācija config.webhook_config=Tīkla āķu konfigurācija
config.task_interval=Uzdevuma intervāls config.task_interval=Uzdevuma intervāls
config.deliver_timeout=Piegādes noildze config.deliver_timeout=Piegādes noildze
config.skip_tls_verify=Skip TLS Verify
config.mailer_config=Sūtītāja konfigurācija config.mailer_config=Sūtītāja konfigurācija
config.mailer_enabled=Iespējots config.mailer_enabled=Iespējots
config.mailer_name=Nosaukums config.mailer_name=Nosaukums

@ -516,8 +516,8 @@ dashboard.git_gc_repos=Garbage collectie uitvoeren
dashboard.git_gc_repos_success=Garbage collectie met succes uitgevoerd. dashboard.git_gc_repos_success=Garbage collectie met succes uitgevoerd.
dashboard.resync_all_sshkeys=Herschrijf '.ssh/authorized_keys' (Let op: alle sleutels die niet van Gogs zijn zullen verloren gaan!) dashboard.resync_all_sshkeys=Herschrijf '.ssh/authorized_keys' (Let op: alle sleutels die niet van Gogs zijn zullen verloren gaan!)
dashboard.resync_all_sshkeys_success=Alle publieke sleutels zijn herschreven. dashboard.resync_all_sshkeys_success=Alle publieke sleutels zijn herschreven.
dashboard.resync_all_update_hooks=Rewrite all update hook of repositories (needed when custom config path is changed) dashboard.resync_all_update_hooks=Herschrijf alle repositorie-hooks (nodig als de configuratie bestandslocatie is gewijzigd)
dashboard.resync_all_update_hooks_success=All repositories' update hook have been rewritten successfully. dashboard.resync_all_update_hooks_success=Alle repositorie-hooks zijn herschreven.
dashboard.server_uptime=Uptime server dashboard.server_uptime=Uptime server
dashboard.current_goroutine=Huidige Goroutines dashboard.current_goroutine=Huidige Goroutines
@ -647,6 +647,7 @@ config.reset_password_code_lives=Reset wachtwoord Code leven
config.webhook_config=Webhook configuratie config.webhook_config=Webhook configuratie
config.task_interval=Taakinterval config.task_interval=Taakinterval
config.deliver_timeout=Bezorging verlooptijd config.deliver_timeout=Bezorging verlooptijd
config.skip_tls_verify=TLS certificaat controle overslaan
config.mailer_config=Mailerconfiguatie config.mailer_config=Mailerconfiguatie
config.mailer_enabled=Ingeschakeld config.mailer_enabled=Ingeschakeld
config.mailer_name=Naam config.mailer_name=Naam

@ -58,11 +58,11 @@ repo_path_helper=Всех удаленные репозитории Git буде
run_user=Пользователь run_user=Пользователь
run_user_helper=У пользователя должен быть доступ к пути к корню репозитория и к запуску Gogs. run_user_helper=У пользователя должен быть доступ к пути к корню репозитория и к запуску Gogs.
domain=Домен domain=Домен
domain_helper=This affects SSH clone URLs. domain_helper=Влияет на URL-адреса для клонирования по SSH.
http_port=HTTP Port http_port=Порт HTTP
http_port_helper=Port number which application will listen on. http_port_helper=Номер порта, который приложение будет слушать.
app_url=URL приложения app_url=URL приложения
app_url_helper=This affects HTTP/HTTPS clone URL and somewhere in e-mail. app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на адреса в электронной почте.
email_title=Настройки службы электронной почты (опционально) email_title=Настройки службы электронной почты (опционально)
smtp_host=Узел SMTP smtp_host=Узел SMTP
mailer_user=Электронная почта отправителя mailer_user=Электронная почта отправителя
@ -80,7 +80,7 @@ test_git_failed=Не удалось проверить 'git' команду: %v
sqlite3_not_available=Ваша версия не поддерживает SQLite3, пожалуйста скачайте официальную бинарную версию от %s, а не версию gobuild. sqlite3_not_available=Ваша версия не поддерживает SQLite3, пожалуйста скачайте официальную бинарную версию от %s, а не версию gobuild.
invalid_db_setting=Настройки базы данных не правильные: %v invalid_db_setting=Настройки базы данных не правильные: %v
invalid_repo_path=Недопустимый путь к корню репозитория: %v invalid_repo_path=Недопустимый путь к корню репозитория: %v
run_user_not_match=Run user isn't the current user: %s -> %s run_user_not_match=Текущий пользователь не является пользователем для запуска: %s -> %s
save_config_failed=Не удалось сохранить конфигурацию: %v save_config_failed=Не удалось сохранить конфигурацию: %v
invalid_admin_setting=Указан недопустимый параметр учетной записи администратора: %v invalid_admin_setting=Указан недопустимый параметр учетной записи администратора: %v
install_success=Добро пожаловать! Мы рады, что вы выбрали Gogs. Веселитесь и берегите себя. install_success=Добро пожаловать! Мы рады, что вы выбрали Gogs. Веселитесь и берегите себя.
@ -88,7 +88,7 @@ install_success=Добро пожаловать! Мы рады, что вы вы
[home] [home]
uname_holder=Имя пользователь или E-mail uname_holder=Имя пользователь или E-mail
password_holder=Пароль password_holder=Пароль
switch_dashboard_context=Switch Dashboard Context switch_dashboard_context=Переключить контекст панели управления
my_repos=Мои репозитории my_repos=Мои репозитории
collaborative_repos=Совместные репозитории collaborative_repos=Совместные репозитории
my_orgs=Моя Организация my_orgs=Моя Организация
@ -280,9 +280,9 @@ license_helper=Выберите файл лицензии
init_readme=Создать репозиторий с файлом README.md init_readme=Создать репозиторий с файлом README.md
create_repo=Создание репозитория create_repo=Создание репозитория
default_branch=Ветка по умолчанию default_branch=Ветка по умолчанию
mirror_interval=Mirror Interval (hour) mirror_interval=Интервал зеркалирования (час)
goget_meta=Go-Get Meta goget_meta=Meta-тег для go get
goget_meta_helper=This repository will be <span class="label label-blue label-radius">Go-Getable</span> goget_meta_helper=Репозиторий будет доступен для <span class="label label-blue label-radius">go get</span>
need_auth=Требуется авторизация need_auth=Требуется авторизация
migrate_type=Тип миграции migrate_type=Тип миграции
@ -647,6 +647,7 @@ config.reset_password_code_lives=Reset Password Code Lives
config.webhook_config=Настройка автоматического обновления репозиции config.webhook_config=Настройка автоматического обновления репозиции
config.task_interval=Интервал задания config.task_interval=Интервал задания
config.deliver_timeout=Задержка доставки config.deliver_timeout=Задержка доставки
config.skip_tls_verify=Skip TLS Verify
config.mailer_config=Настройки почты config.mailer_config=Настройки почты
config.mailer_enabled=Включено config.mailer_enabled=Включено
config.mailer_name=Имя config.mailer_name=Имя

@ -647,6 +647,7 @@ config.reset_password_code_lives=重置密码链接有效期
config.webhook_config=Web 钩子配置 config.webhook_config=Web 钩子配置
config.task_interval=任务周期 config.task_interval=任务周期
config.deliver_timeout=推送超时 config.deliver_timeout=推送超时
config.skip_tls_verify=忽略 TLS 验证
config.mailer_config=邮件配置 config.mailer_config=邮件配置
config.mailer_enabled=启用服务 config.mailer_enabled=启用服务
config.mailer_name=发送者名称 config.mailer_name=发送者名称

@ -647,6 +647,7 @@ config.reset_password_code_lives=重置密碼連結有效期
config.webhook_config=Web 鉤子配置 config.webhook_config=Web 鉤子配置
config.task_interval=任務周期 config.task_interval=任務周期
config.deliver_timeout=推送超時 config.deliver_timeout=推送超時
config.skip_tls_verify=Skip TLS Verify
config.mailer_config=郵件配置 config.mailer_config=郵件配置
config.mailer_enabled=啟用服務 config.mailer_enabled=啟用服務
config.mailer_name=發送者名稱 config.mailer_name=發送者名稱

@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
) )
const APP_VER = "0.5.13.0210 Beta" const APP_VER = "0.5.13.0214 Beta"
func init() { func init() {
runtime.GOMAXPROCS(runtime.NumCPU()) runtime.GOMAXPROCS(runtime.NumCPU())

@ -15,7 +15,7 @@ import (
"github.com/go-xorm/xorm" "github.com/go-xorm/xorm"
_ "github.com/lib/pq" _ "github.com/lib/pq"
"github.com/gogits/gogs/models/migrations" // "github.com/gogits/gogs/models/migrations"
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
) )
@ -121,7 +121,7 @@ func SetEngine() (err error) {
if err != nil { if err != nil {
return fmt.Errorf("models.init(fail to create xorm.log): %v", err) return fmt.Errorf("models.init(fail to create xorm.log): %v", err)
} }
x.Logger = xorm.NewSimpleLogger(f) x.SetLogger(xorm.NewSimpleLogger(f))
x.ShowSQL = true x.ShowSQL = true
x.ShowInfo = true x.ShowInfo = true
@ -136,9 +136,9 @@ func NewEngine() (err error) {
return err return err
} }
if err = migrations.Migrate(x); err != nil { // if err = migrations.Migrate(x); err != nil {
return err // return err
} // }
if err = x.StoreEngine("InnoDB").Sync2(tables...); err != nil { if err = x.StoreEngine("InnoDB").Sync2(tables...); err != nil {
return fmt.Errorf("sync database struct error: %v\n", err) return fmt.Errorf("sync database struct error: %v\n", err)

@ -154,7 +154,6 @@ type Repository struct {
IsPrivate bool IsPrivate bool
IsBare bool IsBare bool
IsGoget bool
IsMirror bool IsMirror bool
*Mirror `xorm:"-"` *Mirror `xorm:"-"`

@ -315,7 +315,7 @@ func DeliverHooks() {
req := httplib.Post(t.Url).SetTimeout(timeout, timeout). req := httplib.Post(t.Url).SetTimeout(timeout, timeout).
Header("X-Gogs-Delivery", t.Uuid). Header("X-Gogs-Delivery", t.Uuid).
Header("X-Gogs-Event", string(t.EventType)). Header("X-Gogs-Event", string(t.EventType)).
SetTLSClientConfig(&tls.Config{InsecureSkipVerify: setting.Webhook.AllowInsecureCertification}) SetTLSClientConfig(&tls.Config{InsecureSkipVerify: setting.Webhook.SkipTLSVerify})
switch t.ContentType { switch t.ContentType {
case JSON: case JSON:

@ -52,7 +52,6 @@ type RepoSettingForm struct {
Branch string `form:"branch"` Branch string `form:"branch"`
Interval int `form:"interval"` Interval int `form:"interval"`
Private bool `form:"private"` Private bool `form:"private"`
GoGet bool `form:"goget"`
} }
func (f *RepoSettingForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { func (f *RepoSettingForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {

@ -126,8 +126,13 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{
return a + b return a + b
}, },
"ActionIcon": ActionIcon, "ActionIcon": ActionIcon,
"DateFormat": DateFormat, "DateFmtLong": func(t time.Time) string {
"List": List, return t.Format(time.RFC1123Z)
},
"DateFmtShort": func(t time.Time) string {
return t.Format("Jan 02, 2006")
},
"List": List,
"Mail2Domain": func(mail string) string { "Mail2Domain": func(mail string) string {
if !strings.Contains(mail, "@") { if !strings.Contains(mail, "@") {
return "try.gogs.io" return "try.gogs.io"

@ -126,7 +126,7 @@ func VerifyTimeLimitCode(data string, minutes int, code string) bool {
retCode := CreateTimeLimitCode(data, minutes, start) retCode := CreateTimeLimitCode(data, minutes, start)
if retCode == code && minutes > 0 { if retCode == code && minutes > 0 {
// check time is expired or not // check time is expired or not
before, _ := DateParse(start, "YmdHi") before, _ := time.ParseInLocation("200601021504", start, time.Local)
now := time.Now() now := time.Now()
if before.Add(time.Minute*time.Duration(minutes)).Unix() > now.Unix() { if before.Add(time.Minute*time.Duration(minutes)).Unix() > now.Unix() {
return true return true
@ -141,7 +141,7 @@ const TimeLimitCodeLength = 12 + 6 + 40
// create a time limit code // create a time limit code
// code format: 12 length date time string + 6 minutes string + 40 sha1 encoded string // code format: 12 length date time string + 6 minutes string + 40 sha1 encoded string
func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string { func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string {
format := "YmdHi" format := "200601021504"
var start, end time.Time var start, end time.Time
var startStr, endStr string var startStr, endStr string
@ -149,16 +149,16 @@ func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string
if startInf == nil { if startInf == nil {
// Use now time create code // Use now time create code
start = time.Now() start = time.Now()
startStr = DateFormat(start, format) startStr = start.Format(format)
} else { } else {
// use start string create code // use start string create code
startStr = startInf.(string) startStr = startInf.(string)
start, _ = DateParse(startStr, format) start, _ = time.ParseInLocation(format, startStr, time.Local)
startStr = DateFormat(start, format) startStr = start.Format(format)
} }
end = start.Add(time.Minute * time.Duration(minutes)) end = start.Add(time.Minute * time.Duration(minutes))
endStr = DateFormat(end, format) endStr = end.Format(format)
// create sha1 encode string // create sha1 encode string
sh := sha1.New() sh := sha1.New()
@ -420,58 +420,3 @@ func Subtract(left interface{}, right interface{}) interface{} {
return fleft + float64(rleft) - (fright + float64(rright)) return fleft + float64(rleft) - (fright + float64(rright))
} }
} }
// DateFormat pattern rules.
var datePatterns = []string{
// year
"Y", "2006", // A full numeric representation of a year, 4 digits Examples: 1999 or 2003
"y", "06", //A two digit representation of a year Examples: 99 or 03
// month
"m", "01", // Numeric representation of a month, with leading zeros 01 through 12
"n", "1", // Numeric representation of a month, without leading zeros 1 through 12
"M", "Jan", // A short textual representation of a month, three letters Jan through Dec
"F", "January", // A full textual representation of a month, such as January or March January through December
// day
"d", "02", // Day of the month, 2 digits with leading zeros 01 to 31
"j", "2", // Day of the month without leading zeros 1 to 31
// week
"D", "Mon", // A textual representation of a day, three letters Mon through Sun
"l", "Monday", // A full textual representation of the day of the week Sunday through Saturday
// time
"g", "3", // 12-hour format of an hour without leading zeros 1 through 12
"G", "15", // 24-hour format of an hour without leading zeros 0 through 23
"h", "03", // 12-hour format of an hour with leading zeros 01 through 12
"H", "15", // 24-hour format of an hour with leading zeros 00 through 23
"a", "pm", // Lowercase Ante meridiem and Post meridiem am or pm
"A", "PM", // Uppercase Ante meridiem and Post meridiem AM or PM
"i", "04", // Minutes with leading zeros 00 to 59
"s", "05", // Seconds, with leading zeros 00 through 59
// time zone
"T", "MST",
"P", "-07:00",
"O", "-0700",
// RFC 2822
"r", time.RFC1123Z,
}
// Parse Date use PHP time format.
func DateParse(dateString, format string) (time.Time, error) {
replacer := strings.NewReplacer(datePatterns...)
format = replacer.Replace(format)
return time.ParseInLocation(format, dateString, time.Local)
}
// Date takes a PHP like date func to Go's time format.
func DateFormat(t time.Time, format string) string {
replacer := strings.NewReplacer(datePatterns...)
format = replacer.Replace(format)
return t.Format(format)
}

@ -394,8 +394,7 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
} }
ctx.Data["CloneLink"] = ctx.Repo.CloneLink ctx.Data["CloneLink"] = ctx.Repo.CloneLink
if ctx.Repo.Repository.IsGoget { if ctx.Query("go-get") == "1" {
ctx.Data["GoGetLink"] = fmt.Sprintf("%s%s/%s", setting.AppUrl, u.LowerName, repo.LowerName)
ctx.Data["GoGetImport"] = fmt.Sprintf("%s/%s/%s", setting.Domain, u.LowerName, repo.LowerName) ctx.Data["GoGetImport"] = fmt.Sprintf("%s/%s/%s", setting.Domain, u.LowerName, repo.LowerName)
} }

@ -69,9 +69,9 @@ var (
// Webhook settings. // Webhook settings.
Webhook struct { Webhook struct {
TaskInterval int TaskInterval int
DeliverTimeout int DeliverTimeout int
AllowInsecureCertification bool SkipTLSVerify bool
} }
// Repository settings. // Repository settings.
@ -240,7 +240,10 @@ func NewConfigContext() {
ReverseProxyAuthUser = sec.Key("REVERSE_PROXY_AUTHENTICATION_USER").MustString("X-WEBAUTH-USER") ReverseProxyAuthUser = sec.Key("REVERSE_PROXY_AUTHENTICATION_USER").MustString("X-WEBAUTH-USER")
sec = Cfg.Section("attachment") sec = Cfg.Section("attachment")
AttachmentPath = path.Join(workDir, sec.Key("PATH").MustString("data/attachments")) AttachmentPath = sec.Key("PATH").MustString("data/attachments")
if !filepath.IsAbs(AttachmentPath) {
AttachmentPath = path.Join(workDir, AttachmentPath)
}
AttachmentAllowedTypes = sec.Key("ALLOWED_TYPES").MustString("image/jpeg|image/png") AttachmentAllowedTypes = sec.Key("ALLOWED_TYPES").MustString("image/jpeg|image/png")
AttachmentMaxSize = sec.Key("MAX_SIZE").MustInt64(32) AttachmentMaxSize = sec.Key("MAX_SIZE").MustInt64(32)
AttachmentMaxFiles = sec.Key("MAX_FILES").MustInt(10) AttachmentMaxFiles = sec.Key("MAX_FILES").MustInt(10)
@ -297,7 +300,10 @@ func NewConfigContext() {
sec = Cfg.Section("picture") sec = Cfg.Section("picture")
PictureService = sec.Key("SERVICE").In("server", []string{"server"}) PictureService = sec.Key("SERVICE").In("server", []string{"server"})
AvatarUploadPath = path.Join(workDir, sec.Key("AVATAR_UPLOAD_PATH").MustString("data/avatars")) AvatarUploadPath = sec.Key("AVATAR_UPLOAD_PATH").MustString("data/avatars")
if !filepath.IsAbs(AvatarUploadPath) {
AvatarUploadPath = path.Join(workDir, AvatarUploadPath)
}
os.MkdirAll(AvatarUploadPath, os.ModePerm) os.MkdirAll(AvatarUploadPath, os.ModePerm)
switch sec.Key("GRAVATAR_SOURCE").MustString("gravatar") { switch sec.Key("GRAVATAR_SOURCE").MustString("gravatar") {
case "duoshuo": case "duoshuo":
@ -514,7 +520,7 @@ func newWebhookService() {
sec := Cfg.Section("webhook") sec := Cfg.Section("webhook")
Webhook.TaskInterval = sec.Key("TASK_INTERVAL").MustInt(1) Webhook.TaskInterval = sec.Key("TASK_INTERVAL").MustInt(1)
Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5) Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5)
Webhook.AllowInsecureCertification = sec.Key("ALLOW_INSECURE_CERTIFICATION").MustBool() Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool()
} }
func NewServices() { func NewServices() {

@ -189,6 +189,12 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
// Save settings. // Save settings.
cfg := ini.Empty() cfg := ini.Empty()
if com.IsFile(setting.CustomConf) {
// Keeps custom settings if there is already something.
if err := cfg.Append(setting.CustomConf); err != nil {
log.Error(4, "Fail to load custom conf '%s': %v", setting.CustomConf, err)
}
}
cfg.Section("database").Key("DB_TYPE").SetValue(models.DbCfg.Type) cfg.Section("database").Key("DB_TYPE").SetValue(models.DbCfg.Type)
cfg.Section("database").Key("HOST").SetValue(models.DbCfg.Host) cfg.Section("database").Key("HOST").SetValue(models.DbCfg.Host)
cfg.Section("database").Key("NAME").SetValue(models.DbCfg.Name) cfg.Section("database").Key("NAME").SetValue(models.DbCfg.Name)

@ -8,9 +8,9 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"path"
"strings" "strings"
"time" "time"
"path"
"github.com/Unknwon/com" "github.com/Unknwon/com"
@ -84,7 +84,6 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
ctx.Repo.Repository.Description = form.Description ctx.Repo.Repository.Description = form.Description
ctx.Repo.Repository.Website = form.Website ctx.Repo.Repository.Website = form.Website
ctx.Repo.Repository.IsPrivate = form.Private ctx.Repo.Repository.IsPrivate = form.Private
ctx.Repo.Repository.IsGoget = form.GoGet
if err := models.UpdateRepository(ctx.Repo.Repository); err != nil { if err := models.UpdateRepository(ctx.Repo.Repository); err != nil {
ctx.Handle(404, "UpdateRepository", err) ctx.Handle(404, "UpdateRepository", err)
return return

@ -1 +1 @@
0.5.13.0210 Beta 0.5.13.0214 Beta

@ -34,8 +34,8 @@
<td><a href="{{AppSubUrl}}/admin/auths/{{.Id}}">{{.Name}}</a></td> <td><a href="{{AppSubUrl}}/admin/auths/{{.Id}}">{{.Name}}</a></td>
<td>{{.TypeString}}</td> <td>{{.TypeString}}</td>
<td><i class="fa fa{{if .IsActived}}-check{{end}}-square-o"></i></td> <td><i class="fa fa{{if .IsActived}}-check{{end}}-square-o"></i></td>
<td><span title="{{DateFormat .Updated "r"}}">{{DateFormat .Updated "M d, Y"}}</span></td> <td><span title="{{DateFmtLong .Updated}}">{{DateFmtShort .Updated}}</span></td>
<td><span title="{{DateFormat .Created "r"}}">{{DateFormat .Created "M d, Y"}}</span></td> <td><span title="{{DateFmtLong .Created}}">{{DateFmtShort .Created}}</span></td>
<td><a href="{{AppSubUrl}}/admin/auths/{{.Id}}"><i class="fa fa-pencil-square-o"></i></a></td> <td><a href="{{AppSubUrl}}/admin/auths/{{.Id}}"><i class="fa fa-pencil-square-o"></i></a></td>
</tr> </tr>
{{end}} {{end}}

@ -105,8 +105,8 @@
<dd>{{.Webhook.TaskInterval}} {{.i18n.Tr "tool.raw_minutes"}}</dd> <dd>{{.Webhook.TaskInterval}} {{.i18n.Tr "tool.raw_minutes"}}</dd>
<dt>{{.i18n.Tr "admin.config.deliver_timeout"}}</dt> <dt>{{.i18n.Tr "admin.config.deliver_timeout"}}</dt>
<dd>{{.Webhook.DeliverTimeout}} {{.i18n.Tr "tool.raw_seconds"}}</dd> <dd>{{.Webhook.DeliverTimeout}} {{.i18n.Tr "tool.raw_seconds"}}</dd>
<dt>{{.i18n.Tr "admin.config.allow_insecure_certification"}}</dt> <dt>{{.i18n.Tr "admin.config.skip_tls_verify"}}</dt>
<dd><i class="fa fa{{if .Webhook.AllowInsecureCertification}}-check{{end}}-square-o"></i></dd> <dd><i class="fa fa{{if .Webhook.SkipTLSVerify}}-check{{end}}-square-o"></i></dd>
</dl> </dl>
</div> </div>
</div> </div>

@ -35,7 +35,7 @@
<td>{{.NumTeams}}</td> <td>{{.NumTeams}}</td>
<td>{{.NumMembers}}</td> <td>{{.NumMembers}}</td>
<td>{{.NumRepos}}</td> <td>{{.NumRepos}}</td>
<td><span title="{{DateFormat .Created "r"}}">{{DateFormat .Created "M d, Y"}}</span></td> <td><span title="{{DateFmtLong .Created}}">{{DateFmtShort .Created}}</span></td>
</tr> </tr>
{{end}} {{end}}
</tbody> </tbody>

@ -37,7 +37,7 @@
<td>{{.NumWatches}}</td> <td>{{.NumWatches}}</td>
<td>{{.NumStars}}</td> <td>{{.NumStars}}</td>
<td>{{.NumIssues}}</td> <td>{{.NumIssues}}</td>
<td><span title="{{DateFormat .Created "r"}}">{{DateFormat .Created "M d, Y"}}</span></td> <td><span title="{{DateFmtLong .Created}}">{{DateFmtShort .Created}}</span></td>
</tr> </tr>
{{end}} {{end}}
</tbody> </tbody>

@ -37,7 +37,7 @@
<td><i class="fa fa{{if .IsActive}}-check{{end}}-square-o"></i></td> <td><i class="fa fa{{if .IsActive}}-check{{end}}-square-o"></i></td>
<td><i class="fa fa{{if .IsAdmin}}-check{{end}}-square-o"></i></td> <td><i class="fa fa{{if .IsAdmin}}-check{{end}}-square-o"></i></td>
<td>{{.NumRepos}}</td> <td>{{.NumRepos}}</td>
<td><span title="{{DateFormat .Created "r"}}">{{DateFormat .Created "M d, Y"}}</span></td> <td><span title="{{DateFmtLong .Created}}">{{DateFmtShort .Created }}</span></td>
<td><a href="{{AppSubUrl}}/admin/users/{{.Id}}"><i class="fa fa-pencil-square-o"></i></a></td> <td><a href="{{AppSubUrl}}/admin/users/{{.Id}}"><i class="fa fa-pencil-square-o"></i></a></td>
</tr> </tr>
{{end}} {{end}}

@ -9,7 +9,7 @@
<meta name="description" content="Gogs(Go Git Service) is a GitHub-like clone in the Go Programming Language" /> <meta name="description" content="Gogs(Go Git Service) is a GitHub-like clone in the Go Programming Language" />
<meta name="keywords" content="go, git"> <meta name="keywords" content="go, git">
<meta name="_csrf" content="{{.CsrfToken}}" /> <meta name="_csrf" content="{{.CsrfToken}}" />
{{if .Repository.IsGoget}}<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">{{end}} {{if .GoGetImport}}<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">{{end}}
<!-- Stylesheets --> <!-- Stylesheets -->
{{if CdnMode}} {{if CdnMode}}

@ -7,7 +7,7 @@
<meta name="description" content="Gogs(Go Git Service) a painless self-hosted Git Service written in Go" /> <meta name="description" content="Gogs(Go Git Service) a painless self-hosted Git Service written in Go" />
<meta name="keywords" content="go, git, self-hosted, gogs"> <meta name="keywords" content="go, git, self-hosted, gogs">
<meta name="_csrf" content="{{.CsrfToken}}" /> <meta name="_csrf" content="{{.CsrfToken}}" />
{{if .Repository.IsGoget}}<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">{{end}} {{if .GoGetImport}}<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">{{end}}
<link rel="shortcut icon" href="{{AppSubUrl}}/img/favicon.png" /> <link rel="shortcut icon" href="{{AppSubUrl}}/img/favicon.png" />

@ -59,11 +59,6 @@
<input class="ipt-chk" id="visibility" name="private" type="checkbox" {{if .Repository.IsPrivate}}checked{{end}} /> <input class="ipt-chk" id="visibility" name="private" type="checkbox" {{if .Repository.IsPrivate}}checked{{end}} />
<span>{{.i18n.Tr "repo.visiblity_helper" | Str2html}}</span> <span>{{.i18n.Tr "repo.visiblity_helper" | Str2html}}</span>
</div> </div>
<div class="field">
<label for="goget">{{.i18n.Tr "repo.goget_meta"}}</label>
<input class="ipt-chk" id="goget" name="goget" type="checkbox" {{if .Repository.IsGoget}}checked{{end}} />
<span>{{.i18n.Tr "repo.goget_meta_helper" | Str2html}}</span>
</div>
<div class="field"> <div class="field">
<span class="form-label"></span> <span class="form-label"></span>
<button class="btn btn-green btn-large btn-radius" id="change-reponame-btn" href="#change-reponame-modal">{{.i18n.Tr "repo.settings.update_settings"}}</button> <button class="btn btn-green btn-large btn-radius" id="change-reponame-btn" href="#change-reponame-modal">{{.i18n.Tr "repo.settings.update_settings"}}</button>

@ -26,10 +26,12 @@
<button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "sign_in"}}</button>&nbsp;&nbsp;&nbsp;&nbsp; <button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "sign_in"}}</button>&nbsp;&nbsp;&nbsp;&nbsp;
{{if not .IsSocialLogin}}<a href="{{AppSubUrl}}/user/forget_password">{{.i18n.Tr "auth.forget_password"}}</a>{{end}} {{if not .IsSocialLogin}}<a href="{{AppSubUrl}}/user/forget_password">{{.i18n.Tr "auth.forget_password"}}</a>{{end}}
</div> </div>
{{if .ShowRegistrationButton}}
<div class="field"> <div class="field">
<label></label> <label></label>
<a href="{{AppSubUrl}}/user/sign_up">{{.i18n.Tr "auth.sign_up_now" | Str2html}}</a> <a href="{{AppSubUrl}}/user/sign_up">{{.i18n.Tr "auth.sign_up_now" | Str2html}}</a>
</div> </div>
{{end}}
{{if and (not .IsSocialLogin) .OauthEnabled}} {{if and (not .IsSocialLogin) .OauthEnabled}}
<hr/> <hr/>
<div id="sign-social" class="text-center social-buttons"> <div id="sign-social" class="text-center social-buttons">

@ -28,7 +28,7 @@
{{if .Owner.Website}} {{if .Owner.Website}}
<li class="list-group-item"><i class="octicon octicon-link"></i>&nbsp;&nbsp;<a target="_blank" href="{{.Owner.Website}}">{{.Owner.Website}}</a></li> <li class="list-group-item"><i class="octicon octicon-link"></i>&nbsp;&nbsp;<a target="_blank" href="{{.Owner.Website}}">{{.Owner.Website}}</a></li>
{{end}} {{end}}
<li class="list-group-item"><i class="octicon octicon-clock"></i>&nbsp;&nbsp;{{.i18n.Tr "user.join_on"}} {{DateFormat .Owner.Created "M d, Y"}}</li> <li class="list-group-item"><i class="octicon octicon-clock"></i>&nbsp;&nbsp;{{.i18n.Tr "user.join_on"}} {{DateFmtShort .Owner.Created}}</li>
</ul> </ul>
<hr> <hr>
<ul class="list-no-style"> <ul class="list-no-style">

@ -22,7 +22,7 @@
<i class="fa fa-send fa-2x left"></i> <i class="fa fa-send fa-2x left"></i>
<div class="ssh-content left"> <div class="ssh-content left">
<p><strong>{{.Name}}</strong></p> <p><strong>{{.Name}}</strong></p>
<p class="activity"><i>{{$.i18n.Tr "settings.add_on"}} <span title="{{DateFormat .Created "r"}}">{{DateFormat .Created "M d, Y"}}</span> — <i class="octicon octicon-info"></i>{{if .HasUsed}}{{$.i18n.Tr "settings.last_used"}} {{DateFormat .Updated "M d, Y"}}{{else}}{{$.i18n.Tr "settings.no_activity"}}{{end}}</i></p> <p class="activity"><i>{{$.i18n.Tr "settings.add_on"}} <span title="{{DateFmtLong .Created}}">{{DateFmtShort .Created}}</span> — <i class="octicon octicon-info"></i>{{if .HasUsed}}{{$.i18n.Tr "settings.last_used"}} {{DateFmtShort .Updated}}{{else}}{{$.i18n.Tr "settings.no_activity"}}{{end}}</i></p>
</div> </div>
<a href="{{AppSubUrl}}/user/settings/applications?remove={{.Id}}"> <a href="{{AppSubUrl}}/user/settings/applications?remove={{.Id}}">
<button class="btn btn-small btn-red btn-radius ssh-btn right">{{$.i18n.Tr "settings.delete_token"}}</button> <button class="btn btn-small btn-red btn-radius ssh-btn right">{{$.i18n.Tr "settings.delete_token"}}</button>

@ -18,7 +18,7 @@
<div class="ssh-content left"> <div class="ssh-content left">
<p><strong>{{Oauth2Name .Type}}</strong></p> <p><strong>{{Oauth2Name .Type}}</strong></p>
<p class="print">{{.Identity}}</p> <p class="print">{{.Identity}}</p>
<p class="activity"><i>{{$.i18n.Tr "settings.add_on"}} <span title="{{DateFormat .Created "r"}}">{{DateFormat .Created "M d, Y"}}</span> — <i class="octicon octicon-info"></i>{{$.i18n.Tr "settings.last_used"}} {{DateFormat .Updated "M d, Y"}}</i></p> <p class="activity"><i>{{$.i18n.Tr "settings.add_on"}} <span title="{{DateFmtLong .Created}}">{{DateFmtShort .Created}}</span> — <i class="octicon octicon-info"></i>{{$.i18n.Tr "settings.last_used"}} {{DateFmtShort .Updated}}</i></p>
</div> </div>
<a class="right btn btn-small btn-red btn-header btn-radius" href="{{AppSubUrl}}/user/settings/social?remove={{.Id}}">{{$.i18n.Tr "settings.unbind"}}</a> <a class="right btn btn-small btn-red btn-header btn-radius" href="{{AppSubUrl}}/user/settings/social?remove={{.Id}}">{{$.i18n.Tr "settings.unbind"}}</a>
</li> </li>

@ -23,7 +23,7 @@
<div class="ssh-content left"> <div class="ssh-content left">
<p><strong>{{.Name}}</strong></p> <p><strong>{{.Name}}</strong></p>
<p class="print">{{.Fingerprint}}</p> <p class="print">{{.Fingerprint}}</p>
<p class="activity"><i>{{$.i18n.Tr "settings.add_on"}} <span title="{{DateFormat .Created "r"}}">{{DateFormat .Created "M d, Y"}}</span> — <i class="octicon octicon-info"></i>{{if .HasUsed}}{{$.i18n.Tr "settings.last_used"}} <span title="{{DateFormat .Updated "r"}}">{{DateFormat .Updated "M d, Y"}}</span>{{else}}{{$.i18n.Tr "settings.no_activity"}}{{end}}</i></p> <p class="activity"><i>{{$.i18n.Tr "settings.add_on"}} <span title="{{DateFmtLong .Created}}">{{DateFmtShort .Created}}</span> — <i class="octicon octicon-info"></i>{{if .HasUsed}}{{$.i18n.Tr "settings.last_used"}} <span title="{{DateFmtLong .Updated}}">{{DateFmtShort .Updated}}</span>{{else}}{{$.i18n.Tr "settings.no_activity"}}{{end}}</i></p>
</div> </div>
<form action="{{AppSubUrl}}/user/settings/ssh" method="post"> <form action="{{AppSubUrl}}/user/settings/ssh" method="post">
{{$.CsrfTokenHtml}} {{$.CsrfTokenHtml}}