Как ограничить N новейшими записями с Hg Log при указании Revset?

Этот вопрос не является дубликатом hg log - How to получить последние 5 записей в журнале? — установить ограничение легко. Проблема заключается в том, что выходные данные журнала, когда они ограничены, не всегда упорядочены по дате журнала — поведение меняется с добавлением набора изменений.

Например, простой журнал работает "как положено" и отображает пять новейших записей журнала.

hg log -l5

Тем не менее, при использовании набора обновлений сначала идут самые старые узлы (как видно без -l); следовательно, ниже показаны самые старые пять записей, которые нежелательны.

hg log -r "user('Me')" -l5

Как может hg log с набором обновлений получить указание упорядочивать по дате журнала по убыванию ("как ожидалось"), чтобы ограничение имело предсказуемый1 и значимый эффект?


$ hg --version
Mercurial Distributed SCM (version 3.6.1)

1 Я не считаю предсказуемым создание случайных вызовов reverse в revнаборе, но если это "лучший" способ...


person user2864740    schedule 24.12.2015    source источник


Ответы (2)


У вас есть несколько вариантов.

Во-первых, вы можете использовать reverse() в сочетании с вашим существующим набором версий, например:

hg log -r 'reverse(user("me"))' -l 5

В качестве сокращения вы также можете использовать -f или --follow, которые — при использовании в сочетании с -r — перенесут ревизию в reverse(...). Пример:

hg log -f -r 'user("me")' -l 5

Или вы можете закодировать ограничение в наборе изменений, например:

hg log -r 'last(user("me"), 5)'

Обратите внимание, что псевдонимы наборов изменений могут быть полезны, чтобы избежать необходимости вводить наборы изменений снова и снова. Итак, вы можете поместить что-то вроде этого в свой .hgrc:

[revsetalias]
lastby($1) = last(user($1), 5)

А затем выполните:

hg log -r 'lastby("me")`
person Reimer Behrends    schedule 24.12.2015
comment
Чисто некачественное поведение журнала Hg. И здесь я только что ранее создал страницу слияния, восхваляющую наборы версий. Вот вам и Джеймс Бонд. - person user2864740; 24.12.2015
comment
FWIW, метод reverse ненадежен, поскольку нет гарантии последовательного упорядочения дат в подмножестве (я только что столкнулся со случаем, когда это не так); это должно быть сделано с sort(..,'-date'). - person user2864740; 07.01.2016

Важный дополнительный ответ: не используйте reverse вслепую для этой задачи. Хотя во многих случаях это будет работать, лучшим/надежным общим решением является использование sort, например:

hg log -r 'sort(user("me"), "-date")' -l 5

Это связано с тем, что reverse не гарантирует правильность порядка набора исходных файлов — поэтому окончательный результат все равно может привести к тому, что не соответствует запрошенным критериям «новейший». .

Использование sort выше гарантирует поведение, поскольку оно сортирует по дате, в порядке убывания, а затем выбирает 5 лучших вариантов ограничения журнала hg.

(В противном случае см. ответ Реймера.)

person user2864740    schedule 07.01.2016