@@ -49,7 +49,7 @@ import { ITerminalProfileResolverService } from '../../terminal/common/terminal.
49
49
50
50
import { ConfiguringTask , ContributedTask , CustomTask , ExecutionEngine , InMemoryTask , ITaskEvent , ITaskIdentifier , ITaskSet , JsonSchemaVersion , KeyedTaskIdentifier , RuntimeType , Task , TASK_RUNNING_STATE , TaskDefinition , TaskGroup , TaskRunSource , TaskSettingId , TaskSorter , TaskSourceKind , TasksSchemaProperties , USER_TASKS_GROUP_KEY , TaskEventKind , InstancePolicy } from '../common/tasks.js' ;
51
51
import { CustomExecutionSupportedContext , ICustomizationProperties , IProblemMatcherRunOptions , ITaskFilter , ITaskProvider , ITaskService , IWorkspaceFolderTaskResult , ProcessExecutionSupportedContext , ServerlessWebContext , ShellExecutionSupportedContext , TaskCommandsRegistered , TaskExecutionSupportedContext } from '../common/taskService.js' ;
52
- import { ITaskExecuteResult , ITaskResolver , ITaskSummary , ITaskSystem , ITaskSystemInfo , ITaskTerminateResponse , TaskError , TaskErrors , TaskExecuteKind } from '../common/taskSystem.js' ;
52
+ import { ITaskExecuteResult , ITaskResolver , ITaskSummary , ITaskSystem , ITaskSystemInfo , ITaskTerminateResponse , TaskError , TaskErrors , TaskExecuteKind , Triggers , VerifiedTask } from '../common/taskSystem.js' ;
53
53
import { getTemplates as getTaskTemplates } from '../common/taskTemplates.js' ;
54
54
55
55
import * as TaskConfig from '../common/taskConfiguration.js' ;
@@ -324,8 +324,26 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
324
324
}
325
325
326
326
this . _setTaskLRUCacheLimit ( ) ;
327
- await this . _updateWorkspaceTasks ( TaskRunSource . ConfigurationChange ) ;
327
+ const mapStringToFolderTasks : Map < string , IWorkspaceFolderTaskResult > = await this . _updateWorkspaceTasks ( TaskRunSource . ConfigurationChange ) ;
328
328
this . _onDidChangeTaskConfig . fire ( ) ;
329
+
330
+ // Loop through all workspaceFolderTask result
331
+ for ( const [ folderUri , folderResult ] of mapStringToFolderTasks ) {
332
+ if ( ! folderResult . set ?. tasks ?. length ) {
333
+ continue ;
334
+ }
335
+
336
+ for ( const task of folderResult . set . tasks ) {
337
+ const realUniqueId = task . _id ;
338
+ const lastTask = this . _taskSystem ?. lastTask ?. task . _id ;
339
+
340
+ if ( lastTask && lastTask === realUniqueId && folderUri !== 'setting' ) {
341
+ const verifiedLastTask = new VerifiedTask ( task , this . _taskSystem ! . lastTask ! . resolver , Triggers . command ) ;
342
+ this . _taskSystem ! . lastTask = verifiedLastTask ;
343
+ }
344
+ }
345
+ }
346
+
329
347
} ) ) ;
330
348
this . _taskRunningState = TASK_RUNNING_STATE . bindTo ( _contextKeyService ) ;
331
349
this . _onDidStateChange = this . _register ( new Emitter ( ) ) ;
@@ -2035,7 +2053,14 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
2035
2053
const response = await this . _taskSystem . terminate ( task ) ;
2036
2054
if ( response . success ) {
2037
2055
try {
2038
- await this . run ( task ) ;
2056
+ // Before restarting, check if the task still exists and get updated version
2057
+ const updatedTask = await this . _findUpdatedTask ( task ) ;
2058
+ if ( updatedTask ) {
2059
+ await this . run ( updatedTask ) ;
2060
+ } else {
2061
+ // Task no longer exists, show warning
2062
+ this . _notificationService . warn ( nls . localize ( 'TaskSystem.taskNoLongerExists' , 'Task {0} no longer exists or has been modified. Cannot restart.' , task . configurationProperties . name ) ) ;
2063
+ }
2039
2064
} catch {
2040
2065
// eat the error, we don't care about it here
2041
2066
}
@@ -2044,6 +2069,37 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
2044
2069
}
2045
2070
}
2046
2071
2072
+ private async _findUpdatedTask ( originalTask : Task ) : Promise < Task | undefined > {
2073
+ const mapStringToFolderTasks = await this . _updateWorkspaceTasks ( TaskRunSource . System ) ;
2074
+
2075
+ // Look for the task in current workspace configuration
2076
+ for ( const [ _ , folderResult ] of mapStringToFolderTasks ) {
2077
+ if ( ! folderResult . set ?. tasks ?. length && ! folderResult . configurations ?. byIdentifier ) {
2078
+ continue ;
2079
+ }
2080
+ // There are two ways where Task lives:
2081
+ // 1. folderResult.set.tasks
2082
+ if ( folderResult . set ?. tasks ) {
2083
+ for ( const task of folderResult . set . tasks ) {
2084
+ // Check if this is the same task by ID
2085
+ if ( task . _id === originalTask . _id ) {
2086
+ return task ;
2087
+ }
2088
+ }
2089
+ }
2090
+ // 2. folderResult.configurations.byIdentifier
2091
+ if ( folderResult . configurations ?. byIdentifier ) {
2092
+ for ( const [ _ , configuringTask ] of Object . entries ( folderResult . configurations . byIdentifier ) ) {
2093
+ // Check if this is the same task by ID
2094
+ if ( configuringTask . _id === originalTask . _id ) {
2095
+ return this . tryResolveTask ( configuringTask ) ;
2096
+ }
2097
+ }
2098
+ }
2099
+ }
2100
+ return undefined ;
2101
+ }
2102
+
2047
2103
public async terminate ( task : Task ) : Promise < ITaskTerminateResponse > {
2048
2104
if ( ! ( await this . _trust ( ) ) ) {
2049
2105
return { success : true , task : undefined } ;
@@ -2157,7 +2213,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
2157
2213
return done ( taskSet ) ;
2158
2214
} , error ) , 5000 , ( ) => {
2159
2215
// onTimeout
2160
- console . error ( 'Timed out getting tasks from ' , providerType ) ;
2161
2216
done ( undefined ) ;
2162
2217
} ) ;
2163
2218
}
0 commit comments