Bonjour !
Redmine est capable de générer une jolie image représentant les branches d'un dépôt GIT.
Développant un module pour Magento en PHP permettant de faire joujou avec GIT, je souhaite afficher également une jolie image.
J'ai récupéré et adapter le code javascript, pas de soucis de ce côté.
En revanche, si je ne me trompe pas trop, il semblerait que la détermination de la branche se fait en Ruby dans les deux méthodes suivantes.
Code ruby : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 def index_commits(commits, heads) return nil if commits.nil? or commits.first.parents.nil? refs_map = {} heads.each do |head| refs_map[head.scmid] ||= [] refs_map[head.scmid] << head end commits_by_scmid = {} commits.reverse.each_with_index do |commit, commit_index| commits_by_scmid[commit.scmid] = { :parent_scmids => commit.parents.collect { |parent| parent.scmid }, :rdmid => commit_index, :refs => refs_map.include?(commit.scmid) ? refs_map[commit.scmid].join(" ") : nil, :scmid => commit.scmid, :href => block_given? ? yield(commit.scmid) : commit.scmid } end heads.sort! { |head1, head2| head1.to_s <=> head2.to_s } space = nil heads.each do |head| if commits_by_scmid.include? head.scmid space = index_head((space || -1) + 1, head, commits_by_scmid) end end # when no head matched anything use first commit space ||= index_head(0, commits.first, commits_by_scmid) return commits_by_scmid, space end def index_head(space, commit, commits_by_scmid) stack = [[space, commits_by_scmid[commit.scmid]]] max_space = space until stack.empty? space, commit = stack.pop commit[:space] = space if commit[:space].nil? space -= 1 commit[:parent_scmids].each_with_index do |parent_scmid, parent_index| parent_commit = commits_by_scmid[parent_scmid] if parent_commit and parent_commit[:space].nil? stack.unshift [space += 1, parent_commit] end end max_space = space if max_space < space end max_space end
index_commits permet de préparer les données qui seront utilisées par le programme javascript.
index_head permet de dire que tel commit et dans telle branche (branche 0, branche 1...).
Je n'arrive pas à traduire cela en PHP.
Voici ce que j'ai réussi à fabriquer comme équivalent de la méthode index_head.
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 function getCols($space, $commit, $collection) { $stack = array(array($space, $commit)); $max = $space; if (!empty($stack)) { list($space, $commit) = array_pop($stack); if (!is_int($commit->getSpace())) $commit->setSpace($space); $space -= 1; foreach ($commit->getParents() as $parent) { foreach ($collection as $test) { if ($test->getRevision() == $parent) { $parent = $test; break; } } if (is_object($parent) && !is_int($parent->getSpace())) { $space += 1; array_unshift($stack, array($space, $parent)); } $parent = null; } } return ($max < $space) ? $space : $max; } foreach ($commits as $commit) { if (!empty($commit->getRefs())) { foreach ($commit->getRefs() as $ref) { if (strpos($ref, 'tag:') === false) $space = getCols($space + 1, $commit, $this->items); } } }
Le soucis, c'est que cela ne me renseigne pas le numéro de la branche pour tous les commits.
Seul les commits de tête sont renseignés, et encore je n'ai pas le bon résultat.
Quelqu'un peu t-il m'aider déjà à me dire si la traduction Ruby/PHP est correcte ?
Partager