mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	add actions for http push
This commit is contained in:
		
							
								
								
									
										93
									
								
								models/update.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								models/update.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"container/list" | ||||||
|  | 	"os/exec" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
|  | 	"github.com/gogits/git" | ||||||
|  | 	"github.com/gogits/gogs/modules/base" | ||||||
|  | 	qlog "github.com/qiniu/log" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func Update(refName, oldCommitId, newCommitId, userName, repoName string, userId int64) { | ||||||
|  | 	isNew := strings.HasPrefix(oldCommitId, "0000000") | ||||||
|  | 	if isNew && | ||||||
|  | 		strings.HasPrefix(newCommitId, "0000000") { | ||||||
|  | 		qlog.Fatal("old rev and new rev both 000000") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	f := RepoPath(userName, repoName) | ||||||
|  |  | ||||||
|  | 	gitUpdate := exec.Command("git", "update-server-info") | ||||||
|  | 	gitUpdate.Dir = f | ||||||
|  | 	gitUpdate.Run() | ||||||
|  |  | ||||||
|  | 	repo, err := git.OpenRepository(f) | ||||||
|  | 	if err != nil { | ||||||
|  | 		qlog.Fatalf("runUpdate.Open repoId: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	newOid, err := git.NewOidFromString(newCommitId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		qlog.Fatalf("runUpdate.Ref repoId:%v err: %v", newCommitId, err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	newCommit, err := repo.LookupCommit(newOid) | ||||||
|  | 	if err != nil { | ||||||
|  | 		qlog.Fatalf("runUpdate.Ref repoId: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var l *list.List | ||||||
|  | 	// if a new branch | ||||||
|  | 	if isNew { | ||||||
|  | 		l, err = repo.CommitsBefore(newCommit.Id()) | ||||||
|  | 		if err != nil { | ||||||
|  | 			qlog.Fatalf("Find CommitsBefore erro:", err) | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		oldOid, err := git.NewOidFromString(oldCommitId) | ||||||
|  | 		if err != nil { | ||||||
|  | 			qlog.Fatalf("runUpdate.Ref repoId: %v", err) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		oldCommit, err := repo.LookupCommit(oldOid) | ||||||
|  | 		if err != nil { | ||||||
|  | 			qlog.Fatalf("runUpdate.Ref repoId: %v", err) | ||||||
|  | 		} | ||||||
|  | 		l = repo.CommitsBetween(newCommit, oldCommit) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		qlog.Fatalf("runUpdate.Commit repoId: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	repos, err := GetRepositoryByName(userId, repoName) | ||||||
|  | 	if err != nil { | ||||||
|  | 		qlog.Fatalf("runUpdate.GetRepositoryByName userId: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	commits := make([]*base.PushCommit, 0) | ||||||
|  | 	var maxCommits = 3 | ||||||
|  | 	var actEmail string | ||||||
|  | 	for e := l.Front(); e != nil; e = e.Next() { | ||||||
|  | 		commit := e.Value.(*git.Commit) | ||||||
|  | 		if actEmail == "" { | ||||||
|  | 			actEmail = commit.Committer.Email | ||||||
|  | 		} | ||||||
|  | 		commits = append(commits, | ||||||
|  | 			&base.PushCommit{commit.Id().String(), | ||||||
|  | 				commit.Message(), | ||||||
|  | 				commit.Author.Email, | ||||||
|  | 				commit.Author.Name}) | ||||||
|  | 		if len(commits) >= maxCommits { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	//commits = append(commits, []string{lastCommit.Id().String(), lastCommit.Message()}) | ||||||
|  | 	if err = CommitRepoAction(userId, userName, actEmail, | ||||||
|  | 		repos.Id, repoName, git.BranchName(refName), &base.PushCommits{l.Len(), commits}); err != nil { | ||||||
|  | 		qlog.Fatalf("runUpdate.models.CommitRepoAction: %v", err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -1,6 +1,7 @@ | |||||||
| package repo | package repo | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"bytes" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
| @@ -54,6 +55,8 @@ func Http(ctx *middleware.Context, params martini.Params) { | |||||||
| 	// only public pull don't need auth | 	// only public pull don't need auth | ||||||
| 	var askAuth = !(!repo.IsPrivate && isPull) | 	var askAuth = !(!repo.IsPrivate && isPull) | ||||||
|  |  | ||||||
|  | 	var authUser *models.User | ||||||
|  |  | ||||||
| 	// check access | 	// check access | ||||||
| 	if askAuth { | 	if askAuth { | ||||||
| 		baHead := ctx.Req.Header.Get("Authorization") | 		baHead := ctx.Req.Header.Get("Authorization") | ||||||
| @@ -76,7 +79,7 @@ func Http(ctx *middleware.Context, params martini.Params) { | |||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		authUser, err := models.GetUserByName(authUsername) | 		authUser, err = models.GetUserByName(authUsername) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			ctx.Handle(401, "no basic auth and digit auth", nil) | 			ctx.Handle(401, "no basic auth and digit auth", nil) | ||||||
| 			return | 			return | ||||||
| @@ -114,8 +117,20 @@ func Http(ctx *middleware.Context, params martini.Params) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	config := Config{base.RepoRootPath, "git", true, true, func(rpc string, input []byte) { | 	config := Config{base.RepoRootPath, "git", true, true, func(rpc string, input []byte) { | ||||||
| 		//fmt.Println("rpc:", rpc) | 		if rpc == "receive-pack" { | ||||||
| 		//fmt.Println("input:", string(input)) | 			firstLine := bytes.IndexRune(input, '\n') | ||||||
|  | 			fmt.Println("firstLine", firstLine) | ||||||
|  | 			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, username, reponame, authUser.Id) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	}} | 	}} | ||||||
|  |  | ||||||
| 	handler := HttpBackend(&config) | 	handler := HttpBackend(&config) | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								serve.go
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								serve.go
									
									
									
									
									
								
							| @@ -189,4 +189,13 @@ func runServ(k *cli.Context) { | |||||||
| 		println("execute command error:", err.Error()) | 		println("execute command error:", err.Error()) | ||||||
| 		qlog.Fatal("execute command error: " + err.Error()) | 		qlog.Fatal("execute command error: " + err.Error()) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	//refName := os.Getenv("refName") | ||||||
|  | 	//oldCommitId := os.Getenv("oldCommitId") | ||||||
|  | 	//newCommitId := os.Getenv("newCommitId") | ||||||
|  |  | ||||||
|  | 	//qlog.Error("get envs:", refName, oldCommitId, newCommitId) | ||||||
|  |  | ||||||
|  | 	// update | ||||||
|  | 	//models.Update(refName, oldCommitId, newCommitId, repoUserName, repoName, user.Id) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										122
									
								
								update.go
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								update.go
									
									
									
									
									
								
							| @@ -5,19 +5,14 @@ | |||||||
| package main | package main | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"container/list" |  | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/exec" |  | ||||||
| 	"path" | 	"path" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" |  | ||||||
|  |  | ||||||
| 	"github.com/codegangsta/cli" | 	"github.com/codegangsta/cli" | ||||||
| 	qlog "github.com/qiniu/log" |  | ||||||
|  |  | ||||||
| 	"github.com/gogits/git" |  | ||||||
| 	"github.com/gogits/gogs/models" | 	"github.com/gogits/gogs/models" | ||||||
| 	"github.com/gogits/gogs/modules/base" | 	"github.com/gogits/gogs/modules/base" | ||||||
|  | 	qlog "github.com/qiniu/log" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var CmdUpdate = cli.Command{ | var CmdUpdate = cli.Command{ | ||||||
| @@ -42,100 +37,20 @@ func newUpdateLogger(execDir string) { | |||||||
| 	qlog.Info("Start logging update...") | 	qlog.Info("Start logging update...") | ||||||
| } | } | ||||||
|  |  | ||||||
| func update(refName, oldCommitId, newCommitId string) { | func updateEnv(refName, oldCommitId, newCommitId string) { | ||||||
| 	isNew := strings.HasPrefix(oldCommitId, "0000000") | 	os.Setenv("refName", refName) | ||||||
| 	if isNew && | 	os.Setenv("oldCommitId", oldCommitId) | ||||||
| 		strings.HasPrefix(newCommitId, "0000000") { | 	os.Setenv("newCommitId", newCommitId) | ||||||
| 		qlog.Fatal("old rev and new rev both 000000") | 	qlog.Error("set envs:", refName, oldCommitId, newCommitId) | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	userName := os.Getenv("userName") |  | ||||||
| 	userId := os.Getenv("userId") |  | ||||||
| 	//repoId := os.Getenv("repoId") |  | ||||||
| 	repoName := os.Getenv("repoName") |  | ||||||
|  |  | ||||||
| 	f := models.RepoPath(userName, repoName) |  | ||||||
|  |  | ||||||
| 	gitUpdate := exec.Command("git", "update-server-info") |  | ||||||
| 	gitUpdate.Dir = f |  | ||||||
| 	gitUpdate.Run() |  | ||||||
|  |  | ||||||
| 	repo, err := git.OpenRepository(f) |  | ||||||
| 	if err != nil { |  | ||||||
| 		qlog.Fatalf("runUpdate.Open repoId: %v", err) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	newOid, err := git.NewOidFromString(newCommitId) |  | ||||||
| 	if err != nil { |  | ||||||
| 		qlog.Fatalf("runUpdate.Ref repoId: %v", err) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	newCommit, err := repo.LookupCommit(newOid) |  | ||||||
| 	if err != nil { |  | ||||||
| 		qlog.Fatalf("runUpdate.Ref repoId: %v", err) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	var l *list.List |  | ||||||
| 	// if a new branch |  | ||||||
| 	if isNew { |  | ||||||
| 		l, err = repo.CommitsBefore(newCommit.Id()) |  | ||||||
| 		if err != nil { |  | ||||||
| 			qlog.Fatalf("Find CommitsBefore erro:", err) |  | ||||||
| 		} |  | ||||||
| 	} else { |  | ||||||
| 		oldOid, err := git.NewOidFromString(oldCommitId) |  | ||||||
| 		if err != nil { |  | ||||||
| 			qlog.Fatalf("runUpdate.Ref repoId: %v", err) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		oldCommit, err := repo.LookupCommit(oldOid) |  | ||||||
| 		if err != nil { |  | ||||||
| 			qlog.Fatalf("runUpdate.Ref repoId: %v", err) |  | ||||||
| 		} |  | ||||||
| 		l = repo.CommitsBetween(newCommit, oldCommit) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if err != nil { |  | ||||||
| 		qlog.Fatalf("runUpdate.Commit repoId: %v", err) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	sUserId, err := strconv.Atoi(userId) |  | ||||||
| 	if err != nil { |  | ||||||
| 		qlog.Fatalf("runUpdate.Parse userId: %v", err) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	repos, err := models.GetRepositoryByName(int64(sUserId), repoName) |  | ||||||
| 	if err != nil { |  | ||||||
| 		qlog.Fatalf("runUpdate.GetRepositoryByName userId: %v", err) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	commits := make([]*base.PushCommit, 0) |  | ||||||
| 	var maxCommits = 3 |  | ||||||
| 	var actEmail string |  | ||||||
| 	for e := l.Front(); e != nil; e = e.Next() { |  | ||||||
| 		commit := e.Value.(*git.Commit) |  | ||||||
| 		if actEmail == "" { |  | ||||||
| 			actEmail = commit.Committer.Email |  | ||||||
| 		} |  | ||||||
| 		commits = append(commits, |  | ||||||
| 			&base.PushCommit{commit.Id().String(), |  | ||||||
| 				commit.Message(), |  | ||||||
| 				commit.Author.Email, |  | ||||||
| 				commit.Author.Name}) |  | ||||||
| 		if len(commits) >= maxCommits { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	//commits = append(commits, []string{lastCommit.Id().String(), lastCommit.Message()}) |  | ||||||
| 	if err = models.CommitRepoAction(int64(sUserId), userName, actEmail, |  | ||||||
| 		repos.Id, repoName, git.BranchName(refName), &base.PushCommits{l.Len(), commits}); err != nil { |  | ||||||
| 		qlog.Fatalf("runUpdate.models.CommitRepoAction: %v", err) |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // for command: ./gogs update | // for command: ./gogs update | ||||||
| func runUpdate(c *cli.Context) { | func runUpdate(c *cli.Context) { | ||||||
|  | 	cmd := os.Getenv("SSH_ORIGINAL_COMMAND") | ||||||
|  | 	if cmd == "" { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	execDir, _ := base.ExecDir() | 	execDir, _ := base.ExecDir() | ||||||
| 	newUpdateLogger(execDir) | 	newUpdateLogger(execDir) | ||||||
|  |  | ||||||
| @@ -153,12 +68,17 @@ func runUpdate(c *cli.Context) { | |||||||
| 		qlog.Fatal("received less 3 parameters") | 		qlog.Fatal("received less 3 parameters") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	refName := args[0] | 	if args[0] == "" { | ||||||
| 	if refName == "" { |  | ||||||
| 		qlog.Fatal("refName is empty, shouldn't use") | 		qlog.Fatal("refName is empty, shouldn't use") | ||||||
| 	} | 	} | ||||||
| 	oldCommitId := args[1] |  | ||||||
| 	newCommitId := args[2] |  | ||||||
|  |  | ||||||
| 	update(refName, oldCommitId, newCommitId) | 	//updateEnv(args[0], args[1], args[2]) | ||||||
|  |  | ||||||
|  | 	userName := os.Getenv("userName") | ||||||
|  | 	userId := os.Getenv("userId") | ||||||
|  | 	iUserId, _ := strconv.ParseInt(userId, 10, 64) | ||||||
|  | 	//repoId := os.Getenv("repoId") | ||||||
|  | 	repoName := os.Getenv("repoName") | ||||||
|  |  | ||||||
|  | 	models.Update(args[0], args[1], args[2], userName, repoName, iUserId) | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lunny Xiao
					Lunny Xiao