From fc1419d763a5a8266648874bede9a04068c64b87 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Wed, 26 Mar 2014 13:21:09 +0800
Subject: bug fixed

---
 serve.go  | 37 ++++++++++++-------------
 update.go | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 97 insertions(+), 32 deletions(-)

diff --git a/serve.go b/serve.go
index 6cd1e224a8..5a1a67a632 100644
--- a/serve.go
+++ b/serve.go
@@ -5,20 +5,17 @@
 package main
 
 import (
-	"bytes"
-	"container/list"
+	//"container/list"
 	"fmt"
-	"io"
 	"os"
 	"os/exec"
 	"strconv"
 	"strings"
-	"time"
 
 	"github.com/codegangsta/cli"
 	"github.com/gogits/gogs/modules/log"
 
-	"github.com/gogits/git"
+	//"github.com/gogits/git"
 	"github.com/gogits/gogs/models"
 	"github.com/gogits/gogs/modules/base"
 )
@@ -115,11 +112,11 @@ func runServ(k *cli.Context) {
 	isWrite := In(verb, COMMANDS_WRITE)
 	isRead := In(verb, COMMANDS_READONLY)
 
-	repo, err := models.GetRepositoryByName(user.Id, repoName)
-	var isExist bool = true
+	//repo, err := models.GetRepositoryByName(user.Id, repoName)
+	//var isExist bool = true
 	if err != nil {
 		if err == models.ErrRepoNotExist {
-			isExist = false
+			//isExist = false
 			if isRead {
 				println("Repository", user.Name+"/"+repoName, "is not exist")
 				return
@@ -168,6 +165,7 @@ func runServ(k *cli.Context) {
 		return
 	}
 
+	/*
 	var rep *git.Repository
 	repoPath := models.RepoPath(user.Name, repoName)
 	if !isExist {
@@ -194,14 +192,20 @@ func runServ(k *cli.Context) {
 		log.Error(err.Error())
 		return
 	}
+*/
+
+	os.Setenv("userName", user.Name)
+	os.Setenv("userId", strconv.Itoa(int(user.Id)))
+	//os.Setenv("repoId", repoId)
+	os.Setenv("repoName", repoName)
 
 	gitcmd := exec.Command(verb, rRepo)
 	gitcmd.Dir = base.RepoRootPath
 
-	var s string
-	b := bytes.NewBufferString(s)
+	//var s string
+	//b := bytes.NewBufferString(s)
 
-	gitcmd.Stdout = io.MultiWriter(os.Stdout, b)
+	gitcmd.Stdout = os.Stdout
 	//gitcmd.Stdin = io.MultiReader(os.Stdin, b)
 	gitcmd.Stdin = os.Stdin
 	gitcmd.Stderr = os.Stderr
@@ -213,16 +217,13 @@ func runServ(k *cli.Context) {
 	}
 
 	//if isRead {
-		return
+	//	return
 	//}
 
-	time.Sleep(time.Second)
-	log.Info(s)
-
 	// find push reference name
 	//var t = "ok refs/heads/"
 	//var i int
-	var refname string
+	//var refname string
 	/*for {
 		l, err := b.ReadString('\n')
 		if err != nil {
@@ -237,7 +238,7 @@ func runServ(k *cli.Context) {
 	}
 	*/
 
-	refs2, err := rep.AllReferencesMap()
+	/*refs2, err := rep.AllReferencesMap()
 	for name, ref := range refs2 {
 		if ref2, ok := refs[name]; ok {
 			if ref.Oid.Equal(ref2.Oid) {
@@ -323,5 +324,5 @@ func runServ(k *cli.Context) {
 		if err != nil {
 			log.Error("update-server-info: %v", err)
 		}
-	}
+	}*/
 }
diff --git a/update.go b/update.go
index 7386d33215..affc690e42 100644
--- a/update.go
+++ b/update.go
@@ -6,9 +6,17 @@ package main
 
 import (
 "os"
+"os/exec"
+"strings"
+"strconv"
+"container/list"
+
 "github.com/codegangsta/cli"
 //"github.com/gogits/gogs/modules/log"
+"github.com/gogits/gogs/models"
+"github.com/gogits/gogs/modules/base"
 "github.com/qiniu/log"
+"github.com/gogits/git"
 )
 
 var CmdUpdate = cli.Command{
@@ -31,16 +39,30 @@ func runUpdate(c *cli.Context) {
 	defer w.Close()
 
 	log.SetOutput(w)
-	for i, arg := range c.Args() {
-		log.Info(i, arg)
+
+
+
+	args := c.Args()
+	if len(args) != 3 {
+		log.Error("received less 3 parameters")
+		return
 	}
+
+	refName := args[0]
+	oldCommitId := args[1]
+	newCommitId := args[2]
+
 	userName := os.Getenv("userName")
-	//userId := os.Getenv("userId")
+	userId := os.Getenv("userId")
 	//repoId := os.Getenv("repoId")
-	//repoName := os.Getenv("repoName")
+	repoName := os.Getenv("repoName")
 
 	log.Info("username", userName)
-	/*f := models.RepoPath(userName, 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 {
@@ -48,13 +70,45 @@ func runUpdate(c *cli.Context) {
 		return
 	}
 
-	ref, err := repo.LookupReference("HEAD")
+	ref, err := repo.LookupReference(refName)
 	if err != nil {
 		log.Error("runUpdate.Ref repoId: %v", err)
 		return
 	}
 
-	lastCommit, err := repo.LookupCommit(ref.Oid)
+	oldOid, err := git.NewOidFromString(oldCommitId)
+	if err != nil {
+		log.Error("runUpdate.Ref repoId: %v", err)
+		return
+	}
+
+	oldCommit, err := repo.LookupCommit(oldOid)
+	if err != nil {
+		log.Error("runUpdate.Ref repoId: %v", err)
+		return
+	}
+
+	newOid, err := git.NewOidFromString(newCommitId)
+	if err != nil {
+		log.Error("runUpdate.Ref repoId: %v", err)
+		return
+	}
+
+	newCommit, err := repo.LookupCommit(newOid)
+	if err != nil {
+		log.Error("runUpdate.Ref repoId: %v", err)
+		return
+	}
+
+	var l *list.List
+	// if a new branch
+	if strings.HasPrefix(oldCommitId, "0000000") {
+		l, err = ref.AllCommits()
+		
+	} else {
+		l = ref.CommitsBetween(newCommit, oldCommit)
+	}
+
 	if err != nil {
 		log.Error("runUpdate.Commit repoId: %v", err)
 		return
@@ -65,18 +119,28 @@ func runUpdate(c *cli.Context) {
 		log.Error("runUpdate.Parse userId: %v", err)
 		return
 	}
-	sRepoId, err := strconv.Atoi(repoId)
+
+	repos, err := models.GetRepositoryByName(int64(sUserId), repoName)
 	if err != nil {
-		log.Error("runUpdate.Parse repoId: %v", err)
+		log.Error("runUpdate.GetRepositoryByName userId: %v", err)
 		return
 	}
+
 	commits := make([][]string, 0)
-	commits = append(commits, []string{lastCommit.Id().String(), lastCommit.Message()})
+	var maxCommits = 3
+	for e := l.Front(); e != nil; e = e.Next() {
+		commit := e.Value.(*git.Commit)
+		commits = append(commits, []string{commit.Id().String(), commit.Message()})
+		if len(commits) >= maxCommits {
+			break
+		}
+	}
+
+	//commits = append(commits, []string{lastCommit.Id().String(), lastCommit.Message()})
 	if err = models.CommitRepoAction(int64(sUserId), userName,
-		int64(sRepoId), repoName, commits); err != nil {
+		repos.Id, repoName, refName, &base.PushCommits{l.Len(), commits}); err != nil {
 		log.Error("runUpdate.models.CommitRepoAction: %v", err)
 	} else {
-		l := exec.Command("exec", "git", "update-server-info")
-		l.Run()
-	}*/
+
+	}
 }
-- 
cgit v1.2.3