mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	IP: RC Code Review
This commit is contained in:
		| @@ -61,5 +61,4 @@ This project was launched by [Unknown](https://github.com/Unknwon) and [lunny](h | ||||
|  | ||||
| ## License | ||||
|  | ||||
| Gogs is under the MIT License. | ||||
| See the [LICENSE file](https://github.com/gogits/gogs/blob/master/LICENSE) for the full license text. | ||||
| Gogs is under the MIT License. See the [LICENSE](https://github.com/gogits/gogs/blob/master/LICENSE) file for the full license text. | ||||
|   | ||||
| @@ -54,3 +54,7 @@ Gogs 完全使用 Go 语言来实现对 Git 数据的操作,实现 **零** 依 | ||||
| ## 贡献成员 | ||||
|  | ||||
| 本项目最初由 [Unknown](https://github.com/Unknwon) 和 [lunny](https://github.com/lunny) 发起,随后 [fuxiaohei](https://github.com/fuxiaohei) 与 [slene](https://github.com/slene) 加入到开发团队。您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。 | ||||
|  | ||||
| ## 授权许可 | ||||
|  | ||||
| Gogs 采用 MIT 开源授权许可证,完整的授权说明已放置在 [LICENSE](https://github.com/gogits/gogs/blob/master/LICENSE) 文件中。 | ||||
| @@ -60,10 +60,10 @@ func (a Action) GetContent() string { | ||||
|  | ||||
| // CommitRepoAction adds new action for committing repository. | ||||
| func CommitRepoAction(userId int64, userName string, | ||||
| 	repoId int64, repoName string, refName string, commits *base.PushCommits) error { | ||||
| 	repoId int64, repoName string, refName string, commit *base.PushCommits) error { | ||||
| 	log.Trace("action.CommitRepoAction(start): %d/%s", userId, repoName) | ||||
|  | ||||
| 	bs, err := json.Marshal(commits) | ||||
| 	bs, err := json.Marshal(commit) | ||||
| 	if err != nil { | ||||
| 		log.Error("action.CommitRepoAction(json): %d/%s", userId, repoName) | ||||
| 		return err | ||||
| @@ -91,16 +91,13 @@ func CommitRepoAction(userId int64, userName string, | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // NewRepoAction records action for create repository. | ||||
| func NewRepoAction(user *User, repo *Repository) error { | ||||
| 	_, err := orm.InsertOne(&Action{ | ||||
| 		UserId:      user.Id, | ||||
| 		ActUserId:   user.Id, | ||||
| 		ActUserName: user.Name, | ||||
| 		OpType:      OP_CREATE_REPO, | ||||
| 		RepoId:      repo.Id, | ||||
| 		RepoName:    repo.Name, | ||||
| 	}) | ||||
| // NewRepoAction adds new action for creating repository. | ||||
| func NewRepoAction(user *User, repo *Repository) (err error) { | ||||
| 	if err = NotifyWatchers(&Action{ActUserId: user.Id, ActUserName: user.Name, OpType: OP_CREATE_REPO, | ||||
| 		RepoId: repo.Id, RepoName: repo.Name}); err != nil { | ||||
| 		log.Error("action.NewRepoAction(notify watchers): %d/%s", user.Id, repo.Name) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	log.Trace("action.NewRepoAction: %s/%s", user.LowerName, repo.LowerName) | ||||
| 	return err | ||||
|   | ||||
| @@ -37,7 +37,7 @@ type Issue struct { | ||||
| } | ||||
|  | ||||
| // CreateIssue creates new issue for repository. | ||||
| func CreateIssue(userId, repoId, milestoneId, assigneeId int64, name, labels, content string, isPull bool) (*Issue, error) { | ||||
| 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 | ||||
| @@ -46,6 +46,10 @@ func CreateIssue(userId, repoId, milestoneId, assigneeId int64, name, labels, co | ||||
| 	// TODO: find out mentions | ||||
| 	mentions := "" | ||||
|  | ||||
| 	sess := orm.NewSession() | ||||
| 	defer sess.Close() | ||||
| 	sess.Begin() | ||||
|  | ||||
| 	issue := &Issue{ | ||||
| 		Index:       count + 1, | ||||
| 		Name:        name, | ||||
| @@ -58,8 +62,23 @@ func CreateIssue(userId, repoId, milestoneId, assigneeId int64, name, labels, co | ||||
| 		Mentions:    mentions, | ||||
| 		Content:     content, | ||||
| 	} | ||||
| 	_, err = orm.Insert(issue) | ||||
| 	return issue, err | ||||
| 	if _, err = sess.Insert(issue); err != nil { | ||||
| 		sess.Rollback() | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	rawSql := "UPDATE `repository` SET num_issues = num_issues + 1 WHERE id = ?" | ||||
| 	if _, err = sess.Exec(rawSql, repoId); err != nil { | ||||
| 		sess.Rollback() | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	if err = sess.Commit(); err != nil { | ||||
| 		sess.Rollback() | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return issue, nil | ||||
| } | ||||
|  | ||||
| // GetIssueCount returns count of issues in the repository. | ||||
|   | ||||
| @@ -10,12 +10,12 @@ import ( | ||||
|  | ||||
| 	"github.com/lunny/xorm" | ||||
| 	_ "github.com/mattn/go-sqlite3" | ||||
| 	. "github.com/smartystreets/goconvey/convey" | ||||
|  | ||||
| 	"github.com/gogits/gogs/modules/base" | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	LoadModelsConfig() | ||||
| 	NewEngine() | ||||
|  | ||||
| 	var err error | ||||
| 	orm, err = xorm.NewEngine("sqlite3", "./test.db") | ||||
| 	if err != nil { | ||||
| @@ -25,26 +25,31 @@ func init() { | ||||
| 	orm.ShowSQL = true | ||||
| 	orm.ShowDebug = true | ||||
|  | ||||
| 	err = orm.Sync(&User{}, &Repo{}) | ||||
| 	err = orm.Sync(&User{}, &Repository{}) | ||||
| 	if err != nil { | ||||
| 		fmt.Println(err) | ||||
| 	} | ||||
|  | ||||
| 	root = "test" | ||||
| 	base.RepoRootPath = "test" | ||||
| } | ||||
|  | ||||
| func TestCreateRepository(t *testing.T) { | ||||
| 	user := User{Id: 1, Type: Individual} | ||||
| 	_, err := CreateRepository(&user, "test") | ||||
| 	user := User{Id: 1, Name: "foobar", Type: UT_INDIVIDUAL} | ||||
| 	_, err := CreateRepository(&user, "test", "", "", "test repo desc", false, false) | ||||
| 	if err != nil { | ||||
| 		t.Error(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestDeleteRepository(t *testing.T) { | ||||
| 	user := User{Id: 1, Type: Individual} | ||||
| 	err := DeleteRepository(&user, "test") | ||||
| 	err := DeleteRepository(1, 1, "foobar") | ||||
| 	if err != nil { | ||||
| 		t.Error(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestCommitRepoAction(t *testing.T) { | ||||
| 	Convey("Create a commit repository action", t, func() { | ||||
|  | ||||
| 	}) | ||||
| } | ||||
|   | ||||
| @@ -72,20 +72,22 @@ func NewRepoContext() { | ||||
|  | ||||
| // Repository represents a git repository. | ||||
| type Repository struct { | ||||
| 	Id          int64 | ||||
| 	OwnerId     int64 `xorm:"unique(s)"` | ||||
| 	ForkId      int64 | ||||
| 	LowerName   string `xorm:"unique(s) index not null"` | ||||
| 	Name        string `xorm:"index not null"` | ||||
| 	Description string | ||||
| 	Website     string | ||||
| 	NumWatches  int | ||||
| 	NumStars    int | ||||
| 	NumForks    int | ||||
| 	IsPrivate   bool | ||||
| 	IsBare      bool | ||||
| 	Created     time.Time `xorm:"created"` | ||||
| 	Updated     time.Time `xorm:"updated"` | ||||
| 	Id              int64 | ||||
| 	OwnerId         int64 `xorm:"unique(s)"` | ||||
| 	ForkId          int64 | ||||
| 	LowerName       string `xorm:"unique(s) index not null"` | ||||
| 	Name            string `xorm:"index not null"` | ||||
| 	Description     string | ||||
| 	Website         string | ||||
| 	NumWatches      int | ||||
| 	NumStars        int | ||||
| 	NumForks        int | ||||
| 	NumIssues       int | ||||
| 	NumClosedIssues int | ||||
| 	IsPrivate       bool | ||||
| 	IsBare          bool | ||||
| 	Created         time.Time `xorm:"created"` | ||||
| 	Updated         time.Time `xorm:"updated"` | ||||
| } | ||||
|  | ||||
| // IsRepositoryExist returns true if the repository with given name under user has already existed. | ||||
| @@ -491,11 +493,16 @@ func NotifyWatchers(act *Action) error { | ||||
| 	if err != nil { | ||||
| 		return errors.New("repo.NotifyWatchers(get watches): " + err.Error()) | ||||
| 	} | ||||
| 	watches = append(watches, Watch{UserId: act.ActUserId}) | ||||
|  | ||||
| 	// Add feed for actioner. | ||||
| 	act.UserId = act.ActUserId | ||||
| 	if _, err = orm.InsertOne(act); err != nil { | ||||
| 		return errors.New("repo.NotifyWatchers(create action): " + err.Error()) | ||||
| 	} | ||||
|  | ||||
| 	for i := range watches { | ||||
| 		if act.ActUserId == watches[i].UserId && i > 0 { | ||||
| 			continue // Do not add twice in case author watches his/her repository. | ||||
| 		if act.ActUserId == watches[i].UserId { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		act.UserId = watches[i].UserId | ||||
|   | ||||
| @@ -17,23 +17,22 @@ import ( | ||||
| 	"github.com/gogits/gogs/modules/middleware" | ||||
| ) | ||||
|  | ||||
| func Issues(ctx *middleware.Context, params martini.Params) { | ||||
| func Issues(ctx *middleware.Context) { | ||||
| 	ctx.Data["Title"] = "Issues" | ||||
| 	ctx.Data["IsRepoToolbarIssues"] = true | ||||
| 	ctx.Data["IsRepoToolbarIssuesList"] = true | ||||
|  | ||||
| 	milestoneId, _ := base.StrTo(params["milestone"]).Int() | ||||
| 	page, _ := base.StrTo(params["page"]).Int() | ||||
| 	milestoneId, _ := base.StrTo(ctx.Query("milestone")).Int() | ||||
| 	page, _ := base.StrTo(ctx.Query("page")).Int() | ||||
|  | ||||
| 	// Get issues. | ||||
| 	issues, err := models.GetIssues(0, ctx.Repo.Repository.Id, 0, | ||||
| 		int64(milestoneId), page, params["state"] == "closed", false, params["labels"], params["sortType"]) | ||||
| 		int64(milestoneId), page, ctx.Query("state") == "closed", false, ctx.Query("labels"), ctx.Query("sortType")) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(200, "issue.Issues: %v", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	var closedCount int | ||||
| 	// Get posters. | ||||
| 	for i := range issues { | ||||
| 		u, err := models.GetUserById(issues[i].PosterId) | ||||
| @@ -41,17 +40,14 @@ func Issues(ctx *middleware.Context, params martini.Params) { | ||||
| 			ctx.Handle(200, "issue.Issues(get poster): %v", err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		if issues[i].IsClosed { | ||||
| 			closedCount++ | ||||
| 		} | ||||
| 		issues[i].Poster = u | ||||
| 	} | ||||
|  | ||||
| 	ctx.Data["Issues"] = issues | ||||
| 	ctx.Data["IssueCount"] = len(issues) | ||||
| 	ctx.Data["OpenCount"] = len(issues) - closedCount | ||||
| 	ctx.Data["ClosedCount"] = closedCount | ||||
| 	ctx.Data["IssueCount"] = ctx.Repo.Repository.NumIssues | ||||
| 	ctx.Data["OpenCount"] = ctx.Repo.Repository.NumIssues - ctx.Repo.Repository.NumClosedIssues | ||||
| 	ctx.Data["ClosedCount"] = ctx.Repo.Repository.NumClosedIssues | ||||
| 	ctx.Data["IsShowClosed"] = ctx.Query("state") == "closed" | ||||
| 	ctx.HTML(200, "issue/list") | ||||
| } | ||||
|  | ||||
| @@ -71,7 +67,7 @@ func CreateIssue(ctx *middleware.Context, params martini.Params, form auth.Creat | ||||
| 	} | ||||
|  | ||||
| 	issue, err := models.CreateIssue(ctx.User.Id, ctx.Repo.Repository.Id, form.MilestoneId, form.AssigneeId, | ||||
| 		form.IssueName, form.Labels, form.Content, false) | ||||
| 		ctx.Repo.Repository.NumIssues, form.IssueName, form.Labels, form.Content, false) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(200, "issue.CreateIssue", err) | ||||
| 		return | ||||
|   | ||||
| @@ -7,15 +7,15 @@ | ||||
|         <div class="col-md-3 filter-list"> | ||||
|             <ul class="list-unstyled"> | ||||
|                 <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="#">My Issues</a></li> | ||||
|                 <li><a href="#">Mentioned</a></li> --> | ||||
|             </ul> | ||||
|         </div> | ||||
|         <div class="col-md-9"> | ||||
|             <div class="filter-option"> | ||||
|                 <div class="btn-group"> | ||||
|                     <a class="btn btn-default active issue-open" href="#">{{.OpenCount}} Open</a> | ||||
|                     <a class="btn btn-default issue-close" href="#">{{.ClosedCount}} Closed</a> | ||||
|                     <a class="btn btn-default issue-open{{if not .IsShowClosed}} active{{end}}" href="/{{.RepositoryLink}}/issues">{{.OpenCount}} Open</a> | ||||
|                     <a class="btn btn-default issue-close{{if .IsShowClosed}} active{{end}}" href="/{{.RepositoryLink}}/issues?state=closed">{{.ClosedCount}} Closed</a> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <div class="issues list-group"> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user