/// <nodoc />
        public bool TryCopyFile(
            FileArtifact source,
            AbsolutePath destination,
            CopyFile.Options options,
            string[] tags,
            string description,
            out FileArtifact fileArtifact)
        {
            Contract.Requires(source.IsValid);
            Contract.Requires(destination.IsValid);

            fileArtifact = FileArtifact.CreateSourceFile(destination).CreateNextWrittenVersion();
            var pip = new CopyFile(
                source,
                fileArtifact,
                ToStringIds(tags),
                CreatePipProvenance(description),
                options);

            if (PipGraph != null)
            {
                return(PipGraph.AddCopyFile(pip, GetValuePipId()));
            }

            return(true);
        }