Skip to content

Commit 912f8ad

Browse files
coopernetesclaude
andcommitted
fix: respect NO_COLOR and GITPROXY_NO_EMOJI in all proxy output
ForwardingPostReceiveHook was using raw ANSI concatenation (CYAN +, GREEN +, RED +) instead of color(), so NO_COLOR had no effect on forwarding output. It and several servlet filters also called .emoji() directly instead of sym(), bypassing the GITPROXY_NO_EMOJI check entirely. Additionally, SymbolCodes.plain() was appending the Unicode text-variation selector (U+FE0E) which many terminals ignore, still rendering emoji. Replace with real ASCII fallbacks (!! ok ! x * ->) so no-emoji mode produces genuinely text-only output. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 5e6a282 commit 912f8ad

7 files changed

Lines changed: 42 additions & 31 deletions

File tree

jgit-proxy-core/src/main/java/org/finos/gitproxy/git/ForwardingPostReceiveHook.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import static org.finos.gitproxy.git.GitClientUtils.AnsiColor.*;
44
import static org.finos.gitproxy.git.GitClientUtils.SymbolCodes.*;
5+
import static org.finos.gitproxy.git.GitClientUtils.color;
6+
import static org.finos.gitproxy.git.GitClientUtils.sym;
57

68
import java.util.ArrayList;
79
import java.util.Collection;
@@ -50,8 +52,7 @@ public void onPostReceive(ReceivePack rp, Collection<ReceiveCommand> commands) {
5052
String upstreamUrl = repo.getConfig().getString("gitproxy", null, "upstreamUrl");
5153

5254
if (upstreamUrl == null) {
53-
rp.sendMessage(
54-
RED + "" + NO_ENTRY.emoji() + " ERROR - no upstream URL configured, cannot forward" + RESET);
55+
rp.sendMessage(color(RED, sym(NO_ENTRY) + " ERROR - no upstream URL configured, cannot forward"));
5556
log.error("No gitproxy.upstreamUrl in repo config for {}", repo.getDirectory());
5657
pushContext.addStep(PushStep.builder()
5758
.stepName("forward")
@@ -62,7 +63,7 @@ public void onPostReceive(ReceivePack rp, Collection<ReceiveCommand> commands) {
6263
return;
6364
}
6465

65-
rp.sendMessage(CYAN + "" + LINK.emoji() + " Forwarding to " + upstreamUrl + "..." + RESET);
66+
rp.sendMessage(color(CYAN, sym(LINK) + " Forwarding to " + upstreamUrl + "..."));
6667

6768
List<String> logs = new ArrayList<>();
6869
logs.add("Forwarding to " + upstreamUrl);
@@ -73,7 +74,7 @@ public void onPostReceive(ReceivePack rp, Collection<ReceiveCommand> commands) {
7374
URIish upstream = new URIish(upstreamUrl);
7475
forwardFailed = pushToUpstream(rp, repo, upstream, accepted, logs);
7576
} catch (Exception e) {
76-
rp.sendMessage(RED + "" + CROSS_MARK.emoji() + " ERROR forwarding to upstream: " + e.getMessage() + RESET);
77+
rp.sendMessage(color(RED, sym(CROSS_MARK) + " ERROR forwarding to upstream: " + e.getMessage()));
7778
log.error("Failed to push to upstream {}", upstreamUrl, e);
7879
logs.add("ERROR: " + e.getMessage());
7980
forwardFailed = true;
@@ -101,7 +102,7 @@ private boolean pushToUpstream(
101102

102103
List<RemoteRefUpdate> updates = buildRefUpdates(repo, commands);
103104

104-
rp.sendMessage(CYAN + " Pushing " + updates.size() + " ref(s) to upstream..." + RESET);
105+
rp.sendMessage(color(CYAN, " Pushing " + updates.size() + " ref(s) to upstream..."));
105106

106107
PushResult result = transport.push(NullProgressMonitor.INSTANCE, updates);
107108

@@ -113,21 +114,23 @@ private boolean pushToUpstream(
113114
case OK:
114115
case UP_TO_DATE:
115116
rp.sendMessage(
116-
GREEN + " " + HEAVY_CHECK_MARK.emoji() + " " + remoteName + " -> " + status + RESET);
117+
color(GREEN, " " + sym(HEAVY_CHECK_MARK) + " " + remoteName + " -> " + status));
117118
logs.add("PASS: " + remoteName + " -> " + status);
118119
break;
119120
default:
120121
String message = update.getMessage();
121-
rp.sendMessage(RED + " " + CROSS_MARK.emoji() + " " + remoteName + " -> " + status
122-
+ (message != null ? " (" + message + ")" : "") + RESET);
122+
rp.sendMessage(color(
123+
RED,
124+
" " + sym(CROSS_MARK) + " " + remoteName + " -> " + status
125+
+ (message != null ? " (" + message + ")" : "")));
123126
log.warn("Upstream push ref {} status: {} {}", remoteName, status, message);
124127
logs.add("FAIL: " + remoteName + " -> " + status
125128
+ (message != null ? " (" + message + ")" : ""));
126129
anyFailed = true;
127130
}
128131
}
129132

130-
rp.sendMessage(GREEN + "" + HEAVY_CHECK_MARK.emoji() + " Forwarding complete" + RESET);
133+
rp.sendMessage(color(GREEN, sym(HEAVY_CHECK_MARK) + " Forwarding complete"));
131134
}
132135
return anyFailed;
133136
}

jgit-proxy-core/src/main/java/org/finos/gitproxy/git/GitClientUtils.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,34 +49,37 @@ public String toString() {
4949
public enum SymbolCodes {
5050
// https://codepoints.net/U+26D4
5151
// https://emojipedia.org/no-entry#technical
52-
NO_ENTRY("\u26D4"),
52+
NO_ENTRY("\u26D4", "!!"),
5353

5454
// https://codepoints.net/U+2705
5555
// https://emojipedia.org/check-mark-button#technical
56-
HEAVY_CHECK_MARK("\u2705"),
56+
HEAVY_CHECK_MARK("\u2705", "ok"),
5757

5858
// https://codepoints.net/U+26A0
5959
// https://emojipedia.org/warning#technical
60-
WARNING("\u26A0"),
60+
WARNING("\u26A0", "!"),
6161

6262
// https://codepoints.net/U+274C
6363
// https://emojipedia.org/cross-mark#technical
64-
CROSS_MARK("\u274C"),
64+
CROSS_MARK("\u274C", "x"),
6565

6666
// Created using codepoints & the Character class due to the point values
6767
// falling outside the Unicode planes' range supported by Java's \\u escape
6868
// sequence syntax in Strings
6969

7070
// https://codepoints.net/U+1F511
7171
// https://emojipedia.org/key#technical
72-
KEY(Character.toString(0x1F511)),
72+
KEY(Character.toString(0x1F511), "*"),
7373

7474
// https://codepoints.net/U+1F517
7575
// https://emojipedia.org/link#technical
76-
LINK(Character.toString(0x1F517));
76+
LINK(Character.toString(0x1F517), "->");
7777

7878
private final String value;
7979

80+
/** ASCII fallback used when {@code GITPROXY_NO_EMOJI} is set. */
81+
private final String text;
82+
8083
/**
8184
* Returns the emoji representation of the symbol by appending the Unicode variation selector character. This is
8285
* used to ensure that the symbol is displayed as an emoji in clients that support it.
@@ -88,13 +91,13 @@ public String emoji() {
8891
}
8992

9093
/**
91-
* Returns the plain text representation of the symbol by appending the Unicode variation selector character.
92-
* This is used to ensure that the symbol is displayed as plain text in clients that don't support emojis.
94+
* Returns the plain ASCII text representation of the symbol. Used when {@code GITPROXY_NO_EMOJI} is set to
95+
* avoid terminals that ignore the Unicode text-variation selector (U+FE0E) still rendering emoji.
9396
*
9497
* @return the plain text representation of the symbol
9598
*/
9699
public String plain() {
97-
return value + "\uFE0E";
100+
return text;
98101
}
99102

100103
@Override

jgit-proxy-core/src/main/java/org/finos/gitproxy/servlet/filter/CheckEmptyBranchFilter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.finos.gitproxy.git.GitClientUtils.AnsiColor.*;
44
import static org.finos.gitproxy.git.GitClientUtils.SymbolCodes.*;
5+
import static org.finos.gitproxy.git.GitClientUtils.sym;
56
import static org.finos.gitproxy.servlet.GitProxyServlet.GIT_REQUEST_ATTR;
67

78
import jakarta.servlet.http.HttpServletRequest;
@@ -61,10 +62,10 @@ public void doHttpFilter(HttpServletRequest request, HttpServletResponse respons
6162
String title;
6263
String message;
6364
if (isNewBranch) {
64-
title = NO_ENTRY.emoji() + " Push Blocked — Empty Branch";
65+
title = sym(NO_ENTRY) + " Push Blocked — Empty Branch";
6566
message = "Please make a commit before pushing a new branch.";
6667
} else {
67-
title = NO_ENTRY.emoji() + " Push Blocked — Commit Data Not Found";
68+
title = sym(NO_ENTRY) + " Push Blocked — Commit Data Not Found";
6869
message = "Commit data not found. Please contact an administrator for support.";
6970
}
7071

jgit-proxy-core/src/main/java/org/finos/gitproxy/servlet/filter/CheckHiddenCommitsFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.finos.gitproxy.git.GitClientUtils.AnsiColor.*;
44
import static org.finos.gitproxy.git.GitClientUtils.SymbolCodes.*;
5+
import static org.finos.gitproxy.git.GitClientUtils.sym;
56
import static org.finos.gitproxy.servlet.GitProxyServlet.GIT_REQUEST_ATTR;
67

78
import jakarta.servlet.http.HttpServletRequest;
@@ -95,7 +96,7 @@ public void doHttpFilter(HttpServletRequest request, HttpServletResponse respons
9596

9697
log.warn("checkHiddenCommits: {} hidden commit(s) detected: {}", hidden.size(), hidden);
9798

98-
String title = NO_ENTRY.emoji() + " Push Blocked — Hidden Commits Detected";
99+
String title = sym(NO_ENTRY) + " Push Blocked — Hidden Commits Detected";
99100
String message = "Unreferenced commits in pack (" + hidden.size() + "): "
100101
+ String.join(", ", hidden) + ".\n\n"
101102
+ "This usually happens when a branch was made from a commit that hasn't been approved"

jgit-proxy-core/src/main/java/org/finos/gitproxy/servlet/filter/CheckUserPushPermissionFilter.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.finos.gitproxy.git.GitClientUtils.AnsiColor.*;
44
import static org.finos.gitproxy.git.GitClientUtils.SymbolCodes.*;
5+
import static org.finos.gitproxy.git.GitClientUtils.sym;
56
import static org.finos.gitproxy.servlet.GitProxyServlet.GIT_REQUEST_ATTR;
67

78
import jakarta.servlet.http.HttpServletRequest;
@@ -66,7 +67,7 @@ public void doHttpFilter(HttpServletRequest request, HttpServletResponse respons
6667

6768
if (userEmail == null || userEmail.isEmpty()) {
6869
log.warn("User email not found in commit author");
69-
String title = NO_ENTRY.emoji() + " Push Blocked — Unknown User";
70+
String title = sym(NO_ENTRY) + " Push Blocked — Unknown User";
7071
String message = "Could not identify the pushing user.\n" + "\n" + "Contact an administrator for support.";
7172
rejectAndSendError(request, response, "User not found", GitClientUtils.format(title, message, RED, null));
7273
return;
@@ -75,8 +76,8 @@ public void doHttpFilter(HttpServletRequest request, HttpServletResponse respons
7576
// Check if user exists
7677
if (!userAuthorizationService.userExists(userEmail)) {
7778
log.warn("User {} does not exist in the system", userEmail);
78-
String title = NO_ENTRY.emoji() + " Push Blocked — User Not Registered";
79-
String message = CROSS_MARK.emoji() + " " + userEmail + " is not registered.\n"
79+
String title = sym(NO_ENTRY) + " Push Blocked — User Not Registered";
80+
String message = sym(CROSS_MARK) + " " + userEmail + " is not registered.\n"
8081
+ "\n"
8182
+ "Contact an administrator for support.";
8283
rejectAndSendError(
@@ -92,9 +93,9 @@ public void doHttpFilter(HttpServletRequest request, HttpServletResponse respons
9293

9394
if (!isAuthorized) {
9495
log.warn("User {} is not authorized to push to repository {}", userEmail, repositoryUrl);
95-
String title = NO_ENTRY.emoji() + " Push Blocked — Unauthorized";
96-
String message = CROSS_MARK.emoji() + " " + userEmail + " is not allowed to push to:\n" + " "
97-
+ LINK.emoji() + " " + repositoryUrl;
96+
String title = sym(NO_ENTRY) + " Push Blocked — Unauthorized";
97+
String message = sym(CROSS_MARK) + " " + userEmail + " is not allowed to push to:\n" + " " + sym(LINK)
98+
+ " " + repositoryUrl;
9899
rejectAndSendError(
99100
request, response, "User not authorized", GitClientUtils.format(title, message, RED, null));
100101
return;

jgit-proxy-core/src/main/java/org/finos/gitproxy/servlet/filter/ScanDiffFilter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.finos.gitproxy.git.GitClientUtils.AnsiColor.*;
44
import static org.finos.gitproxy.git.GitClientUtils.SymbolCodes.*;
5+
import static org.finos.gitproxy.git.GitClientUtils.sym;
56
import static org.finos.gitproxy.servlet.GitProxyServlet.GIT_REQUEST_ATTR;
67

78
import jakarta.servlet.http.HttpServletRequest;
@@ -93,9 +94,9 @@ public void doHttpFilter(HttpServletRequest request, HttpServletResponse respons
9394

9495
if (!violations.isEmpty()) {
9596
log.warn("Diff scan found {} violation(s)", violations.size());
96-
String title = NO_ENTRY.emoji() + " Push Blocked — Diff Contains Blocked Content";
97+
String title = sym(NO_ENTRY) + " Push Blocked — Diff Contains Blocked Content";
9798
String violationList = violations.stream()
98-
.map(v -> CROSS_MARK.emoji() + " " + v.reason())
99+
.map(v -> sym(CROSS_MARK) + " " + v.reason())
99100
.collect(Collectors.joining("\n"));
100101
String message = "Diff content contains blocked patterns:\n\n" + violationList;
101102
recordIssue(request, "Diff contains blocked content", GitClientUtils.format(title, message, RED, null));

jgit-proxy-core/src/main/java/org/finos/gitproxy/servlet/filter/WhitelistAggregateFilter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.finos.gitproxy.servlet.filter;
22

3+
import static org.finos.gitproxy.git.GitClientUtils.SymbolCodes.*;
4+
import static org.finos.gitproxy.git.GitClientUtils.sym;
35
import static org.finos.gitproxy.servlet.filter.WhitelistByUrlFilter.WHITELISTED_BY_ATTRIBUTE;
46

57
import jakarta.servlet.http.HttpServletRequest;
@@ -85,8 +87,7 @@ public void doHttpFilter(HttpServletRequest request, HttpServletResponse respons
8587
} else {
8688
var operation = determineOperation(request);
8789
String action = operation == HttpOperation.PUSH ? "Push" : "Fetch";
88-
String title =
89-
GitClientUtils.SymbolCodes.NO_ENTRY.emoji() + " " + action + " Blocked — Repository Not Allowed";
90+
String title = sym(NO_ENTRY) + " " + action + " Blocked — Repository Not Allowed";
9091
String verb = operation == HttpOperation.PUSH ? "Pushes to" : "Fetches from";
9192
String message = verb + " this repository are not permitted.\n"
9293
+ "\n"

0 commit comments

Comments
 (0)