From 08a9e1a0ee11c6ca91d93ba9a17b65f6d3bbf400 Mon Sep 17 00:00:00 2001 From: mlbiche Date: Thu, 13 Aug 2026 17:39:45 +0200 Subject: [PATCH 1/5] Fix a bug occurring after renaming a Scribouilli repository in GitLab Introduce a repoPath concept based on the repository name in GitHub and the repository path in GitLab --- assets/scripts/actions/current-repository.ts | 14 ++++---- assets/scripts/actions/setup.ts | 15 ++++---- assets/scripts/components/Header.svelte | 22 ++++++------ .../components/screens/AfterOauthLogin.svelte | 6 ++-- .../screens/SelectCurrentSite.svelte | 15 ++++---- .../screens/intern/ListContenu.svelte | 10 +++--- assets/scripts/oauth-services-api/github.ts | 6 ++-- assets/scripts/oauth-services-api/gitlab.ts | 34 +++++++++---------- .../scripts/routes/atelier-list-articles.ts | 4 +-- assets/scripts/routes/urls.ts | 4 +-- assets/scripts/routes/welcome.ts | 4 +-- assets/scripts/scribouilliGitRepo.ts | 17 +++++----- assets/scripts/store.ts | 10 ++++-- assets/scripts/types/git.ts | 7 ++-- 14 files changed, 88 insertions(+), 80 deletions(-) diff --git a/assets/scripts/actions/current-repository.ts b/assets/scripts/actions/current-repository.ts index 1075b45e..ff92ac83 100644 --- a/assets/scripts/actions/current-repository.ts +++ b/assets/scripts/actions/current-repository.ts @@ -41,16 +41,16 @@ export const setCurrentRepositoryFromQuerystring = async ( querystring: string, ): Promise => { const params = new URLSearchParams(querystring) - const repoName = params.get('repoName') + const repoPath = params.get('repoPath') const owner = params.get('account') const oAuthProvider = store.state.oAuthProvider let message - if (!repoName || !owner || !oAuthProvider) { - if (!repoName) { - message = `Missing parameter 'repoName' in URL` + if (!repoPath || !owner || !oAuthProvider) { + if (!repoPath) { + message = `Missing parameter 'repoPath' in URL` } else { if (!owner) { message = `Missing parameter 'account' in URL` @@ -65,14 +65,14 @@ export const setCurrentRepositoryFromQuerystring = async ( } const origin = oAuthProvider.origin - const repoId = makeRepoId(owner, repoName) + const repoId = makeRepoId(owner, repoPath) const scribouilliGitRepo = new ScribouilliGitRepo({ owner, - repoName, + repoPath, repoId, origin: origin, - publicRepositoryURL: makePublicRepositoryURL(owner, repoName, origin), + publicRepositoryURL: makePublicRepositoryURL(owner, repoPath, origin), gitServiceProvider: getOAuthServiceAPI(), }) diff --git a/assets/scripts/actions/setup.ts b/assets/scripts/actions/setup.ts index 73726ec2..b2b9ebe1 100644 --- a/assets/scripts/actions/setup.ts +++ b/assets/scripts/actions/setup.ts @@ -71,14 +71,14 @@ export const setupLocalRepository = async (): Promise< */ export function guessBaseURL({ owner, - repoName, + repoPath, origin, }: ScribouilliGitRepo): string { if (origin === 'https://github.com') { const publishedHostname = `${owner.toLowerCase()}.github.io` - repoName = repoName.toLowerCase() + repoPath = repoPath.toLowerCase() - return publishedHostname === repoName ? '' : `/${repoName}` + return publishedHostname === repoPath ? '' : `/${repoPath}` } else if ( origin === 'https://gitlab.com' || origin === 'https://git.scribouilli.org' @@ -116,7 +116,8 @@ export const createRepositoryForCurrentAccount = async ( throw new TypeError(`missing login in createRepositoryForCurrentAccount`) } - const escapedRepoName = repoName + // On creation, on both GitHub and GitLab, the name matches the repository path + const escapedRepoPath = repoName .normalize('NFD') .replace(/[\u0300-\u036f]/g, '') .replace(/[^\w\.-]/g, '-') // see https://stackoverflow.com/a/59082561 @@ -133,11 +134,11 @@ export const createRepositoryForCurrentAccount = async ( const scribouilliGitRepo = new ScribouilliGitRepo({ owner: owner, - repoName: escapedRepoName, + repoPath: escapedRepoPath, origin: origin, publicRepositoryURL: makePublicRepositoryURL( owner, - escapedRepoName, + escapedRepoPath, origin, ), gitServiceProvider: getOAuthServiceAPI(), @@ -150,7 +151,7 @@ export const createRepositoryForCurrentAccount = async ( .createDefaultRepository(scribouilliGitRepo, template) .then(({ remoteURL }) => { const gitAgent = new GitAgent({ - repoId: makeRepoId(owner, escapedRepoName), + repoId: makeRepoId(owner, escapedRepoPath), remoteURL: remoteURL, onMergeConflict: ( resolutionOptions: ResolutionOption[] | undefined, diff --git a/assets/scripts/components/Header.svelte b/assets/scripts/components/Header.svelte index 2eae015a..51cedd12 100644 --- a/assets/scripts/components/Header.svelte +++ b/assets/scripts/components/Header.svelte @@ -1,6 +1,8 @@
@@ -76,7 +78,7 @@
@@ -113,7 +113,7 @@ {:else} Modifier diff --git a/assets/scripts/oauth-services-api/github.ts b/assets/scripts/oauth-services-api/github.ts index 69222e14..4ebb16ba 100644 --- a/assets/scripts/oauth-services-api/github.ts +++ b/assets/scripts/oauth-services-api/github.ts @@ -43,7 +43,7 @@ export default class GitHubAPI implements OAuthServiceAPI { } async createDefaultRepository( - { owner, repoName, publishedWebsiteURL }: ScribouilliGitRepo, + { owner, repoPath, publishedWebsiteURL }: ScribouilliGitRepo, template: GitSiteTemplate, ) { // Generate a new repository from the theme repository @@ -57,7 +57,7 @@ export default class GitHubAPI implements OAuthServiceAPI { method: 'POST', body: JSON.stringify({ owner, - name: repoName, + name: repoPath, description: 'Mon site Scribouilli', }), }, @@ -96,7 +96,7 @@ export default class GitHubAPI implements OAuthServiceAPI { method: 'PUT', body: JSON.stringify({ owner, - repo: repoName, + repo: repoPath, names: ['site-scribouilli'], }), }) diff --git a/assets/scripts/oauth-services-api/gitlab.ts b/assets/scripts/oauth-services-api/gitlab.ts index 01e62473..c4ba17fd 100644 --- a/assets/scripts/oauth-services-api/gitlab.ts +++ b/assets/scripts/oauth-services-api/gitlab.ts @@ -2,6 +2,7 @@ import GitAgent from '../GitAgent.ts' import ScribouilliGitRepo from '../scribouilliGitRepo.ts' import type { BuildStatus, + GitRepository, GitSiteTemplate, OAuthServiceAPI, } from '../types/git.ts' @@ -73,17 +74,17 @@ export default class GitLabAPI implements OAuthServiceAPI { const response = await this.callAPI( `${this.apiBaseUrl}/users/${login}/projects?order_by=updated_at&sort=desc&per_page=30&visibility=public`, ) - const json = await response.json() + const json: Array = await response.json() // @ts-ignore - const repositories = json.map(repo => { - return { - id: repo.id, + const repositories = json.map( + (repo: any): GitRepository => ({ name: repo.name, + path: repo.path, owner: { login: repo.owner.username, }, - } - }) + }), + ) return await Promise.resolve(repositories) } @@ -91,7 +92,7 @@ export default class GitLabAPI implements OAuthServiceAPI { scribouilliGitRepo: ScribouilliGitRepo, { url: gitRepoUrl }: GitSiteTemplate, ) { - const { repoName } = scribouilliGitRepo + const { repoPath } = scribouilliGitRepo const response = await this.callAPI(`${this.apiBaseUrl}/projects`, { method: 'POST', @@ -101,7 +102,7 @@ export default class GitLabAPI implements OAuthServiceAPI { }, body: JSON.stringify({ import_url: gitRepoUrl, - name: repoName, + name: repoPath, // On creation, path and name are identical description: 'Mon site Scribouilli', topics: ['site-scribouilli'], visibility: 'public', @@ -134,11 +135,8 @@ export default class GitLabAPI implements OAuthServiceAPI { console.log('response', response) } - async getPagesWebsiteDeploymentStatus({ - owner, - repoName, - }: ScribouilliGitRepo) { - const urlEncodedRepoPath = encodeURIComponent(`${owner}/${repoName}`) + async getPagesWebsiteDeploymentStatus({ repoId }: ScribouilliGitRepo) { + const urlEncodedRepoPath = encodeURIComponent(repoId) const response = await this.callAPI( `${this.apiBaseUrl}/projects/${urlEncodedRepoPath}/deployments?per_page=1&order_by=updated_at&sort=desc`, @@ -167,8 +165,8 @@ export default class GitLabAPI implements OAuthServiceAPI { } } - async isRepositoryReady({ owner, repoName }: ScribouilliGitRepo) { - const urlEncodedRepoPath = encodeURIComponent(`${owner}/${repoName}`) + async isRepositoryReady({ repoId }: ScribouilliGitRepo) { + const urlEncodedRepoPath = encodeURIComponent(repoId) // This call is used only at the creation of the repository. // We assume that the git ref is `main`. @@ -182,13 +180,13 @@ export default class GitLabAPI implements OAuthServiceAPI { } } - getPublishedWebsiteURL({ repoName, owner, origin }: ScribouilliGitRepo) { + getPublishedWebsiteURL({ repoPath, owner, origin }: ScribouilliGitRepo) { if (origin === 'https://gitlab.com') { - return Promise.resolve(`https://${owner}.gitlab.io/${repoName}/`) + return Promise.resolve(`https://${owner}.gitlab.io/${repoPath}/`) } if (origin === 'https://git.scribouilli.org') { - return Promise.resolve(`https://${owner}.monpetitsite.org/${repoName}/`) + return Promise.resolve(`https://${owner}.monpetitsite.org/${repoPath}/`) } return Promise.reject('Unknown origin') diff --git a/assets/scripts/routes/atelier-list-articles.ts b/assets/scripts/routes/atelier-list-articles.ts index 4c594912..c58043c7 100644 --- a/assets/scripts/routes/atelier-list-articles.ts +++ b/assets/scripts/routes/atelier-list-articles.ts @@ -33,7 +33,7 @@ export default async ({ querystring }: Context) => { export function makeAtelierListArticlesURL({ owner, - repoName, + repoPath, }: ScribouilliGitRepo): string { - return `/atelier-list-articles?account=${owner}&repoName=${repoName}` + return `/atelier-list-articles?account=${owner}&repoPath=${repoPath}` } diff --git a/assets/scripts/routes/urls.ts b/assets/scripts/routes/urls.ts index 937a91c9..24905d48 100644 --- a/assets/scripts/routes/urls.ts +++ b/assets/scripts/routes/urls.ts @@ -2,7 +2,7 @@ import ScribouilliGitRepo from '../scribouilliGitRepo' export function makeAtelierListPageURL({ owner, - repoName, + repoPath, }: ScribouilliGitRepo): string { - return `/atelier-list-pages?account=${owner}&repoName=${repoName}` + return `/atelier-list-pages?account=${owner}&repoPath=${repoPath}` } diff --git a/assets/scripts/routes/welcome.ts b/assets/scripts/routes/welcome.ts index f31683c6..66d54317 100644 --- a/assets/scripts/routes/welcome.ts +++ b/assets/scripts/routes/welcome.ts @@ -16,10 +16,10 @@ export default () => { fetchCurrentUserRepositories().then(repos => { if (repos.length === 1) { - const repoName = repos[0].name + const repoPath = repos[0].path || repos[0].name // In GitHub, repository slug is defined in the name attribute. In GitLab, repository slug is defined in the path attribute and may differ from the name attribute (after renaming) const account = repos[0].owner.login - page(`/atelier-list-pages?repoName=${repoName}&account=${account}`) + page(`/atelier-list-pages?repoPath=${repoPath}&account=${account}`) } else { store.mutations.setReposForAccount({ // @ts-ignore diff --git a/assets/scripts/scribouilliGitRepo.ts b/assets/scripts/scribouilliGitRepo.ts index 493c6b54..8e20e3b9 100644 --- a/assets/scripts/scribouilliGitRepo.ts +++ b/assets/scripts/scribouilliGitRepo.ts @@ -5,7 +5,7 @@ export default class ScribouilliGitRepo { public origin public publicRepositoryURL public owner - public repoName + public repoPath public repoId public publishedWebsiteURL: Promise @@ -14,20 +14,20 @@ export default class ScribouilliGitRepo { origin, publicRepositoryURL, owner, - repoName, + repoPath, gitServiceProvider, }: { repoId?: string origin: string publicRepositoryURL: string owner: string - repoName: string + repoPath: string gitServiceProvider: OAuthServiceAPI }) { this.origin = origin this.publicRepositoryURL = publicRepositoryURL this.owner = owner - this.repoName = repoName + this.repoPath = repoPath this.repoId = repoId ? repoId : makeRepoId(owner, repoName) @@ -47,8 +47,8 @@ export default class ScribouilliGitRepo { /** * @param owner may be an individual Github user or an organisation */ -export function makeRepoId(owner: string, repoName: string): string { - return `${owner}/${repoName}` +export function makeRepoId(owner: string, repoPath: string): string { + return `${owner}/${repoPath}` } /** @@ -56,8 +56,9 @@ export function makeRepoId(owner: string, repoName: string): string { */ export function makePublicRepositoryURL( owner: string, - repoName: string, + repoPath: string, origin: string, ): string { - return `${origin}/${owner}/${repoName}` + const repoId = makeRepoId(owner, repoPath) + return `${origin}/${repoId}` } diff --git a/assets/scripts/store.ts b/assets/scripts/store.ts index 90875ab5..ed3425de 100644 --- a/assets/scripts/store.ts +++ b/assets/scripts/store.ts @@ -2,7 +2,7 @@ import Store, { type BareduxStore } from 'baredux' import GitAgent from './GitAgent.ts' import ScribouilliGitRepo from './scribouilliGitRepo.ts' import type { Page, Article } from './types/atelier.ts' -import type { BuildStatus } from './types/git.ts' +import type { BuildStatus, GitRepository } from './types/git.ts' /** * Un store baredux a pour vocation de refléter notamment le modèle mental de la * personne face à Scribouilli. Le store stocke donc principalement des données (et parfois des singletons) @@ -34,7 +34,7 @@ export interface ScribouilliState { currentRepository: ScribouilliGitRepo | undefined gitAgent: GitAgent | undefined conflict: ResolutionOption[] | undefined - reposByAccount: any + reposByAccount: { [account: string]: GitRepository[] } | undefined pages?: Page[] articles?: Article[] buildStatus: BuildStatus @@ -131,8 +131,12 @@ const mutations = { setReposForAccount( state: ScribouilliState, - { login, repos }: { login: string; repos: any[] }, + { login, repos }: { login: string; repos: GitRepository[] }, ) { + if (!state.reposByAccount) { + state.reposByAccount = {} + } + state.reposByAccount[login] = repos // on place ses propres dépôts avant les dépôts des autres .sort((a, b) => { diff --git a/assets/scripts/types/git.ts b/assets/scripts/types/git.ts index aae18fdc..f99ebd00 100644 --- a/assets/scripts/types/git.ts +++ b/assets/scripts/types/git.ts @@ -1,7 +1,7 @@ interface ScribouilliGitRepo { repoId: string owner: string - repoName: string + repoPath: string origin: string publishedWebsiteURL: Promise publicRepositoryURL: string @@ -31,7 +31,7 @@ export interface OAuthServiceAPI { isRepositoryReady: ( scribouilliGitRepo: ScribouilliGitRepo, ) => Promise - getCurrentUserRepositories: () => Promise + getCurrentUserRepositories: () => Promise deploy: (scribouilliGitRepo: ScribouilliGitRepo) => Promise getPagesWebsiteDeploymentStatus: ( scribouilliGitRepo: ScribouilliGitRepo, @@ -49,8 +49,9 @@ interface AuthenticatedUserEmails { primary: boolean } -export interface GithubRepository { +export interface GitRepository { name: string + path?: string owner: { login: string } From 29b7357113047357b6f4977b18b14128f886c0d6 Mon Sep 17 00:00:00 2001 From: mlbiche Date: Thu, 13 Aug 2026 17:41:02 +0200 Subject: [PATCH 2/5] Simplify some redundant pieces of code when creating ScribouilliGitRepo objects --- assets/scripts/actions/current-repository.ts | 10 +++------- assets/scripts/actions/setup.ts | 14 ++++---------- assets/scripts/scribouilliGitRepo.ts | 8 ++------ 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/assets/scripts/actions/current-repository.ts b/assets/scripts/actions/current-repository.ts index ff92ac83..20a94cdf 100644 --- a/assets/scripts/actions/current-repository.ts +++ b/assets/scripts/actions/current-repository.ts @@ -2,10 +2,7 @@ import page from 'page' import yaml from 'js-yaml' import store, { type PartialStore } from './../store.ts' -import ScribouilliGitRepo, { - makeRepoId, - makePublicRepositoryURL, -} from './../scribouilliGitRepo.ts' +import ScribouilliGitRepo, { makeRepoId } from './../scribouilliGitRepo.ts' import GitAgent from '../GitAgent.ts' import { handleErrors, logMessage } from './../utils.ts' import { fetchAuthenticatedUserLogin } from './current-user.ts' @@ -65,19 +62,18 @@ export const setCurrentRepositoryFromQuerystring = async ( } const origin = oAuthProvider.origin - const repoId = makeRepoId(owner, repoPath) const scribouilliGitRepo = new ScribouilliGitRepo({ owner, repoPath, - repoId, origin: origin, - publicRepositoryURL: makePublicRepositoryURL(owner, repoPath, origin), gitServiceProvider: getOAuthServiceAPI(), }) store.mutations.setCurrentRepository(scribouilliGitRepo) + const { repoId } = scribouilliGitRepo + const gitAgent = new GitAgent({ repoId, remoteURL: `${origin}/${repoId}.git`, diff --git a/assets/scripts/actions/setup.ts b/assets/scripts/actions/setup.ts index b2b9ebe1..0383043b 100644 --- a/assets/scripts/actions/setup.ts +++ b/assets/scripts/actions/setup.ts @@ -1,10 +1,7 @@ import page from 'page' import store, { ResolutionOption } from './../store.ts' -import ScribouilliGitRepo, { - makePublicRepositoryURL, - makeRepoId, -} from './../scribouilliGitRepo.ts' +import ScribouilliGitRepo from './../scribouilliGitRepo.ts' import { getOAuthServiceAPI } from './../oauth-services-api/index.ts' import { makeAtelierListPageURL } from './../routes/urls.ts' import { logMessage } from './../utils.ts' @@ -136,14 +133,11 @@ export const createRepositoryForCurrentAccount = async ( owner: owner, repoPath: escapedRepoPath, origin: origin, - publicRepositoryURL: makePublicRepositoryURL( - owner, - escapedRepoPath, - origin, - ), gitServiceProvider: getOAuthServiceAPI(), }) + const { repoId } = scribouilliGitRepo + store.mutations.setCurrentRepository(scribouilliGitRepo) return ( @@ -151,7 +145,7 @@ export const createRepositoryForCurrentAccount = async ( .createDefaultRepository(scribouilliGitRepo, template) .then(({ remoteURL }) => { const gitAgent = new GitAgent({ - repoId: makeRepoId(owner, escapedRepoPath), + repoId, remoteURL: remoteURL, onMergeConflict: ( resolutionOptions: ResolutionOption[] | undefined, diff --git a/assets/scripts/scribouilliGitRepo.ts b/assets/scripts/scribouilliGitRepo.ts index 8e20e3b9..e67795d5 100644 --- a/assets/scripts/scribouilliGitRepo.ts +++ b/assets/scripts/scribouilliGitRepo.ts @@ -10,26 +10,22 @@ export default class ScribouilliGitRepo { public publishedWebsiteURL: Promise constructor({ - repoId, origin, - publicRepositoryURL, owner, repoPath, gitServiceProvider, }: { - repoId?: string origin: string - publicRepositoryURL: string owner: string repoPath: string gitServiceProvider: OAuthServiceAPI }) { this.origin = origin - this.publicRepositoryURL = publicRepositoryURL this.owner = owner this.repoPath = repoPath - this.repoId = repoId ? repoId : makeRepoId(owner, repoName) + this.repoId = makeRepoId(owner, repoPath) + this.publicRepositoryURL = makePublicRepositoryURL(owner, repoPath, origin) this.publishedWebsiteURL = new Promise(resolve => { const interval = setInterval(() => { From a45006796f7fa9153d6c59803b08416f9381c3a0 Mon Sep 17 00:00:00 2001 From: mlbiche Date: Thu, 13 Aug 2026 17:41:16 +0200 Subject: [PATCH 3/5] Remove some dead code --- assets/scripts/GitAgent.ts | 2 -- assets/scripts/routes/after-oauth-login.ts | 6 ------ assets/scripts/routes/welcome.ts | 6 ------ 3 files changed, 14 deletions(-) diff --git a/assets/scripts/GitAgent.ts b/assets/scripts/GitAgent.ts index 0d4e8f16..2950b5c9 100644 --- a/assets/scripts/GitAgent.ts +++ b/assets/scripts/GitAgent.ts @@ -343,8 +343,6 @@ export default class GitAgent { * * * https://isomorphic-git.org/docs/en/setConfig - * - * Alors, on doit passer le repoName */ async setAuthor( login: string, diff --git a/assets/scripts/routes/after-oauth-login.ts b/assets/scripts/routes/after-oauth-login.ts index 82a4297c..8e0fa7b6 100644 --- a/assets/scripts/routes/after-oauth-login.ts +++ b/assets/scripts/routes/after-oauth-login.ts @@ -69,12 +69,6 @@ export default () => { if (repos.length === 0) { page.redirect('/creer-un-nouveau-site') } else { - store.mutations.setReposForAccount({ - // @ts-ignore - login: store.state.login, - repos, - }) - page.redirect('/selectionner-un-site') } }) diff --git a/assets/scripts/routes/welcome.ts b/assets/scripts/routes/welcome.ts index 66d54317..17f0031f 100644 --- a/assets/scripts/routes/welcome.ts +++ b/assets/scripts/routes/welcome.ts @@ -21,12 +21,6 @@ export default () => { page(`/atelier-list-pages?repoPath=${repoPath}&account=${account}`) } else { - store.mutations.setReposForAccount({ - // @ts-ignore - login: store.state.login, - repos, - }) - page.redirect('/selectionner-un-site') } }) From b98b4716086d9f3b76f47a321800392b6f6dff30 Mon Sep 17 00:00:00 2001 From: mlbiche Date: Thu, 13 Aug 2026 17:41:46 +0200 Subject: [PATCH 4/5] Fix an error in console on page refresh due to currentProps being undefined --- assets/scripts/routeComponentLifeCycle.svelte.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/scripts/routeComponentLifeCycle.svelte.ts b/assets/scripts/routeComponentLifeCycle.svelte.ts index 66fa1689..acff6d78 100644 --- a/assets/scripts/routeComponentLifeCycle.svelte.ts +++ b/assets/scripts/routeComponentLifeCycle.svelte.ts @@ -7,7 +7,7 @@ import { Component } from 'svelte' type MapStateToPropsFunction = (state: ScribouilliState) => Record let currentComponent: Record -let currentProps: Record +let currentProps: Record = {} let currentMapStateToProps: MapStateToPropsFunction = _ => ({}) export function replaceComponent

>( From b17a44f3cbcda58f0620b98093223cc882badda5 Mon Sep 17 00:00:00 2001 From: mlbiche Date: Thu, 13 Aug 2026 17:42:44 +0200 Subject: [PATCH 5/5] Update documentation following pnpm introduction and adding more details for preparing forked repository --- README.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 23062b26..22fe84f2 100644 --- a/README.md +++ b/README.md @@ -10,33 +10,31 @@ avec son contenu. - Ouvrir un terminal - Récupérer le repo `git clone git@github.com:lechappeebelle/scribouilli.git` dans le dossier qui va bien - Rentrer dans le dossier `scribouilli` -- Faire `npm install` +- Faire `npm install` (vous pouvez aussi utiliser `pnpm`) - Builder le projet avec `npm run dev` - Lancer le projet avec `npm start` dans un autre terminal - Ouvrir dans votre navigateur préféré `http://localhost:8080/` ## Développement -- Forker le repo sur votre compte -- Modifier les settings - - Donner les droits en écriture a _github action_ - - Pour déployer la branche `online` +- Forker le repo sur votre compte en prenant soin de **ne pas** copier **uniquement** la branche `principale` (pour disposer de la branche `online`) +- Modifier les paramètres (_Settings_) de votre fork + - Donner les droits en écriture à _github action_ dans **Actions > General > Workflow permissions** + - Pour déployer la branche `online` dans **Pages > Build and deployment** - Ajouter votre origine github pages (ex: `yaf.github.io`) dans [Scribouilli/toctoctoc/allowlist.csv](https://github.com/Scribouilli/toctoctoc/blob/main/allowlist.csv) Voilà à quoi ça peut ressembler : [github.com/yaf/scribouilli](https://github.com/yaf/scribouilli) Une fois les développements réalisés, vous pouvez faire une PR dans Scribouilli, en précisant votre url de développement pour que l'on puisse tester la modification. - ### Limite connue Pour le moment, il n'est pas possible de tester en local des sites hébergés sur gitlab ou scribougit (`git.scribouilli.org`) On peut le faire, mais ça demande de changer la config de toctoctoc en prod (et donc, ça casse la prod pour les sites ; une histoire de `redirect_uri`) - ### Outils de développement -Des pre-commit hooks sont installés automatiquement avec `husky`. Si jamais il sont trop contraignants, +Des pre-commit hooks peuvent être installés avec `husky` en exécutant `npm run prepare`. Si jamais il sont trop contraignants, il est possible de les ignorer avec l'option `--no-verify` de `git commit`. Vous pouvez également lancer les tests en local avec :