#!/usr/bin/env tclsh8.4
# Copyright 2005 George Peter Staplin

proc build.list dir {
 set r [list]

 foreach f [glob -nocomplain [file join $dir *]] {
  if {[file isdirectory $f]} {
   set r [concat $r [build.list $f]]
  } else {
   lappend r $f
  }
 }
 return $r
}

proc compare.arrays {a_ptr b_ptr report_mismatch} {
 upvar 1 $a_ptr aar
 upvar 1 $b_ptr bar

 set uniq [list]

 foreach key [array names aar] {
  if {![info exists bar($key)]} {
   lappend uniq $aar($key)
  } elseif {$report_mismatch && \
   ([set asize [file size $aar($key)]] != [set bsize [file size $bar($key)]])} {
   puts "SIZE MISMATCH"
   puts "$aar($key) = $asize"
   puts "$bar($key) = $bsize"
  }
 } 
 return $uniq
}

proc find.unique.elements {a b} {
 foreach i $a {
  set aar([file tail $i]) $i
 }

 foreach i $b {
  set bar([file tail $i]) $i
 }

 concat [compare.arrays aar bar 1] [compare.arrays bar aar 0]
}

proc main {argc argv} {

 set a [build.list [lindex $argv 0]]
 set b [build.list [lindex $argv 1]] 

 foreach u [find.unique.elements $a $b] {
  puts "U $u"
 }
 return 0
}
exit [main $::argc $::argv]
