1 package org.apache.maven.scm.provider.git.jgit.command.list;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.scm.ScmException;
23 import org.apache.maven.scm.ScmFile;
24 import org.apache.maven.scm.ScmFileSet;
25 import org.apache.maven.scm.ScmFileStatus;
26 import org.apache.maven.scm.ScmVersion;
27 import org.apache.maven.scm.command.list.AbstractListCommand;
28 import org.apache.maven.scm.command.list.ListScmResult;
29 import org.apache.maven.scm.provider.ScmProviderRepository;
30 import org.apache.maven.scm.provider.git.command.GitCommand;
31 import org.apache.maven.scm.provider.git.jgit.command.JGitTransportConfigCallback;
32 import org.apache.maven.scm.provider.git.jgit.command.JGitUtils;
33 import org.apache.maven.scm.provider.git.jgit.command.ScmProviderAwareSshdSessionFactory;
34 import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
35 import org.eclipse.jgit.api.Git;
36 import org.eclipse.jgit.lib.Ref;
37 import org.eclipse.jgit.transport.CredentialsProvider;
38 import org.slf4j.Logger;
39
40 import java.util.ArrayList;
41 import java.util.Collection;
42 import java.util.List;
43 import java.util.function.BiFunction;
44
45
46
47
48
49 public class JGitListCommand
50 extends AbstractListCommand
51 implements GitCommand
52 {
53
54 private BiFunction<GitScmProviderRepository, Logger, ScmProviderAwareSshdSessionFactory> sshSessionFactorySupplier;
55
56 public JGitListCommand()
57 {
58 sshSessionFactorySupplier = ScmProviderAwareSshdSessionFactory::new;
59 }
60
61 public void setSshSessionFactorySupplier(
62 BiFunction<GitScmProviderRepository, Logger, ScmProviderAwareSshdSessionFactory> sshSessionFactorySupplier )
63 {
64 this.sshSessionFactorySupplier = sshSessionFactorySupplier;
65 }
66
67 @Override
68 protected ListScmResult executeListCommand( ScmProviderRepository repo, ScmFileSet fileSet, boolean recursive,
69 ScmVersion scmVersion )
70 throws ScmException
71 {
72
73 Git git = null;
74 try
75 {
76 git = JGitUtils.openRepo( fileSet.getBasedir() );
77 CredentialsProvider credentials =
78 JGitUtils.prepareSession( git, (GitScmProviderRepository) repo );
79
80 List<ScmFile> list = new ArrayList<>();
81 Collection<Ref> lsResult = git.lsRemote().setCredentialsProvider( credentials )
82 .setTransportConfigCallback(
83 new JGitTransportConfigCallback(
84 sshSessionFactorySupplier.apply( (GitScmProviderRepository) repo, logger ) ) )
85 .call();
86 for ( Ref ref : lsResult )
87 {
88 logger.debug( ref.getObjectId().getName() + " " + ref.getTarget().getName() );
89 list.add( new ScmFile( ref.getName(), ScmFileStatus.CHECKED_IN ) );
90 }
91
92 return new ListScmResult( "JGit ls-remote", list );
93 }
94 catch ( Exception e )
95 {
96 throw new ScmException( "JGit ls-remote failure!", e );
97 }
98 finally
99 {
100 JGitUtils.closeRepo( git );
101 }
102 }
103 }