From 48b2425c1d49560094b2935e6451d55cd5aa1f1a Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 16 Mar 2014 11:30:35 -0400 Subject: Push feed --- models/action.go | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'models') diff --git a/models/action.go b/models/action.go index ceee9997..978e805c 100644 --- a/models/action.go +++ b/models/action.go @@ -44,6 +44,10 @@ func (a Action) GetRepoName() string { return a.RepoName } +func (a Action) GetContent() string { + return a.Content +} + // CommitRepoAction records action for commit repository. func CommitRepoAction(userId int64, userName string, repoId int64, repoName string, commits [][]string) error { -- cgit v1.2.3 From 685631627e5c4db881160bfc9b39dc45143989f6 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 16 Mar 2014 23:43:22 -0400 Subject: Show branches in repo viewer --- README.md | 2 +- bee.json | 3 ++- models/repo2.go | 24 ++++++++++++++++++++---- routers/repo/single.go | 7 +++++++ templates/repo/single.tmpl | 18 ++++++++++-------- 5 files changed, 40 insertions(+), 14 deletions(-) (limited to 'models') diff --git a/README.md b/README.md index f4250a47..d0a0c205 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Gogs(Go Git Service) is a GitHub-like clone in the Go Programming Language. Since we choose to use pure Go implmentation of Git manipulation, Gogs certainly supports **ALL platforms** that Go supports, including Linux, Max OS X, and Windows with **ZERO** dependency. -##### Current version: 0.0.8 Alpha +##### Current version: 0.0.9 Alpha ## Purpose diff --git a/bee.json b/bee.json index de211f72..19efcbc2 100644 --- a/bee.json +++ b/bee.json @@ -12,7 +12,8 @@ "models": "", "others": [ "modules", - "$GOPATH/src/github.com/gogits/binding" + "$GOPATH/src/github.com/gogits/binding", + "$GOPATH/src/github.com/gogits/git" ] }, "cmd_args": [ diff --git a/models/repo2.go b/models/repo2.go index e3fdc278..a8dbc44d 100644 --- a/models/repo2.go +++ b/models/repo2.go @@ -8,7 +8,7 @@ import ( "path" "time" - git "github.com/gogits/git" + "github.com/gogits/git" ) type RepoFile struct { @@ -19,10 +19,26 @@ type RepoFile struct { Size int64 } -func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, error) { - f := RepoPath(userName, reposName) +func GetBranches(userName, reposName string) ([]string, error) { + repo, err := git.OpenRepository(RepoPath(userName, reposName)) + if err != nil { + return nil, err + } + + refs, err := repo.AllReferences() + if err != nil { + return nil, err + } + + brs := make([]string, len(refs)) + for i, ref := range refs { + brs[i] = ref.Name + } + return brs, nil +} - repo, err := git.OpenRepository(f) +func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, error) { + repo, err := git.OpenRepository(RepoPath(userName, reposName)) if err != nil { return nil, err } diff --git a/routers/repo/single.go b/routers/repo/single.go index 6bf03ca2..fd4d5290 100644 --- a/routers/repo/single.go +++ b/routers/repo/single.go @@ -33,6 +33,13 @@ func Single(ctx *middleware.Context, params martini.Params) { ctx.Data["Reponame"] = params["reponame"] ctx.Data["Branchname"] = params["branchname"] + brs, err := models.GetBranches(params["username"], params["reponame"]) + if err != nil { + ctx.Handle(200, "repo.Single", err) + return + } + ctx.Data["Branches"] = brs + var treenames []string Paths := make([]string, 0) diff --git a/templates/repo/single.tmpl b/templates/repo/single.tmpl index b5207d08..e1fb05bd 100644 --- a/templates/repo/single.tmpl +++ b/templates/repo/single.tmpl @@ -5,21 +5,23 @@
+ {{ $username := .Username}} + {{ $reponame := .Reponame}} + {{ $branchname := .Branchname}} + {{ $treenames := .Treenames}} + {{ $repoLink := .RepositoryLink}} + {{ $n := len $treenames}} {{$paths := .Paths}} - {{ $username := .Username}} - {{ $reponame := .Reponame}} - {{ $branchname := .Branchname}} - {{ $treenames := .Treenames}} - {{ $n := len $treenames}} {{ $l := Subtract $n 1}}
- Merge branch 'release/1.1.1' + {{.LatestCommit.Message}}
- slene authored 4 days ago + {{.LatestCommit.Author}} {{TimeSince .LatestCommit.Date}}
-- cgit v1.2.3 From 3a2eee08278a71320140129ec29c8586264d9968 Mon Sep 17 00:00:00 2001 From: slene Date: Mon, 17 Mar 2014 14:36:28 +0800 Subject: fix repo setting and delete repo --- models/repo.go | 3 ++ modules/auth/repo.go | 7 ----- routers/repo/repo.go | 54 +++++++++++++---------------------- routers/repo/single.go | 3 +- templates/repo/delete.tmpl | 12 -------- templates/repo/setting.tmpl | 68 ++++++++++++++++++++++++++++++++------------- web.go | 5 ++-- 7 files changed, 77 insertions(+), 75 deletions(-) delete mode 100644 templates/repo/delete.tmpl (limited to 'models') diff --git a/models/repo.go b/models/repo.go index cfca3583..3b35f497 100644 --- a/models/repo.go +++ b/models/repo.go @@ -307,6 +307,9 @@ func DeleteRepository(userId, repoId int64, userName string) (err error) { } session := orm.NewSession() + if err = session.Begin(); err != nil { + return err + } if _, err = session.Delete(&Repository{Id: repoId}); err != nil { session.Rollback() return err diff --git a/modules/auth/repo.go b/modules/auth/repo.go index ac1b6b69..2cc93744 100644 --- a/modules/auth/repo.go +++ b/modules/auth/repo.go @@ -17,7 +17,6 @@ import ( ) type CreateRepoForm struct { - UserId int64 `form:"userId"` RepoName string `form:"repo" binding:"Required;AlphaDash"` Visibility string `form:"visibility"` Description string `form:"desc" binding:"MaxSize(100)"` @@ -52,9 +51,3 @@ func (f *CreateRepoForm) Validate(errors *binding.Errors, req *http.Request, con validate(errors, data, f) } - -type DeleteRepoForm struct { - UserId int64 `form:"userId" binding:"Required"` - UserName string `form:"userName" binding:"Required"` - RepoId int64 `form:"repoId" binding:"Required"` -} diff --git a/routers/repo/repo.go b/routers/repo/repo.go index 116c199b..edd88627 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -20,49 +20,35 @@ func Create(ctx *middleware.Context, form auth.CreateRepoForm) { return } - if ctx.HasError() { - ctx.Render.HTML(200, "repo/create", ctx.Data) + if _, err := models.CreateRepository(ctx.User, + form.RepoName, form.Description, form.Language, form.License, + form.Visibility == "private", form.InitReadme == "on"); err == nil { + ctx.Render.Redirect("/"+ctx.User.Name+"/"+form.RepoName, 302) return - } - - // TODO: access check - - user, err := models.GetUserById(form.UserId) - if err != nil { - if err.Error() == models.ErrUserNotExist.Error() { - ctx.RenderWithErr("User does not exist", "repo/create", &form) - return - } - } - - if err == nil { - if _, err = models.CreateRepository(user, - form.RepoName, form.Description, form.Language, form.License, - form.Visibility == "private", form.InitReadme == "on"); err == nil { - ctx.Render.Redirect("/"+user.Name+"/"+form.RepoName, 302) - return - } - } - - if err.Error() == models.ErrRepoAlreadyExist.Error() { + } else if err == models.ErrRepoAlreadyExist { ctx.RenderWithErr("Repository name has already been used", "repo/create", &form) return } - - ctx.Handle(200, "repo.Create", err) } -func Delete(ctx *middleware.Context, form auth.DeleteRepoForm) { - ctx.Data["Title"] = "Delete repository" - - if ctx.Req.Method == "GET" { - ctx.Render.HTML(200, "repo/delete", ctx.Data) +func SettingPost(ctx *middleware.Context) { + if !ctx.Repo.IsOwner { + ctx.Render.Error(404) return } - if err := models.DeleteRepository(form.UserId, form.RepoId, form.UserName); err != nil { - ctx.Handle(200, "repo.Delete", err) - return + switch ctx.Query("action") { + case "delete": + if len(ctx.Repo.Repository.Name) == 0 || ctx.Repo.Repository.Name != ctx.Query("repository") { + ctx.Data["ErrorMsg"] = "Please make sure you entered repository name is correct." + ctx.Render.HTML(200, "repo/setting", ctx.Data) + return + } + + if err := models.DeleteRepository(ctx.User.Id, ctx.Repo.Repository.Id, ctx.User.LowerName); err != nil { + ctx.Handle(200, "repo.Delete", err) + return + } } ctx.Render.Redirect("/", 302) diff --git a/routers/repo/single.go b/routers/repo/single.go index c4189ad6..fdc4e6e7 100644 --- a/routers/repo/single.go +++ b/routers/repo/single.go @@ -65,7 +65,8 @@ func Single(ctx *middleware.Context, params martini.Params) { } func Setting(ctx *middleware.Context, params martini.Params) { - if !ctx.Repo.IsValid { + if !ctx.Repo.IsOwner { + ctx.Render.Error(404) return } diff --git a/templates/repo/delete.tmpl b/templates/repo/delete.tmpl deleted file mode 100644 index 0b95c3fb..00000000 --- a/templates/repo/delete.tmpl +++ /dev/null @@ -1,12 +0,0 @@ -{{template "base/head" .}} -{{template "base/navbar" .}} -
-
-
-
- -
-
- -
-{{template "base/footer" .}} \ No newline at end of file diff --git a/templates/repo/setting.tmpl b/templates/repo/setting.tmpl index 225e2294..06f0ed4d 100644 --- a/templates/repo/setting.tmpl +++ b/templates/repo/setting.tmpl @@ -4,30 +4,60 @@ {{template "repo/toolbar" .}}
-

Repository Settings

-
-
-

Repository Options

+
+ {{if .ErrorMsg}}

{{.ErrorMsg}}

{{end}} +
+
+ Repository Options +
+
+ +
-
-

Delete Repository

-

Unexpected bad things will happen if you don't read this!

-

This action CANNOT be undone. This will delete the repository, wiki, issues, and comments permanently.

+
+
+ Danger Zone +
+
+ +
+
Delete this repository.
+
Once you delete a repository, there is no going back. Please be certain.
+ -
- - - -
- - + +
diff --git a/web.go b/web.go index 16f39bdb..86ea8a5b 100644 --- a/web.go +++ b/web.go @@ -68,11 +68,12 @@ func runWeb(*cli.Context) { m.Get("/user/:username", middleware.SignInRequire(false), user.Profile) m.Any("/repo/create", middleware.SignInRequire(true), binding.BindIgnErr(auth.CreateRepoForm{}), repo.Create) - m.Any("/repo/delete", middleware.SignInRequire(true), binding.Bind(auth.DeleteRepoForm{}), repo.Delete) m.Get("/help", routers.Help) - m.Get("/:username/:reponame/settings", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Setting) + m.Post("/:username/:reponame/settings", middleware.SignInRequire(true), middleware.RepoAssignment(true), repo.SettingPost) + m.Get("/:username/:reponame/settings", middleware.SignInRequire(true), middleware.RepoAssignment(true), repo.Setting) + m.Get("/:username/:reponame/commits", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Commits) m.Get("/:username/:reponame/issues", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Issues) m.Get("/:username/:reponame/pulls", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Pulls) -- cgit v1.2.3 From 5bc2a1a6f98ae42ab5c30299d26082ffae54b859 Mon Sep 17 00:00:00 2001 From: slene Date: Mon, 17 Mar 2014 18:46:54 +0800 Subject: show readme.md --- models/repo2.go | 16 +++++++++++++++ modules/base/markdown.go | 39 +++++++++++++++++++++++++++++++++++ routers/repo/single.go | 51 +++++++++++++++++++++++++++++++++------------- templates/repo/single.tmpl | 12 ++++++++--- 4 files changed, 101 insertions(+), 17 deletions(-) create mode 100644 modules/base/markdown.go (limited to 'models') diff --git a/models/repo2.go b/models/repo2.go index 0c17a583..b31244b4 100644 --- a/models/repo2.go +++ b/models/repo2.go @@ -5,6 +5,7 @@ package models import ( + "fmt" "path" "strings" "time" @@ -22,12 +23,25 @@ type Commit struct { Message string } +var ( + ErrRepoFileNotLoaded = fmt.Errorf("repo file not loaded") +) + type RepoFile struct { *git.TreeEntry Path string Message string Created time.Time Size int64 + Repo *git.Repository +} + +func (file *RepoFile) LookupBlob() (*git.Blob, error) { + if file.Repo == nil { + return nil, ErrRepoFileNotLoaded + } + + return file.Repo.LookupBlob(file.Id) } func GetBranches(userName, reposName string) ([]string, error) { @@ -80,6 +94,7 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, lastCommit.Message(), lastCommit.Committer.When, size, + repo, }) case git.FileModeTree: repodirs = append(repodirs, &RepoFile{ @@ -88,6 +103,7 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, lastCommit.Message(), lastCommit.Committer.When, size, + repo, }) } } diff --git a/modules/base/markdown.go b/modules/base/markdown.go new file mode 100644 index 00000000..d170abe1 --- /dev/null +++ b/modules/base/markdown.go @@ -0,0 +1,39 @@ +// 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 base + +import ( + "github.com/slene/blackfriday" +) + +func RenderMarkdown(rawBytes []byte) []byte { + htmlFlags := 0 + htmlFlags |= blackfriday.HTML_USE_XHTML + // htmlFlags |= blackfriday.HTML_USE_SMARTYPANTS + // htmlFlags |= blackfriday.HTML_SMARTYPANTS_FRACTIONS + // htmlFlags |= blackfriday.HTML_SMARTYPANTS_LATEX_DASHES + htmlFlags |= blackfriday.HTML_SKIP_HTML + htmlFlags |= blackfriday.HTML_SKIP_STYLE + htmlFlags |= blackfriday.HTML_SKIP_SCRIPT + htmlFlags |= blackfriday.HTML_GITHUB_BLOCKCODE + htmlFlags |= blackfriday.HTML_OMIT_CONTENTS + htmlFlags |= blackfriday.HTML_COMPLETE_PAGE + renderer := blackfriday.HtmlRenderer(htmlFlags, "", "") + + // set up the parser + extensions := 0 + extensions |= blackfriday.EXTENSION_NO_INTRA_EMPHASIS + extensions |= blackfriday.EXTENSION_TABLES + extensions |= blackfriday.EXTENSION_FENCED_CODE + extensions |= blackfriday.EXTENSION_AUTOLINK + extensions |= blackfriday.EXTENSION_STRIKETHROUGH + extensions |= blackfriday.EXTENSION_HARD_LINE_BREAK + extensions |= blackfriday.EXTENSION_SPACE_HEADERS + extensions |= blackfriday.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK + + body := blackfriday.Markdown(rawBytes, renderer, extensions) + + return body +} diff --git a/routers/repo/single.go b/routers/repo/single.go index c144106c..f47a2f7b 100644 --- a/routers/repo/single.go +++ b/routers/repo/single.go @@ -8,9 +8,11 @@ import ( "strings" "github.com/codegangsta/martini" - // "github.com/slene/blackfriday" + + "github.com/gogits/git" "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/middleware" ) @@ -43,12 +45,14 @@ func Single(ctx *middleware.Context, params martini.Params) { params["branchname"] = "master" } - // Directory and file list. + // Get tree path treename := params["_1"] + + // Directory and file list. files, err := models.GetReposFiles(params["username"], params["reponame"], params["branchname"], treename) if err != nil { - ctx.Handle(200, "repo.Single", err) + ctx.Render.Error(404) return } ctx.Data["Username"] = params["username"] @@ -58,7 +62,7 @@ func Single(ctx *middleware.Context, params martini.Params) { // Branches. brs, err := models.GetBranches(params["username"], params["reponame"]) if err != nil { - ctx.Handle(200, "repo.Single", err) + ctx.Render.Error(404) return } ctx.Data["Branches"] = brs @@ -73,22 +77,41 @@ func Single(ctx *middleware.Context, params martini.Params) { } } - // Latest commit. + // Get latest commit according username and repo name commit, err := models.GetLastestCommit(params["username"], params["reponame"]) if err != nil { - ctx.Handle(200, "repo.Single", err) + ctx.Render.Error(404) return } ctx.Data["LatestCommit"] = commit - // README. - // for _, f := range files { - // if f.Name == "README.md" { - // ctx.Data["ReadmeName"] = "README.md" - // ctx.Data["ReadmeContent"] = - // break - // } - // } + var readmeFile *models.RepoFile + + for _, f := range files { + if !f.IsFile() { + continue + } + + if len(f.Name) < 6 { + continue + } + + if strings.ToLower(f.Name[:6]) == "readme" { + readmeFile = f + break + } + } + + if readmeFile != nil { + // if file large than 1M not show it + if readmeFile.Size > 1024*1024 || readmeFile.Filemode != git.FileModeBlob { + ctx.Data["FileIsLarge"] = true + } else if blob, err := readmeFile.LookupBlob(); err != nil { + ctx.Data["FileIsLarge"] = true + } else { + ctx.Data["ReadmeContent"] = string(base.RenderMarkdown(blob.Contents())) + } + } ctx.Data["Paths"] = Paths ctx.Data["Treenames"] = treenames diff --git a/templates/repo/single.tmpl b/templates/repo/single.tmpl index 153910f7..c22f129f 100644 --- a/templates/repo/single.tmpl +++ b/templates/repo/single.tmpl @@ -87,9 +87,15 @@
README.md
-
- markdown content -
+ {{if .FileIsLarge}} + + {{else}} +
+ {{.ReadmeContent|str2html}} +
+ {{end}}
-- cgit v1.2.3