【问题标题】:getting the highest subversion revision in my `R CMD build` filename在我的“R CMD build”文件名中获得最高的颠覆版本
【发布时间】:2009-12-11 13:42:24
【问题描述】:

making-the-subversion-revision-number-visible-in-my-r-scripts之后的一个问题

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

不仅来自 svn 的严格顺序编号在这里不是很实用,而且它的$REV: number $ 格式不符合Version: 之后预期的number.number-number 结构。

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

但是你“通常”是怎么做的呢?


可以编写一个 bash/grep/awk 脚本,从源代码中获取最高 Rev,这不是问题。但是,configureR CMD build 之前运行吗?在这种情况下,可以从模板文件和最高版本号构建说明文件(不受源代码控制)。

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


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

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

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

【问题讨论】:

    标签: svn bash r


    【解决方案1】:

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

    #!/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,然后像 in 一样使用它

    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 时向马里奥建议的那样。

    然后,最后回答您的问题 :),您可以在任何您喜欢修改DESCRIPTION 文件的情况下,对您从svnversion 获得的存储库本身(或其顶级条目)的数字进行按摩。但是后来你修改了文件并且不同步了,所以你重新提交,得到一个新的修订,......所以你需要在某种方式上与自己达成一致来打破这个循环。

    【讨论】:

    • 是的:你对你的 C 项目所做的正是我想在我的 R 库中做的,即从目录树中提取最高的 svn 版本,把它放在一个不在下面的文件中版本控制,在我的代码中使用该文件。仅:我还想在DESCRIPTION中找到它,并且我需要在版本控制下的DESCRIPTION。看我自己的答案...
    【解决方案2】:

    调用 'svnversion ' 应该会为您提供所需的信息。

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

    $ 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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • :) 不,请不要 :) ...这样我的包文件将被称为 PKG_1.20091211120103-0.tar.gz!询问svn的修改日期并不难。此外,即使没有任何变化,您也会产生不同的分布。
      【解决方案4】:

      我使用了一个构建脚本,它从 svn 中检查出某个版本,用版本号更新DESCRIPTION,然后将它构建成一个tar.gz。

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

      【讨论】:

      • 愿意分享您的构建脚本吗?
      • Shane,如果您在DESCRIPTION中添加类似'SVN-Revision: $Rev$'这样的行并设置'svn propset',那么修订版会被颠覆自动更新。我这样做,例如带有日期:字段。
      • 不错!我现在就试试看。
      【解决方案5】:

      我看到在 R CMD build ... 命令期间调用了 ./cleanup。

      我想我会……

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

      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>DESCRIPTION以引导进程。


      感谢大家提供有用的 cmets,如果您认为我可以以更简洁的方式获得相同的结果,我有兴趣阅读。

      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'
      

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

      【讨论】:

      • 在我接受我自己的答案之前,我想先听听您的意见……这似乎更有礼貌:)
      • 如果您将包放在 CRAN 上,此解决方案并不令人满意,因为 R CMD build pkg 只被调用一次!
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 2010-12-19
        • 2012-09-12
        • 2021-07-22
        • 2012-10-11
        • 2013-05-24
        相关资源
        最近更新 更多