/// <summary> /// Gets the expression for an input /// </summary> /// <param name="depId">Id of the input artifact</param> /// <param name="specWriter"> /// SpecWriter to receive expression string according to the language and add ImportStatement to /// the Spec if the language is DScript. /// </param> /// <param name="configWriter">ConfigWriter to add a new mount if necessary</param> /// <param name="isDirectory">returns whether the input was a directory</param> /// <param name="isResponseFile">returns whether the input was a response file</param> /// <returns>expression for the input dependency</returns> private string GetInputExpression(int depId, SpecWriter specWriter, ConfigWriter configWriter, out bool isDirectory, out bool isResponseFile) { Dir dir; int producingProcess; File f; isResponseFile = false; if (m_buildGraph.Directories.TryGetValue(depId, out dir)) { isDirectory = true; var producingSpecPath = m_buildGraph.Pips[dir.ProducerId].Spec; return(specWriter.GetSealCopyWriteInputName(GetSealOutputName(depId), producingSpecPath)); } if (m_buildGraph.OutputArtifactToProducingPip.TryGetValue(depId, out producingProcess)) { isDirectory = false; Pip p = m_buildGraph.Pips[producingProcess]; if (p is Process) { return(specWriter.GetProcessInputName(GetProcessOutputName(producingProcess), p.Spec, depId)); } if (p is CopyFile || p is WriteFile) { if (m_buildGraph.Files.TryGetValue(depId, out f)) { isResponseFile = f.Location.EndsWith(ResponseFileName, StringComparison.OrdinalIgnoreCase); } return(specWriter.GetSealCopyWriteInputName(GetProcessOutputName(producingProcess), p.Spec)); } throw new MimicGeneratorException("Error. Pip isn't of known type"); } if (m_buildGraph.Files.TryGetValue(depId, out f)) { isDirectory = false; QueueWritingInputFileIfNecessary(depId); return(configWriter.ToRelativePathExpression(f.Location)); } throw new MimicGeneratorException("Could not find a producer for dependency:{0}", depId); }
public void HandleSealDirectory(SealDirectory sealDirectory, SpecWriter writer, ConfigWriter configWriter) { List <string> remappedContents = new List <string>(); Dir dir = m_buildGraph.Directories[sealDirectory.Directory]; foreach (int content in dir.Contents) { int producingProcess; if (m_buildGraph.OutputArtifactToProducingPip.TryGetValue(content, out producingProcess)) { var p = m_buildGraph.Pips[producingProcess]; remappedContents.Add(writer.GetProcessInputName(GetProcessOutputName(producingProcess), p.Spec, content)); } else { remappedContents.Add(configWriter.ToRelativePathExpression(m_buildGraph.Files[content].Location)); QueueWritingInputFileIfNecessary(content); } } writer.AddSealDirectory(GetSealOutputName(sealDirectory.Directory), configWriter.ToRelativePathExpression(dir.Location), remappedContents); }