home *** CD-ROM | disk | FTP | other *** search
- #! /usr/bin/python
- # -*- coding: UTF-8 -*-
- #
- # © 2005 Josselin Mouette <joss@debian.org>
- # Licensed under the GNU LGPL, see /usr/share/common-licenses/LGPL-2.1
-
-
- defaults_dir = '/usr/share/gconf/defaults'
- outfile = '/var/lib/gconf/debian.defaults/%gconf-tree.xml'
-
- import os
-
-
- def htmlescape(str):
- return str.replace('&','&').replace('>','>').replace('<','<').replace('"','"')
-
- def int_entry(key,value):
- return '<entry name="' + key + '" type="int" value="' + value + '"/>\n'
-
- def bool_entry(key,value):
- return '<entry name="' + key + '" type="bool" value="' + value + '"/>\n'
-
- def float_entry(key,value):
- return '<entry name="' + key + '" type="float" value="' + value + '"/>\n'
-
- def string_entry(key,value):
- ret = '<entry name="' + key + '" type="string">\n'
- ret += ' <stringvalue>' + htmlescape(value) + '</stringvalue>\n'
- ret += '</entry>\n'
- return ret
-
- def list_entry(key,value):
- ret = '<entry name="' + key + '" type="list" ltype="string">\n'
- for v in value[1:-1].split(','):
- ret += ' <li type="string">\n'
- ret += ' <stringvalue>' + htmlescape(v) + '</stringvalue>\n'
- ret += ' </li>\n'
- ret += '</entry>\n'
- return ret
-
-
- def listcmp(a,b):
- """Number of starting similar elements in a and b"""
- m = min(len(a),len(b))
- for i in range(m):
- if a[i] != b[i]:
- return i
- return m
-
- defaults_files = os.listdir(defaults_dir)
- defaults_files.sort()
-
- gconf_val = {}
-
- for f in defaults_files:
- fd=open(defaults_dir+'/'+f)
- for line in fd:
- line = line.rstrip('\n')
- l = line.split(None,1)
- if len(l) == 2:
- gconf_val[l[0]] = l[1]
- fd.close()
-
- # start with
- out = open(outfile+'.tmp','w')
- out.write('<?xml version="1.0"?>\n<gconf>\n')
- prev = []
- keylist = gconf_val.keys()
- keylist.sort()
-
- for key in keylist:
- # separate the key in directories and key name
- cur = key.split('/')
- if cur[0] == '': del cur[0]
- keyname=cur.pop(-1)
-
- # go to the correct directory
- common = listcmp(prev,cur)
- out.write( (len(prev)-common)*'</dir>\n' )
- out.writelines( ['<dir name="'+dir+'">\n' for dir in cur[common:]] )
-
- # write the current entry
- value = gconf_val[key]
- if value[0] == '"' and value[-1] == '"':
- out.write(string_entry(keyname,value[1:-1]))
- elif value in ['true','false']:
- out.write(bool_entry(keyname,value))
- elif value[0] == '[' and value[-1] == ']':
- out.write(list_entry(keyname,value))
- elif value.isdigit():
- out.write(int_entry(keyname,value))
- else:
- try:
- float(value)
- out.write(float_entry(keyname,value))
- except ValueError:
- out.write(string_entry(keyname,value))
-
- prev=cur
-
- # Finalize
- out.write(len(prev)*'</dir>\n')
- out.write('</gconf>\n')
- out.close()
- os.chmod(outfile+'.tmp',0644)
- os.rename(outfile+'.tmp',outfile)
-
- os.system('kill -s HUP `pidof gconfd-2` >/dev/null 2>&1')
-