自动更新 svn:external

Automatically updating svn:external

我将 SVN 存储库分成两部分:project1common。这样,我也可以制作 project2 这也取决于 common.

project1 将包含 svn:external link 到 common。我希望人们不断开发反对 commonHEAD,但实际上将 svn:externalHEAD 挂钩会导致问题(例如标签将引用当前 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

限制是它只支持相对于同一服务器根配置的外部。