Il bot "link permanente" di GitHub ha rovinato silenziosamente il significato del mio post

Circa un anno fa, ho pubblicato un post sull’istanza Discourse di GitHub che includeva diversi URL del tipo <span>https</span>://github.com/OWNER/REPO/tree/BRANCH/path per discutere di come <span>GitHub</span>.com elabora tali indirizzi. Il mio post ha subito ricevuto una modifica generata dal sistema con il messaggio “Github link was replaced by a permanent link”, che sembra provenire dal plugin discourse-github. Sebbene sostituire il nome del ramo con un link permanente all’ID dell’ultimo commit possa essere una funzionalità utile nel caso comune in cui un post citi codice specifico, nel caso particolare di una discussione sull’elaborazione degli URL di GitHub, la modifica ha distrutto il significato del mio post. Ho avuto la fortuna di notare subito la modifica automatica e, dopo diversi tentativi di contrastare il bot, ho infine trovato un workaround aggiungendo un tag <span> per impedire al pattern del bot di corrispondere, in questo modo:

https://github.com/OWNER/REPO/tree/<span>BRANCH</span>/PATH

Tuttavia, altri autori potrebbero non accorgersi della modifica automatica e ritrovarsi con un post che confonderebbe i lettori.

Qual è la soluzione migliore per evitare modifiche indesiderate ai link permanenti di GitHub in un determinato post? In generale, ritengo che sia sbagliato che i bot effettuino modifiche automatiche che rischiano di rovinare un post. Sarebbe più sicuro (1) chiedere all’autore, al momento del salvataggio del post, se i link devono essere modificati, oppure (2) far sì che il bot aggiunga un link permanente senza rimuovere quello originale. (Ricordo di aver visto alcuni bot su altri siti web, forse Reddit, che aggiungono informazioni senza cancellare quelle esistenti.) Se i manutentori di Discourse ritengono queste opzioni troppo poco eleganti o troppo laboriose per un caso d’uso raro, altre possibilità potrebbero essere (3) mostrare un avviso dopo il salvataggio del post con un link a informazioni su come l’autore può evitare le modifiche se necessario, sia come (a) un banner dedicato nell’interfaccia utente, sia come (b) semplicemente una riga di testo aggiunta dal bot alla fine del post.

Non sono sicuro di quale sia la progettazione più ragionevole per permettere all’autore di disattivare le modifiche. Le impostazioni di esclusione a livello di sito del plugin discourse-github basate sul target del link non sembrano adatte a questo scopo. Forse il mio attuale workaround con il tag <span> è sufficiente. Anche se non verrà apportata alcuna modifica a Discourse, spero che questo post renda più facile per gli autori che notano il problema scoprire questo workaround.

Nota: in precedenza ho segnalato questa issue sul forum di GitHub perché assumevo che il bot dei “link permanenti” fosse specifico dell’istanza di GitHub, ma un commentatore mi ha fatto notare che si tratta di una funzionalità generale di Discourse, quindi sto sollevando la questione qui.

Grazie per l’attenzione!

2 Mi Piace

Penso che questa sia una buona funzionalità, poiché le persone spesso incollano link a master che quasi sempre diventano obsoleti nel tempo. Tuttavia, dovrebbe essere possibile incollare intenzionalmente un link a un branch, dato che ci sono molte ragioni valide per farlo. Inoltre, in generale questa funzionalità sembra un po’ rotta: riscrive cose che non dovrebbe e non analizza cose che probabilmente dovrebbe.

Ecco alcuni esempi che potrebbero essere utilizzati come casi di test per risolverla:

  1. Link semplice creato incollando semplicemente un URL. Mi aspetto che questo venga riscritto, ed è così: subdomain-static/forums-enhancements.js at master · ClassicPress/subdomain-static · GitHub
  2. Link Markdown della forma [url](url). Mi aspetto che questo link non venga riscritto, poiché ho specificato esplicitamente sia il testo che l’URL. Invece, viene riscritto il testo del link, mentre l’URL del link no. Questo è un errore: https://github.com/ClassicPress/subdomain-static/blob/master/forums-enhancements.js
  3. URL racchiuso tra backquote. Questo non è un link e non dovrebbe essere riscritto, ma lo è: https://github.com/ClassicPress/subdomain-static/blob/master/forums-enhancements.js
  4. URL in un blocco di codice con triple backquote. Questo non è un link e non dovrebbe essere riscritto, ma lo è:
    https://github.com/ClassicPress/subdomain-static/blob/master/forums-enhancements.js
    

Penso che solo il punto (1) sopra dovrebbe essere riscritto. Questo renderebbe il comportamento più prevedibile e riscriverebbe solo i link “semplici”. I link in cui è stata utilizzata una struttura Markdown specifica (che può essere considerata un modo per esprimere un’intenzione specifica) dovrebbero essere lasciati invariati.

1 Mi Piace

Sembra che questa funzionalità non sia abilitata su meta.discourse.org?

FWIW, non sono d’accordo: penso che nel (2) modifica: il caso generale di [testo](URL) (chiamiamolo (2a)), l’URL del link dovrebbe essere riscritto allo stesso modo di (1). (Concordo sul fatto che il comportamento attuale di riscrivere il testo e non l’URL sia completamente errato.) Prendo la decisione tra scrivere (1) e (2a) in base al fatto che ritenga utile o distraente che l’URL sia visibile al lettore, non in base a un’intenzione sul fatto che il link debba puntare alla versione del codice al momento della scrittura o al momento della lettura. Naturalmente, sono consapevole del problema dei link permanenti, quindi ne creo uno io stesso ogni volta che ne voglio uno. Ma più in generale, se un amministratore di Discourse decide di abilitare il bot dei link permanenti, presumibilmente è perché pensa che la maggior parte dei suoi utenti non sia consapevole del rischio che i link basati sul nome del branch possano decadere, e non penso che l’uso della sintassi dei link Markdown sia un segnale che un dato utente sia consapevole del problema ma voglia escludere che quel particolare link venga riscritto.

Ma penso che stiamo solo speculando. Come utente avanzato, non mi interessa molto quale sia l’impostazione predefinita, purché io possa sovrascriverla secondo necessità.

Sì, esattamente. Attualmente non c’è modo di sovrascriverla. Scrivere [url](url) (il testo del link e l’URL sono esattamente gli stessi) sarebbe sicuramente un modo per segnalare al bot che quel link non dovrebbe essere riscritto, perché non c’è nessun altro motivo per scriverlo in quel modo.

Ce n’è se vuoi dare al link un titolo personalizzato anziché farlo dedurre dall’URL di destinazione, ovvero [titolo](url). Dare un titolo al link non indicherebbe alcuna preferenza per la riscrittura dell’URL, quindi concordo con @mattmccutchen sul fatto che 1 e 2 dovrebbero comportarsi in modo coerente per la riscrittura dell’URL.

Potrebbe esserci un argomento a favore del titolo che corrisponde esattamente all’URL come indicazione che non dovrebbe essere riscritto, ma cosa succede se un utente vuole fornire un titolo e vuole che l’URL non venga riscritto? Deve esserci un altro metodo per specificarlo.

Qualcosa che mi viene in mente sarebbe un suffisso del titolo simile al ridimensionamento delle immagini incorporate, anche se non sono sicuro di come un utente lo scoprirebbe.

Un’immagine incorporata può essere ridimensionata in questo modo:
![titolo|100x200](url)

Quindi il plugin discourse-github potrebbe (presumibilmente) essere fatto per cercare qualcosa di simile:
[titolo|github-no-rewrite](url)

Ah, non mi era chiaro che il tuo (2) si riferisse solo al caso speciale in cui il testo e l’URL sono gli stessi. La mia affermazione era per il caso generale in cui il testo e l’URL potrebbero non essere gli stessi; chiamiamolo (2a) ora.

Nel caso (2), sono d’accordo che è strano riscrivere l’URL e non il testo, lasciandoli incoerenti, ma mi sembra che si potrebbe ugualmente sostenere che se vogliamo evitare l’incoerenza, il modo migliore per farlo è riscrivere sia l’URL che il testo piuttosto che nessuno dei due. Quindi non trovo convincente l’argomento per trattare (2) come un’esclusione. Dato che dovremmo avere un’esclusione che funzioni per (2a), sarei propenso a lasciare semplicemente che gli utenti utilizzino la stessa esclusione per (2) e non complicare il design. (Penso che questa possa essere stata anche un’idea di Simon Manning?)

Non sono sicuro di star seguendo correttamente (o se sia possibile), ma potresti usare l’escape dello spazio come in Inline PDF Previews - #45 by Johani? Quindi [ testo]( url) non riscriverebbe né il testo né l’url, e qualsiasi altra cosa verrebbe modificata automaticamente?

Questa versione dovrebbe rimanere così com’è e non essere riscritta, fammi vedere:

https://github.com/correctcomputation/checkedc-clang/blob/master-post-microsoft/clang/docs/checkedc/Setup-and-Build.md

scritto come:

<https://github.com/correctcomputation/checkedc-clang/blob/master-post-microsoft/clang/docs/checkedc/Setup-and-Build.md>

Non è un test valido perché la riscrittura dei permalink di GitHub è completamente disabilitata su questa istanza di Discourse. (Mi chiedo cosa dica questa funzionalità se è disabilitata sull’istanza “ufficiale” :upside_down_face:)

Se invece scrivessi questo esempio come caso di test per replace_github_non_permalinks.rb / replace_github_non_permalinks_spec.rb, penso che scopriresti che anche quel link viene riscritto.

1 Mi Piace