From c28729a65a9b28ac9662b3bc6a676b4419046fb1 Mon Sep 17 00:00:00 2001 From: Arseny Balobanov Date: Sat, 6 Mar 2021 20:54:38 +0300 Subject: [PATCH] [gitfame] Update readme. --- gitfame/README.md | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/gitfame/README.md b/gitfame/README.md index fb97a8a..93a6518 100644 --- a/gitfame/README.md +++ b/gitfame/README.md @@ -36,6 +36,11 @@ f4640df4 (Fedor Korotkiy 2020-02-26 20:28:52 +0000 5) Задача считае Стоит помнить, что не все файлы из директории git проекта обязательно принадлежат git репозиторию. Получить список файлов git репозитория можно разными способами, например с помощью `git ls-tree`. +Для вызова команд git можно использовать [os/exec](https://golang.org/pkg/os/exec/). + +В процессе работы скрипт не должен менять состояние репозитория ни в какой момент, +поскольку с репозиторием могут параллельно работать. + ### Интерфейс Утилита должна печатать результат в stdout. @@ -105,10 +110,17 @@ ferhat elmas,1,1,1 **--exclude** — набор [Glob](https://en.wikipedia.org/wiki/Glob_(programming)) паттернов, исключающих файлы из расчёта, например `'foo/*,bar/*'` +Для работы с Glob'ом в стандартной библиотеке есть [path/filepath](https://golang.org/pkg/path/filepath/). + **--restrict-to** — набор Glob паттернов, исключающий все файлы, не удовлетворяющие ни одному из паттернов набора ### Тесты +Команда для запуска тестов +``` +go test -v ./gitfame/test/integration/... +``` + В [/tests/integration/testdata/bundles](test/integration/testdata/bundles) лежат запакованные git репозитории. Каждый интеграционный тест ссылается на какой-нибудь бандл. @@ -122,6 +134,26 @@ git bundle create my.bundle --all git clone /path/to/my.bundle . ``` +### Сборка приложения + +Как собрать приложение? +``` +(cd gitfame/cmd/gitfame && go build .) +``` +В `gitfame/cmd/gitfame` появится исполняемый файл с именем `gitfame`. + +Как собрать приложение и установить его в `GOPATH/bin`? +``` +go install ./gitfame/cmd/gitfame/... +``` + +Чтобы вызывать установленный бинарь без указания полного пути, нужно добавить `GOPATH/bin` в `PATH`. +``` +export PATH=$GOPATH/bin:$PATH +``` + +После этого `gitfame` будет доступен всюду. + ### Ненавязчивые предложения #### Project layout @@ -139,6 +171,22 @@ git clone /path/to/my.bundle . популярной библиотекой для написания [cli](https://en.wikipedia.org/wiki/Command-line_interface). В этой задаче cobra поможет распарсить аргументы, написать подробный help message, сделать алиасы для флагов. +В cobra используется библиотека [pflag](https://pkg.go.dev/github.com/spf13/pflag) для работы с флагами. +Библиотеку можно использовать и отдельно от cobra. +`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).