Как программно получить последнюю дату фиксации при проверке CVS - PullRequest
9 голосов
/ 25 июня 2009

Для сценария, над которым я работаю, чтобы реализовать деление пополам с использованием CVS, я хочу выяснить, что такое «отметка времени» текущей проверки. Другими словами, если я нахожусь на ветке / теге, я хочу знать, когда в последний раз что-то было зафиксировано в этой ветке / теге. Если я на голове, я хочу знать последнюю отметку времени на голове.

Я знаю, что это не на 100% гарантировано, так как у cvs checkouts могут быть разные файлы с разными временными отметками / ревизиями / ..., но мне подходит правильное решение в большинстве случаев.

Наивно я думал, что

cvs log -N | grep ^date: | sort | tail -n 1 | cut -d\; -f1

собирался это сделать, но оказалось, что он проходит всю историю коммитов для всех веток / тегов.

Ответы [ 3 ]

3 голосов
/ 25 июня 2009

CVS-файлов в ветке с разными временными метками, точность выбора любого файла для получения последней информации о времени для ветки вряд ли стоит.

Но, это может поправиться, если есть какой-то файл, который будет часто изменяться. Например, в одной из моих баз есть файл version.h, который обновляется при каждой смене версии (младшей или мажорной). Это может быть использовано для информации о времени в текущей версии (опять же, неточно для всех файлов в ветке, но это дает нижнюю строку).

Итак, если вы знаете файл, который может дать вам значение в нижней строке,

cvs log path/to/version.h -r branch/tag | grep ^date | sort | tail -1

выдаст вам последнюю метку времени для этого файла.


Если вы можете перечислить весь набор файлов базы следующим образом,

find /base/dir -type f | grep -v CVS > files.txt

затем вы можете выполнить цикл команды cvs выше для каждого файла,

rm -f allFiles.txt
for f in $(<files.txt); do cvs log $f ...etc... tail -1 >> allFiles.txt
sort allFiles.txt | tail -1

В последней строке будет указана точная дата самого последнего коммита.
Увы, вы не получите имя файла (что также можно сделать с помощью еще нескольких файлов)

0 голосов
/ 23 января 2019

Я наткнулся на эту тему, когда искал способ получить метку времени для файла в CVS через тег программно. Других ответов достаточно, но я хотел бы добавить свой собственный следующим образом:

cvs rlog -r<tag_or_revision> <file_path> | grep ^date | cut -c 7-25

Я заметил, что между -r и <tag> не может быть пробела. Кажется, диапазон тегов или ревизий как –r<tag1>:<tag2> также подходит.

Я также хотел получить дату, включая полную метку времени, и обнаружил, что использование cut для выполнения подстроки в статическом диапазоне символов выглядит проще, чем использование sed.

Наконец, и, что наиболее важно, для моих нужд я обнаружил, что команда rlog работает как удаленный журнал, тогда как команда log требует, чтобы файлы действительно были извлечены. В моем случае я просто хотел посмотреть временную метку для файлов на основе тега, и дополнительный шаг, связанный с необходимостью извлечения файлов для ведения журнала, был основным сдерживающим фактором, поэтому я просто хотел добавить, что команда rlog может быть полезной для ваших нужд.

0 голосов
/ 13 августа 2013

Более быстрый способ получить последний раз, когда файл был изменен (который основан на ответе, заданном nik):

cvs log -bd `date +%Y-%m-%d` ChangeLog | grep ^date

Если вы хотите получить только дату, используйте:

cvs log -bd `date +%Y-%m-%d` ChangeLog | grep ^date | sed 's/date: \([^ ]*\).*/\1/'

При этом используется флаг -b, который использует ветку по умолчанию, и -d, который позволяет сообщать CVS, что вы заботитесь только о последней версии вплоть до определенного времени. Затем выражение `` передает текущую дату в качестве предела, давая вам самый последний коммит.

В CVS-репозитории gnuplot использование флага -d сокращает время выполнения с ~ 4 с до ~ 1,5 с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...