#!/usr/bin/env bx

# This program copies files from a backup list to a backup medium.
# TODO compression?

use b

Main()
	if args != 1
		usage("target-dir < backup.lst")
	cstr target_dir = arg[0]
	size_t target_dir_len = strlen(target_dir)
	vec *files = slurp_lines()
	for_vec(i, files, cstr)
		cstr tab = strchr(*i, '\t')
		if tab
			*i = tab+1
		 else
			error("file format invalid, expecting list of size, file")

	char target[PATH_MAX]
	bzero(target, PATH_MAX)
	strcpy(target, target_dir)
	char *target_1 = target + strlen(target)
	char *cwd = Getcwd()
	for_vec(i, files, cstr)
		cstr from = *i
		assert(strlen(from)+target_dir_len+2 < PATH_MAX, "path too long %s", *i)
		char *dir_end = Strrchr(from, '/')
		assert(dir_end!=NULL, "path does not contain a /")
		local(*dir_end, '\0')
			if strcmp(target_1, from)
				*target_1 = '\0'
				if !path__is_sep(*from)
					strcat(target_1, "/")
				strcat(target_1, from)
				if !lexists(target)
					Sayf("%s/", target)
					Mkdirs_cwd(target, 0777, cwd)
					cp_attrs(*i, target)

	nl()

	for_vec(i, files, cstr)
		cstr from = *i
		*target_1 = '\0'
		if !path__is_sep(*from)
			strcat(target_1, "/")
		strcat(target_1, from)
		if !lexists(target)
			Say(target)
			CP(from, target)
