| 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "errors" |
| 5 | "reasonix/internal/config" |
| 6 | ) |
| 7 | |
| 8 | var errProjectStateCollisionAssignment = errors.New("project state collision assignment") |
| 9 | |
| 10 | // assignAddedProjectStateCollisions assigns a new root only when a recorded |
| 11 | // project still uses the same legacy directory. Recorded roots and existing |
| 12 | // assignments keep their current directory. |
| 13 | func assignAddedProjectStateCollisions(previous []string, projects []desktopProject) error { |
| 14 | known := append([]string(nil), previous...) |
| 15 | userDir := config.MemoryUserDir() |
| 16 | for _, project := range projects { |
| 17 | root := normalizeProjectRoot(project.Root) |
| 18 | if root == "" { |
| 19 | continue |
| 20 | } |
| 21 | alreadyKnown := false |
| 22 | collision := false |
| 23 | for _, prior := range known { |
| 24 | if sameProjectRoot(prior, root) { |
| 25 | alreadyKnown = true |
| 26 | break |
| 27 | } |
| 28 | if config.WorkspaceSlug(prior) == config.WorkspaceSlug(root) && |
| 29 | config.ProjectStateDir(userDir, prior) == config.ProjectStateDir(userDir, root) { |
| 30 | collision = true |
| 31 | } |
| 32 | } |
| 33 | if alreadyKnown { |
| 34 | continue |
| 35 | } |
| 36 | if collision { |
| 37 | if err := config.AssignProjectStateCollision(userDir, root); err != nil { |
| 38 | return err |
| 39 | } |
| 40 | } |
| 41 | known = append(known, root) |
| 42 | } |
| 43 | return nil |
| 44 | } |
| 45 |