in tool/TeamCity.Docker/ContentParser.cs [20:82]
public IEnumerable<Line> Parse(IEnumerable<string> content, IEnumerable<Variable> variables)
{
if (content == null) throw new ArgumentNullException(nameof(content));
if (variables == null) throw new ArgumentNullException(nameof(variables));
var lines = new List<Line>();
var localVars = new List<Variable>();
foreach (var line in content)
{
var vars = (
// ReSharper disable once PossibleMultipleEnumeration
from variable in variables
where line.Contains($"{variable.Name}")
select new Variable(variable.Name, variable.Value))
.Distinct()
.ToList();
var lineWithVars = ApplyVariables(line, vars);
var argStatement = ArgRegex.Match(lineWithVars);
if (argStatement.Success)
{
var value = argStatement.Groups["value"].Value;
if (string.IsNullOrEmpty(value))
{
localVars.Add(new Variable(argStatement.Groups["name"].Value, value));
}
}
var lineWithLocalVars = ApplyVariables(lineWithVars, localVars);
if (lineWithLocalVars.Contains("${") && lineWithLocalVars.Contains("}"))
{
_logger.Log($"The line \"{line.Trim()}\" may still contain some unresolved variables. May be these variables will be resolved by environment variables.", Result.Warning);
}
if (line.TrimStart().StartsWith("#"))
{
lines.Add(new Line(lineWithVars, LineType.Comment, vars));
}
else
{
lines.Add(new Line(line, LineType.Text, vars));
}
}
var usedVariables = lines
.Where(line => line.Type != LineType.Comment)
.SelectMany(line => line.Variables)
.Distinct()
.OrderByDescending(line => line.Name)
.ToList();
if (usedVariables.Any())
{
lines.Insert(0, new Line("", LineType.Text, EmptyVars));
foreach (var variable in usedVariables)
{
lines.Insert(0, new Line($"ARG {variable.Name}='{variable.Value}'", LineType.Text, new[] {variable}));
}
lines.Insert(0, new Line("# Default arguments", LineType.Comment, EmptyVars));
}
return lines;
}