diff --git a/repositories.go b/repositories.go index c21a714..a99f17d 100644 --- a/repositories.go +++ b/repositories.go @@ -60,6 +60,13 @@ func declareAPIAuthRepositoriesRoutes(router *gin.RouterGroup) { for _, r := range repositories { if r.IdWork == work.(*Work).Id { + // Is the URL used elsewhere? + repos, _ := getRepositoriesByURI(r.URI) + log.Println(repos) + if len(repos) > 1 { + r.AlreadyUsed = true + } + res = append(res, r) } } @@ -114,6 +121,13 @@ func declareAPIAuthRepositoriesRoutes(router *gin.RouterGroup) { repositoriesRoutes.GET("", func(c *gin.Context) { repo := c.MustGet("repository").(*Repository) + // Is the URL used elsewhere? + repos, _ := getRepositoriesByURI(repo.URI) + log.Println(repos) + if len(repos) > 1 { + repo.AlreadyUsed = true + } + c.JSON(http.StatusOK, repo) }) repositoriesRoutes.PUT("", func(c *gin.Context) { @@ -264,7 +278,7 @@ func declareCallbacksRoutes(router *gin.RouterGroup) { router.POST("/callbacks/trigger.json", func(c *gin.Context) { // Check event type if c.Request.Header.Get("X-Gitlab-Event") != "Tag Push Hook" { - c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": "This trigger is limited to Tag Push event. Please edit your trigger."}) + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": "This trigger is limited to Tag Push event. Please edit your trigger on GitLab."}) return } @@ -284,7 +298,6 @@ func declareCallbacksRoutes(router *gin.RouterGroup) { var repo *Repository for _, r := range repos { - log.Println("Received trigger") if len(r.Secret) == 0 || base64.StdEncoding.EncodeToString(r.Secret) == c.Request.Header.Get("X-Gitlab-Token") { repo = r break @@ -319,8 +332,27 @@ func declareCallbacksRoutes(router *gin.RouterGroup) { } if !strings.HasPrefix(tmp[2], work.Tag) { - c.AbortWithStatusJSON(http.StatusOK, gin.H{"errmsg": fmt.Sprintf("Ignore ref %q has it doesn't start with %s. Check submission instructions if this is not expected.", tmp[2], work.Tag)}) - return + // Allow to use a secret for another tag + if len(repos) > 1 { + for _, r := range repos { + w, err := getWork(int(r.IdWork)) + if err != nil { + log.Println("Unable to getWork:", err.Error()) + continue + } + + if strings.HasPrefix(tmp[2], w.Tag) { + repo = r + work = w + break + } + } + } + + if !strings.HasPrefix(tmp[2], work.Tag) { + c.AbortWithStatusJSON(http.StatusOK, gin.H{"errmsg": fmt.Sprintf("Ignore ref %q has it doesn't start with %s. Check submission instructions if this is not expected.", tmp[2], work.Tag)}) + return + } } TriggerTagUpdate(c, work, repo, user, &tmp[2]) @@ -399,13 +431,14 @@ func TriggerTagUpdate(c *gin.Context, work *Work, repo *Repository, u *User, tag } type Repository struct { - Id int64 `json:"id"` - IdUser int64 `json:"id_user"` - IdWork int64 `json:"id_work"` - URI string `json:"uri"` - Secret []byte `json:"secret,omitempty"` - LastCheck *time.Time `json:"last_check"` - DroneRef string `json:"drone_ref,omitempty"` + Id int64 `json:"id"` + IdUser int64 `json:"id_user"` + IdWork int64 `json:"id_work"` + URI string `json:"uri"` + Secret []byte `json:"secret,omitempty"` + LastCheck *time.Time `json:"last_check"` + DroneRef string `json:"drone_ref,omitempty"` + AlreadyUsed bool `json:"already_used,omitempty"` } func (u *User) GetRepositories() (repositories []*Repository, err error) { @@ -474,7 +507,7 @@ func (u *User) NewRepository(w *Work, uri string) (*Repository, error) { } else if rid, err := res.LastInsertId(); err != nil { return nil, err } else { - return &Repository{rid, u.Id, w.Id, uri, secret, nil, ""}, nil + return &Repository{rid, u.Id, w.Id, uri, secret, nil, "", false}, nil } } diff --git a/ui/src/components/WorkRepository.svelte b/ui/src/components/WorkRepository.svelte index f10fa91..85a4e98 100644 --- a/ui/src/components/WorkRepository.svelte +++ b/ui/src/components/WorkRepository.svelte @@ -20,6 +20,7 @@ let remote_repos = []; let repo_pull_state = null; let show_logs = null; + export let already_used = false; function updatePullState(repo) { repo_pull_state = repo.getBuildState(); @@ -45,9 +46,11 @@ } repo_work.then((repos) => { repo_used = repos[0]; + already_used = repos[0].already_used == true; updatePullState(repos[0]) }, () => { repo_used = new WorkRepository({id_work: work.id}); + already_used = false; remote_repos = getRemoteRepositories(user?user.id:null); }); } diff --git a/ui/src/lib/repositories.js b/ui/src/lib/repositories.js index a3cc7c0..2d75d6c 100644 --- a/ui/src/lib/repositories.js +++ b/ui/src/lib/repositories.js @@ -5,13 +5,14 @@ export class WorkRepository { } } - update({ id, id_user, id_work, uri, secret, last_check }) { + update({ id, id_user, id_work, uri, secret, last_check, already_used }) { this.id = id; this.id_user = id_user; this.id_work = id_work; this.uri = uri; this.secret = secret; this.last_check = last_check; + this.already_used = already_used == true; } async delete() { diff --git a/ui/src/routes/works/[wid]/index.svelte b/ui/src/routes/works/[wid]/index.svelte index 89f2c33..d8cb840 100644 --- a/ui/src/routes/works/[wid]/index.svelte +++ b/ui/src/routes/works/[wid]/index.svelte @@ -24,6 +24,7 @@ export let work = null; let edit = false; let my_submission = null; + let warn_already_used = false; work.then((w) => { refresh_submission(w); @@ -159,7 +160,7 @@ {/if} {#if w.submission_url != "-"} - refresh_submission(w)} /> + refresh_submission(w)} bind:already_used={warn_already_used} />
@@ -211,6 +212,23 @@
{/await} {:else if w.submission_url != "-"} + {#if warn_already_used} +
+ Vous avez déjà utilisé ce dépôt pour rendre un autre travail. Pour conserver ce que vous avez fait, tout en respectant l'arborescence de rendu attendue, vous devriez partir d'une nouvelle branche vide : +
+42sh$ git checkout --orphan renduX
+42sh$ git reset
+42sh$ rm -r *
+# Créez l'arborescence de rendu ensuite
+ + Pour retrouver ensuite vos rendus des travaux précédents : +
+42sh$ git checkout renduY
+-- ou --
+42sh$ git checkout master
+
+
+ {/if}
Pour être reconnu, vous devez pousser un tag signé sur votre dépôt. {#if w.tag}Le tag attendu doit commencer par : {w.tag}. Par exemple {w.tag}v1.0, {w.tag}v1.1, …{/if} Seul le dernier tag alphabétique que vous envoyez avant la date du rendu sera pris en compte. Vous pouvez donc faire autant de tag que vous le souhaitez d'ici la date du rendu.