| 119 | } |
| 120 | |
| 121 | func (t1 *Tasks) Merge(t2 *Tasks, include *Include, includedTaskfileVars *Vars) error { |
| 122 | defer t2.mutex.RUnlock() |
| 123 | t2.mutex.RLock() |
| 124 | for name, v := range t2.All(nil) { |
| 125 | // We do a deep copy of the task struct here to ensure that no data can |
| 126 | // be changed elsewhere once the taskfile is merged. |
| 127 | task := v.DeepCopy() |
| 128 | // Set the task to internal if EITHER the included task or the included |
| 129 | // taskfile are marked as internal |
| 130 | task.Internal = task.Internal || (include != nil && include.Internal) |
| 131 | taskName := name |
| 132 | |
| 133 | // if the task is in the exclude list, don't add it to the merged taskfile |
| 134 | if slices.Contains(include.Excludes, name) { |
| 135 | continue |
| 136 | } |
| 137 | |
| 138 | if !include.Flatten { |
| 139 | // Add namespaces to task dependencies |
| 140 | for _, dep := range task.Deps { |
| 141 | if dep != nil && dep.Task != "" { |
| 142 | dep.Task = taskNameWithNamespace(dep.Task, include.Namespace) |
| 143 | } |
| 144 | } |
| 145 | |
| 146 | // Add namespaces to task commands |
| 147 | for _, cmd := range task.Cmds { |
| 148 | if cmd != nil && cmd.Task != "" { |
| 149 | cmd.Task = taskNameWithNamespace(cmd.Task, include.Namespace) |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | // Add namespaces to task aliases |
| 154 | for i, alias := range task.Aliases { |
| 155 | task.Aliases[i] = taskNameWithNamespace(alias, include.Namespace) |
| 156 | } |
| 157 | |
| 158 | // Add namespace aliases |
| 159 | if include != nil { |
| 160 | for _, namespaceAlias := range include.Aliases { |
| 161 | task.Aliases = append(task.Aliases, taskNameWithNamespace(task.Task, namespaceAlias)) |
| 162 | for _, alias := range v.Aliases { |
| 163 | task.Aliases = append(task.Aliases, taskNameWithNamespace(alias, namespaceAlias)) |
| 164 | } |
| 165 | } |
| 166 | } |
| 167 | |
| 168 | taskName = taskNameWithNamespace(name, include.Namespace) |
| 169 | task.Namespace = include.Namespace |
| 170 | task.Task = taskName |
| 171 | } |
| 172 | |
| 173 | if include.AdvancedImport { |
| 174 | task.Dir = filepathext.SmartJoin(include.Dir, task.Dir) |
| 175 | if task.IncludeVars == nil { |
| 176 | task.IncludeVars = NewVars() |
| 177 | } |
| 178 | task.IncludeVars.Merge(include.Vars, nil) |