Автоматическое обновление пропатченной версии Joomla

По мотивам ручного обновления пропатченной Joomla создаем скрипты для автоматизации этого процесса.

Перед проведением всех работ необходимо сделать резервные копии и/или поставить git, и сделать дамп базы данных

Создание патчей

Создаем патчи на основе разницы между оригинальными файлами и пропатченными, все настройки находятся в скрипте, который кладем выше дерева веб-документов:

patch-make.sh
#!/bin/bash
 
#
# Создание патчей на основе разницы между оригинальными файлами и пропатченными
# Новые файлы игнорируются, только уже существующие
#
 
ORIGIN_DIR=tmp/3.4.5-origin     # каталог с исходными файлами
INSTANCE_DIR=public_html        # каталог с измененными (пропатченными) файлами
PATCH_DIR=tmp/patches           # каталог, куда будут складываться патчи
PATCHES_INDEX_FILE=files.txt    # индексный файл с именами файлов
 
EXCLUDE_FILE_EXTENSIONS='jpg png gif doc pdf'           # расширения для исключения из поиска патчей
 
GREP_REGEXP='^Files (.*?) and (.*?) differ$'            # регулярка для поиска измененных файлов
DIFF_REGEXP='s/^Files (.*?) and (.*?) differ$/\1 \2/g'  # регулярка для разбиения результатов diff на два файла
 
for EXT in `echo "${EXCLUDE_FILE_EXTENSIONS}"`
do
  EXCLUDE_CHUNK="${EXCLUDE_CHUNK} -x '*.${EXT}'"
done
 
diff -qr $EXCLUDE_CHUNK $ORIGIN_DIR $INSTANCE_DIR | grep -P "$GREP_REGEXP" | sed -r "$DIFF_REGEXP" > $PATCH_DIR/$PATCHES_INDEX_FILE
 
COUNTER=0
while read FILES;
do
  for FILE in $FILES
  do
    let COUNTER+=1
    BASE_NAME=`basename "$FILE"`
    PATCH_NAME=`printf '%04d_%s' "$COUNTER" "$BASE_NAME"`
    echo $FILES | xargs -n 2 diff -up > $PATCH_DIR/$PATCH_NAME
    # echo $PATCH_NAME
    break
  done
done < $PATCH_DIR/$PATCHES_INDEX_FILE
 
echo Done: $PATCH_DIR

Даем разрешение на выполнение и запускаем создание патчей:

chmod +x patch-make.sh
./patch-make.sh

В итоге у нас получается набор патчей, каждый патч - в отдельном файле, и индексный файл files.txt:

-rw-rw-r-- 1 apache apache    586 Mar  7 11:46 0001_config.xml
-rw-rw-r-- 1 apache apache    528 Mar  7 11:46 0002_router.php
-rw-rw-r-- 1 apache apache    852 Mar  7 11:46 0003_email.php
-rw-rw-r-- 1 apache apache   1391 Mar  7 11:46 files.txt

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

Обновление Joomla

Обновляем Joomla штатными средствами. Можно закоммитить изменения.

Вклеиваем патчи обратно

patch-apply.sh
#!/bin/bash
 
#
# Применение патчей, созданных patch-make.sh
#
 
INSTANCE_DIR=public_html        # каталог с измененными (пропатченными) файлами
PATCH_DIR=tmp/patches           # каталог, куда будут складываться патчи
PATCHES_INDEX_FILE=files.txt    # индексный файл с именами файлов
 
 
find $PATCH_DIR -type f -print0 | while read -d $'\0' FILE
do
  if [[ "$FILE" != "$PATCH_DIR/$PATCHES_INDEX_FILE" ]]; then # исключаем индексный файл
    echo --------------------- Pathing file $FILE ---------------------
    patch -i $FILE -p0 -l
  fi
 
done

Разрешаем выполнение и запускаем:

chmod +x patch-apply.sh
./patch-apply.sh

В интерактивном режиме нам предложат решить конфликты (если они есть), связанные с:

  • файл не изменился, и зачем его повторно патчить
  • не нашлось место, куда можно вклеить патч

вклеить патч Joomla

Печать/экспорт