UrlsAndPushUrls (@NotNull Collection<? extends Url> urlSections, @NotNull Remote remote) { List<String> urls = new ArrayList<>(remote.getUrls().size()); Collection<String> pushUrls = new ArrayList<>(); // urls are substituted by insteadOf // if there are no pushUrls, we create a pushUrl for pushInsteadOf substitutions for (final String remoteUrl : remote.getUrls()) { boolean substituted = false; for (Url url : urlSections) { String insteadOf = url.getInsteadOf(); String pushInsteadOf = url.getPushInsteadOf(); // null means no entry, i.e. nothing to substitute. Empty string means substituting everything if (insteadOf != null && remoteUrl.startsWith(insteadOf)) { urls.add(substituteUrl(remoteUrl, url, insteadOf)); substituted = true; break; } else if (pushInsteadOf != null && remoteUrl.startsWith(pushInsteadOf)) { if (remote.getPushUrls().isEmpty()) { // only if there are no explicit pushUrls pushUrls.add(substituteUrl(remoteUrl, url, pushInsteadOf)); // pushUrl is different } urls.add(remoteUrl); // but url is left intact substituted = true; break; } } if (!substituted) { urls.add(remoteUrl); } } // pushUrls are substituted only by insteadOf, not by pushInsteadOf for (final String remotePushUrl : remote.getPushUrls()) { boolean substituted = false; for (Url url : urlSections) { String insteadOf = url.getInsteadOf(); // null means no entry, i.e. nothing to substitute. Empty string means substituting everything if (insteadOf != null && remotePushUrl.startsWith(insteadOf)) { pushUrls.add(substituteUrl(remotePushUrl, url, insteadOf)); substituted = true; break; } } if (!substituted) { pushUrls.add(remotePushUrl); } } // if no pushUrls are explicitly defined yet via pushUrl or url.<base>.pushInsteadOf, they are the same as urls. if (pushUrls.isEmpty()) { pushUrls = new ArrayList<>(urls); } return new UrlsAndPushUrls(urls, pushUrls); }