// ParsePullRequestHook parses the pull request hook from the Request body // and returns the required data in a standard format. func (r *GitHub) ParsePullRequestHook(req *http.Request) (*model.Hook, error) { // parse the payload to retrieve the pull-request // hook meta-data. var payload = GetPayload(req) var data, err = github.ParsePullRequestHook(payload) if err != nil { return nil, err } // ignore these if data.Action != "opened" && data.Action != "synchronize" { return nil, nil } // TODO we should also store the pull request branch (ie from x to y) // we can find it here: data.PullRequest.Head.Ref var hook = model.Hook{ Owner: data.Repo.Owner.Login, Repo: data.Repo.Name, Sha: data.PullRequest.Head.Sha, Branch: data.PullRequest.Head.Ref, Author: data.PullRequest.User.Login, Gravatar: data.PullRequest.User.GravatarId, Timestamp: time.Now().UTC().String(), Message: data.PullRequest.Title, PullRequest: strconv.Itoa(data.Number), } if len(hook.Owner) == 0 { hook.Owner = data.Repo.Owner.Name } return &hook, nil }
// ParseHook parses the post-commit hook from the Request body // and returns the required data in a standard format. func (r *GitHub) ParseHook(req *http.Request) (*model.Hook, error) { // handle github ping if req.Header.Get("X-Github-Event") == "ping" { return nil, nil } // handle github pull request hook differently if req.Header.Get("X-Github-Event") == "pull_request" { return r.ParsePullRequestHook(req) } // parse the github Hook payload var payload = GetPayload(req) var data, err = github.ParseHook(payload) if err != nil { return nil, nil } // make sure this is being triggered because of a commit // and not something like a tag deletion or whatever if data.IsTag() || data.IsGithubPages() || data.IsHead() == false || data.IsDeleted() { return nil, nil } var hook = new(model.Hook) hook.Repo = data.Repo.Name hook.Owner = data.Repo.Owner.Login hook.Sha = data.Head.Id hook.Branch = data.Branch() if len(hook.Owner) == 0 { hook.Owner = data.Repo.Owner.Name } // extract the author and message from the commit // this is kind of experimental, since I don't know // what I'm doing here. if data.Head != nil && data.Head.Author != nil { hook.Message = data.Head.Message hook.Timestamp = data.Head.Timestamp hook.Author = data.Head.Author.Email } else if data.Commits != nil && len(data.Commits) > 0 && data.Commits[0].Author != nil { hook.Message = data.Commits[0].Message hook.Timestamp = data.Commits[0].Timestamp hook.Author = data.Commits[0].Author.Email } return hook, nil }