Monorepo for Tangled
tangled.org
1package models
2
3import (
4 "strings"
5
6 "github.com/go-git/go-git/v5/plumbing"
7 "tangled.org/core/api/tangled"
8 "tangled.org/core/workflow"
9)
10
11// PipelineEnvVars extracts environment variables from pipeline trigger metadata.
12// These are framework-provided variables that are injected into workflow steps.
13func PipelineEnvVars(tr *tangled.Pipeline_TriggerMetadata, pipelineId PipelineId, devMode bool) map[string]string {
14 if tr == nil {
15 return nil
16 }
17
18 env := make(map[string]string)
19
20 // Standard CI environment variable
21 env["CI"] = "true"
22
23 env["TANGLED_PIPELINE_ID"] = pipelineId.AtUri().String()
24 env["TANGLED_PIPELINE_KIND"] = tr.Kind
25
26 // Repo info
27 if tr.Repo != nil {
28 env["TANGLED_REPO_KNOT"] = tr.Repo.Knot
29 env["TANGLED_REPO_DID"] = tr.Repo.Did
30 if tr.Repo.Repo != nil {
31 env["TANGLED_REPO_NAME"] = *tr.Repo.Repo
32 }
33 if tr.Repo.RepoDid != nil {
34 env["TANGLED_REPO_REPO_DID"] = *tr.Repo.RepoDid
35 }
36 env["TANGLED_REPO_DEFAULT_BRANCH"] = tr.Repo.DefaultBranch
37 env["TANGLED_REPO_URL"] = BuildRepoURL(tr.Repo, devMode)
38 }
39
40 switch workflow.TriggerKind(tr.Kind) {
41 case workflow.TriggerKindPush:
42 if tr.Push != nil {
43 refName := plumbing.ReferenceName(tr.Push.Ref)
44 refType := "branch"
45 if refName.IsTag() {
46 refType = "tag"
47 }
48
49 env["TANGLED_REF"] = tr.Push.Ref
50 env["TANGLED_REF_NAME"] = refName.Short()
51 env["TANGLED_REF_TYPE"] = refType
52 env["TANGLED_SHA"] = tr.Push.NewSha
53 env["TANGLED_COMMIT_SHA"] = tr.Push.NewSha
54 }
55
56 case workflow.TriggerKindPullRequest:
57 if tr.PullRequest != nil {
58 // For PRs, the "ref" is the source branch
59 env["TANGLED_REF"] = "refs/heads/" + tr.PullRequest.SourceBranch
60 env["TANGLED_REF_NAME"] = tr.PullRequest.SourceBranch
61 env["TANGLED_REF_TYPE"] = "branch"
62 env["TANGLED_SHA"] = tr.PullRequest.SourceSha
63 env["TANGLED_COMMIT_SHA"] = tr.PullRequest.SourceSha
64
65 // PR-specific variables
66 env["TANGLED_PR_SOURCE_BRANCH"] = tr.PullRequest.SourceBranch
67 env["TANGLED_PR_TARGET_BRANCH"] = tr.PullRequest.TargetBranch
68 env["TANGLED_PR_SOURCE_SHA"] = tr.PullRequest.SourceSha
69 env["TANGLED_PR_ACTION"] = tr.PullRequest.Action
70 }
71
72 case workflow.TriggerKindManual:
73 // Manual triggers may not have ref/sha info
74 // Include any manual inputs if present
75 if tr.Manual != nil {
76 for _, pair := range tr.Manual.Inputs {
77 env["TANGLED_INPUT_"+strings.ToUpper(pair.Key)] = pair.Value
78 }
79 }
80 }
81
82 return env
83}