Documentation
¶
Overview ¶
Package treeroot отвечает на ОДИН вопрос: какое дерево судит этот каталог — и его ли это дерево.
───────────────────────────────────────────────────────────────────────────── ПРЕДМЕТ
Корень дерева выводили арифметикой пути: `"../../../.."` от каталога пакета. Такое выражение есть координата РАСКЛАДКИ монорепо, а не свойство модуля, и вне монорепо оно резолвится МОЛЧА — давая каталог, в который распаковали клон. Наблюдалось прямо: обход ушёл в исходники тулчейна Go, лежащие в домашнем каталоге оператора (kacho#2254), а гейт соглашения о вкладе читал ведомость по вычисленному пути (kacho#2239).
Существенно не то, что проверка при этом падала. Существенно, что дерево, где по вычисленному пути лежит нечто годное, дало бы ЗЕЛЁНЫЙ — вердикт о ЧУЖОМ дереве, неотличимый от настоящего.
───────────────────────────────────────────────────────────────────────────── ДВА УТВЕРЖДЕНИЯ, И ВТОРОЕ НЕСУЩЕЕ
- корень назван ИНДЕКСОМ (`rev-parse --show-toplevel`), а не числом уровней;
- найденное дерево ОТСЛЕЖИВАЕТ каталог, из которого спрашивают.
Без второго модуль, распакованный внутрь постороннего репозитория, получил бы корень того репозитория — и первое утверждение выполнялось бы при этом безупречно. Именно поэтому проверок две, а не одна.
───────────────────────────────────────────────────────────────────────────── ИСХОДОВ ДВА, ТРЕТЬЕГО НЕТ
Предпосылка выполнена — корень назван; не выполнена — отказ, НАЗЫВАЮЩИЙ её словами. Молчаливое вычисление чужого пути исходом не является: «не знаю» не выдаётся ни за «нет находок», ни за «находка».
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrModuleRootUnknown = errors.New("корень модуля не установлен")
ErrModuleRootUnknown — корень модуля не установлен подъёмом за маркером.
var ErrTreeNotResolved = errors.New("дерево под резолвом не установлено")
ErrTreeNotResolved — дерево назвать нечем: проверка НЕ ИСПОЛНЯЛАСЬ.
Отдельный признак, а не общий отказ: «дерева нет» и «в дереве находка» — разные исходы, и первый не вычитается из вердикта и не зачитывается в успех.
Functions ¶
func ModuleRootFrom ¶
ModuleRootFrom поднимается от start до БЛИЖАЙШЕГО каталога с `go.mod`.
Маркер, а не число уровней и не имя каталога: имя у арендатора выбирает тот, кто клонировал, а число уровней верно ровно для одной посадки.
Types ¶
type Placement ¶
type Placement struct {
// RepoRoot — корень дерева, спрошенный у индекса; предпосылка проверена.
RepoRoot string
// ModuleRoot — корень модуля, найденный маркером go.mod.
ModuleRoot string
// ModuleDir — путь модуля ОТНОСИТЕЛЬНО RepoRoot.
ModuleDir string
}
Placement — посадка модуля: дерево, которое его судит, и его путь в этом дереве.
ModuleDir выводится, а не выписывается, и потому верен в ОБЕИХ посадках: `services/iam` внутри монорепо, `.` в самостоятельном клоне. Выписанная координата верна ровно в одной и молча неверна в другой.