aboutsummaryrefslogtreecommitdiff
path: root/eclipse/scripts/collect_sources_for_sdk.py
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/scripts/collect_sources_for_sdk.py')
-rwxr-xr-xeclipse/scripts/collect_sources_for_sdk.py180
1 files changed, 180 insertions, 0 deletions
diff --git a/eclipse/scripts/collect_sources_for_sdk.py b/eclipse/scripts/collect_sources_for_sdk.py
new file mode 100755
index 000000000..b95ae62b8
--- /dev/null
+++ b/eclipse/scripts/collect_sources_for_sdk.py
@@ -0,0 +1,180 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+"""
+Description:
+ This script collects all framework Java sources from the current android
+ source code and places them in a source folder suitable for the eclipse ADT
+ plugin.
+
+See usage() below.
+
+Copyright (C) 2009 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License").
+"""
+
+import re
+import os
+import sys
+import getopt
+import shutil
+
+_RE_PKG = re.compile("^\s*package\s+([^\s;]+)\s*;.*")
+
+# Holds cmd-line arguments
+class Params(object):
+ def __init__(self):
+ self.DRY = False
+ self.DIR = "frameworks libcore"
+ self.SRC = None
+ self.DST = None
+ self.CNT_USED = 0
+ self.CNT_NOPKG = 0
+
+
+# Prints a usage summary
+def usage(error=None):
+ print """
+ Description:
+ This script collects all framework Java sources from the current android
+ source code and places them in a source folder suitable for the eclipse ADT
+ plugin.
+
+ Usage:
+ %s [-n] <android-git-repo root> <sdk/platforms/xyz/sources>
+
+ The source and destination directories must already exist.
+ Use -n for a dry-run.
+
+""" % sys.argv[0]
+
+ if error:
+ print >>sys.stderr, "Error:", error
+
+
+# Parse command line args, returns a Params instance or sys.exit(2) on error
+# after printing the error and the usage.
+def parseArgs(argv):
+ p = Params()
+ error = None
+
+ try:
+ opts, args = getopt.getopt(argv[1:],
+ "ns:",
+ [ "--dry", "--sourcedir=" ])
+ except getopt.GetoptError, e:
+ error = str(e)
+
+ if error is None:
+ for o, a in opts:
+ if o in [ "-n", "--dry" ]:
+ p.DRY = True
+ elif o in [ "-s", "--sourcedir" ]:
+ p.DIR = a
+
+ if len(args) != 2:
+ error = "Missing arguments: <source> <dest>"
+ else:
+ p.SRC = args[0]
+ p.DST = args[1]
+
+ if not os.path.isdir(p.SRC):
+ error = "%s is not a directory" % p.SRC
+ elif not os.path.isdir(p.DST):
+ error = "%s is not a directory" % p.DST
+
+ if error:
+ usage(error)
+ sys.exit(2)
+
+ return p
+
+
+# Recursively parses the given directory and process java files found
+def parseSrcDir(p, srcdir):
+ if not os.path.exists(srcdir):
+ print >>sys.stderr, "Error: Skipping unknown directory", srcdir
+ return
+
+ for f in os.listdir(srcdir):
+ fp = os.path.join(srcdir, f)
+ if f.endswith(".java") and os.path.isfile(fp):
+ pkg = checkJavaFile(fp)
+ if pkg:
+ pkg = pkg.replace(".", os.path.sep) # e.g. android.view => android/view
+ copy(p, fp, f, pkg)
+ p.CNT_USED += 1 # one more copied
+ else:
+ p.CNT_NOPKG += 1 # this java file lacked a package declaration
+ elif os.path.isdir(fp):
+ parseSrcDir(p, fp)
+
+
+# Check a java file to find its package declaration, if any
+def checkJavaFile(path):
+ print "Process", path
+
+ try:
+ f = None
+ try:
+ f = file(path)
+ for l in f.readlines():
+ m = _RE_PKG.match(l)
+ if m:
+ return m.group(1)
+ finally:
+ if f: f.close()
+ except Exception:
+ pass
+
+ return None
+
+
+# Create destination directory based on package name then copy the
+# source file in there
+def copy(p, fp, f, pkg):
+ dstdir = os.path.join(p.DST, pkg)
+ _mkdir(p, dstdir)
+ _cp(p, fp, os.path.join(dstdir, f))
+
+
+def _mkdir(p, dir):
+ if not os.path.isdir(dir):
+ if p.DRY:
+ print "mkdir", dir
+ else:
+ os.makedirs(dir)
+
+
+def _cp(p, src, dst):
+ if p.DRY:
+ print "cp", src, dst
+ else:
+ shutil.copyfile(src, dst)
+
+
+def main():
+ p = parseArgs(sys.argv)
+ for d in p.DIR.split():
+ if d:
+ parseSrcDir(p, os.path.join(p.SRC, d))
+ print "%d java files copied" % p.CNT_USED
+ if p.CNT_NOPKG: print "%d java files ignored (no package)" % p.CNT_NOPKG
+ if p.DRY: print "This was in *DRY* mode. No copies done."
+
+
+if __name__ == "__main__":
+ main()