/* * Copyright (C) 2023, Thomas Wolf 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.storage.file; import java.io.File; import java.io.IOException; import java.util.List; import org.eclipse.jgit.annotations.NonNull; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.util.FS; /** * User (global) git config based on two possible locations, * {@code ~/.gitconfig} and {@code $XDG_CONFIG_HOME/git/config}. *

* For reading, both locations are considered, first the XDG file, then the file * in the home directory. All updates occur in the last file read that exists, * or in the home directory file if neither exists. In other words: if only the * XDG file exists, it is updated, otherwise the home directory file is updated. *

* * @since 6.7 */ public class UserConfigFile extends FileBasedConfig { private final FileBasedConfig parent; /** * Creates a new {@link UserConfigFile}. * * @param parent * parent {@link Config}; may be {@code null} * @param config * {@link File} for {@code ~/.gitconfig} * @param xdgConfig * {@link File} for {@code $XDG_CONFIG_HOME/.gitconfig} * @param fileSystem * {@link FS} to use for the two files; normally * {@link FS#DETECTED} */ public UserConfigFile(Config parent, @NonNull File config, @NonNull File xdgConfig, @NonNull FS fileSystem) { super(new FileBasedConfig(parent, xdgConfig, fileSystem), config, fileSystem); this.parent = (FileBasedConfig) getBaseConfig(); } @Override public void setStringList(String section, String subsection, String name, List values) { if (exists() || !parent.exists()) { super.setStringList(section, subsection, name, values); } else { parent.setStringList(section, subsection, name, values); } } @Override public void unset(String section, String subsection, String name) { if (exists() || !parent.exists()) { super.unset(section, subsection, name); } else { parent.unset(section, subsection, name); } } @Override public void unsetSection(String section, String subsection) { if (exists() || !parent.exists()) { super.unsetSection(section, subsection); } else { parent.unsetSection(section, subsection); } } @Override public boolean removeSection(String section, String subsection) { if (exists() || !parent.exists()) { return super.removeSection(section, subsection); } return parent.removeSection(section, subsection); } @Override public boolean isOutdated() { return super.isOutdated() || parent.isOutdated(); } @Override public void load() throws IOException, ConfigInvalidException { if (super.isOutdated()) { super.load(); } if (parent.isOutdated()) { parent.load(); } } @Override public void save() throws IOException { if (exists() || !parent.exists()) { if (exists() || !toText().strip().isEmpty()) { super.save(); } } else { parent.save(); } } }