# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.

$pkgname = "Apache.NMS.MSMQ"
$pkgver = "1.2.0"
$configurations = "release", "debug"
$frameworks = "net-2.0", "net-3.5"

write-progress "Creating package directory." "Initializing..."
if(!(test-path package))
{
	md package
}

if(test-path build)
{
	pushd build

	$pkgdir = "..\package"

	write-progress "Packaging Application files." "Scanning..."
	$zipfile = "$pkgdir\$pkgname-$pkgver-bin.zip"
	zip -9 -u -j "$zipfile" ..\LICENSE.txt
	zip -9 -u -j "$zipfile" ..\NOTICE.txt
	foreach($configuration in $configurations)
	{
		foreach($framework in $frameworks)
		{
			zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.dll"
			zip -9 -u "$zipfile" "$framework\$configuration\nmsprovider*.config"
			zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.Test.dll"
			if($framework -ieq "mono-2.0")
			{
				zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.dll.mdb"
				zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.Test.dll.mdb"
			}
			else
			{
				zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.pdb"
				zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.Test.pdb"
			}
		}
	}

	popd
}

write-progress "Packaging Source code files." "Scanning..."
$pkgdir = "package"
$zipfile = "$pkgdir\$pkgname-$pkgver-src.zip"

zip -9 -u "$zipfile" LICENSE.txt NOTICE.txt nant-common.xml nant.build package.ps1 vs2008-msmq-test.csproj vs2008-msmq.csproj vs2008-msmq.sln
zip -9 -u -r "$zipfile" keyfile src

write-progress -Completed "Packaging" "Complete."
