<#
.SYNOPSIS
	publish-to-ipfs.ps1 [<file(s)/dir>] [<to-hash-list>]
.DESCRIPTION
	Publishes the given files or directory to IPFS
.EXAMPLE
	PS> .\publish-to-ipfs.ps1 C:\MyFile.txt
.LINK
	https://github.com/fleschutz/PowerShell
.NOTES
	Author: Markus Fleschutz / License: CC0
#>

param([string]$Files = "", [string]$HashList = "IPFS_hashes.txt", [string]$DF_Hashes = "checksum_list.txt")

try {
	& ipfs --version
	if ($lastExitCode -ne "0") { throw "Can't execute 'ipfs' - make sure IPFS is installed and available" }

	if ($Files -eq "") { $Files = read-host "Enter file(s) or directory tree to publish" }

	$StopWatch = [system.diagnostics.stopwatch]::startNew()
	$Files = (get-childItem "$Files")
	[int]$Count = $Files.Count
	foreach ($File in $Files) {
		if (test-path "$File" -pathType container) {
			"Adding directory tree $File to IPFS..."
			ipfs add -r "$File" > $HashList

			echo "Calculating digital forensics hashes to $DF_HASHES ..."
			nice hashdeep -c md5,sha1,sha256 -r -d -l -j 1 "$File" > $DF_Hashes
		} else {
			"Adding file $File to IPFS..."
			ipfs add "$File" > $HashList
		}
	}

	[int]$Elapsed = $StopWatch.Elapsed.TotalSeconds
	"✔️ published $Count files(s)/directory to IPFS in $Elapsed sec"
	"  NOTE: to publish it to IPNS execute: ipfs name publish <HASH>"
	exit 0
} catch {
	write-error "⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
	exit 1
}