Skip to content

Commit

Permalink
Merge branch 'dev' into fix_build_policy
Browse files Browse the repository at this point in the history
  • Loading branch information
SSE4 committed Jul 16, 2019
2 parents 7a010d6 + c40c75b commit c0beee1
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 59 deletions.
7 changes: 5 additions & 2 deletions Conan.VisualStudio/Menu/AddConanDependsProject.cs
Expand Up @@ -34,8 +34,11 @@ protected internal override async Task MenuItemCallbackAsync()
return;
}

await _conanService.InstallAsync(vcProject);
await _conanService.IntegrateAsync(vcProject);
bool success = await _conanService.InstallAsync(vcProject);
if (success)
{
await _conanService.IntegrateAsync(vcProject);
}
}
}
}
7 changes: 5 additions & 2 deletions Conan.VisualStudio/Menu/AddConanDependsSolution.cs
Expand Up @@ -41,8 +41,11 @@ protected internal override async Task MenuItemCallbackAsync()
{
if (_vcProjectService.IsConanProject(project))
{
await _conanService.InstallAsync(_vcProjectService.AsVCProject(project));
await _conanService.IntegrateAsync(_vcProjectService.AsVCProject(project));
bool success = await _conanService.InstallAsync(_vcProjectService.AsVCProject(project));
if (success)
{
await _conanService.IntegrateAsync(_vcProjectService.AsVCProject(project));
}
}
}
await TaskScheduler.Default;
Expand Down
106 changes: 54 additions & 52 deletions Conan.VisualStudio/Services/ConanService.cs
Expand Up @@ -88,26 +88,26 @@ public async Task IntegrateAsync(VCProject vcProject)
}
}

public async Task InstallAsync(VCProject vcProject)
public async Task<bool> InstallAsync(VCProject vcProject)
{
var conanPath = _settingsService.GetConanExecutablePath();
if (conanPath == null || conanPath == "")
{
_errorListService.WriteError(
"Conan executable path is not set and Conan executable wasn't found automatically. " +
"Please set it up in the Tools → Settings → Conan menu.");
return;
return false;
}

var project = await _vcProjectService.ExtractConanProjectAsync(vcProject, _settingsService);
if (project == null)
{
_errorListService.WriteError("Unable to extract conan project!");
return;
return false;
}
var conan = new ConanRunner(_settingsService.LoadSettingFile(project), conanPath);

await InstallDependenciesAsync(conan, project);
return await InstallDependenciesAsync(conan, project);
}
private static void AppendLinesFunc(object packedParams)
{
Expand All @@ -126,7 +126,7 @@ private static void AppendLinesFunc(object packedParams)
}
}

private async Task InstallDependenciesAsync(ConanRunner conan, ConanProject project)
private async Task<bool> InstallDependenciesAsync(ConanRunner conan, ConanProject project)
{
foreach (var configuration in project.Configurations)
{
Expand All @@ -141,62 +141,64 @@ private async Task InstallDependenciesAsync(ConanRunner conan, ConanProject proj
ConanBuildType build = _settingsService.GetConanBuild();
bool update = _settingsService.GetConanUpdate();

ProcessStartInfo process = conan.Install(project, configuration, generator, build, update, _errorListService);

string message = $"[Conan.VisualStudio] Calling process '{process.FileName}' " +
$"with arguments '{process.Arguments}'";
Logger.Log(message);
await logStream.WriteLineAsync(message);

try
{
ProcessStartInfo process = conan.Install(project, configuration, generator, build, update, _errorListService);

string message = $"[Conan.VisualStudio] Calling process '{process.FileName}' " +
$"with arguments '{process.Arguments}'";
Logger.Log(message);
await logStream.WriteLineAsync(message);

using (Process exeProcess = Process.Start(process))
{
int exitCode = await exeProcess.WaitForExitAsync();

var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;

Task outputReader = Task.Factory.StartNew(AppendLinesFunc,
Tuple.Create(logStream, exeProcess.StandardOutput),
token, TaskCreationOptions.None, TaskScheduler.Default);
Task errorReader = Task.Factory.StartNew(AppendLinesFunc,
Tuple.Create(logStream, exeProcess.StandardError),
token, TaskCreationOptions.None, TaskScheduler.Default);

Task.WaitAll(outputReader, errorReader);

if (exitCode != 0) {
message = $"Conan has returned exit code '{exitCode}' " +
$"while processing configuration '{configuration}'. " +
$"Please check file '{logFilePath}' for details.";

Logger.Log(message);
await logStream.WriteLineAsync(message);
_errorListService.WriteError(message, logFilePath);
return;
}
else
{
message = $"[Conan.VisualStudio] Conan has succsessfully " +
$"installed configuration '{configuration}'";
Logger.Log(message);
await logStream.WriteLineAsync(message);
_errorListService.WriteMessage(message);
}
}
using (Process exeProcess = Process.Start(process))
{
int exitCode = await exeProcess.WaitForExitAsync();

var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;

Task outputReader = Task.Factory.StartNew(AppendLinesFunc,
Tuple.Create(logStream, exeProcess.StandardOutput),
token, TaskCreationOptions.None, TaskScheduler.Default);
Task errorReader = Task.Factory.StartNew(AppendLinesFunc,
Tuple.Create(logStream, exeProcess.StandardError),
token, TaskCreationOptions.None, TaskScheduler.Default);

Task.WaitAll(outputReader, errorReader);

if (exitCode != 0)
{
message = $"Conan has returned exit code '{exitCode}' " +
$"while processing configuration '{configuration}'. " +
$"Please check file '{logFilePath}' for details.";

Logger.Log(message);
await logStream.WriteLineAsync(message);
_errorListService.WriteError(message, logFilePath);
return false;
}
else
{
message = $"[Conan.VisualStudio] Conan has succsessfully " +
$"installed configuration '{configuration}'";
Logger.Log(message);
await logStream.WriteLineAsync(message);
_errorListService.WriteMessage(message);
}
}
}
catch (Win32Exception e)
catch(System.ComponentModel.Win32Exception e)
{
string message = $"Unable to start conan executable: '{e.Message}' " +
$"while processing configuration '{configuration}'. " +
$"Please check file '{logFilePath}' for details.";
message = $"[Conan.VisualStudio] Unhandled error running '{process.FileName}'" +
$": {e.Message}. Check log file '{logFilePath}' for details";
Logger.Log(message);
await logStream.WriteLineAsync(message);
_errorListService.WriteError(message, logFilePath);
_errorListService.WriteError(message);
return false;
}
}
}
return true;
}
}
}
2 changes: 1 addition & 1 deletion Conan.VisualStudio/Services/IConanService.cs
Expand Up @@ -11,6 +11,6 @@ public interface IConanService
{
Task IntegrateAsync(VCProject vcProject);

Task InstallAsync(VCProject vcProject);
Task<bool> InstallAsync(VCProject vcProject);
}
}
7 changes: 5 additions & 2 deletions Conan.VisualStudio/VSConanPackage.cs
Expand Up @@ -186,8 +186,11 @@ private void InstallConanDeps(VCProject vcProject)
ThreadHelper.JoinableTaskFactory.RunAsync(
async delegate
{
await _conanService.InstallAsync(vcProject);
await _conanService.IntegrateAsync(vcProject);
bool success = await _conanService.InstallAsync(vcProject);
if (success)
{
await _conanService.IntegrateAsync(vcProject);
}
}
);
}
Expand Down

0 comments on commit c0beee1

Please sign in to comment.