Автоматическое обновление SVN: внешний - PullRequest
0 голосов
/ 26 марта 2019

Я разделяю SVN-репозиторий на два: project1 и common . Таким образом, я также могу сделать project2 , который также зависит от common .

project1 будет содержать svn:external ссылку на common . Я бы хотел, чтобы люди постоянно развивались против HEAD из общих , но буквальная привязка svn:external к HEAD вызывает проблемы (например, теги будут ссылаться на текущий HEAD вместо HEAD во время пометки). Ручная привязка статической ревизии раздражает, потому что, если мы некоторое время не обновляем project1 , тогда его менеджер будет более неохотно принимать все изменения от common , поскольку непроверенные изменения становятся риск. Это приводит к разветвлению, которого мы хотим избежать.

Как можно обойти это?

1 Ответ

0 голосов
/ 26 марта 2019

Запустите этот скрипт как 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=$1
repo=$2

# 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

Ограничение состоит в том, что он поддерживает только внешние настройки, настроенные относительно корня того же сервера.

...