Getting SVN revision number into a program automatically

三世轮回 提交于 2019-11-26 15:55:30

问题


I have a python project under SVN, and I'm wanting to display the version number when it is run. Is there any way of doing this (such as automatically running a short script on commit which could update a version file, or querying an SVN repository in Python?)


回答1:


I'm not sure about the Python specifics, but if put the string $Revision$ into your file somewhere and you have enable-auto-props=true in your SVN config, it'll get rewritten to something like $Revision: 144$. You could then parse this in your script.

There are a number of property keywords you can use in this way.

This won't have any overhead, e.g. querying the SVN repo, because the string is hard-coded into your file on commit or update.

I'm not sure how you'd parse this in Python but in PHP I'd do:

$revString = '$Revision: 144$';
if(preg_match('/: ([0-9]+)\$/', $revString, $matches) {
    echo 'Revision is ' . $matches[1];
}



回答2:


Similar to, but a little more pythonic than the PHP answer; put this in your module's __init__.py:

__version__ = filter(str.isdigit, "$Revision: 13 $")

and make sure you add the Revision property:

svn propset svn:keywords Revision __init__.py



回答3:


Or you can do like this:

import re,subprocess

svn_info = subprocess.check_output("svn info")

print (re.search(ur"Revision:\s\d+", svn_info)).group()

it prints "Revision: 2874" in my project

Or like this:

print (subprocess.check_output("svnversion")).split(":")[0]

it prints "2874" in my project




回答4:


The file hooks/pre-commit in your repository is a script or program which will be executed before a successful commit. Simply make this a script which updates your file with the proper version number as it is being committed (the revision number is passed to your script as it's run). Here's a tutorial with an example of writing a pre-commit hook: http://wordaligned.org/articles/a-subversion-pre-commit-hook




回答5:


There's a snippet of code in Django that allows you to do this, I'd recommend looking at it. http://code.djangoproject.com/browser/django/trunk/django/utils/version.py




回答6:


Check out pysvn. it exposes extensions in Python for Subversion runtime functionality.




回答7:


I do this by simply running a small script when building my project. The script just calls svn info in combination with sed to get out the bare revision data and injects that number into the revision.txt file.

The Hudson build server makes it even easier as it sets the SVN revision number as an environment variable right before invoking your Build scripts.




回答8:


I find the when it is run section slightly ambiguous - when it is run from where ? From an SVN checkout or from released code ? All the solutions work on injecting the SVN version somehow into the Python source or somewhere in the repository in a separate version file.

The version file is changed on fresh checkouts, so clean checkouts need to be done before distribution. So my question of where the program is being run remains.




回答9:


This worked for me in Python:

Get all the svn info:

svn_info = subprocess.check_output('svn info').decode("utf-8") 
print(svn_info)

Do your search and split off the number:

revisionNum = re.search("Revision:\s\d+", svn_info)
print(revisionNum.group().split(":")[1])



回答10:


You could do this programmatically by parsing the output from 'svn info --xml' to an xml Element:

def get_svn_rev(dir: Union[str, Path]) -> str:
    """Get the svn revision of the given directory"""
    dir = str(dir)
    svn_info_cmd = ['svn', 'info', '--xml', dir]
    print(' '.join(svn_info_cmd))
    svn_info_process = subprocess.run(svn_info_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if svn_info_process.returncode:
        eprint(svn_info_process.stderr.decode().strip())
        raise subprocess.CalledProcessError(returncode=svn_info_process.returncode, cmd=svn_info_cmd,
                                            output=svn_info_process.stdout,
                                            stderr=svn_info_process.stderr)
    else:
        info = ElementTree.fromstring(svn_info_process.stdout.decode().strip())
        entry = info.find('entry')
        revision = entry.get('revision')

    return revision


来源:https://stackoverflow.com/questions/1449935/getting-svn-revision-number-into-a-program-automatically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!