Resolve loads and caches the effective runtime snapshot for a workspace.
(ctx context.Context, idOrNameOrPath string)
| 84 | |
| 85 | // Resolve loads and caches the effective runtime snapshot for a workspace. |
| 86 | func (r *Resolver) Resolve(ctx context.Context, idOrNameOrPath string) (resolved ResolvedWorkspace, err error) { |
| 87 | start := r.now() |
| 88 | cacheHit := false |
| 89 | workspaceID := "" |
| 90 | defer r.observeResolve(start, &workspaceID, &cacheHit, &resolved, &err) |
| 91 | |
| 92 | if err := checkContext(ctx); err != nil { |
| 93 | return ResolvedWorkspace{}, err |
| 94 | } |
| 95 | |
| 96 | ws, err := r.lookupWorkspace(ctx, idOrNameOrPath) |
| 97 | if err != nil { |
| 98 | return ResolvedWorkspace{}, err |
| 99 | } |
| 100 | workspaceID = ws.ID |
| 101 | |
| 102 | ws, err = r.refreshRootDir(ctx, ws) |
| 103 | if err != nil { |
| 104 | return ResolvedWorkspace{}, err |
| 105 | } |
| 106 | workspaceID = ws.ID |
| 107 | identity, err := ensureIdentity(ctx, ws.RootDir, r.now, NewWorkspaceID) |
| 108 | if err != nil { |
| 109 | return ResolvedWorkspace{}, err |
| 110 | } |
| 111 | workspaceID = identity.WorkspaceID |
| 112 | |
| 113 | scan, err := r.scanWorkspace(ctx, ws) |
| 114 | if err != nil { |
| 115 | return ResolvedWorkspace{}, err |
| 116 | } |
| 117 | |
| 118 | now := r.now() |
| 119 | |
| 120 | r.mu.Lock() |
| 121 | r.evictExpiredLocked(now) |
| 122 | if cached := r.cache[ws.ID]; cached != nil && cached.canReuse(ws, scan.snapshots) { |
| 123 | cached.lastAccess = now |
| 124 | cacheHit = true |
| 125 | resolved = cloneResolvedWorkspace(&cached.resolved) |
| 126 | resolved.Workspace = cloneWorkspace(ws) |
| 127 | resolved.WorkspaceID = identity.WorkspaceID |
| 128 | r.mu.Unlock() |
| 129 | return resolved, nil |
| 130 | } |
| 131 | r.mu.Unlock() |
| 132 | |
| 133 | resolved, err = r.buildResolvedWorkspace(ctx, ws, scan) |
| 134 | if err != nil { |
| 135 | return ResolvedWorkspace{}, err |
| 136 | } |
| 137 | resolved.WorkspaceID = identity.WorkspaceID |
| 138 | |
| 139 | r.mu.Lock() |
| 140 | r.evictExpiredLocked(now) |
| 141 | r.cache[ws.ID] = &cachedEntry{ |
| 142 | workspace: cloneWorkspace(ws), |
| 143 | resolved: cloneResolvedWorkspace(&resolved), |