diff --git a/deadlock-plugins/deadlock-extension/src/core/gitMission.ts b/deadlock-plugins/deadlock-extension/src/core/gitMission.ts index 209f131e766272e17cca5ffeed7689030979352f..91bc7b5d9a8a3365d4bfdc037a428bee3c91d1f7 100644 --- a/deadlock-plugins/deadlock-extension/src/core/gitMission.ts +++ b/deadlock-plugins/deadlock-extension/src/core/gitMission.ts @@ -63,12 +63,10 @@ export default class GitMission { async init() { try { - this.log('Setup ssh agent'); await this.setupSshAgent(); await this.git.init(); - this.log('Init Git mission..'); const remote = await this.readRemote(); if (remote === defaultRemote) { diff --git a/deadlock-plugins/deadlock-extension/src/extension.ts b/deadlock-plugins/deadlock-extension/src/extension.ts index 2874e24f9b845d3f417eb6f3b3d414a24056e2e3..ef68935d76c628a47ace6b4891187050e8f2e32c 100644 --- a/deadlock-plugins/deadlock-extension/src/extension.ts +++ b/deadlock-plugins/deadlock-extension/src/extension.ts @@ -1,18 +1,18 @@ import { window, ExtensionContext, workspace, commands } from 'vscode'; import Controller from './core/controller'; import isDocker from './core/utils/isdocker'; -import Recorder from './recorder'; +import Recorder from './recorder/recorder'; import { extensionError as error } from './recorder/utils/log'; import { DepNodeProvider } from './theia/deadlockPanel'; import UserConfigTheia from './theia/userConfigTheia'; import { CommandTreeProvider } from './view/CommandTree'; import StartedMissionsView from './view/startedMissionsView'; +// TODO: refactor remove this export const userConfig = new UserConfigTheia(); export async function activate(context: ExtensionContext) { window.showInformationMessage('Bienvenue sur Deadlock!'); - Controller.getInstance(context); const workspaceFolders = workspace.workspaceFolders?.toString() ?? ''; @@ -34,6 +34,6 @@ export async function activate(context: ExtensionContext) { error('Cannot init userConfig'); } if (isDocker()) { - new Recorder().run(); + Recorder.instance.run(); } } diff --git a/deadlock-plugins/deadlock-extension/src/recorder/index.ts b/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts similarity index 66% rename from deadlock-plugins/deadlock-extension/src/recorder/index.ts rename to deadlock-plugins/deadlock-extension/src/recorder/recorder.ts index 618b332a53adf1716963de7ea9cfca88a31bf885..0d9d69ef7cbe50a00db3afe67df128a0fba291e7 100644 --- a/deadlock-plugins/deadlock-extension/src/recorder/index.ts +++ b/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts @@ -10,6 +10,26 @@ import { clearFilesExceptGit, copyProjectSources, renameTempToUserGitFiles } fro import aquirePermissions from './utils/permission'; export default class Recorder { + private _gitMission?: GitMission; + private userConfig?: UserConfigNode; + private static _instance?: Recorder; + + private constructor() { + Recorder._instance = this; + } + + public static get instance(): Recorder { + if (!this._instance) { + return new Recorder(); + } + return this._instance; + } + + public get gitMission(): GitMission { + // TODO refactor remove ! + return this._gitMission!; + } + async setupProject(userConfig: UserConfig, gitMission?: GitMission) { if (!userConfig.isProfessor()) { await copyProjectSources(PROJECT_SRC_PATH, PROJECT_DEADLOCK_DESKTOP_PATH, ['.git/']); @@ -41,32 +61,24 @@ export default class Recorder { } async run() { - const userConfig = new UserConfigNode(); - - let gitMission; + this.userConfig = new UserConfigNode(); try { await aquirePermissions(); - await userConfig.init(); - gitMission = await new GitMission(userConfig).init(); - - await this.setupFromRemoteRepo(gitMission); + // TODO refactor remove this + await this.userConfig.init(); + this._gitMission = await new GitMission(this.userConfig).init(); + await this.setupFromRemoteRepo(this._gitMission); + await this.setupProject(this.userConfig, this._gitMission); + try { + if (ENABLE_AUTOMATIC_SAVE) new AutomaticSave(PROJECT_DEADLOCK_DESKTOP_PATH, this._gitMission); + } catch (e) { + error('Error while setup automatic save'); + error(e); + } } catch (e) { error('Cannot setup user repo.'); error(e); } - try { - await this.setupProject(userConfig, gitMission); - } catch (e) { - error('Error while setup project sources'); - error(e); - } - - try { - if (ENABLE_AUTOMATIC_SAVE) new AutomaticSave(PROJECT_DEADLOCK_DESKTOP_PATH, gitMission); - } catch (e) { - error('Error while setup automatic save'); - error(e); - } } } diff --git a/deadlock-plugins/deadlock-extension/src/recorder/services/file-watcher.ts b/deadlock-plugins/deadlock-extension/src/recorder/services/file-watcher.ts index 133048b84824e25cb69b094e29764a4f24a71ff5..dbd626085094abb8e8d102f2751d126623773d6a 100644 --- a/deadlock-plugins/deadlock-extension/src/recorder/services/file-watcher.ts +++ b/deadlock-plugins/deadlock-extension/src/recorder/services/file-watcher.ts @@ -1,4 +1,4 @@ -import * as chokidar from 'chokidar'; +import { watch } from 'chokidar'; export default class FileWatcher { constructor( @@ -11,7 +11,7 @@ export default class FileWatcher { } setupWatcher() { - const watcher = chokidar.watch(this.watchFilePatterns, { + const watcher = watch(this.watchFilePatterns, { cwd: this.folderToWatch, ignored: this.ignoreFilePatterns, ignoreInitial: true, diff --git a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts index a3dfc65a9268438718add2953114cdfddcf34232..ac0bf7411214af33844fb293cca48f0dd979307a 100644 --- a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts +++ b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts @@ -1,9 +1,9 @@ import { exec as execCallback, execSync } from 'child_process'; -import { copyFileSync, existsSync, lstatSync, PathLike, readdirSync, renameSync, rmdirSync } from 'fs'; +import { copyFileSync, existsSync, lstatSync, PathLike, readdirSync, renameSync } from 'fs'; import { join } from 'path'; import { log } from './log'; import { promisify } from 'util'; -import { mkdir, rmdir, unlink, rm } from 'fs/promises'; +import { mkdir, unlink, rm } from 'fs/promises'; const exec = promisify(execCallback); const PREFIX = '[DEADLOCK-RECORDER]'; @@ -24,7 +24,7 @@ export async function clearFilesExceptGit(path: string) { if (file !== '.git') { const curPath = join(path, file); if (lstatSync(curPath).isDirectory()) { - rmdirSync(curPath, { recursive: true }); + await rm(curPath, { recursive: true }); } else { await unlink(curPath); } @@ -90,7 +90,7 @@ export async function removeFilesOrDirectories(...paths: string[]) { export async function emptyDirectories(...directoryPaths: string[]) { directoryPaths.forEach(async (directoryPath) => { - await rmdir(directoryPath, { recursive: true }); + await rm(directoryPath, { recursive: true }); await mkdir(directoryPath); }); } diff --git a/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts b/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts index 1e3a3f38ec04d3bc91db24aed696102581d1d888..a762606e7cdf8459d0289554aa775f72ab5f9991 100644 --- a/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts +++ b/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts @@ -3,6 +3,8 @@ import ChallengeYaml, { MissionCommand as MissionCommandYaml } from '../model/ch import { parse } from 'yaml'; import { readFileSync } from 'fs'; import { commands, ExtensionContext, ThemeColor, ThemeIcon, TreeDataProvider, TreeItem, window } from 'vscode'; +import { commitAndPushOnQueue, CommitFrom } from '../recorder/utils/gitea'; +import Recorder from '../recorder/recorder'; export class CommandTreeProvider implements TreeDataProvider<MissionCommand> { challenge: ChallengeYaml; @@ -48,6 +50,7 @@ class MissionCommand extends TreeItem { }); terminal.sendText(missionCommandYaml.command); terminal.show(); + commitAndPushOnQueue(Recorder.instance.gitMission, CommitFrom.Run); }); this.command = { title: missionCommandYaml.name,