google / google/go-github

How to ensure that a repository has been synced to the Github servers?

Abierto
#3,366 2 comentarios 2 reacciones 0 asignados Ver en GitHub
waiting for reply
Lenguaje dominante
Go
Estrellas
11.3k
Forks
2.5k
Merge medio
1 d 20 h
PR fusionados (30 d)
53

Descripción

The documentation for `RepositoriesService.Create` states that

> Also note that this method will return the response without actually
waiting for GitHub to finish creating the repository and letting the
changes propagate throughout its servers. You may set up a loop with
exponential back-off to verify repository's creation.

However, doing so does not seem to be sufficient to ensure that a new repository has been synced.

I'm trying to create a new repository and enable Github Advanced Security features after it. The `Update` request returns a 200 and the result also indicates a success (the updated fields contain the value "enabled" which is what I wanted to achieve). When validating the result on github.com the features are disabled.
When I tried to sleep for a couple of seconds after creating and before updating the repo, the result is also visible on github.com.

Here is my code to reproduce the issue:
```go
package main

import (
"context"
"fmt"
"time"

"github.com/google/go-github/v67/github"
log "github.com/sirupsen/logrus"
)

func main() {
org := "some-org"
name := "some-repo"
token := "some-token"

client := github.NewClient(nil).WithAuthToken(token)
_, _, err := client.Repositories.Create(context.Background(), org, &github.Repository{
Name: github.String(name),
AutoInit: github.Bool(true),
Visibility: github.String("internal"),
DefaultBranch: github.String("main"),
})
if err != nil {
log.WithError(err).Fatal("unable to create repository")
}
maxRetries := 5
for i := 0; i < maxRetries; i++ {
_, _, err := client.Repositories.Get(context.Background(), org, name)
if err == nil {
break
}
if i == maxRetries-1 {
log.Fatal("unable to verify repository creation")
}
time.Sleep(time.Duration(i*2) * time.Second)
}

// time.Sleep(5 * time.Second)

repo := github.Repository{
SecurityAndAnalysis: &github.SecurityAndAnalysis{
AdvancedSecurity: &github.AdvancedSecurity{
Status: github.String("enabled"),
},
SecretScanning: &github.SecretScanning{
Status: github.String("enabled"),
},
},
}
updatedRepo, _, err := client.Repositories.Edit(context.Background(), org, name, &repo)
if err != nil {
log.Fatal("unable to enable Advanced Security")
}
fmt.Printf("Advanced Security: %s\n", *updatedRepo.SecurityAndAnalysis.AdvancedSecurity.Status)
fmt.Printf("Secret Scanning: %s\n", *updatedRepo.SecurityAndAnalysis.SecretScanning.Status)
}
```
No matter if I sleep the 5 seconds or not, both run print
```
Advanced Security: enabled
Secret Scanning: enabled
```

github.com without sleeping

![Image](https://github.com/user-attachments/assets/085ee3d8-8d16-4d31-a569-691ae3134d73)

github.com with sleeping

![Image](https://github.com/user-attachments/assets/34862738-51c2-496f-8fec-4f640fe845a4)

Any idea how I can make sure that the repository is ready to enable Advanced Security features? (I'm not sure if other updates are affected as well)

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comience con las llamadas RepositoriesService.Create, Get y Edit mostradas en la reproducción y, a continuación, compare sus respuestas de API con el estado del repositorio en github.com. Determine si el cliente expone una comprobación fiable de disponibilidad para habilitar Advanced Security y Secret Scanning, y documente el comportamiento admitido o la limitación cuando el repositorio todavía se está propagando.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
github, go
Área
api, backend
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.