deprecated/buildtools/buildsystemtools/removebuild.pl
author Ross Qin <ross.qin@nokia.com>
Tue, 02 Nov 2010 09:31:04 +0800
changeset 671 ff8ff850b0cf
parent 655 3f65fd25dfd4
permissions -rw-r--r--
fix the Serious problem with ROFS on-disk format

#!/usr/bin/perl

# Copyright (c) 2002-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:
# removebuild.pl - prepares a drive for a clean licensee build by removing
# all buildable files from the drive.
# 
#

my ($file) = readOpts(@ARGV);

exit remove($file);

sub readOpts(@)
	{
	my (@args) = @_;

	my $path = undef;

	foreach my $arg (@args)
		{
		if ($arg =~ /^-/)
			{
			if ((lc($arg) eq "--help")
			  ||(lc($arg) eq "-h")
			   )
			   	{
				showHelp();
				exit 0;
				}
			else
				{
				print STDERR "Option '$arg' not recognised.\n\n";
				print STDERR "Try 'removebuild --help' for help.\n";
				exit 1;
				}
			}
		else
			{
			if (defined($path))
				{
				print STDERR "Removebuild accepts only one argument.\n\n";
				print STDERR "Try 'removebuild --help' for help.\n";
				exit 1;
				}
			else
				{
				$path = $arg;
				}
			}
		}
	
	if (!defined($path))
		{
		print STDERR "Removebuild must be given a list of files to remove.\n\n";
		print STDERR "Try 'removebuild --help' for help.\n";
		exit 1;
		}
	
	return ($path);
	}

sub remove($)
	{
	my ($file) = @_;

	open(FILE, $file);

	my $dir = undef;
	my $failed = 0;
	my $worked = 0;
	my $hasentries = 0;

	foreach my $line (<FILE>)
		{
		chomp($line);
		$hasentries = 1;

		if ($line =~ /^\*/)
			{
			if ($line =~ /^\*DIR:/)
				{
				$dir = $line;
				$dir =~ s/^\*DIR:\s*//;

				$dir =~ s/[\/\\]*$//; # Remove trailing \/
				}
			else
				{
				close(FILE);
				die "'$file' is not a valid input.\n('$line' not recognised)\n";
				}
			}
		else
			{
			if (defined($dir))
				{
				$line =~ s/^[\/\\]*//; # Remove preceding \/

				# Attempt to delete '$dir\$line'

				$line = $dir."\\".$line;

				if (-e $line)
					{
					if (-d $line)
						{
						$failed = 1;
						print STDERR "ERROR: Could not remove file '$line' because $line is a directory\n";
						}
					else
						{
						if (!unlink($line))
							{
							$failed = 1;
							print STDERR "ERROR: Could not remove file '$line'. Make sure it is not write protected.\n";
							}
						else
							{
							$worked = 1;
							
							# Remove parent dirs if now empty
							my $empty = 1;
							while (($line =~ /[\/\\]/) && $empty)
								{
								$line =~ s/[\/\\][^\/\\]*$//; # Go to parent dir
								if (!rmdir($line))
									{
									# If it fails, the dir can't be empty
									$empty = 0;
									}
								}
							}
						}
					}
				}
			else
				{
				close(FILE);
				die "'$file' is not a valid input.\n(DIR must be set before '$line')\n";
				}
			}
		}
	
	close(FILE);

	if ($hasentries && (!$worked))
		{
		print STDERR "WARNING: No files listed in '$file' were found. Is the current directory correct?\n";
		}

	return $failed;
	}

sub showHelp()
	{
	print "removebuild [options] Filename\n";
	print " - prepares a drive for a 'build from clean' by removing\n";
	print "   all buildable files.\n\n";
	print "  Filename - The file listing the buildable files to be removed\n\n";
	print "Options:\n";
	print "  --help or -h - Display this message\n\n";
	}