private Map<String, Ref> getFilteredRefs(Collection<String> refPrefixes) throws IOException { if (refPrefixes.isEmpty()) { return getAdvertisedOrDefaultRefs(); } if (refs == null && !advertiseRefsHookCalled) { advertiseRefsHook.advertiseRefs(this); advertiseRefsHookCalled = true; } if (refs == null) { // Fast path: the advertised refs hook did not set advertised refs. String[] prefixes = refPrefixes.toArray(new String[0]); Map<String, Ref> rs = db.getRefDatabase().getRefsByPrefix(prefixes).stream() .collect(toMap(Ref::getName, identity(), (a, b) -> b)); if (refFilter != RefFilter.DEFAULT) { return refFilter.filter(rs); } return transferConfig.getRefFilter().filter(rs); } // Slow path: filter the refs provided by the advertised refs hook. // refFilter has already been applied to refs. return refs.values().stream() .filter(ref -> refPrefixes.stream() .anyMatch(ref.getName()::startsWith)) .collect(toMap(Ref::getName, identity())); }
/** * Read a ref on behalf of the client. * <p> * This checks that the ref is present in the ref advertisement since * otherwise the client might not be supposed to be able to read it. * * @param name * the unabbreviated name of the reference. * @return the requested Ref, or {@code null} if it is not visible or * does not exist. * @throws java.io.IOException * on failure to read the ref or check it for visibility. */ @Nullable private Ref getRef(String name) throws IOException { if (refs != null) { return refs.get(name); } if (!advertiseRefsHookCalled) { advertiseRefsHook.advertiseRefs(this); advertiseRefsHookCalled = true; } if (refs == null && refFilter == RefFilter.DEFAULT && transferConfig.hasDefaultRefFilter()) { // Fast path: no ref filtering is needed. return db.getRefDatabase().exactRef(name); } return getAdvertisedOrDefaultRefs().get(name); }
advertised = Collections.emptySet(); else advertised = refIdSet(getAdvertisedOrDefaultRefs().values());
return RefDatabase.findRef(getAdvertisedOrDefaultRefs(), name);
advertised = Collections.emptySet(); } else { advertised = refIdSet(getAdvertisedOrDefaultRefs().values());
Map<String, Ref> advertisedOrDefaultRefs = getAdvertisedOrDefaultRefs();
advertised = Collections.emptySet(); else advertised = refIdSet(getAdvertisedOrDefaultRefs().values());
private void lsRefsV2() throws IOException { ProtocolV2Parser parser = new ProtocolV2Parser(transferConfig); LsRefsV2Request req = parser.parseLsRefsRequest(pckIn); protocolV2Hook.onLsRefs(req); rawOut.stopBuffering(); PacketLineOutRefAdvertiser adv = new PacketLineOutRefAdvertiser(pckOut); adv.setUseProtocolV2(true); if (req.getPeel()) { adv.setDerefTags(true); } Map<String, Ref> refsToSend; if (req.getRefPrefixes().isEmpty()) { refsToSend = getAdvertisedOrDefaultRefs(); } else { refsToSend = new HashMap<>(); String[] prefixes = req.getRefPrefixes().toArray(new String[0]); for (Ref ref : db.getRefDatabase().getRefsByPrefix(prefixes)) { refsToSend.put(ref.getName(), ref); } } if (req.getSymrefs()) { findSymrefs(adv, refsToSend); } adv.send(refsToSend); adv.end(); }
advertised = Collections.emptySet(); else advertised = refIdSet(getAdvertisedOrDefaultRefs().values());
advertised = Collections.emptySet(); } else { advertised = refIdSet(getAdvertisedOrDefaultRefs().values());
adv.advertiseCapability(OPTION_AGENT, UserAgent.get()); adv.setDerefTags(true); Map<String, Ref> advertisedOrDefaultRefs = getAdvertisedOrDefaultRefs(); findSymrefs(adv, advertisedOrDefaultRefs); advertised = adv.send(advertisedOrDefaultRefs);
Map<String, Ref> advertisedOrDefaultRefs = getAdvertisedOrDefaultRefs(); findSymrefs(adv, advertisedOrDefaultRefs); advertised = adv.send(advertisedOrDefaultRefs);