package info.istlab.IoTP;
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) {
stash();
configman.write();
} 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);
}
}