在我的`R CMD build`文件名中获得最高的颠覆修订版

时间:2009-12-11 13:42:25

标签: svn bash r

making-the-subversion-revision-number-visible-in-my-r-scripts

之后的问题

R CMD build PKG根据DESCRIPTION中的字段创建名为Package_Version.tar.gz的文件。

不仅来自svn的严格顺序编号在这里非常实用,而且其$REV: number $格式不尊重number.number-number之后预期的Version:结构。

我想我想使用subversion版本号作为包版本的第三个“坐标”。第一个和第二个坐标将在重大变化时手动提升。

但你怎么“正常”做?


可以编写一个bash / grep / awk脚本,从源中获取最高的Rev,这不会有问题。但是,configure之前是R CMD build吗?在这种情况下,可以从模板文件和最高版本号构建描述文件(保持在源代码管理之外)。

我的问题是关于常规做法。


“最佳”答案允许我在r-forge上放置一个包并让自动脚本在那里运行,从Version:中提交的最新文件更新R字段的第三个坐标子目录。

一个“足够好”的答案可以在本地使用,我已经拥有它,但我不再使用它,因为我习惯于通常无法使用的东西。

因为它是关于练习的,所以我会将我目前的练习添加为可能的答案。它不是自动化的,但我发现它很清楚,并且(几乎)可以接受。

6 个答案:

答案 0 :(得分:2)

我也使用svnversion来自动执行此操作。例如。对于小编,当然编译,我这样做:

#!/bin/sh -e

svnversion() {
    svnrevision=`LC_ALL=C svn info | awk '/^Revision:/ {print $2}'`
    svndate=`LC_ALL=C svn info | awk '/^Last Changed Date:/ {print $4,$5}'`

    now=`date`

    cat <<EOF > svnversion.h

// Do not edit!  This file was autogenerated
//      by $0
//      on $now
//
// svnrevision and svndate are as reported by svn at that point in time,
// compiledate and compiletime are being filled gcc at compilation

#include <stdlib.h>

static const char* svnrevision = "$svnrevision";
static const char* svndate = "$svndate";
static const char* compiletime = __TIME__;
static const char* compiledate = __DATE__;

EOF
}

if [ "$#" -ge 0 ]; then
    if [ "$1" = "--svnversion" ]; then
        svnversion
        exit
    fi
fi

test -f svnversion.h || svnversion
从Makefile中

然后在

中使用它
void showVersionAndExit() {
    printf("%s ('%s') version %s\n\tsvn revision %s as of %s\n\t"
           "built at %s on %s\n",
           binaryName, programName, VERSION,
           svnrevision, svndate, compiletime, compiledate);
    /* more code below ... */

对于R来说也是如此,最简单的方法是访问描述文件,就像我建议马里奥回答his earlier question一样。

然后,最后回答你的问题:),您可以按照svnversion从存储库本身(或其顶级条目)获得的数字按下您想要修改描述文件的任何数字。但是你修改了文件并且不同步,所以你重新提交,获得一个新版本,......所以你需要在某种程度上同意自己来打破这个循环。

答案 1 :(得分:1)

调用'svnversion&lt; working-copy&gt;'应该为您提供所需的信息。

如果您的工作副本被修改,或者包​​含多个版本的文件,则您获得的不仅仅是版本号。范围(多个修订)或后缀字母(修改,切换或稀疏工作副本)。

$ svnversion --help
usage: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]

  Produce a compact 'version number' for the working copy path
  WC_PATH.  TRAIL_URL is the trailing portion of the URL used to
  determine if WC_PATH itself is switched (detection of switches
  within WC_PATH does not rely on TRAIL_URL).  The version number
  is written to standard output.  For example:

    $ svnversion . /repos/svn/trunk
    4168

  The version number will be a single number if the working
  copy is single revision, unmodified, not switched and with
  an URL that matches the TRAIL_URL argument.  If the working
  copy is unusual the version number will be more complex:

   4123:4168     mixed revision working copy
   4168M         modified working copy
   4123S         switched working copy
   4123P         partial working copy, from a sparse checkout
   4123:4168MS   mixed revision, modified, switched working copy

  If invoked on a directory that is not a working copy, an
  exported directory say, the program will output 'exported'.

  If invoked without arguments WC_PATH will be the current directory.

Valid options:
  -n [--no-newline]        : do not output the trailing newline
  -c [--committed]         : last changed rather than current revisions
  -h [--help]              : display this help
  --version                : show program version information

答案 2 :(得分:0)

我使用构建脚本从svn检出某个修订版本,使用版本号更新DESCRIPTION,并将其构建为tar.gz.

我通过使用Jira中的路线图功能将问题/ svn提交捆绑为版本(Apache基础使用相同的基本方法as in the this example)来管理流程。

答案 3 :(得分:0)

使用时间戳2009年12月11日12:01:03变成20091211120103会更容易吗。然后你可以在构建的subversion中添加一个标签,并知道哪个源对应于哪个构建。

答案 4 :(得分:0)

我看到./cleanup是在R CMD build ...命令中调用的。

我想我要去......

  • DESCRIPTION.template保留在存储库中。
  • 指示subversion忽略DESCRIPTION
  • 使用cleanup脚本。
  • 接受我必须运行R CMD build两次DESCRIPTION中的元信息在由R CMD build计算之前由cleanup检查。

cleanup

#!/bin/bash
FLAGS=$(svnversion . | tr -cd A-Z)

VERSIONS=$(svnversion . | tr -d A-Z)
VERSIONS=$(echo $VERSIONS:$VERSIONS | cut -d: -f1,2)
LOW=${VERSIONS%:*}
HIGH=${VERSIONS#*:}

[ $LOW -ne $HIGH ] && echo "- mixed revisions in local copy ($LOW:$HIGH)"
[ "$FLAGS" != "" ] && echo "- local copy has flags: $FLAGS"
echo "- highest revision in local copy: $HIGH"

sed -re "s/(^Version:[^-]*).+$/\1-$HIGH/" DESCRIPTION.template > DESCRIPTION

DATE=`LC_ALL=C svn info | awk '/^Last Changed Date:/ {print $4,$5}'`

now=$(date)
cat <<EOF > R/version.R
# Do not edit!  This file was autogenerated
#      by $0
#      on $now
#
# DO NOT put this file under version control!
#
# SVNVERSION as the highest revision reported by svnversion.
# DATE as the Last Changed Date reported by svn info.

SVNVERSION <- "$HIGH"
SVNDATE <- "$DATE"
EOF

显然我必须复制DESCRIPTION.template&gt;描述以引导过程。


感谢大家的有用评论,如果你认为我能以更清洁的方式取得同样的结果,我有兴趣阅读。

mario@lt41:~/Local/.../Trunk/Rnens$ R CMD build src
* checking for file 'src/DESCRIPTION' ... OK
* preparing 'src':
* checking DESCRIPTION meta-information ... OK
* running cleanup
- highest revision in local copy: 8762
* removing junk files
* checking for LF line-endings in source and make files
* checking for empty or unneeded directories
* building 'NenS_0.1-8762.tar.gz'

但我必须说,我对当前的解决方案感到满意,并希望它对其他人有用。

答案 5 :(得分:0)

我现在的做法根本不是自动化的:我给问题中的Version:字段的三个坐标,但第三个坐标(svn修订号),我手动更新(递增)在每次提交之前由一个)。

从Emacs工作(使用psvn),我不认为这是一个主要的限制,但它比我想要手工执行的工作更多,并且在更大的存储库中它肯定不令人满意修订号由不相关的提交增加。