自动更新 svn:external
Automatically updating svn:external
我将 SVN 存储库分成两部分:project1 和 common。这样,我也可以制作 project2 这也取决于 common.
project1 将包含 svn:external
link 到 common。我希望人们不断开发反对 common 的 HEAD
,但实际上将 svn:external
与 HEAD
挂钩会导致问题(例如标签将引用当前 HEAD
而不是标记时的 HEAD
)。手动挂钩静态修订很烦人,因为如果我们暂时不更新 project1,那么它的经理将更不愿意接受 common[ 的所有更改=32=] 因为未经测试的更改成为一种风险。这导致了我们想要避免的分叉。
如何解决这个问题?
运行 此脚本作为 cron-job 或 systemd.timer 来自 linux 服务器(使用对存储库具有写入权限的帐户)。
这解决了恢复到 project1 的旧版本也会恢复到当时使用的 common 版本的问题不断更新挂钩的 svn 修订版。
作为额外的奖励,如果有人更新 common,所有项目 运行 此脚本将自动提交外部 属性 更新,这会触发 CI(使用类似 Jenkins 的东西)。这意味着对 common 的提交将立即在所有依赖项目上进行测试。
#!/bin/bash
# Updates all svn externals in a remote repository
# argument 1 is the server
# argument 2 is the path to the externals directory relative to the server root
#
# Note: all externals in the repository must be relative to the server root.
# See `svn help pset`
#
# Example:
# If you have externals in https://example.com/svn/project1/trunk, then:
#
# this-script https://example.com /svn/project1/trunk
#
server=
repo=
# Get the commited properties
svn checkout $server$repo wc --depth=empty
svn pget svn:externals wc > wc.externals
# Remove empty lines
sed -i '/^$/d' wc.externals
# for each external in existing properties:
while read line; do
# tokenize
IFS='@ ' tokens=( $line )
# extract interesting stuff from the tokens
extrepo=${tokens[0]}
rev=${tokens[1]}
dir=${tokens[2]}
# Query the external repository for the last change
latest=$(svn info $server$extrepo | sed -ne 's/^Last Changed Rev: //p')
# Write a new set of externals based on latest info
echo "$extrepo@$latest $dir" >> wc.newexternals
done <wc.externals
# Get the differences between the new and old externals
details=$(diff -y --suppress-common-lines wc.externals wc.newexternals)
# If differences exist (and the diff was valid)
retval=$?
if [ $retval -eq 1 ]; then
# Set the new properties
svn pset svn:externals -F wc.newexternals wc
# Generate the SVN log
echo "Automatic externals update" > wc.log
echo $details >> wc.log
# Commit the changes
svn ci -F wc.log wc
fi
# Cleanup
rm -rf wc wc.externals wc.newexternals wc.log
限制是它只支持相对于同一服务器根配置的外部。
我将 SVN 存储库分成两部分:project1 和 common。这样,我也可以制作 project2 这也取决于 common.
project1 将包含 svn:external
link 到 common。我希望人们不断开发反对 common 的 HEAD
,但实际上将 svn:external
与 HEAD
挂钩会导致问题(例如标签将引用当前 HEAD
而不是标记时的 HEAD
)。手动挂钩静态修订很烦人,因为如果我们暂时不更新 project1,那么它的经理将更不愿意接受 common[ 的所有更改=32=] 因为未经测试的更改成为一种风险。这导致了我们想要避免的分叉。
如何解决这个问题?
运行 此脚本作为 cron-job 或 systemd.timer 来自 linux 服务器(使用对存储库具有写入权限的帐户)。
这解决了恢复到 project1 的旧版本也会恢复到当时使用的 common 版本的问题不断更新挂钩的 svn 修订版。
作为额外的奖励,如果有人更新 common,所有项目 运行 此脚本将自动提交外部 属性 更新,这会触发 CI(使用类似 Jenkins 的东西)。这意味着对 common 的提交将立即在所有依赖项目上进行测试。
#!/bin/bash
# Updates all svn externals in a remote repository
# argument 1 is the server
# argument 2 is the path to the externals directory relative to the server root
#
# Note: all externals in the repository must be relative to the server root.
# See `svn help pset`
#
# Example:
# If you have externals in https://example.com/svn/project1/trunk, then:
#
# this-script https://example.com /svn/project1/trunk
#
server=
repo=
# Get the commited properties
svn checkout $server$repo wc --depth=empty
svn pget svn:externals wc > wc.externals
# Remove empty lines
sed -i '/^$/d' wc.externals
# for each external in existing properties:
while read line; do
# tokenize
IFS='@ ' tokens=( $line )
# extract interesting stuff from the tokens
extrepo=${tokens[0]}
rev=${tokens[1]}
dir=${tokens[2]}
# Query the external repository for the last change
latest=$(svn info $server$extrepo | sed -ne 's/^Last Changed Rev: //p')
# Write a new set of externals based on latest info
echo "$extrepo@$latest $dir" >> wc.newexternals
done <wc.externals
# Get the differences between the new and old externals
details=$(diff -y --suppress-common-lines wc.externals wc.newexternals)
# If differences exist (and the diff was valid)
retval=$?
if [ $retval -eq 1 ]; then
# Set the new properties
svn pset svn:externals -F wc.newexternals wc
# Generate the SVN log
echo "Automatic externals update" > wc.log
echo $details >> wc.log
# Commit the changes
svn ci -F wc.log wc
fi
# Cleanup
rm -rf wc wc.externals wc.newexternals wc.log
限制是它只支持相对于同一服务器根配置的外部。