in org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java [124:250]
private void executeImp(final ProgressMonitor monitor,
final FetchResult result, String initialBranch)
throws NotSupportedException, TransportException {
final TagOpt tagopt = transport.getTagOpt();
String getTags = (tagopt == TagOpt.NO_TAGS) ? null : Constants.R_TAGS;
String getHead = null;
try {
// If we don't have a HEAD yet, we're cloning and need to get the
// upstream HEAD, too.
Ref head = transport.local.exactRef(Constants.HEAD);
ObjectId id = head != null ? head.getObjectId() : null;
if (id == null || id.equals(ObjectId.zeroId())) {
getHead = Constants.HEAD;
}
} catch (IOException e) {
// Ignore
}
conn = transport.openFetch(toFetch, getTags, getHead);
try {
Map<String, Ref> refsMap = conn.getRefsMap();
if (isInitialBranchMissing(refsMap, initialBranch)) {
throw new TransportException(MessageFormat.format(
JGitText.get().remoteBranchNotFound, initialBranch));
}
result.setAdvertisedRefs(transport.getURI(), refsMap);
result.peerUserAgent = conn.getPeerUserAgent();
final Set<Ref> matched = new HashSet<>();
for (RefSpec spec : toFetch) {
if (spec.getSource() == null)
throw new TransportException(MessageFormat.format(
JGitText.get().sourceRefNotSpecifiedForRefspec, spec));
if (spec.isWildcard())
expandWildcard(spec, matched);
else
expandSingle(spec, matched);
}
Collection<Ref> additionalTags = Collections.<Ref> emptyList();
if (tagopt == TagOpt.AUTO_FOLLOW)
additionalTags = expandAutoFollowTags();
else if (tagopt == TagOpt.FETCH_TAGS)
expandFetchTags();
final boolean includedTags;
if (!askFor.isEmpty() && !askForIsComplete()) {
fetchObjects(monitor);
includedTags = conn.didFetchIncludeTags();
// Connection was used for object transfer. If we
// do another fetch we must open a new connection.
//
closeConnection(result);
} else {
includedTags = false;
}
if (tagopt == TagOpt.AUTO_FOLLOW && !additionalTags.isEmpty()) {
// There are more tags that we want to follow, but
// not all were asked for on the initial request.
//
have.addAll(askFor.keySet());
askFor.clear();
for (Ref r : additionalTags) {
ObjectId id = r.getPeeledObjectId();
if (id == null)
id = r.getObjectId();
if (localHasObject(id))
wantTag(r);
}
if (!askFor.isEmpty() && (!includedTags || !askForIsComplete())) {
reopenConnection();
if (!askFor.isEmpty())
fetchObjects(monitor);
}
}
} finally {
closeConnection(result);
}
BatchRefUpdate batch = transport.local.getRefDatabase()
.newBatchUpdate()
.setAllowNonFastForwards(true)
.setRefLogMessage("fetch", true); //$NON-NLS-1$
try (RevWalk walk = new RevWalk(transport.local)) {
walk.setRetainBody(false);
if (monitor instanceof BatchingProgressMonitor) {
((BatchingProgressMonitor) monitor).setDelayStart(
250, TimeUnit.MILLISECONDS);
}
if (transport.isRemoveDeletedRefs()) {
deleteStaleTrackingRefs(result, batch);
}
addUpdateBatchCommands(result, batch);
for (ReceiveCommand cmd : batch.getCommands()) {
cmd.updateType(walk);
if (cmd.getType() == UPDATE_NONFASTFORWARD
&& cmd instanceof TrackingRefUpdate.Command
&& !((TrackingRefUpdate.Command) cmd).canForceUpdate())
cmd.setResult(REJECTED_NONFASTFORWARD);
}
if (transport.isDryRun()) {
for (ReceiveCommand cmd : batch.getCommands()) {
if (cmd.getResult() == NOT_ATTEMPTED)
cmd.setResult(OK);
}
} else {
batch.execute(walk, monitor);
}
} catch (TransportException e) {
throw e;
} catch (IOException err) {
throw new TransportException(MessageFormat.format(
JGitText.get().failureUpdatingTrackingRef,
getFirstFailedRefName(batch), err.getMessage()), err);
}
if (!fetchHeadUpdates.isEmpty()) {
try {
updateFETCH_HEAD(result);
} catch (IOException err) {
throw new TransportException(MessageFormat.format(
JGitText.get().failureUpdatingFETCH_HEAD, err.getMessage()), err);
}
}
}