diff --git a/README.md b/README.md index c708bf55c..b7396e5f4 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ More importantly, Gogs only needs one binary to setup your own project hosting o - User profile page. - Repository viewer. - Gravatar and cache support. -- Mail service(register). +- Mail service(register, issue). - Administration panel. - Supports MySQL, PostgreSQL and SQLite3(binary release only). diff --git a/README_ZH.md b/README_ZH.md index ee9c3b7c4..9c9f4b398 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -29,7 +29,7 @@ Gogs 完全使用 Go 语言来实现对 Git 数据的操作,实现 **零** 依 - 用户个人信息页面 - 仓库浏览器 - Gravatar 以及缓存支持 -- 邮件服务(注册) +- 邮件服务(注册、Issue) - 管理员面板 - 支持 MySQL、PostgreSQL 以及 SQLite3(仅限二进制版本) diff --git a/gogs.go b/gogs.go index d88a2bc6f..ba443c6e6 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.1.8.0326" +const APP_VER = "0.1.8.0326 Alpha" func init() { base.AppVer = APP_VER diff --git a/models/repo.go b/models/repo.go index 477f9472b..0ef049cc6 100644 --- a/models/repo.go +++ b/models/repo.go @@ -235,6 +235,18 @@ func initRepoCommit(tmpPath string, sig *git.Signature) (err error) { return nil } +func createHookUpdate(hookPath, content string) error { + pu, err := os.OpenFile(hookPath, os.O_CREATE|os.O_WRONLY, 0777) + if err != nil { + return err + } + defer pu.Close() + if _, err = pu.WriteString(content); err != nil { + return err + } + return nil +} + // InitRepository initializes README and .gitignore if needed. func initRepository(f string, user *User, repo *Repository, initReadme bool, repoLang, license string) error { repoPath := RepoPath(user.Name, repo.Name) @@ -245,13 +257,9 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep } // hook/post-update - pu, err := os.OpenFile(filepath.Join(repoPath, "hooks", "update"), os.O_CREATE|os.O_WRONLY, 0777) - if err != nil { - return err - } - defer pu.Close() - // TODO: Windows .bat - if _, err = pu.WriteString(fmt.Sprintf("#!/usr/bin/env bash\n%s update $1 $2 $3\n", appPath)); err != nil { + if err := createHookUpdate(filepath.Join(repoPath, "hooks", "update"), + fmt.Sprintf("#!/usr/bin/env bash\n%s update $1 $2 $3\n", + strings.Replace(appPath, "\\", "/", -1))); err != nil { return err } diff --git a/modules/avatar/avatar.go b/modules/avatar/avatar.go index 449c9656d..06e2c1385 100644 --- a/modules/avatar/avatar.go +++ b/modules/avatar/avatar.go @@ -9,7 +9,7 @@ It is recommend to use this way cacheDir := "./cache" defaultImg := "./default.jpg" - http.Handle("/avatar/", avatar.HttpHandler(cacheDir, defaultImg)) + http.Handle("/avatar/", avatar.CacheServer(cacheDir, defaultImg)) */ package avatar @@ -135,12 +135,12 @@ func (this *Avatar) UpdateTimeout(timeout time.Duration) error { return err } -type avatarHandler struct { +type service struct { cacheDir string altImage string } -func (this *avatarHandler) mustInt(r *http.Request, defaultValue int, keys ...string) int { +func (this *service) mustInt(r *http.Request, defaultValue int, keys ...string) int { var v int for _, k := range keys { if _, err := fmt.Sscanf(r.FormValue(k), "%d", &v); err == nil { @@ -150,7 +150,7 @@ func (this *avatarHandler) mustInt(r *http.Request, defaultValue int, keys ...st return defaultValue } -func (this *avatarHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { +func (this *service) ServeHTTP(w http.ResponseWriter, r *http.Request) { urlPath := r.URL.Path hash := urlPath[strings.LastIndex(urlPath, "/")+1:] size := this.mustInt(r, 80, "s", "size") // default size = 80*80 @@ -183,9 +183,9 @@ func (this *avatarHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } } -// http.Handle("/avatar/", avatar.HttpHandler("./cache")) -func HttpHandler(cacheDir string, defaultImgPath string) http.Handler { - return &avatarHandler{ +// http.Handle("/avatar/", avatar.CacheServer("./cache")) +func CacheServer(cacheDir string, defaultImgPath string) http.Handler { + return &service{ cacheDir: cacheDir, altImage: defaultImgPath, } diff --git a/modules/avatar/avatar_test.go b/modules/avatar/avatar_test.go index 4656d6f0f..0cbf70fe6 100644 --- a/modules/avatar/avatar_test.go +++ b/modules/avatar/avatar_test.go @@ -51,7 +51,7 @@ func TestFetchMany(t *testing.T) { // wget http://www.artsjournal.com/artfulmanager/wp/wp-content/uploads/2013/12/200x200xmirror_cat.jpg.pagespeed.ic.GOZSv6v1_H.jpg -O default.jpg /* func TestHttp(t *testing.T) { - http.Handle("/", avatar.HttpHandler("./", "default.jpg")) + http.Handle("/", avatar.CacheServer("./", "default.jpg")) http.ListenAndServe(":8001", nil) } */ diff --git a/modules/base/conf.go b/modules/base/conf.go index 0fb1ccdcf..2e5688393 100644 --- a/modules/base/conf.go +++ b/modules/base/conf.go @@ -80,7 +80,7 @@ func ExecDir() (string, error) { if err != nil { return "", err } - return path.Dir(p), nil + return path.Dir(strings.Replace(p, "\\", "/", -1)), nil } var logLevels = map[string]string{ diff --git a/update.go b/update.go index 5c6d5b28c..39729937e 100644 --- a/update.go +++ b/update.go @@ -5,18 +5,18 @@ package main import ( -"os" -"os/exec" -"strings" -"strconv" -"container/list" + "container/list" + "os" + "os/exec" + "strconv" + "strings" -"github.com/codegangsta/cli" -//"github.com/gogits/gogs/modules/log" -"github.com/gogits/gogs/models" -"github.com/gogits/gogs/modules/base" -"github.com/qiniu/log" -"github.com/gogits/git" + "github.com/codegangsta/cli" + //"github.com/gogits/gogs/modules/log" + "github.com/gogits/git" + "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/base" + "github.com/qiniu/log" ) var CmdUpdate = cli.Command{ @@ -103,7 +103,7 @@ func runUpdate(c *cli.Context) { // if a new branch if strings.HasPrefix(oldCommitId, "0000000") { l, err = ref.AllCommits() - + } else { l = ref.CommitsBetween(newCommit, oldCommit) } diff --git a/web.go b/web.go index 9b7b21639..9423c3eec 100644 --- a/web.go +++ b/web.go @@ -96,8 +96,8 @@ func runWeb(*cli.Context) { m.Get("/stars", reqSignIn, user.Stars) m.Get("/help", routers.Help) - avatarCache := avatar.HttpHandler("public/img/avatar/", "public/img/avatar_default.jpg") - m.Get("/avatar/:hash", avatarCache.ServeHTTP) + avt := avatar.CacheServer("public/img/avatar/", "public/img/avatar_default.jpg") + m.Get("/avatar/:hash", avt.ServeHTTP) m.Group("/user", func(r martini.Router) { r.Any("/login", binding.BindIgnErr(auth.LogInForm{}), user.SignIn)