💾 Archived View for it.omarpolo.com › articoli › un-server-cvs.gmi captured on 2021-11-30 at 20:18:30. Gemini links have been rewritten to link to archived content

View Raw

More Information

-=-=-=-=-=-=-

Un server CVS

Il ports tree di OpenBSD è gestito, così come il resto del progetto, usando CVS. CVS è un programma per la gestione delle versioni con diversi anni sulle spalle, e ormai credo che sia rimasto solo OpenBSD tra i “grandi” a usarlo.

Il progetto ha i suoi motivi per continuare a usare CVS e, personalmente, mi piace il feeling di CVS.

Ho pensato di aver raggiunto un livello di CVS-fu tale da permettermi di lavorare con i port senza troppi problemi, e per diverso tempo non ho avuto problemi, ma l’altro ieri mi sono incasinato e ho finito col mandare una patch errata.

Si trattava ovviamente di PEBKAC in quanto avevo rimosso un file con ‘cvs rm’, poi rigenerato ma non aggiunto con ‘cvs add’, quindi per CVS il file era cancellato! (Succederebbe la stessa cosa con git per dire, solo che lì ho più esperienza e noterei prima il problema.)

Come soluzione ho pensato di usare un po’ di più CVS per prenderci la mano.

Da oggi, quindi, questo blog è gestito con CVS :D

Quello che segue è (circa) un tutorial di come ho setuppato tutto, nel caso possa tornare utile a qualcun altro.

Tutti i comandi riportati sono stati testati su un’installazione fresca di OpenBSD 7.0, ma dovrebbero andare bene così come sono o con poche modifiche su qualunque altro UNIX.

Creare un repository

A differenza di git, CVS richiede l’esistenza di un “repository” che contiene le informazioni sui file. Questo repository poi deve essere “checked out” per poter modificare i file. Inoltre, essendo centralizzato, ‘cvs commit’ in automatico prova a scrivere le modifiche nel repository, a differenza di git dove dovremmo usare un ‘git push’.

Creare un repository è piuttosto facile. Ho creato una cartella /cvs in un server casalingo e inizializzato il repository ‘blog-it’

# groupadd wcvs		# crea un gruppo “wcvs”
# usermod -G wcvs op	# aggiunge l’utente op al gruppo
# mkdir /cvs
# chmod g+w /cvs	# permetti agli utenti del gruppo wcvs
# chown :wcvs /cvs	# di modificare i file qui dentro
# cd /cvs/blog-it
# cvs -d /cvs/blog-it init

Il gruppo ‘wcvs’ è assolutamente arbitrario, ma può tornare utile se in futuro volessimo permettere ad altri utenti di committare. Altrimenti, possiamo fare tutto da utente locale (sconsiglio di usare root.)

(opzionale) configurare l’espansione delle keyword

CVS, così come RCS e Subversion, hanno quest’idea di espandere le keyword. Se nei file sono presenti delle parti $Keyword: …$ queste verranno espanse in qualcos’altro. Esempi comuni sono Date, Id, Author ecc. Come esempio pratico, se scrivo $​Date$ post commit dovrebbe uscirne:

$Date: 2021/10/20 08:59:29 $

(prima ho dovuto scrivere “$​Date$” come $ zero-width-space Date $.)

È possibile configurare una keyword personalizzata per il repository. Ad esempio, OpenBSD usa $OpenBSD$, NetBSD e FreeBSD usano/usavano qualcosa di simile.

L’espansione delle keyword torna piuttosto utile quando i file vengono esportati da un repository. Ad esempio, tutti i post in questo blog da adesso in poi come ultima riga avranno il numero di versione del file, quando è stato modificato e da chi. Chi visita il sito senza accesso al repo CVS potrà avere un’idea di quale revisione dei file stia guardando, per esempio.

È possibile scegliere una keyword personalizzata modificando il file CVSROOT/config del repository.

# Set this to the name of a local tag to use in addition to Id
tag=BlogIt

Inizializzare il repository

Un repository vuoto è poco utile, per “riempirlo” bisogna effettuare un “checkout” (con git diremmo “un worktree”) e divertirsi con CVS

$ whoami			# nota: non sono piĂš root!
op
$ mkdir blog-it
$ cd blog-it
$ cvs -d /cvs/blog-it co .	# “co” = “checkout”

A questo punto ho copiato tutti i file del blog e aggiunti con ‘cvs add’. Una particolarità: a differenza di git, CVS traccia le directory. Per aggiungere “articoli/foo.gmi”, bisogna prima aver ‘cvs add articoli’!

Committare

Abbastanza semplice, ‘cvs commit’ – o ‘cvs ci’ per i pigri – e le modifiche sono a posto.

Accesso remoto

CVS funziona benissimo via SSH. Basta assicurarsi di potersi collegare al server e di avere accesso in scrittura al repository, a quel punto per clonare

another-host$ cvs -d my@myserver:/cvs/blog-it co .
...

E via. Ricordo che essendo centralizzato ‘cvs commit’ richiede una connessione a internet in questo caso.

CVSWeb

CVSWeb di OpenBSD

cvsweb è un’interfaccia web per CVS. Almeno su OpenBSD l’installazione è piuttosto immediata:

# pkg_add cvsweb
# sh /usr/local/share/doc/pkg-readmes/cvsweb
...

Lo script si occuperà di configurare correttamente la chroot /var/www. L’unica cosa che rimane da fare è configurare httpd(8):

# /etc/httpd.conf
server "cvsweb.chiaki.home" {
	listen on * port 80

	location "/cgi-bin/*" {
		fastcgi
		root "/"
	}
}

e abilitarlo/attivarlo se non giĂ  attivo:

# rcctl enable httpd
# rcctl start httpd
httpd(ok)

git hooks^W^W eseguire comandi post-commit

CVS permette l'esecuzioni di comandi personalizzati in diverse situazioni. È possibile scrivere dei programmi per controllare — ed eventualmente anche bloccare — i commit prima che vengano applicati.

Ci sono diversi file dentro CVSROOT/*info, come commitinfo, editinfo ecc.

Al momento sto usando loginfo per sincronizzare /cvs con /var/www/cvs e con un altro server remoto. In futuro mi piacerebbe avere CVSWeb come terzo-livello di omarpolo.com, ma per oggi ho finito il tempo a disposizione per gli esperimenti.

$BlogIt: un-server-cvs.gmi,v 1.1 2021/10/20 08:59:29 op Exp $