code: func compareDirectories(dirs ...string) error {
  	chans := make([]chan fileInfo, len(dirs))
  	for i := range chans {
  		chans[i] = make(chan fileInfo)
  	}
  	errcs := make([]chan error, len(dirs))
  	abort := make(chan struct{})
  
  	for i := range dirs {
  		errcs[i] = startWalker(dirs[i], chans[i], abort)
  	}
  
  	res := make([]fileInfo, len(dirs))
  	for {
  		numDone := 0
  		for i := range chans {
  			fi, ok := <-chans[i]
  			if !ok {
  				err, hasError := <-errcs[i]
  				if hasError {
  					close(abort)
  					return err
  				}
  				numDone++
  			}
  			res[i] = fi
  		}
  
  		for i := 1; i < len(res); i++ {
  			if res[i] != res[0] {
  				close(abort)
  				if res[i].name < res[0].name {
  					return fmt.Errorf("%s missing %v (present in %s)", dirs[0], res[i], dirs[i])
  				} else if res[i].name > res[0].name {
  					return fmt.Errorf("%s missing %v (present in %s)", dirs[i], res[0], dirs[0])
  				}
  				return fmt.Errorf("Mismatch; %v (%s) != %v (%s)", res[i], dirs[i], res[0], dirs[0])
  			}
  		}
  
  		if numDone == len(dirs) {
  			return nil
  		}
  	}
  }
docs: // Compare a number of directories. Returns nil if the contents are identical,
  // otherwise an error describing the first found difference.