From d0f887a1edf3937a495c54d9a345a36018041b79 Mon Sep 17 00:00:00 2001 From: Steven Pav Date: Fri, 25 Apr 2014 15:21:48 -0700 Subject: [PATCH 01/13] explicitly install sudo ```deploy.sh``` in the docker container requires ```sudo```; this should resolve #127. --- dockerfiles/images/gogits/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/images/gogits/Dockerfile b/dockerfiles/images/gogits/Dockerfile index 25d1dd5e5..7f1514efe 100644 --- a/dockerfiles/images/gogits/Dockerfile +++ b/dockerfiles/images/gogits/Dockerfile @@ -13,7 +13,7 @@ ENV GOROOT /usr/local/go ENV GOPATH /go RUN apt-get update && apt-get install --yes --force-yes curl git mercurial zip wget ca-certificates build-essential -RUN apt-get install -yq vim +RUN apt-get install -yq vim sudo RUN curl -s http://docker.u.qiniudn.com/go1.2.1.src.tar.gz | tar -v -C /usr/local -xz RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1 From 1b734501bdbec3a0ff04458944683eae0990d9ae Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 26 Apr 2014 14:14:48 +0800 Subject: [PATCH 02/13] bug fixed --- modules/base/conf.go | 8 ++++---- serve.go | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/base/conf.go b/modules/base/conf.go index 572450450..04c124577 100644 --- a/modules/base/conf.go +++ b/modules/base/conf.go @@ -316,7 +316,7 @@ func NewConfigContext() { // load LDAP authentication configuration if present LdapAuth = Cfg.MustBool("security", "LDAP_AUTH", false) if LdapAuth { - log.Debug("LDAP AUTHENTICATION activated") + qlog.Debug("LDAP AUTHENTICATION activated") nbsrc := 0 for _, v := range Cfg.GetSectionList() { if matched, _ := regexp.MatchString("(?i)^LDAPSOURCE.*", v); matched { @@ -329,15 +329,15 @@ func NewConfigContext() { ldapmsadsaformat := Cfg.MustValue(v, "MSADSAFORMAT", "%s") ldap.AddSource(ldapname, ldaphost, ldapport, ldapbasedn, ldapattribute, ldapfilter, ldapmsadsaformat) nbsrc += 1 - log.Debug("%s added as LDAP source", ldapname) + qlog.Debug("%s added as LDAP source", ldapname) } } if nbsrc == 0 { - log.Debug("No valide LDAP found, LDAP AUTHENTICATION NOT activated") + qlog.Debug("No valide LDAP found, LDAP AUTHENTICATION NOT activated") LdapAuth = false } } else { - log.Debug("LDAP AUTHENTICATION NOT activated") + qlog.Debug("LDAP AUTHENTICATION NOT activated") } PictureService = Cfg.MustValue("picture", "SERVICE") diff --git a/serve.go b/serve.go index 7f8c267c7..e3197a23d 100644 --- a/serve.go +++ b/serve.go @@ -53,6 +53,7 @@ func newLogger(execDir string) { } qlog.SetOutput(f) + //qlog.SetOutputLevel(qlog.Ldebug) qlog.Info("Start logging serv...") } From 9dfb7de3715c11e9569de62cd03b7787e58d0d91 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 26 Apr 2014 01:22:22 -0600 Subject: [PATCH 03/13] Fix #102 --- README.md | 5 ++ README_ZH.md | 6 +++ doc/install_gogs_from_binary_on_ubuntu.md | 4 +- gogs.go | 2 +- modules/base/conf.go | 58 ++++++++++++----------- 5 files changed, 45 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 038780721..d188508ec 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,11 @@ More importantly, Gogs only needs one binary to setup your own project hosting o - Supports MySQL, PostgreSQL and SQLite3. - Social account login(GitHub, Google, QQ, Weibo) +## System Requirements + +- A cheap Raspberry Pi is powerful enough to match the minimal requirement. +- 4 CPU Cores and 1GB RAM would be the baseline for teamwork. + ## Installation Make sure you install [Prerequirements](https://github.com/gogits/gogs/wiki/Prerequirements) first. diff --git a/README_ZH.md b/README_ZH.md index 6d7553a68..bbf461ddf 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -33,6 +33,12 @@ Gogs 完全使用 Go 语言来实现对 Git 数据的操作,实现 **零** 依 - 支持 MySQL、PostgreSQL 以及 SQLite3 数据库 - 社交帐号登录(GitHub、Google、QQ、微博) +## 系统要求 + +- 最低的系统硬件要求为一个廉价的树莓派 +- 如果用于团队项目,建议使用 4 核 CPU 及 1GB 内存 + + ## 安装部署 在安装 Gogs 之前,您需要先安装 [基本环境](https://github.com/gogits/gogs/wiki/Prerequirements)。 diff --git a/doc/install_gogs_from_binary_on_ubuntu.md b/doc/install_gogs_from_binary_on_ubuntu.md index 6d004106c..3b406b364 100644 --- a/doc/install_gogs_from_binary_on_ubuntu.md +++ b/doc/install_gogs_from_binary_on_ubuntu.md @@ -18,8 +18,8 @@ ### install the gogs - mkdir gogs - cd gogs -- curl -L http://gobuild.io/github.com/gogits/gogs/v0.2.0/linux/amd64 -o v0.2.0.zip -- unzip v0.2.0.zip +- curl -L http://gobuild.io/github.com/gogits/gogs/v0.3.0/linux/amd64 -o v0.3.0.zip +- unzip v0.3.0.zip - ./start.sh > The up-to-date binary could be found at diff --git a/gogs.go b/gogs.go index b06c80064..caa8cf63d 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.3.0.0422 Alpha" +const APP_VER = "0.3.0.0426 Alpha" func init() { base.AppVer = APP_VER diff --git a/modules/base/conf.go b/modules/base/conf.go index 04c124577..e89c67bc1 100644 --- a/modules/base/conf.go +++ b/modules/base/conf.go @@ -178,6 +178,36 @@ func newLogService() { log.Info("Log Mode: %s(%s)", strings.Title(LogMode), levelName) } +func newLdapService() { + LdapAuth = Cfg.MustBool("security", "LDAP_AUTH", false) + if !LdapAuth { + return + } + + nbsrc := 0 + for _, v := range Cfg.GetSectionList() { + if matched, _ := regexp.MatchString("(?i)^LDAPSOURCE.*", v); matched { + ldapname := Cfg.MustValue(v, "name", v) + ldaphost := Cfg.MustValue(v, "host") + ldapport := Cfg.MustInt(v, "port", 389) + ldapbasedn := Cfg.MustValue(v, "basedn", "dc=*,dc=*") + ldapattribute := Cfg.MustValue(v, "attribute", "mail") + ldapfilter := Cfg.MustValue(v, "filter", "(*)") + ldapmsadsaformat := Cfg.MustValue(v, "MSADSAFORMAT", "%s") + ldap.AddSource(ldapname, ldaphost, ldapport, ldapbasedn, ldapattribute, ldapfilter, ldapmsadsaformat) + nbsrc++ + log.Debug("%s added as LDAP source", ldapname) + } + } + if nbsrc == 0 { + log.Warn("No valide LDAP found, LDAP Authentication NOT enabled") + LdapAuth = false + return + } + + log.Info("LDAP Authentication Enabled") +} + func newCacheService() { CacheAdapter = Cfg.MustValue("cache", "ADAPTER", "memory") if EnableRedis { @@ -313,33 +343,6 @@ func NewConfigContext() { CookieUserName = Cfg.MustValue("security", "COOKIE_USERNAME") CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME") - // load LDAP authentication configuration if present - LdapAuth = Cfg.MustBool("security", "LDAP_AUTH", false) - if LdapAuth { - qlog.Debug("LDAP AUTHENTICATION activated") - nbsrc := 0 - for _, v := range Cfg.GetSectionList() { - if matched, _ := regexp.MatchString("(?i)^LDAPSOURCE.*", v); matched { - ldapname := Cfg.MustValue(v, "name", v) - ldaphost := Cfg.MustValue(v, "host") - ldapport := Cfg.MustInt(v, "port", 389) - ldapbasedn := Cfg.MustValue(v, "basedn", "dc=*,dc=*") - ldapattribute := Cfg.MustValue(v, "attribute", "mail") - ldapfilter := Cfg.MustValue(v, "filter", "(*)") - ldapmsadsaformat := Cfg.MustValue(v, "MSADSAFORMAT", "%s") - ldap.AddSource(ldapname, ldaphost, ldapport, ldapbasedn, ldapattribute, ldapfilter, ldapmsadsaformat) - nbsrc += 1 - qlog.Debug("%s added as LDAP source", ldapname) - } - } - if nbsrc == 0 { - qlog.Debug("No valide LDAP found, LDAP AUTHENTICATION NOT activated") - LdapAuth = false - } - } else { - qlog.Debug("LDAP AUTHENTICATION NOT activated") - } - PictureService = Cfg.MustValue("picture", "SERVICE") // Determine and create root git reposiroty path. @@ -357,6 +360,7 @@ func NewConfigContext() { func NewBaseServices() { newService() newLogService() + newLdapService() newCacheService() newSessionService() newMailService() From cfa09681919f9075063e8f8d84ee8bab20108791 Mon Sep 17 00:00:00 2001 From: fundon Date: Sun, 27 Apr 2014 01:55:22 +0800 Subject: [PATCH 04/13] Fixed codename match issue, when using `FROM ubuntu` wil be pulled latest image --- dockerfiles/images/postgres/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockerfiles/images/postgres/Dockerfile b/dockerfiles/images/postgres/Dockerfile index 44e82b7d8..0188dd78f 100644 --- a/dockerfiles/images/postgres/Dockerfile +++ b/dockerfiles/images/postgres/Dockerfile @@ -9,7 +9,8 @@ RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys B97B0AFCAA # Add PostgreSQL's repository. It contains the most recent stable release # of PostgreSQL, ``9.3``. -RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list +# See http://apt.postgresql.org/pub/repos/apt/README +RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list # Update the Ubuntu and PostgreSQL repository indexes RUN apt-get update From 1badb2bbccfe81303f69f8dedf57c22fb89d4b99 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 26 Apr 2014 19:06:59 -0600 Subject: [PATCH 05/13] Fix #107 --- models/repo.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/models/repo.go b/models/repo.go index 2011ed7de..245717437 100644 --- a/models/repo.go +++ b/models/repo.go @@ -403,10 +403,11 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep return err } + rp := strings.NewReplacer("\\", "/", " ", "\\ ") // hook/post-update if err := createHookUpdate(filepath.Join(repoPath, "hooks", "update"), fmt.Sprintf("#!/usr/bin/env %s\n%s update $1 $2 $3\n", base.ScriptType, - strings.Replace(appPath, "\\", "/", -1))); err != nil { + rp.Replace(appPath))); err != nil { return err } From 59d0e73c3507296b31c8e741b44afc7bfe1eb695 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 26 Apr 2014 22:34:48 -0600 Subject: [PATCH 06/13] Batch mirror fix --- .gopmfile | 1 + CONTRIBUTING.md | 2 ++ modules/base/conf.go | 8 +++--- modules/middleware/repo.go | 7 +++-- public/js/app.js | 4 +-- routers/install.go | 16 +++++++++++- routers/user/user.go | 8 +++--- templates/base/footer.tmpl | 5 +++- templates/install.tmpl | 13 +++++----- templates/repo/single_file.tmpl | 45 +++++++++++++++++---------------- tests/.travel.yml | 9 ------- tests/README.md | 13 ---------- tests/default_test.go | 17 ------------- 13 files changed, 68 insertions(+), 80 deletions(-) delete mode 100644 tests/.travel.yml delete mode 100644 tests/README.md delete mode 100644 tests/default_test.go diff --git a/.gopmfile b/.gopmfile index 296d02367..c58f4299d 100644 --- a/.gopmfile +++ b/.gopmfile @@ -19,6 +19,7 @@ github.com/lib/pq = github.com/nfnt/resize = github.com/qiniu/log = github.com/robfig/cron = +github.com/juju2013/goldap = [res] include = templates|public|conf diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cfc6c14f2..6cc88515f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,6 +10,8 @@ Want to hack on Gogs? Awesome! Here are instructions to get you started. They ar ### Pull requests are always welcome +**ALL PULL REQUESTS MUST SEND TO `DEV` BRANCH** + We are always thrilled to receive pull requests, and do our best to process them as fast as possible. Not sure if that typo is worth a pull request? Do it! We will appreciate it. If your pull request is not accepted on the first try, don't be discouraged! If there's a problem with the implementation, hopefully you received feedback on what to improve. diff --git a/modules/base/conf.go b/modules/base/conf.go index 9a9adfdac..17b55316a 100644 --- a/modules/base/conf.go +++ b/modules/base/conf.go @@ -53,7 +53,6 @@ var ( Domain string SecretKey string RunUser string - LdapAuth bool RepoRootPath string ScriptType string @@ -93,6 +92,7 @@ var Service struct { NotifyMail bool ActiveCodeLives int ResetPwdCodeLives int + LdapAuth bool } func ExecDir() (string, error) { @@ -179,8 +179,8 @@ func newLogService() { } func newLdapService() { - LdapAuth = Cfg.MustBool("security", "LDAP_AUTH", false) - if !LdapAuth { + Service.LdapAuth = Cfg.MustBool("security", "LDAP_AUTH", false) + if !Service.LdapAuth { return } @@ -201,7 +201,7 @@ func newLdapService() { } if nbsrc == 0 { log.Warn("No valide LDAP found, LDAP Authentication NOT enabled") - LdapAuth = false + Service.LdapAuth = false return } diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go index 34144fe3d..2d2778cb0 100644 --- a/modules/middleware/repo.go +++ b/modules/middleware/repo.go @@ -26,11 +26,14 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { var displayBare bool if len(args) >= 1 { - validBranch = args[0] + // Note: argument has wrong value in Go1.3 martini. + // validBranch = args[0] + validBranch = true } if len(args) >= 2 { - displayBare = args[1] + // displayBare = args[1] + displayBare = true } var ( diff --git a/public/js/app.js b/public/js/app.js index a5c79a398..b7b5deb83 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -470,10 +470,10 @@ function initInstall() { (function () { $('#install-database').on("change", function () { var val = $(this).val(); - if (val != "sqlite") { + if (val != "SQLite3") { $('.server-sql').show(); $('.sqlite-setting').addClass("hide"); - if (val == "pgsql") { + if (val == "PostgreSQL") { $('.pgsql-setting').removeClass("hide"); } else { $('.pgsql-setting').addClass("hide"); diff --git a/routers/install.go b/routers/install.go index 12182ad30..8ffa9b5d1 100644 --- a/routers/install.go +++ b/routers/install.go @@ -65,6 +65,10 @@ func GlobalInit() { checkRunMode() } +func renderDbOption(ctx *middleware.Context) { + ctx.Data["DbOptions"] = []string{"MySQL", "PostgreSQL", "SQLite3"} +} + func Install(ctx *middleware.Context, form auth.InstallForm) { if base.InstallLock { ctx.Handle(404, "install.Install", errors.New("Installation is prohibited")) @@ -104,6 +108,13 @@ func Install(ctx *middleware.Context, form auth.InstallForm) { form.AppUrl = base.AppUrl } + renderDbOption(ctx) + curDbValue := "" + if models.EnableSQLite3 { + curDbValue = "SQLite3" // Default when enabled. + } + ctx.Data["CurDbValue"] = curDbValue + auth.AssignForm(form, ctx.Data) ctx.HTML(200, "install") } @@ -117,6 +128,9 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) { ctx.Data["Title"] = "Install" ctx.Data["PageIsInstall"] = true + renderDbOption(ctx) + ctx.Data["CurDbValue"] = form.Database + if ctx.HasError() { ctx.HTML(200, "install") return @@ -129,7 +143,7 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) { // Pass basic check, now test configuration. // Test database setting. - dbTypes := map[string]string{"mysql": "mysql", "pgsql": "postgres", "sqlite": "sqlite3"} + dbTypes := map[string]string{"MySQL": "mysql", "PostgreSQL": "postgres", "SQLite3": "sqlite3"} models.DbCfg.Type = dbTypes[form.Database] models.DbCfg.Host = form.Host models.DbCfg.User = form.User diff --git a/routers/user/user.go b/routers/user/user.go index 75314237d..fe53896e4 100644 --- a/routers/user/user.go +++ b/routers/user/user.go @@ -91,12 +91,14 @@ func SignInPost(ctx *middleware.Context, form auth.LogInForm) { var user *models.User var err error - // try to login against LDAP if defined - if base.LdapAuth { + if base.Service.LdapAuth { user, err = models.LoginUserLdap(form.UserName, form.Password) + if err != nil { + log.Error("Fail to login through LDAP: %v", err) + } } // try local if not LDAP or it's failed - if (!base.LdapAuth) || (err != nil) { + if !base.Service.LdapAuth || err != nil { user, err = models.LoginUserPlain(form.UserName, form.Password) } if err != nil { diff --git a/templates/base/footer.tmpl b/templates/base/footer.tmpl index 6c2da63e5..30f068913 100644 --- a/templates/base/footer.tmpl +++ b/templates/base/footer.tmpl @@ -13,7 +13,10 @@
-

+ +
+

+
diff --git a/templates/install.tmpl b/templates/install.tmpl index 2ed7e569d..8fe678e50 100644 --- a/templates/install.tmpl +++ b/templates/install.tmpl @@ -9,14 +9,15 @@
-
+
@@ -49,7 +50,7 @@
-
+
From 41b0a7b97c2cc1ffd8751fd12690642968961d0e Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 27 Apr 2014 17:01:39 -0400 Subject: [PATCH 10/13] Mirror fix on public key --- models/publickey.go | 14 +++++++------- routers/user/setting.go | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/models/publickey.go b/models/publickey.go index ed47ff209..b80412812 100644 --- a/models/publickey.go +++ b/models/publickey.go @@ -77,12 +77,12 @@ func init() { // PublicKey represents a SSH key of user. type PublicKey struct { Id int64 - OwnerId int64 `xorm:"unique(s) index not null"` - Name string `xorm:"unique(s) not null"` + OwnerId int64 `xorm:"UNIQUE(s) INDEX NOT NULL"` + Name string `xorm:"UNIQUE(s) NOT NULL"` Fingerprint string - Content string `xorm:"TEXT not null"` - Created time.Time `xorm:"created"` - Updated time.Time `xorm:"updated"` + Content string `xorm:"TEXT NOT NULL"` + Created time.Time `xorm:"CREATED"` + Updated time.Time `xorm:"UPDATED"` } // GenAuthorizedKey returns formatted public key string. @@ -107,9 +107,9 @@ func AddPublicKey(key *PublicKey) (err error) { if err = ioutil.WriteFile(tmpPath, []byte(key.Content), os.ModePerm); err != nil { return err } - stdout, _, err := com.ExecCmd("ssh-keygen", "-l", "-f", tmpPath) + stdout, stderr, err := com.ExecCmd("ssh-keygen", "-l", "-f", tmpPath) if err != nil { - return err + return errors.New("ssh-keygen -l -f: " + stderr) } else if len(stdout) < 2 { return errors.New("Not enough output for calculating fingerprint") } diff --git a/routers/user/setting.go b/routers/user/setting.go index 019044c53..a55e617f4 100644 --- a/routers/user/setting.go +++ b/routers/user/setting.go @@ -166,7 +166,8 @@ func SettingSSHKeys(ctx *middleware.Context, form auth.AddSSHKeyForm) { return } - k := &models.PublicKey{OwnerId: ctx.User.Id, + k := &models.PublicKey{ + OwnerId: ctx.User.Id, Name: form.KeyName, Content: form.KeyContent, } From 67002575589c1b77c86ecacd6edb5a05e81015cb Mon Sep 17 00:00:00 2001 From: Chris Lee Date: Sun, 27 Apr 2014 23:43:14 +0000 Subject: [PATCH 11/13] Show parents in commit diff page --- routers/repo/commit.go | 12 ++++++++++++ templates/repo/diff.tmpl | 9 ++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/routers/repo/commit.go b/routers/repo/commit.go index 9ecc697d2..d73669923 100644 --- a/routers/repo/commit.go +++ b/routers/repo/commit.go @@ -91,10 +91,22 @@ func Diff(ctx *middleware.Context, params martini.Params) { return isImage } + parents := make([]string, commit.ParentCount()) + for i := 0; i < commit.ParentCount(); i++ { + sha, err := commit.ParentId(i) + parents[i] = sha.String() + if err != nil { + ctx.Handle(404, "repo.Diff", err) + } + } + + ctx.Data["Username"] = userName + ctx.Data["Reponame"] = repoName ctx.Data["IsImageFile"] = isImageFile ctx.Data["Title"] = commit.Summary() + " · " + base.ShortSha(commitId) ctx.Data["Commit"] = commit ctx.Data["Diff"] = diff + ctx.Data["Parents"] = parents ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 ctx.Data["IsRepoToolbarCommits"] = true ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", commitId) diff --git a/templates/repo/diff.tmpl b/templates/repo/diff.tmpl index 0dce40533..38fe3fee2 100644 --- a/templates/repo/diff.tmpl +++ b/templates/repo/diff.tmpl @@ -8,9 +8,16 @@ Browse Source

{{.Commit.Message}}

+ {{ $username := .Username }} + {{ $reponame := .Reponame }}
- commit {{ShortSha .CommitId}} +
    + {{range .Parents}} +
  • parent {{ShortSha .}}
  • + {{end}} +
  • commit {{ShortSha .CommitId}}
  • +

From 2401e68d7ed7d53425293ad32d231542d03bbef3 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 28 Apr 2014 21:53:40 -0400 Subject: [PATCH 12/13] Prepare for v0.3.1 hotfix --- README.md | 2 +- README_ZH.md | 2 +- gogs.go | 2 +- public/img/favicon.bak.png | Bin 0 -> 15949 bytes public/img/favicon.png | Bin 15949 -> 10889 bytes routers/repo/commit.go | 1 + templates/repo/diff.tmpl | 4 +--- 7 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 public/img/favicon.bak.png diff --git a/README.md b/README.md index d188508ec..c16f721aa 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Gogs(Go Git Service) is a Self Hosted Git Service in the Go Programming Language ![Demo](http://gowalker.org/public/gogs_demo.gif) -##### Current version: 0.3.0 Alpha +##### Current version: 0.3.1 Alpha ### NOTICES diff --git a/README_ZH.md b/README_ZH.md index bbf461ddf..b82782235 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -5,7 +5,7 @@ Gogs(Go Git Service) 是一个由 Go 语言编写的自助 Git 托管服务。 ![Demo](http://gowalker.org/public/gogs_demo.gif) -##### 当前版本:0.3.0 Alpha +##### 当前版本:0.3.1 Alpha ## 开发目的 diff --git a/gogs.go b/gogs.go index 1a8b4d131..d723aa33a 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.3.0.0427 Alpha" +const APP_VER = "0.3.1.0427 Alpha" func init() { base.AppVer = APP_VER diff --git a/public/img/favicon.bak.png b/public/img/favicon.bak.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9bd037561dc68c9678516ca2c9b39ecb80a723 GIT binary patch literal 15949 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 literal 0 HcmV?d00001 diff --git a/public/img/favicon.png b/public/img/favicon.png index ba9bd037561dc68c9678516ca2c9b39ecb80a723..87282f9a781647294f5376619eecb0bfd2b22ce2 100644 GIT binary patch literal 10889 zcmV;4Dt6V0P)1^@s6-LSf_00009a7bBm000XU z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z001AfNkl8b?<-o*4E4P?4wz?^xBWVS&wmO0)SrvxC@Tijo`J92HokA zM;nd*DW8*2J&*?4+OZzVP$CW5HfTG#Btm>RUBALfF%wmV`JkLo|8H7ApvTf zE*v|f;lL&b90#6U?Y|@LalB5~Iq+mH{y6X`fd8v#=X93? zPcBx%INqfM=Q>^Gz>|y3WE>w;f|*V?IhrRITgrj29dI0YaxxBlmjhoApvdVS2cE2r zaokUU*9jmwUE^q;Y)vpZe^wymR;NoGcyckX$@$v?As0K{;lPuNRhgWBCJ-{u=?Vv) zT~choZmqR-Y0D>}fhQN!82=w4A)inJm(#=!JXu?e@t@0-ygK#sLS_-GT*-ZSLGu_7-ZP|!da zFxcdVC;Ht>{(=I(6$qIa!r0>iJMUDm#dE={%K@psd3bd>*g1=Uhzh#z2!xNe08Qk9q_;F7Fd( zm!AW3#d)cL>2*e)8qlJJAj060m}`ERJ-fiQL>*-G_@U=G3!7*hEP_zKhLttuaf8$CD zKnV0$G&>*WmH|-&3}gJm)3WlSr^+Sq4q=>u!>Y^Bb<=VbOm5UB{%H)}}0)7;#Q z&6_u)u&@xzmMw!&atc^W2f)q#1{P%y5NNSTcIQ5&2(+nlT*E`!S6=j4nJg_EZ~i8- z;%s!ztAZI0LJIidDa?H1DJ`5gq@?rdr=P~%ci#<7(*OW-=FGvGHES@xW(HWOKG7?Q z5@h0qrbZG|{gm#~96yzgRNJ~%eygE;oPon-37voc9kk6VgK6jhfIw#lIM2{oR0ehD zUKs!U^UrbTop<(uQ&CZYi!Qnd_uqd%xT`vKSQA7jF7KcMm3H)uTg@W?DDE=Mnyztl z1<0q*g>cnb&|+%Bc2n08@%O-6T#~w@l(HdtotIvEDFMpcZ@(Rj7cWLE7Qn>_l~SH6RrLX6o~yRDj|tKuisT^8q!TRoSH1`38>+pbEgr z0LH~!W3i$H%57Id)uI^-Yo=i!)ZGnVX<3R`GPJvYF1_?py!`UZeczvd{&}ohw+?>4 zA9ZzgAZC3=WkV>1;`YV?vd*1z94%UK?YvjH|A?sy{uii(N`7sUVwp-@}}pi}^3JQR+q zOUGL&q}THl0GJM-0{OgPq#&T+u4|!+3|xiAoD=A^!P!&|)g6EMA{D^ z(6Ajw)ZcfdSIwRcD)h@d;+g`ne7G-o4!!9^fa$sZQa8$@L(Dj6i2cVrK^q0epDIlDHlOi!`6;VSeDia{^ZIw=1EaJsXBq!7ZAx z6yB;6t02e)-zidyALyF%)t5QpO2cF8od7c>v1nudp6Wi5Sp4; zBQkq-!}RaZ-E%MNpggvwHPvtXj1S zj4{Zvj2myf5%0bC9$H&l;VPL9(N%~*$H1}*3)aDC`y!r&W#MgDqyc*CrwMa-hRH+# z_vSl1V@@{*5Hd_03PrH!-Wy=rCPGQ>Vu-HX$Dcm=`$#^?FCt3c#pKy=5`d2WL1LGV}?c(euFjE-c}+yUSh z4m=smU>qHqjzduu=T{ZM(6xSeyhB@Hqq4HUma}*7UaVca7NJlGcinZDb=>$;h=GoF zRLtmyXZQZ2*k9KGL7-TE;pr$CJ`FPzo2fUvQ!7oo`ltg>8Vj2ynxiqCf9ur=-~a%X zhBk0{+ikbusi&SodwV-{UB`KC2 zV~;(C!-o&!oO8~>0}njVSBmE>9vV%?aN9rr3V(cedr9lPLB1TfQt+v`O| zRTVtmQGLkZN?d=b6Sfk5w5$kax2}XVs|K?KiZcNC+gcIoNrcBx14H-uGiTz-C!b6W zZ7d7`SoOktDZv4NQ|4Box&C0nHbMwaUa|x;X3rk2rt<3lde61e-H-pL0}p_LWs6aI z)0F^C%&JUtV3k)3wSzMggbwdOe=N|9a3qG`y!vU%zfUPGz`ZwJG*H}gj(t0KqI%ji zNU|K)Pj^2)(oOc}h$bx8El;_RH?J4~4uF*NZMdl;+BLj- z(bOV{`I}PTWlVr&r_aK_+`AHG#i_%SX`1Ni>cT`f3UWtYcpeUbxs^CL={hydy-LA` z?eLTjUzi9sYzOBI9=C#L9=RDWy!r`LO~=fdQvBJ{xtLZt_+!3wU7zsq2n0*U93IAj zsA;17#>+u6WG*RZ`T>Y`9YM6S9`3SPCwwl38bqLBTb~E1DUtEOEf?opT8Qevp(F7D z&;=9K^JMW%5OJiz2^j{CL{!XOoc_T!ob$Bs06@pS4^Xr8uOY~up?g1OqGRuSU`AY& zH#Rl*-8z%CUi0}-T2qVN2OH7Y(lMdo5ebpT3?2?ZWhRbAR2(!6T;q~+_B#F9Q3!22 z-$dn->$9HAlSC&v_P!6bJ6^}pGz~pHgBJirNkQq7EXQ34bQ^gaOhj5<6K z(?qixLrY8p=?Q1vnGi@W7qn>Ru_8U(h33sK!8dgY3Tw}TsH7kFVuprb(@yx0Yy>kB zC#2I1+N*r}LY#Hg9T1=+66%Dnv>zTK7lXJa&zj^CC0C3|*oqhoZ7~fY!$7RL9h`9x zntrmi>~aqZPdoxK1RAy>(6}A0;%QKdY9M*aKt&mx88D)L#QaT&b{_*bQ)fkmJ|A2z z1*)0|)s)&(vGkfdA&4>n4j%Ty(4r7!cRzT(*_bR3?GXs69d&pZ2UNxo)JL*s?f*Y2jYVLG+ zeI7)jD#{DpC>Uco5pCQGL6A^XIS*Q}4efj0MPacAuF;*xlTV_#WYpo22t}n!MyK(7lKBt)dYy!jl;u zp>D-8dG6ZJwNVLMK)ga(B#D?);Kn?k2NjA8nbL$Bi9q6_OdtdTp=dwW22qmpqt$Gn z>oFD4U|>?hW37UF>8N@htH^|MS;ome0X}7Sy5XI2u+FHBBf2 zMR&U&MJ4&SR=A;Qhy?tT()%csEFX2xWA{KlNrYDvP@zbOnGA*%78;{5n2e)Y)c|np z*?a)!U4B}gdY?{k;+}lohmdKbma3;q-vvV85d@UT5-JoK<%*07MMkkKL9)iZK7H%6 z6IyU+B+WGRN$Gt=N|Z5$Cmm2OfucYZAY1Tgss?LU>6n!goXZkkXdk;w&5{KEcr-oc|#ib6@W;E8*m-#zw+Q6J~Z#bS{# zIGa4)M;3({BT?TdLPaQEYUIvywAeCgNG8pEeI$O z1xPlb{QN)v7NVTLkN47Jv6SO;6FB24%sY5siRMySf=3i!uRy>2`0JoFU&9xNrmB+% z9!f~vie>Zi4jzvnpxUiiLm2(=?Ax{I)P4Egw#dAU=g-y2phs-9W@J5j0Ey9L!{R^WWdWx4(Z` z!div-Vz)wrr?6uDEim}t?fZpE@Gc@?(o;j2ItFvH_Q zx2_{%ng|;V0Ee#Wc>m>3aOn-_XMXhK2%Dlvs45@0l7=WrC@3i%w%>`W8oGOeh^kt? z0rVXJ&*dFFz2U1=mN3)fMz?05fvM1~YVH?nH(=SybD=0>H*i|)^We1k(=mT$)xf`1 zRY7qN&y2&ymQHNhaRAYlynE8|rFjbv04M@QwOc`#t|Mp|=+yK+Z}Y4BpT<8ua}Nw{ zY&4Kdkx-?iUc*OH1Wc)|9=6}wy+1Dph!^Lj=COw_pD3W##N8D>%3TnNsf!Wss&*aZ!d7Byfq?jh^?RI z=UO?z&W?%heJ;;?czVNEg(6{=*Nt*Tf?)GLZ$1AuK&8ApXVWkc?&+S$@SHU+;E9JX z0aM)yYCUcgN+Rqd?@vGUJOnZSlEz?H=R}^eF>BnwLrMIeu3C=^)h-1t+sa<;O&!?x zb$#BQGc!$ux;iH+JcV^DmeDbRXDDhwqy$r3@$9QqP7GhKJpSs?7P=f^3-xq^nG~G4u^efzx^f>N`W9N-3JRE?|7-GzXImAp>qy$qG88ba@lqrc5 z$Nv2GpMM0&l~;2^Ip+f&h&w@S9vw|^IFB#oCQ}NL4sCdW0B{Qw(>*Rsce_xKH1GM_ zxBcSx`BprP1pH$*7B_-c*4yfH0bBuK?sI1>T=D&xHS;MM8GwMvvJmaWwvfsEy>ll^ zEr3e@tGT1DTi2r(Rg}zv`ti8Mb%Br%3K2fAj zb2-*)othplS@Wq6h!+V(01AMF8QhmPis}nK*zgxolhp$V!v>0Jy+i;W z>%EVaH=5e_t0prptSFu#5(lA42TnL@oU!h!TcRfW8bF)H3IqTQfC?Z0AYz3wHvk#7 zv9B*W{Y_iC0}WSHl`rrLfsm&X#;q}NUT z;dtwAN(eo_ym+eM=%5K@MB< z>lKw{^IZaU2$}$PEE;3W*KfV!SVUc)37kyu^g5WBO$QMRAjK}E_XQ(8Z#1>8mPV}Mk`8jgcEezorpKN=(zx~9(xN%D zy>5@w4dc%m)EK+w%N=*`3xwAJI5HSG*}~JSgTgi)q*z|4uO4J_&VP5TWoNM@d6$+J zR#Ha?jU#Y0e$5vZM1u=D<{-GTRW0Vh{@dUcRy0Ti~NaV6`Zo&HegJ1rgiS5{Y?S|~XKtN9GhUw-w? zgI{*~-vv;g3phi8rxzgI3SmLZBMm4hw#GE|H}#F%E}l}dV7l9-I9-)r)~xFMrp>$m z_owaMZ`;7(BMpyTNQW&iq*>m_16x5+W1KyIq-pyMue)q<L{n>fK{0CSA1{&yR@XGOAMDcf$e&e|&Jvw+(Aa_#)A?=N_x$AD z=8o4-1RP)(Zu;ZbEjIyl1K0~-ll9(Xfz@aKcBo*>lOvgX$IPfoT zG_?Hzz##w;e%2(fO>&=!CA)w8cRwl{L8 zPe%zH1NVJ%@K>vkx4bl5;0!A~Hi$F;EdX`^*kUR9NV0ppe&fzpf4KY5Mx8kbjWjq9 z?XG+JcSoE5!-@>y;Q(hu;IRNQ0CWP_V}-H(R#ujvcYeC>$i{2F{Q9*X-EasR0c+O` z{AkaifB#K=<8zkB88&c63?7>f3II4@0kjK1yOrYi*$1s%4GZ7j@a%z5RCl_2_^d-S z@aVq!7oR=c@T}!=Lc8F6@Q5XCHLwp(KQNU{zxImhMexBdQ?2akPYILZ8wty44b*ny*~ zA3u2X2>=I23Y<}c$EJfi0DNPGv4iLz-srP`+XnU-+gZvnIiKv%L3THVlkV9B4pdcHBLIRs^CUAl=U4mG^>)4hj( zF&f~EIy}8P$O>790c^HX`c}lp$NKD0C>oso-sewl>bln69nEZTXw&7&yEA1smxK*cI(znyl|xH;|F&g{ILa&f3(0E zb9ihz$Ud;T4=Dy#e_eNc+l8NOeW_j3or0nT&i^~w{Kfq{5B$&qr)M<5$qRTafLKLE zMOYNYLzL1jgpgf?kPbqKNeH2Y5P=XPZ0!kl%~<=z)4Kv;ZL)*&((#r}_v}3IkSK}= z3JVK+7A;yd>K7FmhK|qp_fz(@B(Ld2(Z9|Uv3;iiNH7?5_4M>iiN#_IOw&Axb6$=3 zM6=#w5JCv~b^S(Xx4|%=beZ|GaT`rf)uu2}x3i-Y7$u9ul zyB1XSfks~c)7Zn41PM)s!nSSDmth!EFc>Tgg+jHOrY&HM)o{+;04V8ydI@=8?zA(0 zG{1JfG)X4fck3orH?|#k;K1=meLmkopU>ANilS}2`N6?-xIbm#w1l$ec^C;YBU<1XBfs*&bi079{`Yx%8DvqJ#*nXg%kXK!*1Qg z9~;|`{!@MPs)B-o!(Okqi&AQ!e|a31;xkM7Y~}#jpg@r!0Fwz0g8nI}LIya*Y`$~O zMZ+-M;c&Pz8ja4FWYvO zv^^o5Bz-poLFjh7-N(IN?@>ij{1!Nd4HP2?9#xRUx&be&qpaB}o1{JYsC6Yq0Cj*D1zbCg- z0w_tJSsHMd4IY+aU;DNMa70n`yIigYuh-is%d($R8nc053<8mn;`3mybRmx=0mQO> z))2{Yzf@Q9VEbj!2HX=y(%fF zRi-dy*us&KCS;}4KiOy?zI*p>mbFJo z%C2Y%?L*V(o@{^`46bBBEppC9D~x$f)AZPN7a>GQf=EbHF0g;^tpFtJqQT%nQdmNU zbT}Cr(*{*Sm>`5`f*`29FDq1~gMnoLBU`bY3`?@sNq}a!Qgxa|9VZi9G=t#I_H#N7 zmYfCBH1#Kv0UDBpP(}(*lPrqO6dnsKo-VT`8%DIHKe&DEYwhns0&8Z;Ryl4e+f3{sKKb{lN)kTk;}Nb@~gL78>Bp41-p z&n!9Ir3rI{QFyY1YB0~0+>tcHcbe4E*?JR_MTR$6Ho^zVM0kpj zmg?f-NuM)$tmLqm>ie)kkr(jf2wAcaHM4*%Q!1Saic~2qA0*Yyn6{=7(y8{#1lEA# fj3x}Z+W#K_xdQ=~iNDTU00000NkvXXu0mjfkj<27 literal 15949 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 diff --git a/routers/repo/commit.go b/routers/repo/commit.go index d73669923..bc33fe447 100644 --- a/routers/repo/commit.go +++ b/routers/repo/commit.go @@ -97,6 +97,7 @@ func Diff(ctx *middleware.Context, params martini.Params) { parents[i] = sha.String() if err != nil { ctx.Handle(404, "repo.Diff", err) + return } } diff --git a/templates/repo/diff.tmpl b/templates/repo/diff.tmpl index 38fe3fee2..0b6d4f722 100644 --- a/templates/repo/diff.tmpl +++ b/templates/repo/diff.tmpl @@ -8,13 +8,11 @@ Browse Source

{{.Commit.Message}}

- {{ $username := .Username }} - {{ $reponame := .Reponame }}
From 494e5fd40c6c6f035c9d7a7e2737259afcb8424c Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 29 Apr 2014 16:35:25 -0400 Subject: [PATCH 13/13] Install: Set the default host string based on database type --- public/js/app.js | 15 +++++++++++++++ templates/install.tmpl | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/public/js/app.js b/public/js/app.js index b7b5deb83..30e9d5d0b 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -468,6 +468,9 @@ function initRepository() { function initInstall() { // database type change (function () { + var mysql_default = '127.0.0.1:3306' + var postgres_default = '127.0.0.1:5432' + $('#install-database').on("change", function () { var val = $(this).val(); if (val != "SQLite3") { @@ -475,6 +478,18 @@ function initInstall() { $('.sqlite-setting').addClass("hide"); if (val == "PostgreSQL") { $('.pgsql-setting').removeClass("hide"); + + // Change the host value to the Postgres default, but only + // if the user hasn't already changed it from the MySQL + // default. + if ($('#database-host').val() == mysql_default) { + $('#database-host').val(postgres_default); + } + } else if (val == 'MySQL') { + $('.pgsql-setting').addClass("hide"); + if ($('#database-host').val() == postgres_default) { + $('#database-host').val(mysql_default); + } } else { $('.pgsql-setting').addClass("hide"); } diff --git a/templates/install.tmpl b/templates/install.tmpl index 8fe678e50..eb6327d20 100644 --- a/templates/install.tmpl +++ b/templates/install.tmpl @@ -21,7 +21,7 @@
- +