2008-10-28 29 views
3

編輯:這個問題重複How to access the current Subversion build number?(謝謝你的擡起頭,查爾斯!)如何在Python代碼中添加svn存儲庫內部版本號?

您好,

這個問題類似於Getting the subversion repository number into code

是差異:

  1. 我想修改號碼添加到Python

  2. 我想要的庫(未簽出的文件)

即修訂我想從提取自迴歸修訂號「SVN信息」,likeso:

$ SVN信息

Path: . 
URL: svn://localhost/B/trunk 
Repository Root: svn://localhost/B 
Revision: 375 
Node Kind: directory 
Schedule: normal 
Last Changed Author: bmh 
Last Changed Rev: 375 
Last Changed Date: 2008-10-27 12:09:00 -0400 (Mon, 27 Oct 2008) 

我想與375(修訂)的變量。將$ Rev $放入一個變量以跟蹤文件上的變化很容易。但是,我想跟蹤版本庫的版本,並且我明白(並且似乎基於我的測試)$ Rev $只在文件更改時更新。

我最初的想法轉向使用Python中內置的svn/libsvn模塊,儘管我找不到任何關於如何使用它們的文檔或示例。

或者,我認爲調用'svn info'並將代碼正則表達出來,儘管這看起來相當殘酷。 :)

幫助將不勝感激。

謝謝&乾杯。

+0

這個問題有很多很多重複 - 我很難看到它是如何是一個特定於python的問題(或具有python特定的答案),除非你想綁定到基於setuptools的構建過程或類似。 – 2008-10-28 12:57:37

+0

http://stackoverflow.com/questions/110175/how-to-access-the-current-subversion-build-number#111173 – 2008-10-28 12:59:44

回答

3

有一個叫svnversion命令,它配備了顛覆,其目的是解決正是這樣的問題。

1

我使用非常類似這樣的技術,以顯示我的殼當前顛覆版本號:

svnRev=$(echo "$(svn info)" | grep "^Revision" | awk -F": " '{print $2};') 
echo $svnRev 

它的工作對我非常好。

爲什麼每次整個存儲庫的版本號增加時都要更改python文件?這將使兩個文件之間的差異,如果一個來自repo,另一個來自tarball,則會做這樣的事情。

+0

我會想象BMH不想在每個文件中使用這個,但有一個詳細介紹系統當前版本的單個位置 - 查看此頁面的右下角的示例。 – Cebjyre 2008-10-28 06:06:53

2

Python直接綁定到libsvn,所以你不需要調用命令在線客戶端。有關更多詳細信息,請參見this blog post

編輯:基本上你可以做這樣的事情:

from svn import fs, repos, core 
repository = repos.open(root_path) 
fs_ptr = repos.fs(repository) 
youngest_revision_number = fs.youngest_rev(fs_ptr) 
+0

是的,但是這並不能讓你訪問svnversion中的所有邏輯 - 在這種情況下,它確實*正確的事情。 – 2008-10-28 12:56:07

1

如果你想在一個源文件中有一個變量可以設置爲當前的工作副本修訂版,並且不會在顛覆版上重播,而且在你運行你的程序時實際可用的工作副本,那麼我的SubWCRev my做你的解決方案。

看起來也似乎是Linux端口稱爲SVNWCRev

兩個執行$ WCREV $最高提交的工作拷貝水平替換。其他信息也可以提供。

3
直接從Django的

被盜:

def get_svn_revision(path=None): 
    rev = None 
    if path is None: 
     path = MODULE.__path__[0] 
    entries_path = '%s/.svn/entries' % path 

    if os.path.exists(entries_path): 
     entries = open(entries_path, 'r').read() 
     # Versions >= 7 of the entries file are flat text. The first line is 
     # the version number. The next set of digits after 'dir' is the revision. 
     if re.match('(\d+)', entries): 
      rev_match = re.search('\d+\s+dir\s+(\d+)', entries) 
      if rev_match: 
       rev = rev_match.groups()[0] 
     # Older XML versions of the file specify revision as an attribute of 
     # the first entries node. 
     else: 
      from xml.dom import minidom 
      dom = minidom.parse(entries_path) 
      rev = dom.getElementsByTagName('entry')[0].getAttribute('revision') 

    if rev: 
     return u'SVN-%s' % rev 
    return u'SVN-unknown' 

適應適當的。 YOu可能想要改變你的代碼模塊名稱的MODULE。

即使目標系統沒有安裝subversion,此代碼的優勢仍然有效。

0

基於CesarB的響應和查爾斯提供的鏈接,我已經做了以下內容:

try: 
    from subprocess import Popen, PIPE 
    _p = Popen(["svnversion", "."], stdout=PIPE) 
    REVISION= _p.communicate()[0] 
    _p = None # otherwise we get a wild exception when Django auto-reloads 
except Exception, e: 
    print "Could not get revision number: ", e 
    REVISION="Unknown" 

天哪Python是涼爽。 :)

相關問題