#!/usr/bin/awk -f
# $Id: move2,v 1.4 2000/11/01 11:21:15 herbert Exp $

function generate_version() {
	best[arch "/" package] = ""
	if ((getline line < ifile) <= 0) {
		return
	}
	do {
		split(line, linef)
		if (tolower(linef[1]) == "version:") {
			best[arch "/" package] = linef[2]
			bestne[arch "/" package] = linef[2]
			sub(/^[0-9]*:/, "", bestne[arch "/" package])
		} else if (arch == "source" && linef[3] ~ /\.orig\.tar\.gz$/) {
			origname[package] = linef[3]
			origmd5sum[package] = linef[1]
		}
	} while (getline line < ifile)
	close(ifile)
}

function newer(a, b) {
	return system("dpkg --compare-versions " a " le \"" b "\"")
}

function compute_version() {
	if (!((arch "/" package) in best)) {
		generate_version()
	}
	new = newer(version, best[arch "/" package])
	versionne = version
	sub(/^[0-9]*:/, "", versionne)
	return !new && versionne == bestne[arch "/" package]
}

function print_index() {
	for (i = 0; i < lines; i++) {
		print fields[i] > ifile
	}
	if (close(ifile)) {
		print "Could not write " ifile > "/dev/stderr"
		return
	}
	best[arch "/" package] = version
	bestne[arch "/" package] = versionne
	if (arch == "source" && neworigname) {
		origname[package] = neworigname
		origmd5sum[package] = neworigmd5sum
	}
}

function move_dsc() {
	for (i = 0; i < files_lines; i++) {
	    	if (!new && files[i] == neworigname &&
		    neworigname == origname[package]) {
			continue
		}
		print "r .archive/" olddir "/" files[i] " " dir "/" files[i]
	}
}

BEGIN {
	split(ARGV[1], archs)
	ARGC = 1
}

{
	fields[count++] = $0
	lowline = tolower($0)
}

lowline ~ /^package:/ {
	package = $2
	next
}

lowline ~ /^architecture:/ {
	arch = $2
	next
}

lowline ~ /^filename:/ {
	pos = count - 1
	newfile = file = $2
	sub(/^[0-9]+\//, "", newfile)
	dir = newfile
	sub(/[^\/]*$/, "", dir)
	next
}

lowline ~ /^version:/ {
	version = $2
	next
}

lowline ~ /^directory:/ {
	pos = count - 1
	dir = olddir = $2 "/"
	sub(/^[0-9]+\//, "", dir)
}

lowline ~ /^files:/ {
	expect_files = 1
	neworigname = ""
	next
}

expect_files {
	if ($0 ~ /^ /) {
		files[files_count++] = $3
		if ($3 ~ /\.orig\.tar\.gz$/) {
			neworigname = linef[3]
			neworigmd5sum = linef[1]
		}
		next
	}
	expect_files = 0;
}

/^$/ {
	lines = count
	count = 0
	files_lines = files_count
	files_count = 0

	if (files_lines) {
		arch = "source"
		ifile = dir
		sub(/\/source\/.*/, "/source/.index/" package, ifile)
		if (compute_version()) {
			next
		}
		move_dsc()
		if (new) {
			sub(/\/$/, "", dir)
			fields[pos] = "Directory: " dir
			print_index()
		}
	} else if (arch == "all") {
		allfile = newfile
		sub(/\/binary-\//, "/binary-all/", allfile)
		needed = 0
		for (i in archs) {
			arch = archs[i]
			ifile = dir
			sub(/\/binary-\/.*/,
			    "/binary-" arch "/.index/" package, ifile)
			if (compute_version()) {
				next
			}
			newfile1 = newfile
			sub(/\/binary-\//, "/binary-" arch "/", newfile1)
			print "l " allfile " " newfile1
			if (new) {
				fields[pos] = "Filename: " newfile1
				print_index()
				needed = 1
			}
		}
		if (needed) {
			print "r .archive/" file " " allfile
		}
	} else {
		ifile = dir
		sub(/\/binary-\/.*/, "/binary-" arch "/.index/" package, ifile)
		if (compute_version()) {
			next
		}
		sub(/\/binary-\//, "/binary-" arch "/", newfile)
		print "r .archive/" file " " newfile
		if (new) {
			fields[pos] = "Filename: " newfile
			print_index()
		}
	}
}
