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;
            }
        }
Пример #2
0
 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;
        }
 public ProjectController(ISourceCodeProviderService sourceCodeProviderService, ISourceCodeOpeningProgress openingProgressListener)
 {
     this.sourceCodeProviderService = sourceCodeProviderService;
     this.openingProgressListener = openingProgressListener;
 }