| /* |
| * Copyright (C) 2022 Thomas Wolf <thomas.wolf@paranor.ch> and others |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Distribution License v. 1.0 which is available at |
| * https://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| package org.eclipse.jgit.transport; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| |
| import org.eclipse.jgit.lib.Config; |
| |
| /** |
| * Support for URL translations via git configs {@code url.<base>.insteadOf} and |
| * {@code url.<base>.pushInsteadOf}. |
| * |
| * @since 6.2 |
| */ |
| public class UrlConfig { |
| |
| private static final String KEY_INSTEADOF = "insteadof"; //$NON-NLS-1$ |
| |
| private static final String KEY_PUSHINSTEADOF = "pushinsteadof"; //$NON-NLS-1$ |
| |
| private static final String SECTION_URL = "url"; //$NON-NLS-1$ |
| |
| private final Config config; |
| |
| private Map<String, String> insteadOf; |
| |
| private Map<String, String> pushInsteadOf; |
| |
| /** |
| * Creates a new {@link UrlConfig} instance. |
| * |
| * @param config |
| * {@link Config} to read values from |
| */ |
| public UrlConfig(Config config) { |
| this.config = config; |
| } |
| |
| /** |
| * Performs replacements as defined by git config |
| * {@code url.<base>.insteadOf}. If there is no match, the input is returned |
| * unchanged. |
| * |
| * @param url |
| * to substitute |
| * @return the {@code url} with substitution applied |
| */ |
| public String replace(String url) { |
| if (insteadOf == null) { |
| insteadOf = load(KEY_INSTEADOF); |
| } |
| return replace(url, insteadOf); |
| } |
| |
| /** |
| * Tells whether there are push replacements. |
| * |
| * @return {@code true} if there are push replacements, {@code false} |
| * otherwise |
| */ |
| public boolean hasPushReplacements() { |
| if (pushInsteadOf == null) { |
| pushInsteadOf = load(KEY_PUSHINSTEADOF); |
| } |
| return !pushInsteadOf.isEmpty(); |
| } |
| |
| /** |
| * Performs replacements as defined by git config |
| * {@code url.<base>.pushInsteadOf}. If there is no match, the input is |
| * returned unchanged. |
| * |
| * @param url |
| * to substitute |
| * @return the {@code url} with substitution applied |
| */ |
| public String replacePush(String url) { |
| if (pushInsteadOf == null) { |
| pushInsteadOf = load(KEY_PUSHINSTEADOF); |
| } |
| return replace(url, pushInsteadOf); |
| } |
| |
| private Map<String, String> load(String key) { |
| Map<String, String> replacements = new HashMap<>(); |
| for (String url : config.getSubsections(SECTION_URL)) { |
| for (String prefix : config.getStringList(SECTION_URL, url, key)) { |
| replacements.put(prefix, url); |
| } |
| } |
| return replacements; |
| } |
| |
| private String replace(String uri, Map<String, String> replacements) { |
| Entry<String, String> match = null; |
| for (Entry<String, String> replacement : replacements.entrySet()) { |
| // Ignore current entry if not longer than previous match |
| if (match != null && match.getKey().length() > replacement.getKey() |
| .length()) { |
| continue; |
| } |
| if (uri.startsWith(replacement.getKey())) { |
| match = replacement; |
| } |
| } |
| if (match != null) { |
| return match.getValue() + uri.substring(match.getKey().length()); |
| } |
| return uri; |
| } |
| } |