diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-07-02 22:52:37 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-07-02 22:52:37 +0900 |
| commit | 3ba6609444978907fe047007f5218271ba97a153 (patch) | |
| tree | 1a3d7951c943b3e895d07b5e514ed5e39977be2e /internal | |
| parent | 6dcc2fdc176642c907105f522af1780dfd721fa2 (diff) | |
internal/pkg: move outcome dereferencing
This prepares substitute computation for shallow extern replacements.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/pkg/pkg.go | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/internal/pkg/pkg.go b/internal/pkg/pkg.go index d8e059bd..6bf34b2a 100644 --- a/internal/pkg/pkg.go +++ b/internal/pkg/pkg.go @@ -1851,6 +1851,35 @@ func (r *RContext) NewMeasuredReader( return r.cache.newMeasuredReader(rc, checksum) } +// tryChecksum dereferences a symlink to a cure outcome. +func (c *Cache) tryChecksum(pathname *check.Absolute) ( + checksum unique.Handle[Checksum], + err error, +) { + _, err = os.Lstat(pathname.String()) + if err == nil { + var name string + if name, err = os.Readlink(pathname.String()); err != nil { + return + } + buf := c.getIdentBuf() + err = Decode((*Checksum)(buf[:]), filepath.Base(name)) + if err == nil { + checksum = unique.Make(Checksum(buf[:])) + } + c.putIdentBuf(buf) + } + return +} + +// tryLocal attempts to obtain an [Artifact] outcome from the filesystem. +func (c *Cache) tryLocal(id unique.Handle[ID]) (unique.Handle[Checksum], error) { + return c.tryChecksum(c.base.Append( + dirIdentifier, + Encode(id.Value()), + )) +} + // tryExtern attempts to obtain an [Artifact] outcome from extern. func (c *Cache) tryExtern( ctx context.Context, @@ -1928,21 +1957,8 @@ func (c *Cache) cure(a Artifact, curesExempt bool) ( defer func() { c.finaliseIdent(done, id, checksum, err) }() } - _, err = os.Lstat(pathname.String()) - if err == nil { - var name string - if name, err = os.Readlink(pathname.String()); err != nil { - return - } - buf := c.getIdentBuf() - err = Decode((*Checksum)(buf[:]), filepath.Base(name)) - if err == nil { - checksum = unique.Make(Checksum(buf[:])) - } - c.putIdentBuf(buf) - return - } - if !errors.Is(err, os.ErrNotExist) { + checksum, err = c.tryChecksum(pathname) + if err == nil || !errors.Is(err, os.ErrNotExist) { return } |
