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.