Обработка только измененных файлов

Что:
С jenkins я хочу периодически обрабатывать только измененные файлы из SVN и передавать выходные данные обработки SVN.

Почему:
Мы записываем двоичные файлы в SVN (мы работаем с Oracle Forms и делаем fmb-Files). Я создал script, который экспортирует файл fmb в xml (с помощью оригинального инструмента Fmb2XML из Oracle), и я конвертирую XML в простой источник, который мы также хотим совершить. Это позволяет нам сглаживать, просматривать изменения,...

Проблема:
На данный момент я могу только проверить все, конвертировать весь каталог и передать весь каталог обратно в SVN. Но так как все текстовые файлы вновь создаются, они появляются в SVN. Я хочу зафиксировать только измененные.

Может ли кто-нибудь помочь мне с этим?

Ответ 1

Я установил плагин Groovy, настроил язык Groovy и создал script, который я выполняю как "system Groovy script". Сценарии выглядят так:

import java.lang.ProcessBuilder.Redirect

import hudson.model.*
import hudson.util.*
import hudson.scm.*
import hudson.scm.SubversionChangeLogSet.LogEntry

// uncomment one of the following def build = ... lines

// work with current build
def build = Thread.currentThread()?.executable

// for testing, use last build or specific build number
//def item = hudson.model.Hudson.instance.getItem("Update_SRC_Branch") 
//def build = item.getLastBuild()   
//def build = item.getBuildByNumber(35)   

// get ChangesSets with all changed items
def changeSet= build.getChangeSet()
List<LogEntry> items = changeSet.getItems()

def affectedFiles = items.collect { it.paths }

// get filtered file names (only fmb) without path
def fileNames = affectedFiles.flatten().findResults {
    if (it.path.substring(it.path.lastIndexOf(".") + 1) != "fmb") return null
    it.path.substring(it.path.lastIndexOf("/") + 1)
}.sort().unique()

// setup log files
def stdOutFile = "${build.rootDir}\\stdout.txt"
def stdErrFile = "${build.rootDir}\\stderr.txt"

// now execute the external transforming
fileNames.each {
    def params = [...]
    def processBuilder = new ProcessBuilder(params)

    // redirect stdout and stderr to log files
    processBuilder.redirectOutput(new File(stdOutFile))
    processBuilder.redirectError(new File(stdErrFile))

    def process = processBuilder.start()
    process.waitFor()

    // print log files
    println new File(stdOutFile).readLines()
    System.err.println new File(stdErrFile).readLines()
}

Затем я использую командную строку с "svn commit" для фиксации обновленных файлов.

Ответ 2

Предварительное примечание: получение файлов из репо в SVN-жаргоне - это "проверка", сохранение для репо - "фиксация". Не смешивайте CVS и SVN-термины, это может привести к неправильной интерпретации

Чтобы получить список измененных файлов в ревизии (или отменить), вы можете использовать

  • Простой способ - svn log с параметрами -q -v. Для отдельной ревизии вы также добавляете -c REVNO, для диапазона модификации: -r REVSTART: REVEND. Вероятно, дополнительный -xml даст более подходящий вывод, чем обычный текст

Чтобы получить чистый список, вы должны отправить отчет журнала, потому что: log содержит некоторые бесполезные для вас данные, а в случае журнала для диапазона вы можете иметь один и тот же файл, включенный в более чем одну версию

z:\>svn log -q -v -r 1190 https://subversion.assembla.com/svn/customlocations-greylink/
------------------------------------------------------------------------
r1190 | lazybadger | 2012-09-20 13:19:45 +0600 (Чт, 20 сен 2012)
Changed paths:
   M /trunk/Abrikos.ini
   M /trunk/ER-Telecom.ini
   M /trunk/GorNet.ini
   M /trunk/KrosLine.ini
   M /trunk/Rostelecom.ini
   M /trunk/Vladlink.ini
------------------------------------------------------------------------

пример одной ревизии: вы должны log | grep trunk | sort -u, добавить базу репо файла к именам файлов

  • Сложнее: с дополнительным SCM (а именно - Mercurial) и hgsubversion вы получите немного больше (возможно) log с hg log --template "{files}\n" - только немного, потому что вы получите только файл списка, но набор файлов в разных версиях разделен на новую строку, имена файлов внутри ревизии разделены пробелами