build/buildutils/setpolicyfiles.py
changeset 21 2a9601315dfc
child 80 d6dafc5d983f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/build/buildutils/setpolicyfiles.py	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,162 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/bin/python
+
+import datetime, os, os.path, sys, traceback
+from optparse import OptionParser
+
+"""This script sets up S60 distribution policy files."""
+
+class PolicyData:
+    def __init__(self):
+        self.root_policy = None
+        self.policies = []
+        self.created_policies = 0
+        self.existing_policies = 0
+        self.warning_count = 0
+        self.start_time = datetime.datetime.now()
+        self.stop_time = None
+    def __str__(self):
+        if self.stop_time is None:
+            self.stop_time = datetime.datetime.now()
+        msg = "Distribution policies generation time " + str(self.stop_time - self.start_time)
+        msg += "\nCreated policies: " + str(self.created_policies)
+        msg += "\nExisting policies: " + str(self.existing_policies)
+        if self.warning_count > 0:
+            msg += "\nWarnings: " + str(self.warning_count)
+        return msg
+
+policy_data = PolicyData()
+
+def main():
+    parser = OptionParser(usage = "python -u %prog [options] <path>")
+    (opts, args) = parser.parse_args()
+    root_path = args[0]
+    if not os.path.isdir(root_path):
+        print "ERROR: %s is not a directory" % root_path
+        sys.exit(1);
+
+    try:
+        global policy_data
+        print "Started " + str(policy_data.start_time)
+        parseConfigurationFile(policy_data)
+        print "Generating S60 distribution policies to", root_path
+        print "Policy config:", str(policy_data.policies)
+        print "Policy for root dir:", str(policy_data.root_policy)
+        writePolicies(root_path, policy_data)
+        policy_data.stop_time = datetime.datetime.now()
+        print "Finished " + str(policy_data.stop_time)
+        print str(policy_data)
+    except:
+        print "ERROR: Unexpected exception"
+        traceback.print_exc()
+        print str(policy_data)
+        sys.exit(1)
+
+def parseConfigurationFile(policy_data):
+    config_file = "distribution.policy.s60.configuration.txt"
+    f = open(config_file)
+    try:
+        default_policy = None
+        line_count = 0;
+        for line in f.readlines():
+            line_count += 1
+            line = line.strip()
+            if len(line) == 0 or line.find("#") == 0:
+                continue
+            tokens = line.split(':')
+            if len(tokens) != 2:
+                print "ERROR: Invalid line", line_count, "at file", config_file
+                sys.exit(1)
+            dir = tokens[0].strip()
+            dir = dir.replace("/", os.sep)
+            policy = tokens[1].strip()
+            if dir == "DEFAULT_POLICY":
+                default_policy = policy
+            elif dir == "ROOT_POLICY":
+                policy_data.root_policy = policy
+            else:
+                policy_data.policies += [(dir, policy)]
+        if default_policy is None:
+            print "ERROR: Default policy not defined at", config_file
+            sys.exit(1)
+        policy_data.policies += [("", default_policy)]
+    finally:
+        f.close()
+
+def writePolicies(root_path, policy_data):
+    # Write policy for the root directory.
+    if (not policy_data.root_policy is None) and \
+            (policy_data.root_policy != "IGNORE"):
+        writePolicy(root_path, policy_data.root_policy)
+    # Write policies for the subdirectories.
+    for root, dirs, files in os.walk(root_path):
+        for dir in dirs:
+            path = os.path.join(root, dir)
+            policy = getPolicyForPath(path.replace(root_path, ""), policy_data)
+            if policy != "IGNORE":
+                writePolicy(path, policy)
+
+def writePolicy(path, policy):
+    global policy_data
+    policy_file = os.path.join(path, 'distribution.policy.s60')
+
+    if os.path.exists(policy_file):
+        existing_policy = readPolicy(policy_file)
+        if policy == existing_policy:
+            print "Policy %s already exists in %s" % (existing_policy, policy_file)
+        else:
+            print "WARNING: Policy %s (should be %s) already exists in %s"  % (existing_policy, policy, policy_file)
+            policy_data.warning_count += 1
+        policy_data.existing_policies += 1
+        return
+
+    f = open(policy_file, "w+")
+    try:
+        print "Writing policy", policy, "to", policy_file
+        f.write(policy)
+        policy_data.created_policies += 1
+    except IOError:
+        print "ERROR: Writing policy to", policy_file, "failed"
+        sys.exit(1)
+    finally:
+        f.close
+
+def readPolicy(policy_file):
+    policy = None
+    f = open(policy_file)
+    try:
+        for line in f.readlines():
+            # Take the last line from the policy.
+            policy = line.strip()
+    finally:
+        f.close
+    return policy
+
+def getPolicyForPath(target_path, policy_data):
+    for path, policy in policy_data.policies:
+        match_path = target_path
+        if path.find("ROOT" + os.sep) == 0:
+            # Add keyword ROOT to target_path so that only
+            # paths in root directory will match.
+            match_path = "ROOT" + target_path
+        if match_path.find(path + os.sep) != -1 or \
+                match_path.find(path, -len(path)) != -1:
+            return policy
+    return None
+
+if __name__ == "__main__":
+    main()