// CommitRepoAction adds new action for committing repository. func CommitRepoAction(userId, repoUserId int64, userName, actEmail string, repoId int64, repoUserName, repoName string, refName string, commit *base.PushCommits) error { // log.Trace("action.CommitRepoAction(start): %d/%s", userId, repoName) opType := OP_COMMIT_REPO // Check it's tag push or branch. if strings.HasPrefix(refName, "refs/tags/") { opType = OP_PUSH_TAG commit = &base.PushCommits{} } refName = git.RefEndName(refName) bs, err := json.Marshal(commit) if err != nil { qlog.Error("action.CommitRepoAction(json): %d/%s", repoUserId, repoName) return err } // Change repository bare status and update last updated time. repo, err := GetRepositoryByName(repoUserId, repoName) if err != nil { qlog.Error("action.CommitRepoAction(GetRepositoryByName): %d/%s", repoUserId, repoName) return err } repo.IsBare = false if err = UpdateRepository(repo); err != nil { qlog.Error("action.CommitRepoAction(UpdateRepository): %d/%s", repoUserId, repoName) return err } if err = NotifyWatchers(&Action{ActUserId: userId, ActUserName: userName, ActEmail: actEmail, OpType: opType, Content: string(bs), RepoId: repoId, RepoUserName: repoUserName, RepoName: repoName, RefName: refName, IsPrivate: repo.IsPrivate}); err != nil { qlog.Error("action.CommitRepoAction(notify watchers): %d/%s", userId, repoName) return err } qlog.Info("action.CommitRepoAction(end): %d/%s", repoUserId, repoName) return nil }
func Update(refName, oldCommitId, newCommitId, userName, repoUserName, repoName string, userId int64) error { //fmt.Println(refName, oldCommitId, newCommitId) //fmt.Println(userName, repoUserName, repoName) isNew := strings.HasPrefix(oldCommitId, "0000000") if isNew && strings.HasPrefix(newCommitId, "0000000") { return fmt.Errorf("old rev and new rev both 000000") } f := RepoPath(repoUserName, repoName) gitUpdate := exec.Command("git", "update-server-info") gitUpdate.Dir = f gitUpdate.Run() isDel := strings.HasPrefix(newCommitId, "0000000") if isDel { log.GitLogger.Info("del rev", refName, "from", userName+"/"+repoName+".git", "by", userId) return nil } repo, err := git.OpenRepository(f) if err != nil { return fmt.Errorf("runUpdate.Open repoId: %v", err) } ru, err := GetUserByName(repoUserName) if err != nil { return fmt.Errorf("runUpdate.GetUserByName: %v", err) } repos, err := GetRepositoryByName(ru.Id, repoName) if err != nil { return fmt.Errorf("runUpdate.GetRepositoryByName userId: %v", err) } // if tags push if strings.HasPrefix(refName, "refs/tags/") { tagName := git.RefEndName(refName) tag, err := repo.GetTag(tagName) if err != nil { log.GitLogger.Fatal("runUpdate.GetTag: %v", err) } var actEmail string if tag.Tagger != nil { actEmail = tag.Tagger.Email } else { cmt, err := tag.Commit() if err != nil { log.GitLogger.Fatal("runUpdate.GetTag Commit: %v", err) } actEmail = cmt.Committer.Email } commit := &base.PushCommits{} if err = CommitRepoAction(userId, ru.Id, userName, actEmail, repos.Id, repoUserName, repoName, refName, commit); err != nil { log.GitLogger.Fatal("runUpdate.models.CommitRepoAction: %s/%s:%v", repoUserName, repoName, err) } return err } newCommit, err := repo.GetCommit(newCommitId) if err != nil { return fmt.Errorf("runUpdate GetCommit of newCommitId: %v", err) } var l *list.List // if a new branch if isNew { l, err = newCommit.CommitsBefore() if err != nil { return fmt.Errorf("Find CommitsBefore erro: %v", err) } } else { l, err = newCommit.CommitsBeforeUntil(oldCommitId) if err != nil { return fmt.Errorf("Find CommitsBeforeUntil erro: %v", err) } } if err != nil { return fmt.Errorf("runUpdate.Commit repoId: %v", err) } // if commits push 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, ru.Id, userName, actEmail, repos.Id, repoUserName, repoName, refName, &base.PushCommits{l.Len(), commits}); err != nil { return fmt.Errorf("runUpdate.models.CommitRepoAction: %s/%s:%v", repoUserName, repoName, err) } return nil }
// CommitRepoAction adds new action for committing repository. func CommitRepoAction(userId, repoUserId int64, userName, actEmail string, repoId int64, repoUserName, repoName string, refFullName string, commit *base.PushCommits) error { // log.Trace("action.CommitRepoAction(start): %d/%s", userId, repoName) opType := OP_COMMIT_REPO // Check it's tag push or branch. if strings.HasPrefix(refFullName, "refs/tags/") { opType = OP_PUSH_TAG commit = &base.PushCommits{} } refName := git.RefEndName(refFullName) bs, err := json.Marshal(commit) if err != nil { return errors.New("action.CommitRepoAction(json): " + err.Error()) } // Change repository bare status and update last updated time. repo, err := GetRepositoryByName(repoUserId, repoName) if err != nil { return errors.New("action.CommitRepoAction(GetRepositoryByName): " + err.Error()) } repo.IsBare = false if err = UpdateRepository(repo); err != nil { return errors.New("action.CommitRepoAction(UpdateRepository): " + err.Error()) } if err = NotifyWatchers(&Action{ActUserId: userId, ActUserName: userName, ActEmail: actEmail, OpType: opType, Content: string(bs), RepoId: repoId, RepoUserName: repoUserName, RepoName: repoName, RefName: refName, IsPrivate: repo.IsPrivate}); err != nil { return errors.New("action.CommitRepoAction(NotifyWatchers): " + err.Error()) } qlog.Info("action.CommitRepoAction(end): %d/%s", repoUserId, repoName) // New push event hook. if err := repo.GetOwner(); err != nil { return errors.New("action.CommitRepoAction(GetOwner): " + err.Error()) } ws, err := GetActiveWebhooksByRepoId(repoId) if err != nil { return errors.New("action.CommitRepoAction(GetWebhooksByRepoId): " + err.Error()) } else if len(ws) == 0 { return nil } repoLink := fmt.Sprintf("%s%s/%s", base.AppUrl, repoUserName, repoName) commits := make([]*hooks.PayloadCommit, len(commit.Commits)) for i, cmt := range commit.Commits { commits[i] = &hooks.PayloadCommit{ Id: cmt.Sha1, Message: cmt.Message, Url: fmt.Sprintf("%s/commit/%s", repoLink, cmt.Sha1), Author: &hooks.PayloadAuthor{ Name: cmt.AuthorName, Email: cmt.AuthorEmail, }, } } p := &hooks.Payload{ Ref: refFullName, Commits: commits, Repo: &hooks.PayloadRepo{ Id: repo.Id, Name: repo.LowerName, Url: repoLink, Description: repo.Description, Website: repo.Website, Watchers: repo.NumWatches, Owner: &hooks.PayloadAuthor{ Name: repoUserName, Email: actEmail, }, Private: repo.IsPrivate, }, Pusher: &hooks.PayloadAuthor{ Name: repo.Owner.LowerName, Email: repo.Owner.Email, }, } for _, w := range ws { w.GetEvent() if !w.HasPushEvent() { continue } p.Secret = w.Secret hooks.AddHookTask(&hooks.HookTask{hooks.HTT_WEBHOOK, w.Url, p, w.ContentType, w.IsSsl}) } return nil }