aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/rosa/builtins.go
blob: b0ec65b1b11f7262b291545fb0faef7adb4d23ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package rosa

import (
	"path"
	"slices"
	"strconv"
	"strings"

	"hakurei.app/internal/pkg"
)

const (
	// jobsE is expression for preferred job count set by [pkg].
	jobsE = `"$` + pkg.EnvJobs + `"`
	// jobsFlagE is expression for flag with preferred job count.
	jobsFlagE = `"-j$` + pkg.EnvJobs + `"`
	// jobsLE is expression for twice of preferred job count set by [pkg].
	jobsLE = `"$(expr ` + jobsE + ` '*' 2)"`
	// jobsLFlagE is expression for flag with double of preferred job count.
	jobsLFlagE = `"-j$(expr ` + jobsE + ` '*' 2)"`
)

// newTar wraps [pkg.NewHTTPGetTar] with a simpler function signature.
func newTar(url, checksum string, compression uint32) pkg.Artifact {
	return pkg.NewHTTPGetTar(nil, url, mustDecode(checksum), compression)
}

// newFromCPAN is a helper for downloading release from CPAN.
func newFromCPAN(author, name, version, checksum string) pkg.Artifact {
	return newTar(
		"https://cpan.metacpan.org/authors/id/"+
			author[:1]+"/"+author[:2]+"/"+author+"/"+
			name+"-"+version+".tar.gz",
		checksum,
		pkg.TarGzip,
	)
}

// newFromGitLab is a helper for downloading source from GitLab.
func newFromGitLab(domain, suffix, ref, checksum string) pkg.Artifact {
	return newTar(
		"https://"+domain+"/"+suffix+"/-/archive/"+
			ref+"/"+path.Base(suffix)+"-"+
			strings.ReplaceAll(ref, "/", "-")+".tar.bz2",
		checksum,
		pkg.TarBzip2,
	)
}

// newFromGitHub is a helper for downloading source from Microsoft Github.
func newFromGitHub(suffix, tag, checksum string) pkg.Artifact {
	return newTar(
		"https://github.com/"+suffix+
			"/archive/refs/tags/"+tag+".tar.gz",
		checksum,
		pkg.TarGzip,
	)
}

// newFromGitHubRelease is a helper for downloading release tarball from
// Microsoft Github.
func newFromGitHubRelease(
	suffix, tag, name, checksum string,
	compression uint32,
) pkg.Artifact {
	return newTar(
		"https://github.com/"+suffix+
			"/releases/download/"+tag+"/"+name,
		checksum,
		compression,
	)
}

// skipGNUTests generates a string for skipping specific tests by number in a
// GNU test suite. This is nontrivial because the test suite does not support
// excluding tests in any way, so ranges for all but the skipped tests have to
// be specified instead.
//
// For example, to skip test 764, ranges around the skipped test must be
// specified:
//
//	1-763 765-
//
// Tests are numbered starting from 1. The resulting string is unquoted.
func skipGNUTests(tests ...int64) string {
	tests = slices.Clone(tests)
	slices.Sort(tests)

	var buf strings.Builder

	if tests[0] != 1 {
		buf.WriteString("1-")
	}

	for i, n := range tests {
		if n != 1 && (i == 0 || tests[i-1] != n-1) {
			buf.WriteString(strconv.Itoa(int(n - 1)))
			buf.WriteString(" ")
		}
		if i == len(tests)-1 || tests[i+1] != n+1 {
			buf.WriteString(strconv.Itoa(int(n + 1)))
			buf.WriteString("-")
		}
	}
	return buf.String()
}