From 272c27c8f20b20889571ed640538c6564beb62ed Mon Sep 17 00:00:00 2001 From: skyblue Date: Wed, 2 Apr 2014 08:14:56 +0800 Subject: add github social login, first step --- web.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'web.go') diff --git a/web.go b/web.go index cdec9232..48d80b4f 100644 --- a/web.go +++ b/web.go @@ -11,6 +11,8 @@ import ( "github.com/codegangsta/cli" "github.com/go-martini/martini" + "github.com/martini-contrib/oauth2" + "github.com/martini-contrib/sessions" "github.com/gogits/binding" @@ -58,6 +60,16 @@ func runWeb(*cli.Context) { // Middlewares. m.Use(middleware.Renderer(middleware.RenderOptions{Funcs: []template.FuncMap{base.TemplateFuncs}})) + scope := "https://api.github.com/user" + oauth2.PathCallback = "/oauth2callback" + m.Use(sessions.Sessions("my_session", sessions.NewCookieStore([]byte("secret123")))) + m.Use(oauth2.Github(&oauth2.Options{ + ClientId: "09383403ff2dc16daaa1", + ClientSecret: "5f6e7101d30b77952aab22b75eadae17551ea6b5", + RedirectURL: base.AppUrl + oauth2.PathCallback, + Scopes: []string{scope}, + })) + m.Use(middleware.InitContext()) reqSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true}) @@ -80,6 +92,7 @@ func runWeb(*cli.Context) { m.Get("/avatar/:hash", avt.ServeHTTP) m.Group("/user", func(r martini.Router) { + r.Any("/login/github", user.SocialSignIn) r.Any("/login", binding.BindIgnErr(auth.LogInForm{}), user.SignIn) r.Any("/sign_up", binding.BindIgnErr(auth.RegisterForm{}), user.SignUp) }, reqSignOut) -- cgit v1.2.3 From d9005ee970270bca97e81d59edca4722752d160d Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 2 Apr 2014 10:38:30 -0400 Subject: Improve issue mail content --- gogs.go | 2 +- models/repo.go | 1 + modules/mailer/mail.go | 11 +++++--- public/css/gogs.css | 4 +-- routers/repo/issue.go | 14 +++++++--- routers/user/user.go | 76 +++++++++++++++++++++++++------------------------- web.go | 24 ++++++++-------- 7 files changed, 71 insertions(+), 61 deletions(-) (limited to 'web.go') diff --git a/gogs.go b/gogs.go index a81f3ab5..88f53eeb 100644 --- a/gogs.go +++ b/gogs.go @@ -19,7 +19,7 @@ import ( // Test that go1.2 tag above is included in builds. main.go refers to this definition. const go12tag = true -const APP_VER = "0.2.0.0401 Alpha" +const APP_VER = "0.2.0.0402 Alpha" func init() { base.AppVer = APP_VER diff --git a/models/repo.go b/models/repo.go index 0c808f18..8dd7da23 100644 --- a/models/repo.go +++ b/models/repo.go @@ -513,6 +513,7 @@ func NotifyWatchers(act *Action) error { continue } + act.Id = 0 act.UserId = watches[i].UserId if _, err = orm.InsertOne(act); err != nil { return errors.New("repo.NotifyWatchers(create action): " + err.Error()) diff --git a/modules/mailer/mail.go b/modules/mailer/mail.go index d0decbe0..b99fc8fd 100644 --- a/modules/mailer/mail.go +++ b/modules/mailer/mail.go @@ -92,8 +92,8 @@ func SendActiveMail(r *middleware.Render, user *models.User) { } // SendNotifyMail sends mail notification of all watchers. -func SendNotifyMail(userId, repoId int64, userName, repoName, subject, content string) error { - watches, err := models.GetWatches(repoId) +func SendNotifyMail(user, owner *models.User, repo *models.Repository, issue *models.Issue) error { + watches, err := models.GetWatches(repo.Id) if err != nil { return errors.New("mail.NotifyWatchers(get watches): " + err.Error()) } @@ -101,7 +101,7 @@ func SendNotifyMail(userId, repoId int64, userName, repoName, subject, content s tos := make([]string, 0, len(watches)) for i := range watches { uid := watches[i].UserId - if userId == uid { + if user.Id == uid { continue } u, err := models.GetUserById(uid) @@ -115,7 +115,10 @@ func SendNotifyMail(userId, repoId int64, userName, repoName, subject, content s return nil } - msg := NewMailMessageFrom(tos, userName, subject, content) + subject := fmt.Sprintf("[%s] %s", repo.Name, issue.Name) + content := fmt.Sprintf("%s
-
View it on Gogs.", + issue.Content, base.AppUrl, owner.Name, repo.Name, issue.Index) + msg := NewMailMessageFrom(tos, user.Name, subject, content) msg.Info = fmt.Sprintf("Subject: %s, send notify emails", subject) SendAsync(&msg) return nil diff --git a/public/css/gogs.css b/public/css/gogs.css index a018a9db..6bed7711 100755 --- a/public/css/gogs.css +++ b/public/css/gogs.css @@ -1235,9 +1235,9 @@ html, body { /* admin dashboard/configuration */ .admin-dl-horizontal > dt { - width: 320px; + width: 220px; } .admin-dl-horizontal > dd { - margin-left: 340px; + margin-left: 240px; } diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 6cad2c25..41b2c7e9 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -31,7 +31,8 @@ func Issues(ctx *middleware.Context) { ctx.Data["IssueCreatedCount"] = 0 var posterId int64 = 0 - if ctx.Query("type") == "created_by" { + isCreatedBy := ctx.Query("type") == "created_by" + if isCreatedBy { if !ctx.IsSigned { ctx.SetCookie("redirect_to", "/"+url.QueryEscape(ctx.Req.RequestURI)) ctx.Redirect("/user/login/", 302) @@ -53,6 +54,7 @@ func Issues(ctx *middleware.Context) { } var createdByCount int + showIssues := make([]models.Issue, 0, len(issues)) // Get posters. for i := range issues { u, err := models.GetUserById(issues[i].PosterId) @@ -60,13 +62,17 @@ func Issues(ctx *middleware.Context) { ctx.Handle(200, "issue.Issues(get poster): %v", err) return } - issues[i].Poster = u + if isCreatedBy && u.Id != posterId { + continue + } if u.Id == posterId { createdByCount++ } + issues[i].Poster = u + showIssues = append(showIssues, issues[i]) } - ctx.Data["Issues"] = issues + ctx.Data["Issues"] = showIssues 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 @@ -107,7 +113,7 @@ func CreateIssue(ctx *middleware.Context, params martini.Params, form auth.Creat // Mail watchers. if base.Service.NotifyMail { - if err = mailer.SendNotifyMail(ctx.User.Id, ctx.Repo.Repository.Id, ctx.User.Name, ctx.Repo.Repository.Name, issue.Name, issue.Content); err != nil { + if err = mailer.SendNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue); err != nil { ctx.Handle(200, "issue.CreateIssue", err) return } diff --git a/routers/user/user.go b/routers/user/user.go index 5890983b..c008a05c 100644 --- a/routers/user/user.go +++ b/routers/user/user.go @@ -5,14 +5,14 @@ package user import ( - "encoding/json" + // "encoding/json" "fmt" "net/url" "strings" - "code.google.com/p/goauth2/oauth" + // "code.google.com/p/goauth2/oauth" "github.com/go-martini/martini" - "github.com/martini-contrib/oauth2" + // "github.com/martini-contrib/oauth2" "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/auth" @@ -78,41 +78,41 @@ func Profile(ctx *middleware.Context, params martini.Params) { } // github && google && ... -func SocialSignIn(tokens oauth2.Tokens) { - transport := &oauth.Transport{} - transport.Token = &oauth.Token{ - AccessToken: tokens.Access(), - RefreshToken: tokens.Refresh(), - Expiry: tokens.ExpiryTime(), - Extra: tokens.ExtraData(), - } - - // Github API refer: https://developer.github.com/v3/users/ - // FIXME: need to judge url - type GithubUser struct { - Id int `json:"id"` - Name string `json:"login"` - Email string `json:"email"` - } - - // Make the request. - scope := "https://api.github.com/user" - r, err := transport.Client().Get(scope) - if err != nil { - log.Error("connect with github error: %s", err) - // FIXME: handle error page - return - } - defer r.Body.Close() - - user := &GithubUser{} - err = json.NewDecoder(r.Body).Decode(user) - if err != nil { - log.Error("Get: %s", err) - } - log.Info("login: %s", user.Name) - // FIXME: login here, user email to check auth, if not registe, then generate a uniq username -} +// func SocialSignIn(tokens oauth2.Tokens) { +// transport := &oauth.Transport{} +// transport.Token = &oauth.Token{ +// AccessToken: tokens.Access(), +// RefreshToken: tokens.Refresh(), +// Expiry: tokens.ExpiryTime(), +// Extra: tokens.ExtraData(), +// } + +// // Github API refer: https://developer.github.com/v3/users/ +// // FIXME: need to judge url +// type GithubUser struct { +// Id int `json:"id"` +// Name string `json:"login"` +// Email string `json:"email"` +// } + +// // Make the request. +// scope := "https://api.github.com/user" +// r, err := transport.Client().Get(scope) +// if err != nil { +// log.Error("connect with github error: %s", err) +// // FIXME: handle error page +// return +// } +// defer r.Body.Close() + +// user := &GithubUser{} +// err = json.NewDecoder(r.Body).Decode(user) +// if err != nil { +// log.Error("Get: %s", err) +// } +// log.Info("login: %s", user.Name) +// // FIXME: login here, user email to check auth, if not registe, then generate a uniq username +// } func SignIn(ctx *middleware.Context, form auth.LogInForm) { ctx.Data["Title"] = "Log In" diff --git a/web.go b/web.go index 48d80b4f..ececd6c2 100644 --- a/web.go +++ b/web.go @@ -11,8 +11,8 @@ import ( "github.com/codegangsta/cli" "github.com/go-martini/martini" - "github.com/martini-contrib/oauth2" - "github.com/martini-contrib/sessions" + // "github.com/martini-contrib/oauth2" + // "github.com/martini-contrib/sessions" "github.com/gogits/binding" @@ -60,15 +60,15 @@ func runWeb(*cli.Context) { // Middlewares. m.Use(middleware.Renderer(middleware.RenderOptions{Funcs: []template.FuncMap{base.TemplateFuncs}})) - scope := "https://api.github.com/user" - oauth2.PathCallback = "/oauth2callback" - m.Use(sessions.Sessions("my_session", sessions.NewCookieStore([]byte("secret123")))) - m.Use(oauth2.Github(&oauth2.Options{ - ClientId: "09383403ff2dc16daaa1", - ClientSecret: "5f6e7101d30b77952aab22b75eadae17551ea6b5", - RedirectURL: base.AppUrl + oauth2.PathCallback, - Scopes: []string{scope}, - })) + // scope := "https://api.github.com/user" + // oauth2.PathCallback = "/oauth2callback" + // m.Use(sessions.Sessions("my_session", sessions.NewCookieStore([]byte("secret123")))) + // m.Use(oauth2.Github(&oauth2.Options{ + // ClientId: "09383403ff2dc16daaa1", + // ClientSecret: "5f6e7101d30b77952aab22b75eadae17551ea6b5", + // RedirectURL: base.AppUrl + oauth2.PathCallback, + // Scopes: []string{scope}, + // })) m.Use(middleware.InitContext()) @@ -92,7 +92,7 @@ func runWeb(*cli.Context) { m.Get("/avatar/:hash", avt.ServeHTTP) m.Group("/user", func(r martini.Router) { - r.Any("/login/github", user.SocialSignIn) + // r.Any("/login/github", user.SocialSignIn) r.Any("/login", binding.BindIgnErr(auth.LogInForm{}), user.SignIn) r.Any("/sign_up", binding.BindIgnErr(auth.RegisterForm{}), user.SignUp) }, reqSignOut) -- cgit v1.2.3 From db66b8da7227f7fd3ff9a8d7ccece0c3e31ea3d0 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 2 Apr 2014 12:43:31 -0400 Subject: Add release tmpl --- models/git.go | 19 +++++++++++++++++++ models/repo.go | 1 + modules/middleware/repo.go | 1 + routers/repo/issue.go | 2 +- routers/repo/release.go | 22 ++++++++++++++++++++++ templates/release/list.tmpl | 10 ++++++++++ templates/repo/toolbar.tmpl | 11 ++++------- web.go | 1 + 8 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 routers/repo/release.go create mode 100644 templates/release/list.tmpl (limited to 'web.go') diff --git a/models/git.go b/models/git.go index d3bad6e0..46345d0f 100644 --- a/models/git.go +++ b/models/git.go @@ -56,6 +56,25 @@ func GetBranches(userName, repoName string) ([]string, error) { return brs, nil } +// GetTags returns all tags of given repository. +func GetTags(userName, repoName string) ([]string, error) { + repo, err := git.OpenRepository(RepoPath(userName, repoName)) + if err != nil { + return nil, err + } + + refs, err := repo.AllTags() + if err != nil { + return nil, err + } + + tags := make([]string, len(refs)) + for i, ref := range refs { + tags[i] = ref.Name + } + return tags, nil +} + func IsBranchExist(userName, repoName, branchName string) bool { repo, err := git.OpenRepository(RepoPath(userName, repoName)) if err != nil { diff --git a/models/repo.go b/models/repo.go index 8dd7da23..e3270b18 100644 --- a/models/repo.go +++ b/models/repo.go @@ -74,6 +74,7 @@ type Repository struct { NumStars int NumForks int NumIssues int + NumReleases int `xorm:"NOT NULL"` NumClosedIssues int NumOpenIssues int `xorm:"-"` IsPrivate bool diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go index f446d6a8..2139742c 100644 --- a/modules/middleware/repo.go +++ b/modules/middleware/repo.go @@ -79,6 +79,7 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { ctx.Handle(404, "RepoAssignment", err) return } + repo.NumOpenIssues = repo.NumIssues - repo.NumClosedIssues ctx.Repo.Repository = repo ctx.Data["IsBareRepo"] = ctx.Repo.Repository.IsBare diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 41b2c7e9..be925426 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -74,7 +74,7 @@ func Issues(ctx *middleware.Context) { ctx.Data["Issues"] = showIssues ctx.Data["IssueCount"] = ctx.Repo.Repository.NumIssues - ctx.Data["OpenCount"] = ctx.Repo.Repository.NumIssues - ctx.Repo.Repository.NumClosedIssues + ctx.Data["OpenCount"] = ctx.Repo.Repository.NumOpenIssues ctx.Data["ClosedCount"] = ctx.Repo.Repository.NumClosedIssues ctx.Data["IssueCreatedCount"] = createdByCount ctx.Data["IsShowClosed"] = ctx.Query("state") == "closed" diff --git a/routers/repo/release.go b/routers/repo/release.go new file mode 100644 index 00000000..8e8b93c9 --- /dev/null +++ b/routers/repo/release.go @@ -0,0 +1,22 @@ +// Copyright 2014 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package repo + +import ( + "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/middleware" +) + +func Releases(ctx *middleware.Context) { + ctx.Data["Title"] = "Releases" + ctx.Data["IsRepoToolbarReleases"] = true + tags, err := models.GetTags(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) + if err != nil { + ctx.Handle(404, "repo.Releases(GetTags)", err) + return + } + ctx.Data["Releases"] = tags + ctx.HTML(200, "release/list") +} diff --git a/templates/release/list.tmpl b/templates/release/list.tmpl new file mode 100644 index 00000000..7d582e3f --- /dev/null +++ b/templates/release/list.tmpl @@ -0,0 +1,10 @@ +{{template "base/head" .}} +{{template "base/navbar" .}} +{{template "repo/nav" .}} +{{template "repo/toolbar" .}} +
+ {{range .Releases}} + {{.}} + {{end}} +
+{{template "base/footer" .}} \ No newline at end of file diff --git a/templates/repo/toolbar.tmpl b/templates/repo/toolbar.tmpl index 6b48ecf5..08167ef8 100644 --- a/templates/repo/toolbar.tmpl +++ b/templates/repo/toolbar.tmpl @@ -8,18 +8,15 @@
  • Commits
  • -
  • Issues
  • +
  • {{if .Repository.NumOpenIssues}}{{.Repository.NumOpenIssues}} {{end}}Issues
  • {{if .IsRepoToolbarIssues}} -
  • {{if .IsRepoToolbarIssuesList}} - - {{else}} - - {{end}}
  • +
  • {{if .IsRepoToolbarIssuesList}} + {{else}}{{end}}
  • {{end}} +
  • {{if .Repository.NumReleases}}{{.Repository.NumReleases}} {{end}}Releases
  • {{end}} diff --git a/web.go b/web.go index ececd6c2..5fc3350f 100644 --- a/web.go +++ b/web.go @@ -147,6 +147,7 @@ func runWeb(*cli.Context) { m.Group("/:username/:reponame", func(r martini.Router) { r.Get("/issues", repo.Issues) r.Get("/issues/:index", repo.ViewIssue) + r.Get("/releases", repo.Releases) r.Get("/pulls", repo.Pulls) r.Get("/branches", repo.Branches) }, ignSignIn, middleware.RepoAssignment(true)) -- cgit v1.2.3