| @@ -38,6 +38,7 @@ The goal of this project is to make the easiest, fastest and most painless way t | |||
| - Create/migrate/mirror/delete/watch/rename/transfer public/private repository | |||
| - Repository viewer/release/issue tracker | |||
| - Repository and Organization level webhooks | |||
| - Repository Git hooks | |||
| - Add/remove repository collaborators | |||
| - Gravatar and cache support | |||
| - Mail service(register, issue) | |||
| @@ -24,14 +24,15 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自 | |||
| - 支持 SSH/HTTP(S) 协议 | |||
| - 支持 SMTP/LDAP/反向代理 用户认证 | |||
| - 支持反向代理子路径 | |||
| - 注册/删除/重命名 用户 | |||
| - 创建/管理/删除 组织以及团队管理功能 | |||
| - 创建/迁移/镜像/删除/关注/重命名/转移 公开/私有 仓库 | |||
| - 仓库 浏览/发布/工单管理 | |||
| - 仓库和组织级别 Web 钩子 | |||
| - 添加/删除 仓库协作者 | |||
| - Gravatar 以及缓存支持 | |||
| - 邮件服务(注册、Issue) | |||
| - 支持 注册/删除/重命名 用户 | |||
| - 支持 创建/管理/删除 组织以及团队管理功能 | |||
| - 支持 创建/迁移/镜像/删除/关注/重命名/转移 公开/私有 仓库 | |||
| - 支持仓库 浏览/发布/工单管理 | |||
| - 支持仓库和组织级别 Web 钩子 | |||
| - 支持仓库 Git 钩子 | |||
| - 支持 添加/删除 仓库协作者 | |||
| - 支持 Gravatar 以及本地缓存 | |||
| - 支持邮件服务(注册、Issue) | |||
| - 管理员面板 | |||
| - Slack Web 钩子集成 | |||
| - 支持 MySQL、PostgreSQL 以及 SQLite3 数据库 | |||
| @@ -273,6 +273,9 @@ tags = Tags | |||
| issues = Issues | |||
| commits = Commits | |||
| releases = Releases | |||
| file_raw = Raw | |||
| file_history = History | |||
| file_view_raw = View Raw | |||
| commits.commits = Commits | |||
| commits.search = Search commits | |||
| @@ -273,6 +273,9 @@ tags = 标签列表 | |||
| issues = 工单管理 | |||
| commits = 提交历史 | |||
| releases = 版本发布 | |||
| file_raw = 原始文件 | |||
| file_history = 文件历史 | |||
| file_view_raw = 查看原始文件 | |||
| commits.commits = 次代码提交 | |||
| commits.search = 搜索提交历史 | |||
| @@ -17,7 +17,7 @@ import ( | |||
| "github.com/gogits/gogs/modules/setting" | |||
| ) | |||
| const APP_VER = "0.5.5.1010 Beta" | |||
| const APP_VER = "0.5.5.1011 Beta" | |||
| func init() { | |||
| runtime.GOMAXPROCS(runtime.NumCPU()) | |||
| @@ -663,7 +663,7 @@ func RepoPath(userName, repoName string) string { | |||
| func TransferOwnership(u *User, newOwner string, repo *Repository) error { | |||
| newUser, err := GetUserByName(newOwner) | |||
| if err != nil { | |||
| return err | |||
| return fmt.Errorf("fail to get new owner(%s): %v", newOwner, err) | |||
| } | |||
| // Check if new owner has repository with same name. | |||
| @@ -488,7 +488,7 @@ func GetUserByName(name string) (*User, error) { | |||
| return user, nil | |||
| } | |||
| // GetUserEmailsByNames returns a slice of e-mails corresponds to names. | |||
| // GetUserEmailsByNames returns a list of e-mails corresponds to names. | |||
| func GetUserEmailsByNames(names []string) []string { | |||
| mails := make([]string, 0, len(names)) | |||
| for _, name := range names { | |||
| @@ -75,12 +75,6 @@ type Context struct { | |||
| } | |||
| } | |||
| // Query querys form parameter. | |||
| func (ctx *Context) Query(name string) string { | |||
| ctx.Req.ParseForm() | |||
| return ctx.Req.Form.Get(name) | |||
| } | |||
| // HasError returns true if error occurs in form validation. | |||
| func (ctx *Context) HasApiError() bool { | |||
| hasErr, ok := ctx.Data["HasError"] | |||
| @@ -457,6 +457,9 @@ dt { | |||
| box-sizing: content-box; | |||
| text-align: center; | |||
| } | |||
| .btn-comb { | |||
| margin-left: -1px; | |||
| } | |||
| .btn-disabled { | |||
| opacity: .6; | |||
| cursor: not-allowed; | |||
| @@ -102,6 +102,9 @@ | |||
| box-sizing: content-box; | |||
| text-align: center; | |||
| } | |||
| .btn-comb { | |||
| margin-left: -1px; | |||
| } | |||
| .btn-disabled { | |||
| opacity: .6; | |||
| @@ -276,13 +276,15 @@ func FileHistory(ctx *middleware.Context) { | |||
| nextPage = 0 | |||
| } | |||
| ctx.Data["Commits"], err = ctx.Repo.GitRepo.CommitsByFileAndRange( | |||
| commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange( | |||
| branchName, fileName, page) | |||
| if err != nil { | |||
| ctx.Handle(500, "repo.FileHistory(CommitsByRange)", err) | |||
| return | |||
| } | |||
| commits = models.ValidateCommitsWithEmails(commits) | |||
| ctx.Data["Commits"] = commits | |||
| ctx.Data["Username"] = userName | |||
| ctx.Data["Reponame"] = repoName | |||
| ctx.Data["FileName"] = fileName | |||
| @@ -166,7 +166,7 @@ func Home(ctx *middleware.Context) { | |||
| } | |||
| if readmeFile != nil { | |||
| ctx.Data["ReadmeInHome"] = true | |||
| ctx.Data["ReadmeInList"] = true | |||
| ctx.Data["ReadmeExist"] = true | |||
| if dataRc, err := readmeFile.Data(); err != nil { | |||
| ctx.Handle(404, "repo.SinglereadmeFile.LookupBlob", err) | |||
| @@ -1 +1 @@ | |||
| 0.5.5.1010 Beta | |||
| 0.5.5.1011 Beta | |||
| @@ -58,7 +58,7 @@ | |||
| <td>{{.Pid}}</td> | |||
| <td>{{.Description}}</td> | |||
| <td>{{.Start}}</td> | |||
| <td>{{TimeSince .Start .i18n.Lang}}</td> | |||
| <td>{{TimeSince .Start $.Lang}}</td> | |||
| </tr> | |||
| {{end}} | |||
| </tbody> | |||
| @@ -54,16 +54,16 @@ | |||
| {{end}} | |||
| {{end}} | |||
| </li> | |||
| <!-- <li id="repo-commits-jump" class="repo-jump right"> | |||
| <li id="repo-commits-jump" class="repo-jump right"> | |||
| <a href="#"> | |||
| <button class="btn btn-small btn-gray btn-right-radius"><i class="octicon octicon-git-commit"></i></button> | |||
| </a> | |||
| </li> | |||
| <li id="repo-find-jump" class="repo-jump right"> | |||
| <a href="#"> | |||
| <button class="btn btn-small btn-gray btn-left-radius"><i class="octicon octicon-list-unordered"></i></button> | |||
| <button class="btn btn-small btn btn-small btn-gray btn-left-radius"><i class="octicon octicon-list-unordered"></i></button> | |||
| </a> | |||
| </li> --> | |||
| </li> | |||
| </ul> | |||
| {{if .IsFile}} | |||
| {{template "repo/view_file" .}} | |||
| @@ -1,40 +0,0 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| {{template "repo/nav" .}} | |||
| {{template "repo/toolbar" .}} | |||
| <div id="body" class="container"> | |||
| <div id="source"> | |||
| <div class="source-toolbar"> | |||
| {{ $n := len .Treenames}} | |||
| {{if not .IsFile}}<button class="btn btn-default pull-right hidden"><i class="fa fa-plus-square"></i>Add File</button>{{end}} | |||
| <div class="dropdown branch-switch"> | |||
| <a href="#" class="btn btn-success dropdown-toggle" data-toggle="dropdown"><i class="fa fa-chain"></i>{{if .IsBranch}}{{.BranchName}}{{else}}{{ShortSha .CommitId}}{{end}} | |||
| <b class="caret"></b></a> | |||
| <ul class="dropdown-menu"> | |||
| {{range .Branches}} | |||
| <li><a {{if eq . $.BranchName}}class="current" {{end}}href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/src/{{.}}">{{.}}</a></li> | |||
| {{end}} | |||
| </ul> | |||
| </div> | |||
| {{ $l := Subtract $n 1}} | |||
| <ol class="breadcrumb"> | |||
| <li class="root dir"> | |||
| <a href="{{.BranchLink}}">{{.Repository.Name}}</a></li> | |||
| {{range $i, $v := .Treenames}} | |||
| <li class="dir"> | |||
| {{if eq $i $l}}{{$v}} | |||
| {{else}} | |||
| <a href="{{$.BranchLink}}/{{index $.Paths $i}}">{{$v}}</a> | |||
| {{end}} | |||
| </li> | |||
| {{end}} | |||
| </ol> | |||
| </div> | |||
| {{if .IsFile}} | |||
| {{template "repo/single_file" .}} | |||
| {{else}} | |||
| {{template "repo/single_list" .}} | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| {{template "base/footer" .}} | |||
| @@ -1,40 +0,0 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| {{template "repo/nav" .}} | |||
| {{template "repo/toolbar" .}} | |||
| <div id="body" class="container"> | |||
| <div id="source"> | |||
| <div class="panel panel-default guide-box clone-group-btn"> | |||
| <div class="panel-heading guide-head"> | |||
| <h4>Quick Guide</h4> | |||
| </div> | |||
| <div class="panel-body guide-content text-center"> | |||
| <h3>Clone this repository</h3> | |||
| <div class="input-group col-md-8 col-md-offset-2 guide-buttons"> | |||
| <span class="input-group-btn"> | |||
| <button class="btn btn-default" data-link="{{.CloneLink.SSH}}" type="button">SSH</button> | |||
| <button class="btn btn-default" data-link="{{.CloneLink.HTTPS}}" type="button">HTTPS</button> | |||
| </span> | |||
| <input type="text" class="form-control clone-group-url" id="guide-clone-url" value="" readonly/> | |||
| <span class="input-group-btn" style="position: relative"> | |||
| <button class="btn btn-default" type="button" data-toggle="tooltip" title="copy to clipboard" data-placement="top" data-init="copy" data-copy-val="val" data-copy-from="#guide-clone-url"><i class="fa fa-copy"></i></button> | |||
| </span> | |||
| </div> | |||
| <p>We recommend every repository include a <strong>README</strong>, <strong>LICENSE</strong>, and <strong>.gitignore</strong>.</p> | |||
| <hr/> | |||
| <h3>Create a new repository on the command line</h3> | |||
| <pre class="text-left"><code>touch README.md | |||
| git init | |||
| git add README.md | |||
| git commit -m "first commit" | |||
| git remote add origin <span class="clone-url"></span> | |||
| git push -u origin master</code></pre> | |||
| <hr/> | |||
| <h3>Push an existing repository from the command line</h3> | |||
| <pre class="text-left"><code>git remote add origin <span class="clone-url"></span> | |||
| git push -u origin master</code></pre> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| {{template "base/footer" .}} | |||
| @@ -1,51 +0,0 @@ | |||
| <div class="panel panel-default file-content"> | |||
| <div class="panel-heading file-head"> | |||
| {{if .ReadmeExist}} | |||
| <i class="icon fa fa-book"></i> | |||
| {{if .ReadmeInSingle}} | |||
| {{.FileName}} | |||
| {{else}} | |||
| {{.FileName}} <span class="file-size">{{FileSize .FileSize}}</span> | |||
| {{end}} | |||
| {{else}} | |||
| <i class="icon fa fa-file-text-o"></i> | |||
| {{.FileName}} <span class="file-size">{{FileSize .FileSize}}</span> | |||
| {{end}} | |||
| {{if not .ReadmeInSingle}} | |||
| <div class="btn-group pull-right"> | |||
| <a class="btn btn-default hidden" href="#">Edit</a> | |||
| <a class="btn btn-default" href="{{.FileLink}}" rel="nofollow">Raw</a> | |||
| <a class="btn btn-default hidden" href="#">Blame</a> | |||
| <a class="btn btn-default" href="{{.RepoLink}}/commits/{{.BranchName}}/{{.TreeName}}">History</a> | |||
| <a class="btn btn-danger hidden" href="#">Delete</a> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| {{if not .FileIsText}} | |||
| <div class="panel-body file-body file-code code-view"> | |||
| {{if .IsImageFile}} | |||
| <img src="{{.FileLink}}"> | |||
| {{else}} | |||
| <a href="{{.FileLink}}" rel="nofollow" class="btn btn-default">View Raw</a> | |||
| {{end}} | |||
| </div> | |||
| {{else}} | |||
| {{if .ReadmeExist}} | |||
| <div class="panel-body file-body markdown"> | |||
| {{.FileContent|str2html}} | |||
| </div> | |||
| {{else}} | |||
| <div class="panel-body file-body file-code code-view"> | |||
| <table> | |||
| <tbody> | |||
| <tr> | |||
| <td class="lines-num"></td> | |||
| <td class="lines-code markdown"><pre class="prettyprint linenums{{if .FileExt}} lang-{{.FileExt}}{{end}}">{{.FileContent}}</pre></td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| </div> | |||
| {{end}} | |||
| {{end}} | |||
| </div> | |||
| @@ -1,51 +0,0 @@ | |||
| <div class="panel panel-default info-box"> | |||
| <div class="panel-heading info-head"> | |||
| <a href="{{AppSubUrl}}/{{.Username}}/{{.Reponame}}/commit/{{.LastCommit.Id}}" rel="nofollow">{{.LastCommit.Summary}}</a> | |||
| </div> | |||
| <div class="panel-body info-content"> | |||
| <a href="{{AppSubUrl}}/user/{{.LastCommit.Author.Name}}">{{.LastCommit.Author.Name}}</a> <span class="text-muted">{{TimeSince .LastCommit.Author.When}}</span> | |||
| </div> | |||
| <table class="panel-footer table file-list"> | |||
| <thead class="hidden"> | |||
| <tr> | |||
| <th class="icon"></th> | |||
| <th class="name">Filename</th> | |||
| <th class="text">Message</th> | |||
| <th class="date">Date modified</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| {{if .HasParentPath}} | |||
| <tr class="has-parent"> | |||
| <td class="icon"><a href="{{.BranchLink}}{{.ParentPath}}"><i class="fa fa-reply"></i></a></td> | |||
| <td class="name"><a href="{{.BranchLink}}{{.ParentPath}}">..</a></td> | |||
| <td class="text"></td> | |||
| <td class="date"></td> | |||
| </tr> | |||
| {{end}} | |||
| {{range $item := .Files}} | |||
| {{$entry := index $item 0}} | |||
| {{$commit := index $item 1}} | |||
| <tr {{if $entry.IsDir}}class="is-dir"{{end}}> | |||
| <td class="icon"> | |||
| <i class="fa {{if $entry.IsDir}}fa-folder{{else}}fa-file-text-o{{end}}"></i> | |||
| </td> | |||
| <td class="name"> | |||
| <span class="wrap"> | |||
| <a href="{{$.BranchLink}}/{{$.TreePath}}{{$entry.Name}}">{{$entry.Name}}</a> | |||
| </span> | |||
| </td> | |||
| <td class="text"> | |||
| <span class="wrap"><a rel="nofollow" href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/commit/{{$commit.Id}}">{{$commit.Summary}}</a></span> | |||
| </td> | |||
| <td class="date"> | |||
| <span class="wrap">{{TimeSince $commit.Committer.When}}</span> | |||
| </td> | |||
| </tr> | |||
| {{end}} | |||
| </tbody> | |||
| </table> | |||
| </div> | |||
| {{if .ReadmeExist}} | |||
| {{template "repo/single_file" .}} | |||
| {{end}} | |||
| @@ -2,15 +2,23 @@ | |||
| <p class="panel-header"> | |||
| {{if .ReadmeExist}} | |||
| <i class="icon fa fa-book fa-lg"></i> | |||
| {{if .ReadmeInHome}} | |||
| {{if .ReadmeInList}} | |||
| <strong class="file-name">{{.FileName}}</strong> | |||
| {{else}} | |||
| <strong>{{.FileName}}</strong><span class="file-size">{{FileSize .FileSize}}</span> | |||
| {{end}} | |||
| {{else}} | |||
| <i class="icon fa fa-file-text-o"></i> | |||
| <strong class="file-name">{{.FileName}}</strong><span class="file-size">{{FileSize .FileSize}}</span> | |||
| <i class="icon fa fa-file-text-o"></i> | |||
| <strong class="file-name">{{.FileName}}</strong><span class="file-size">{{FileSize .FileSize}}</span> | |||
| {{end}} | |||
| {{if not .ReadmeInList}} | |||
| <a class="right" href="{{.RepoLink}}/commits/{{.BranchName}}/{{.TreeName}}"> | |||
| <button class="btn btn-medium btn-gray btn-right-radius btn-comb">{{.i18n.Tr "repo.file_history"}}</button> | |||
| </a> | |||
| <a class="right" href="{{.FileLink}}"> | |||
| <button class="btn btn-medium btn-gray btn-left-radius btn-comb">{{.i18n.Tr "repo.file_raw"}}</button> | |||
| </a> | |||
| {{end}} | |||
| </p> | |||
| <div class="{{if .ReadmeExist}}panel-content markdown{{end}} code-view" id="repo-code-view"> | |||
| {{if .ReadmeExist}} | |||
| @@ -20,7 +28,7 @@ | |||
| {{if .IsImageFile}} | |||
| <img src="{{.FileLink}}"> | |||
| {{else}} | |||
| <a href="{{.FileLink}}" rel="nofollow" class="btn btn-gray btn-radius">View Raw</a> | |||
| <a href="{{.FileLink}}" rel="nofollow" class="btn btn-gray btn-radius">{{.i18n.Tr "repo.file_view_raw"}}</a> | |||
| {{end}} | |||
| </div> | |||
| {{else if .FileSize}} | |||
| @@ -10,7 +10,7 @@ | |||
| <strong>{{ShortSha .LastCommit.Id.String}}</strong></a> | |||
| <span class="text-truncate">{{.LastCommit.Summary}}</span> | |||
| </span> | |||
| <span class="age right">{{TimeSince .LastCommit.Author.When .i18n.Lang}}</span> | |||
| <span class="age right">{{TimeSince .LastCommit.Author.When $.Lang}}</span> | |||
| </th> | |||
| </tr> | |||
| </thead> | |||
| @@ -45,7 +45,7 @@ | |||
| <td class="msg"> | |||
| <a class="text-truncate" href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/commit/{{$commit.Id}}" rel="nofollow">{{$commit.Summary}}</a> | |||
| </td> | |||
| <td class="age">{{TimeSince $commit.Committer.When $.i18n.Lang}}</td> | |||
| <td class="age">{{TimeSince $commit.Committer.When $.Lang}}</td> | |||
| </tr> | |||
| {{end}} | |||
| </tbody> | |||