source: branches/testScripts/NBsvnCommand.py @ 730

Last change on this file since 730 was 718, checked in by jpfasano, 12 years ago

Added comment about licensing

  • Property svn:eol-style set to native
File size: 5.1 KB
Line 
1#! /usr/bin/env python
2
3#------------------------------------------------------------------------
4# This file is distributed under the Common Public License.
5# It is part of the BuildTools project in COIN-OR (www.coin-or.org)
6#------------------------------------------------------------------------
7
8import os
9import urllib2
10import re
11import sys
12
13import NBlogMessages
14import NBemail
15import NBosCommand
16
17#------------------------------------------------------------------------
18# Function for executing svn commands
19#  svnCmd: String representing svn command
20#  dir: Directory where command is to be run from
21#  project: Coin project running the command (this is used to provide
22#           a better message if an error is detected
23#------------------------------------------------------------------------
24def run(svnCmd,dir,project) :
25  retVal='OK'
26  os.chdir(dir)
27  NBlogMessages.writeMessage('  Current directory: '+dir)
28  NBlogMessages.writeMessage('  '+svnCmd)
29  result = NBosCommand.run(svnCmd)
30  if result['returnCode'] != 0 :
31    NBemail.sendCmdMsgs(project,result,svnCmd)
32    retVal='Error'
33  return retVal
34
35
36#------------------------------------------------------------------------
37# Function which returns the latest stable version of a project
38#------------------------------------------------------------------------
39def latestStableVersion(project) :
40  url='https://projects.coin-or.org/svn/'+project+'/stable'
41  handle=urllib2.urlopen(url)
42  html=handle.read()
43  handle.close()
44
45  # In html code find the latest version number
46  #   <li><a href="3.2/">3.2/</a></li>
47  #   <li><a href="3.3/">3.3/</a></li>
48  r=r'<li><a href="(\d*\.\d*)/">(\d*\.\d*)/</a></li>'
49  findResult=re.findall(r,html)
50  if len(findResult)==0: return False
51  latestStableVersionRepeated2Times = findResult[-1:][0]
52  latestStableVersion=latestStableVersionRepeated2Times[0]
53  return latestStableVersion
54
55#------------------------------------------------------------------------
56# Function which returns the latest release version of a project
57# If there isn't a release version then False is returned
58#------------------------------------------------------------------------
59def latestReleaseVersion(project) :
60  url='https://projects.coin-or.org/svn/'+project+'/releases'
61  handle=urllib2.urlopen(url)
62  html=handle.read()
63  handle.close()
64
65  # In html code find the latest version number
66  #   <li><a href="1.6.0/">1.6.0/</a></li>
67  r=r'<li><a href="(\d*\.\d*.\d*)/">(\d*\.\d*.\d*)/</a></li>'
68  findResult=re.findall(r,html)
69  if len(findResult)==0: return False
70  latestReleaseVersionRepeated2Times = findResult[-1:][0]
71  latestReleaseVersion=latestReleaseVersionRepeated2Times[0]
72  return latestReleaseVersion
73
74
75#------------------------------------------------------------------------
76# Return svn revision number or url
77# If not found the return -1
78#------------------------------------------------------------------------
79def svnRevision(url) :
80  retVal=-1
81  result = NBosCommand.run('svn info '+url)
82  if result['returnCode']==0 :
83    #reg=r'Revision: (\d+)'
84    reg=r'Last Changed Rev: (\d+)'
85    found=re.findall(reg,result['stdout'])
86    if len(found)!=0 :
87      retVal=int(found[0])
88  return retVal
89 
90
91#------------------------------------------------------------------------
92# newer(source, target)
93# Return true if source and is more recently modified than target,
94# (ie return true if source is newer than target and target needs
95# to be rebuilt).
96#
97# If either sourrce or target don't exist then true is returned.
98#
99#------------------------------------------------------------------------
100def newer(source,target) :
101
102  #print '------------------------'
103  #print source
104  #print target
105  #print '------------------------'
106  #print ' '
107 
108  tarRev=svnRevision(target)
109  if tarRev==-1 :
110    # Target probably does not exist. It does not have an svn revision
111    # nubmer, so return that it is out of date.
112    return "Does not exist: "+target
113
114  srcRev=svnRevision(source)
115  if srcRev==-1 :
116    # Source should exist. Something is wrong that will be caught
117    # when an 'svn checkout' is done.
118    return "Does not exist: "+source
119
120  if srcRev>tarRev :
121    return "New revision of: "+source
122
123  # if there is an externals file then process it
124  extFileName=os.path.join(target,"Externals")
125  if os.path.isfile(extFileName) :
126    extFilePtr = open(extFileName, "r")
127    line = extFilePtr.readline()
128
129    while line:
130      line=line.strip()
131      if line!='' :
132        if line[0]!='#':
133          reg=r'(\S+)(\s+)(\S+)'
134          found=re.findall(reg,line)
135          if len(found)!=1:
136            # something is wrong. Do a rebuild
137            return "Assumed out of date when reading: "+extFileName
138          found=found[0]
139          if len(found)!=3 :
140            # something is wrong. Do a rebuild
141            return "Assumed out of date when reading: "+extFileName
142          extTarget=os.path.join(target,found[0])
143          extSource=found[2]
144          # Recursive call to see if external indicates rebuild
145          msg=newer(extSource,extTarget) 
146          if msg :
147            extFilePtr.close()
148            return msg
149      line = extFilePtr.readline()
150
151    extFilePtr.close()
152
153  return False
154
Note: See TracBrowser for help on using the repository browser.