func (h RepoAdminHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { user, err := readUser(r) if err != nil { redirectLogin(w, r) return } // repository name from the URL parameters hostParam := r.FormValue(":host") userParam := r.FormValue(":owner") nameParam := r.FormValue(":name") repoName := fmt.Sprintf("%s/%s/%s", hostParam, userParam, nameParam) repo, err := database.GetRepoSlug(repoName) if err != nil { RenderNotFound(w) return } // The User must own the repository OR be a member // of the Team that owns the repository. if admin, _ := database.IsRepoAdmin(user, repo); admin == false { RenderNotFound(w) return } if err = h(w, r, user, repo); err != nil { log.Print(err) RenderError(w, err, http.StatusBadRequest) } }
// Display a specific Commit. func CommitShow(w http.ResponseWriter, r *http.Request, u *User, repo *Repo) error { branch := r.FormValue("branch") if branch == "" { branch = "master" } hash := r.FormValue(":commit") labl := r.FormValue(":label") // get the commit from the database commit, err := database.GetCommitBranchHash(branch, hash, repo.ID) if err != nil { return err } // get the builds from the database. a commit can have // multiple sub-builds (or matrix builds) builds, err := database.ListBuilds(commit.ID) if err != nil { return err } admin, err := database.IsRepoAdmin(u, repo) if err != nil { return err } data := struct { User *User Repo *Repo Commit *Commit Build *Build Builds []*Build Token string IsAdmin bool }{u, repo, commit, builds[0], builds, "", admin} // get the specific build requested by the user. instead // of a database round trip, we can just loop through the // list and extract the requested build. for _, b := range builds { if b.Slug == labl { data.Build = b break } } // generate a token to connect with the websocket // handler and stream output, if the build is running. data.Token = channel.Token(fmt.Sprintf( "%s/%s/%s/commit/%s/%s/builds/%s", repo.Host, repo.Owner, repo.Name, commit.Branch, commit.Hash, builds[0].Slug)) // render the repository template. return RenderTemplate(w, "repo_commit.html", &data) }