2009-09-20 6 views
17

मेरे पास एसवीएन के तहत एक पायथन परियोजना है, और मैं इसे चलाते समय संस्करण संख्या प्रदर्शित करना चाहता हूं। ऐसा करने का कोई तरीका है (जैसे कि स्वचालित रूप से प्रतिबद्धता पर एक छोटी स्क्रिप्ट चलाना जो संस्करण फ़ाइल को अपडेट कर सकता है, या पायथन में एसवीएन रिपोजिटरी से पूछताछ कर सकता है?)स्वचालित रूप से एक प्रोग्राम में एसवीएन संशोधन संख्या प्राप्त करना

उत्तर

25

मुझे पाइथन विनिर्देशों के बारे में निश्चित नहीं है, लेकिन यदि आपकी फ़ाइल में स्ट्रिंग $ संशोधन $ डाल दें और आपके पास अपने एसवीएन कॉन्फ़िगरेशन में सक्षम-ऑटो-प्रोप = सत्य है, तो इसे $ संशोधन: 144 $। फिर आप इसे अपनी लिपि में पार्स कर सकते हैं।

वहाँ a number of property keywords you can use in this way हैं।

इसमें कोई ओवरहेड नहीं होगा, उदा। एसवीएन रेपो से पूछताछ, क्योंकि स्ट्रिंग को आपकी फाइल में प्रतिबद्ध या अद्यतन पर हार्ड कोड किया गया है।

मुझे यकीन है कि तुम कैसे पायथन में इस पार्स चाहते हैं नहीं कर रहा हूँ, लेकिन PHP में मुझे क्या करना चाहते हैं:

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

यह सही जवाब है! साथ ही, प्रत्येक फ़ाइल पर संपत्ति 'कीवर्ड = संशोधन' सेट करना याद रखें जिसे आप करना चाहते हैं। –

+0

ड्रू - मुझे लगता है कि अगर सक्षम-ऑटो-प्रोप = सत्य सेट है, तो डिफ़ॉल्ट कीवर्ड सभी सेट हैं? –

+3

+1 यह कमाल है! मेरे मामले में, हालांकि, क्या एसवीएन संशोधन संख्या को संपादित करने का कोई तरीका है यदि यह एक अलग फ़ाइल है जो इस संशोधन में बदल दी गई है? उदाहरण के लिए, यदि मेरे पास version.py में संशोधन संख्या कीवर्ड है, लेकिन मैं संशोधन एनएनएन में version.py नहीं बदलता, तो यह इसे अपडेट नहीं करेगा, है ना? यदि नहीं, तो इस विधि का उपयोग इस तरह से करने का कोई तरीका है? – Smashery

4

आपके भंडार में hooks/pre-commit फ़ाइल एक स्क्रिप्ट या प्रोग्राम है जो एक सफल प्रतिबद्धता से पहले निष्पादित किया जाना चाहिए। बस इसे एक स्क्रिप्ट बनाएं जो आपकी फ़ाइल को उचित संस्करण संख्या के साथ अद्यतन करता है क्योंकि यह किया जा रहा है (संशोधित संख्या आपकी स्क्रिप्ट को चलाने के बाद पास की जाती है)। प्री-प्रतिबद्ध हुक लिखने के उदाहरण के साथ एक ट्यूटोरियल यहां दिया गया है: http://wordaligned.org/articles/a-subversion-pre-commit-hook

+2

आउच में "2874" प्रिंट करता है। पूर्व-प्रतिबद्ध हुक संशोधित फ़ाइलों को आम तौर पर एक बुरा विचार देना है। रेपो में संस्करण कामकाजी प्रतिलिपि में संस्करण से अलग होगा, और इससे कुछ भ्रम पैदा हो सकता है। कमिटर को फ़ाइल के पहले संस्करण में वापस जाना होगा, और फिर नया प्राप्त करें, संभवतः किसी प्रकार का संघर्ष हो सकता है, क्योंकि एसवीएन ने मूल संस्करण को वर्किंग कॉपी के टेक्स्ट-बेस में संग्रहीत किया है। – sunny256

+0

मैं मानता हूं कि यह खतरनाक है और आमतौर पर वांछित व्यवहार नहीं है, लेकिन यदि आप स्वयं को उचित रूप से सीमित करते हैं, तो मुझे समस्या दिखाई नहीं दे रही है। उदाहरण के लिए, यदि आपके पास "svn_version.txt" फ़ाइल है जिसमें वर्तमान संशोधन संख्या के अलावा कुछ भी नहीं है, तो यह पूरी तरह से सुरक्षित होगा; आपकी स्थानीय प्रति में हमेशा वह संस्करण होगा जिसे आपने चेक आउट किया है और रिपोजिटरी में हमेशा नवीनतम होगा (अक्सर आपकी कार्यशील प्रति के समान)। –

3

pysvn देखें। यह सबवर्सन रनटाइम कार्यक्षमता के लिए पायथन में एक्सटेंशन का खुलासा करता है।

+1

+1 pysvn के लिए +1, लेकिन यह "0" –

4

Django में कोड का एक स्निपेट है जो आपको ऐसा करने की अनुमति देता है, मैं इसे देखने की अनुशंसा करता हूं। http://code.djangoproject.com/browser/django/trunk/django/utils/version.py

+0

से जुड़ने से बचने के लिए सबसे अच्छा है यह फ़ंक्शन केवल तभी काम करता है जब आप उपवर्तन चेकआउट के भीतर से चल रहे हों। यदि ओपी चाहता है, तो समस्या हल हो गई। हालांकि, मुझे संदेह है कि वह स्क्रिप्ट को स्वयं या कॉन्फ़िगरेशन फ़ाइल या उसके उपवर्तन संशोधन में शामिल करना चाह सकता है, भले ही स्क्रिप्ट अब विचलन के अधीन न हो, इस मामले में कि लिंक उपयोगी नहीं होगा। –

+0

हाँ, यह बहुत अच्छा फॉलबैक विकल्प है, लेकिन संस्करण नियंत्रण के तहत संस्करण संख्या भी बेहतर होगी। धन्यवाद! +1 – Smashery

3

मैं अपनी परियोजना के निर्माण के दौरान बस एक छोटी सी स्क्रिप्ट चलाकर ऐसा करता हूं। स्क्रिप्ट सिर्फ नंगे संशोधन डेटा प्राप्त करने के लिए sed के साथ संयोजन में svn जानकारी को कॉल करता है और उस संख्या को revision.txt फ़ाइल में इंजेक्ट करता है।

हडसन बिल्ड सर्वर इसे और भी आसान बनाता है क्योंकि यह आपकी बिल्ड स्क्रिप्ट को आमंत्रित करने से पहले एसवीएन संशोधन संख्या को पर्यावरण चर के रूप में सेट करता है।

+0

हम यह भी करते हैं, अच्छी तरह से काम करता है – orip

1

मैं जब यह चलाया जाता है अनुभाग थोड़ा अस्पष्ट लगता है - जब यह कहाँ से चलाया जाता है? एक एसवीएन चेकआउट से या जारी कोड से? सभी समाधान किसी भी तरह से पाइथन स्रोत में या कहीं अलग संस्करण फ़ाइल में भंडार में एसवीएन संस्करण इंजेक्शन पर काम करते हैं।

संस्करण फ़ाइल ताजा checkouts पर बदल गया है, तो साफ checkouts वितरण से पहले किया जाना करने की जरूरत है। तो मेरा सवाल है कि कार्यक्रम कहां चल रहा है।

13

इसी तरह, लेकिन PHP उत्तर से थोड़ा अधिक पायथनिक; अपने मॉड्यूल के __init__.py में रखते:

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

और सुनिश्चित करें कि आप संशोधन संपत्ति जोड़ें:

svn propset svn:keywords Revision __init__.py 
+1

या '' .join (c में $ c "$ LastChangedRevision: 1546 $" अगर c.isdigit()) यदि आपको फ़िल्टर पसंद नहीं है। –

7

या आप इस तरह कर सकते हैं:

import re,subprocess 

svn_info = subprocess.check_output("svn info") 

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

यह मेरी परियोजना में "Revision: 2874" प्रिंट

या इस तरह:

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

यह मेरी परियोजना

+0

केवल एक कार्यशील प्रति के साथ काम करता है। – bahrep

+0

न केवल काम करने वाली प्रति के साथ। आप पहले "svn info" से svn दूरस्थ URL पुनर्प्राप्त कर सकते हैं, जैसे "svn info" निष्पादित करें, फिर आउटपुट से "URL" param value लें और उसी कोड को निष्पादित करें, लेकिन "svn info value_of_URL_param" का उपयोग करके, अद्यतन कोड है: आयात कर रहे हैं, उपप्रक्रिया svn_info = subprocess.check_output ("SVN जानकारी https: //svn.you_remote_repo_url") प्रिंट (पुनः। –

संबंधित मुद्दे