Escher-js / SkimmedMilk

0 stars 0 forks source link

git status & auto save #15

Closed psmuler closed 1 year ago

psmuler commented 1 year ago

good. マークダウンの編集を追跡して、1分ごとに一度現在のブランチにコミットするようにしましょう。

psmuler commented 1 year ago

1分ごとにコミットするには、setInterval 関数を使用して定期的にコミット処理を実行するように設定します。また、編集の追跡を行い、変更があった場合にのみコミットを実行するようにします。以下のようにコードを修正してください。

まず、renderer.js の先頭に以下の変数と関数を追加します。

// マークダウンの編集を追跡するための変数
let isMarkdownEdited = false;

// マークダウンエディタの変更を検知するイベントリスナーを設定
markdownEditor.addEventListener('input', () => {
  isMarkdownEdited = true;
});

// コミット処理を行う関数
function commitChanges() {
  if (isMarkdownEdited) {
    const folderPath = folderPathSpan.textContent;

    // ファイルをコミット
    exec(`git -C "${folderPath}" add . && git -C "${folderPath}" commit -m "Auto-commit: Markdown changes"`, (error, stdout, stderr) => {
      if (error) {
        console.error(`Error: ${error.message}`);
        return;
      }
      if (stderr) {
        console.error(`Stderr: ${stderr}`);
        return;
      }

      console.log(`Auto-commit successful: ${stdout}`);
      isMarkdownEdited = false;
    });
  }
}

そして、1分ごとに commitChanges 関数を実行するように設定します。renderer.js の末尾に以下のコードを追加します。

// 1分ごとにコミット処理を実行
setInterval(commitChanges, 60 * 1000);

これで、マークダウンエディタの編集を追跡し、1分ごとに変更があった場合に現在のブランチにコミットするようになります。

psmuler commented 1 year ago

good. マークダウンの編集を追跡して、1分ごとに一度現在のブランチにコミットするようにしましょう。また、saveボタンが押された時にもcommitを実行するようにしましょう

psmuler commented 1 year ago

1分ごとにマークダウンファイルの変更をコミットするには、setInterval を使用して定期的にコミット処理を実行する関数を呼び出すことができます。また、saveボタンが押された時にも同じコミット処理を実行します。以下のコードを renderer.js に追加してください。

// コミット処理を実行する関数
function commitChanges() {
  const folderPath = folderPathSpan.textContent;
  const currentBranch = branchSelect.options[branchSelect.selectedIndex].value;

  // 保存
  fs.writeFileSync(`${folderPath}/${currentFileName}`, textEditor.value);

  // コミットメッセージ
  const commitMessage = `Auto-commit on ${new Date().toLocaleString()}`;

  // コミット
  exec(`git -C "${folderPath}" add . && git -C "${folderPath}" commit -m "${commitMessage}"`, (error, stdout, stderr) => {
    if (error) {
      console.error(`Error: ${error.message}`);
      return;
    }
    if (stderr) {
      console.error(`Stderr: ${stderr}`);
      return;
    }
    console.log(`Commit successful: ${stdout}`);
  });
}

// 1分ごとにコミット
setInterval(commitChanges, 60000);

// saveボタンが押された時にコミット
saveButton.addEventListener('click', () => {
  commitChanges();
});

このコードでは、commitChanges 関数がコミット処理を実行します。1分ごとにこの関数が実行されるように setInterval を設定し、また、saveボタンが押された時にもこの関数が実行されるようにイベントリスナを設定しています。ファイルの保存とコミットが成功した場合、コンソールにメッセージが表示されます。

注意: この方法では、1分ごとにマークダウンファイルが変更されているかどうかをチェックせず、強制的にコミットが実行されます。これにより、実際には変更がない場合でもコミットが作成されることがあります。変更がある場合にのみコミットを実行するには、git status コマンドを使って変更を検出する処理を追加する必要があります。

psmuler commented 1 year ago

git statusを用いて変更を検出する処理を加えましょう

psmuler commented 1 year ago

git statusを用いて変更を検出する処理を追加するには、以下のようにcommitChanges関数を修正してください。

// コミット処理を実行する関数
async function commitChanges() {
  const folderPath = folderPathSpan.textContent;
  const currentBranch = branchSelect.options[branchSelect.selectedIndex].value;

  // 保存
  fs.writeFileSync(`${folderPath}/${currentFileName}`, textEditor.value);

  // git status を実行して変更を検出
  const gitStatus = await new Promise((resolve, reject) => {
    exec(`git -C "${folderPath}" status --porcelain`, (error, stdout, stderr) => {
      if (error) {
        reject(`Error: ${error.message}`);
        return;
      }
      if (stderr) {
        reject(`Stderr: ${stderr}`);
        return;
      }
      resolve(stdout);
    });
  });

  // 変更がある場合のみコミット
  if (gitStatus.trim() !== '') {
    const commitMessage = `Auto-commit on ${new Date().toLocaleString()}`;

    exec(
      `git -C "${folderPath}" add . && git -C "${folderPath}" commit -m "${commitMessage}"`,
      (error, stdout, stderr) => {
        if (error) {
          console.error(`Error: ${error.message}`);
          return;
        }
        if (stderr) {
          console.error(`Stderr: ${stderr}`);
          return;
        }
        console.log(`Commit successful: ${stdout}`);
      }
    );
  } else {
    console.log('No changes detected');
  }
}

この修正により、commitChanges関数は、git status --porcelainコマンドを使用して変更を検出します。--porcelainオプションは、機械可読な出力を提供するために使用されます。変更が検出された場合のみ、コミットが実行されます。変更がない場合は、コンソールにメッセージが表示されます。

注意:commitChanges関数をasync関数に変更し、gitStatusの取得をawaitを使用して待機するようにしています。これにより、変更の検出とコミット処理が同期的に実行されるようになります。

psmuler commented 1 year ago

ありがとうございます。 自動保存機能として、ウィンドウを閉じる時には現在のブランチに自動的にコミットが送られるようにしましょう

psmuler commented 1 year ago

ウィンドウを閉じる時に現在のブランチに自動的にコミットする機能を実装するには、windowオブジェクトのbeforeunloadイベントリスナーを追加しましょう。beforeunloadイベントは、ウィンドウが閉じられる前に発生します。このイベントリスナー内で、現在のブランチにコミットする処理を実行します。

renderer.js に以下のコードを追加してください:

async function commitChanges(message) {
  const folderPath = folderPathSpan.textContent;
  const currentFileContent = textEditor.value;

  // ファイルに変更を保存
  fs.writeFileSync(`${folderPath}/${currentFileName}`, currentFileContent);

  // git add
  await new Promise((resolve, reject) => {
    exec(`git -C "${folderPath}" add "${currentFileName}"`, (error, stdout, stderr) => {
      if (error) {
        console.error(`Error: ${error.message}`);
        reject(error);
        return;
      }
      if (stderr) {
        console.error(`Stderr: ${stderr}`);
      }
      resolve();
    });
  });

  // git commit
  await new Promise((resolve, reject) => {
    exec(`git -C "${folderPath}" commit -m "${message}"`, (error, stdout, stderr) => {
      if (error) {
        console.error(`Error: ${error.message}`);
        reject(error);
        return;
      }
      if (stderr) {
        console.error(`Stderr: ${stderr}`);
      }
      resolve();
    });
  });
}

// ウィンドウが閉じられる前に現在のブランチにコミットする処理を実行
window.addEventListener('beforeunload', async (event) => {
  event.preventDefault();
  await commitChanges('Automatic commit before closing the window');
});

このコードでは、まずcommitChangesという非同期関数を定義して、与えられたメッセージで現在のブランチにコミットを作成します。そして、beforeunloadイベントリスナーを追加し、ウィンドウが閉じられる前にcommitChanges関数を実行して自動的にコミットします。