[gitfame] Improve description.

This commit is contained in:
Arseny Balobanov 2022-03-10 22:12:24 +03:00
parent 0d45ba2f34
commit 952fcab12a

View file

@ -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).