[mirror] Scalable static site server for Git forges (like GitHub Pages)
1package git_pages
2
3import (
4 "context"
5 "fmt"
6 "log"
7 "slices"
8 "strings"
9)
10
11func RunMigration(ctx context.Context, name string) error {
12 switch name {
13 case "create-domain-markers":
14 return createDomainMarkers(ctx)
15 default:
16 return fmt.Errorf("unknown migration name (expected one of \"create-domain-markers\")")
17 }
18}
19
20func createDomainMarkers(ctx context.Context) error {
21 if backend.HasFeature(ctx, FeatureCheckDomainMarker) {
22 log.Print("store already has domain markers")
23 return nil
24 }
25
26 var manifests, domains []string
27 manifests, err := backend.ListManifests(ctx)
28 if err != nil {
29 return fmt.Errorf("list manifests: %w", err)
30 }
31 slices.Sort(manifests)
32 for _, manifest := range manifests {
33 domain, _, _ := strings.Cut(manifest, "/")
34 if len(domains) == 0 || domains[len(domains)-1] != domain {
35 domains = append(domains, domain)
36 }
37 }
38 for idx, domain := range domains {
39 log.Printf("(%d / %d) creating domain %s", idx+1, len(domains), domain)
40 if err := backend.CreateDomain(ctx, domain); err != nil {
41 return fmt.Errorf("creating domain %s: %w", domain, err)
42 }
43 }
44 if err := backend.EnableFeature(ctx, FeatureCheckDomainMarker); err != nil {
45 return err
46 }
47 log.Printf("created markers for %d domains", len(domains))
48 return nil
49}