-
Notifications
You must be signed in to change notification settings - Fork 11
/
gerda.php
157 lines (127 loc) · 5.91 KB
/
gerda.php
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<?php
/**
* Основной рабочий скрипт Sijeko Gerda.
*
* @author MaximAL
* @author DeadWoroz
* @author AlexDeg
* @since 2017-01-13 Выложено на Гитхаб
* @since 2016-11-23 Первая рабочая версия
* @link http://sijeko.ru
*/
// Читаем настройки
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'settings.php');
mb_internal_encoding('utf-8');
// Версия
define('GERDA_VERSION', '1.0');
//// Поехали!
echo 'Генератор коммитов Sijeko Gerda', PHP_EOL;
echo 'v', GERDA_VERSION, ' © DeadWoroz, AlexDeg, MaximAL, Sijeko 2016', PHP_EOL, PHP_EOL;
// Валидация карты коммитов
if (!validateCommitMap($commits)) {
echo 'Карта коммитов не ок:', PHP_EOL, implode('|' . PHP_EOL, $commits), '|', PHP_EOL, PHP_EOL;
echo 'Должно быть ровно 7 строк по 52 символа каждая: 7 дней в неделе, 52 недели в году.', PHP_EOL;
// Говорим операционной системе об ошибке
exit(1);
}
echo 'Карта коммитов ок:', PHP_EOL, implode('|' . PHP_EOL, $commits), '|', PHP_EOL, PHP_EOL;
// Считаем дни
$today = new \DateTime();
echo ' Сегодня: ', $today->format('c'), ' (неделя №', $today->format('W'), ')', PHP_EOL;
$todayYearAgo = clone $today;
$todayYearAgo->sub(new \DateInterval('P1Y'));
echo ' Год назад было: ', $todayYearAgo->format('c'),
' (неделя №', $todayYearAgo->format('W'), ')', PHP_EOL;
echo ' Это был день: ', getWeekDay($todayYearAgo), PHP_EOL;
$thatSunday = clone $todayYearAgo;
$thatSunday->sub(new \DateInterval('P' . $todayYearAgo->format('w') . 'D'));
echo 'Воскресенье той недели было: ', $thatSunday->format('c'), PHP_EOL;
// Подсчёт и генерация коммитов
echo 'Считаем коммиты…', PHP_EOL;
$commitsToMake = generateCommits($commits, $thatSunday);
$command = '# Генерируем коммиты, чтобы карта коммитов на Гитхабе выглядела так:' . PHP_EOL . PHP_EOL;
$command .= '# ' . implode('|' . PHP_EOL . '# ', $commits) . '|' . PHP_EOL . PHP_EOL;
$command .= 'rm -rf .git' . PHP_EOL;
$command .= 'git init' . PHP_EOL . PHP_EOL;
$command .= 'echo "# Gerda" > gerda.md' . PHP_EOL . PHP_EOL;
foreach ($commitsToMake as $day => $count) {
//echo "\t", $day, ' нужно коммитов: ', $count, "\t\t",
// 'git commit -m "Gerda" --date="', $day, 'T12:00:00+0300"', PHP_EOL;
$command .= 'echo "\n## ' . $day . '" >> gerda.md' . PHP_EOL;
for ($commit = 0; $commit < $count; $commit++) {
$command .= "\t" . 'echo "* Gerda №'. ($commit + 1) . '" >> gerda.md' . PHP_EOL;
$command .= "\t" . 'git add gerda.md' . PHP_EOL;
$command .= "\t" . 'git commit -m "Gerda №'. ($commit + 1) . '" --date="' . $day . 'T12:' .
($commit < 10 ? '0' : '') . $commit . ':00+0300"' . PHP_EOL;
$command .= PHP_EOL;
}
$command .= PHP_EOL;
}
$command .= 'git remote add origin ' . $origin . PHP_EOL;
$command .= 'git push -u origin master -f' . PHP_EOL;
echo 'Пишем файл с командами: ', $commandFile, PHP_EOL;
file_put_contents($commandFile, $command);
chmod($commandFile, 0740);
echo 'Адрес репозитория: ', $origin, PHP_EOL;
// Успешное завершение
exit(0);
//// Вспомогательные функции
/**
* Получить название дня недели.
*
* @param \DateTime $dateTime Нужная дата
* @return string Возвращает русское название дня недели для данной даты.
*/
function getWeekDay($dateTime)
{
static $weekDays = ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'];
return $weekDays[intval($dateTime->format('w'))];
}
/**
* Проверка карты коммитов.
*
* @param string[] $map Карта коммитов
* @return bool Возвращает `true` при успешной валидации, и `false` в противном случае.
*/
function validateCommitMap($map)
{
if (count($map) !== 7) {
//throw new \RuntimeException('В массиве должно быть ровно 7 элементов по 52 символа каждый.');
return false;
}
foreach ($map as $str) {
if (strlen($str) !== 52) {
//throw new \RuntimeException('В массиве должно быть ровно 7 элементов по 52 символа каждый.');
return false;
}
}
return true;
}
/**
* Генерация набора коммитов.
*
* @param string[] $map Карта коммитов в виде массива из 7 строк по 52 символа каждая
* @param \DateTime $firstSunday Дата последнего воскресенья год назад
* @return array Возвращает массив, где ключ — дата текстом (Y-m-d), а значение — количество коммитов в этот день.
*/
function generateCommits($map, $firstSunday)
{
if (!validateCommitMap($map)) {
throw new \RuntimeException('В массиве должно быть ровно 7 элементов по 52 символа каждый.');
}
$commits = [];
$count = 7 * 52;
$date = clone $firstSunday;
// Идём по всем символам карты коммитов, вычисляя неделю и день недели
for ($day = 0, $weekDay = 0; $day < $count; $day++) {
$week = intval($day / 7);
$char = substr($map[$weekDay], $week, 1);
if ($char !== ' ') {
$commits[$date->format('Y-m-d')] = $char === '#' ? 20 : 10;
}
// Переходим к следующему дню
$date->add(new DateInterval('P1D'));
$weekDay = ($weekDay + 1) % 7;
}
return $commits;
}