Skip to content

Commit 851705a

Browse files
committed
Add method to ScmManager to get an ScmRepository from an existing
directory It tries to find a suitable provider by using ScmProvider.makeProviderScmRepository(directory) on all providers Extend checkout Tck to make sure that the working directory is recognized afterwards by the provider.
1 parent 01ffa73 commit 851705a

File tree

6 files changed

+87
-3
lines changed

6 files changed

+87
-3
lines changed

maven-scm-api/src/main/java/org/apache/maven/scm/manager/AbstractScmManager.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Date;
2424
import java.util.List;
2525
import java.util.Map;
26+
import java.util.Optional;
2627
import java.util.concurrent.ConcurrentHashMap;
2728

2829
import org.apache.maven.scm.CommandParameters;
@@ -245,6 +246,28 @@ public ScmRepository makeProviderScmRepository(String providerType, File path)
245246
return new ScmRepository(providerType, providerRepository);
246247
}
247248

249+
@Override
250+
public Optional<ScmRepository> makeProviderScmRepository(File workingDirectory) {
251+
//
252+
for (ScmProvider provider : scmProviders.values()) {
253+
logger.debug(
254+
"Checking if SCM provider {} is suitable for processing: {}",
255+
provider.getScmType(),
256+
workingDirectory);
257+
try {
258+
ScmProviderRepository providerRepository = provider.makeProviderScmRepository(workingDirectory);
259+
return Optional.of(new ScmRepository(provider.getScmType(), providerRepository));
260+
} catch (ScmRepositoryException | UnknownRepositoryStructure e) {
261+
logger.debug(
262+
"SCM provider {} is not suitable for processing: {}",
263+
provider.getScmType(),
264+
workingDirectory,
265+
e);
266+
}
267+
}
268+
return Optional.empty();
269+
}
270+
248271
/**
249272
* {@inheritDoc}
250273
*/

maven-scm-api/src/main/java/org/apache/maven/scm/manager/ScmManager.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.io.File;
2222
import java.util.Date;
2323
import java.util.List;
24+
import java.util.Optional;
2425

2526
import org.apache.maven.scm.CommandParameters;
2627
import org.apache.maven.scm.ScmBranch;
@@ -62,18 +63,36 @@ public interface ScmManager {
6263
// ----------------------------------------------------------------------
6364

6465
/**
65-
* Generate a SCMRepository from an SCM URL.
66+
* Generate a {@link ScmRepository} from an SCM URL.
6667
*
6768
* @param scmUrl the scm url
68-
* @return the scm repository
69+
* @return the scm repository (never {@code null})
6970
* @throws NoSuchScmProviderException if the provider doesn't exist
7071
* @throws ScmRepositoryException if an error occurs in the scm repository construction
7172
*/
7273
ScmRepository makeScmRepository(String scmUrl) throws ScmRepositoryException, NoSuchScmProviderException;
7374

75+
/**
76+
* Generate a {@link ScmRepository} for a specific provider and a given checkout (working) directory
77+
* @param providerType
78+
* @param path the checkout (working) directory
79+
* @return the SCM repository (never {@code null})
80+
* @throws ScmRepositoryException if the provider does not recognize the directory
81+
* @throws UnknownRepositoryStructure if the provider does not support this way of generating a {@link ScmRepository}
82+
* @throws NoSuchScmProviderException if the given provider type does not have a provider implementation bound
83+
*/
7484
ScmRepository makeProviderScmRepository(String providerType, File path)
7585
throws ScmRepositoryException, UnknownRepositoryStructure, NoSuchScmProviderException;
7686

87+
/**
88+
* Generate a {@link ScmRepository} for a given checkout (working) directory.
89+
* Determines a suitable SCM provider for the directory by looking for SCM specific metadata files.
90+
* @param path the checkout (working) directory
91+
* @return the {@link ScmRepository} or empty if no suitable provider found
92+
* @since 2.2.1
93+
*/
94+
Optional<ScmRepository> makeProviderScmRepository(File path);
95+
7796
/**
7897
* Validate a SCM URL.
7998
*

maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProvider.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ public interface ScmProvider {
6565
ScmProviderRepository makeProviderScmRepository(String scmSpecificUrl, char delimiter)
6666
throws ScmRepositoryException;
6767

68+
/**
69+
* Try to create a {@link ScmProviderRepository} for this provider from the given working directory (created through a previous checkout).
70+
* This is only successful if the working directory is recognized by this SCM provider.
71+
* @param path the checkout(working) directory
72+
* @return the repository bound to this provider
73+
* @throws ScmRepositoryException in case the given directory does not contain a valid working directory recognized by this provider
74+
* @throws UnknownRepositoryStructure in case the provider does not support this way of initializing an ScmProviderRepository
75+
*/
6876
ScmProviderRepository makeProviderScmRepository(File path)
6977
throws ScmRepositoryException, UnknownRepositoryStructure;
7078

maven-scm-providers/maven-scm-providers-git/maven-scm-provider-jgit/src/main/java/org/apache/maven/scm/provider/git/jgit/JGitScmProvider.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.apache.maven.scm.provider.git.jgit.command.status.JGitStatusCommand;
4545
import org.apache.maven.scm.provider.git.jgit.command.tag.JGitTagCommand;
4646
import org.apache.maven.scm.provider.git.jgit.command.untag.JGitUntagCommand;
47+
import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
4748
import org.apache.maven.scm.repository.ScmRepositoryException;
4849
import org.codehaus.plexus.components.interactivity.Prompter;
4950
import org.eclipse.jgit.transport.CredentialsProvider;
@@ -188,7 +189,8 @@ protected String getRepositoryURL(File path) throws ScmException {
188189
// Note: I need to supply just 1 absolute path, but ScmFileSet won't let
189190
// me without
190191
// a basedir (which isn't used here anyway), so use a dummy file.
191-
InfoScmResult result = info(null, new ScmFileSet(new File(""), path), null);
192+
InfoScmResult result =
193+
info(new GitScmProviderRepository(path.toPath().toUri().toASCIIString()), new ScmFileSet(path), null);
192194

193195
if (result.getInfoItems().size() != 1) {
194196
throw new ScmRepositoryException("Cannot find URL: "

maven-scm-test/src/main/java/org/apache/maven/scm/manager/ScmManagerStub.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.ArrayList;
2323
import java.util.Date;
2424
import java.util.List;
25+
import java.util.Optional;
2526

2627
import org.apache.maven.scm.CommandParameters;
2728
import org.apache.maven.scm.ScmBranch;
@@ -141,6 +142,11 @@ public ScmRepository makeProviderScmRepository(String providerType, File path)
141142
return getScmRepository();
142143
}
143144

145+
@Override
146+
public Optional<ScmRepository> makeProviderScmRepository(File path) {
147+
return Optional.ofNullable(getScmRepository());
148+
}
149+
144150
/**
145151
* Returns the same list as getMessages()
146152
*

maven-scm-test/src/main/java/org/apache/maven/scm/tck/command/checkout/CheckOutCommandTckTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,21 @@
2020

2121
import java.util.Iterator;
2222
import java.util.List;
23+
import java.util.Optional;
2324
import java.util.SortedSet;
2425
import java.util.TreeSet;
2526

2627
import org.apache.maven.scm.ScmFile;
2728
import org.apache.maven.scm.ScmTckTestCase;
2829
import org.apache.maven.scm.command.checkout.CheckOutScmResult;
30+
import org.apache.maven.scm.provider.ScmProvider;
31+
import org.apache.maven.scm.repository.ScmRepository;
32+
import org.apache.maven.scm.repository.UnknownRepositoryStructure;
2933
import org.junit.Test;
3034

35+
import static org.junit.Assert.assertTrue;
3136
import static org.junit.Assert.fail;
37+
import static org.junit.Assume.assumeTrue;
3238

3339
/**
3440
* This test tests the check out command.
@@ -60,4 +66,24 @@ public void testCheckOutCommandTest() throws Exception {
6066
fail("Expected 4 files in the updated files list, was " + checkedOutFiles.size());
6167
}
6268
}
69+
70+
@Test
71+
public void testMakeProviderScmRepositoryFromCheckoutDirectory() throws Exception {
72+
assumeTrue(isMakeProviderScmRepositoryFromDirectorySupportedByProvider());
73+
CheckOutScmResult result = checkOut(getWorkingCopy(), getScmRepository());
74+
assertResultIsSuccess(result);
75+
Optional<ScmRepository> repository = getScmManager().makeProviderScmRepository(getWorkingCopy());
76+
assertTrue("Could not detect SCM repository for working copy at " + getWorkingCopy(), repository.isPresent());
77+
}
78+
79+
private boolean isMakeProviderScmRepositoryFromDirectorySupportedByProvider() throws Exception {
80+
ScmProvider provider = getScmManager().getProviderByUrl(getScmUrl());
81+
try {
82+
provider.makeProviderScmRepository(getWorkingCopy());
83+
} catch (UnknownRepositoryStructure e) {
84+
// in this case the provider does not support this operation
85+
return false;
86+
}
87+
return true;
88+
}
6389
}

0 commit comments

Comments
 (0)