Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

create_or_update_file writes to the wrong file when the path contains # or ?

Aberta Para iniciantes
#3,427 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 4 dias

@jayhemnani9910 já está trabalhando nisso.

Desde 6/10/2026.

  • #3429 de @jayhemnani9910 — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
84/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
go
Domínio
api

Direção de pesquisa

Comece em pkg/github/repositories.go em CreateOrUpdateFile (v1.14.0 / 71ef8266), onde a chamada CreateFile passa path sem escape, e leia escapeGitTreeish como o padrão existente de escape por segmento. Compare com as verificações de existência e symlink baseadas em GetContents, que já escapam corretamente. O resultado esperado é PUT /repos/{owner}/{repo}/contents/docs/C%23/intro.md em um servidor mock, além de um teste de regressão (estenda o arquivo de testes repositories existente) que garanta que os caminhos # e ? sejam gravados no arquivo correto.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Describe the bug

create_or_update_file with path: "docs/C#/intro.md" commits the content to a file named docs/C and reports success. A ? does the same (notes/what?.md is written as notes/what).

The path goes into the request URL unescaped: go-github's RepositoriesService.CreateFile builds repos/{owner}/{repo}/contents/{path} with no escaping, so everything from # on becomes a URL fragment and everything from ? on becomes a query string. The checks that run first (the existing-file / SHA lookup and the symlink check) go through GetContents, which does escape the path, so they look at the right file while the write goes to another.

Affected version

v1.14.0 and main at 71ef8266 (pkg/github/repositories.go, the CreateFile call in CreateOrUpdateFile).

Steps to reproduce the behavior
  1. Call create_or_update_file on a test repository:
    {"owner":"<you>","repo":"<test repo>","path":"docs/C#/intro.md","content":"# Intro","message":"Add intro","branch":"main"}
    
  2. Look at the commit.
Expected vs actual behavior

Expected: a file at docs/C#/intro.md (the request goes to PUT /repos/<you>/<test repo>/contents/docs/C%23/intro.md).

Actual: the request goes to PUT /repos/<you>/<test repo>/contents/docs/C, the commit creates a file named docs/C, and the tool result reports success with "path": "docs/C". If docs/C already exists as a file, it is overwritten.

Logs

Request seen by a mock server for the call above:

GET  /repos/owner/repo/contents/docs/C%23/intro.md   -> 404 (existence check, escaped)
PUT  /repos/owner/repo/contents/docs/C               (the write, unescaped)

I have a small fix with a regression test ready and can open a PR: escape each path segment before calling CreateFile, the same way escapeGitTreeish already does for tree lookups.

Linguagem predominante
Go
Estrelas
33.4k
Forks
5.1k
Merge médio
2d 9h
PRs com merge (30d)
34

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de github/github-mcp-server

Todas as issues de github/github-mcp-server

Issues semelhantes

Mais issues de Go

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.