|
|
|
@ -7,6 +7,7 @@ package repo |
|
|
|
|
import ( |
|
|
|
|
"bytes" |
|
|
|
|
"fmt" |
|
|
|
|
"io" |
|
|
|
|
"io/ioutil" |
|
|
|
|
"net/http" |
|
|
|
|
"os" |
|
|
|
@ -130,24 +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] |
|
|
|
|
|
|
|
|
|
if err = models.Update(refName, oldCommitId, newCommitId, authUsername, username, reponame, authUser.Id); err != nil { |
|
|
|
|
log.GitLogger.Error(err.Error()) |
|
|
|
|
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) |
|
|
|
@ -240,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...) |
|
|
|
|