+1
-1
appview/db/repos.go
+1
-1
appview/db/repos.go
···
556
556
return err
557
557
}
558
558
559
-
func UpdateSpindle(e Execer, repoAt, spindle string) error {
559
+
func UpdateSpindle(e Execer, repoAt string, spindle *string) error {
560
560
_, err := e.Exec(
561
561
`update repos set spindle = ? where at_uri = ?`, spindle, repoAt)
562
562
return err
+6
-1
appview/pages/templates/repo/settings/pipelines.html
+6
-1
appview/pages/templates/repo/settings/pipelines.html
···
38
38
name="spindle"
39
39
required
40
40
class="p-1 max-w-64 border border-gray-200 bg-white dark:bg-gray-800 dark:text-white dark:border-gray-700">
41
-
<option value="" disabled>
41
+
{{/* For some reason, we can't use an empty string in a <select> in all scenarios unless it is preceded by a disabled select?? No idea, could just be a Firefox thing? */}}
42
+
<option value="[[none]]" class="py-1" {{ if not $.CurrentSpindle }}selected{{ end }}>
43
+
{{ if not $.CurrentSpindle }}
42
44
Choose a spindle
45
+
{{ else }}
46
+
Disable pipelines
47
+
{{ end }}
43
48
</option>
44
49
{{ range $.Spindles }}
45
50
<option value="{{ . }}" class="py-1" {{ if eq . $.CurrentSpindle }}selected{{ end }}>
+25
-15
appview/repo/repo.go
+25
-15
appview/repo/repo.go
···
657
657
}
658
658
659
659
newSpindle := r.FormValue("spindle")
660
+
removingSpindle := newSpindle == "[[none]]" // see pages/templates/repo/settings/pipelines.html for more info on why we use this value
660
661
client, err := rp.oauth.AuthorizedClient(r)
661
662
if err != nil {
662
663
fail("Failed to authorize. Try again later.", err)
663
664
return
664
665
}
665
666
666
-
// ensure that this is a valid spindle for this user
667
-
validSpindles, err := rp.enforcer.GetSpindlesForUser(user.Did)
668
-
if err != nil {
669
-
fail("Failed to find spindles. Try again later.", err)
670
-
return
667
+
if !removingSpindle {
668
+
// ensure that this is a valid spindle for this user
669
+
validSpindles, err := rp.enforcer.GetSpindlesForUser(user.Did)
670
+
if err != nil {
671
+
fail("Failed to find spindles. Try again later.", err)
672
+
return
673
+
}
674
+
675
+
if !slices.Contains(validSpindles, newSpindle) {
676
+
fail("Failed to configure spindle.", fmt.Errorf("%s is not a valid spindle: %q", newSpindle, validSpindles))
677
+
return
678
+
}
671
679
}
672
680
673
-
if !slices.Contains(validSpindles, newSpindle) {
674
-
fail("Failed to configure spindle.", fmt.Errorf("%s is not a valid spindle: %q", newSpindle, validSpindles))
675
-
return
681
+
spindlePtr := &newSpindle
682
+
if removingSpindle {
683
+
spindlePtr = nil
676
684
}
677
685
678
686
// optimistic update
679
-
err = db.UpdateSpindle(rp.db, string(repoAt), newSpindle)
687
+
err = db.UpdateSpindle(rp.db, string(repoAt), spindlePtr)
680
688
if err != nil {
681
689
fail("Failed to update spindle. Try again later.", err)
682
690
return
···
699
707
Owner: user.Did,
700
708
CreatedAt: f.CreatedAt,
701
709
Description: &f.Description,
702
-
Spindle: &newSpindle,
710
+
Spindle: spindlePtr,
703
711
},
704
712
},
705
713
})
···
709
717
return
710
718
}
711
719
712
-
// add this spindle to spindle stream
713
-
rp.spindlestream.AddSource(
714
-
context.Background(),
715
-
eventconsumer.NewSpindleSource(newSpindle),
716
-
)
720
+
if !removingSpindle {
721
+
// add this spindle to spindle stream
722
+
rp.spindlestream.AddSource(
723
+
context.Background(),
724
+
eventconsumer.NewSpindleSource(newSpindle),
725
+
)
726
+
}
717
727
718
728
rp.pages.HxRefresh(w)
719
729
}