Генератор коммитов для таймлайна (contribution graph) профиля GitHub с веб-интерфейсом.
Два режима:
- заполнение - случайное или фиксированное число коммитов в день в диапазоне дат, с фильтром по дням недели;
- текст - "рисует" коммитами заданный текст на таймлайне.
docker-compose up --build -dВеб-интерфейс: http://localhost:8087
- Указать URL репозитория (https) и токен.
- Выбрать языки - файлы-сниппеты этих языков попадут в коммиты.
- Настроить коммиты в день: случайное число "от–до" (по умолчанию 1–5) или фиксированное (макс. 99).
- Задать дату начала (по умолчанию год назад).
- Выбрать вкладку:
- Заполнение - дата окончания (по умолчанию сегодня) и дни недели;
- Текст - строка из английских букв и цифр (до 1000 символов) и шрифт.
- Превью - календарь активности в стиле GitHub, без обращения к репозиторию. Диапазон до года - один календарь; больше - отдельный календарь на каждый год.
- Пушим коммиты - клонирует репозиторий, докоммичивает недостающее и пушит; прогресс виден в логе на странице.
Нужен Personal Access Token (PAT):
- Fine-grained (рекомендуется): github.com/settings/personal-access-tokens -> Generate new token; Repository access - Only select repositories; Permissions -> Contents: Read and write, для ачивок дополнительно Issues и Pull requests: Read and write.
- Classic: github.com/settings/tokens -> scope
repo(даёт доступ ко всем репозиториям сразу).
Таймлайн GitHub - сетка: 7 строк (дни недели, сверху вниз: вс–сб) и ~52 столбца (недели). Один день = одна клетка; чем больше коммитов, тем темнее.
Дата коммита берётся из GIT_AUTHOR_DATE / GIT_COMMITTER_DATE, поэтому коммиты создаются задним числом за любой период. В режиме текста даты могут уходить и в будущее — такие клетки закрасятся на таймлайне, когда наступят соответствующие дни.
Текст рендерится выбранным пиксельным шрифтом (файлы в fonts/, сгенерированы из шрифтов FontStruct скриптом gen_fonts.py):
- 5x7 Pixel Slanted V3 (по умолчанию) - один регистр;
- 5x7 fixed dotmatrix ISO8859-1 — классическая точечная матрица;
- hd44780 5x8 — шрифт знакогенератора символьных LCD;
- Tom Thumb — миниатюрный 3*5.
Между символами 1 неделя, между словами 2 недели; длинный текст продолжается в следующие годы. Шрифты выше 7 клеток не поддерживаются, в неделе всего 7 дней.
Маска накладывается на календарь с недели даты начала (дата выравнивается вперёд на воскресенье). Для каждой закрашенной клетки создаётся заданное число коммитов.
Каждый коммит добавляет файл со сниппетом кода <ext>/<дата>_<номер>.<ext>. Язык выбирается наименее заполненный из отмеченных - чтобы языки имели равный вес в статистике профиля. Сниппеты всех языков одного размера.
- клонируем репозиторий во временную папку;
- автор коммитов - имя и noreply-email владельца токена, через GitHub API;
- считаем уже существующие коммиты по датам - повторный запуск не дублирует;
- докоммичиваем недостающее и пушим партиями по 500, GitHub индексирует не более ~1000 коммитов за пуш.
Важно! Чтобы коммиты попадали на таймлайн, email автора должен совпадать с email аккаунта GitHub, а репозиторий должен быть публичным или включён показ приватных контрибуций.
Блок "Ачивки профиля" под вкладками добавляет в прогон пуша бейджи профиля GitHub:
- Quickdraw - issue открывается и закрывается в течение пяти минут;
- YOLO - мерж PR без ревью; выпадает само на первом мерже Pull Shark или Pair;
- Pull Shark - серия PR с мержем до выбранного тира (2/16/128/1024); текущее число смердженных PR читается через Search API, PR от Pair идут в зачёт, за прогон создаётся не более 128 - остаток добирается следующими запусками; больше 128 PR за день не рекомендуется - GitHub ограничивает массовое создание контента (secondary rate limits), между PR сервис делает паузу;
- Pair Extraordinaire - коммиты с трейлером
Co-authored-by:в смердженных PR до выбранного тира (1/10/24/48).
Каждый PR несёт один обычный сниппет-коммит с датой из свободного дня плана таймлайна: дни раздаются от свежих (не позже сегодня) к прошлым, Pair занимает самые свежие, Pull Shark - следующие в прошлое, по одному PR на день. Мерж идёт rebase'ом - коммиты ложатся на таймлайн своими датами, merge-коммит не создаётся. Кончились свободные дни - остаток тира добирается следующими прогонами. Само открытие issue и PR GitHub тоже считает контрибуциями и датирует днём прогона.
Соавторы - по одному на коммит: первым идёт владелец сервиса (один раз), затем знакомые из поля, затем случайный выбор из сервисных аккаунтов и знаменитостей. Знаменитости - без повторов; сервисные аккаунты могут повторяться, если знаменитости не отмечены. Перед прогоном каждый логин проверяется через API: организации, [bot]-аккаунты и сам автор токена пропускаются - GitHub засчитывает соавторство только с пользователями.
Ачивки начисляются GitHub с задержкой - бейджи появляются в профиле через несколько часов.
| Путь | Назначение |
|---|---|
greenhub/webapp.py |
UI и Flask-приложение /api/preview, /api/push, /api/jobs/<id> |
greenhub/core.py |
планирование целей по дням, создание и пуш коммитов |
greenhub/achievements.py |
ачивки профиля: Quickdraw, YOLO, Pull Shark, Pair Extraordinaire |
greenhub/font.py |
пиксельные шрифты, парсинг файлов глифов, рендер текста |
greenhub/snippets.py |
реестр языков и сниппетов |
greenhub/templates/, greenhub/static/ |
фронтенд |
snippets/ |
файлы-сниппеты example.<ext> |
fonts/ |
глифы шрифтов, текстовый формат #/. |
gen_fonts.py |
одноразовый генератор fonts/*.txt из OTF, нужен fonttools |
См. PRIVACY.md
Данные, включая токен остаются у вас в браузере и контейнере; внешние запросы идут только к GitHub.