[gitfame] Improve description.
This commit is contained in:
parent
0d45ba2f34
commit
952fcab12a
1 changed files with 32 additions and 21 deletions
|
@ -2,6 +2,27 @@
|
||||||
|
|
||||||
В этом задании нужно реализовать консольную утилиту для подсчёта статистик авторов git репозитория.
|
В этом задании нужно реализовать консольную утилиту для подсчёта статистик авторов 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 репозитории.
|
В [/tests/integration/testdata/bundles](test/integration/testdata/bundles) лежат запакованные git репозитории.
|
||||||
Каждый интеграционный тест ссылается на какой-нибудь бандл.
|
Каждый интеграционный тест ссылается на какой-нибудь бандл.
|
||||||
|
|
||||||
Как создать bundle? Находясь в git репозитории выполнить
|
Как создать свой bundle? Находясь в git репозитории выполнить
|
||||||
```
|
```
|
||||||
git bundle create my.bundle --all
|
git bundle create my.bundle --all
|
||||||
```
|
```
|
||||||
|
@ -164,6 +185,7 @@ export PATH=$GOPATH/bin:$PATH
|
||||||
|
|
||||||
В небольших проектах нет ничего плохого в том, чтобы весь код лежал плоско в корне.
|
В небольших проектах нет ничего плохого в том, чтобы весь код лежал плоско в корне.
|
||||||
Здесь же, для ознакомления предлагаем изучить общепринятый подход.
|
Здесь же, для ознакомления предлагаем изучить общепринятый подход.
|
||||||
|
В частности, писать реализацию в internal или pkg (в чём разница?).
|
||||||
|
|
||||||
#### Cli
|
#### Cli
|
||||||
|
|
||||||
|
@ -176,17 +198,6 @@ export PATH=$GOPATH/bin:$PATH
|
||||||
`pflag` может побольше, чем стандартный [flag](https://golang.org/pkg/flag/),
|
`pflag` может побольше, чем стандартный [flag](https://golang.org/pkg/flag/),
|
||||||
в частности, в `pflag` есть полезные для решаемой задачи флаги для работы с аргументами-массивами.
|
в частности, в `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 ликбез
|
### Git ликбез
|
||||||
|
|
||||||
Вся информация взята из [книги](https://github.com/pluralsight/git-internals-pdf/releases/download/v2.0/peepcode-git.pdf).
|
Вся информация взята из [книги](https://github.com/pluralsight/git-internals-pdf/releases/download/v2.0/peepcode-git.pdf).
|
||||||
|
|
Loading…
Reference in a new issue