diff --git a/gitfame/README.md b/gitfame/README.md index 92e72cb..5fc0650 100644 --- a/gitfame/README.md +++ b/gitfame/README.md @@ -2,6 +2,27 @@ В этом задании нужно реализовать консольную утилиту для подсчёта статистик авторов git репозитория. +``` +gitfame --repository=. --extensions='.go,.md' --order-by=lines +Name Lines Commits Files +Joe Tsai 12154 92 49 +colinnewell 130 1 1 +Roger Peppe 59 1 2 +A. Ishikawa 36 1 1 +Tobias Klauser 33 1 2 +178inaba 11 2 4 +Kyle Lemons 11 1 1 +Dmitri Shuralyov 8 1 2 +ferhat elmas 7 1 4 +Christian Muehlhaeuser 6 3 4 +k.nakada 5 1 3 +LMMilewski 5 1 2 +Ernest Galbrun 3 1 1 +Ross Light 2 1 1 +Chris Morrow 1 1 1 +Fiisio 1 1 1 +``` + ### Статистики * Количество строк @@ -10,6 +31,15 @@ Все статистики считаются для состояния репозитория на момент конкретного коммита. +### Интерфейс + +Утилита должна печатать результат в stdout. +При использовании невалидного значения флага или любой другой ошибке программа должна завершаться с ненулевым кодом возврата. + +Расчёт может занимать довольно длительное время. +Хорошим качеством подобной утилиты является отображение прогресса (вынесенное за флаг). +Прогресс можно печатать в stderr в произвольном формате. + #### Расчёт Каждой строке интересующего подмножества файлов репозитория сопоставляется последний коммит, модифицировавший эту строку. @@ -41,15 +71,6 @@ f4640df4 (Fedor Korotkiy 2020-02-26 20:28:52 +0000 5) Задача считае В процессе работы скрипт не должен менять состояние репозитория ни в какой момент, поскольку с репозиторием могут параллельно работать. -### Интерфейс - -Утилита должна печатать результат в stdout. -При использовании невалидного значения флага или любой другой ошибке программа должна завершаться с ненулевым кодом возврата. - -Расчёт может занимать довольно длительное время. -Хорошим качеством подобной утилиты является отображение прогресса (вынесенное за флаг). -Прогресс можно печатать в stderr в произвольном формате. - ### Флаги Утилита должна поддерживать следующий набор флагов: @@ -124,7 +145,7 @@ go test -v ./gitfame/test/integration/... В [/tests/integration/testdata/bundles](test/integration/testdata/bundles) лежат запакованные git репозитории. Каждый интеграционный тест ссылается на какой-нибудь бандл. -Как создать bundle? Находясь в git репозитории выполнить +Как создать свой bundle? Находясь в git репозитории выполнить ``` git bundle create my.bundle --all ``` @@ -164,6 +185,7 @@ export PATH=$GOPATH/bin:$PATH В небольших проектах нет ничего плохого в том, чтобы весь код лежал плоско в корне. Здесь же, для ознакомления предлагаем изучить общепринятый подход. +В частности, писать реализацию в internal или pkg (в чём разница?). #### Cli @@ -176,17 +198,6 @@ export PATH=$GOPATH/bin:$PATH `pflag` может побольше, чем стандартный [flag](https://golang.org/pkg/flag/), в частности, в `pflag` есть полезные для решаемой задачи флаги для работы с аргументами-массивами. -Помимо библиотеки, в cobra есть ещё и бинарь (с именем cobra) для кодогенерации основы проекта. - -Его можно установить в `GOPATH` командой -``` -go get -u github.com/spf13/cobra -``` - -Генерируемый sample проект использует [viper](https://pkg.go.dev/github.com/spf13/viper) (библиотеку для работы с конфигами) и -[go-homedir](https://pkg.go.dev/github.com/mitchellh/go-homedir) (кроссплатформенную библиотеку для поиска домашней директории пользователя). -В этой задаче эти библиотеки не нужны, поэтому их нет в зависимостях проекта. - ### Git ликбез Вся информация взята из [книги](https://github.com/pluralsight/git-internals-pdf/releases/download/v2.0/peepcode-git.pdf).