MCPcopy Index your code
hub / github.com/jetify-com/devbox / parseURLRef

Function parseURLRef

nix/flake/flakeref.go:123–254  ·  view source on GitHub ↗
(ref string)

Source from the content-addressed store, hash-verified

121}
122
123func parseURLRef(ref string) (parsed Ref, fragment string, err error) {
124 // A good way to test how Nix parses a flake reference is to run:
125 //
126 // nix eval --json --expr 'builtins.parseFlakeRef "ref"' | jq
127 refURL, err := url.Parse(ref)
128 if err != nil {
129 return Ref{}, "", redact.Errorf("parse flake reference as URL: %v", err)
130 }
131
132 // ensure that the fragment is excluded from the parsed URL
133 // since those are not valid in flake references.
134 fragment = refURL.Fragment
135 refURL.Fragment = ""
136
137 switch refURL.Scheme {
138 case "", "flake":
139 // [flake:]<flake-id>(/<rev-or-ref>(/rev)?)?
140
141 parsed.Type = TypeIndirect
142 split, err := splitPathOrOpaque(refURL, -1)
143 if err != nil {
144 return Ref{}, "", redact.Errorf("parse flake reference URL path: %v", err)
145 }
146 parsed.ID = split[0]
147 if len(split) > 1 {
148 if isGitHash(split[1]) {
149 parsed.Rev = split[1]
150 } else {
151 parsed.Ref = split[1]
152 }
153 }
154 if len(split) > 2 && parsed.Rev == "" {
155 parsed.Rev = split[2]
156 }
157 case "path":
158 // [path:]<path>(\?<params)?
159
160 parsed.Type = TypePath
161 if refURL.Path == "" {
162 parsed.Path, err = url.PathUnescape(refURL.Opaque)
163 if err != nil {
164 return Ref{}, "", err
165 }
166 } else {
167 parsed.Path = refURL.Path
168 }
169
170 query := refURL.Query()
171 parsed.NARHash = query.Get("narHash")
172 parsed.LastModified, err = atoiOmitZero(query.Get("lastModified"))
173 if err != nil {
174 return Ref{}, "", redact.Errorf("parse flake reference URL query parameter: lastModified=%s: %v", redact.Safe(parsed.LastModified), redact.Safe(err))
175 }
176 case "http", "https", "file":
177 if isArchive(refURL.Path) {
178 parsed.Type = TypeTarball
179 } else {
180 parsed.Type = TypeFile

Callers 2

ParseRefFunction · 0.85
ParseInstallableFunction · 0.85

Calls 9

ErrorfFunction · 0.92
SafeFunction · 0.92
splitPathOrOpaqueFunction · 0.85
isGitHashFunction · 0.85
atoiOmitZeroFunction · 0.85
isArchiveFunction · 0.85
parseGitHubRefFunction · 0.85
GetMethod · 0.65
StringMethod · 0.45

Tested by

no test coverage detected