Escher-js / SkimmedMilk

0 stars 0 forks source link

git versioning (init folder) #10

Open psmuler opened 1 year ago

psmuler commented 1 year ago

gitを用いてバージョン管理をしましょう。ボタンを押したらフォルダ選択画面をポップアップし、選択されたフォルダでgit initを実行しましょう

psmuler commented 1 year ago

Electronアプリでボタンをクリックしてフォルダ選択画面を表示し、選択されたフォルダでgit initを実行するには、以下の手順を実行してください。

  1. index.htmlファイルを更新:

"Git Init"というテキストが表示されたボタンを追加します。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>My Electron App</title>
  </head>
  <body>
    <h1>Hello, Electron!</h1>
    <button id="file-btn">Open</button>
    <button id="save-btn">Save</button>
    <button id="git-init-btn">Git Init</button>
    <br />
    <textarea id="text-editor" rows="20" cols="80"></textarea>

    <script src="renderer.js"></script>
  </body>
</html>
  1. renderer.jsファイルを更新:

ボタンがクリックされたときのイベントリスナーを定義し、git initを実行する処理を追加します。

const { ipcRenderer } = require('electron');
const fs = require('fs');
const { exec } = require('child_process');

const fileBtn = document.getElementById('file-btn');
const saveBtn = document.getElementById('save-btn');
const gitInitBtn = document.getElementById('git-init-btn');
const textEditor = document.getElementById('text-editor');

// ... (fileBtn, saveBtn, ipcRendererのイベントリスナーは省略) ...

gitInitBtn.addEventListener('click', () => {
  ipcRenderer.send('open-folder-dialog');
});

ipcRenderer.on('selected-folder', (event, folderPath) => {
  exec(`git init "${folderPath}"`, (error, stdout, stderr) => {
    if (error) {
      console.error(`Error: ${error.message}`);
      return;
    }
    if (stderr) {
      console.error(`Stderr: ${stderr}`);
      return;
    }
    console.log(`Stdout: ${stdout}`);
  });
});
  1. main.jsファイルを更新:

フォルダ選択ダイアログを表示し、選択されたフォルダをrenderer.jsに送信するコードを追加します。

const { app, BrowserWindow, ipcMain, dialog } = require('electron');

// ... (createWindow, app.whenReady, app.onのコードは省略) ...

ipcMain.on('open-folder-dialog', (event) => {
  const options = {
    title: 'Select a folder',
    properties: ['openDirectory'],
  };

  dialog.showOpenDialog(null, options).then((result) => {
    if (!result.canceled) {
      const folderPath = result.filePaths[0];
      event.sender.send('selected-folder', folderPath);
    }
  });
});

// ... (ipcMain.on('open-file-dialog')とipcMain.on('save-file-dialog')のコードは省略) ...

これで、"Git Init"ボタンをクリックするとフォルダ選択画面が表示され、選択されたフォルダでgit initが実行されるようになります。npm startコマンドを使ってアプリを起動し、"Git Init"ボタンをクリックしてフォルダを選択すると、そのフォルダでgit initが実行され、バージョン管理が開始されます。

psmuler commented 1 year ago

git initボタンの処理を書き換え、フォルダを選択するだけの機能にしましょう。選択したフォルダに.gitがないかを判断し、ない場合は作るよう条件分岐を作りましょう

psmuler commented 1 year ago

"Git Init"ボタンの処理を書き換えて、フォルダを選択するだけの機能にし、選択したフォルダに.gitがない場合にのみgit initを実行するようにするには、以下の手順でrenderer.jsファイルを更新してください。

  1. renderer.jsファイルを更新:

フォルダが選択されたときに.gitがないかをチェックし、ない場合にgit initを実行する処理を追加します。

const { ipcRenderer } = require('electron');
const fs = require('fs');
const { exec } = require('child_process');

const fileBtn = document.getElementById('file-btn');
const saveBtn = document.getElementById('save-btn');
const gitInitBtn = document.getElementById('git-init-btn');
const textEditor = document.getElementById('text-editor');

// ... (fileBtn, saveBtn, ipcRendererのイベントリスナーは省略) ...

gitInitBtn.addEventListener('click', () => {
  ipcRenderer.send('open-folder-dialog');
});

ipcRenderer.on('selected-folder', (event, folderPath) => {
  fs.access(`${folderPath}/.git`, fs.constants.F_OK, (err) => {
    if (err) {
      // .gitフォルダが存在しない場合
      exec(`git init "${folderPath}"`, (error, stdout, stderr) => {
        if (error) {
          console.error(`Error: ${error.message}`);
          return;
        }
        if (stderr) {
          console.error(`Stderr: ${stderr}`);
          return;
        }
        console.log(`Stdout: ${stdout}`);
      });
    } else {
      console.log('The .git folder already exists.');
    }
  });
});

これで、"Git Init"ボタンをクリックするとフォルダ選択画面が表示され、選択したフォルダに.gitがない場合にのみgit initが実行されます。

psmuler commented 1 year ago

git initボタンの右側に、現在選択しているフォルダのフォルダパスを表示しましょう

psmuler commented 1 year ago

"Git Init"ボタンの右側に現在選択しているフォルダのフォルダパスを表示するには、以下の手順でindex.htmlrenderer.jsファイルを更新してください。

  1. index.htmlファイルを更新:

フォルダパスを表示するための<span>要素を追加します。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>My Electron App</title>
  </head>
  <body>
    <h1>Hello, Electron!</h1>
    <button id="file-btn">Open</button>
    <button id="save-btn">Save</button>
    <button id="git-init-btn">Git Init</button>
    <span id="folder-path" style="margin-left: 10px;"></span>
    <br />
    <textarea id="text-editor" rows="20" cols="80"></textarea>

    <script src="renderer.js"></script>
  </body>
</html>
  1. renderer.jsファイルを更新:

フォルダが選択されたときに、フォルダパスを<span>要素に表示する処理を追加します。

const { ipcRenderer } = require('electron');
const fs = require('fs');
const { exec } = require('child_process');

const fileBtn = document.getElementById('file-btn');
const saveBtn = document.getElementById('save-btn');
const gitInitBtn = document.getElementById('git-init-btn');
const textEditor = document.getElementById('text-editor');
const folderPathSpan = document.getElementById('folder-path');

// ... (fileBtn, saveBtn, gitInitBtn, ipcRendererのイベントリスナーは省略) ...

ipcRenderer.on('selected-folder', (event, folderPath) => {
  // フォルダパスを表示
  folderPathSpan.textContent = folderPath;

  fs.access(`${folderPath}/.git`, fs.constants.F_OK, (err) => {
    if (err) {
      // .gitフォルダが存在しない場合
      exec(`git init "${folderPath}"`, (error, stdout, stderr) => {
        if (error) {
          console.error(`Error: ${error.message}`);
          return;
        }
        if (stderr) {
          console.error(`Stderr: ${stderr}`);
          return;
        }
        console.log(`Stdout: ${stdout}`);
      });
    } else {
      console.log('The .git folder already exists.');
    }
  });
});

これで、"Git Init"ボタンの右側に現在選択しているフォルダのフォルダパスが表示されます。

psmuler commented 1 year ago

選択しているフォルダが.git管理されているフォルダかどうか判断し、サイン(.gitあり:青丸、無し:赤丸など)を表示しましょう。

psmuler commented 1 year ago

選択しているフォルダが.git管理されているかどうか判断し、青丸(.gitあり)または赤丸(.gitなし)のサインを表示するには、以下の手順でindex.htmlrenderer.jsファイルを更新してください。

  1. index.htmlファイルを更新:

フォルダの.git状態を表示するための<span>要素を追加します。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>My Electron App</title>
  </head>
  <body>
    <h1>Hello, Electron!</h1>
    <button id="file-btn">Open</button>
    <button id="save-btn">Save</button>
    <button id="git-init-btn">Git Init</button>
    <span id="git-status" style="margin-left: 10px;"></span>
    <span id="folder-path" style="margin-left: 10px;"></span>
    <br />
    <textarea id="text-editor" rows="20" cols="80"></textarea>

    <script src="renderer.js"></script>
  </body>
</html>
  1. renderer.jsファイルを更新:

フォルダが選択されたときに、.gitの状態に応じてサイン(青丸または赤丸)を表示する処理を追加します。

const { ipcRenderer } = require('electron');
const fs = require('fs');
const { exec } = require('child_process');

const fileBtn = document.getElementById('file-btn');
const saveBtn = document.getElementById('save-btn');
const gitInitBtn = document.getElementById('git-init-btn');
const textEditor = document.getElementById('text-editor');
const folderPathSpan = document.getElementById('folder-path');
const gitStatusSpan = document.getElementById('git-status');

// ... (fileBtn, saveBtn, gitInitBtn, ipcRendererのイベントリスナーは省略) ...

ipcRenderer.on('selected-folder', (event, folderPath) => {
  // フォルダパスを表示
  folderPathSpan.textContent = folderPath;

  fs.access(`${folderPath}/.git`, fs.constants.F_OK, (err) => {
    if (err) {
      // .gitフォルダが存在しない場合
      gitStatusSpan.innerHTML = '<span style="color: red;">&#11044;</span>';

      exec(`git init "${folderPath}"`, (error, stdout, stderr) => {
        if (error) {
          console.error(`Error: ${error.message}`);
          return;
        }
        if (stderr) {
          console.error(`Stderr: ${stderr}`);
          return;
        }
        console.log(`Stdout: ${stdout}`);
      });
    } else {
      // .gitフォルダが存在する場合
      gitStatusSpan.innerHTML = '<span style="color: blue;">&#11044;</span>';
    }
  });
});

これで、選択しているフォルダが.git管理されているかどうか判断し、青丸(.gitあり)または赤丸(.gitなし)のサインが表示されます。

psmuler commented 1 year ago

git管理されていないフォルダの場合には、ポップアップで「git initするかどうか」を聞くようにしましょう。

psmuler commented 1 year ago

選択しているフォルダが.git管理されていない場合に、ポップアップで「git initするかどうか」を聞くようにするには、以下の手順でrenderer.jsファイルを更新してください。

  1. renderer.jsファイルを更新:

選択しているフォルダが.git管理されていない場合に、confirm関数を使ってポップアップでユーザーに確認を求め、ユーザーが「はい」を選択した場合にgit initを実行する処理を追加します。

const { ipcRenderer } = require('electron');
const fs = require('fs');
const { exec } = require('child_process');

const fileBtn = document.getElementById('file-btn');
const saveBtn = document.getElementById('save-btn');
const gitInitBtn = document.getElementById('git-init-btn');
const textEditor = document.getElementById('text-editor');
const folderPathSpan = document.getElementById('folder-path');
const gitStatusSpan = document.getElementById('git-status');

// ... (fileBtn, saveBtn, gitInitBtn, ipcRendererのイベントリスナーは省略) ...

ipcRenderer.on('selected-folder', (event, folderPath) => {
  // フォルダパスを表示
  folderPathSpan.textContent = folderPath;

  fs.access(`${folderPath}/.git`, fs.constants.F_OK, (err) => {
    if (err) {
      // .gitフォルダが存在しない場合
      gitStatusSpan.innerHTML = '<span style="color: red;">&#11044;</span>';

      // ポップアップでユーザーに確認を求める
      const confirmResult = confirm('This folder is not under Git control. Do you want to run "git init"?');

      if (confirmResult) {
        // ユーザーが「はい」を選択した場合、git initを実行
        exec(`git init "${folderPath}"`, (error, stdout, stderr) => {
          if (error) {
            console.error(`Error: ${error.message}`);
            return;
          }
          if (stderr) {
            console.error(`Stderr: ${stderr}`);
            return;
          }
          console.log(`Stdout: ${stdout}`);
          // git init後に青丸(.gitあり)に変更
          gitStatusSpan.innerHTML = '<span style="color: blue;">&#11044;</span>';
        });
      }

    } else {
      // .gitフォルダが存在する場合
      gitStatusSpan.innerHTML = '<span style="color: blue;">&#11044;</span>';
    }
  });
});

これで、選択しているフォルダが.git管理されていない場合に、ポップアップで「git initするかどうか」を聞くようになります。

psmuler commented 1 year ago

git init 後にmainブランチが作られていないようです。