Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
        }