Journal Le compilateur GCC passe à Git

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes : aucune
33
25
jan.
2020

Depuis le 13 janvier, le dépôt du code source de GCC est entièrement passé sur Git. La tâche a été confiée au hacker moustachu Eric S. Raymond avec un délai assez court. Mais ce type est un monstre, il raconte ses trente jours de hack dans un billet impressionnant — des 580 Gio de RAM à sa maladie consécutive. Il y a un autre achèvement : le 13 janvier marque aussi la version 4.0 de Reposurgeon, l’outil d’esr pour convertir un dépôt d’un système de gestion de versions à un autre.

  • # me semblait pourtant qu'il existait déjà des outils pour passer de cvs à git?

    Posté par  . Évalué à 2.

    tout est dans le titre

    • [^] # Re: me semblait pourtant qu'il existait déjà des outils pour passer de cvs à git?

      Posté par  (site web personnel, Mastodon) . Évalué à 6.

      The project was reposurgeon’s biggest conversion yet, the 280K-commit history of the Gnu Compiler Collection. As of Jan 11 it is officially lifted from Subversion to Git.

      Dans son billet, esr ne parle pas du tout de cvs, il doit bien y avoir une raison…

      • [^] # Re: me semblait pourtant qu'il existait déjà des outils pour passer de cvs à git?

        Posté par  (site web personnel) . Évalué à 6.

        Pour être plus précis il écrit « from Subversion to Git » donc svn vers git, pas cvs vers git.

        • [^] # Re: me semblait pourtant qu'il existait déjà des outils pour passer de cvs à git?

          Posté par  (site web personnel) . Évalué à 8.

          Sommaire

          Et histoire de donner un exemple de cvs vers svn, voici mes notes d'octobre 2006, sur la conversion du dépôt CVS de l'association April :

          Taille du dépôt CVS local

          $ cvs -dcvs.april.org:/var/lib/cvs co htdocs include
          (...)
          $ du -sk *
          505620  htdocs
          164     include
          

          Taille du dépôt CVS côté serveur

          ns2:/var/lib/cvs# du -sk *
          88      Attic
          4728    CVSROOT
          8       candidats.fr
          3980    cgi-bin
          2084    config
          4       howto-webmastering.wml,v
          690264  htdocs
          188     include
          24884   libre-en-fete
          8404    libreeduc
          800     mantis.april.org
          1784    software
          532     xray
          

          Soit un total de 737760 KiB (et y a probablement des choses uniquement à archiver, pas à convertir, ou alors juste à dumper en attendant un éventuel réimport plus tard)

          Création du SVN

          (surtout ne pas oublier le 'fsfs', on n'en veut pas de la base Berkeley DB 'bdb'…)

          $ svnadmin create --fs-type fsfs /data/svn
          

          (ça créé plein de fichiers dans /data/svn)

          $ cvs2svn --existing-svnrepos -s /data/svn /data/cvs
          (...)
          Pass 1 complete.
          ===========================================================================
          Error summary:
          ERROR: A CVS repository cannot contain both /data/cvs/htdocs/association/ca_temp .wml,v and /data/cvs/htdocs/association/Attic/ca_temp.wml,v
          Exited due to fatal error(s).
          

          Bon, de toute façon, ce fichier ne sert à rien (qui existe encore en ayant été supprimé).
          Pouf viré du CVS. On recommence tout…

          (...)
          ----- pass 2 -----
          Checking for blocked exclusions...
          Checking for forced tags with commits...
          Checking for tag/branch mismatches...
          ERROR: The following symbols are tags in some files and branches in others.
          Use --force-tag, --force-branch and/or --exclude to resolve the symbols.
              'start' is a tag in 208 files, a branch in 1 files and has commits in 1 files.
          

          Humm certes. (utilisé dans candidats.fr, cgi-bin, xray, software et htdocs apparemment). ça serait pas un tag par défaut dans CVS ? Et quelqu'un aurait appelé une branche 'start' ? On doit pouvoir forcer comme tag a priori.

          $ cvs2svn --force-tag start --existing-svnrepos -s /data/svn /data/cvs
          (...)
          ----- pass 2 -----
          Checking for blocked exclusions...
          Checking for forced tags with commits...
          ERROR: The following branches cannot be forced to be tags because they have commits:
              'start'
          

          Bon, toujours pass2… et ben on va oublier start alors…

          $ cvs2svn --exclude start --existing-svnrepos -s /data/svn /data/cvs
          (...)
          ----- pass 2 -----
          Checking for blocked exclusions...
          ERROR: The branch 'start' cannot be excluded because the following symbols depend on it:
              'initial'
          

          Perdu, tu y as cru hein ? Bon reste plus qu'un choix alors…

          $ cvs2svn --force-branch start --existing-svnrepos -s /data/svn /data/cvs
          (...)
          Starting Subversion r299 / 11882
          Starting Subversion r300 / 11882
          (...)
          blabla 11882 révisions quand même en 10 ans...il recréé les révisions une à une, ça rame...
          (...)
          Starting Subversion r7506 / 11882
          ERROR: Unable to convert a path 'trunk/htdocs/secure/ca/documents/documents-internes/subventions/dossier-subvention-april-region-idf-2005/exemple-budget-prévisionnel.pdf' to internal encoding.
          Consider rerunning with (for example) '--encoding=latin1'.
          

          OK on renomme, on choisit le jeu de caractères et on reprend.

          $ cvs2svn --force-branch start --encoding=iso8859-15 --existing-svnrepos -s /data/svn /data/cvs
          (...)
          Starting Subversion r11882 / 11882
          Done.
          
          cvs2svn Statistics:
          ------------------
          Total CVS Files:             13768
          Total CVS Revisions:         42877
          Total Unique Tags:              14
          Total Unique Branches:          12
          CVS Repos Size in KB:       688362
          Total SVN Commits:           11882
          First Revision Date:    Tue Jul 27 17:13:21 1999
          Last Revision Date:     Wed Aug 30 23:39:33 2006
          ------------------
          Timings:
          ------------------
          pass 1:   272 seconds
          pass 2:    35 seconds
          pass 3:     0 seconds
          pass 4:    42 seconds
          pass 5:   154 seconds
          pass 6:     0 seconds
          pass 7:     0 seconds
          pass 8:  5180 seconds
          total:   5688 seconds
          

          YES !

          Taille du dépôt SVN local

          $ du -sk svn/trunk/htdocs/ svn/trunk/include/
          1100844 svn/trunk/htdocs/
          572     svn/trunk/include/
          

          Taille du dépôt SVN sur le serveur

          $ du -sk *
          k *
          16      conf
          4       dav
          641044  db
          4       format
          40      hooks
          12      locks
          4       README.txt
          

          Vraie migration sur le serveur

          $ svnadmin create --fs-type fsfs /var/lib/svn/web
          $ svnadmin create --fs-type fsfs /var/lib/svn/admins
          $ svnadmin create --fs-type fsfs /var/lib/svn/ca
          $ cvs2svn  --force-branch start --encoding=iso8859-15 --existing-svnrepos -s /var/lib/svn/web /var/lib/cvs.old
          
          cvs2svn Statistics:
          ------------------
          Total CVS Files:             14658
          Total CVS Revisions:         42648
          Total Unique Tags:              14
          Total Unique Branches:          12
          CVS Repos Size in KB:       687917
          Total SVN Commits:           10547
          First Revision Date:    Tue Jul 27 17:13:21 1999
          Last Revision Date:     Sun Oct 22 05:03:16 2006
          ------------------
          Timings:
          ------------------
          pass 1:   131 seconds
          pass 2:     6 seconds
          pass 3:     0 seconds
          pass 4:    20 seconds
          pass 5:    36 seconds
          pass 6:     2 seconds
          pass 7:     0 seconds
          pass 8:  3384 seconds
          total:   3582 seconds
          
          $ svn checkout svn+ssh://…@april.org/var/lib/svn/web
          $ svn checkout svn+ssh://…@april.org/var/lib/svn/admins
          $ svn checkout svn+ssh://…@april.org/var/lib/svn/ca
          
          $ grep binaire DIFF|grep -vE "\.(jpg|png|gif|doc|odt|pdf|xls|sxw|sxc|JPG|jpeg|bz2|avi|gz|zip|tar|sxi|odp|xcf|tgz|dia|vsd|mo|ttf|swf|ods)"
          Les fichiers binaires htdocs/dotproject/files/27/27547881427c929d2ba98 et htdocs.new/dotproject/files/27/27547881427c929d2ba98 sont différents.
          Les fichiers binaires htdocs/dotproject/modules/admin/kik et htdocs.new/dotproject/modules/admin/kik sont différents.
          
  • # 30 jours

    Posté par  . Évalué à 10.

    C'est une blague ?
    Ceux qui ont suivi un peu l'affaire se rappelleront que ça a commencé il y a au moins plus d'un an !

    Je n'ai recherché que sur Phoronix :
    - Décembre 2018, on en parle déjà, la RAM coute cher, migration de Python vers Golang : https://www.phoronix.com/scan.php?page=news_item&px=GCC-Reposurgeon-Py-To-Go-90
    - Mai 2019, un autre développeur, Maxim Kuvyrkov s'y essaie aussi : https://www.phoronix.com/scan.php?page=news_item&px=GCC-SVN-To-Git-May-2019
    - Mai 2019 toujours, esr change de machine : https://www.phoronix.com/scan.php?page=news_item&px=ESR-Threadripper-GCC-Git
    - Septembre 2019, ça avance un peu mais il y a encore du travail : https://www.phoronix.com/scan.php?page=news_item&px=GCC-SVN-To-Git-September-2019
    - Janvier 2020, on approche du but : https://www.phoronix.com/scan.php?page=news_item&px=GCC-Git-Possibly-This-Weekend
    - Janvier 2020, enfin il a réussi : https://www.phoronix.com/scan.php?page=news_item&px=GCC-Is-On-Git

    Donc je ne veux rien enlever à cette réussite, esr n'a pas travaillé là-dessus à plein temps pendant 1 an mais rapporter que ça n'a pris 30 jours, c'est faux.

    • [^] # Re: 30 jours

      Posté par  (site web personnel) . Évalué à -5.

      Ni lui ni moi n'avons écrit que ça lui a pris 30 jours.

      "La liberté est à l'homme ce que les ailes sont à l'oiseau" Jean-Pierre Rosnay

      • [^] # Re: 30 jours

        Posté par  . Évalué à 9.

        Alors je n'ai pas compris cette phrase :

        il raconte ses trente jours de hack

        • [^] # Re: 30 jours

          Posté par  (site web personnel, Mastodon) . Évalué à 7.

          It looked like time to scrap everything downstream of the first-stage stream parser (the simplest part, and the only one I was completely sure was correct) and rebuild the analyzer from first principles using what I had learned from all the recent failures.

          Là, il se rend compte que son truc ne marchera jamais comme il est.

          I made the fateful decision on 29 Nov 2019 and as the Duke of Wellington famously said, “It was a damned near-run thing.” If I had waited even a week longer to pull that trigger, we would probably have failed.

          Et hop, il décide d'en refaire une grande partie…

        • [^] # Re: 30 jours

          Posté par  (site web personnel) . Évalué à 10. Dernière modification le 25 janvier 2020 à 13:00.

          Oups, excuse-moi ! tu as raison. À force de réécriture je l'avais oublié — ce que c'est de vouloir tout dire en 5-6 lignes !… C'est 30 jours de rush final et 30 jours de maladie.

          "La liberté est à l'homme ce que les ailes sont à l'oiseau" Jean-Pierre Rosnay

    • [^] # Re: 30 jours

      Posté par  (site web personnel) . Évalué à 6.

      Dans les archives on retrouves des traces des travaux en 2015:

      https://gcc.gnu.org/ml/gcc/2015-08/msg00226.html

      Ça fait un moment que ça traîne, mais ça s'est accéléré cette dernière année car les devs en avaient un peu marre que ça tourne en rond, d'où la deadline décidée au Cauldron 2019: https://gcc.gnu.org/wiki/GitConversion

  • # Port d'armes

    Posté par  (site web personnel) . Évalué à 10.

    Je remercie cette conversion (et surout le coup de fatigue qui s'ensuivit) d'avoir mis ESR hors service pour une manifestation pro-armes.

    I’m getting better now. But I had planned to go to the big pro-Second Amendment demonstration in Richmond on Jan 20th and had to bail at the last minute because I was too sick to travel.

    Oui oui, on est que lundi…

  • # Support de reposurgeon et remarques sur les migrations

    Posté par  . Évalué à 4.

    Bonjour,

    Reposurgeon pourrait être un outil tout à fait utile étant donné les failles / manque de fonctionnalités que l'on trouve dans la plupart des autres outils connus.
    Compte tenu de l'auteur et des expériences sur lesquelles il se base, on peut imaginer qu'il gère un très grand nombre de cas.

    Il faut noter que la documentation du projet liste et commente (ok, ça ressemble à un plaidoyer pro domo) les outils existants. Ca peut faire gagner du temps.
    Le point bloquant est qu'il me semble manquer d'une communauté d'utilisateurs, avec les possibilités de support qui vont avec.

    Néanmoins, même si l'outil est documenté, il ne me semble pas évident de l'exploiter tant la doc semble réalisée par un geek pour les geeks. J'entends par là des gens qui, en l'occurrence, connaissent par coeur les arcanes du VCS soure et du VCS cible.

    Reste que la complexité d'une migration d'un VCS vers un autre ne dépend pas que de la complexité de chacun des 2 outils, mais aussi (surtout ?) des élucubrations réalisées par les développeurs qui peuvent conduire à un historique des plus complexes. Et je ne parle même pas de ceux qui mettent en conf des objets temporaires (dont ils oublient ensuite l'existence) ou des fichiers / arborescences vides dont ils oublient et l'existence et l'intérêt. Quand ce genre de "truc" s'est produit très tôt dans l'histoire du projet et que les intervenants ont beaucoup bougé… Plus personne n'est capable de déterminer si oui ou non il faut conserver ou oublier.

    Bref, eu égard aux pratiques douteuses de certains projets, au manque de règles ou/et de contrôle du respect des règles, j'ai des doutes sur la faisabilité d'un outil tous usages, qui permet une migration en une fois de tout un historique.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.