summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--README_ZH.md2
-rw-r--r--cmd/fix.go154
-rw-r--r--cmd/serve.go1
-rw-r--r--gogs.go6
-rw-r--r--models/models.go5
-rw-r--r--models/publickey.go14
-rw-r--r--models/repo.go6
-rw-r--r--modules/setting/setting.go11
-rw-r--r--templates/VERSION2
10 files changed, 171 insertions, 32 deletions
diff --git a/README.md b/README.md
index 8887081911..d34aa5a683 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.4.2 Alpha
+##### Current version: 0.4.3 Alpha
### NOTICES
diff --git a/README_ZH.md b/README_ZH.md
index 84af15a6a5..ebffa33efb 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.4.2 Alpha
+##### 当前版本:0.4.3 Alpha
## 开发目的
diff --git a/cmd/fix.go b/cmd/fix.go
index 3c2278ba90..95ab3ae66f 100644
--- a/cmd/fix.go
+++ b/cmd/fix.go
@@ -5,10 +5,16 @@
package cmd
import (
+ "bufio"
"fmt"
+ "io"
+ "io/ioutil"
"os"
+ "path"
+ "strings"
"github.com/codegangsta/cli"
+
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/setting"
)
@@ -16,28 +22,152 @@ import (
var CmdFix = cli.Command{
Name: "fix",
Usage: "This command for upgrade from old version",
- Description: `Fix provide upgrade from old version`,
Action: runFix,
+ Subcommands: fixCommands,
Flags: []cli.Flag{},
}
-func runFix(k *cli.Context) {
- workDir, _ := setting.WorkDir()
- newLogger(workDir)
+func runFix(ctx *cli.Context) {
+}
- setting.NewConfigContext()
- models.LoadModelsConfig()
+var fixCommands = []cli.Command{
+ {
+ Name: "location",
+ Usage: "Change Gogs app location",
+ Description: `Command location fixes location change of Gogs
+
+gogs fix location <old Gogs path>
+`,
+ Action: runFixLocation,
+ },
+}
+
+// rewriteAuthorizedKeys replaces old Gogs path to the new one.
+func rewriteAuthorizedKeys(sshPath, oldPath, newPath string) error {
+ fr, err := os.Open(sshPath)
+ if err != nil {
+ return err
+ }
+ defer fr.Close()
+
+ tmpPath := sshPath + ".tmp"
+ fw, err := os.Create(tmpPath)
+ if err != nil {
+ return err
+ }
+ defer fw.Close()
+
+ oldPath = "command=\"" + oldPath + " serv"
+ newPath = "command=\"" + newPath + " serv"
+ buf := bufio.NewReader(fr)
+ for {
+ line, errRead := buf.ReadString('\n')
+ line = strings.TrimSpace(line)
+
+ if errRead != nil {
+ if errRead != io.EOF {
+ return errRead
+ }
+
+ // Reached end of file, if nothing to read then break,
+ // otherwise handle the last line.
+ if len(line) == 0 {
+ break
+ }
+ }
+
+ // Still finding the line, copy the line that currently read.
+ if _, err = fw.WriteString(strings.Replace(line, oldPath, newPath, 1) + "\n"); err != nil {
+ return err
+ }
- if models.UseSQLite3 {
- os.Chdir(workDir)
+ if errRead == io.EOF {
+ break
+ }
}
- models.SetEngine()
+ if err = os.Remove(sshPath); err != nil {
+ return err
+ }
+ return os.Rename(tmpPath, sshPath)
+}
+
+func rewriteUpdateHook(path, appPath string) error {
+ rp := strings.NewReplacer("\\", "/", " ", "\\ ")
+ if err := ioutil.WriteFile(path, []byte(fmt.Sprintf(models.TPL_UPDATE_HOOK,
+ setting.ScriptType, rp.Replace(appPath))), os.ModePerm); err != nil {
+ return err
+ }
+ return nil
+}
- err := models.Fix()
+func walkDir(rootPath, recPath, appPath string, depth int) error {
+ depth++
+ if depth > 3 {
+ return nil
+ } else if depth == 3 {
+ if err := rewriteUpdateHook(path.Join(rootPath, "hooks/update"), appPath); err != nil {
+ return err
+ }
+ }
+
+ dir, err := os.Open(rootPath)
+ if err != nil {
+ return err
+ }
+ defer dir.Close()
+
+ fis, err := dir.Readdir(0)
if err != nil {
+ return err
+ }
+
+ for _, fi := range fis {
+ if strings.Contains(fi.Name(), ".DS_Store") {
+ continue
+ }
+
+ relPath := path.Join(recPath, fi.Name())
+ curPath := path.Join(rootPath, fi.Name())
+ if fi.IsDir() {
+ if err = walkDir(curPath, relPath, appPath, depth); err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+}
+
+func runFixLocation(ctx *cli.Context) {
+ if len(ctx.Args()) != 1 {
+ fmt.Println("Incorrect arguments number, expect 1")
+ os.Exit(2)
+ }
+
+ execPath, _ := setting.ExecPath()
+
+ oldPath := ctx.Args().First()
+ fmt.Printf("Old location: %s\n", oldPath)
+ fmt.Println("This command should be executed in the new Gogs path")
+ fmt.Printf("Do you want to change Gogs app path from old location to:\n")
+ fmt.Printf("-> %s?\n", execPath)
+ fmt.Print("Press <enter> to continue, use <Ctrl+c> to exit.")
+ fmt.Scanln()
+
+ // Fix in authorized_keys file.
+ sshPath := path.Join(models.SshPath, "authorized_keys")
+ fmt.Printf("Fixing pathes in file: %s\n", sshPath)
+ if err := rewriteAuthorizedKeys(sshPath, oldPath, execPath); err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ // Fix position in gogs-repositories.
+ setting.NewConfigContext()
+ fmt.Printf("Fixing pathes in repositories: %s\n", setting.RepoRootPath)
+ if err := walkDir(setting.RepoRootPath, "", execPath, 0); err != nil {
fmt.Println(err)
- } else {
- fmt.Println("Fix successfully!")
+ os.Exit(1)
}
+ fmt.Println("Fix position finished!")
}
diff --git a/cmd/serve.go b/cmd/serve.go
index 302f8568e1..3a17bf9f97 100644
--- a/cmd/serve.go
+++ b/cmd/serve.go
@@ -36,7 +36,6 @@ func newLogger(logPath string) {
}
qlog.SetOutput(f)
- //qlog.SetOutputLevel(qlog.Ldebug)
qlog.Info("Start logging serv...")
}
diff --git a/gogs.go b/gogs.go
index 8a633a305b..41a71c72e3 100644
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting"
)
-const APP_VER = "0.4.2.0608 Alpha"
+const APP_VER = "0.4.3.0610 Alpha"
func init() {
runtime.GOMAXPROCS(runtime.NumCPU())
@@ -31,10 +31,10 @@ func main() {
app.Version = APP_VER
app.Commands = []cli.Command{
cmd.CmdWeb,
- // cmd.CmdFix,
- cmd.CmdDump,
cmd.CmdServ,
cmd.CmdUpdate,
+ cmd.CmdFix,
+ cmd.CmdDump,
}
app.Flags = append(app.Flags, []cli.Flag{}...)
app.Run(os.Args)
diff --git a/models/models.go b/models/models.go
index dca77e00e1..a59c051712 100644
--- a/models/models.go
+++ b/models/models.go
@@ -46,7 +46,9 @@ func LoadModelsConfig() {
DbCfg.Host = setting.Cfg.MustValue("database", "HOST")
DbCfg.Name = setting.Cfg.MustValue("database", "NAME")
DbCfg.User = setting.Cfg.MustValue("database", "USER")
- DbCfg.Pwd = setting.Cfg.MustValue("database", "PASSWD")
+ if len(DbCfg.Pwd) == 0 {
+ DbCfg.Pwd = setting.Cfg.MustValue("database", "PASSWD")
+ }
DbCfg.SslMode = setting.Cfg.MustValue("database", "SSL_MODE")
DbCfg.Path = setting.Cfg.MustValue("database", "PATH", "data/gogs.db")
}
@@ -67,7 +69,6 @@ func NewTestEngine(x *xorm.Engine) (err error) {
}
cnnstr := fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=%s",
DbCfg.User, DbCfg.Pwd, host, port, DbCfg.Name, DbCfg.SslMode)
- //fmt.Println(cnnstr)
x, err = xorm.NewEngine("postgres", cnnstr)
case "sqlite3":
if !EnableSQLite3 {
diff --git a/models/publickey.go b/models/publickey.go
index 556db96491..76dc0cc740 100644
--- a/models/publickey.go
+++ b/models/publickey.go
@@ -37,7 +37,7 @@ var (
var sshOpLocker = sync.Mutex{}
var (
- sshPath string // SSH directory.
+ SshPath string // SSH directory.
appPath string // Execution(binary) path.
)
@@ -67,9 +67,9 @@ func init() {
}
// Determine and create .ssh path.
- sshPath = filepath.Join(homeDir(), ".ssh")
- if err = os.MkdirAll(sshPath, os.ModePerm); err != nil {
- qlog.Fatalf("publickey.init(fail to create sshPath(%s)): %v\n", sshPath, err)
+ SshPath = filepath.Join(homeDir(), ".ssh")
+ if err = os.MkdirAll(SshPath, os.ModePerm); err != nil {
+ qlog.Fatalf("publickey.init(fail to create SshPath(%s)): %v\n", SshPath, err)
}
}
@@ -94,7 +94,7 @@ func saveAuthorizedKeyFile(key *PublicKey) error {
sshOpLocker.Lock()
defer sshOpLocker.Unlock()
- fpath := filepath.Join(sshPath, "authorized_keys")
+ fpath := filepath.Join(SshPath, "authorized_keys")
f, err := os.OpenFile(fpath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
if err != nil {
return err
@@ -216,8 +216,8 @@ func DeletePublicKey(key *PublicKey) error {
return err
}
- fpath := filepath.Join(sshPath, "authorized_keys")
- tmpPath := filepath.Join(sshPath, "authorized_keys.tmp")
+ fpath := filepath.Join(SshPath, "authorized_keys")
+ tmpPath := filepath.Join(SshPath, "authorized_keys.tmp")
log.Trace("publickey.DeletePublicKey(authorized_keys): %s", fpath)
if err = rewriteAuthorizedKeys(key, fpath, tmpPath); err != nil {
diff --git a/models/repo.go b/models/repo.go
index deb25b2a9a..3eca78c4b9 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -28,6 +28,10 @@ import (
"github.com/gogits/gogs/modules/setting"
)
+const (
+ TPL_UPDATE_HOOK = "#!/usr/bin/env %s\n%s update $1 $2 $3\n"
+)
+
var (
ErrRepoAlreadyExist = errors.New("Repository already exist")
ErrRepoNotExist = errors.New("Repository does not exist")
@@ -450,7 +454,7 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep
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", setting.ScriptType,
+ fmt.Sprintf(TPL_UPDATE_HOOK, setting.ScriptType,
rp.Replace(appPath))); err != nil {
return err
}
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index 35c9165139..73ec8ddd1b 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -90,8 +90,7 @@ var (
RunUser string
)
-// WorkDir returns absolute path of work directory.
-func WorkDir() (string, error) {
+func ExecPath() (string, error) {
file, err := exec.LookPath(os.Args[0])
if err != nil {
return "", err
@@ -100,7 +99,13 @@ func WorkDir() (string, error) {
if err != nil {
return "", err
}
- return path.Dir(strings.Replace(p, "\\", "/", -1)), nil
+ return p, nil
+}
+
+// WorkDir returns absolute path of work directory.
+func WorkDir() (string, error) {
+ execPath, err := ExecPath()
+ return path.Dir(strings.Replace(execPath, "\\", "/", -1)), err
}
// NewConfigContext initializes configuration context.
diff --git a/templates/VERSION b/templates/VERSION
index cf75962a83..dc83da7866 100644
--- a/templates/VERSION
+++ b/templates/VERSION
@@ -1 +1 @@
-0.4.2.0608 Alpha \ No newline at end of file
+0.4.3.0610 Alpha \ No newline at end of file