public ProjectItem GetContent(string username, string project, string path, ISourceCodeOpeningProgress openingProgressListener) { var projectSourceCodePath = this.applicationConfigurationProvider.GetProjectSourceCodePath(username, project); try { if (!Directory.Exists(projectSourceCodePath)) { string projectIdentifier = string.Format("{0}_{1}", username, project); object __projectSpecificLock = ProjectDownloadLock.GetOrAdd(projectIdentifier, new object()); lock (__projectSpecificLock) { if (!Directory.Exists(projectSourceCodePath)) { string packagePath = this.applicationConfigurationProvider.GetProjectPackagePath(username, project); if (!File.Exists(packagePath)) { openingProgressListener.OnFindProjectStarted(); var projectSelected = this.projectDiscoveryService.FindProject(username, project); if (projectSelected == null) { openingProgressListener.OnProjectNotFound(); return null; } openingProgressListener.OnProjectFound(); openingProgressListener.OnProjectDownloadStarted(); var downloadStatus = this.DownloadZipBall(packagePath, projectSelected.DownloadPackageUrl); if (!downloadStatus) { openingProgressListener.OnProjectDownloadFailed(); return null; } openingProgressListener.OnProjectDownloadCompleted(); } openingProgressListener.OnProjectPreparing(); this.ExtractZipBall(packagePath, projectSourceCodePath); this.editorService.RewriteExternalDependencies(username, project); } } // Try to remove the created lock object ProjectDownloadLock.TryRemove(projectIdentifier, out __projectSpecificLock); } openingProgressListener.OnBuildingWorkspace(); this.sourceCodeIndexingService.IndexProject(username, project, projectSourceCodePath); openingProgressListener.OnProjectLoaded(); var projectItem = GetContentFromPath(username, project, projectSourceCodePath, path); projectItem.DownloadedDate = Directory.GetCreationTimeUtc(projectSourceCodePath).ToString("dd MMM yyyy hh:mm:ss UTC"); return projectItem; } catch (Exception ex) { openingProgressListener.OnProjectLoadingError(); this.logger.Error(ex, "An error has occured while getting the content for path {0} from project {1}/{2}", path, username, project); return null; } }
public ProjectController(ISourceCodeProviderService sourceCodeProviderService, ISourceCodeOpeningProgress openingProgressListener) { this.sourceCodeProviderService = sourceCodeProviderService; this.openingProgressListener = openingProgressListener; }
public ProjectItem GetContent(string username, string project, string path, ISourceCodeOpeningProgress openingProgressListener) { var projectSourceCodePath = this.applicationConfigurationProvider.GetProjectSourceCodePath(username, project); string projectIdentifier = string.Format("{0}_{1}", username, project); try { if (!Directory.Exists(projectSourceCodePath)) { bool projectExtracted = false; this.ExecuteWithInAProjectContext(projectIdentifier, () => { if (!Directory.Exists(projectSourceCodePath)) { string packagePath = this.applicationConfigurationProvider.GetProjectPackagePath(username, project); if (!File.Exists(packagePath)) { openingProgressListener.OnFindProjectStarted(); var projectSelected = this.projectDiscoveryService.FindProject(username, project); if (projectSelected == null) { openingProgressListener.OnProjectNotFound(); this.logger.Info("Couldn't find the specified the Github project {0}/{1}", username, project); } openingProgressListener.OnProjectFound(); openingProgressListener.OnProjectDownloadStarted(); var downloadStatus = this.DownloadZipBall(packagePath, projectSelected.DownloadPackageUrl); if (!downloadStatus) { openingProgressListener.OnProjectDownloadFailed(); this.logger.Info("Failed to download Github project {0}/{1}", username, project); } openingProgressListener.OnProjectDownloadCompleted(); } openingProgressListener.OnProjectPreparing(); this.ExtractZipBall(packagePath, projectSourceCodePath); this.editorService.RewriteExternalDependencies(username, project); projectExtracted = true; } }); if (!projectExtracted) { return(null); } } openingProgressListener.OnBuildingWorkspace(); this.sourceCodeIndexingService.IndexProject(username, project, projectSourceCodePath); openingProgressListener.OnProjectLoaded(); var projectItem = GetContentFromPath(username, project, projectSourceCodePath, path); projectItem.DownloadedDate = Directory.GetCreationTimeUtc(projectSourceCodePath).ToString("dd MMM yyyy hh:mm:ss UTC"); return(projectItem); } catch (PathTooLongException ex) { this.ExecuteWithInAProjectContext(projectIdentifier, () => { // Cleanup the extracted project directory if (Directory.Exists(projectSourceCodePath)) { Directory.Delete(projectSourceCodePath, true); } }); openingProgressListener.OnProjectLoadingError(ex.Message + Environment.NewLine + ex.StackTrace); this.logger.Error(ex, "Path too long exception {0} from project {1}/{2} ", path, username, project); } catch (Exception ex) { openingProgressListener.OnProjectLoadingError(ex.Message + Environment.NewLine + ex.StackTrace); this.logger.Error(ex, "An error has occured while getting the content for path {0} from project {1}/{2} ", path, username, project); } return(null); }
public ProjectItem GetContent(string username, string project, string path, ISourceCodeOpeningProgress openingProgressListener) { var projectSourceCodePath = this.applicationConfigurationProvider.GetProjectSourceCodePath(username, project); string projectIdentifier = string.Format("{0}_{1}", username, project); try { if (!Directory.Exists(projectSourceCodePath)) { bool projectExtracted = false; this.ExecuteWithInAProjectContext(projectIdentifier, () => { if (!Directory.Exists(projectSourceCodePath)) { string packagePath = this.applicationConfigurationProvider.GetProjectPackagePath(username, project); if (!File.Exists(packagePath)) { openingProgressListener.OnFindProjectStarted(); var projectSelected = this.projectDiscoveryService.FindProject(username, project); if (projectSelected == null) { openingProgressListener.OnProjectNotFound(); this.logger.Info("Couldn't find the specified the Github project {0}/{1}", username, project); } openingProgressListener.OnProjectFound(); openingProgressListener.OnProjectDownloadStarted(); var downloadStatus = this.DownloadZipBall(packagePath, projectSelected.DownloadPackageUrl); if (!downloadStatus) { openingProgressListener.OnProjectDownloadFailed(); this.logger.Info("Failed to download Github project {0}/{1}", username, project); } openingProgressListener.OnProjectDownloadCompleted(); } openingProgressListener.OnProjectPreparing(); this.ExtractZipBall(packagePath, projectSourceCodePath); this.editorService.RewriteExternalDependencies(username, project); projectExtracted = true; } }); if (!projectExtracted) { return null; } } openingProgressListener.OnBuildingWorkspace(); this.sourceCodeIndexingService.IndexProject(username, project, projectSourceCodePath); openingProgressListener.OnProjectLoaded(); var projectItem = GetContentFromPath(username, project, projectSourceCodePath, path); projectItem.DownloadedDate = Directory.GetCreationTimeUtc(projectSourceCodePath).ToString("dd MMM yyyy hh:mm:ss UTC"); return projectItem; } catch (PathTooLongException ex) { this.ExecuteWithInAProjectContext(projectIdentifier, () => { // Cleanup the extracted project directory if (Directory.Exists(projectSourceCodePath)) { Directory.Delete(projectSourceCodePath, true); } }); openingProgressListener.OnProjectLoadingError(ex.Message + Environment.NewLine + ex.StackTrace); this.logger.Error(ex, "Path too long exception {0} from project {1}/{2} ", path, username, project); } catch (Exception ex) { openingProgressListener.OnProjectLoadingError(ex.Message + Environment.NewLine + ex.StackTrace); this.logger.Error(ex, "An error has occured while getting the content for path {0} from project {1}/{2} ", path, username, project); } return null; }