use data links for git graph images
[phpgitweb.git] / htdocs / lib / graph.class.php
index 33c36b39e0d0d301c265455f9afc67a2a7860e95..0906391d77cdcbb1e92bfc74a8c79b6e18426e07 100644 (file)
@@ -42,13 +42,16 @@ class graph_data_generator {
                }
                unset($branch);
                if($existing)
-                       continue;
+                       return;
+               $name_arr = array();
+               if($name)
+                       $name_arr[] = $name;
                $this->data['branches'][count($this->data['branches'])] = array(
                        "id" => $this->brach_id++,
                        "uid" => $this->branch_uid++,
                        "active" => true,
                        "sticky" => true,
-                       "name" => array($name),
+                       "name" => $name_arr,
                        "next" => $first_id,
                        "pre_merge" => false
                );
@@ -147,7 +150,7 @@ class graph_data_generator {
                                $branch['active'] = false;
                                $commit['dot_type'] = self::DOT_TYPE_INIT;
                        }
-                       $branch['next'] = (array_key_exists('parent', $commit) ? $commit['parent'][0] : null);
+                       $branch['next'] = ((array_key_exists('parent', $commit) && count($commit['parent'])) ? $commit['parent'][0] : null);
                        $branch['pre_merge'] = false;
                        $this->data['ubranches'][$branch['uid']] = $this->data['branches'][$branch['id']-1];
                        
@@ -291,14 +294,19 @@ class graph_image_generator {
                );
        }
        
-       public function generate($data) {
+       public function generate($data, $return = false) {
                if(!GitConfig::GITGRAPH_ENABLE)
                        return;
                $data = $this->parse_data($data);
                if(!$data) {
+                       if($return)
+                               return null;
                        header('Content-Type: text/plain');
                        die(base64_decode("ICAgIC0tLS0tLS0tOi0tLS0tLS0tDQogICAgICAgICAgLC0iLC5fX19fX19fIC8NCiAgICAgICAgIC8gKSB8ICAgLC0tLS0nXA0KICAgICAgICAgXC9fX3wuLSINCiAgICAgICAgLl8vL19cXF8NCk5vdCB3aGF0IHlvdSBleHBlY3RlZCwgZWVlaD8="));
                }
+               if($data['header']) {
+                       return $this->display_header($data['data'], $return);
+               }
                
                $count = $data['count'];
                if($count > $this->max_branches)
@@ -311,12 +319,21 @@ class graph_image_generator {
                
                imagecolortransparent($this->image, $transparentIndex);
 
-               header('Content-Type: image/png');
-               imagepng($this->image);
+               if($return) {
+                       ob_start();
+                       imagepng($this->image);
+                       $ret = ob_get_contents();
+                       ob_end_clean();
+               } else {
+                       header('Content-Type: image/png');
+                       imagepng($this->image);
+                       $ret = null;
+               }
                imagedestroy($this->image);
+               return $ret;
        }
        
-       private function display_header($header) {
+       private function display_header($header, $return = false) {
                $header = explode("//",$header);
                $count = $header[0];
                $header = array_slice($header, 1);
@@ -344,11 +361,21 @@ class graph_image_generator {
                        $color = imagecolorallocatealpha($image, $color[0], $color[1], $color[2], 0);
                        imagettftext($image, 8, 28, ($head[0]-1) * $this->size + 10, $this->header_height-2, $color, realpath(dirname(__FILE__)."/../")."/res/arial.ttf", $name);
                }
-               if(!$branches) die();
+               if(!$branches) return null;
                imagecolortransparent($image, $transparentIndex);
-               header('Content-Type: image/png');
-               imagepng($image);
+               
+               if($return) {
+                       ob_start();
+                       imagepng($image);
+                       $ret = ob_get_contents();
+                       ob_end_clean();
+               } else {
+                       header('Content-Type: image/png');
+                       imagepng($image);
+                       $ret = null;
+               }
                imagedestroy($image);
+               return $ret;
        }
        
        private function parse_data($data) {
@@ -356,12 +383,16 @@ class graph_image_generator {
                        $data = base64_decode($data);
                if(!preg_match("/^([0-9]+)([abc]{1})([0-9]+)\(([^\)]*)\)([a-z0-9,\|]*)(\(([^\)]*)\)|)/i", $data, $matches)) {
                        if(preg_match("/head:(.*)/i", $data, $matches)) {
-                               $this->display_header(substr($data, strlen("head:")));
+                               $cdata = array();
+                               $cdata['header'] = true;
+                               $cdata['data'] = substr($data, strlen("head:"));
+                               return $cdata;
                        }
                        return null;
                }
                
                $data = array();
+               $data['header'] = false;
                $data['dot'] = array();
                $data['dot']['pos'] = $matches[1];
                $data['dot']['type'] = $matches[2];