Add options to control recursion into submodules on fetch. Add a callback interface on FetchCommand, to allow Fetch to display an update "Fetching submodule XYZ" for each submodule. Change-Id: Id805044b57289ee0f384b434aba1dbd2fd317e5b Signed-off-by: David Pursehouse <david.pursehouse@gmail.com> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>tags/v4.8.0.201706111038-r
@@ -67,12 +67,14 @@ failedToLockIndex=failed to lock index | |||
failedToLockTag=Failed to lock tag {0}: {1} | |||
fatalError=fatal: {0} | |||
fatalThisProgramWillDestroyTheRepository=fatal: This program will destroy the repository\nfatal:\nfatal:\nfatal: {0}\nfatal:\nfatal: To continue, add {1} to the command line\nfatal: | |||
fetchingSubmodule=Fetching submodule {0} | |||
fileIsRequired=argument file is required | |||
ffNotPossibleAborting=Not possible to fast-forward, aborting. | |||
forcedUpdate=forced update | |||
fromURI=From {0} | |||
initializedEmptyGitRepositoryIn=Initialized empty Git repository in {0} | |||
invalidHttpProxyOnlyHttpSupported=Invalid http_proxy: {0}: Only http supported. | |||
invalidRecurseSubmodulesMode=Invalid recurse submodules mode: {0} | |||
jgitVersion=jgit version {0} | |||
lineFormat={0} | |||
listeningOn=Listening on {0} | |||
@@ -359,6 +361,7 @@ usage_noCheckoutAfterClone=no checkout of HEAD is performed after the clone is c | |||
usage_noCommit=Don't commit after a successful merge | |||
usage_noPrefix=do not show any source or destination prefix | |||
usage_noRenames=disable rename detection | |||
usage_noRecurseSubmodules=Disable recursive fetching of submodules (this has the same effect as using the --recurse-submodules=no option) | |||
usage_noShowStandardNotes=Disable showing notes from the standard /refs/notes/commits branch | |||
usage_onlyMatchAgainstAlreadyTrackedFiles=Only match <filepattern> against already tracked files in the index rather than the working tree | |||
usage_outputFile=Output file |
@@ -90,6 +90,9 @@ abstract class AbstractFetchCommand extends TextBuiltin { | |||
} | |||
} | |||
showRemoteMessages(errw, r.getMessages()); | |||
for (FetchResult submoduleResult : r.submoduleResults().values()) { | |||
showFetchResult(submoduleResult); | |||
} | |||
} | |||
static void showRemoteMessages(ThrowingPrintWriter writer, String pkt) throws IOException { |
@@ -45,11 +45,15 @@ | |||
package org.eclipse.jgit.pgm; | |||
import java.io.IOException; | |||
import java.text.MessageFormat; | |||
import java.util.List; | |||
import org.eclipse.jgit.api.FetchCommand; | |||
import org.eclipse.jgit.api.Git; | |||
import org.eclipse.jgit.lib.Constants; | |||
import org.eclipse.jgit.lib.SubmoduleConfig.FetchRecurseSubmodulesMode; | |||
import org.eclipse.jgit.pgm.internal.CLIText; | |||
import org.eclipse.jgit.lib.TextProgressMonitor; | |||
import org.eclipse.jgit.transport.FetchResult; | |||
import org.eclipse.jgit.transport.RefSpec; | |||
@@ -58,7 +62,7 @@ import org.kohsuke.args4j.Argument; | |||
import org.kohsuke.args4j.Option; | |||
@Command(common = true, usage = "usage_updateRemoteRefsFromAnotherRepository") | |||
class Fetch extends AbstractFetchCommand { | |||
class Fetch extends AbstractFetchCommand implements FetchCommand.Callback { | |||
@Option(name = "--timeout", metaVar = "metaVar_seconds", usage = "usage_abortConnectionIfNoActivity") | |||
int timeout = -1; | |||
@@ -96,6 +100,31 @@ class Fetch extends AbstractFetchCommand { | |||
tags = Boolean.FALSE; | |||
} | |||
private FetchRecurseSubmodulesMode recurseSubmodules; | |||
@Option(name = "--recurse-submodules", usage = "usage_recurseSubmodules") | |||
void recurseSubmodules(String mode) { | |||
if (mode == null || mode.isEmpty()) { | |||
recurseSubmodules = FetchRecurseSubmodulesMode.YES; | |||
} else { | |||
for (FetchRecurseSubmodulesMode m : FetchRecurseSubmodulesMode | |||
.values()) { | |||
if (m.matchConfigValue(mode)) { | |||
recurseSubmodules = m; | |||
return; | |||
} | |||
} | |||
throw die(MessageFormat | |||
.format(CLIText.get().invalidRecurseSubmodulesMode, mode)); | |||
} | |||
} | |||
@Option(name = "--no-recurse-submodules", usage = "usage_noRecurseSubmodules") | |||
void noRecurseSubmodules(@SuppressWarnings("unused") | |||
final boolean ignored) { | |||
recurseSubmodules = FetchRecurseSubmodulesMode.NO; | |||
} | |||
@Argument(index = 0, metaVar = "metaVar_uriish") | |||
private String remote = Constants.DEFAULT_REMOTE_NAME; | |||
@@ -124,12 +153,25 @@ class Fetch extends AbstractFetchCommand { | |||
fetch.setThin(thin.booleanValue()); | |||
if (quiet == null || !quiet.booleanValue()) | |||
fetch.setProgressMonitor(new TextProgressMonitor(errw)); | |||
fetch.setRecurseSubmodules(recurseSubmodules).setCallback(this); | |||
FetchResult result = fetch.call(); | |||
if (result.getTrackingRefUpdates().isEmpty()) | |||
if (result.getTrackingRefUpdates().isEmpty() | |||
&& result.submoduleResults().isEmpty()) | |||
return; | |||
showFetchResult(result); | |||
} | |||
} | |||
@Override | |||
public void fetchingSubmodule(String name) { | |||
try { | |||
outw.println(MessageFormat.format(CLIText.get().fetchingSubmodule, | |||
name)); | |||
outw.flush(); | |||
} catch (IOException e) { | |||
// ignore | |||
} | |||
} | |||
} |
@@ -143,12 +143,14 @@ public class CLIText extends TranslationBundle { | |||
/***/ public String failedToLockTag; | |||
/***/ public String fatalError; | |||
/***/ public String fatalThisProgramWillDestroyTheRepository; | |||
/***/ public String fetchingSubmodule; | |||
/***/ public String fileIsRequired; | |||
/***/ public String ffNotPossibleAborting; | |||
/***/ public String forcedUpdate; | |||
/***/ public String fromURI; | |||
/***/ public String initializedEmptyGitRepositoryIn; | |||
/***/ public String invalidHttpProxyOnlyHttpSupported; | |||
/***/ public String invalidRecurseSubmodulesMode; | |||
/***/ public String jgitVersion; | |||
/***/ public String lfsNoAccessKey; | |||
/***/ public String lfsNoSecretKey; |
@@ -99,6 +99,24 @@ public class FetchCommand extends TransportCommand<FetchCommand, FetchResult> { | |||
private FetchRecurseSubmodulesMode submoduleRecurseMode = null; | |||
private Callback callback; | |||
/** | |||
* Callback for status of fetch operation. | |||
* | |||
* @since 4.8 | |||
* | |||
*/ | |||
public interface Callback { | |||
/** | |||
* Notify fetching a submodule. | |||
* | |||
* @param name | |||
* the submodule name. | |||
*/ | |||
void fetchingSubmodule(String name); | |||
} | |||
/** | |||
* @param repo | |||
*/ | |||
@@ -173,6 +191,9 @@ public class FetchCommand extends TransportCommand<FetchCommand, FetchResult> { | |||
.setThin(thin).setRefSpecs(refSpecs) | |||
.setDryRun(dryRun) | |||
.setRecurseSubmodules(recurseMode); | |||
if (callback != null) { | |||
callback.fetchingSubmodule(walk.getPath()); | |||
} | |||
results.addSubmodule(walk.getPath(), f.call()); | |||
} | |||
} | |||
@@ -434,4 +455,17 @@ public class FetchCommand extends TransportCommand<FetchCommand, FetchResult> { | |||
this.tagOption = tagOpt; | |||
return this; | |||
} | |||
/** | |||
* Register a progress callback. | |||
* | |||
* @param callback | |||
* the callback | |||
* @return {@code this} | |||
* @since 4.8 | |||
*/ | |||
public FetchCommand setCallback(Callback callback) { | |||
this.callback = callback; | |||
return this; | |||
} | |||
} |
@@ -43,6 +43,10 @@ | |||
package org.eclipse.jgit.lib; | |||
import java.util.Locale; | |||
import org.eclipse.jgit.util.StringUtils; | |||
/** | |||
* Submodule section of a Git configuration file. | |||
* | |||
@@ -75,12 +79,17 @@ public class SubmoduleConfig { | |||
@Override | |||
public String toConfigValue() { | |||
return configValue; | |||
return name().toLowerCase(Locale.ROOT).replace('_', '-'); | |||
} | |||
@Override | |||
public boolean matchConfigValue(String s) { | |||
return configValue.equals(s); | |||
if (StringUtils.isEmptyOrNull(s)) { | |||
return false; | |||
} | |||
s = s.replace('-', '_'); | |||
return name().equalsIgnoreCase(s) | |||
|| configValue.equalsIgnoreCase(s); | |||
} | |||
} | |||
} |