From cd5e3923a012a130194a1ca980c3ace98409fcc9 Mon Sep 17 00:00:00 2001 From: UNV Date: Mon, 1 Jun 2026 01:25:11 +0300 Subject: [PATCH 1/2] Fixing unstable GitConfig parsing: Ini.entrySet returns randomly ordered collection of entries, so in case of two remotes (origin, upstream) one time there would be (origin, upstream), another time (upstream, origin). And since remotes are compared as lists, permutations are assumed as non-equal and produce infinite loop of git log updates. Fixing by wrapping Ini with a sorted map (TreeMap). --- .../main/java/git4idea/repo/GitConfig.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/plugin/src/main/java/git4idea/repo/GitConfig.java b/plugin/src/main/java/git4idea/repo/GitConfig.java index 3cfd2ae..df59d59 100644 --- a/plugin/src/main/java/git4idea/repo/GitConfig.java +++ b/plugin/src/main/java/git4idea/repo/GitConfig.java @@ -25,7 +25,6 @@ import git4idea.branch.GitBranchUtil; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import org.ini4j.Ini; import org.ini4j.Profile; import java.io.File; @@ -58,7 +57,6 @@ public class GitConfig { @Nonnull private final Collection myTrackedInfos; - private GitConfig(@Nonnull Collection remotes, @Nonnull Collection urls, @Nonnull Collection trackedInfos) { myRemotes = remotes; myUrls = urls; @@ -81,10 +79,7 @@ Collection parseRemotes() { // populate GitRemotes with substituting urls when needed return ContainerUtil.map( myRemotes, - remote -> { - assert remote != null; - return convertRemoteToGitRemote(myUrls, remote); - } + remote -> convertRemoteToGitRemote(myUrls, Objects.requireNonNull(remote)) ); } @@ -134,14 +129,15 @@ static GitConfig read(@Nonnull File configFile) { return emptyConfig; } - Ini ini; + SortedMap ini; try { - ini = GitConfigHelper.loadIniFile(configFile); + ini = new TreeMap<>(GitConfigHelper.loadIniFile(configFile)); } catch (IOException e) { return emptyConfig; } + Pair, Collection> remotesAndUrls = parseRemotes(ini, GitConfig.class.getClassLoader()); Collection trackedInfos = parseTrackedInfos(ini, GitConfig.class.getClassLoader()); @@ -149,7 +145,10 @@ static GitConfig read(@Nonnull File configFile) { } @Nonnull - private static Collection parseTrackedInfos(@Nonnull Ini ini, @Nonnull ClassLoader classLoader) { + private static Collection parseTrackedInfos( + @Nonnull SortedMap ini, + @Nonnull ClassLoader classLoader + ) { Collection configs = new ArrayList<>(); for (Map.Entry stringSectionEntry : ini.entrySet()) { String sectionName = stringSectionEntry.getKey(); @@ -242,7 +241,10 @@ private static BranchConfig parseBranchSection(String sectionName, Profile.Secti } @Nonnull - private static Pair, Collection> parseRemotes(@Nonnull Ini ini, @Nonnull ClassLoader classLoader) { + private static Pair, Collection> parseRemotes( + @Nonnull SortedMap ini, + @Nonnull ClassLoader classLoader + ) { Collection remotes = new ArrayList<>(); Collection urls = new ArrayList<>(); for (Map.Entry stringSectionEntry : ini.entrySet()) { From 7e11972e133dd4b4fd698b5ffa04a8b80abece85 Mon Sep 17 00:00:00 2001 From: UNV Date: Mon, 1 Jun 2026 13:40:10 +0300 Subject: [PATCH 2/2] Fixing double blank line. --- plugin/src/main/java/git4idea/repo/GitConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/plugin/src/main/java/git4idea/repo/GitConfig.java b/plugin/src/main/java/git4idea/repo/GitConfig.java index df59d59..b8023d2 100644 --- a/plugin/src/main/java/git4idea/repo/GitConfig.java +++ b/plugin/src/main/java/git4idea/repo/GitConfig.java @@ -137,7 +137,6 @@ static GitConfig read(@Nonnull File configFile) { return emptyConfig; } - Pair, Collection> remotesAndUrls = parseRemotes(ini, GitConfig.class.getClassLoader()); Collection trackedInfos = parseTrackedInfos(ini, GitConfig.class.getClassLoader());