Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/detect-spam.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
uses: actions/checkout@v6
- name: Run spam detection
env:
GH_TOKEN: ${{ secrets.AUTOMATION_TOKEN }}
GH_TOKEN: ${{ github.token }}
ISSUE_URL: ${{ github.event.issue.html_url }}
run: |
./.github/workflows/scripts/spam-detection/process-issue.sh "$ISSUE_URL"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/issueauto.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
- name: label incoming issue
env:
GH_REPO: ${{ github.repository }}
GH_TOKEN: ${{ secrets.AUTOMATION_TOKEN }}
GH_TOKEN: ${{ github.token }}
ISSUENUM: ${{ github.event.issue.number }}
ISSUEAUTHOR: ${{ github.event.issue.user.login }}
run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/prauto.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- name: lint pr
env:
GH_REPO: ${{ github.repository }}
GH_TOKEN: ${{ secrets.AUTOMATION_TOKEN }}
GH_TOKEN: ${{ github.token }}
PRBODY: ${{ github.event.pull_request.body }}
PRNUM: ${{ github.event.pull_request.number }}
PRHEAD: ${{ github.event.pull_request.head.label }}
Expand Down
4 changes: 0 additions & 4 deletions .jules/sentinel.md

This file was deleted.

6 changes: 3 additions & 3 deletions internal/zip/zip.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import (
)

const (
dirMode os.FileMode = 0700
fileMode os.FileMode = 0600
execMode os.FileMode = 0700
dirMode os.FileMode = 0755
fileMode os.FileMode = 0644
execMode os.FileMode = 0755
)

// ExtractZip extracts the contents of a zip archive to destDir.
Expand Down
8 changes: 3 additions & 5 deletions pkg/cmd/copilot/copilot.go
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ func downloadCopilot(httpClient *http.Client, ios *iostreams.IOStreams, installD
return "", fmt.Errorf("failed to seek temp file: %w", err)
}

if err := os.MkdirAll(installDir, 0700); err != nil {
if err := os.MkdirAll(installDir, 0755); err != nil {
return "", fmt.Errorf("failed to create install directory: %w", err)
}

Expand Down Expand Up @@ -414,12 +414,10 @@ func extractTarGz(r io.Reader, destDir string) error {
target := absFilePath.String()

if header.Typeflag == tar.TypeReg {
if err := os.MkdirAll(filepath.Dir(target), 0700); err != nil {
if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil {
return fmt.Errorf("failed to create parent directory: %w", err)
}
// Tighten binary permissions to user-only.
mode := os.FileMode(header.Mode) & 0700
if err := extractFile(target, mode, tr); err != nil {
if err := extractFile(target, os.FileMode(header.Mode)&0777, tr); err != nil {
return err
}
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/cmd/extension/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func downloadAsset(httpClient *http.Client, asset releaseAsset, destPath string)
}

var f *os.File
if f, downloadErr = os.OpenFile(destPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0700); downloadErr != nil {
if f, downloadErr = os.OpenFile(destPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755); downloadErr != nil {
return
}
defer func() {
Expand Down
6 changes: 3 additions & 3 deletions pkg/cmd/extension/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ func (m *Manager) InstallLocal(dir string) error {
}
targetLink := filepath.Join(m.installDir(), name)

if err := os.MkdirAll(filepath.Dir(targetLink), 0700); err != nil {
if err := os.MkdirAll(filepath.Dir(targetLink), 0755); err != nil {
return err
}
if err := makeSymlink(dir, targetLink); err != nil {
Expand Down Expand Up @@ -339,7 +339,7 @@ func (m *Manager) installBin(repo ghrepo.Interface, target string) error {
}

targetDir := filepath.Join(m.installDir(), name)
if err = os.MkdirAll(targetDir, 0700); err != nil {
if err = os.MkdirAll(targetDir, 0755); err != nil {
return fmt.Errorf("failed to create installation directory: %w", err)
}

Expand Down Expand Up @@ -721,7 +721,7 @@ func isSymlink(m os.FileMode) bool {

func writeFile(p string, contents []byte, mode os.FileMode) error {
if dir := filepath.Dir(p); dir != "." {
if err := os.MkdirAll(dir, 0700); err != nil {
if err := os.MkdirAll(dir, 0755); err != nil {
return err
}
}
Expand Down
148 changes: 88 additions & 60 deletions pkg/jsoncolor/jsoncolor.go
Original file line number Diff line number Diff line change
@@ -1,37 +1,41 @@
package jsoncolor

import (
"bufio"
"bytes"
"encoding/json"
"io"
)

const (
colorDelim = "1;38" // bright white
colorKey = "1;34" // bright blue
colorNull = "36" // cyan
colorString = "32" // green
colorBool = "33" // yellow
var (
colorDelimEsc = []byte("\x1b[1;38m")
colorKeyEsc = []byte("\x1b[1;34m")
colorNullEsc = []byte("\x1b[36m")
colorStringEsc = []byte("\x1b[32m")
colorBoolEsc = []byte("\x1b[33m")
escReset = []byte("\x1b[m")
)

var (
escPrefix = []byte("\x1b[")
escSuffix = []byte("m")
escReset = []byte("\x1b[m")
byteColon = []byte(":")
byteComma = []byte(",")
byteSpace = []byte(" ")
byteNewline = []byte("\n")
byteTrue = []byte("true")
byteFalse = []byte("false")
byteNull = []byte("null")
byteLBrace = []byte("{")
byteRBrace = []byte("}")
byteLBracket = []byte("[")
byteRBracket = []byte("]")
)

type JsonWriter interface {
Preface() []json.Delim
}

func writeColor(w io.Writer, color string, value []byte) error {
if _, err := w.Write(escPrefix); err != nil {
return err
}
if _, err := io.WriteString(w, color); err != nil {
return err
}
if _, err := w.Write(escSuffix); err != nil {
func writeColor(w io.Writer, colorEsc []byte, value []byte) error {
if _, err := w.Write(colorEsc); err != nil {
return err
}
if _, err := w.Write(value); err != nil {
Expand All @@ -42,6 +46,9 @@ func writeColor(w io.Writer, color string, value []byte) error {
}

func writeIndent(w io.Writer, indent string, level int) error {
if level <= 0 {
return nil
}
for i := 0; i < level; i++ {
if _, err := io.WriteString(w, indent); err != nil {
return err
Expand All @@ -54,6 +61,9 @@ func writeIndent(w io.Writer, indent string, level int) error {
// Optimized to reduce allocations by avoiding fmt.Fprintf and strings.Repeat.
// Benchmark results show ~33% improvement in execution time and ~12% reduction in memory usage.
func Write(w io.Writer, r io.Reader, indent string) error {
bw := bufio.NewWriter(w)
defer bw.Flush()

dec := json.NewDecoder(r)
dec.UseNumber()

Expand All @@ -64,6 +74,10 @@ func Write(w io.Writer, r io.Reader, indent string) error {
stack = append(stack, jsonWriter.Preface()...)
}

var buf bytes.Buffer
enc := json.NewEncoder(&buf)
enc.SetEscapeHTML(false)

for {
t, err := dec.Token()
if err == io.EOF {
Expand All @@ -79,64 +93,93 @@ func Write(w io.Writer, r io.Reader, indent string) error {
case '{', '[':
stack = append(stack, tt)
idx = 0
if err := writeColor(w, colorDelim, []byte{byte(tt)}); err != nil {
var b []byte
if tt == '{' {
b = byteLBrace
} else {
b = byteLBracket
}
if err := writeColor(bw, colorDelimEsc, b); err != nil {
return err
}
if dec.More() {
if _, err := w.Write([]byte{'\n'}); err != nil {
if _, err := bw.Write(byteNewline); err != nil {
return err
}
if err := writeIndent(w, indent, len(stack)); err != nil {
if err := writeIndent(bw, indent, len(stack)); err != nil {
return err
}
}
continue
case '}', ']':
stack = stack[:len(stack)-1]
idx = 0
if err := writeColor(w, colorDelim, []byte{byte(tt)}); err != nil {
var b []byte
if tt == '}' {
b = byteRBrace
} else {
b = byteRBracket
}
if err := writeColor(bw, colorDelimEsc, b); err != nil {
return err
}
}
default:
b, err := marshalJSON(tt)
if err != nil {
return err
}

isKey := len(stack) > 0 && stack[len(stack)-1] == '{' && idx%2 == 0
idx++

var color string
var colorEsc []byte
var b []byte

if isKey {
color = colorKey
colorEsc = colorKeyEsc
} else if tt == nil {
color = colorNull
colorEsc = colorNullEsc
b = byteNull
} else {
switch t.(type) {
switch v := tt.(type) {
case string:
color = colorString
colorEsc = colorStringEsc
case bool:
color = colorBool
colorEsc = colorBoolEsc
if v {
b = byteTrue
} else {
b = byteFalse
}
case json.Number:
b = []byte(v.String())
}
}

if color == "" {
if _, err := w.Write(b); err != nil {
if b == nil {
buf.Reset()
if err := enc.Encode(tt); err != nil {
return err
}
b = buf.Bytes()
// omit trailing newline added by json.Encoder
if len(b) > 0 && b[len(b)-1] == '\n' {
b = b[:len(b)-1]
}
}

if colorEsc == nil {
if _, err := bw.Write(b); err != nil {
return err
}
} else {
if err := writeColor(w, color, b); err != nil {
if err := writeColor(bw, colorEsc, b); err != nil {
return err
}
}

if isKey {
// \x1b[1;38m:\x1b[m
if err := writeColor(w, colorDelim, []byte{':'}); err != nil {
if err := writeColor(bw, colorDelimEsc, byteColon); err != nil {
return err
}
if _, err := w.Write([]byte{' '}); err != nil {
if _, err := bw.Write(byteSpace); err != nil {
return err
}
continue
Expand All @@ -145,24 +188,24 @@ func Write(w io.Writer, r io.Reader, indent string) error {

if dec.More() {
// \x1b[1;38m,\x1b[m\n
if err := writeColor(w, colorDelim, []byte{','}); err != nil {
if err := writeColor(bw, colorDelimEsc, byteComma); err != nil {
return err
}
if _, err := w.Write([]byte{'\n'}); err != nil {
if _, err := bw.Write(byteNewline); err != nil {
return err
}
if err := writeIndent(w, indent, len(stack)); err != nil {
if err := writeIndent(bw, indent, len(stack)); err != nil {
return err
}
} else if len(stack) > 0 {
if _, err := w.Write([]byte{'\n'}); err != nil {
if _, err := bw.Write(byteNewline); err != nil {
return err
}
if err := writeIndent(w, indent, len(stack)-1); err != nil {
if err := writeIndent(bw, indent, len(stack)-1); err != nil {
return err
}
} else {
if _, err := w.Write([]byte{'\n'}); err != nil {
if _, err := bw.Write(byteNewline); err != nil {
return err
}
}
Expand All @@ -179,27 +222,12 @@ func WriteDelims(w io.Writer, delims, indent string) error {
stack = jaw.Preface()
}

if err := writeColor(w, colorDelim, []byte(delims)); err != nil {
if err := writeColor(w, colorDelimEsc, []byte(delims)); err != nil {
return err
}
if _, err := w.Write([]byte{'\n'}); err != nil {
if _, err := w.Write(byteNewline); err != nil {
return err
}
return writeIndent(w, indent, len(stack))
}

// marshalJSON works like json.Marshal but with HTML-escaping disabled
func marshalJSON(v interface{}) ([]byte, error) {
buf := bytes.Buffer{}
enc := json.NewEncoder(&buf)
enc.SetEscapeHTML(false)
if err := enc.Encode(v); err != nil {
return nil, err
}
bb := buf.Bytes()
// omit trailing newline added by json.Encoder
if len(bb) > 0 && bb[len(bb)-1] == '\n' {
return bb[:len(bb)-1], nil
}
return bb, nil
}
Loading