diff --git a/src/apps.js b/src/apps.js index ff09f57f2..f960eff22 100644 --- a/src/apps.js +++ b/src/apps.js @@ -634,6 +634,7 @@ function scheduleTask(appId, args, values, callback) { tasks.add(tasks.TASK_APP, [ appId, args ], function (error, taskId) { if (error) return callback(new AppsError(AppsError.INTERNAL_ERROR, error)); + values.error = null; values.taskId = taskId; appdb.setTask(appId, values, function (error) { @@ -1351,7 +1352,7 @@ function repair(appId, data, auditSource, callback) { const restoreConfig = data.backupId ? { backupId: data.backupId, backupFormat: data.backupFormat, oldManifest: app.manifest } : null; // when null, apptask simply reinstalls const overwriteDns = 'overwriteDns' in data ? data.overwriteDns : false; - scheduleTask(appId, { restoreConfig, overwriteDns }, values, function (error, result) { + scheduleTask(appId, { restoreConfig, overwriteDns, error: app.error }, values, function (error, result) { if (error) return callback(error); eventlog.add(eventlog.ACTION_APP_REPAIR, auditSource, { taskId: result.taskId, app }); diff --git a/src/apptask.js b/src/apptask.js index f5ae0b191..251d56088 100644 --- a/src/apptask.js +++ b/src/apptask.js @@ -1060,13 +1060,14 @@ function run(appId, args, progressCallback, callback) { case apps.ISTATE_PENDING_RESTORE: return install(app, args, progressCallback, callback); case apps.ISTATE_PENDING_REPAIR: - if (app.error.task.installationState === apps.ISTATE_PENDING_UNINSTALL) { - return uninstall(app, app.error.task.args, progressCallback, callback); - } else if (app.error.task.installationState === apps.ISTATE_PENDING_DATA_DIR_MIGRATION) { - return migrateDataDir(app, app.error.task.args, progressCallback, callback); - } else if (app.error.task.installationState === apps.ISTATE_PENDING_INSTALL - || app.error.task.installationState === apps.ISTATE_PENDING_CLONE - || app.error.task.installationState === apps.ISTATE_PENDING_RESTORE) { + let prevState = args.error && args.error.task ? args.error.task.installationState : apps.ISTATE_PENDING_CONFIGURE; + if (prevState === apps.ISTATE_PENDING_UNINSTALL) { + return uninstall(app, error.task.args, progressCallback, callback); + } else if (prevState === apps.ISTATE_PENDING_DATA_DIR_MIGRATION) { + return migrateDataDir(app, error.task.args, progressCallback, callback); + } else if (prevState === apps.ISTATE_PENDING_INSTALL + || prevState === apps.ISTATE_PENDING_CLONE + || prevState === apps.ISTATE_PENDING_RESTORE) { return install(app, args, progressCallback, callback); } else { return configure(app, args, progressCallback, callback);