]> git.pld-linux.org Git - packages/rpm-build-tools.git/blobdiff - spec_utf8
do exact bcond match when reporting active bconds
[packages/rpm-build-tools.git] / spec_utf8
old mode 100644 (file)
new mode 100755 (executable)
index 5aa0b7c..d2c564b
--- a/spec_utf8
+++ b/spec_utf8
@@ -1,6 +1,8 @@
 #!/usr/bin/python
 
-import os, os.path, re, sys, locale
+debug = False
+
+import os, os.path, re, sys, locale, StringIO, filecmp
 
 langs={
     'bg':'windows-1251',
@@ -12,6 +14,7 @@ langs={
     'en':'iso8859-1',
     'eo':'iso8859-3',
     'es':'iso8859-1',
+    'et':'iso8859-15',
     'fi':'iso8859-1',
     'fo':'iso8859-1',
     'fr':'iso8859-1',
@@ -41,58 +44,110 @@ langs={
     'zh_TW':'BIG5',
     0:0}
 
+def find_encoding(lang):
+  r = re.match("^([^.]+)(\.[^@]+)?$", lang)
+  pure_lang = r.group(1)
+  if r.group(2) == None:
+    try:
+      enc = langs[lang]
+    except KeyError:
+      enc = None
+  else:
+    # strip dot
+    enc = r.group(2)[1:]
+  return (enc, pure_lang)
+
 def parse_spec(infile, outfile):
-  re_summary = re.compile("^Summary\(([^\)]+)\):\t+(.*)$")
-  re_utf = re.compile(".utf-8$", re.I)
+  success = True
+  re_summary = re.compile("^Summary\(([^\)]+)\):[ \t]+(.*)$")
+  re_utf = re.compile("^utf-8$", re.I)
   re_desc = re.compile("^(%description.*\s)-l\s+([\S]+)($|\s.*$)")
-  re_proc = re.compile("^%")
+  re_proc = re.compile("^%[^{]")
+  re_ignore_proc = re.compile("^%(if|endif)")
+  re_changelog = re.compile("^%changelog")
   in_desc = False
+  in_changelog = False
 
   for l in infile:
-      outline = l
+    outline = l
+    if debug: outfile.write("%s, %s, %s" % (in_desc, in_changelog, l))
+
+    # %description start
+    r = re_desc.match(l)
+    if r:
+      lang = r.group(2)
+      (enc, pure_lang) = find_encoding(lang)
+      if enc == None:
+        outfile.write("#spec_utf8: unknown lang code in %%description -l %s\n" % (lang))
+       success = False
+      elif not re_utf.search(enc):
+        in_desc = True
+        outline = "%s-l %s.UTF-8%s\n" % (r.group(1), pure_lang, r.group(3))
+    elif in_desc:
+      if re_proc.search(l) and not re_ignore_proc.search(l):
+        in_desc = False
+      else:
+        # %description continues
+        if not re_utf.search(enc):
+          try:
+            outline = unicode(l, enc).encode("UTF-8")
+          except UnicodeDecodeError:
+            outfile.write("#spec_utf8: transcoding error %%description -l %s\n" % (pure_lang))
+           success = False
+    elif in_changelog:
+      try:
+        outline = unicode(l, "UTF-8").encode("UTF-8")
+      except UnicodeDecodeError:
+        try:
+          outline = unicode(l, "ISO-8859-2").encode("UTF-8")
+        except UnicodeDecodeError:
+          outfile.write("#spec_utf8: transcoding next line from Latin2 failed\n")
+         success = False
+    else: 
+      # Summary
       r = re_summary.match(l)
       if r:
         lang = r.group(1)
-        if re_utf.search(lang):
-          outfile.write(l)
-          continue
-        if lang in langs.keys():
+        (enc, pure_lang) = find_encoding(lang)
+        if enc == None:
+          outfile.write("#spec_utf8: unknown lang code in Summary(%s)\n" % (lang))
+         success = False
+        elif not re_utf.search(enc):
           try:
-            desc = unicode(r.group(2), langs[lang]).encode("UTF-8")
-            l = "Summary(%s.UTF-8):   %s\n" % (lang, desc)
+            desc = unicode(r.group(2), enc).encode("UTF-8")
+            outline = "Summary(%s.UTF-8):\t%s\n" % (pure_lang, desc)
           except UnicodeDecodeError:
-            outfile.write("#transcoding error Summary(%s)\n" % (lang))
-        else:
-          outfile.write("#unknow lang code Summary(%s)\n" % (lang))
-      if in_desc:
-        if re_proc.search(l):
-          in_desc = False
-        else:
-          if not langs[lang] == 'UTF-8':
-            try:
-              l = unicode(l, langs[lang]).encode("UTF-8")
-            except UnicodeDecodeError:
-              outfile.write("#transcoding error %%description -l %s\n" % (lang))
-
-      r = re_desc.match(l)
-      if r:
-        lang = r.group(2)
-        if re_utf.search(lang):
-          outfile.write(l)
-          continue
-        in_desc = True
-        if not lang in langs.keys():
-          outfile.write("#unknow lang code in %%description -l %s\n" % (lang))
-        else:
-          l = "%s-l %s.UTF-8%s\n" % (r.group(1), lang, r.group(3))
-
-      outfile.write(l)
+            outfile.write("#spec_utf8: transcoding error Summary(%s)\n" % (lang))
+           success = False
+      elif re_changelog.match(l):
+        # %changelog start
+        in_changelog = True
+    
+    
+    if debug: outfile.write("%s, %s\n"% (in_desc, in_changelog))
+    outfile.write("%s"% (outline, ))
+  return success
 
-
-
-def main():
-  parse_spec(sys.stdin, sys.stdout)
+def main(spec):
+  tmp = spec + '.tmp'
+  print "Converting %s ..." % spec
+  f = open(spec, 'r')
+  sio = StringIO.StringIO()
+  sio.write(f.read())
+  f.close()
+  sio.seek(0)
+  f = open(tmp, 'w')
+  if not parse_spec(sio, f):
+         sys.stderr.write("   Problems while converting %s.\n" % spec)
+  f.close()
+  if filecmp.cmp(spec, tmp, False):
+    os.remove(tmp)
+  else:
+    os.rename(tmp, spec)
 
 if __name__ == "__main__":
-  main()
-
+  if len(sys.argv) == 1:
+    sys.stderr.write("Usage: %s <spec-files>\n" % sys.argv[0])
+    sys.exit(1)
+  for spec in sys.argv[1:]:
+    main(spec)
This page took 0.080209 seconds and 4 git commands to generate.