![Demo](http://gowalker.org/public/gogs_demo.gif) | ![Demo](http://gowalker.org/public/gogs_demo.gif) | ||||
##### Current version: 0.1.8 Alpha | |||||
##### Current version: 0.1.9 Alpha | |||||
#### Other language version | #### Other language version | ||||
![Demo](http://gowalker.org/public/gogs_demo.gif) | ![Demo](http://gowalker.org/public/gogs_demo.gif) | ||||
##### 当前版本:0.1.8 Alpha | |||||
##### 当前版本:0.1.9 Alpha | |||||
## 开发目的 | ## 开发目的 | ||||
[admin] | [admin] | ||||
[security] | [security] | ||||
INSTALL_LOCK = false | |||||
; Use HTTPS to clone repository, otherwise use HTTP. | ; Use HTTPS to clone repository, otherwise use HTTP. | ||||
ENABLE_HTTPS_CLONE = false | ENABLE_HTTPS_CLONE = false | ||||
; !!CHANGE THIS TO KEEP YOUR USER DATA SAFE!! | ; !!CHANGE THIS TO KEEP YOUR USER DATA SAFE!! |
// Test that go1.2 tag above is included in builds. main.go refers to this definition. | // Test that go1.2 tag above is included in builds. main.go refers to this definition. | ||||
const go12tag = true | const go12tag = true | ||||
const APP_VER = "0.1.8.0327 Alpha" | |||||
const APP_VER = "0.1.9.0327 Alpha" | |||||
func init() { | func init() { | ||||
base.AppVer = APP_VER | base.AppVer = APP_VER |
} | } | ||||
// CreateIssue creates new issue for repository. | // CreateIssue creates new issue for repository. | ||||
func CreateIssue(userId, repoId, milestoneId, assigneeId int64, issueCount int, name, labels, content string, isPull bool) (*Issue, error) { | |||||
count, err := GetIssueCount(repoId) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
func CreateIssue(userId, repoId, milestoneId, assigneeId int64, issueCount int, name, labels, content string, isPull bool) (issue *Issue, err error) { | |||||
// TODO: find out mentions | // TODO: find out mentions | ||||
mentions := "" | mentions := "" | ||||
defer sess.Close() | defer sess.Close() | ||||
sess.Begin() | sess.Begin() | ||||
issue := &Issue{ | |||||
Index: count + 1, | |||||
issue = &Issue{ | |||||
Index: int64(issueCount) + 1, | |||||
Name: name, | Name: name, | ||||
RepoId: repoId, | RepoId: repoId, | ||||
PosterId: userId, | PosterId: userId, | ||||
return issue, nil | return issue, nil | ||||
} | } | ||||
// GetIssueCount returns count of issues in the repository. | |||||
func GetIssueCount(repoId int64) (int64, error) { | |||||
return orm.Count(&Issue{RepoId: repoId}) | |||||
} | |||||
// GetIssueById returns issue object by given id. | // GetIssueById returns issue object by given id. | ||||
func GetIssueByIndex(repoId, index int64) (*Issue, error) { | func GetIssueByIndex(repoId, index int64) (*Issue, error) { | ||||
issue := &Issue{RepoId: repoId, Index: index} | issue := &Issue{RepoId: repoId, Index: index} | ||||
// UpdateIssue updates information of issue. | // UpdateIssue updates information of issue. | ||||
func UpdateIssue(issue *Issue) error { | func UpdateIssue(issue *Issue) error { | ||||
_, err := orm.Update(issue, &Issue{RepoId: issue.RepoId, Index: issue.Index}) | |||||
_, err := orm.Id(issue.Id).AllCols().Update(issue) | |||||
return err | return err | ||||
} | } | ||||
func CloseIssue() { | |||||
} | |||||
func ReopenIssue() { | |||||
} | |||||
// Label represents a list of labels of repository for issues. | // Label represents a list of labels of repository for issues. | ||||
type Label struct { | type Label struct { | ||||
Id int64 | Id int64 | ||||
sess.Begin() | sess.Begin() | ||||
if _, err := orm.Insert(&Comment{PosterId: userId, IssueId: issueId, | if _, err := orm.Insert(&Comment{PosterId: userId, IssueId: issueId, | ||||
CommitId: commitId, Line: line, Content: content, | |||||
}); err != nil { | |||||
CommitId: commitId, Line: line, Content: content}); err != nil { | |||||
sess.Rollback() | sess.Rollback() | ||||
return err | return err | ||||
} | } |
has, err := orm.Where("lower_name = ?", strings.ToLower(repoName)).Get(&repo) | has, err := orm.Where("lower_name = ?", strings.ToLower(repoName)).Get(&repo) | ||||
if err != nil { | if err != nil { | ||||
return has, err | return has, err | ||||
} else if !has { | |||||
return false, nil | |||||
} | } | ||||
s, err := os.Stat(RepoPath(user.Name, repoName)) | |||||
if err != nil { | |||||
return false, nil // Error simply means does not exist, but we don't want to show up. | |||||
} | |||||
return s.IsDir(), nil | |||||
return com.IsDir(RepoPath(user.Name, repoName)), nil | |||||
} | } | ||||
var ( | var ( | ||||
if _, stderr, err = com.ExecCmdDir(tmpPath, "git", "add", "--all"); err != nil { | if _, stderr, err = com.ExecCmdDir(tmpPath, "git", "add", "--all"); err != nil { | ||||
return err | return err | ||||
} | } | ||||
log.Trace("stderr(1): %s", stderr) | |||||
if len(stderr) > 0 { | |||||
log.Trace("stderr(1): %s", stderr) | |||||
} | |||||
if _, stderr, err = com.ExecCmdDir(tmpPath, "git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), | if _, stderr, err = com.ExecCmdDir(tmpPath, "git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), | ||||
"-m", "Init commit"); err != nil { | "-m", "Init commit"); err != nil { | ||||
return err | return err | ||||
} | } | ||||
log.Trace("stderr(2): %s", stderr) | |||||
if len(stderr) > 0 { | |||||
log.Trace("stderr(2): %s", stderr) | |||||
} | |||||
if _, stderr, err = com.ExecCmdDir(tmpPath, "git", "push", "origin", "master"); err != nil { | if _, stderr, err = com.ExecCmdDir(tmpPath, "git", "push", "origin", "master"); err != nil { | ||||
return err | return err | ||||
} | } | ||||
log.Trace("stderr(3): %s", stderr) | |||||
if len(stderr) > 0 { | |||||
log.Trace("stderr(3): %s", stderr) | |||||
} | |||||
return nil | return nil | ||||
} | } | ||||
return err | return err | ||||
} | } | ||||
defer pu.Close() | defer pu.Close() | ||||
if _, err = pu.WriteString(content); err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
_, err = pu.WriteString(content) | |||||
return err | |||||
} | } | ||||
// InitRepository initializes README and .gitignore if needed. | // InitRepository initializes README and .gitignore if needed. | ||||
} | } | ||||
// Apply changes and commit. | // Apply changes and commit. | ||||
if err := initRepoCommit(tmpDir, user.NewGitSig()); err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
return initRepoCommit(tmpDir, user.NewGitSig()) | |||||
} | } | ||||
// UserRepo reporesents a repository with user name. | // UserRepo reporesents a repository with user name. |
<div class="col-md-3 filter-list"> | <div class="col-md-3 filter-list"> | ||||
<ul class="list-unstyled"> | <ul class="list-unstyled"> | ||||
<li><a href="#" class="active">All Issues <strong class="pull-right">{{.IssueCount}}</strong></a></li> | <li><a href="#" class="active">All Issues <strong class="pull-right">{{.IssueCount}}</strong></a></li> | ||||
<!-- <li><a href="#">My Issues</a></li> | |||||
<li><a href="#">Mentioned</a></li> --> | |||||
<!-- <li><a href="#">Assigned to you</a></li> --> | |||||
<li><a href="#">Created by you</a></li> | |||||
<!-- <li><a href="#">Mentioned</a></li> --> | |||||
</ul> | </ul> | ||||
</div> | </div> | ||||
<div class="col-md-9"> | <div class="col-md-9"> |
<div class="col-md-3 filter-list"> | <div class="col-md-3 filter-list"> | ||||
<ul class="list-unstyled"> | <ul class="list-unstyled"> | ||||
<li><a href="#" class="active">In your repositories <strong class="pull-right">10</strong></a></li> | <li><a href="#" class="active">In your repositories <strong class="pull-right">10</strong></a></li> | ||||
<!-- <li><a href="#">Assigned to you</a></li> --> | |||||
<li><a href="#">Created by you</a></li> | <li><a href="#">Created by you</a></li> | ||||
<li><a href="#">Assigned to you</a></li> | |||||
<!-- <li><a href="#">Assigned to you</a></li> --> | |||||
<li><hr/></li> | <li><hr/></li> | ||||
<li><a href="" class="sm">gogits/gogs <strong class="pull-right">12</strong></a></li> | <li><a href="" class="sm">gogits/gogs <strong class="pull-right">12</strong></a></li> | ||||
<li><a href="" class="sm">gogits/session <strong class="pull-right">8</strong></a></li> | <li><a href="" class="sm">gogits/session <strong class="pull-right">8</strong></a></li> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="issues list-group"> | <div class="issues list-group"> | ||||
<div class="list-group-item unread issue-item" id="issue-id"> | |||||
<span class="number pull-right">#123</span> | |||||
<h5 class="title"><a href="#">Bug: When running tests after generating a beego app, templates do not load.</a></h5> | |||||
{{range .Issues}} | |||||
<div class="list-group-item issue-item" id="issue-{{.Id}}"> | |||||
<span class="number pull-right">#{{.Index}}</span> | |||||
<h5 class="title"><a href="/{{$.RepositoryLink}}/issues/{{.Index}}">{{.Name}}</a></h5> | |||||
<p class="info"> | <p class="info"> | ||||
<span class="author"><img class="avatar" src="http://tp2.sinaimg.cn/5068084885/50/40050297589/1" alt="" width="20"/> | |||||
<a href="#">Obama</a></span> | |||||
<span class="time">3 days ago</span> | |||||
<span class="comment"><i class="fa fa-comments"></i> 3</span> | |||||
</p> | |||||
</div> | |||||
<div class="list-group-item issue-item" id="issue-id2"> | |||||
<span class="number pull-right">#123</span> | |||||
<h5 class="title"><a href="#">Bug: When running tests after generating a beego app, templates do not load.</a></h5> | |||||
<p class="info"> | |||||
<span class="author"><img class="avatar" src="http://tp2.sinaimg.cn/5068084885/50/40050297589/1" alt="" width="20"/> | |||||
<a href="#">Obama</a></span> | |||||
<span class="time">3 days ago</span> | |||||
<span class="comment"><i class="fa fa-comments"></i> 3</span> | |||||
</p> | |||||
</div> | |||||
<div class="list-group-item issue-item" id="issue-id3"> | |||||
<span class="number pull-right">#123</span> | |||||
<h5 class="title"><a href="#">Bug: When running tests after generating a beego app, templates do not load.</a></h5> | |||||
<p class="info"> | |||||
<span class="author"><img class="avatar" src="http://tp2.sinaimg.cn/5068084885/50/40050297589/1" alt="" width="20"/> | |||||
<a href="#">Obama</a></span> | |||||
<span class="time">3 days ago</span> | |||||
<span class="comment"><i class="fa fa-comments"></i> 3</span> | |||||
<span class="author"><img class="avatar" src="{{.Poster.AvatarLink}}" alt="" width="20"/> | |||||
<a href="/user/{{.Poster.Name}}">{{.Poster.Name}}</a></span> | |||||
<span class="time">{{TimeSince .Created}}</span> | |||||
<span class="comment"><i class="fa fa-comments"></i> {{.NumComments}}</span> | |||||
</p> | </p> | ||||
</div> | </div> | ||||
{{end}} | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> |