From 2c5f34c071d9b2ba1d80e528b951e9cdb156d014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Mon, 4 Aug 2014 15:42:24 +0200 Subject: [PATCH] More changes because of case-sensitive filesystems -.- --- .../extendedgitgraph/ExtendedGitGraph.php | 494 ++++++++++++++++++ .../components/extendedgitgraph/demo.php | 34 ++ .../components/extendedgitgraph/script.js | 25 + .../components/extendedgitgraph/style.css | 90 ++++ .../components/extendedgitgraph/template.php | 109 ++++ www/protected/config/env/dev.php | 8 - www/protected/config/env/prod.php | 8 - www/protected/config/main.php | 5 +- www/protected/controllers/LogController.php | 2 +- .../controllers/MsmainController.php | 2 +- 10 files changed, 758 insertions(+), 19 deletions(-) create mode 100644 www/protected/components/extendedgitgraph/ExtendedGitGraph.php create mode 100644 www/protected/components/extendedgitgraph/demo.php create mode 100644 www/protected/components/extendedgitgraph/script.js create mode 100644 www/protected/components/extendedgitgraph/style.css create mode 100644 www/protected/components/extendedgitgraph/template.php diff --git a/www/protected/components/extendedgitgraph/ExtendedGitGraph.php b/www/protected/components/extendedgitgraph/ExtendedGitGraph.php new file mode 100644 index 0000000..7615bfb --- /dev/null +++ b/www/protected/components/extendedgitgraph/ExtendedGitGraph.php @@ -0,0 +1,494 @@ +username = $usr_name; + + set_time_limit(300); // 5min + } + + public function authenticate($auth_key, $client_id, $client_secret) { + $url = sprintf(self::API_TOKEN, $client_id, $client_secret, $auth_key); + $result = file_get_contents($url); + + $result = str_replace('access_token=', '', $result); + $result = str_replace('&scope=&token_type=bearer', '', $result); + + setToken($result); + } + + public function setToken($token) { + $this->token = $token; + $this->tokenHeader = 'access_token=' . $token . '&token_type=bearer'; + } + + public function collect() { + ob_implicit_flush(true); + ob_end_flush(); + + //-------------------------------- + + $this->listRepositories(); + + $this->listAllCommits(); + + $this->save(); + + //-------------------------------- + + $this->output_flushed($this->getRemainingRequests() . ' Requests remaining'); + } + + private function listRepositories() { + $page = 1; + $url = sprintf(self::API_REPOSITORIESLIST . '&' . $this->tokenHeader, $this->username, $page); + + $result = $this->getJSON($url); + + $repo_list = array(); + + while (! empty($result)) { + foreach ($result as $result_repo) { + $repo_list[] = $this->parseRepoJSON($result_repo); + + $this->output_flushed("Found Repo: " . $result_repo->{'full_name'}); + } + + //########## + + $url = sprintf(self::API_REPOSITORIESLIST . '&' . $this->tokenHeader, $this->username, ++$page); + + $result = $this->getJSON($url); + } + + $this->repositories = $repo_list; + } + + private function getJSON($url) { + $options = array('http' => array('user_agent'=> $_SERVER['HTTP_USER_AGENT'])); +// $options = array('http' => array('user_agent'=> 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36')); + $context = stream_context_create($options); + $response = file_get_contents($url, false, $context); + + return json_decode($response); + } + + private function getRemainingRequests() { + $json = $this->getJSON(self::API_RATELIMIT . '?' . $this->tokenHeader); + + return $json->{'resources'}->{'core'}->{'remaining'}; + } + + private function listAllCommits() { + $this->commits = array(); + + foreach($this->repositories as $repo) { + $this->listCommits($repo); + } + } + + private function listCommits($repo) { + $page = 1; + $url = $repo['commits_url'] . '?per_page=100&page=' . $page . '&author=' .$this->username . '&' .$this->tokenHeader; + + $result = $this->getJSON($url); + + $commit_list = array(); + + while (! empty($result)) { + foreach ($result as $result_commit) { + $commit_list[] = $this->parseCommitJSON($repo, $result_commit); + } + + $this->output_flushed("Found 100 Commits from " . $repo['full_name']); + + //########## + + $url = $repo['commits_url'] . '?per_page=100&page=' . ++$page . '&author=' .$this->username . '&' .$this->tokenHeader; + + $result = $this->getJSON($url); + } + + $this->commits = array_merge($this->commits, $commit_list); + } + + private function parseRepoJSON($json) { + return + [ + 'id' => $json->{'id'}, + 'name' => $json->{'name'}, + 'full_name' => $json->{'full_name'}, + 'owner' => $json->{'owner'}->{'login'}, + 'owner_id' => $json->{'owner'}->{'id'}, + 'owner_avatar-url' => $json->{'owner'}->{'avatar_url'}, + 'owner_gravatar-id' => $json->{'owner'}->{'gravatar_id'}, + 'url' => $json->{'html_url'}, + 'language' => $json->{'language'}, + 'url' => $json->{'html_url'}, + 'creation' => DateTime::createFromFormat(DateTime::ISO8601, $json->{'created_at'}), + 'size' => $json->{'size'}, + 'default_branch' => $json->{'default_branch'}, + 'commits_url' => str_replace('{/sha}', '', $json->{'commits_url'}), + ]; + } + + private function parseCommitJSON($repo, $json) { + return + [ + 'sha' => $json->{'sha'}, + 'author_name' => $json->{'commit'}->{'author'}->{'name'}, + 'author_mail' => $json->{'commit'}->{'author'}->{'email'}, + 'author_login' => $json->{'author'}->{'login'}, + 'author_id' => $json->{'author'}->{'id'}, + 'sha' => $json->{'sha'}, + 'message' => $json->{'commit'}->{'message'}, + 'repository' => $repo, + 'date' => DateTime::createFromFormat(DateTime::ISO8601, $json->{'commit'}->{'author'}->{'date'}), + ]; + } + + private function save() { + $this->output_flushed("Start saving data"); + + $save = serialize( + [ + 'repositories' => $this->repositories, + 'commits' => $this->commits, + ]); + + file_put_contents(self::FILE_RAW_DATA, $save); + + $this->output_flushed('Finished saving data'); + } + + public function output_flushed($txt) + { + echo '[' . date('H:i.s') . '] ' . $txt . "
"; + } + + public function loadData() { + $data = unserialize(file_get_contents(self::FILE_RAW_DATA)); + + $this->repositories = $data['repositories']; + $this->commits = $data['commits']; + } + + public function generate($year) { + $ymap = $this->generateYearMap($year); // unused on purpose (template.php needs it) + + $ymapmax = $this->getMaxCommitCount(); // unused on purpose (template.php needs it) + + ob_start(); + include('template.php'); + $returned = ob_get_contents(); + ob_end_clean(); + + return $returned; + } + + public function generateAndSave() { + $result = ''; + + foreach($this->getYears() as $year) { + $result.= $this->generate($year); + $result.= '
'; + } + + $this->generateCommitMap(); + + file_put_contents(self::FILE_FINISHED_DATA, + serialize( + [ + 'creation' => new DateTime(), + 'total' => count($this->commits), + 'repos' => count($this->repositories), + 'streak' => $this->getLongestStreak(), + 'streak_start' => $this->getLongestStreakStart(), + 'streak_end' => $this->getLongestStreakEnd(), + 'max_commits' => $this->getMaxCommits(), + 'max_commits_date' => $this->getMaxCommitsDate(), + 'avg_commits' => $this->getAvgCommits(), + 'start' => $this->startdate, + 'end' => $this->enddate, + 'content' => $result, + ])); + + return $result; + } + + private function generateCommitMap() { + $this->commitmap = array(); + + $this->startdate = $this->getStartDate(); + $this->enddate = $this->getEndDate(); + + $date = clone $this->startdate; + while($date < $this->enddate) { + $this->commitmap[$date->format('Y-m-d')] = 0; + + $date = $date->modify("+1 day"); + } + + foreach ($this->commits as $commit) { + if(array_key_exists($commit['date']->format('Y-m-d'), $this->commitmap)) + $this->commitmap[$commit['date']->format('Y-m-d')]++; + } + } + + private function getStartDate() { + $date = $this->commits[0]['date']; + + foreach($this->commits as $commit) { + if ($commit['date'] < $date) { + $date = clone $commit['date']; + } + } + + return new DateTime($date->format('Y-m-d')); + } + + private function getEndDate() { + $date = $this->commits[0]['date']; + + foreach($this->commits as $commit) { + if ($commit['date'] > $date) { + $date = clone $commit['date']; + } + } + + return new DateTime($date->format('Y-m-d')); + } + + private function getCommitsForDate($d) { + $v = $d->format('Y-m-d'); + if (array_key_exists($v, $this->commitmap)) + return $this->commitmap[$d->format('Y-m-d')]; + else + return 0; + } + + private function getLongestStreak() { + /* @var $curr DateTime */ + /* @var $end DateTime */ + $curr = clone $this->startdate; + $end = clone $this->enddate; + + $streak_curr = 0; + $streak_max = 0; + + while ($curr <= $end) { + if ($this->getCommitsForDate($curr) > 0) { + $streak_curr++; + } else { + $streak_max = max($streak_max, $streak_curr); + $streak_curr = 0; + } + + $curr = $curr->modify('+1 day'); + } + + $streak_max = max($streak_max, $streak_curr); + + return $streak_max; + } + + private function getLongestStreakStart() { + /* @var $curr DateTime */ + /* @var $end DateTime */ + $curr = clone $this->startdate; + $end = clone $this->enddate; + + $streak_curr_start = clone $curr; + $streak_max_start = null; + + $streak_curr = 0; + $streak_max = 0; + + while ($curr <= $end) { + if ($this->getCommitsForDate($curr) > 0) { + $streak_curr++; + } else { + if ($streak_curr > $streak_max) { + $streak_max = $streak_curr; + $streak_max_start = clone $streak_curr_start; + } + + $streak_curr = 0; + $streak_curr_start = clone $curr; + } + + $curr = $curr->modify('+1 day'); + } + + if ($streak_curr > $streak_max) { + $streak_max_start = clone $streak_curr_start; + } + + return $streak_max_start; + } + + private function getLongestStreakEnd() { + /* @var $curr DateTime */ + /* @var $end DateTime */ + $curr = clone $this->startdate; + $end = clone $this->enddate; + + $streak_max_end = null; + + $streak_curr = 0; + $streak_max = 0; + + while ($curr <= $end) { + if ($this->getCommitsForDate($curr) > 0) { + $streak_curr++; + } else { + if ($streak_curr > $streak_max) { + $streak_max = $streak_curr; + $streak_max_end = clone $curr; + } + + $streak_curr = 0; + } + + $curr = $curr->modify('+1 day'); + } + + if ($streak_curr > $streak_max) { + $streak_max_end = clone $curr; + } + + return $streak_max_end; + } + + private function getMaxCommits() { + /* @var $curr DateTime */ + /* @var $end DateTime */ + $curr = clone $this->startdate; + $end = clone $this->enddate; + + $max = 0; + + while ($curr <= $end) { + $max = max($max, $this->getCommitsForDate($curr)); + + $curr = $curr->modify('+1 day'); + } + + return $max; + } + + private function getMaxCommitsDate() { + /* @var $curr DateTime */ + /* @var $end DateTime */ + $curr = clone $this->startdate; + $end = clone $this->enddate; + + $max = 0; + $max_date = null; + + while ($curr <= $end) { + $c = $this->getCommitsForDate($curr); + if ($c >= $max) { + $max = $c; + $max_date = clone $curr; + } + $max = max($max, $this->getCommitsForDate($curr)); + + $curr = $curr->modify('+1 day'); + } + + return $max_date; + } + + private function getAvgCommits() { + /* @var $curr DateTime */ + /* @var $end DateTime */ + $curr = clone $this->startdate; + $end = clone $this->enddate; + + $max = array(); + + while ($curr <= $end) { + $max[] = $this->getCommitsForDate($curr); + + $curr = $curr->modify('+1 day'); + } + + $sum = array_sum($max); + $count = count($max); + + return $sum / $count; + } + + public function loadFinishedContent() { + $data = unserialize(file_get_contents(self::FILE_FINISHED_DATA)); + return $data['content']; + } + + public function loadFinishedData() { + $data = unserialize(file_get_contents(self::FILE_FINISHED_DATA)); + return $data; + } + + private function getMaxCommitCount() { + $max = 0; + + foreach($this->getYears() as $year) { + $max = max($max, max($this->generateYearMap($year))); + } + + return $max; + } + + private function generateYearMap($year) { + $ymap = array(); + + $date = new DateTime($year . '-01-01'); + while($date->format('Y') == $year) { + $ymap[$date->format('Y-m-d')] = 0; + + $date = $date->modify("+1 day"); + } + + foreach ($this->commits as $commit) { + if(array_key_exists($commit['date']->format('Y-m-d'), $ymap)) + $ymap[$commit['date']->format('Y-m-d')]++; + } + + return $ymap; + } + + public function getYears() { + $years = array(); + + foreach ($this->commits as $commit) { + if(! in_array($commit['date']->format('Y'), $years)) + $years[] = $commit['date']->format('Y'); + } + + asort($years); + + return $years; + } +} \ No newline at end of file diff --git a/www/protected/components/extendedgitgraph/demo.php b/www/protected/components/extendedgitgraph/demo.php new file mode 100644 index 0000000..fe6ca57 --- /dev/null +++ b/www/protected/components/extendedgitgraph/demo.php @@ -0,0 +1,34 @@ +authenticate('7e26c5f1621349c14a7d'); + +//$v->setToken('7b3f6443cdd4b2f92d75c4c8aa83cfda6c7ca3ce'); +//$v->collect(); + +$v->loadData(); + +?> + + + + + + + + + + + + + generateAndSave(); + echo $v->loadFinished(); + ?> + + \ No newline at end of file diff --git a/www/protected/components/extendedgitgraph/script.js b/www/protected/components/extendedgitgraph/script.js new file mode 100644 index 0000000..6b5e670 --- /dev/null +++ b/www/protected/components/extendedgitgraph/script.js @@ -0,0 +1,25 @@ +jQuery(document).ready(function ($) { + $('.svg-tip').fadeOut(0); + $('.svg-tip').css({opacity: 1}); + + $("rect").mouseenter( + function (event) { + $('.svg-tip').stop(true, true); + + $('.svg-tip').fadeIn(400); + + $('.svg-tip strong').html($(event.target).attr('hvr_header')); + $('.svg-tip span').html($(event.target).attr('hvr_content')); + + $('.svg-tip').css({left: $(event.target).position().left - $('.svg-tip').outerWidth() /2 - 2.5 + 9}); + $('.svg-tip').css({top: $(event.target).position().top - $('.svg-tip').outerHeight() - 10}); + + } + ); + $("rect").mouseleave( + function () { + $('.svg-tip').stop(true, true); + $('.svg-tip').fadeOut(400); + } + ); +}); \ No newline at end of file diff --git a/www/protected/components/extendedgitgraph/style.css b/www/protected/components/extendedgitgraph/style.css new file mode 100644 index 0000000..4d59c15 --- /dev/null +++ b/www/protected/components/extendedgitgraph/style.css @@ -0,0 +1,90 @@ +.git_list { + display: inline-block; + width: 715px; + height: 115px; + overflow: visible; +} + +.git_list text.caption { + font-size: 10px; + fill: #666; +} + +.git_list text.caption_month { + font-size: 8px; + fill: #BBB; +} + +.git_list text.caption_day { + font-size: 8px; + fill: #BBB; +} + +.svg-tip:after { + box-sizing: border-box; + position: absolute; + left: 50%; + height: 5px; + width: 5px; + bottom: -10px; + margin: 0px 0px 0px -5px; + content: " "; + border: 5px solid transparent; + border-top-color: rgba(0, 0, 0, 0.8); + -moz-border-top-colors: none; + -moz-border-right-colors: none; + -moz-border-bottom-colors: none; + -moz-border-left-colors: none; + border-image: none; +} + +.svg-tip { + padding: 5px; + background: none repeat scroll 0% 0% rgba(0, 0, 0, 0.8); + color: #BBB; + font-size: 12px; + position: absolute; + z-index: 99999; + text-align: center; + border-radius: 3px; + box-sizing: border-box; + opacity: 0; +} + +body { + background-color: white; + margin: 40px 0 0; +} + +.extGitGraphContainer { + background-color: #ECF0F1; + margin: 10px; + display: inline-block; + + border: 1px solid #E3E3E3; + border-radius: 4px; + box-shadow: 0px 0 1px rgba(0, 0, 0, 0.25) inset; +} + +.egg_footer { + margin-top: 5px; + + text-align: right; + margin-right: 5px; + margin-bottom: 5px; + + color: #FFF; + text-shadow: 0px 0px 8px #2C3E50, 0px 0px 8px #2C3E50; +} + +.egg_footer > a { + + text-decoration: none; + color: inherit; +} + +.egg_footer > a:hover { + text-decoration: none; + color: #2C3E50; + text-shadow: 0px 0px 8px #00F; +} \ No newline at end of file diff --git a/www/protected/components/extendedgitgraph/template.php b/www/protected/components/extendedgitgraph/template.php new file mode 100644 index 0000000..f1c29ce --- /dev/null +++ b/www/protected/components/extendedgitgraph/template.php @@ -0,0 +1,109 @@ + + + + + +
+ + + + 1 commit erreicht immer genau die erste stufe + + $week = 0; + while($date->format('Y') == $year) { + if ($date > new DateTime()) {// THE FUTURE, SPONGEBOB + while ($date->format('d') != $date->format('t')) { + if ($date->format('N') == 1 && $date->format('z') > 0) { + $week++; + } + $date = $date->modify("+1 day"); + } + $monthlist[$date->format('m') - 1][1] = $week + ($wday / 7); + + $date = $date->modify("+1 year"); // Kill + continue; + } + + $c_count = $ymap[$date->format('Y-m-d')]; + $color_idx = ceil(pow($c_count/$ymapmax, $exponent) * (count($COLORS)-1)); + $color = $COLORS[$color_idx]; + + $wday = ($date->format('N') - 1); + + if ($date->format('N') == 1 && $date->format('z') > 0) { + echo '', PHP_EOL; + $week++; + echo '', PHP_EOL; + } + + if ($date->format('d') == 1) { + $monthlist[$date->format('m') - 1][0] = $week + ($wday / 7); + } else if ($date->format('d') == $date->format('t')) { + $monthlist[$date->format('m') - 1][1] = $week + ($wday / 7); + } + + echo '', PHP_EOL; + + $date = $date->modify("+1 day"); + } + ?> + + + 0) { + $posx = (($monthlist[$i][0]+$monthlist[$i][1])/2) * $DIST_X; + echo '' . $MONTHS[$i] . ''; + } + } + + for($i = 0; $i < 7; $i++) { + echo '' . $DAYS[$i] . ''; + } + + echo '' . $year . ''; + + ?> + + + +
+    +
+ + +
\ No newline at end of file diff --git a/www/protected/config/env/dev.php b/www/protected/config/env/dev.php index ca5d2f8..9f42143 100644 --- a/www/protected/config/env/dev.php +++ b/www/protected/config/env/dev.php @@ -34,14 +34,6 @@ return [ ], ], - - 'params' => - [ - 'yii.debug' => true, - 'yii.traceLevel' => 3, - 'yii.handleErrors' => true, - ], - 'modules' => [ 'gii' => diff --git a/www/protected/config/env/prod.php b/www/protected/config/env/prod.php index c719d24..5bc27bd 100644 --- a/www/protected/config/env/prod.php +++ b/www/protected/config/env/prod.php @@ -23,13 +23,5 @@ return [ [ 'errorAction' => 'msmain/error', ], - - ], - - 'params' => - [ - 'yii.debug' => false, - 'yii.traceLevel' => 3, - 'yii.handleErrors' => false, ], ]; \ No newline at end of file diff --git a/www/protected/config/main.php b/www/protected/config/main.php index d7c422b..70a4a34 100644 --- a/www/protected/config/main.php +++ b/www/protected/config/main.php @@ -33,7 +33,7 @@ return ArrayX::merge( 'application.extensions.*', 'application.components.*', 'application.components.widgets.*', - 'application.components.extendedGitGraph.*', + 'application.components.extendedgitgraph.*', 'application.components.parsedown.*', 'bootstrap.components.*', 'bootstrap.behaviors.*', @@ -143,6 +143,9 @@ return ArrayX::merge( // using Yii::app()->params['paramName'] 'params' => [ + 'yii.debug' => defined('YII_DEBUG'), + 'yii.traceLevel' => 3, + 'yii.handleErrors' => defined('YII_DEBUG'), // this is used in contact page 'adminEmail' => 'kundenservice@mikescher.de', ], diff --git a/www/protected/controllers/LogController.php b/www/protected/controllers/LogController.php index 85e9935..493edc6 100644 --- a/www/protected/controllers/LogController.php +++ b/www/protected/controllers/LogController.php @@ -1,6 +1,6 @@ js_scripts[] = file_get_contents('protected/components/extendedGitGraph/script.js'); + $this->js_scripts[] = file_get_contents('protected/components/extendedgitgraph/script.js'); if(isset($_POST['SendMailForm'])) {