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