История версий GNU Sed (changelog) - как определить, какая функция была представлена в какой версии?

Для отслеживания деятельности, просто используйте эту команду в терминале top Это даст вам все необходимые детали относительно использования процессора и т.д.

4
11.07.2017, 11:26
2 ответа

Список см. в конце этого ответа.

above tells me 2012-02-05, I cannot tell what version number that maps to

Чтобы просто сопоставить даты с номерами версий, вы можете проверить раздел загрузки на домашней странице GNU sed . Там у вас есть список вида

Index of /gnu/sed
Name                   Last modified      Size
[...] 
sed-4.2.1.tar.gz       2009-06-27 18:22   1.1M   
sed-4.2.1.tar.gz.sig   2009-06-27 18:22   72 
sed-4.2.2.tar.gz       2012-12-22 11:01   1.3M   
sed-4.2.2.tar.gz.sig   2012-12-22 11:01   72     
[...]

Обратите внимание, что список отсортирован в алфавитном порядке, поэтому 4.2 идет после 4.2.1. Вы можете правильно отсортировать его, скопировав -вставив его в sort -V.

Предполагая, что каждое изменение попадает в следующую версию, изменение из 2012 -02 -05 будет выпущено в версии 4.2.2.

determine which feature was introduced in what version?

В общем, это очень сложно. Несмотря на то, чтоChangeLog-2014и git logвместе взятые в значительной степени охватывают весь жизненный цикл GNU sed, упоминаются не все изменения. Следующим шагом будет анализ документации (man-страниц и usage()функций )старых версий, но они тоже иногда бывают неполными.

Пример 1:-Eвпервые появился в версии 4.2 в 2004 -08 -22, но не упоминался ни в логах, ни в официальной документации. Эта опция была впервые упомянута в коммите git от 2013 -10 -16(более 9 лет спустя!)говорит "Документировать " -E" опцию для использования ERE" .

В других случаях журнал изменений может вводить в заблуждение.

Пример 2:В Changelog-2014первая ссылка на -rкажется записью из 2000 -12 -08, где отмечается "sed/sed.c (main ):Реализованы опции `r' и `R'" . Это звучит довольно определенно :Очевидно, что -rне могло быть доступно до этого, верно?! Нет, это уже было в версии 3.0.1 от 1998 года.
Понятия не имею, что случилось с этой записью в журнале изменений, но версия 3.0.1 явно относится к 1998 году (, в исходных файлах указана дата модификации, а в комментариях к авторским правам указан 1998 год как последний год, также в журнале изменений упоминается выпуск версии 3.0.1 в 1998 )и явно поддерживает -r(. Я скомпилировал эту версию и запустил ./sed -r 's/a(b)c/\1/' <<< abc, которая напечатала b, как и ожидалось, и abc, опустив опцию -r).

Таким образом, кажется, что лучший способ узнать, когда была введена функция, — проверить исходный код всех версий . Сначала это может показаться пугающим, но, по крайней мере, для параметров командной строки это довольно просто. :Найдите функцию main()и посмотрите, где используется argv.

Обратите внимание, что git://git.sv.gnu.org/sedтакже является неполным. Самый старый коммит датирован 2004 годом (check git log --reverse), а самый старый тег v4.1.5помечает версию 2006 года (checkgit log --simplify-by-decoration --format="%ai %d"). Таким образом, чтобы проверить более старые версии, вы должны загрузить их с ранее упомянутого веб-сайта .
Даже там некоторые вещи потеряны для времени. Версии с 4.0.0 по 4.0.5 «недоступны, поскольку их подлинность подтверждается» . Но я предполагаю, что это не важно, так как 4.0.0 меньше чем через год отличается от 4.0.6.

К счастью,опция парсинга GNU sed была настолько стабильной, что я мог что-то вместе взломать, чтобы автоматически сгенерировать список изменений:

Скрипт (сжат в одну строку для безопасного места в этом ответе )...

#! /bin/bash
old=; curl -s "https://ftp.gnu.org/gnu/sed/" | sed -nE 's/.* href="sed-([0-9.]*)(\.tar\.[^."]*)".*([0-9]{4}-..-..).*/\1 \3 sed-\1\2/p' | sort -u -k1,1V | while read version date file; do printf '%-6s %s\n' "$version" "$date"; curl -sO -C- "https://ftp.gnu.org/gnu/sed/$file"; new=$(tar -xaf "$file" -O --wildcards '*/sed.c' | sed -En -e '/"[^" ]*e:[^" ]*"/{s/.*"([^" ]*e:[^" ]*)".*/\1/;s/://g;s/./\n-&/gp}' -e '/longopts\[]/,/};/s/[^"]*"([^"]*)".*/--\1/p' | sort -u); comm -3 <(printf %s "$old") <(printf %s "$new") | awk '{if (/^-/) r=r" "$1; else a=a" "$1} END {if (a!="") print "  new:" a; if (r!="") print "  removed:" r}'; old=$new; done

... сгенерировал следующий список:

1.18   1993-06-01
  new:  -e --expression -f --file -h --help
        -n --quiet --silent -V --version
2.05   1994-05-13
3.01   1998-07-23
  new: -r --rxtest
3.02   1998-08-02
4.0.6  2003-03-18
  new: -i --in-place -l --line-length
       -R --regexp-extended --regexp-perl
       -s --separate -u --unbuffered
  removed: --rxtest
4.0.7  2003-04-11
4.0.8  2003-10-21
4.0.9  2004-01-10
4.1    2004-06-15
  new: --posix
  removed: -h
4.1.1  2004-07-06
4.1.2  2004-08-22
4.1.3  2005-01-19
4.1.4  2005-01-28
4.1.5  2006-02-03
4.2    2009-04-30
  new: -b --binary -E --follow-symlinks
4.2.1  2009-06-27
4.2.2  2012-12-22
  new: --null-data -z --zero-terminated
4.3    2017-01-04
  new: --sandbox
4.4    2017-02-03
4.5    2018-03-31
4.6    2018-12-20
  new: --debug
  removed: -R --regexp-perl
4.7    2018-12-21
4.8    2020-01-14

Отсюда видно, что -zвпервые появился в версии 4.2.2, выпущенной в 2012 году -12 -22.

Обратите внимание, что -R/ --regexp-perlот версий 4.0.6 до 4.5 требовали #define REG_PERLперед компиляцией, поэтому упакованные версии в Debian, Ubuntu и т. д. никогда не поддерживали эту опцию.

5
25.08.2021, 00:14

Поскольку у вас есть история git, а разработчики GNU sed добавили теги git для версий, вам нужна версия 4.2.2, чей тег был добавлен 4 года назад(Тег 4.2.1 был добавлен 8 лет назад , так что явно до 2012 года ). Журнал для 4.2.2 включает добавление коммита -z. Кроме того, если вы клонировали исходный код, вы можете посмотреть , какие теги включали эту фиксацию :

.
git tag --contains <commit>
4
27.01.2020, 20:55

Теги

Похожие вопросы