Example #1
0
        public void Run()
        {
            var extensionConfigPath = arguments["extension"].Trim();
            var workingDirectory = arguments["directory"].Trim();

            if (!File.Exists(extensionConfigPath))
            {
                log.ErrorFormat("The extension configuration file '{0}' doesn't exist", extensionConfigPath);
                return;
            }

            if (!Directory.Exists(workingDirectory))
            {
                log.ErrorFormat("Directory '{0}' doesn't exist", workingDirectory);
                return;
            }

            var builder = new ExtensionBuilder();
            var fileInfo = new FileInfo(extensionConfigPath);
            var extensionConfig = ProjectConfiguration.Create(fileInfo.FullName);

            if (string.IsNullOrEmpty(extensionConfig.Name))
            {
                log.ErrorFormat("The extension needs a name, build cancelled");
                return;
            }

            log.InfoFormat("Building extension {0}.", extensionConfig.Name);

            var extensionFile = Path.Combine(fileInfo.DirectoryName, extensionConfig.Name + ".zip");
            builder.BuildExtension(fileInfo.DirectoryName, extensionFile);

            var projectFiles = Directory
                .GetFiles(workingDirectory, "Project.config", SearchOption.AllDirectories)
                .Where(s => s != fileInfo.FullName && !s.Contains(@"\bin\"));

            foreach (var projectFile in projectFiles)
            {
                var projectInfo = new FileInfo(projectFile);
                var projectConfig = ProjectConfiguration.Create(projectInfo.FullName);

                if (projectConfig.Dependencies.Contains(extensionConfig.Name))
                {
                    var httpContext = new HttpContextMock("/");
                    var projectContext = new SageContext(httpContext, delegate(string path)
                    {
                        path = path.ReplaceAll("^~?/", string.Empty).ReplaceAll("/", "\\");
                        if (!Path.IsPathRooted(path))
                            path = Path.Combine(projectInfo.DirectoryName, path);

                        return path;

                    },	projectConfig);

                    string installPath = Path.Combine(projectContext.Path.ExtensionPath, Path.GetFileName(extensionFile));
                    File.Copy(extensionFile, installPath, true);
                }
            }
        }
Example #2
0
        public void Run()
        {
            var directories = arguments["directory"].Trim().Split('+');

            var projectFiles = new List<string>();
            foreach (var path in directories)
            {
                if (!Directory.Exists(path))
                {
                    log.ErrorFormat("Directory '{0}' doesn't exist", path);
                    return;
                }

                projectFiles.AddRange(Directory
                    .GetFiles(path, "Project.config", SearchOption.AllDirectories)
                    .Where(s => !s.Contains(@"\bin\"))
                );
            }

            log.InfoFormat("Building all extension projects in {0}.", string.Join(", ", directories));

            var temporaryDir = Path.Combine(directories[0], "temp");
            Directory.CreateDirectory(temporaryDir);

            var extensions = new Dictionary<string, string>();
            var projects = new Dictionary<string, ProjectInfo>();
            var builder = new ExtensionBuilder();

            foreach (var projectFile in projectFiles)
            {
                var fileInfo = new FileInfo(projectFile);
                var projectConfig = ProjectConfiguration.Create(fileInfo.FullName);

                // skip extension projects
                if (projectConfig.Name == "$projectname$")
                    continue;

                var projectName = projectConfig.Name ??
                    string.Format("Project.{0}.{1}", fileInfo.Directory.Name, projects.Count + 1);

                var projectPath = Path.GetDirectoryName(projectFile);

                if (projectConfig.Type == ProjectType.ExtensionProject)
                {
                    var targetPath = Path.Combine(temporaryDir, projectName + ".zip");
                    builder.BuildExtension(projectPath, targetPath);
                    extensions.Add(projectName, targetPath);
                }

                projects.Add(projectName, new ProjectInfo
                {
                    Name = projectName,
                    Path = projectPath,
                    Config = projectConfig,
                    Dependencies = projectConfig.Dependencies
                });
            }

            List<string> visitedProjects = new List<string>();

            Action<ProjectInfo> copyDependencies = null;
            copyDependencies = projectInfo =>
            {
                if (visitedProjects.Contains(projectInfo.Name))
                    return;

                SageContext context = Program.CreateSageContext("/",
                projectInfo.Config, path =>
                        {
                            if (path == "/")
                                path = "~/";

                            string result = path
                                .Replace("~", projectInfo.Path)
                                .Replace("//", "/")
                                .Replace("/", "\\");

                            return new FileInfo(result).FullName;
                        });

                foreach (string extensionName in projectInfo.Dependencies)
                {
                    if (!extensions.ContainsKey(extensionName))
                    {
                        log.ErrorFormat("Extension {0} (dependency of project {1}) could not be found", extensionName, projectInfo.Name);
                        continue;
                    }

                    string extensionFile = extensions[extensionName];
                    string targetPath = Path.Combine(context.Path.ExtensionPath, Path.GetFileName(extensionFile));
                    if (!Directory.Exists(Path.GetDirectoryName(targetPath)))
                        Directory.CreateDirectory(Path.GetDirectoryName(targetPath));

                    File.Copy(extensionFile, targetPath, true);
                    log.InfoFormat("Copied extension {0} to project {1}", extensionName, projectInfo.Name);
                    log.DebugFormat("\t({0})", targetPath);

                    ProjectInfo info = projects[extensionName];
                    copyDependencies(info);
                }

                visitedProjects.Add(projectInfo.Name);
            };

            projects.Values.Each(copyDependencies);
            try
            {
                var attempts = 0;
                while (++attempts < 6)
                {
                    Directory.Delete(temporaryDir);
                    if (Directory.Exists(temporaryDir))
                        Thread.Sleep(TimeSpan.FromSeconds(.1));

                    if (!Directory.Exists(temporaryDir))
                        break;
                }
            }
            catch (IOException ex)
            {
                log.WarnFormat("Failed to delete temporary directory '{0}': {1}", temporaryDir, ex.Message);
            }
        }