userland-mangler revision 181
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen#!/usr/bin/python2.6
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# CDDL HEADER START
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen# The contents of this file are subject to the terms of the
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# Common Development and Distribution License (the "License").
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# You may not use this file except in compliance with the License.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# or http://www.opensolaris.org/os/licensing.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# See the License for the specific language governing permissions
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# and limitations under the License.
2cd2518bab14292a67cf8a490b58ab9ef89879daTimo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# When distributing Covered Code, include this CDDL HEADER in each
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# If applicable, add the following below this CDDL HEADER, with the
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# fields enclosed by brackets "[]" replaced with your own identifying
6ec925f52d04ec8700e47cb005bd7ddc65ac5614Timo Sirainen# information: Portions Copyright [yyyy] [name of copyright owner]
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen#
4d4d6d4745682790c20d759ba93dbea46b812c5dTimo Sirainen# CDDL HEADER END
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#
cf2e6953d03a1c22f272ec19432fc03c136ac1bbTimo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# userland-mangler - a file mangling utility
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# A simple program to mangle files to conform to Solaris WOS or Consoldation
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# requirements.
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen#
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenimport os
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenimport sys
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainenimport re
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenimport pkg.fmri
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenimport pkg.manifest
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenimport pkg.actions
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainenimport pkg.elf as elf
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenattribute_table_header = """
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen.SH ATTRIBUTES
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo SirainenSee
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen.BR attributes (5)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenfor descriptions of the following attributes:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen.sp
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen.TS
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenbox;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainencbp-1 | cbp-1
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenl | l .
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo SirainenATTRIBUTE TYPE ATTRIBUTE VALUE """
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenattribute_table_availability = """
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen=
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo SirainenAvailability %s"""
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainenattribute_table_stability = """
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen=
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo SirainenStability %s"""
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainenattribute_table_footer = """
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen.TE
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen.PP
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen"""
230ef558135f16a66b86cbe3762524eaa9ae9d81Timo Sirainendef write_attributes_section(ofp, availability, stability):
230ef558135f16a66b86cbe3762524eaa9ae9d81Timo Sirainen # is there anything to do?
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen if availability is None and stability is None:
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen return
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen # append the ATTRIBUTES section
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen ofp.write(attribute_table_header)
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen if availability is not None:
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen ofp.write(attribute_table_availability % availability)
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen if stability is not None:
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen ofp.write(attribute_table_stability % stability.capitalize())
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen ofp.write(attribute_table_footer)
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainennotes_header = """
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen.SH NOTES
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen"""
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainennotes_community = """
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo SirainenFurther information about this software can be found on the open source community website at %s.
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen"""
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainennotes_source = """
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo SirainenThis software was built from source available at http://opensolaris.org/. The original community source was downloaded from %s
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen"""
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainendef write_notes_section(ofp, header_seen, community, source):
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen # is there anything to do?
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen if community is None and source is None:
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen return
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen # append the NOTES section
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen if header_seen == False:
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen ofp.write(notes_header)
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen if source is not None:
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen ofp.write(notes_source % source)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if community is not None:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ofp.write(notes_community % community)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainensection_re = re.compile('\.SH "?([^"]+).*$', re.IGNORECASE)
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen#
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen# mangler.man.stability = (mangler.man.stability)
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen# mangler.man.availability = (pkg.fmri)
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen# mangler.man.source_url = (pkg.source_url)
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen# mangler.man.upstream_url = (pkg.upstream_url)
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen#
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainendef mangle_manpage(manifest, action, src, dest):
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen # manpages must have a taxonomy defined
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen stability = action.attrs.pop('mangler.man.stability', None)
dc07b75b7ea83ff5f447970a20419032725271a7Timo Sirainen if stability is None:
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen sys.stderr.write("ERROR: manpage action missing mangler.man.stability: %s" % action)
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen sys.exit(1)
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen
efc5c69c572e83db7bf7eab5d4698c0ab0d3d886Timo Sirainen attributes_written = False
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen notes_seen = False
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
b955a1c1b6d466977d971c029a9305bee492f73cTimo Sirainen if 'pkg.fmri' in manifest.attributes:
b955a1c1b6d466977d971c029a9305bee492f73cTimo Sirainen fmri = pkg.fmri.PkgFmri(manifest.attributes['pkg.fmri'])
b955a1c1b6d466977d971c029a9305bee492f73cTimo Sirainen availability = fmri.pkg_name
b955a1c1b6d466977d971c029a9305bee492f73cTimo Sirainen
b955a1c1b6d466977d971c029a9305bee492f73cTimo Sirainen if 'info.upstream_url' in manifest.attributes:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen community = manifest.attributes['info.upstream_url']
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if 'info.source_url' in manifest.attributes:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen source = manifest.attributes['info.source_url']
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen # create a directory to write to
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen destdir = os.path.dirname(dest)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if not os.path.exists(destdir):
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen os.makedirs(destdir)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen # read the source document
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ifp = open(src, "r")
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen lines = ifp.readlines()
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ifp.close()
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen # skip reference only pages
601b455f4d5e780044b9e4fac5f687c1b07ae145Timo Sirainen if lines[0].startswith(".so "):
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen # open a destination
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ofp = open(dest, "w+")
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen # tell man that we want tables (and eqn)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen ofp.write("'\\\" te\n")
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen # write the orginal data
72cc352b25ad401b923436c6ed0f1f3adaffa737Timo Sirainen for line in lines:
e1f866daa1bd1a5cd7516f3b19c6f197bcf6cc8aTimo Sirainen match = section_re.match(line)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if match is not None:
614529ee060755c0b282102b70daf56bcd64222dTimo Sirainen section = match.group(1)
61618d4c58080570f689614fec204ae14e90cef2Timo Sirainen if section in ['SEE ALSO', 'NOTES']:
6ec925f52d04ec8700e47cb005bd7ddc65ac5614Timo Sirainen if attributes_written == False:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen write_attributes_section(ofp,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen availability,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen stability)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen attributes_written = True
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if section == 'NOTES':
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen notes_seen = True
e1f866daa1bd1a5cd7516f3b19c6f197bcf6cc8aTimo Sirainen ofp.write(line)
e1f866daa1bd1a5cd7516f3b19c6f197bcf6cc8aTimo Sirainen
e1f866daa1bd1a5cd7516f3b19c6f197bcf6cc8aTimo Sirainen if attributes_written == False:
e1f866daa1bd1a5cd7516f3b19c6f197bcf6cc8aTimo Sirainen write_attributes_section(ofp, availability, stability)
e1f866daa1bd1a5cd7516f3b19c6f197bcf6cc8aTimo Sirainen
e1f866daa1bd1a5cd7516f3b19c6f197bcf6cc8aTimo Sirainen write_notes_section(ofp, notes_seen, community, source)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ofp.close()
4b2a1030f9b51e90f6ff4cdbc115871a398c1e0fTimo Sirainen
72cc352b25ad401b923436c6ed0f1f3adaffa737Timo Sirainen
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen#
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen# mangler.elf.strip = (true|false)
72cc352b25ad401b923436c6ed0f1f3adaffa737Timo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainendef mangle_elf(manifest, action, src, dest):
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen pass
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# mangler.script.file-magic =
bad5fa318c6c1384ab83bd72d53ce06593274c18Timo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainendef mangle_script(manifest, action, src, dest):
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen pass
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainendef mangle_path(manifest, action, src, dest):
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if 'facet.doc.man' in action.attrs:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen mangle_manpage(manifest, action, src, dest)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen elif 'mode' in action.attrs and int(action.attrs['mode'], 8) & 0111 != 0:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if elf.is_elf_object(src):
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen mangle_elf(manifest, action, src, dest)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen else:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen mangle_script(manifest, action, src, dest)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen# mangler.bypass = (true|false)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainendef mangle_paths(manifest, search_paths, destination):
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen for action in manifest.gen_actions_by_type("file"):
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen bypass = action.attrs.pop('mangler.bypass', 'false').lower()
f5e1d3d6b34ec152aa1ff15c7bd3d3552e9227eaTimo Sirainen if bypass == 'true':
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen continue
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen path = None
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if 'path' in action.attrs:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen path = action.attrs['path']
bad5fa318c6c1384ab83bd72d53ce06593274c18Timo Sirainen if action.hash and action.hash != 'NOHASH':
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen path = action.hash
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if not path:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen continue
3a0f9aa9504497e4e47f32df54fbf47fdc7423b6Timo Sirainen
3a0f9aa9504497e4e47f32df54fbf47fdc7423b6Timo Sirainen dest = os.path.join(destination, path)
788f275469ad9ed530e440d6690d0e4381a323b2Timo Sirainen for directory in search_paths:
788f275469ad9ed530e440d6690d0e4381a323b2Timo Sirainen if directory != destination:
788f275469ad9ed530e440d6690d0e4381a323b2Timo Sirainen src = os.path.join(directory, path)
788f275469ad9ed530e440d6690d0e4381a323b2Timo Sirainen if os.path.exists(src):
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen mangle_path(manifest, action, src, dest)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen break
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainendef load_manifest(manifest_file):
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen manifest = pkg.manifest.Manifest()
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen manifest.set_content(pathname=manifest_file)
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen return manifest
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainendef usage():
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen print "Usage: %s [-m|--manifest (file)] [-d|--search-directory (dir)] [-D|--destination (dir)] " % (sys.argv[0].split('/')[-1])
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sys.exit(1)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainendef main():
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen import getopt
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen # FLUSH STDOUT
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen search_paths = []
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen destination = None
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen manifests = []
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen try:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen opts, args = getopt.getopt(sys.argv[1:], "D:d:m:",
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ["destination=", "search-directory=", "manifest="])
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen except getopt.GetoptError, err:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen print str(err)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen usage()
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen for opt, arg in opts:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if opt in [ "-D", "--destination" ]:
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen destination = arg
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen elif opt in [ "-d", "--search-directory" ]:
601b455f4d5e780044b9e4fac5f687c1b07ae145Timo Sirainen search_paths.append(arg)
601b455f4d5e780044b9e4fac5f687c1b07ae145Timo Sirainen elif opt in [ "-m", "--manifest" ]:
cdc8485491045d82bb98405d4b995f277d12838eTimo Sirainen try:
cdc8485491045d82bb98405d4b995f277d12838eTimo Sirainen manifest = load_manifest(arg)
b2ed2b25c4c457ec1c99ebe5e9bd66a2e2f89cfdTimo Sirainen except IOError, err:
b2ed2b25c4c457ec1c99ebe5e9bd66a2e2f89cfdTimo Sirainen print "oops, %s: %s" % (arg, str(err))
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen usage()
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen else:
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen manifests.append(manifest)
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen else:
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen usage()
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen if destination == None:
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen usage()
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen for manifest in manifests:
4f4943f6ef1bc45c23de73eebe83779712b3c8cbTimo Sirainen mangle_paths(manifest, search_paths, destination)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen print manifest
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sys.exit(0)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenif __name__ == "__main__":
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen main()
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen