MCPcopy Create free account
hub / github.com/compozy/agh / ResolveOrRegister

Method ResolveOrRegister

internal/workspace/resolver.go:179–249  ·  view source on GitHub ↗

ResolveOrRegister resolves an existing workspace by canonical path or auto-registers it.

(ctx context.Context, path string)

Source from the content-addressed store, hash-verified

177
178// ResolveOrRegister resolves an existing workspace by canonical path or auto-registers it.
179func (r *Resolver) ResolveOrRegister(ctx context.Context, path string) (ResolvedWorkspace, error) {
180 if err := checkContext(ctx); err != nil {
181 return ResolvedWorkspace{}, err
182 }
183
184 canonicalRoot, err := canonicalRoot(path)
185 if err != nil {
186 return ResolvedWorkspace{}, err
187 }
188
189 ws, err := r.store.GetWorkspaceByPath(ctx, canonicalRoot)
190 if err == nil {
191 return r.Resolve(ctx, ws.ID)
192 }
193 if !errors.Is(err, ErrWorkspaceNotFound) {
194 return ResolvedWorkspace{}, fmt.Errorf("workspace: lookup workspace by path %q: %w", canonicalRoot, err)
195 }
196 ws, err = r.lookupWorkspaceBySameRoot(ctx, canonicalRoot)
197 if err == nil {
198 return r.Resolve(ctx, ws.ID)
199 }
200 if !errors.Is(err, ErrWorkspaceNotFound) {
201 return ResolvedWorkspace{}, err
202 }
203
204 ws, err = r.createWorkspaceRegistration(ctx, RegisterOptions{RootDir: canonicalRoot})
205 if err != nil {
206 if errors.Is(err, ErrWorkspacePathTaken) {
207 existing, lookupErr := r.store.GetWorkspaceByPath(ctx, canonicalRoot)
208 if lookupErr != nil {
209 return ResolvedWorkspace{}, fmt.Errorf(
210 "workspace: reload concurrent workspace registration for %q: %w",
211 canonicalRoot,
212 lookupErr,
213 )
214 }
215 return r.Resolve(ctx, existing.ID)
216 }
217 return ResolvedWorkspace{}, err
218 }
219
220 resolved, err := r.Resolve(ctx, ws.ID)
221 if err != nil {
222 deleteErr := r.rollbackDeleteWorkspace(ctx, ws.ID)
223 if deleteErr != nil && !errors.Is(deleteErr, ErrWorkspaceNotFound) {
224 return ResolvedWorkspace{}, errors.Join(
225 err,
226 fmt.Errorf("workspace: rollback auto-registered workspace %q: %w", ws.ID, deleteErr),
227 )
228 }
229 return ResolvedWorkspace{}, err
230 }
231 if err := r.notifyChangeHook(ctx, "auto-register", ws.ID); err != nil {
232 deleteErr := r.rollbackDeleteWorkspace(ctx, ws.ID)
233 if deleteErr != nil && !errors.Is(deleteErr, ErrWorkspaceNotFound) {
234 return ResolvedWorkspace{}, errors.Join(
235 err,
236 fmt.Errorf("workspace: rollback auto-registered workspace %q: %w", ws.ID, deleteErr),

Callers 4

newManagerHarnessFunction · 0.95
seedDaemonWorkspaceFunction · 0.95
referenceSeedWorkspaceFunction · 0.95

Calls 10

ResolveMethod · 0.95
notifyChangeHookMethod · 0.95
canonicalRootFunction · 0.85
checkContextFunction · 0.70
GetWorkspaceByPathMethod · 0.65
InfoMethod · 0.65
IsMethod · 0.45

Tested by 4

newManagerHarnessFunction · 0.76
seedDaemonWorkspaceFunction · 0.76
referenceSeedWorkspaceFunction · 0.76