mirror of
https://github.com/NekoMonci12/Git-Craft.git
synced 2025-12-19 14:59:22 +00:00
All Git Basic Function
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
package org.yuemi;
|
||||
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.commands.CommandRegistrar;
|
||||
|
||||
public class App extends JavaPlugin {
|
||||
@Override
|
||||
public void onEnable() {
|
||||
getLogger().info("Yuemi Git Plugin enabled.");
|
||||
new CommandRegistrar(this).registerAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
16
app/src/main/java/org/yuemi/commands/CommandRegistrar.java
Normal file
16
app/src/main/java/org/yuemi/commands/CommandRegistrar.java
Normal file
@@ -0,0 +1,16 @@
|
||||
package org.yuemi.commands;
|
||||
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
public class CommandRegistrar {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public CommandRegistrar(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
public void registerAll() {
|
||||
plugin.getCommand("git").setExecutor(new GitRootCommand(plugin));
|
||||
}
|
||||
}
|
||||
34
app/src/main/java/org/yuemi/commands/GitRootCommand.java
Normal file
34
app/src/main/java/org/yuemi/commands/GitRootCommand.java
Normal file
@@ -0,0 +1,34 @@
|
||||
package org.yuemi.commands;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.commands.SubcommandHandler;
|
||||
import org.yuemi.commands.subcommands.GitHelpSubcommand;
|
||||
|
||||
public class GitRootCommand implements CommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
private final SubcommandHandler handler;
|
||||
|
||||
public GitRootCommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
this.handler = new SubcommandHandler(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (args.length == 0) {
|
||||
new GitHelpSubcommand(plugin).execute(sender, args);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
String subcommand = args[0].toLowerCase();
|
||||
String[] subArgs = java.util.Arrays.copyOfRange(args, 1, args.length);
|
||||
|
||||
handler.handle(sender, subcommand, subArgs);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package org.yuemi.commands;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public interface SubcommandExecutor {
|
||||
void execute(CommandSender sender, String[] args);
|
||||
}
|
||||
44
app/src/main/java/org/yuemi/commands/SubcommandHandler.java
Normal file
44
app/src/main/java/org/yuemi/commands/SubcommandHandler.java
Normal file
@@ -0,0 +1,44 @@
|
||||
package org.yuemi.commands;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.commands.subcommands.GitAddSubcommand;
|
||||
import org.yuemi.commands.subcommands.GitCommitSubcommand;
|
||||
import org.yuemi.commands.subcommands.GitPushSubcommand;
|
||||
import org.yuemi.commands.subcommands.GitResetSubcommand;
|
||||
import org.yuemi.commands.subcommands.GitInitSubcommand;
|
||||
import org.yuemi.commands.subcommands.GitRemoteSubcommand;
|
||||
import org.yuemi.commands.subcommands.GitFetchSubcommand;
|
||||
import org.yuemi.commands.subcommands.GitPullSubcommand;
|
||||
import org.yuemi.commands.subcommands.GitStatusSubcommand;
|
||||
import org.yuemi.commands.subcommands.GitHelpSubcommand;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class SubcommandHandler {
|
||||
|
||||
private final Map<String, SubcommandExecutor> commands = new HashMap<>();
|
||||
|
||||
public SubcommandHandler(JavaPlugin plugin) {
|
||||
commands.put("add", new GitAddSubcommand(plugin));
|
||||
commands.put("commit", new GitCommitSubcommand(plugin));
|
||||
commands.put("push", new GitPushSubcommand(plugin));
|
||||
commands.put("reset", new GitResetSubcommand(plugin));
|
||||
commands.put("init", new GitInitSubcommand(plugin));
|
||||
commands.put("remote", new GitRemoteSubcommand(plugin));
|
||||
commands.put("fetch", new GitFetchSubcommand(plugin));
|
||||
commands.put("pull", new GitPullSubcommand(plugin));
|
||||
commands.put("status", new GitStatusSubcommand(plugin));
|
||||
commands.put("help", new GitHelpSubcommand(plugin));
|
||||
}
|
||||
|
||||
public void handle(CommandSender sender, String name, String[] args) {
|
||||
SubcommandExecutor executor = commands.get(name.toLowerCase());
|
||||
if (executor == null) {
|
||||
sender.sendMessage("§cUnknown subcommand: " + name);
|
||||
return;
|
||||
}
|
||||
|
||||
executor.execute(sender, args);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package org.yuemi.commands.subcommands;
|
||||
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.git.GitManager;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.io.File;
|
||||
|
||||
public class GitAddSubcommand implements SubcommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public GitAddSubcommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
File repoFolder = new File("."); // Default to root
|
||||
List<String> filesToAdd = new ArrayList<>();
|
||||
|
||||
// Parse args
|
||||
for (String arg : args) {
|
||||
if (arg.equals(".")) {
|
||||
// Use server root, add everything
|
||||
repoFolder = new File(".");
|
||||
} else if (arg.startsWith("--path=")) {
|
||||
repoFolder = new File(arg.substring("--path=".length()));
|
||||
} else if (arg.startsWith("--include=")) {
|
||||
filesToAdd.add(arg.substring("--include=".length()));
|
||||
} else if (!arg.startsWith("--")) {
|
||||
// Add as literal file path
|
||||
filesToAdd.add(arg);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if (!repoFolder.exists() || !repoFolder.isDirectory()) {
|
||||
sender.sendMessage("§cInvalid path: " + repoFolder.getAbsolutePath());
|
||||
return;
|
||||
}
|
||||
|
||||
GitManager git = new GitManager(repoFolder);
|
||||
|
||||
if (filesToAdd.isEmpty()) {
|
||||
git.addAll();
|
||||
sender.sendMessage("§aStaged ALL files in: §f" + repoFolder.getCanonicalPath());
|
||||
} else {
|
||||
git.addFiles(filesToAdd);
|
||||
sender.sendMessage("§aStaged specific files in: §f" + repoFolder.getCanonicalPath());
|
||||
filesToAdd.forEach(f -> sender.sendMessage("§7- §f" + f));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cGit add failed: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package org.yuemi.commands.subcommands;
|
||||
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.git.GitManager;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class GitCommitSubcommand implements SubcommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public GitCommitSubcommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
File repoFolder = new File(".");
|
||||
String message = "Commit from Minecraft";
|
||||
|
||||
for (String arg : args) {
|
||||
if (arg.startsWith("--path=")) {
|
||||
repoFolder = new File(arg.substring("--path=".length()));
|
||||
} else if (arg.startsWith("--message=") || arg.startsWith("-m=")) {
|
||||
message = arg.contains("=") ? arg.split("=", 2)[1] : message;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
GitManager git = new GitManager(repoFolder);
|
||||
git.commit(message);
|
||||
sender.sendMessage("§aCommitted: §f" + message);
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cGit commit failed: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package org.yuemi.commands.subcommands;
|
||||
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.git.GitManager;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class GitFetchSubcommand implements SubcommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public GitFetchSubcommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
File repoFolder = new File(".");
|
||||
String username = null;
|
||||
String token = null;
|
||||
|
||||
for (String arg : args) {
|
||||
if (arg.startsWith("--path=")) {
|
||||
repoFolder = new File(arg.substring("--path=".length()));
|
||||
} else if (arg.startsWith("--username=")) {
|
||||
username = arg.substring("--username=".length());
|
||||
} else if (arg.startsWith("--token=")) {
|
||||
token = arg.substring("--token=".length());
|
||||
}
|
||||
}
|
||||
|
||||
if (username == null || token == null) {
|
||||
sender.sendMessage("§cUsage: /git fetch --username=... --token=...");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
GitManager git = new GitManager(repoFolder);
|
||||
git.fetch(username, token);
|
||||
sender.sendMessage("§aFetched remote updates.");
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cGit fetch failed: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package org.yuemi.commands.subcommands;
|
||||
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
|
||||
public class GitHelpSubcommand implements SubcommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public GitHelpSubcommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
sender.sendMessage("§2==== GitCraft Command Help ====");
|
||||
sender.sendMessage("§a/git init §7--path=<dir> §8→ Initialize repo in folder");
|
||||
sender.sendMessage("§a/git remote --add|--set-url|--remove --url=<url> §7[--path=dir]");
|
||||
sender.sendMessage("§a/git add [file1 file2 ...] §7or §a/git add . §7[--path=dir]");
|
||||
sender.sendMessage("§a/git reset [--hard|file] §7[--path=dir]");
|
||||
sender.sendMessage("§a/git commit -m=<msg> §7[--path=dir]");
|
||||
sender.sendMessage("§a/git status §7[--path=dir]");
|
||||
sender.sendMessage("§a/git fetch --username=<u> --token=<t> §7[--path=dir]");
|
||||
sender.sendMessage("§a/git pull --username=<u> --token=<t> §7[--path=dir]");
|
||||
sender.sendMessage("§a/git push --username=<u> --token=<t> §7[--path=dir]");
|
||||
sender.sendMessage("§a/git help §8→ Shows this message");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package org.yuemi.commands.subcommands;
|
||||
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.git.GitManager;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class GitInitSubcommand implements SubcommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public GitInitSubcommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
File repoFolder = new File(".");
|
||||
for (String arg : args) {
|
||||
if (arg.startsWith("--path=")) {
|
||||
repoFolder = new File(arg.substring("--path=".length()));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
GitManager git = new GitManager(repoFolder);
|
||||
git.initRepo(plugin);
|
||||
sender.sendMessage("§aInitialized Git repository at: §f" + repoFolder.getAbsolutePath());
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cGit init failed: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package org.yuemi.commands.subcommands;
|
||||
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.git.GitManager;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class GitPullSubcommand implements SubcommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public GitPullSubcommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
File repoFolder = new File(".");
|
||||
String username = null;
|
||||
String token = null;
|
||||
|
||||
for (String arg : args) {
|
||||
if (arg.startsWith("--path=")) {
|
||||
repoFolder = new File(arg.substring("--path=".length()));
|
||||
} else if (arg.startsWith("--username=")) {
|
||||
username = arg.substring("--username=".length());
|
||||
} else if (arg.startsWith("--token=")) {
|
||||
token = arg.substring("--token=".length());
|
||||
}
|
||||
}
|
||||
|
||||
if (username == null || token == null) {
|
||||
sender.sendMessage("§cUsage: /git pull --username=... --token=...");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
GitManager git = new GitManager(repoFolder);
|
||||
git.pull(username, token);
|
||||
sender.sendMessage("§aPulled and merged from origin.");
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cGit pull failed: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package org.yuemi.commands.subcommands;
|
||||
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.git.GitManager;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class GitPushSubcommand implements SubcommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public GitPushSubcommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
File repoFolder = new File(".");
|
||||
String username = null;
|
||||
String token = null;
|
||||
|
||||
for (String arg : args) {
|
||||
if (arg.startsWith("--path=")) {
|
||||
repoFolder = new File(arg.substring("--path=".length()));
|
||||
} else if (arg.startsWith("--username=")) {
|
||||
username = arg.substring("--username=".length());
|
||||
} else if (arg.startsWith("--token=")) {
|
||||
token = arg.substring("--token=".length());
|
||||
}
|
||||
}
|
||||
|
||||
if (username == null || token == null) {
|
||||
sender.sendMessage("§cUsage: /git push --username=... --token=...");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
GitManager git = new GitManager(repoFolder);
|
||||
git.push(username, token);
|
||||
sender.sendMessage("§aPushed to remote.");
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cGit push failed: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package org.yuemi.commands.subcommands;
|
||||
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.git.GitManager;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class GitRemoteSubcommand implements SubcommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public GitRemoteSubcommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
File repoFolder = new File(".");
|
||||
String url = null;
|
||||
String mode = "add";
|
||||
|
||||
for (String arg : args) {
|
||||
if (arg.startsWith("--path=")) {
|
||||
repoFolder = new File(arg.substring("--path=".length()));
|
||||
} else if (arg.startsWith("--url=")) {
|
||||
url = arg.substring("--url=".length());
|
||||
} else if (arg.equalsIgnoreCase("--add")) {
|
||||
mode = "add";
|
||||
} else if (arg.equalsIgnoreCase("--set-url")) {
|
||||
mode = "set";
|
||||
} else if (arg.equalsIgnoreCase("--remove")) {
|
||||
mode = "remove";
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
GitManager git = new GitManager(repoFolder);
|
||||
|
||||
switch (mode) {
|
||||
case "add":
|
||||
if (url == null) throw new IllegalArgumentException("Missing --url");
|
||||
git.addRemote(url);
|
||||
sender.sendMessage("§aAdded remote origin: " + url);
|
||||
break;
|
||||
case "set":
|
||||
if (url == null) throw new IllegalArgumentException("Missing --url");
|
||||
git.setRemoteUrl(url);
|
||||
sender.sendMessage("§aUpdated remote origin URL to: " + url);
|
||||
break;
|
||||
case "remove":
|
||||
git.removeRemote();
|
||||
sender.sendMessage("§aRemoved remote origin.");
|
||||
break;
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cGit remote failed: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package org.yuemi.commands.subcommands;
|
||||
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.git.GitManager;
|
||||
import org.eclipse.jgit.api.ResetCommand.ResetType;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class GitResetSubcommand implements SubcommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public GitResetSubcommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
File repoFolder = new File("."); // Default path
|
||||
ResetType resetType = ResetType.MIXED; // default is soft reset (unstage)
|
||||
|
||||
if (args.length >= 1 && args[0].startsWith("--path=")) {
|
||||
String path = args[0].substring("--path=".length());
|
||||
repoFolder = new File(path);
|
||||
}
|
||||
|
||||
try {
|
||||
GitManager git = new GitManager(repoFolder);
|
||||
|
||||
if (args.length >= 1 && args[0].equalsIgnoreCase("--hard")) {
|
||||
resetType = ResetType.HARD;
|
||||
git.reset(resetType);
|
||||
sender.sendMessage("§cHard reset performed.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length >= 1 && !args[0].startsWith("--")) {
|
||||
String file = args[0];
|
||||
git.resetFile(file);
|
||||
sender.sendMessage("§aUnstaged file: §f" + file);
|
||||
return;
|
||||
}
|
||||
|
||||
git.reset(resetType);
|
||||
sender.sendMessage("§aReset staged changes.");
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cGit reset failed: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package org.yuemi.commands.subcommands;
|
||||
|
||||
import org.yuemi.commands.SubcommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.yuemi.git.GitManager;
|
||||
import org.eclipse.jgit.api.Status;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class GitStatusSubcommand implements SubcommandExecutor {
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
public GitStatusSubcommand(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
File repoFolder = new File(".");
|
||||
|
||||
for (String arg : args) {
|
||||
if (arg.startsWith("--path=")) {
|
||||
repoFolder = new File(arg.substring("--path=".length()));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
GitManager git = new GitManager(repoFolder);
|
||||
Status status = git.getStatus();
|
||||
|
||||
Stream<String> changes = Stream.concat(
|
||||
status.getUncommittedChanges().stream().map(f -> "Uncommitted: " + f),
|
||||
Stream.concat(
|
||||
status.getUntracked().stream().map(f -> "Untracked: " + f),
|
||||
status.getModified().stream().map(f -> "Modified: " + f)
|
||||
)
|
||||
);
|
||||
|
||||
List<String> messages = changes.collect(Collectors.toList());
|
||||
|
||||
if (messages.isEmpty()) {
|
||||
sender.sendMessage("§aClean working directory.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (sender instanceof Player) {
|
||||
messages.stream().limit(10).forEach(msg -> sender.sendMessage("§e" + msg));
|
||||
if (messages.size() > 10) {
|
||||
sender.sendMessage("§7... and " + (messages.size() - 10) + " more.");
|
||||
}
|
||||
} else {
|
||||
messages.forEach(msg -> sender.sendMessage("[GitStatus] " + msg));
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cGit status failed: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
146
app/src/main/java/org/yuemi/git/GitManager.java
Normal file
146
app/src/main/java/org/yuemi/git/GitManager.java
Normal file
@@ -0,0 +1,146 @@
|
||||
package org.yuemi.git;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import org.eclipse.jgit.api.Git;
|
||||
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
|
||||
import org.eclipse.jgit.api.ResetCommand.ResetType;
|
||||
import org.eclipse.jgit.api.Status;
|
||||
import org.eclipse.jgit.api.AddCommand;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class GitManager {
|
||||
|
||||
private final File repoDir;
|
||||
private Git git;
|
||||
|
||||
public GitManager(File repoDir) {
|
||||
this.repoDir = repoDir;
|
||||
}
|
||||
|
||||
private Git getOrOpenGit() throws Exception {
|
||||
if (git == null) {
|
||||
git = Git.open(repoDir);
|
||||
}
|
||||
return git;
|
||||
}
|
||||
|
||||
public boolean isCloned() {
|
||||
return new File(repoDir, ".git").exists();
|
||||
}
|
||||
|
||||
public void cloneRepo(String url) throws Exception {
|
||||
this.git = Git.cloneRepository()
|
||||
.setURI(url)
|
||||
.setDirectory(repoDir)
|
||||
.call();
|
||||
}
|
||||
|
||||
public void addAll() throws Exception {
|
||||
getOrOpenGit().add().addFilepattern(".").call();
|
||||
}
|
||||
|
||||
public void addFiles(List<String> files) throws Exception {
|
||||
AddCommand add = getOrOpenGit().add();
|
||||
for (String file : files) {
|
||||
add.addFilepattern(file);
|
||||
}
|
||||
add.call();
|
||||
}
|
||||
|
||||
public void commit(String message) throws Exception {
|
||||
getOrOpenGit()
|
||||
.commit()
|
||||
.setMessage(message)
|
||||
.setAuthor("Minecraft", "mc@localhost")
|
||||
.call();
|
||||
}
|
||||
|
||||
public void push(String username, String token) throws Exception {
|
||||
getOrOpenGit()
|
||||
.push()
|
||||
.setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, token))
|
||||
.call();
|
||||
}
|
||||
|
||||
public void checkout(String branch) throws Exception {
|
||||
getOrOpenGit()
|
||||
.checkout()
|
||||
.setName(branch)
|
||||
.call();
|
||||
}
|
||||
|
||||
public void close() {
|
||||
if (git != null) {
|
||||
git.close();
|
||||
}
|
||||
}
|
||||
|
||||
public void reset(ResetType type) throws Exception {
|
||||
getOrOpenGit().reset().setMode(type).call();
|
||||
}
|
||||
|
||||
public void resetFile(String filePath) throws Exception {
|
||||
getOrOpenGit().reset().addPath(filePath).call();
|
||||
}
|
||||
|
||||
public void initRepo(JavaPlugin plugin) throws Exception {
|
||||
if (git == null) {
|
||||
git = Git.init().setDirectory(repoDir).call();
|
||||
}
|
||||
|
||||
File gitignore = new File(repoDir, ".gitignore");
|
||||
if (!gitignore.exists()) {
|
||||
try (InputStream in = plugin.getResource("gitignore.txt")) {
|
||||
if (in != null) {
|
||||
Files.copy(in, gitignore.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void addRemote(String url) throws Exception {
|
||||
getOrOpenGit().remoteAdd()
|
||||
.setName("origin")
|
||||
.setUri(new org.eclipse.jgit.transport.URIish(url))
|
||||
.call();
|
||||
}
|
||||
|
||||
public void setRemoteUrl(String url) throws Exception {
|
||||
getOrOpenGit().remoteSetUrl()
|
||||
.setRemoteName("origin")
|
||||
.setRemoteUri(new org.eclipse.jgit.transport.URIish(url))
|
||||
.call();
|
||||
}
|
||||
|
||||
public void removeRemote() throws Exception {
|
||||
getOrOpenGit().remoteRemove()
|
||||
.setRemoteName("origin")
|
||||
.call();
|
||||
}
|
||||
|
||||
public void fetch(String username, String token) throws Exception {
|
||||
getOrOpenGit()
|
||||
.fetch()
|
||||
.setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, token))
|
||||
.call();
|
||||
}
|
||||
|
||||
public void pull(String username, String token) throws Exception {
|
||||
getOrOpenGit()
|
||||
.pull()
|
||||
.setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, token))
|
||||
.call();
|
||||
}
|
||||
|
||||
public Status getStatus() throws Exception {
|
||||
return getOrOpenGit().status().call();
|
||||
}
|
||||
|
||||
}
|
||||
14
app/src/main/resources/gitignore.txt
Normal file
14
app/src/main/resources/gitignore.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
# Minecraft plugin defaults
|
||||
logs/
|
||||
*.log
|
||||
*.tmp
|
||||
*.lock
|
||||
*.bak
|
||||
*.swp
|
||||
cache/
|
||||
debug/
|
||||
.idea/
|
||||
*.iml
|
||||
*.class
|
||||
target/
|
||||
build/
|
||||
@@ -5,9 +5,6 @@ authors:
|
||||
version: 1.0
|
||||
api-version: 1.21
|
||||
commands:
|
||||
gitclone:
|
||||
description: Clones a Git repository
|
||||
gitcommit:
|
||||
description: Commits all changes
|
||||
gitpush:
|
||||
description: Pushes to remote
|
||||
git:
|
||||
description: Git subcommand dispatcher
|
||||
usage: /git <add|commit|push|clone>
|
||||
|
||||
Reference in New Issue
Block a user