forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

wip

Changed files
+153 -8
appview
pages
templates
repo
pulls
state
+93 -3
appview/pages/templates/repo/pulls/pulls.html
···
{{ define "title" }}pulls · {{ .RepoInfo.FullName }}{{ end }}
{{ define "repoContent" }}
-
<p class="text-gray-400">
-
Support for pull requests is actively being worked on. Stay tuned!
-
</p>
+
<div class="flex justify-between items-center">
+
<p>
+
filtering
+
<select
+
class="border px-1 bg-white border-gray-200"
+
onchange="window.location.href = '/{{ .RepoInfo.FullName }}/pulls?state=' + this.value"
+
>
+
<option value="open" {{ if .FilteringByOpen }}selected{{ end }}>
+
open
+
</option>
+
<option
+
value="closed"
+
{{ if eq .FilteringState "closed" }}selected{{ end }}
+
>
+
closed
+
</option>
+
<option
+
value="merged"
+
{{ if eq .FilteringState "merged" }}selected{{ end }}
+
>
+
merged
+
</option>
+
</select>
+
pull requests
+
</p>
+
<a
+
href="/{{ .RepoInfo.FullName }}/pulls/new"
+
class="btn text-sm flex items-center gap-2 no-underline hover:no-underline"
+
>
+
<i data-lucide="git-pull-request" class="w-5 h-5"></i>
+
<span>new pull request</span>
+
</a>
+
</div>
+
<div class="error" id="pulls"></div>
+
{{ end }}
+
+
{{ define "repoAfter" }}
+
<div class="flex flex-col gap-2 mt-8">
+
{{ range .Pulls }}
+
<div class="rounded drop-shadow-sm bg-white px-6 py-4">
+
<div class="pb-2">
+
<a
+
href="/{{ $.RepoInfo.FullName }}/pulls/{{ .PullId }}"
+
class="no-underline hover:underline"
+
>
+
{{ .Title }}
+
<span class="text-gray-500">#{{ .PullId }}</span>
+
</a>
+
</div>
+
<p class="text-sm text-gray-500">
+
{{ $bgColor := "bg-gray-800" }}
+
{{ $icon := "ban" }}
+
{{ $state := "closed" }}
+
+
{{ if eq .Open 1 }}
+
{{ $bgColor = "bg-green-600" }}
+
{{ $icon = "git-pull-request" }}
+
{{ $state = "open" }}
+
{{ else if eq .Open 2 }}
+
{{ $bgColor = "bg-purple-600" }}
+
{{ $icon = "git-merge" }}
+
{{ $state = "merged" }}
+
{{ end }}
+
+
+
<span
+
class="inline-flex items-center rounded px-2 py-[5px] {{ $bgColor }} text-sm"
+
>
+
<i
+
data-lucide="{{ $icon }}"
+
class="w-3 h-3 mr-1.5 text-white"
+
></i>
+
<span class="text-white">{{ $state }}</span>
+
</span>
+
+
<span>
+
{{ $owner := index $.DidHandleMap .OwnerDid }}
+
<a href="/{{ $owner }}">{{ $owner }}</a>
+
</span>
+
+
<span class="before:content-['·']">
+
<time>
+
{{ .Created | timeFmt }}
+
</time>
+
</span>
+
+
<span class="before:content-['·']">
+
targeting branch <code>{{ .TargetBranch }}</code>
+
</span>
+
</p>
+
</div>
+
{{ end }}
+
</div>
{{ end }}
+60 -5
appview/state/repo.go
···
return
}
-
err = db.EditPatch(s.db, f.RepoAt, prIdInt, patch)
+
// Get pull information before updating to get the atproto record URI
+
pull, _, err := db.GetPullWithComments(s.db, f.RepoAt, prIdInt)
+
if err != nil {
+
log.Println("failed to get pull information", err)
+
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
+
return
+
}
+
+
// Start a transaction for database operations
+
tx, err := s.db.BeginTx(r.Context(), nil)
+
if err != nil {
+
log.Println("failed to start transaction", err)
+
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
+
return
+
}
+
+
// Set up deferred rollback that will be overridden by commit if successful
+
defer tx.Rollback()
+
+
// Update patch in the database within transaction
+
err = db.EditPatch(tx, f.RepoAt, prIdInt, patch)
if err != nil {
log.Println("failed to update patch", err)
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
return
}
-
// Get target branch after patch update
-
pull, _, err := db.GetPullWithComments(s.db, f.RepoAt, prIdInt)
+
// Update the atproto record
+
client, _ := s.auth.AuthorizedClient(r)
+
pullAt := pull.PullAt
+
+
// Get the existing record first
+
ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Did, pullAt.RecordKey().String())
+
if err != nil {
+
log.Println("failed to get existing pull record", err)
+
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
+
return
+
}
+
+
// Update the record
+
_, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
+
Collection: tangled.RepoPullNSID,
+
Repo: user.Did,
+
Rkey: pullAt.RecordKey().String(),
+
SwapRecord: ex.Cid,
+
Record: &lexutil.LexiconTypeDecoder{
+
Val: &tangled.RepoPull{
+
Title: pull.Title,
+
PullId: int64(pull.PullId),
+
TargetRepo: string(f.RepoAt),
+
TargetBranch: pull.TargetBranch,
+
Patch: patch,
+
},
+
},
+
})
+
if err != nil {
-
log.Println("failed to get pull information", err)
-
s.pages.Notice(w, "pull-success", "Patch updated successfully.")
+
log.Println("failed to update pull record in atproto", err)
+
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
+
return
+
}
+
+
// Commit the transaction now that both operations have succeeded
+
err = tx.Commit()
+
if err != nil {
+
log.Println("failed to commit transaction", err)
+
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
return
}