| 294 | } |
| 295 | |
| 296 | func (*GitRepository) DecodePersistedObject(ctx context.Context, dag *dagql.Server, resultID uint64, _ *dagql.ResultCall, payload json.RawMessage) (dagql.Typed, error) { |
| 297 | var persisted persistedGitRepositoryPayload |
| 298 | if err := json.Unmarshal(payload, &persisted); err != nil { |
| 299 | return nil, fmt.Errorf("decode persisted git repository payload: %w", err) |
| 300 | } |
| 301 | var remote gitutil.Remote |
| 302 | if len(persisted.RemoteJSON) > 0 && string(persisted.RemoteJSON) != "null" { |
| 303 | if err := json.Unmarshal(persisted.RemoteJSON, &remote); err != nil { |
| 304 | return nil, fmt.Errorf("decode persisted git repository remote: %w", err) |
| 305 | } |
| 306 | } |
| 307 | |
| 308 | repo := &GitRepository{ |
| 309 | Remote: &remote, |
| 310 | DiscardGitDir: persisted.DiscardGitDir, |
| 311 | } |
| 312 | switch persisted.Form { |
| 313 | case persistedGitRepositoryFormLocal: |
| 314 | if persisted.Local == nil { |
| 315 | return nil, fmt.Errorf("decode persisted git repository: missing local payload") |
| 316 | } |
| 317 | dir, err := loadPersistedObjectResultByResultID[*Directory](ctx, dag, persisted.Local.DirectoryResultID, "git repository directory") |
| 318 | if err != nil { |
| 319 | return nil, err |
| 320 | } |
| 321 | repo.Backend = &LocalGitRepository{Directory: dir} |
| 322 | case persistedGitRepositoryFormRemote: |
| 323 | if persisted.Remote == nil { |
| 324 | return nil, fmt.Errorf("decode persisted git repository: missing remote payload") |
| 325 | } |
| 326 | parsedURL, err := gitutil.ParseURL(persisted.Remote.URL) |
| 327 | if err != nil { |
| 328 | return nil, fmt.Errorf("decode persisted git repository URL: %w", err) |
| 329 | } |
| 330 | backend := &RemoteGitRepository{ |
| 331 | URL: parsedURL, |
| 332 | SSHKnownHosts: persisted.Remote.SSHKnownHosts, |
| 333 | AuthUsername: persisted.Remote.AuthUsername, |
| 334 | Platform: persisted.Remote.Platform, |
| 335 | } |
| 336 | var mirror dagql.ObjectResult[*RemoteGitMirror] |
| 337 | if err := dag.Select(ctx, dag.Root(), &mirror, dagql.Selector{ |
| 338 | Field: "_remoteGitMirror", |
| 339 | Args: []dagql.NamedInput{ |
| 340 | {Name: "remoteURL", Value: dagql.String(parsedURL.Remote())}, |
| 341 | }, |
| 342 | }); err != nil { |
| 343 | return nil, fmt.Errorf("decode persisted git repository remote mirror: %w", err) |
| 344 | } |
| 345 | backend.Mirror = mirror |
| 346 | repo.Backend = backend |
| 347 | repo.URL = dagql.NonNull(dagql.String(parsedURL.String())) |
| 348 | default: |
| 349 | return nil, fmt.Errorf("decode persisted git repository: unsupported form %q", persisted.Form) |
| 350 | } |
| 351 | return repo, nil |
| 352 | } |
| 353 | |