Skip to content

Repository files navigation

greenhub

Генератор коммитов для таймлайна (contribution graph) профиля GitHub с веб-интерфейсом.

Два режима:

  • заполнение - случайное или фиксированное число коммитов в день в диапазоне дат, с фильтром по дням недели;
  • текст - "рисует" коммитами заданный текст на таймлайне.

Запуск

docker-compose up --build -d

Как пользоваться

Веб-интерфейс: http://localhost:8087

  1. Указать URL репозитория (https) и токен.
  2. Выбрать языки - файлы-сниппеты этих языков попадут в коммиты.
  3. Настроить коммиты в день: случайное число "от–до" (по умолчанию 1–5) или фиксированное (макс. 99).
  4. Задать дату начала (по умолчанию год назад).
  5. Выбрать вкладку:
    • Заполнение - дата окончания (по умолчанию сегодня) и дни недели;
    • Текст - строка из английских букв и цифр (до 1000 символов) и шрифт.
  6. Превью - календарь активности в стиле GitHub, без обращения к репозиторию. Диапазон до года - один календарь; больше - отдельный календарь на каждый год.
  7. Пушим коммиты - клонирует репозиторий, докоммичивает недостающее и пушит; прогресс виден в логе на странице.

Токен

Нужен 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.

About

A commit generator for the GitHub profile contribution graph with a web interface.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages