git blame
-ом коллегам, посмотреть им ласково в глаза и поговорить о наболевшем. В такие моменты отсутствие команды git punish
кажется невообразимым.Сначала я намеревался написать пост в «Я пиарюсь», но очень хотелось рассказать о технических деталях, потому прошу простить ссылку на мой собранный на коленке git-punish.io.
Задача была простая: пока не выветрился азарт написать что-то вызываемое через
git punish
разбирающее вывод команды git blame
и возвращаемое ссылку на страницу в онлайне.Первым в голову конечно же пришло
git config --global alias.punish "...shell command..."
Но быстро выяснилось, что многого так не сделаешь. На второе решение навел чей-то добрый совет на Coderwall. Подход сразу показался красивым и лишенным ограничений. Оказывается, в любом месте перечисленном в
$PATH
можна создать исполняемый файл git-%command%
который добавит новую команду в git.Получилось вот так:
#!/bin/bash
git blame --line-porcelain $@ | curl --data-binary @- http://git-punish.io/create
Параметр
--line-porcelain
включает расширенный вывод для каждой строчки, который удобно разбирать. Добавляем в конец пользовательские параметры $@
. Затем POST
-им весь вывод на git-punish.io/create
. Разбор вывода малоинтересен, но если очень хочется увидеть то вот. В терминал выводится сгенерированый сервисом короткий URL.
Такие вот дела. Буду рад советам, подсказкам и прочим blame/punish-ам.
UPD
На всякий случай дисклеймер, я понял что он сдесь нужен. Это шуточный сервис.
Комментарии (26)
MaximChistov
17.09.2015 09:02-2# you may need `sudo` next 2 commands
> curl git-punish.io/get -o /usr/local/bin/git-punish
> chmod +x /usr/local/bin/git-punish
это ж классическая bad practiceyavorskiy
17.09.2015 09:21Буду рад переиначить все по best practices, подскажите как. На сколько мне известно из bin* путей
/usr/local/bin
как раз то место, где подобные исполняемые файлы должны лежать. Как избавиться отsudo
я, честно скажу, не знаю. На OSX, такой необходимости нету, на линуксе есть.MaximChistov
17.09.2015 09:23+1я о том, что вы предлагаете грузить неподписанный исполняемый скрипт по http
ivanych
17.09.2015 09:11+2Что вся эта фигня значит и для чего нужна?
Alexeyslav
17.09.2015 09:44+2Походу, это доска позора… команда отправляет код на доску позора и выводит ссылку на результат.
k12th
17.09.2015 10:15+2Вместо того, чтобы подзывать коллегу и бить его фейсом об киборд, можно культурно послать ему свое недоумение в виде ссылки.
imater
17.09.2015 10:29+11На хабре, очень модно начинать писать о технологиях и всяких модных штуках, подразумевая, что все знают, что такое гиберсворолотор и для чего он нужен, и как долго все ждали появления в нем функции лоботоропии.
tangro
17.09.2015 10:39+2Как говориться «за такие шутки в зубах бывают промежутки». Два-три раза коллегу мордой в грязь ткнёшь — и всё, хана и команде и проекту.
yavorskiy
17.09.2015 12:50+1опять же, откуда «мордой в грязь»? какие-то школьно-армейские ситуации. Кончено, если в команде достаточно «паханов» и «терпил», то проект развалится быстрее чем они доберутся до код-ревьювинга
vedenin1980
Эээ, а можно для тех кто в танке рассказать что такое «git punish» и для чего именно она нужна? Git худо бедно знаю, но из поста вообще не понял чего автору не хватало и что получилось у него в результате.
yavorskiy
Вот есть пример там же
# accepts all `git blame` params
> git clone git@github.com:yavorskiy/comment-parser.git
> cd comment-parser/
> git punish -L1,24 index.js
http://git-punish.io/3EWZW
Автору всего хватало, но хотелось больше
vedenin1980
Эээ, можно не пример, можно просто словами сказать что команда punish должна в итоге сделать и какая от неё будет польза? Я вот например вообще не знаю этой команды (подозреваю это что-то линуксово-сборочное, но я не любитель ручного копания в линуксах).
movl
Да это плагин, просто для фана, такой команды по умолчанию нет. Плагин генерирует ссылку на основе параметров, перейдя по которой, можно увидеть кусок кода, шутливый комментарий и картинку. Пример в комментарии выше.
yavorskiy
Да, совсем забыл сказать, git punish – это такая шутка.
Alexeyslav
Вот с этого и надо было начинать.