public bool Execute()
{
var projectFile = ResolveProjectFile();
if (string.IsNullOrEmpty(projectFile))
{
return false;
}
_solutionRoot = ProjectResolver.ResolveRootDirectory(projectFile);
var globalFile = GlobalSettings.GetGlobalFilePath(_solutionRoot);
if (!File.Exists(globalFile))
{
_reports.WriteError($"The '{GlobalSettings.GlobalFileName}' is missing from '{_solutionRoot}'.");
return false;
}
var packagesFolder = ResolvePackagesFolder();
if (string.IsNullOrEmpty(packagesFolder))
{
return false;
}
var packageVersion = ResolvePackageVersion(projectFile);
if (packageVersion == null)
{
return false;
}
var packageResolver = new DefaultPackagePathResolver(packagesFolder);
var packageFolder = packageResolver.GetPackageDirectory(_packageId, packageVersion);
packageFolder = Path.Combine(packagesFolder, packageFolder);
var snapshotInfo = ReadRepositoryInfo(packageFolder);
if (snapshotInfo == null)
{
return false;
}
string repoType;
if (!snapshotInfo.TryGetValue(Constants.RepoTypeKey, out repoType))
{
_reports.WriteError("Repository type information is missing from the repository information file.");
return false;
}
var provider = SourceControlProviderFactory.ResolveProvider(repoType, _reports);
if (provider == null)
{
_reports.WriteError($"Unknown repository type '{repoType}'");
return false;
}
if (!provider.IsInstalled)
{
_reports.WriteError($"The '{repoType}' client application is not installed.");
return false;
}
var sourcesFolder = ResolveSourcesFolder();
var sourceFolderName = provider.CreateShortFolderName(snapshotInfo);
var sourceDestinationFullPath = Path.Combine(sourcesFolder, sourceFolderName);
if (!Directory.Exists(sourceDestinationFullPath))
{
_reports.WriteInformation($"Downloading sources in '{sourceDestinationFullPath}'...");
if (!provider.GetSources(sourceDestinationFullPath, snapshotInfo))
{
return false;
}
}
else
{
_reports.WriteInformation($"Sources already found in '{sourceDestinationFullPath}'");
}
var srcFolder = provider.GetSourceFolderPath(snapshotInfo);
srcFolder = Path.Combine(sourceDestinationFullPath, srcFolder);
if (!Directory.Exists(srcFolder))
{
_reports.WriteError($"The source code folder '{srcFolder}' is missing.");
return false;
}
_reports.Verbose.WriteLine($"Updating {GlobalSettings.GlobalFileName}...");
ModifyJson(globalFile, jObj =>
{
var projects = jObj["projects"] as JArray;
if (projects == null)
{
projects = new JArray();
projects.Add(srcFolder);
jObj.Add("projects", projects);
}
else
{
if (!projects.Any(t => t.ToString().Equals(srcFolder)))
{
projects.Add(srcFolder);
}
}
});
return true;
}