Эмулировать subwcrev при использовании git-svn - PullRequest
8 голосов
/ 23 декабря 2009

Я использую git-svn для взаимодействия с существующим репозиторием SVN, который содержит некоторые проекты C ++. subwcrev.exe используется в качестве события перед сборкой для обновления некоторых строк в заголовке C ++ (svnversion.h). Эти строки жестко компилируются, чтобы сформировать некоторую информацию о версии полученного двоичного файла.

Поскольку для работы subwcrev требуются метаданные .svn, событие предварительной сборки завершится неудачно при использовании рабочей копии git-svn. Итак, я придумал следующий скрипт bash, который я использую в качестве ловушек post-commit и post-checkout для моего git-репозитория. Сценарий пытается сделать то же самое, что и subwcrev, основываясь на выводе git svn info (кэшируется в локальном файле).

#!/bin/sh
if [ ! -f svninfo ] ; then
    git svn info > svninfo
fi

revision=`sed -e "/Revision/!d" -e "s/Revision: \(.*\)/\1/" svninfo`
lastchange=`sed -e "/Last Changed Rev/!d" -e "s/Last Changed Rev: \(.*\)/\1/" svninfo`
# Get the last changed date, extract timestamp, replaces dashes with slashes
changedate=`sed -e "/Last Changed Date/!d" -e "s/Last Changed Date: \(.\{19\}\).*/\1/" -e "s!-!\\\\\\/!g" svninfo`
now=`date "+%Y\/%m\/%d %H:%M:%S"`

gitcommit=`git show --abbrev-commit | sed -n -e "s/commit //p"`

for entry in $( find -name svnversion_template.h ); do
    newname=`echo $entry|sed -e "s/_template//"`
    sed -e "s/\\\$WCRANGE\\\$/${revision}/" \
        -e "s/\\\$WCREV\\\$/${lastchange}-${gitcommit}/" \
        -e "s/\\\$WCDATE\\\$/${changedate}/" \
        -e "s/\\\$WCNOW\\\$/${now}/" \
        -e "s/\\\$WCURL\\\$/local git repo/" \
        -e "s/\\\$WCMODS.*\\\$/(true)/" \
        -e "s/\\\$WCMIXED.*\\\$/(false)/" \
        $entry > `echo $entry|sed -e "s/_template//"`
done

То, что я до сих пор не могу эмулировать, - это автоматическое обнаружение локальных незафиксированных изменений (на основе последней проверенной версии SVN), что делает subwcrev столь полезным.

Я заменяю $WCREV$ номером ревизии в SVN-репозитории (как сделал бы subwcrev), но на этот раз я добавляю свой сокращенный хеш git commit для идентификации скомпилированного кода. Теперь у меня вопрос: есть ли способ отличить в сценарии оболочки, отличается ли моя текущая HEAD от последней извлеченной версии SVN, чтобы я мог не добавлять часть -${gitcommit} и устанавливать $WCMODS$ в значение false?

Если бы существовала какая-то вещь, такая как post-"git svn dcommit" ловушка, моя проблема также была бы решена, так как с тех пор эта специальная ловушка создала бы svnversion.h по-другому. Можно ли как-то добавить такой крючок?

Ответы [ 2 ]

0 голосов
/ 29 мая 2015

Похоже, вам, возможно, придется самостоятельно проанализировать содержимое запроса git svn info, чтобы получить то, что обычно хранится в WCREV. Результаты примера для меня выглядят так:

git svn info
Path: .
URL: http://myurl.com/trunk/myrepo
Repository Root: http://myurl.com
Repository UUID: 15fed3e9-81ce-ef4a-a7da-fc36e3df1edc
Revision: 14106
Node Kind: directory
Schedule: normal
Last Changed Author: myusername
Last Changed Rev: 14106
Last Changed Date: 2015-05-29 10:23:10 -0400 (Fri, 29 May 2015)

Теперь для второй части вашего вопроса, можете ли вы сказать, соответствует ли ваш git HEAD последней проверке svn, вам нужно будет использовать команду git diff git-svn command. «git-svn» - это название ветви, которую поддерживает программа git-svn, и если все обновлено, результаты будут пустыми.

0 голосов
/ 05 февраля 2014

Я не получаю ваши очки, но сначала улучшите ваш сценарий.

revision=$(grep -Po "(?<=Revision: ).*" svninfo)
lastchange=$(grep -Po "(?<=Last Changed Rev: ).*" svninfo)
# Get the last changed date, extract timestamp, replaces dashes with slashes
changedate=$(grep -Po "(?<=Last Changed Date: ).{19}" svninfo)
changedate=${changedate//-//}
now=$(date "+%Y\/%m\/%d %H:%M:%S")

Тогда, в течение цикла, не могли бы вы объяснить подробно, какой результат вам нужен? Можете ли вы показать один образец svnversion_template.h?

...