// 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, oldCommitID string, newCommitID string) error { u, err := GetUserByID(userID) if err != nil { return fmt.Errorf("GetUserByID: %v", err) } repo, err := GetRepositoryByName(repoUserID, repoName) if err != nil { return fmt.Errorf("GetRepositoryByName: %v", err) } else if err = repo.GetOwner(); err != nil { return fmt.Errorf("GetOwner: %v", err) } isNewBranch := false opType := COMMIT_REPO // Check it's tag push or branch. if strings.HasPrefix(refFullName, "refs/tags/") { opType = PUSH_TAG commit = &base.PushCommits{} } else { // if not the first commit, set the compareUrl if !strings.HasPrefix(oldCommitID, "0000000") { commit.CompareUrl = fmt.Sprintf("%s/%s/compare/%s...%s", repoUserName, repoName, oldCommitID, newCommitID) } else { isNewBranch = true } // Change repository bare status and update last updated time. repo.IsBare = false if err = UpdateRepository(repo, false); err != nil { return fmt.Errorf("UpdateRepository: %v", err) } if err = updateIssuesCommit(u, repo, repoUserName, repoName, commit.Commits); err != nil { log.Error(4, "updateIssuesCommit: %v", err) } } if len(commit.Commits) > setting.FeedMaxCommitNum { commit.Commits = commit.Commits[:setting.FeedMaxCommitNum] } bs, err := json.Marshal(commit) if err != nil { return fmt.Errorf("Marshal: %v", err) } refName := git.RefEndName(refFullName) if err = NotifyWatchers(&Action{ ActUserID: u.Id, ActUserName: userName, ActEmail: actEmail, OpType: opType, Content: string(bs), RepoID: repo.ID, RepoUserName: repoUserName, RepoName: repoName, RefName: refName, IsPrivate: repo.IsPrivate, }); err != nil { return fmt.Errorf("NotifyWatchers: %v", err) } repoLink := fmt.Sprintf("%s%s/%s", setting.AppUrl, repoUserName, repoName) payloadRepo := &api.PayloadRepo{ ID: repo.ID, Name: repo.LowerName, URL: repoLink, Description: repo.Description, Website: repo.Website, Watchers: repo.NumWatches, Owner: &api.PayloadAuthor{ Name: repo.Owner.DisplayName(), Email: repo.Owner.Email, UserName: repo.Owner.Name, }, Private: repo.IsPrivate, } pusher_email, pusher_name := "", "" pusher, err := GetUserByName(userName) if err == nil { pusher_email = pusher.Email pusher_name = pusher.DisplayName() } payloadSender := &api.PayloadUser{ UserName: pusher.Name, ID: pusher.Id, AvatarUrl: setting.AppUrl + pusher.RelAvatarLink(), } switch opType { case COMMIT_REPO: // Push commits := make([]*api.PayloadCommit, len(commit.Commits)) for i, cmt := range commit.Commits { author_username := "" author, err := GetUserByEmail(cmt.AuthorEmail) if err == nil { author_username = author.Name } commits[i] = &api.PayloadCommit{ ID: cmt.Sha1, Message: cmt.Message, URL: fmt.Sprintf("%s/commit/%s", repoLink, cmt.Sha1), Author: &api.PayloadAuthor{ Name: cmt.AuthorName, Email: cmt.AuthorEmail, UserName: author_username, }, } } p := &api.PushPayload{ Ref: refFullName, Before: oldCommitID, After: newCommitID, CompareUrl: setting.AppUrl + commit.CompareUrl, Commits: commits, Repo: payloadRepo, Pusher: &api.PayloadAuthor{ Name: pusher_name, Email: pusher_email, UserName: userName, }, Sender: payloadSender, } if err = PrepareWebhooks(repo, HOOK_EVENT_PUSH, p); err != nil { return fmt.Errorf("PrepareWebhooks: %v", err) } if isNewBranch { return PrepareWebhooks(repo, HOOK_EVENT_CREATE, &api.CreatePayload{ Ref: refName, RefType: "branch", Repo: payloadRepo, Sender: payloadSender, }) } case PUSH_TAG: // Create return PrepareWebhooks(repo, HOOK_EVENT_CREATE, &api.CreatePayload{ Ref: refName, RefType: "tag", Repo: payloadRepo, Sender: payloadSender, }) } return nil }