仅处理已更改的文件

时间:2012-10-17 10:01:34

标签: svn jenkins

什么
使用jenkins,我想定期处理来自SVN的已更改文件,并将处理的输出提交回SVN。

为什么:
我们将二进制文件提交到SVN(我们正在使用Oracle Forms并提交fmb-Files)。我创建了一个脚本,它将fmb导出到xml(使用Oracle的原始Fmb2XML工具),然后将XML转换为我们也想提交的普通源。这让我们可以看到变化,等等....

问题:
目前我只能检查所有内容,转换整个目录并将整个目录提交回SVN。但由于所有纯文本文件都是新生成的,因此它们在SVN中显示为已更改。我只想改变那些。

任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:4)

我安装了Groovy插件,配置了Groovy语言并创建了一个脚本,我将其作为“系统Groovy脚本”执行。脚本如下:

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”的命令行来提交更新的文件。

答案 1 :(得分:3)

初步说明:在SVN-jargon中从repo 获取文件是“checkout”,将保存到repo - “commit”。不要混用CVS和SVN术语,否则会导致误解

为了获得修订版(或revset)中已更改文件的列表,您可以使用

  • 简单方法 - svn log选项-q -v。对于单一版本,您还要添加-c REVNO,用于修订范围:-r REVSTART:REVEND。可能额外的--xml将产生比纯文本
  • 更合适的输出

你必须对日志的输出进行后处理以获得纯列表,因为:log包含一些对你无用的数据,如果是log for range,你可以将同一个文件包含在多个版本中

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,将repo-base添加到文件名

  • 更难的方式:使用额外的SCM(即 - Mercurial)和hgsubversion,您将获得更多(可能)使用hg log --template "{files}\n"的日志 - 仅稍微,因为您将只获得文件列表,但是不同版本中的文件集是换行符分隔的,修订版中的文件名是以空格分隔的