utils.link_files()/utils.copy_files() APIs do not fail for non-existing source
Background
Mostly these APIs conform to their advertised API contract, except for the case when:
- The caller does not specify a specific list, meaning the list of files should be derived from the source directory
- The caller does not ask to ignore missing files
- The source directory does not exist at all
Since this is public API and we found ourselves working around this unexpected behavior today in !560 (merged), it would be better to correct this rather than to leave the current behavior.
Task description
Ensure that the utils.link_files() and utils.copy_files() raise an UtilError() indicating that the source directory did not exist, unless ignore_missing was passed, and ensure that tests still pass.
Acceptance Criteria
utils.link_files() and utils.copy_files() behave as advertised.