2014-04-27 11:05:13 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2014-04-11 06:27:13 +04:00
package models
import (
"container/list"
"os/exec"
"strings"
2014-04-27 11:05:13 +04:00
qlog "github.com/qiniu/log"
2014-04-11 06:27:13 +04:00
"github.com/gogits/git"
2014-04-27 11:05:13 +04:00
2014-04-11 06:27:13 +04:00
"github.com/gogits/gogs/modules/base"
)
2014-05-03 09:37:49 +04:00
func Update ( refName , oldCommitId , newCommitId , userName , repoUserName , repoName string , userId int64 ) {
2014-04-11 06:27:13 +04:00
isNew := strings . HasPrefix ( oldCommitId , "0000000" )
if isNew &&
strings . HasPrefix ( newCommitId , "0000000" ) {
qlog . Fatal ( "old rev and new rev both 000000" )
}
2014-05-03 09:37:49 +04:00
f := RepoPath ( repoUserName , repoName )
2014-04-11 06:27:13 +04:00
gitUpdate := exec . Command ( "git" , "update-server-info" )
gitUpdate . Dir = f
gitUpdate . Run ( )
2014-05-03 07:12:15 +04:00
isDel := strings . HasPrefix ( newCommitId , "0000000" )
if isDel {
qlog . Info ( "del rev" , refName , "from" , userName + "/" + repoName + ".git" , "by" , userId )
return
}
2014-04-11 06:27:13 +04:00
repo , err := git . OpenRepository ( f )
if err != nil {
qlog . Fatalf ( "runUpdate.Open repoId: %v" , err )
}
2014-04-13 05:35:36 +04:00
newCommit , err := repo . GetCommit ( newCommitId )
2014-04-11 06:27:13 +04:00
if err != nil {
2014-04-13 05:35:36 +04:00
qlog . Fatalf ( "runUpdate GetCommit of newCommitId: %v" , err )
return
2014-04-11 06:27:13 +04:00
}
var l * list . List
// if a new branch
if isNew {
2014-04-13 05:35:36 +04:00
l , err = newCommit . CommitsBefore ( )
2014-04-11 06:27:13 +04:00
if err != nil {
2014-04-13 11:14:43 +04:00
qlog . Fatalf ( "Find CommitsBefore erro: %v" , err )
2014-04-11 06:27:13 +04:00
}
} else {
2014-04-13 05:35:36 +04:00
l , err = newCommit . CommitsBeforeUntil ( oldCommitId )
2014-04-11 06:27:13 +04:00
if err != nil {
2014-04-13 11:14:43 +04:00
qlog . Fatalf ( "Find CommitsBeforeUntil erro: %v" , err )
2014-04-13 05:35:36 +04:00
return
2014-04-11 06:27:13 +04:00
}
}
if err != nil {
qlog . Fatalf ( "runUpdate.Commit repoId: %v" , err )
}
2014-05-03 09:37:49 +04:00
ru , err := GetUserByName ( repoUserName )
if err != nil {
qlog . Fatalf ( "runUpdate.GetUserByName: %v" , err )
}
repos , err := GetRepositoryByName ( ru . Id , repoName )
2014-04-11 06:27:13 +04:00
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 ,
2014-04-13 05:35:36 +04:00
& base . PushCommit { commit . Id . String ( ) ,
2014-04-11 06:27:13 +04:00
commit . Message ( ) ,
commit . Author . Email ,
commit . Author . Name } )
if len ( commits ) >= maxCommits {
break
}
}
//commits = append(commits, []string{lastCommit.Id().String(), lastCommit.Message()})
2014-05-03 09:37:49 +04:00
if err = CommitRepoAction ( userId , ru . Id , userName , actEmail ,
repos . Id , repoUserName , repoName , refName , & base . PushCommits { l . Len ( ) , commits } ) ; err != nil {
2014-05-06 19:50:31 +04:00
qlog . Fatalf ( "runUpdate.models.CommitRepoAction: %s/%s:%v" , repoUserName , repoName , err )
2014-04-11 06:27:13 +04:00
}
}