home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / sbin / update-gconf-defaults < prev    next >
Encoding:
Text File  |  2006-05-23  |  2.8 KB  |  109 lines

  1. #! /usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. #
  4. # ┬⌐ 2005 Josselin Mouette <joss@debian.org>
  5. # Licensed under the GNU LGPL, see /usr/share/common-licenses/LGPL-2.1
  6.  
  7.  
  8. defaults_dir = '/usr/share/gconf/defaults'
  9. outfile = '/var/lib/gconf/debian.defaults/%gconf-tree.xml'
  10.  
  11. import os
  12.  
  13.  
  14. def htmlescape(str):
  15.   return str.replace('&','&').replace('>','>').replace('<','<').replace('"','"')
  16.  
  17. def int_entry(key,value):
  18.   return '<entry name="' + key + '" type="int" value="' + value + '"/>\n'
  19.  
  20. def bool_entry(key,value):
  21.   return '<entry name="' + key + '" type="bool" value="' + value + '"/>\n'
  22.  
  23. def float_entry(key,value):
  24.   return '<entry name="' + key + '" type="float" value="' + value + '"/>\n'
  25.  
  26. def string_entry(key,value):
  27.   ret = '<entry name="' + key + '" type="string">\n'
  28.   ret += '  <stringvalue>' + htmlescape(value) + '</stringvalue>\n'
  29.   ret += '</entry>\n'
  30.   return ret
  31.  
  32. def list_entry(key,value):
  33.   ret = '<entry name="' + key + '" type="list" ltype="string">\n'
  34.   for v in value[1:-1].split(','):
  35.     ret += '  <li type="string">\n'
  36.     ret += '    <stringvalue>' + htmlescape(v) + '</stringvalue>\n'
  37.     ret += '  </li>\n'
  38.   ret += '</entry>\n'
  39.   return ret
  40.  
  41.  
  42. def listcmp(a,b):
  43.   """Number of starting similar elements in a and b"""
  44.   m = min(len(a),len(b))
  45.   for i in range(m):
  46.     if a[i] != b[i]:
  47.       return i
  48.   return m
  49.  
  50. defaults_files = os.listdir(defaults_dir)
  51. defaults_files.sort()
  52.  
  53. gconf_val = {}
  54.  
  55. for f in defaults_files:
  56.   fd=open(defaults_dir+'/'+f)
  57.   for line in fd:
  58.     line = line.rstrip('\n')
  59.     l = line.split(None,1)
  60.     if len(l) == 2:
  61.       gconf_val[l[0]] = l[1]
  62.   fd.close()
  63.  
  64. # start with
  65. out = open(outfile+'.tmp','w')
  66. out.write('<?xml version="1.0"?>\n<gconf>\n')
  67. prev = []
  68. keylist = gconf_val.keys()
  69. keylist.sort()
  70.  
  71. for key in keylist:
  72.   # separate the key in directories and key name
  73.   cur = key.split('/')
  74.   if cur[0] == '': del cur[0]
  75.   keyname=cur.pop(-1)
  76.  
  77.   # go to the correct directory
  78.   common = listcmp(prev,cur)
  79.   out.write( (len(prev)-common)*'</dir>\n' )
  80.   out.writelines( ['<dir name="'+dir+'">\n' for dir in cur[common:]] )
  81.   
  82.   # write the current entry
  83.   value = gconf_val[key]
  84.   if value[0] == '"' and value[-1] == '"':
  85.     out.write(string_entry(keyname,value[1:-1]))
  86.   elif value in ['true','false']:
  87.     out.write(bool_entry(keyname,value))
  88.   elif value[0] == '[' and value[-1] == ']':
  89.     out.write(list_entry(keyname,value))
  90.   elif value.isdigit():
  91.     out.write(int_entry(keyname,value))
  92.   else:
  93.     try:
  94.       float(value)
  95.       out.write(float_entry(keyname,value))
  96.     except ValueError:
  97.       out.write(string_entry(keyname,value))
  98.  
  99.   prev=cur
  100.  
  101. # Finalize
  102. out.write(len(prev)*'</dir>\n')
  103. out.write('</gconf>\n')
  104. out.close()
  105. os.chmod(outfile+'.tmp',0644)
  106. os.rename(outfile+'.tmp',outfile)
  107.  
  108. os.system('kill -s HUP `pidof gconfd-2` >/dev/null 2>&1')
  109.