Przeglądaj źródła

add http protocol clone support

Lunny Xiao 11 lat temu
rodzic
commit
efdaf6ee15
4 zmienionych plików z 40 dodań i 4 usunięć
  1. 11 0
      models/repo.go
  2. 2 4
      models/user.go
  3. 25 0
      routers/repo/single.go
  4. 2 0
      web.go

+ 11 - 0
models/repo.go

@@ -257,6 +257,17 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep
 		return err
 	}
 
+	// hook/post-update
+	pu2, err := os.OpenFile(filepath.Join(repoPath, "hooks", "post-receive"), os.O_CREATE|os.O_WRONLY, 0777)
+	if err != nil {
+		return err
+	}
+	defer pu2.Close()
+	// TODO: Windows .bat
+	if _, err = pu2.WriteString("#!/usr/bin/env bash\ngit update-server-info\n"); err != nil {
+		return err
+	}
+
 	// Initialize repository according to user's choice.
 	fileName := map[string]string{}
 	if initReadme {

+ 2 - 4
models/user.go

@@ -231,10 +231,8 @@ func UserPath(userName string) string {
 
 func GetUserByKeyId(keyId int64) (*User, error) {
 	user := new(User)
-	rawSql := "SELECT a.* FROM user AS a, public_key AS b WHERE a.id = b.owner_id AND b.id=?"
-	if base.Cfg.MustValue("database", "DB_TYPE") == "postgres" {
-		rawSql = "SELECT a.* FROM \"user\" AS a, public_key AS b WHERE a.id = b.owner_id AND b.id=?"
-	}
+	rawSql := "SELECT a.* FROM `user` AS a, public_key AS b WHERE a.id = b.owner_id AND b.id=?"
+
 	has, err := orm.Sql(rawSql, keyId).Get(user)
 	if err != nil {
 		return nil, err

+ 25 - 0
routers/repo/single.go

@@ -5,11 +5,13 @@
 package repo
 
 import (
+	"path"
 	"strings"
 
 	"github.com/codegangsta/martini"
 
 	"github.com/gogits/git"
+	"github.com/gogits/webdav"
 
 	"github.com/gogits/gogs/models"
 	"github.com/gogits/gogs/modules/base"
@@ -181,6 +183,29 @@ func Single(ctx *middleware.Context, params martini.Params) {
 	ctx.HTML(200, "repo/single", ctx.Data)
 }
 
+func Http(ctx *middleware.Context, params martini.Params) {
+	/*if !ctx.Repo.IsValid {
+		return
+	}*/
+
+	// TODO: access check
+
+	username := params["username"]
+	reponame := params["reponame"]
+	if strings.HasSuffix(reponame, ".git") {
+		reponame = reponame[:len(reponame)-4]
+	}
+
+	prefix := path.Join("/", username, params["reponame"])
+	server := &webdav.Server{
+		Fs:         webdav.Dir(models.RepoPath(username, reponame)),
+		TrimPrefix: prefix,
+		Listings:   true,
+	}
+
+	server.ServeHTTP(ctx.ResponseWriter, ctx.Req)
+}
+
 func Setting(ctx *middleware.Context, params martini.Params) {
 	if !ctx.Repo.IsOwner {
 		ctx.Error(404)

+ 2 - 0
web.go

@@ -116,6 +116,8 @@ func runWeb(*cli.Context) {
 
 	m.Get("/:username/:reponame", ignSignIn, middleware.RepoAssignment(true), repo.Single)
 
+	m.Any("/:username/:reponame/**", ignSignIn, repo.Http)
+
 	if martini.Env == martini.Dev {
 		m.Get("/template/**", dev.TemplatePreview)
 	}