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
字段的第三个坐标子目录。
一个“足够好”的答案可以在本地使用,我已经拥有它,但我不再使用它,因为我习惯于通常无法使用的东西。
因为它是关于练习的,所以我会将我目前的练习添加为可能的答案。它不是自动化的,但我发现它很清楚,并且(几乎)可以接受。
答案 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
保留在存储库中。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
),我不认为这是一个主要的限制,但它比我想要手工执行的工作更多,并且在更大的存储库中它肯定不令人满意修订号由不相关的提交增加。