IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby Discussion :

Traduction Ruby/PHP (graphique GIT)


Sujet :

Ruby

  1. #1
    Membre régulier Avatar de luigifab
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 66
    Points : 73
    Points
    73
    Par défaut Traduction Ruby/PHP (graphique GIT)
    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 ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je ne fais pas de PHP donc je pourrai pas te dire si ton code est juste ou pas.
    Par contre je peux essayer de traduire ça en pseudo-code:

    Code : 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_head(space, commit, commits_by_scmid)
      # commits_by_scmid serait ta variable $collection dans ta version PHP
      # Avec la valeur de commit.scmid comme référence
      stack = [
        [space, commits_by_scmid[commit.scmid]]
      ]
      max_space = space
     
      # until est une boucle
      # Tant que stack (pile) n'est pas empty (vide) on continue la boucle
      until stack.empty?
     
        # On retire le dernier élément de stack (pile)
        space, commit = stack.pop
     
        # Si commit[:space] vaut nil
        # on attribue la valeur space à commit[:space]
        # nil est comme null en pHP qui veut dire absence de valeur
        commit[:space] = space if commit[:space].nil?
     
        # On retire 1 à space
        space -= 1
     
        # commit est un Hash comme un tableau associatif en PHP
        # On prend la clef :parent_scmids qui pourrait être une chaîne de caractère
        # et on parcourt cette collection avec each_with_index
        commit[:parent_scmids].each_with_index do |parent_scmid, parent_index|
     
          # On cherche l'index dans la collection commits_by_scmid
          parent_commit = commits_by_scmid[parent_scmid]
     
          # Si parent_commit est différent de nil (null en PHP) ou false
          # Et si parent_commit[:space] est nil (null en PHP)
          if parent_commit and parent_commit[:space].nil?
            stack.unshift [space += 1, parent_commit]
          end
        end
     
        # Si space est supérieur à max_space on redéfinit max_space avec la valeur space
        max_space = space if max_space < space
      end
      # Fin de la boucle until
     
      # On renvoit le valeur de max_space
      max_space
    end
    @+

  3. #3
    Membre régulier Avatar de luigifab
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 66
    Points : 73
    Points
    73
    Par défaut
    Yeah, je crois que j'ai capté le soucis en lisant tes commentaires...
    Je reprends mon code de suite... avant de reviendre ici.

  4. #4
    Membre régulier Avatar de luigifab
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 66
    Points : 73
    Points
    73
    Par défaut
    Et voilà le code est corrigé.
    Et faite j'y étais presque ! Merci beaucoup donove :)

    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
    private function indexCols($space, $commit, $collection) {
     
    	$stack = array(array($space, $commit));
    	$max = $space;
     
    	while (!empty($stack)) {
     
    		list($space, $commit) = array_pop($stack);
     
    		if (!is_int($commit->getSpace()))
    			$commit->setSpace($space);
     
    		$space -= 1;
     
    		foreach ($commit->getParents() as $parent) {
     
    			$parent = $collection->getItemByColumnValue('revision', $parent);
     
    			if (is_object($parent) && !is_int($parent->getSpace())) {
    				$space += 1;
    				array_unshift($stack, array($space, $parent));
    			}
     
    			$parent = null;
    			$max = ($space > $max) ? $space : $max;
    		}
    	}
     
    	return $max;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Traduction en PHP
    Par mdh12 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/12/2008, 14h26
  2. Réponses: 2
    Dernier message: 31/12/2007, 12h39
  3. [ODBC] Requêteur PHP graphique
    Par DarkBlaste dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 31/08/2007, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo