JGit, как проверить, объединена ли ветка с master - PullRequest
1 голос
/ 20 марта 2019

Процесс переноса кода - GitHub - Обзор

  1. Разработчик создает ветку, пишет код и т. Д.
  2. Разработчик фиксирует ветвь после завершения работы
  3. Производственная миграция - разработчик делает запрос на извлечение, чтобы вытянуть ветку в master.
  4. После того, как два утверждения завершены, разработчик может объединить код
  5. Разработчик объединяет код в master
  6. Git запускается в рабочей среде для клонирования репозитория из master ... Я пишу пользовательскую программу, использующую JGit для проверки того, что слияние завершено в мастер.
  7. Код развернут в производство

Проблема:

Я пытаюсь программно проверить, слил ли разработчик свой код в master.Я не могу заставить этот шаг работать.У всех примеров, которые я рассмотрел, есть коммиты ветки и мастера.После этого примеры впоследствии проверяют, зафиксирована ли ветка.Это недопустимый вариант для моей программы, потому что слияние происходит в GitHub после завершения согласований.

Когда я клонирую репозиторий JGit и пытаюсь проверить, была ли объединена другая ветвь, коммит разбора завершается неудачно и возвращает ноль.Обратное также верно, если я клонирую ветвь и проверяю, есть ли у мастера фиксация, он терпит неудачу.Очевидно, что я здесь что-то не так делаю.Пример кода, о котором я говорю:

try( RevWalk revWalk = new RevWalk( repository ) ) {
  RevCommit masterHead = revWalk.parseCommit( repository.resolve( "refs/heads/master" );
  RevCommit otherHead = revWalk.parseCommit( repository.resolve( "refs/heads/other-branch" );
  if( revWalk.isMergedInto( otherHead, masterHead ) ) {
   ...
  }
}

Я также попытался посмотреть на состояние хранилища, но это тоже не работает.Если у кого-то есть идеи, кроме использования инструмента командной строки git, я был бы признателен за помощь.

Разная информация

Java версия 1.7 - это то, что у нас есть.
Версия Jar - org.eclipse.jgit-4.5.4.201711221230-r.jar

Примеры, которые я рассмотрел:

https://gist.github.com/rherrmann/433adb44b3d15ed0f0c7

https://www.codeaffine.com/2015/12/15/getting-started-with-jgit/

Как объединить в JGit?

Как определить с JGit, какие ветви были объединены с мастером?

Мой код

public class GitHubTest
{
  public Repository repository;

  public GitHubTest()
  {
  }

  public static ArrayList<String> fetchGitBranches(String gitUrl)
  {
     Collection<Ref> refs;
     ArrayList<String> branches = new ArrayList<String>();
     try {
        refs = Git.lsRemoteRepository().setHeads(true)
        .setRemote(gitUrl)
        .setCredentialsProvider(new UsernamePasswordCredentialsProvider("token", "not applicable stack exchange"))
        .call();
        for (Ref ref: refs) {
           branches.add(ref.getName().substring(ref.getName().lastIndexOf("/") + 1, ref.getName().length()));
           System.out.println(ref.getName());
        }
        Collections.sort(branches);
     } catch (InvalidRemoteException e) {
        e.printStackTrace();
     } catch (TransportException e) {
        e.printStackTrace();
     } catch (GitAPIException e) {
        e.printStackTrace();
     }
     return branches;
  }



  public void getRepositoryCode()
  {
     try {
        Git git = 
           Git.cloneRepository()
           .setURI("https://github.com/FICOCorp/iww-test-create-1552931848516.git")
           .setCredentialsProvider(new UsernamePasswordCredentialsProvider("token", "not applicable stack exchange"))
           .setBranch("IKE_TEST2")
           .setDirectory(new File("C:\\z_git")).call();
     } catch (TransportException e) {
        e.printStackTrace();
     } catch (InvalidRemoteException e) {
        e.printStackTrace();
     } catch (GitAPIException e) {
        e.printStackTrace();
     }
  }

  public void setRespository(String repo)
  {
     try {

        FileRepositoryBuilder builder = new FileRepositoryBuilder();
        repository = 
         builder.findGitDir(new File(repo)).readEnvironment()
        .build();

     } catch (Exception e) {
        e.printStackTrace();
     }
  }

  public void isBranchMerged( String branch)
  {
     try {
        Git git = new Git(repository);

        System.out.println("git.getRepository().getFullBranch()  ="+git.getRepository().getFullBranch()  );
        RepositoryState r =  git.getRepository().getRepositoryState();

        System.out.println("r.canCommit();  =" + r.canCommit());
        //System.out.println("r.canCommit();  ="+r. );

        if (r == RepositoryState.MERGING) {
           System.out.println("RepositoryState.MERGING = Y");
        }
        else {
           System.out.println("RepositoryState.MERGING = N");
        }
        if (r == RepositoryState.MERGING_RESOLVED) {
           System.out.println("RepositoryState.MERGING_RESOLVED = Y");
        }
        else {
           System.out.println("RepositoryState.MERGING_RESOLVED = N");
        }
        Ref master = repository.findRef("master");

        // Get the object the reference points to
        ObjectId masterTip = master.getObjectId();
     } catch (Exception e) {
        e.printStackTrace();
        System.out.println( e.getMessage());
     }
  }


  public static void main(String[] args)
  {
     GitHubTest gitHubTest = new GitHubTest();
     gitHubTest.getRepositoryCode();

     ArrayList<String> al = gitHubTest.fetchGitBranches("https://github.com/FICOCorp/iww-test-create-1552931848516.git");

     for (String s: al) {
        System.out.println("Known Branches " + s);

     }
     //gitHubTest.getRepositoryDetails();
     gitHubTest.setRespository("C:\\z_git\\.git");
     gitHubTest.isBranchMerged("IKE_TEST2");
     //gitHubTest.listUncommittedChanges();
  }
}

Снимки экрана Step 4: Pull Request Step 4: Merge Approval

1 Ответ

1 голос
/ 23 марта 2019

Этого нельзя сделать с помощью JGit. Решением было вызвать API-интерфейсы rest в GitHub, в частности, службу запросов «pull».

...