| @@ -19,6 +19,7 @@ import java.nio.file.Path; | |||||
| import java.nio.file.Paths; | import java.nio.file.Paths; | ||||
| import java.nio.file.StandardCopyOption; | import java.nio.file.StandardCopyOption; | ||||
| import java.util.*; | import java.util.*; | ||||
| import java.util.concurrent.ExecutorCompletionService; | |||||
| import java.util.concurrent.ExecutorService; | import java.util.concurrent.ExecutorService; | ||||
| import java.util.concurrent.Executors; | import java.util.concurrent.Executors; | ||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||
| @@ -26,7 +27,7 @@ import java.util.concurrent.TimeUnit; | |||||
| public class DVCUtils { | public class DVCUtils { | ||||
| private static final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); | private static final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); | ||||
| private static final Logger log = LoggerFactory.getLogger(DVCUtils.class); | private static final Logger log = LoggerFactory.getLogger(DVCUtils.class); | ||||
| private static final ExecutorCompletionService<Void> completionService = new ExecutorCompletionService<>(executorService); | |||||
| private static void runCommand(String command, String workingDir) throws Exception { | private static void runCommand(String command, String workingDir) throws Exception { | ||||
| ProcessBuilder processBuilder = new ProcessBuilder(command.split(" ")); | ProcessBuilder processBuilder = new ProcessBuilder(command.split(" ")); | ||||
| processBuilder.directory(new File(workingDir)); | processBuilder.directory(new File(workingDir)); | ||||
| @@ -161,6 +162,7 @@ public class DVCUtils { | |||||
| log.error("Error occurred while updating all branches", e); | log.error("Error occurred while updating all branches", e); | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * 更新本地仓库中的指定分支 | * 更新本地仓库中的指定分支 | ||||
| * | * | ||||
| @@ -220,14 +222,12 @@ public class DVCUtils { | |||||
| public static void createLocalBranchBasedOnMaster(String localPath, String branchName) { | public static void createLocalBranchBasedOnMaster(String localPath, String branchName) { | ||||
| try (Git git = Git.open(new File(localPath))) { | try (Git git = Git.open(new File(localPath))) { | ||||
| // 切换到 master 分支 | // 切换到 master 分支 | ||||
| git.checkout().setName("master").call(); | |||||
| // 创建新的本地分支 | |||||
| git.branchCreate().setName(branchName).call(); | |||||
| log.info("基于 master 的本地分支 " + branchName + " 创建成功。"); | |||||
| git.checkout().setName(branchName).call(); | |||||
| git.checkout() | |||||
| .setCreateBranch(true) | |||||
| .setName(branchName) | |||||
| .setStartPoint("origin/master") | |||||
| .call(); | |||||
| log.info("基于 master 的远程分支 " + branchName + " 创建成功。"); | |||||
| } catch (IOException | GitAPIException e) { | } catch (IOException | GitAPIException e) { | ||||
| log.error("Exception occurred while creating local branch based on master",e); | log.error("Exception occurred while creating local branch based on master",e); | ||||
| } | } | ||||
| @@ -326,9 +326,7 @@ public class DVCUtils { | |||||
| return false; | return false; | ||||
| } | } | ||||
| public static void refreshRemoteBranches(String localPath, String username, String password, String branch) throws Exception { | public static void refreshRemoteBranches(String localPath, String username, String password, String branch) throws Exception { | ||||
| long startTime = System.currentTimeMillis(); | |||||
| try (Repository repository = new FileRepositoryBuilder() | try (Repository repository = new FileRepositoryBuilder() | ||||
| .setGitDir(new File(localPath + "/.git")) | .setGitDir(new File(localPath + "/.git")) | ||||
| .readEnvironment() | .readEnvironment() | ||||
| @@ -343,37 +341,42 @@ public class DVCUtils { | |||||
| log.info("Repository is in a merging state, please resolve conflicts manually."); | log.info("Repository is in a merging state, please resolve conflicts manually."); | ||||
| return; | return; | ||||
| } | } | ||||
| // 设置凭证提供者 | // 设置凭证提供者 | ||||
| UsernamePasswordCredentialsProvider credentialsProvider = new UsernamePasswordCredentialsProvider(username, password); | UsernamePasswordCredentialsProvider credentialsProvider = new UsernamePasswordCredentialsProvider(username, password); | ||||
| // 获取远程分支 | // 获取远程分支 | ||||
| long fetchStartTime = System.currentTimeMillis(); | |||||
| FetchResult fetchResult = git.fetch() | FetchResult fetchResult = git.fetch() | ||||
| .setRemote("origin") | .setRemote("origin") | ||||
| .setCredentialsProvider(credentialsProvider) | .setCredentialsProvider(credentialsProvider) | ||||
| .call(); | .call(); | ||||
| long fetchEndTime = System.currentTimeMillis(); | |||||
| log.info("Fetch time: " + (fetchEndTime - fetchStartTime) + " ms"); | |||||
| // 打印获取的远程分支 | // 打印获取的远程分支 | ||||
| Collection<Ref> fetchedRefs = fetchResult.getAdvertisedRefs(); | Collection<Ref> fetchedRefs = fetchResult.getAdvertisedRefs(); | ||||
| for (Ref ref : fetchedRefs) { | for (Ref ref : fetchedRefs) { | ||||
| log.info("Fetched branch: " + ref.getName()); | log.info("Fetched branch: " + ref.getName()); | ||||
| } | } | ||||
| // 更新本地分支信息 | // 更新本地分支信息 | ||||
| long branchListStartTime = System.currentTimeMillis(); | |||||
| git.branchList() | git.branchList() | ||||
| .setListMode(org.eclipse.jgit.api.ListBranchCommand.ListMode.REMOTE) | .setListMode(org.eclipse.jgit.api.ListBranchCommand.ListMode.REMOTE) | ||||
| .call() | .call() | ||||
| .forEach(ref -> executorService.submit(() -> { | |||||
| .forEach(ref -> { | |||||
| String fullBranchName = ref.getName(); | String fullBranchName = ref.getName(); | ||||
| String branchName = fullBranchName.replace("refs/remotes/origin/", ""); | String branchName = fullBranchName.replace("refs/remotes/origin/", ""); | ||||
| try { | try { | ||||
| processBranch(git, repository, credentialsProvider, fullBranchName, branchName); | |||||
| completionService.submit(() -> { | |||||
| try { | |||||
| processBranch(git, repository, credentialsProvider, fullBranchName, branchName); | |||||
| } catch (Exception e) { | |||||
| log.error("Failed to process branch: " + branchName, e); | |||||
| } | |||||
| return null; | |||||
| }); | |||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| log.error("Failed to process branch: " + branchName, e); | |||||
| log.error("Task submission rejected", e); | |||||
| } | } | ||||
| })); | |||||
| }); | |||||
| executorService.shutdown(); | executorService.shutdown(); | ||||
| try { | try { | ||||
| @@ -381,17 +384,14 @@ public class DVCUtils { | |||||
| } catch (InterruptedException e) { | } catch (InterruptedException e) { | ||||
| log.error("Executor service interrupted", e); | log.error("Executor service interrupted", e); | ||||
| } | } | ||||
| long branchListEndTime = System.currentTimeMillis(); | |||||
| log.info("Branch list and update time: " + (branchListEndTime - branchListStartTime) + " ms"); | |||||
| log.info("远程分支刷新到本地完成。"); | log.info("远程分支刷新到本地完成。"); | ||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| log.error("Error occurred while refreshing remote branches ", e); ; | |||||
| log.error("Error occurred while refreshing remote branches ", e); | |||||
| } | } | ||||
| // 切换分支 | // 切换分支 | ||||
| gitCheckoutBranch(localPath, branch); | gitCheckoutBranch(localPath, branch); | ||||
| dvcCheckout(localPath); | dvcCheckout(localPath); | ||||
| long endTime = System.currentTimeMillis(); | |||||
| log.info("Total execution time: " + (endTime - startTime) + " ms"); | |||||
| } | } | ||||
| private static void processBranch(Git git, Repository repository, UsernamePasswordCredentialsProvider credentialsProvider, String fullBranchName, String branchName) throws Exception { | private static void processBranch(Git git, Repository repository, UsernamePasswordCredentialsProvider credentialsProvider, String fullBranchName, String branchName) throws Exception { | ||||
| @@ -401,43 +401,29 @@ public class DVCUtils { | |||||
| // 如果存在,检查是否已经关联到远程分支 | // 如果存在,检查是否已经关联到远程分支 | ||||
| if (!isBranchUpstreamSet(repository, branchName)) { | if (!isBranchUpstreamSet(repository, branchName)) { | ||||
| // 如果没有关联,设置上游分支 | // 如果没有关联,设置上游分支 | ||||
| long upstreamStartTime = System.currentTimeMillis(); | |||||
| git.branchCreate() | git.branchCreate() | ||||
| .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.SET_UPSTREAM) | .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.SET_UPSTREAM) | ||||
| .setStartPoint(fullBranchName) | .setStartPoint(fullBranchName) | ||||
| .setName(branchName) | .setName(branchName) | ||||
| .call(); | .call(); | ||||
| long upstreamEndTime = System.currentTimeMillis(); | |||||
| log.info("Set upstream for branch: " + branchName + ", time: " + (upstreamEndTime - upstreamStartTime) + " ms"); | |||||
| } | } | ||||
| } else { | } else { | ||||
| // 如果不存在,创建本地分支并设置上游分支 | // 如果不存在,创建本地分支并设置上游分支 | ||||
| long createBranchStartTime = System.currentTimeMillis(); | |||||
| git.branchCreate() | git.branchCreate() | ||||
| .setName(branchName) | .setName(branchName) | ||||
| .setStartPoint(fullBranchName) | .setStartPoint(fullBranchName) | ||||
| .call(); | .call(); | ||||
| long createBranchEndTime = System.currentTimeMillis(); | |||||
| log.info("Created local branch: " + branchName + ", time: " + (createBranchEndTime - createBranchStartTime) + " ms"); | |||||
| // 设置上游分支 | // 设置上游分支 | ||||
| long setUpstreamStartTime = System.currentTimeMillis(); | |||||
| git.branchCreate() | git.branchCreate() | ||||
| .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.SET_UPSTREAM) | .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.SET_UPSTREAM) | ||||
| .setStartPoint(fullBranchName) | .setStartPoint(fullBranchName) | ||||
| .setName(branchName) | .setName(branchName) | ||||
| .call(); | .call(); | ||||
| long setUpstreamEndTime = System.currentTimeMillis(); | |||||
| log.info("Set upstream for branch: " + branchName + ", time: " + (setUpstreamEndTime - setUpstreamStartTime) + " ms"); | |||||
| } | } | ||||
| // 执行 git pull | // 执行 git pull | ||||
| long pullStartTime = System.currentTimeMillis(); | |||||
| PullCommand pullCommand = git.pull() | PullCommand pullCommand = git.pull() | ||||
| .setCredentialsProvider(credentialsProvider); | .setCredentialsProvider(credentialsProvider); | ||||
| pullCommand.call(); | pullCommand.call(); | ||||
| long pullEndTime = System.currentTimeMillis(); | |||||
| log.info("Updated local branch: " + branchName + ", time: " + (pullEndTime - pullStartTime) + " ms"); | |||||
| } | } | ||||
| /** | /** | ||||