diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2014-06-28 14:55:33 +0800 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2014-06-28 14:55:33 +0800 |
commit | e5ae41e21f7fa1e25f04a28d907b89c78196c824 (patch) | |
tree | 5eaab809ea3f32a374439445c4c4a361358144ef /routers | |
parent | 7dbeee94e3ebec0a91efa6cba613e30fd387ffb4 (diff) | |
download | gitea-e5ae41e21f7fa1e25f04a28d907b89c78196c824.tar.gz gitea-e5ae41e21f7fa1e25f04a28d907b89c78196c824.zip |
bug fixed #261
Diffstat (limited to 'routers')
-rw-r--r-- | routers/repo/http.go | 61 |
1 files changed, 48 insertions, 13 deletions
diff --git a/routers/repo/http.go b/routers/repo/http.go index 08bbfc99a5..2f28742bb9 100644 --- a/routers/repo/http.go +++ b/routers/repo/http.go @@ -7,6 +7,7 @@ package repo import ( "bytes" "fmt" + "io" "io/ioutil" "net/http" "os" @@ -130,21 +131,49 @@ func Http(ctx *middleware.Context, params martini.Params) { } } - config := Config{setting.RepoRootPath, "git", true, true, func(rpc string, input []byte) { + var f func(rpc string, input []byte) + + f = func(rpc string, input []byte) { if rpc == "receive-pack" { - firstLine := bytes.IndexRune(input, '\000') - if firstLine > -1 { - fields := strings.Fields(string(input[:firstLine])) - if len(fields) == 3 { - oldCommitId := fields[0][4:] - newCommitId := fields[1] - refName := fields[2] - - models.Update(refName, oldCommitId, newCommitId, authUsername, username, reponame, authUser.Id) + var lastLine int64 = 0 + + for { + head := input[lastLine : lastLine+2] + if head[0] == '0' && head[1] == '0' { + size, err := strconv.ParseInt(string(input[lastLine+2:lastLine+4]), 16, 32) + if err != nil { + log.Error("%v", err) + return + } + + if size == 0 { + //fmt.Println(string(input[lastLine:])) + break + } + + line := input[lastLine : lastLine+size] + idx := bytes.IndexRune(line, '\000') + if idx > -1 { + line = line[:idx] + } + fields := strings.Fields(string(line)) + if len(fields) >= 3 { + oldCommitId := fields[0][4:] + newCommitId := fields[1] + refName := fields[2] + + models.Update(refName, oldCommitId, newCommitId, authUsername, username, reponame, authUser.Id) + } + lastLine = lastLine + size + } else { + //fmt.Println("ddddddddddd") + break } } } - }} + } + + config := Config{setting.RepoRootPath, "git", true, true, f} handler := HttpBackend(&config) handler(ctx.ResponseWriter, ctx.Req) @@ -237,8 +266,14 @@ func serviceRpc(rpc string, hr handler) { w.Header().Set("Content-Type", fmt.Sprintf("application/x-git-%s-result", rpc)) w.WriteHeader(http.StatusOK) - input, _ := ioutil.ReadAll(r.Body) - br := bytes.NewReader(input) + var input []byte + var br io.Reader + if hr.Config.OnSucceed != nil { + input, _ = ioutil.ReadAll(r.Body) + br = bytes.NewReader(input) + } else { + br = r.Body + } args := []string{rpc, "--stateless-rpc", dir} cmd := exec.Command(hr.Config.GitBinPath, args...) |