···7575}76767777type PullEvents struct {7878- Items []*Pull7878+ Items []*models.Pull7979}80808181func (p PullEvents) Stats() PullEventStats {8282 var open, merged, closed int8383 for _, pull := range p.Items {8484 switch pull.State {8585- case PullOpen:8585+ case models.PullOpen:8686 open += 18787- case PullMerged:8787+ case models.PullMerged:8888 merged += 18989- case PullClosed:8989+ case models.PullClosed:9090 closed += 19191 }9292 }···546546 switch stat {547547 case VanityStatMergedPRCount:548548 query = `select count(id) from pulls where owner_did = ? and state = ?`549549- args = append(args, did, PullMerged)549549+ args = append(args, did, models.PullMerged)550550 case VanityStatClosedPRCount:551551 query = `select count(id) from pulls where owner_did = ? and state = ?`552552- args = append(args, did, PullClosed)552552+ args = append(args, did, models.PullClosed)553553 case VanityStatOpenPRCount:554554 query = `select count(id) from pulls where owner_did = ? and state = ?`555555- args = append(args, did, PullOpen)555555+ args = append(args, did, models.PullOpen)556556 case VanityStatOpenIssueCount:557557 query = `select count(id) from issues where did = ? and open = 1`558558 args = append(args, did)
+42-342
appview/db/pulls.go
···44 "database/sql"55 "fmt"66 "log"77- "slices"87 "sort"98 "strings"109 "time"11101211 "github.com/bluesky-social/indigo/atproto/syntax"1313- "tangled.org/core/api/tangled"1412 "tangled.org/core/appview/models"1515- "tangled.org/core/patchutil"1616- "tangled.org/core/types"1713)18141919-type PullState int2020-2121-const (2222- PullClosed PullState = iota2323- PullOpen2424- PullMerged2525- PullDeleted2626-)2727-2828-func (p PullState) String() string {2929- switch p {3030- case PullOpen:3131- return "open"3232- case PullMerged:3333- return "merged"3434- case PullClosed:3535- return "closed"3636- case PullDeleted:3737- return "deleted"3838- default:3939- return "closed"4040- }4141-}4242-4343-func (p PullState) IsOpen() bool {4444- return p == PullOpen4545-}4646-func (p PullState) IsMerged() bool {4747- return p == PullMerged4848-}4949-func (p PullState) IsClosed() bool {5050- return p == PullClosed5151-}5252-func (p PullState) IsDeleted() bool {5353- return p == PullDeleted5454-}5555-5656-type Pull struct {5757- // ids5858- ID int5959- PullId int6060-6161- // at ids6262- RepoAt syntax.ATURI6363- OwnerDid string6464- Rkey string6565-6666- // content6767- Title string6868- Body string6969- TargetBranch string7070- State PullState7171- Submissions []*PullSubmission7272-7373- // stacking7474- StackId string // nullable string7575- ChangeId string // nullable string7676- ParentChangeId string // nullable string7777-7878- // meta7979- Created time.Time8080- PullSource *PullSource8181-8282- // optionally, populate this when querying for reverse mappings8383- Repo *models.Repo8484-}8585-8686-func (p Pull) AsRecord() tangled.RepoPull {8787- var source *tangled.RepoPull_Source8888- if p.PullSource != nil {8989- s := p.PullSource.AsRecord()9090- source = &s9191- source.Sha = p.LatestSha()9292- }9393-9494- record := tangled.RepoPull{9595- Title: p.Title,9696- Body: &p.Body,9797- CreatedAt: p.Created.Format(time.RFC3339),9898- Target: &tangled.RepoPull_Target{9999- Repo: p.RepoAt.String(),100100- Branch: p.TargetBranch,101101- },102102- Patch: p.LatestPatch(),103103- Source: source,104104- }105105- return record106106-}107107-108108-type PullSource struct {109109- Branch string110110- RepoAt *syntax.ATURI111111-112112- // optionally populate this for reverse mappings113113- Repo *models.Repo114114-}115115-116116-func (p PullSource) AsRecord() tangled.RepoPull_Source {117117- var repoAt *string118118- if p.RepoAt != nil {119119- s := p.RepoAt.String()120120- repoAt = &s121121- }122122- record := tangled.RepoPull_Source{123123- Branch: p.Branch,124124- Repo: repoAt,125125- }126126- return record127127-}128128-129129-type PullSubmission struct {130130- // ids131131- ID int132132- PullId int133133-134134- // at ids135135- RepoAt syntax.ATURI136136-137137- // content138138- RoundNumber int139139- Patch string140140- Comments []PullComment141141- SourceRev string // include the rev that was used to create this submission: only for branch/fork PRs142142-143143- // meta144144- Created time.Time145145-}146146-147147-type PullComment struct {148148- // ids149149- ID int150150- PullId int151151- SubmissionId int152152-153153- // at ids154154- RepoAt string155155- OwnerDid string156156- CommentAt string157157-158158- // content159159- Body string160160-161161- // meta162162- Created time.Time163163-}164164-165165-func (p *Pull) LatestPatch() string {166166- latestSubmission := p.Submissions[p.LastRoundNumber()]167167- return latestSubmission.Patch168168-}169169-170170-func (p *Pull) LatestSha() string {171171- latestSubmission := p.Submissions[p.LastRoundNumber()]172172- return latestSubmission.SourceRev173173-}174174-175175-func (p *Pull) PullAt() syntax.ATURI {176176- return syntax.ATURI(fmt.Sprintf("at://%s/%s/%s", p.OwnerDid, tangled.RepoPullNSID, p.Rkey))177177-}178178-179179-func (p *Pull) LastRoundNumber() int {180180- return len(p.Submissions) - 1181181-}182182-183183-func (p *Pull) IsPatchBased() bool {184184- return p.PullSource == nil185185-}186186-187187-func (p *Pull) IsBranchBased() bool {188188- if p.PullSource != nil {189189- if p.PullSource.RepoAt != nil {190190- return p.PullSource.RepoAt == &p.RepoAt191191- } else {192192- // no repo specified193193- return true194194- }195195- }196196- return false197197-}198198-199199-func (p *Pull) IsForkBased() bool {200200- if p.PullSource != nil {201201- if p.PullSource.RepoAt != nil {202202- // make sure repos are different203203- return p.PullSource.RepoAt != &p.RepoAt204204- }205205- }206206- return false207207-}208208-209209-func (p *Pull) IsStacked() bool {210210- return p.StackId != ""211211-}212212-213213-func (s PullSubmission) IsFormatPatch() bool {214214- return patchutil.IsFormatPatch(s.Patch)215215-}216216-217217-func (s PullSubmission) AsFormatPatch() []types.FormatPatch {218218- patches, err := patchutil.ExtractPatches(s.Patch)219219- if err != nil {220220- log.Println("error extracting patches from submission:", err)221221- return []types.FormatPatch{}222222- }223223-224224- return patches225225-}226226-227227-func NewPull(tx *sql.Tx, pull *Pull) error {1515+func NewPull(tx *sql.Tx, pull *models.Pull) error {22816 _, err := tx.Exec(`22917 insert or ignore into repo_pull_seqs (repo_at, next_pull_id)23018 values (?, 1)···33245 }3424635247 pull.PullId = nextId3636- pull.State = PullOpen248248+ pull.State = models.PullOpen3724938250 var sourceBranch, sourceRepoAt *string39251 if pull.PullSource != nil {···100312 return pullId - 1, err101313}102314103103-func GetPullsWithLimit(e Execer, limit int, filters ...filter) ([]*Pull, error) {104104- pulls := make(map[int]*Pull)315315+func GetPullsWithLimit(e Execer, limit int, filters ...filter) ([]*models.Pull, error) {316316+ pulls := make(map[int]*models.Pull)105317106318 var conditions []string107319 var args []any···150362 defer rows.Close()151363152364 for rows.Next() {153153- var pull Pull365365+ var pull models.Pull154366 var createdAt string155367 var sourceBranch, sourceRepoAt, stackId, changeId, parentChangeId sql.NullString156368 err := rows.Scan(···180392 pull.Created = createdTime181393182394 if sourceBranch.Valid {183183- pull.PullSource = &PullSource{395395+ pull.PullSource = &models.PullSource{184396 Branch: sourceBranch.String,185397 }186398 if sourceRepoAt.Valid {···233445 defer submissionsRows.Close()234446235447 for submissionsRows.Next() {236236- var s PullSubmission448448+ var s models.PullSubmission237449 var sourceRev sql.NullString238450 var createdAt string239451 err := submissionsRows.Scan(···259471 }260472261473 if p, ok := pulls[s.PullId]; ok {262262- p.Submissions = make([]*PullSubmission, s.RoundNumber+1)474474+ p.Submissions = make([]*models.PullSubmission, s.RoundNumber+1)263475 p.Submissions[s.RoundNumber] = &s264476 }265477 }···300512 return nil, err301513 }302514 if p, ok := pulls[pullId]; ok {303303- p.Submissions[p.LastRoundNumber()].Comments = make([]PullComment, commentCount)515515+ p.Submissions[p.LastRoundNumber()].Comments = make([]models.PullComment, commentCount)304516 }305517 }306518 if err := rows.Err(); err != nil {307519 return nil, err308520 }309521310310- orderedByPullId := []*Pull{}522522+ orderedByPullId := []*models.Pull{}311523 for _, p := range pulls {312524 orderedByPullId = append(orderedByPullId, p)313525 }···318530 return orderedByPullId, nil319531}320532321321-func GetPulls(e Execer, filters ...filter) ([]*Pull, error) {533533+func GetPulls(e Execer, filters ...filter) ([]*models.Pull, error) {322534 return GetPullsWithLimit(e, 0, filters...)323535}324536325325-func GetPull(e Execer, repoAt syntax.ATURI, pullId int) (*Pull, error) {537537+func GetPull(e Execer, repoAt syntax.ATURI, pullId int) (*models.Pull, error) {326538 query := `327539 select328540 owner_did,···346558 `347559 row := e.QueryRow(query, repoAt, pullId)348560349349- var pull Pull561561+ var pull models.Pull350562 var createdAt string351563 var sourceBranch, sourceRepoAt, stackId, changeId, parentChangeId sql.NullString352564 err := row.Scan(···377589378590 // populate source379591 if sourceBranch.Valid {380380- pull.PullSource = &PullSource{592592+ pull.PullSource = &models.PullSource{381593 Branch: sourceBranch.String,382594 }383595 if sourceRepoAt.Valid {···413625 }414626 defer submissionsRows.Close()415627416416- submissionsMap := make(map[int]*PullSubmission)628628+ submissionsMap := make(map[int]*models.PullSubmission)417629418630 for submissionsRows.Next() {419419- var submission PullSubmission631631+ var submission models.PullSubmission420632 var submissionCreatedStr string421633 var submissionSourceRev sql.NullString422634 err := submissionsRows.Scan(···480692 defer commentsRows.Close()481693482694 for commentsRows.Next() {483483- var comment PullComment695695+ var comment models.PullComment484696 var commentCreatedStr string485697 err := commentsRows.Scan(486698 &comment.ID,···524736 }525737 }526738527527- pull.Submissions = make([]*PullSubmission, len(submissionsMap))739739+ pull.Submissions = make([]*models.PullSubmission, len(submissionsMap))528740 for _, submission := range submissionsMap {529741 pull.Submissions[submission.RoundNumber] = submission530742 }···534746535747// timeframe here is directly passed into the sql query filter, and any536748// timeframe in the past should be negative; e.g.: "-3 months"537537-func GetPullsByOwnerDid(e Execer, did, timeframe string) ([]Pull, error) {538538- var pulls []Pull749749+func GetPullsByOwnerDid(e Execer, did, timeframe string) ([]models.Pull, error) {750750+ var pulls []models.Pull539751540752 rows, err := e.Query(`541753 select···564776 defer rows.Close()565777566778 for rows.Next() {567567- var pull Pull779779+ var pull models.Pull568780 var repo models.Repo569781 var pullCreatedAt, repoCreatedAt string570782 err := rows.Scan(···608820 return pulls, nil609821}610822611611-func NewPullComment(e Execer, comment *PullComment) (int64, error) {823823+func NewPullComment(e Execer, comment *models.PullComment) (int64, error) {612824 query := `insert into pull_comments (owner_did, repo_at, submission_id, comment_at, pull_id, body) values (?, ?, ?, ?, ?, ?)`613825 res, err := e.Exec(614826 query,···631843 return i, nil632844}633845634634-func SetPullState(e Execer, repoAt syntax.ATURI, pullId int, pullState PullState) error {846846+func SetPullState(e Execer, repoAt syntax.ATURI, pullId int, pullState models.PullState) error {635847 _, err := e.Exec(636848 `update pulls set state = ? where repo_at = ? and pull_id = ? and (state <> ? or state <> ?)`,637849 pullState,638850 repoAt,639851 pullId,640640- PullDeleted, // only update state of non-deleted pulls641641- PullMerged, // only update state of non-merged pulls852852+ models.PullDeleted, // only update state of non-deleted pulls853853+ models.PullMerged, // only update state of non-merged pulls642854 )643855 return err644856}645857646858func ClosePull(e Execer, repoAt syntax.ATURI, pullId int) error {647647- err := SetPullState(e, repoAt, pullId, PullClosed)859859+ err := SetPullState(e, repoAt, pullId, models.PullClosed)648860 return err649861}650862651863func ReopenPull(e Execer, repoAt syntax.ATURI, pullId int) error {652652- err := SetPullState(e, repoAt, pullId, PullOpen)864864+ err := SetPullState(e, repoAt, pullId, models.PullOpen)653865 return err654866}655867656868func MergePull(e Execer, repoAt syntax.ATURI, pullId int) error {657657- err := SetPullState(e, repoAt, pullId, PullMerged)869869+ err := SetPullState(e, repoAt, pullId, models.PullMerged)658870 return err659871}660872661873func DeletePull(e Execer, repoAt syntax.ATURI, pullId int) error {662662- err := SetPullState(e, repoAt, pullId, PullDeleted)874874+ err := SetPullState(e, repoAt, pullId, models.PullDeleted)663875 return err664876}665877666666-func ResubmitPull(e Execer, pull *Pull, newPatch, sourceRev string) error {878878+func ResubmitPull(e Execer, pull *models.Pull, newPatch, sourceRev string) error {667879 newRoundNumber := len(pull.Submissions)668880 _, err := e.Exec(`669881 insert into pull_submissions (pull_id, repo_at, round_number, patch, source_rev)···729941 count(case when state = ? then 1 end) as deleted_count730942 from pulls731943 where repo_at = ?`,732732- PullOpen,733733- PullMerged,734734- PullClosed,735735- PullDeleted,944944+ models.PullOpen,945945+ models.PullMerged,946946+ models.PullClosed,947947+ models.PullDeleted,736948 repoAt,737949 )738950···744956 return count, nil745957}746958747747-type Stack []*Pull748748-749959// change-id parent-change-id750960//751961// 4 w ,-------- z (TOP)···752966// 1 x <------' nil (BOT)753967//754968// `w` is parent of none, so it is the top of the stack755755-func GetStack(e Execer, stackId string) (Stack, error) {969969+func GetStack(e Execer, stackId string) (models.Stack, error) {756970 unorderedPulls, err := GetPulls(757971 e,758972 FilterEq("stack_id", stackId),759759- FilterNotEq("state", PullDeleted),973973+ FilterNotEq("state", models.PullDeleted),760974 )761975 if err != nil {762976 return nil, err763977 }764978 // map of parent-change-id to pull765765- changeIdMap := make(map[string]*Pull, len(unorderedPulls))766766- parentMap := make(map[string]*Pull, len(unorderedPulls))979979+ changeIdMap := make(map[string]*models.Pull, len(unorderedPulls))980980+ parentMap := make(map[string]*models.Pull, len(unorderedPulls))767981 for _, p := range unorderedPulls {768982 changeIdMap[p.ChangeId] = p769983 if p.ParentChangeId != "" {···772986 }773987774988 // the top of the stack is the pull that is not a parent of any pull775775- var topPull *Pull989989+ var topPull *models.Pull776990 for _, maybeTop := range unorderedPulls {777991 if _, ok := parentMap[maybeTop.ChangeId]; !ok {778992 topPull = maybeTop···780994 }781995 }782996783783- pulls := []*Pull{}997997+ pulls := []*models.Pull{}784998 for {785999 pulls = append(pulls, topPull)7861000 if topPull.ParentChangeId != "" {···7971011 return pulls, nil7981012}7991013800800-func GetAbandonedPulls(e Execer, stackId string) ([]*Pull, error) {10141014+func GetAbandonedPulls(e Execer, stackId string) ([]*models.Pull, error) {8011015 pulls, err := GetPulls(8021016 e,8031017 FilterEq("stack_id", stackId),804804- FilterEq("state", PullDeleted),10181018+ FilterEq("state", models.PullDeleted),8051019 )8061020 if err != nil {8071021 return nil, err8081022 }80910238101024 return pulls, nil811811-}812812-813813-// position of this pull in the stack814814-func (stack Stack) Position(pull *Pull) int {815815- return slices.IndexFunc(stack, func(p *Pull) bool {816816- return p.ChangeId == pull.ChangeId817817- })818818-}819819-820820-// all pulls below this pull (including self) in this stack821821-//822822-// nil if this pull does not belong to this stack823823-func (stack Stack) Below(pull *Pull) Stack {824824- position := stack.Position(pull)825825-826826- if position < 0 {827827- return nil828828- }829829-830830- return stack[position:]831831-}832832-833833-// all pulls below this pull (excluding self) in this stack834834-func (stack Stack) StrictlyBelow(pull *Pull) Stack {835835- below := stack.Below(pull)836836-837837- if len(below) > 0 {838838- return below[1:]839839- }840840-841841- return nil842842-}843843-844844-// all pulls above this pull (including self) in this stack845845-func (stack Stack) Above(pull *Pull) Stack {846846- position := stack.Position(pull)847847-848848- if position < 0 {849849- return nil850850- }851851-852852- return stack[:position+1]853853-}854854-855855-// all pulls below this pull (excluding self) in this stack856856-func (stack Stack) StrictlyAbove(pull *Pull) Stack {857857- above := stack.Above(pull)858858-859859- if len(above) > 0 {860860- return above[:len(above)-1]861861- }862862-863863- return nil864864-}865865-866866-// the combined format-patches of all the newest submissions in this stack867867-func (stack Stack) CombinedPatch() string {868868- // go in reverse order because the bottom of the stack is the last element in the slice869869- var combined strings.Builder870870- for idx := range stack {871871- pull := stack[len(stack)-1-idx]872872- combined.WriteString(pull.LatestPatch())873873- combined.WriteString("\n")874874- }875875- return combined.String()876876-}877877-878878-// filter out PRs that are "active"879879-//880880-// PRs that are still open are active881881-func (stack Stack) Mergeable() Stack {882882- var mergeable Stack883883-884884- for _, p := range stack {885885- // stop at the first merged PR886886- if p.State == PullMerged || p.State == PullClosed {887887- break888888- }889889-890890- // skip over deleted PRs891891- if p.State != PullDeleted {892892- mergeable = append(mergeable, p)893893- }894894- }895895-896896- return mergeable8971025}
···7676 return7777 }78787979- pull, ok := r.Context().Value("pull").(*db.Pull)7979+ pull, ok := r.Context().Value("pull").(*models.Pull)8080 if !ok {8181 log.Println("failed to get pull")8282 s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")···8484 }85858686 // can be nil if this pull is not stacked8787- stack, _ := r.Context().Value("stack").(db.Stack)8787+ stack, _ := r.Context().Value("stack").(models.Stack)88888989 roundNumberStr := chi.URLParam(r, "round")9090 roundNumber, err := strconv.Atoi(roundNumberStr)···124124 return125125 }126126127127- pull, ok := r.Context().Value("pull").(*db.Pull)127127+ pull, ok := r.Context().Value("pull").(*models.Pull)128128 if !ok {129129 log.Println("failed to get pull")130130 s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")···132132 }133133134134 // can be nil if this pull is not stacked135135- stack, _ := r.Context().Value("stack").(db.Stack)136136- abandonedPulls, _ := r.Context().Value("abandonedPulls").([]*db.Pull)135135+ stack, _ := r.Context().Value("stack").(models.Stack)136136+ abandonedPulls, _ := r.Context().Value("abandonedPulls").([]*models.Pull)137137138138 totalIdents := 1139139 for _, submission := range pull.Submissions {···216216 })217217}218218219219-func (s *Pulls) mergeCheck(r *http.Request, f *reporesolver.ResolvedRepo, pull *db.Pull, stack db.Stack) types.MergeCheckResponse {220220- if pull.State == db.PullMerged {219219+func (s *Pulls) mergeCheck(r *http.Request, f *reporesolver.ResolvedRepo, pull *models.Pull, stack models.Stack) types.MergeCheckResponse {220220+ if pull.State == models.PullMerged {221221 return types.MergeCheckResponse{}222222 }223223···283283 return result284284}285285286286-func (s *Pulls) resubmitCheck(r *http.Request, f *reporesolver.ResolvedRepo, pull *db.Pull, stack db.Stack) pages.ResubmitResult {287287- if pull.State == db.PullMerged || pull.State == db.PullDeleted || pull.PullSource == nil {286286+func (s *Pulls) resubmitCheck(r *http.Request, f *reporesolver.ResolvedRepo, pull *models.Pull, stack models.Stack) pages.ResubmitResult {287287+ if pull.State == models.PullMerged || pull.State == models.PullDeleted || pull.PullSource == nil {288288 return pages.Unknown289289 }290290···357357 diffOpts.Split = true358358 }359359360360- pull, ok := r.Context().Value("pull").(*db.Pull)360360+ pull, ok := r.Context().Value("pull").(*models.Pull)361361 if !ok {362362 log.Println("failed to get pull")363363 s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")364364 return365365 }366366367367- stack, _ := r.Context().Value("stack").(db.Stack)367367+ stack, _ := r.Context().Value("stack").(models.Stack)368368369369 roundId := chi.URLParam(r, "round")370370 roundIdInt, err := strconv.Atoi(roundId)···404404 diffOpts.Split = true405405 }406406407407- pull, ok := r.Context().Value("pull").(*db.Pull)407407+ pull, ok := r.Context().Value("pull").(*models.Pull)408408 if !ok {409409 log.Println("failed to get pull")410410 s.pages.Notice(w, "pull-error", "Failed to get pull.")···452452}453453454454func (s *Pulls) RepoPullPatchRaw(w http.ResponseWriter, r *http.Request) {455455- pull, ok := r.Context().Value("pull").(*db.Pull)455455+ pull, ok := r.Context().Value("pull").(*models.Pull)456456 if !ok {457457 log.Println("failed to get pull")458458 s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")···475475 user := s.oauth.GetUser(r)476476 params := r.URL.Query()477477478478- state := db.PullOpen478478+ state := models.PullOpen479479 switch params.Get("state") {480480 case "closed":481481- state = db.PullClosed481481+ state = models.PullClosed482482 case "merged":483483- state = db.PullMerged483483+ state = models.PullMerged484484 }485485486486 f, err := s.repoResolver.Resolve(r)···516516 }517517518518 // we want to group all stacked PRs into just one list519519- stacks := make(map[string]db.Stack)519519+ stacks := make(map[string]models.Stack)520520 var shas []string521521 n := 0522522 for _, p := range pulls {···575575 return576576 }577577578578- pull, ok := r.Context().Value("pull").(*db.Pull)578578+ pull, ok := r.Context().Value("pull").(*models.Pull)579579 if !ok {580580 log.Println("failed to get pull")581581 s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")···648648 return649649 }650650651651- comment := &db.PullComment{651651+ comment := &models.PullComment{652652 OwnerDid: user.Did,653653 RepoAt: f.RepoAt().String(),654654 PullId: pull.PullId,···891891 return892892 }893893894894- pullSource := &db.PullSource{894894+ pullSource := &models.PullSource{895895 Branch: sourceBranch,896896 }897897 recordPullSource := &tangled.RepoPull_Source{···10011001 forkAtUri := fork.RepoAt()10021002 forkAtUriStr := forkAtUri.String()1003100310041004- pullSource := &db.PullSource{10041004+ pullSource := &models.PullSource{10051005 Branch: sourceBranch,10061006 RepoAt: &forkAtUri,10071007 }···10221022 title, body, targetBranch string,10231023 patch string,10241024 sourceRev string,10251025- pullSource *db.PullSource,10251025+ pullSource *models.PullSource,10261026 recordPullSource *tangled.RepoPull_Source,10271027 isStacked bool,10281028) {···10741074 }1075107510761076 rkey := tid.TID()10771077- initialSubmission := db.PullSubmission{10771077+ initialSubmission := models.PullSubmission{10781078 Patch: patch,10791079 SourceRev: sourceRev,10801080 }10811081- pull := &db.Pull{10811081+ pull := &models.Pull{10821082 Title: title,10831083 Body: body,10841084 TargetBranch: targetBranch,10851085 OwnerDid: user.Did,10861086 RepoAt: f.RepoAt(),10871087 Rkey: rkey,10881088- Submissions: []*db.PullSubmission{10881088+ Submissions: []*models.PullSubmission{10891089 &initialSubmission,10901090 },10911091 PullSource: pullSource,···11441144 targetBranch string,11451145 patch string,11461146 sourceRev string,11471147- pullSource *db.PullSource,11471147+ pullSource *models.PullSource,11481148) {11491149 // run some necessary checks for stacked-prs first11501150···14521452 return14531453 }1454145414551455- pull, ok := r.Context().Value("pull").(*db.Pull)14551455+ pull, ok := r.Context().Value("pull").(*models.Pull)14561456 if !ok {14571457 log.Println("failed to get pull")14581458 s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")···14831483func (s *Pulls) resubmitPatch(w http.ResponseWriter, r *http.Request) {14841484 user := s.oauth.GetUser(r)1485148514861486- pull, ok := r.Context().Value("pull").(*db.Pull)14861486+ pull, ok := r.Context().Value("pull").(*models.Pull)14871487 if !ok {14881488 log.Println("failed to get pull")14891489 s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")···15101510func (s *Pulls) resubmitBranch(w http.ResponseWriter, r *http.Request) {15111511 user := s.oauth.GetUser(r)1512151215131513- pull, ok := r.Context().Value("pull").(*db.Pull)15131513+ pull, ok := r.Context().Value("pull").(*models.Pull)15141514 if !ok {15151515 log.Println("failed to get pull")15161516 s.pages.Notice(w, "resubmit-error", "Failed to edit patch. Try again later.")···15731573func (s *Pulls) resubmitFork(w http.ResponseWriter, r *http.Request) {15741574 user := s.oauth.GetUser(r)1575157515761576- pull, ok := r.Context().Value("pull").(*db.Pull)15761576+ pull, ok := r.Context().Value("pull").(*models.Pull)15771577 if !ok {15781578 log.Println("failed to get pull")15791579 s.pages.Notice(w, "resubmit-error", "Failed to edit patch. Try again later.")···16661666}1667166716681668// validate a resubmission against a pull request16691669-func validateResubmittedPatch(pull *db.Pull, patch string) error {16691669+func validateResubmittedPatch(pull *models.Pull, patch string) error {16701670 if patch == "" {16711671 return fmt.Errorf("Patch is empty.")16721672 }···16871687 r *http.Request,16881688 f *reporesolver.ResolvedRepo,16891689 user *oauth.User,16901690- pull *db.Pull,16901690+ pull *models.Pull,16911691 patch string,16921692 sourceRev string,16931693) {···17911791 r *http.Request,17921792 f *reporesolver.ResolvedRepo,17931793 user *oauth.User,17941794- pull *db.Pull,17941794+ pull *models.Pull,17951795 patch string,17961796 stackId string,17971797) {17981798 targetBranch := pull.TargetBranch1799179918001800- origStack, _ := r.Context().Value("stack").(db.Stack)18001800+ origStack, _ := r.Context().Value("stack").(models.Stack)18011801 newStack, err := newStack(f, user, targetBranch, patch, pull.PullSource, stackId)18021802 if err != nil {18031803 log.Println("failed to create resubmitted stack", err)···18061806 }1807180718081808 // find the diff between the stacks, first, map them by changeId18091809- origById := make(map[string]*db.Pull)18101810- newById := make(map[string]*db.Pull)18091809+ origById := make(map[string]*models.Pull)18101810+ newById := make(map[string]*models.Pull)18111811 for _, p := range origStack {18121812 origById[p.ChangeId] = p18131813 }···18201820 // commits that got updated: corresponding pull is resubmitted & new round begins18211821 //18221822 // for commits that were unchanged: no changes, parent-change-id is updated as necessary18231823- additions := make(map[string]*db.Pull)18241824- deletions := make(map[string]*db.Pull)18231823+ additions := make(map[string]*models.Pull)18241824+ deletions := make(map[string]*models.Pull)18251825 unchanged := make(map[string]struct{})18261826 updated := make(map[string]struct{})18271827···18811881 // deleted pulls are marked as deleted in the DB18821882 for _, p := range deletions {18831883 // do not do delete already merged PRs18841884- if p.State == db.PullMerged {18841884+ if p.State == models.PullMerged {18851885 continue18861886 }18871887···19261926 np, _ := newById[id]1927192719281928 // do not update already merged PRs19291929- if op.State == db.PullMerged {19291929+ if op.State == models.PullMerged {19301930 continue19311931 }19321932···20472047 return20482048 }2049204920502050- pull, ok := r.Context().Value("pull").(*db.Pull)20502050+ pull, ok := r.Context().Value("pull").(*models.Pull)20512051 if !ok {20522052 log.Println("failed to get pull")20532053 s.pages.Notice(w, "pull-merge-error", "Failed to merge patch. Try again later.")20542054 return20552055 }2056205620572057- var pullsToMerge db.Stack20572057+ var pullsToMerge models.Stack20582058 pullsToMerge = append(pullsToMerge, pull)20592059 if pull.IsStacked() {20602060- stack, ok := r.Context().Value("stack").(db.Stack)20602060+ stack, ok := r.Context().Value("stack").(models.Stack)20612061 if !ok {20622062 log.Println("failed to get stack")20632063 s.pages.Notice(w, "pull-merge-error", "Failed to merge patch. Try again later.")···21592159 return21602160 }2161216121622162- pull, ok := r.Context().Value("pull").(*db.Pull)21622162+ pull, ok := r.Context().Value("pull").(*models.Pull)21632163 if !ok {21642164 log.Println("failed to get pull")21652165 s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")···21872187 }21882188 defer tx.Rollback()2189218921902190- var pullsToClose []*db.Pull21902190+ var pullsToClose []*models.Pull21912191 pullsToClose = append(pullsToClose, pull)2192219221932193 // if this PR is stacked, then we want to close all PRs below this one on the stack21942194 if pull.IsStacked() {21952195- stack := r.Context().Value("stack").(db.Stack)21952195+ stack := r.Context().Value("stack").(models.Stack)21962196 subStack := stack.StrictlyBelow(pull)21972197 pullsToClose = append(pullsToClose, subStack...)21982198 }···22272227 return22282228 }2229222922302230- pull, ok := r.Context().Value("pull").(*db.Pull)22302230+ pull, ok := r.Context().Value("pull").(*models.Pull)22312231 if !ok {22322232 log.Println("failed to get pull")22332233 s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")···22552255 }22562256 defer tx.Rollback()2257225722582258- var pullsToReopen []*db.Pull22582258+ var pullsToReopen []*models.Pull22592259 pullsToReopen = append(pullsToReopen, pull)2260226022612261 // if this PR is stacked, then we want to reopen all PRs above this one on the stack22622262 if pull.IsStacked() {22632263- stack := r.Context().Value("stack").(db.Stack)22632263+ stack := r.Context().Value("stack").(models.Stack)22642264 subStack := stack.StrictlyAbove(pull)22652265 pullsToReopen = append(pullsToReopen, subStack...)22662266 }···22852285 s.pages.HxLocation(w, fmt.Sprintf("/%s/pulls/%d", f.OwnerSlashRepo(), pull.PullId))22862286}2287228722882288-func newStack(f *reporesolver.ResolvedRepo, user *oauth.User, targetBranch, patch string, pullSource *db.PullSource, stackId string) (db.Stack, error) {22882288+func newStack(f *reporesolver.ResolvedRepo, user *oauth.User, targetBranch, patch string, pullSource *models.PullSource, stackId string) (models.Stack, error) {22892289 formatPatches, err := patchutil.ExtractPatches(patch)22902290 if err != nil {22912291 return nil, fmt.Errorf("Failed to extract patches: %v", err)···22972297 }2298229822992299 // the stack is identified by a UUID23002300- var stack db.Stack23002300+ var stack models.Stack23012301 parentChangeId := ""23022302 for _, fp := range formatPatches {23032303 // all patches must have a jj change-id···23102310 body := fp.Body23112311 rkey := tid.TID()2312231223132313- initialSubmission := db.PullSubmission{23132313+ initialSubmission := models.PullSubmission{23142314 Patch: fp.Raw,23152315 SourceRev: fp.SHA,23162316 }23172317- pull := db.Pull{23172317+ pull := models.Pull{23182318 Title: title,23192319 Body: body,23202320 TargetBranch: targetBranch,23212321 OwnerDid: user.Did,23222322 RepoAt: f.RepoAt(),23232323 Rkey: rkey,23242324- Submissions: []*db.PullSubmission{23242324+ Submissions: []*models.PullSubmission{23252325 &initialSubmission,23262326 },23272327 PullSource: pullSource,