Skip to content
Snippets Groups Projects
Commit 4877dc00 authored by Arnaud Levy's avatar Arnaud Levy
Browse files

tweaks

parent 67fd7b84
No related branches found
No related tags found
No related merge requests found
......@@ -39,7 +39,7 @@ class Communication::Website::GitFile < ApplicationRecord
end
def should_update?
!synchronized_with_git? || previous_path != path || previous_sha != sha
previous_path != path || previous_sha != sha
end
def should_destroy?
......@@ -54,12 +54,11 @@ class Communication::Website::GitFile < ApplicationRecord
def sha
# Git SHA-1 is calculated from the String "blob <length>\x00<contents>"
# Source: https://alblue.bandlem.com/2011/08/git-tip-of-week-objects.html
data = to_s
OpenSSL::Digest::SHA1.hexdigest "blob #{data.bytesize}\x00#{data}"
OpenSSL::Digest::SHA1.hexdigest "blob #{to_s.bytesize}\x00#{to_s}"
end
def to_s
ApplicationController.render(
@to_s ||= ApplicationController.render(
template: "admin/#{about.class.name.underscore.pluralize}/#{identifier}",
layout: false,
assigns: { about.class.name.demodulize.downcase => about }
......
......@@ -8,8 +8,9 @@ module WithGit
dependent: :destroy
end
# Needs override
def git_path_static
''
raise NotImplementedError
end
# Overridden if websites relation exists
......
......@@ -17,6 +17,7 @@ class Git::Providers::Github
def update_file(path, previous_path, content)
file = find_in_tree previous_path
return if file.nil?
batch << {
path: previous_path,
mode: file[:mode],
......@@ -43,8 +44,7 @@ class Git::Providers::Github
end
def push(commit_message)
return unless valid?
return if batch.empty?
return if !valid? || batch.empty?
new_tree = client.create_tree repository, batch, base_tree: tree[:sha]
commit = client.create_commit repository, commit_message, new_tree[:sha], branch_sha
client.update_branch repository, default_branch, commit[:sha]
......
......@@ -22,6 +22,7 @@ class Git::Repository
protected
# TODO add gitlab
def provider
@provider ||= Git::Providers::Github.new(website&.access_token, website&.repository)
end
......
......@@ -8,12 +8,12 @@ Les publications doivent se font en asynchrone parce qu'elles peuvent être long
Certains objets peuvent appartenir à plusieurs websites, donc plusieurs repositories, comme par exemple les programs.
Certains objets ont des dépendances, par exemple les pages enfants, les auteurs ou les catégories.
Certains objets ont des dépendances, par exemple les pages enfants, les auteurs, les catégories ou les médias.
Les fichiers renommés doivent être déplacés sur git.
Les fichiers supprimés ou dépubliés doivent être supprimés sur git.
Il faut veiller à limiter le nombre de commits, et éviter les commits vides.
Il faut veiller à limiter le nombre de commits et à éviter les commits vides.
## Architecture
......@@ -48,7 +48,7 @@ Ce flux cause un problème majeur : tout ce qui est analysé disparaît en async
### Version 2
Après l'enregistrement d'un objet, il faut, pour chaque website, lancer une tâche asynchrone de synchronisation.
Après l'enregistrement d'un objet, il faut lancer une tâche asynchrone de synchronisation.
Cette tâche est lancée par les controllers, et intégrée dans le partial `WithGit`.
```
def create
......@@ -64,7 +64,7 @@ def update
end
def destroy
@page.save_and_sync
@page.destroy_and_sync
end
```
......@@ -76,8 +76,8 @@ def reorder
pages.first.sync_with_git
end
```
TODO gérer la suppression correctement
TODO vérifier que tous les cas de déplacement sont correctement gérés.
TODO gérer la suppression correctement.
## Code
......@@ -88,7 +88,7 @@ Le website a un trait WithRepository qui gère son rapport avec le repository Gi
### Objets exportables vers Git
Tous les objets qui doivent être exportés vers Git :
- doivent utiliser le partial `WithGit`, qui gère l'export vers les repositories des objets et de leurs dépendances
- doivent utiliser le concern `WithGit`, qui gère l'export vers les repositories des objets et de leurs dépendances
- doivent présenter une méthode `websites`, éventuellement avec un seul website dans un tableau
- peuvent intégrer le concern `WithMedia` s'il utilise des médias (`featured_image` et/ou images dans des rich texts)
- peuvent présenter une méthode `static_files` qui liste les identifiants des git_files à générer, pour les objets qui créent plusieurs fichiers
......@@ -110,8 +110,8 @@ Pour cela, le git_file dispose des propriétés suivantes :
Pour informer sur les actions à mener, il dispose des méthodes interrogatives suivantes :
- synchronized_with_git? (pour évaluer l'intégrité vs le repository)
- should_create? (pour savoir s'il faut regénérer ou pas)
- should_update? (pour savoir s'il faut regénérer ou pas)
- should_create? (pour savoir s'il faut créer ou pas)
- should_update? (pour savoir s'il faut régénérer ou pas)
- should_destroy? (pour savoir s'il faut supprimer)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment