Opérations

pmeunier
Dec 3, 2023, 3:44 PM
I5GW7YC7OP3KUYY4UEI3H6VR3ISG6S5LWT5O3DALL5MTPT4E3MFAC

Dependencies

Change contents

  • edit in structure.md at line 60
    [2.3897]
    [2.3897]
    ## Channel
    Un channel est un graphe de pristine avec la liste des identifiants de patchs qui lui ont été appliqués.
  • edit in structure.md at line 67
    [2.3899]
    [2.3899]
    ## Arbre
    L'arbre est une représentation des répertoires et fichiers de la copie de travail qui sont suivis par Pijul. Les éléments (fichiers/répertoires) y sont nommés et ont un identifiant local unique, attribué aléatoirement quand ils sont enregistrés dans l'arbre. Deux dépôts, même clonés depuis la même origine, ont donc des identifiants de fichiers différents. Lorsque les éléments sont aussi dans le pristine, une table fait correspondre ces identifiants locaux aux sommets du graphe.
    # Remote
    Chaque channel génère à sa création un identifiant global unique. Les dépôts conservent un historique des channels avec lesquels ils interagissent, afin d'accéler les synchronisations futures.
  • edit in structure.md at line 80
    [2.4256]
    Le fait que la structure soit cyclique n'aide pas vraiment à comprendre le fonctionnement général. Dans l'ordre dans lequel un utilisateur rencontre les commandes:
    ## Add/Rm/Mv
    Add ajoute des éléments dans l'arbre, Rm les supprime et Mv les déplace.
    ## Record
    Record parcourt les chemins du pristine qui sont $\mathrm{FOLDER}$ et calcule les changements par rapport à l'arbre. Pour chaque fichier, record appelle diff, qui travaille sur les lignes, mais conserve une correspondance entre les lignes et les nœuds du graphe.
    ## Apply
    On applique un patch, en racommodant avec des arêtes $\mathrm{PSEUDO}$ les morceaux qui peuvent avoir été déconnectés par l'application du patch. Dans le cas d'un patch qui vient d'être produit localement, il faut mettre à jour l'*arbre* pour indiquer que tel sommet du pristine correspond à tel fichier local.
    ## Output
    Transformer le graphe du pristine en un ensemble de fichiers que l'on peut écrire sur le disque. Il s'agit d'un mélange d'algorithmes classiques (composantes connexes de Tarjan et DFS) pour détecter les conflits.
    ## Unrecord
    Enlever un patch d'un channel si aucun autre patch du channel ne dépend de lui. C'est presque le même algo que Apply, avec un certain nombre de subtilités liées aux conflits. Unrecord doit dans certains cas modifier le tree.
    ## Push/pull
    Mise à jour du remote, puis comparaison depuis le dernier état global commun, trouvé par dichotomie. Notons que dans des cas très défavorables ou les patchs sont les mêmes mais dans des ordres très différents, il est possible de ne trouver aucun état commun. Dans ce cas, le calcul peut prendre du temps, mais se fait uniquement en local (pas de latence réseau).
    Ensuite, on record un patch temporaire des changements en cours, on applique les nouveaux patchs, on fait un output, et on unrecord le patch temporaire.
  • replacement in diagramme.dot at line 8
    [2.4560][2.4560:4604]()
    Add[label="Add/Del/Mv (libpijul::fs)"];
    [2.4560]
    [2.4604]
    Add[label="Add/Rm/Mv (libpijul::fs)"];