Bug #340475: Make repoman check if SVN keywords are enabled in svn:keywords.
authorArfrever Frehtes Taifersar Arahesis <Arfrever@Gentoo.Org>
Sat, 23 Oct 2010 16:38:02 +0000 (18:38 +0200)
committerZac Medico <zmedico@gentoo.org>
Wed, 27 Oct 2010 14:34:41 +0000 (07:34 -0700)
Add support for remaining keywords supported by SVN.

bin/repoman

index 0cdc0db8bb636ca8ad927035f7e6cb1e29ac34c1..bdf6444ed2c98f6080c3f3c8ffabba90894a7b0d 100755 (executable)
@@ -2151,19 +2151,10 @@ else:
                mychanged = [ "./" + elem.split()[-1:][0] for elem in svnstatus if elem and (elem[0] in "MR" or elem[1] in "M")]
                mynew     = [ "./" + elem.split()[-1:][0] for elem in svnstatus if elem.startswith("A")]
                myremoved = [ "./" + elem.split()[-1:][0] for elem in svnstatus if elem.startswith("D")]
-               # in contrast to CVS, SVN expands nothing by default.
-               # bin_blobs historically
-               # were just there to see what files need to be checked for
-               # keyword expansion, which is exactly what we do here, so
-               # slightly change the semantic meaning of "bin_blob"...  In the
-               # future we could store which keyword is expanded.
-               props = os.popen("svn propget -R svn:keywords").readlines()
 
-               # For files with multiple props set, props are delimited by newlines,
-               # so exclude lines that don't contain " - " since each of those lines
-               # only a contain props for a file listed on a previous line.
-               expansion = set("./" + prop.split(" - ")[0] \
-                       for prop in props if " - " in prop)
+               # Subversion expands keywords specified in svn:keywords properties.
+               props = os.popen("svn propget -R svn:keywords").readlines()
+               expansion = dict(("./" + prop.split(" - ")[0], prop.split(" - ")[1].split()) for prop in props)
 
        elif vcs == "git":
                mychanged = os.popen("git diff-index --name-only --relative --diff-filter=M HEAD").readlines()
@@ -2223,10 +2214,19 @@ else:
                print()
        else:
                if vcs == 'cvs':
-                       headerstring = "'\$(Header|Id)"
-               elif vcs == 'svn':
-                       headerstring = "'\$Id"
-               headerstring += ".*\$'"
+                       headerstring = "'\$(Header|Id).*\$'"
+               elif vcs == "svn":
+                       svn_keywords = ["Rev",
+                                       "Revision",
+                                       "LastChangedRevision",
+                                       "Date",
+                                       "LastChangedDate",
+                                       "Author",
+                                       "LastChangedBy",
+                                       "URL",
+                                       "HeadURL",
+                                       "Id",
+                                       "Header"]
 
                for myfile in myupdates:
 
@@ -2239,6 +2239,14 @@ else:
                        elif vcs == "svn":
                                if myfile not in expansion:
                                        continue
+                               
+                               # Subversion keywords are case-insensitive in svn:keywords properties, but case-sensitive in contents of files.
+                               enabled_keywords = []
+                               for keyword in svn_keywords:
+                                       if keyword.lower() in (k.lower() for k in expansion[myfile]):
+                                               enabled_keywords.append(keyword)
+
+                               headerstring = "'\$(%s).*\$'" % "|".join(enabled_keywords)
 
                        myout = subprocess_getstatusoutput("egrep -q "+headerstring+" "+myfile)
                        if myout[0] == 0: