package istlab.KisoJikken;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import javax.swing.JOptionPane;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.StashCreateCommand;
import org.eclipse.jgit.api.Status;
import org.eclipse.jgit.api.StatusCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.errors.NoWorkTreeException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
public class GitManager {
Git git = null;
Repository repository;
ConfigManager configman;
public GitManager(File root) throws IOException {
repository = Git.open(new File(root.getParentFile().getAbsolutePath() + File.separator + ".git"))
.getRepository();
configman = new ConfigManager(App.userhome);
}
/**
* Gitのリポジトリ状況を確認する
*
* @throws NoWorkTreeException
* @throws GitAPIException
*/
public void checkClean() throws NoWorkTreeException, GitAPIException {
git = new Git(repository);
StatusCommand statusCommand = git.status();
Status status = statusCommand.call();
if (!status.isClean()) {
// もし、延期ファイルがあって、延期ファイルの日付よりも今日の日付のほうが早いなら、チェックをスキップする(イコールのときはスキップしない)
if (configman.readAndCheckDate())
return;
System.out.println("Gitのローカルリポジトリに変更点があります。");
Set<String> changedFiles = status.getModified();
Set<String> untrackedFiles = status.getUntracked();
System.out.println("変更されたファイル:");
for (String filePath : changedFiles) {
System.out.println(filePath);
}
System.out.println("まだGit管理下にないファイル:");
for (String filePath : untrackedFiles) {
System.out.println(filePath);
}
int res = JOptionPane.showConfirmDialog(Launcher.theapp, "教員提供のSampleSrcが修正されています。\n\n" + //
"あなたの作業を消して,初期状態に戻しますか?\n\n" + //
"「はい」を押すと,修正を削除して初期状態に戻します。\n" + //
"「いいえ」「取消」を押すと,なにもしません。\n\n" + //
"あなたがまだ何も作業しておらず,これから実験を\n" + //
"始めるときだけ「はい」を押してください。\n作業の続きを行うときは「いいえ」を押してください。\n(「いいえ」で回答すると、次は10日後までチェックしません。)",
"教員が提供するサンプルソースコードが修正されています",
JOptionPane.YES_NO_CANCEL_OPTION);
if (res == JOptionPane.YES_OPTION) {
int res2 = JOptionPane.showConfirmDialog(Launcher.theapp, "あなたの編集したファイルが消えます。\n本当に消してよいですか?", "ファイルが消えます",
JOptionPane.YES_NO_CANCEL_OPTION);
if (res2 == JOptionPane.YES_OPTION) {
stash();
JOptionPane.showMessageDialog(Launcher.theapp, "初期状態に戻しました。\n\n誤って削除してしまった場合は、\n $ cd ~/NWP\nをしたあとで\n" + //
" $ git stash list (退避情報の一覧)\n"+ //
" $ git stash pop (直前の退避情報を復活)\n"+//
" $ git stash pop stash@{1} (指定した退避情報を復活)\n"+//
"などを行ってください。");
}
} else {
if (res == JOptionPane.NO_OPTION)
configman.write();
}
} else {
System.out.println("No uncommitted changes in the local repository.");
}
if (git != null)
git.close();
// showNotice();
}
public void stash() throws GitAPIException {
git = new Git(repository);
StashCreateCommand stashCreateCommand = git.stashCreate();
stashCreateCommand.setIncludeUntracked(true);
SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd HH:mm:ss");
stashCreateCommand.setWorkingDirectoryMessage(sdf.format(new Date()) + " に退避した作業");
RevCommit stashCommit = stashCreateCommand.call();
if (stashCommit != null) {
System.out.println("Stash created. Stash commit ID: " + stashCommit.getName());
} else {
System.out.println("No local changes to stash.");
}
}
public void showNotice() {
JOptionPane.showMessageDialog(Launcher.theapp, "(1) デバイスを認識すると,タイトルバーに COM3 のように表示します。\n" + //
" 複数みえるときはWindowsのデバイスマネージャ>ポートでM5Stickのポート番号を調べたうえで,\n" + //
" このプログラムの Serialメニュー から,書き込み先ポートを選んでください。\n\n" + //
"(2) デバイスを認識しないときは,このプログラムを再起動してみてください。\n" + //
" (Appメニュー>このプログラムを再起動する)\n\n" + //
"(3) デバイスを返却するときは,FactoryTest を書き込んでおいてください。\n" + //
" (Fileメニュー>FactoryTestを書き込む)\n\n" + //
" デバイスは充電した状態で返却してください。"//
, "IoTP実験における大事な注意点です。たくさんありますがしっかり読んでください。", JOptionPane.WARNING_MESSAGE);
}
}