示例#1
0
 public OneRepoPerUser(EditySettings editySettings, IPhaseDetector branchDetector, ILogger <OneRepoPerUser> logger)
 {
     this.projectFolder  = editySettings.ProjectPath;
     this.EdityCorePath  = editySettings.EdityCorePath;
     this.SitePath       = editySettings.SitePath;
     this.MasterRepoPath = Path.Combine(projectFolder, "Master");
     this.branchDetector = branchDetector;
     this.logger         = logger;
 }
示例#2
0
        public static Task PushMaster(ToolArgs a, EditySettings editySettings)
        {
            if (editySettings.ProjectMode != ProjectMode.OneRepoPerUser)
            {
                throw new InvalidOperationException("The project mode must be OneRepoPerUser to use the pushmaster tool");
            }

            if (a.Args.Count < 1)
            {
                throw new InvalidOperationException("You must include the destination repository that you want to push to.");
            }
            var log       = a.Scope.ServiceProvider.GetRequiredService <ILogger <Repository> >();
            var destRepo  = a.Args[0];
            var masterDir = Path.GetFullPath(Path.Combine(editySettings.ProjectPath, "Master"));

            if (!Directory.Exists(masterDir))
            {
                throw new InvalidOperationException($"Master dir {masterDir} does not exist. No push will occur.");
            }

            var syncDir = Path.GetFullPath(Path.Combine(editySettings.ProjectPath, "Sync"));

            if (!Directory.Exists(syncDir))
            {
                throw new InvalidOperationException($"Sync dir {syncDir} does not exist. No push will occur.");
            }

            var syncRepo = new Repository(syncDir);

            //Change origin to master and pull changes from Master
            log.LogInformation("Pulling from master to sync.");
            ChangeRemote(syncRepo, masterDir);
            var result = Commands.Pull(syncRepo, new Signature("syncbot", "syncbot@syncbot", DateTime.Now), new PullOptions());

            //Change origin to new desitination and push
            ChangeRemote(syncRepo, destRepo);

            //Push to dest
            var remote  = syncRepo.Network.Remotes[origin];
            var options = new PushOptions()
            {
                CredentialsProvider = (url, user, cred) => GetCredentials(a)
            };

            foreach (var branch in syncRepo.Branches.Where(i => !i.IsRemote))
            {
                log.LogInformation($"Pushing branch {branch.CanonicalName} to origin master.");
                syncRepo.Network.Push(remote, branch.CanonicalName, options);
            }

            return(Task.FromResult(0));
        }
示例#3
0
        public static Task Clone(ToolArgs a, EditySettings editySettings)
        {
            if (a.Args.Count < 1)
            {
                throw new InvalidOperationException("You must include the source repository that you want to clone.");
            }
            var log        = a.Scope.ServiceProvider.GetRequiredService <ILogger <Repository> >();
            var sourceRepo = a.Args[0];
            var masterDir  = Path.GetFullPath(Path.Combine(editySettings.ProjectPath, "Master"));
            var cloneDir   = editySettings.ProjectPath;

            if (editySettings.ProjectMode == ProjectMode.OneRepoPerUser)
            {
                cloneDir = Path.Combine(editySettings.ProjectPath, "Sync");

                if (Directory.Exists(masterDir))
                {
                    throw new InvalidOperationException($"Directory {masterDir} already exists. No clone will take place.");
                }
            }

            cloneDir = Path.GetFullPath(cloneDir);

            //If clone repo exists, do nothing
            if (Directory.Exists(cloneDir) && Directory.EnumerateFileSystemEntries(cloneDir).Any())
            {
                throw new InvalidOperationException($"Directory {cloneDir} already exists and is not empty. No clone will take place.");
            }

            //Clone origin repo
            log.LogInformation($"Cloning {sourceRepo}");
            Repository.Clone(new Uri(sourceRepo).AbsoluteUri, cloneDir, new CloneOptions()
            {
                CredentialsProvider = (url, user, cred) => GetCredentials(a)
            });

            //Create local master repo, if one repo per user
            if (editySettings.ProjectMode == ProjectMode.OneRepoPerUser)
            {
                //Create master repo if it does not exist

                if (!Directory.Exists(masterDir))
                {
                    Directory.CreateDirectory(masterDir);
                    Repository.Init(masterDir, true);
                }

                //Add origin and push from sync to master
                var repo = new Repository(cloneDir);
                ChangeRemote(repo, masterDir);

                var remote  = repo.Network.Remotes[origin];
                var options = new PushOptions();

                foreach (var branch in repo.Branches.Where(i => !i.IsRemote))
                {
                    log.LogInformation($"Pushing branch {branch.CanonicalName} to local master.");
                    repo.Network.Push(remote, branch.CanonicalName, options);
                }
            }

            return(Task.FromResult(0));
        }
示例#4
0
        /// <summary>
        /// Add the main edity services. If you call this and can use the default IFileFinder, you don't need to
        /// do anything else, if you want to customize the file finder add it before calling this function.
        /// </summary>
        /// <param name="services">The services collection.</param>
        /// <param name="setupEditySettings">Callback to configure the edity settings.</param>
        /// <returns>The service collection.</returns>
        public static IServiceCollection AddEdity(this IServiceCollection services, Action <EditySettings> setupEditySettings)
        {
            services.AddThreaxSharedHttpClient();

            var editySettings = new EditySettings();

            setupEditySettings.Invoke(editySettings);

            //Setup the mapper
            var mapperConfig = SetupMappings();

            services.AddScoped <IMapper>(i => mapperConfig.CreateMapper());

            //Setup repos
            services.TryAddScoped <ICommitRepository, CommitRepository>();
            services.TryAddScoped <ISyncRepository, SyncRepository>();
            services.TryAddScoped <IPathBaseInjector, PathBaseInjector>();
            services.TryAddScoped <IDraftRepository, DraftRepository>();
            services.TryAddScoped <IPublishRepository, PublishRepository>();
            services.TryAddScoped <IHistoryRepository, HistoryRepository>();
            services.TryAddScoped <IMergeRepository, MergeRepository>();
            services.TryAddScoped <IPageRepository, PageRepository>();
            services.TryAddScoped <ITemplateRepository, TemplateRepository>();
            services.TryAddScoped <IAssetRepository, AssetRepository>();
            services.TryAddScoped <IBranchRepository, BranchRepository>();
            services.TryAddSingleton <IOverrideValuesProvider>(s => new DefaultOverrideValuesProvider(editySettings.OverrideVars));
            services.TryAddScoped <IGitCredentialsProvider, DefaultGitCredentialsProvider>();

            var baseUrl = HalcyonConventionOptions.HostVariable;

            if (editySettings.BaseUrl != null)
            {
                baseUrl += "/" + editySettings.BaseUrl;
            }

            var halOptions = new HalcyonConventionOptions()
            {
                BaseUrl                   = baseUrl,
                HalDocEndpointInfo        = new HalDocEndpointInfo(typeof(EndpointDocController)),
                MakeAllControllersHalcyon = false
            };

            services.AddConventionalHalcyon(halOptions);

            var halClientGenOptions = new HalClientGenOptions()
            {
                SourceAssemblies = new Assembly[] { typeof(EdityMvcExtensions).GetTypeInfo().Assembly }
            };

            if (editySettings.AdditionalMvcLibraries != null)
            {
                halClientGenOptions.SourceAssemblies = halClientGenOptions.SourceAssemblies.Concat(editySettings.AdditionalMvcLibraries);
            }

            services.AddHalClientGen(halClientGenOptions);

            if (editySettings.Events == null)
            {
                editySettings.Events = new EdityEvents();
            }

            services.TryAddScoped <ITargetFileInfoProvider>(s =>
            {
                var fileFinder = s.GetRequiredService <IFileFinder>();
                return(new DefaultTargetFileInfoProvider(fileFinder.Project.DefaultPage));
            });

            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();

            services.TryAddSingleton <WorkQueue, WorkQueue>();
            services.TryAddSingleton <ICompileService>(s => new CompileService(s.GetRequiredService <WorkQueue>(), mapperConfig.CreateMapper()));

            services.TryAddScoped <IUserInfo, DefaultUserInfo>();

            services.TryAddScoped <IPhaseDetector>(s =>
            {
                var settings = new JsonSerializerSettings();
                settings.SetToHalcyonDefault();
                var serializer = JsonSerializer.Create(settings);
                return(new CookiePhaseDetector("edityBranch", serializer, s.GetRequiredService <IHttpContextAccessor>()));
            });

            services.AddSingleton <EditySettings>(s => editySettings);

            switch (editySettings.ProjectMode)
            {
            case ProjectMode.OneRepo:
            default:
                services.AddTransient <ProjectFinder, OneRepo>(s =>
                {
                    return(new OneRepo(editySettings.ProjectPath, editySettings.EdityCorePath, editySettings.SitePath));
                });
                break;

            case ProjectMode.OneRepoPerUser:
                services.AddTransient <ProjectFinder, OneRepoPerUser>(s =>
                {
                    return(new OneRepoPerUser(editySettings, s.GetRequiredService <IPhaseDetector>(), s.GetRequiredService <ILogger <OneRepoPerUser> >()));
                });
                break;
            }

            services.AddTransient <Repository, Repository>(s =>
            {
                var userInfo      = s.GetRequiredService <IUserInfo>();
                var projectFinder = s.GetRequiredService <ProjectFinder>();
                var projectFolder = projectFinder.GetUserProjectPath(userInfo.UniqueUserName);
                return(new Repository(Repository.Discover(projectFolder)));
            });

            services.AddTransient <Signature, Signature>(s =>
            {
                var userInfo = s.GetRequiredService <IUserInfo>();
                return(new Signature(userInfo.PrettyUserName, userInfo.Email, DateTime.Now));
            });

            services.AddTransient <SiteBuilderSettings, SiteBuilderSettings>(s =>
            {
                return(new SiteBuilderSettings()
                {
                    OutDir = editySettings.OutputPath
                });
            });

            services.TryAddScoped <IContentCompilerFactory, ContentCompilerFactory>();

            services.AddDefaultFileFinder();

            services.AddSingleton <BuildTaskManager>(s =>
            {
                var buildTaskManager = new BuildTaskManager();
                buildTaskManager.SetBuildTaskType("PublishMenu", typeof(PublishMenu));
                buildTaskManager.SetBuildTaskType("CreateIISWebConfig", typeof(CreateIISWebConfig));
                buildTaskManager.SetBuildTaskType("GetPublishRepo", typeof(GetPublishRepo));
                buildTaskManager.SetBuildTaskType("PublishToGitRepo", typeof(PublishToGitRepo));
                buildTaskManager.SetBuildTaskType("AddGithubCname", typeof(AddGithubCname));
                editySettings.Events.CustomizeBuildTasks?.Invoke(buildTaskManager);
                return(buildTaskManager);
            });

            services.TryAddTransient <PullPublish>(s =>
            {
                var projectFinder = s.GetRequiredService <ProjectFinder>();
                return(new PullPublish(projectFinder.MasterRepoPath, projectFinder.PublishedProjectPath));
            });

            services.AddTransient <ISiteBuilder>(s =>
            {
                var settings            = s.GetRequiredService <SiteBuilderSettings>();
                var compilerFactory     = s.GetRequiredService <IContentCompilerFactory>();
                var fileFinder          = s.GetRequiredService <IFileFinder>();
                String deploymentFolder = null;
                if (editySettings.Publisher == Publishers.RoundRobin)
                {
                    deploymentFolder = Guid.NewGuid().ToString();
                }
                var builder          = new SiteBuilder(settings, compilerFactory, fileFinder, deploymentFolder);
                var buildTaskManager = s.GetRequiredService <BuildTaskManager>();

                //Customize publisher settings depending on compiler setting
                switch (editySettings.Publisher)
                {
                case Publishers.RoundRobin:
                    var outputBaseFolder = settings.OutDir;
                    settings.OutDir      = Path.GetFullPath(Path.Combine(settings.OutDir, deploymentFolder));
                    builder.AddPublishTask(new RoundRobinPublisher(settings.OutDir));
                    break;
                }

                if (editySettings.ProjectMode == ProjectMode.OneRepoPerUser)
                {
                    builder.AddPreBuildTask(s.GetRequiredService <PullPublish>());
                }

                foreach (var preBuild in fileFinder.Project.PreBuildTasks)
                {
                    builder.AddPreBuildTask(buildTaskManager.CreateBuildTask(preBuild));
                }

                foreach (var postBuild in fileFinder.Project.PostBuildTasks)
                {
                    builder.AddPostBuildTask(buildTaskManager.CreateBuildTask(postBuild));
                }

                foreach (var publish in fileFinder.Project.PublishTasks)
                {
                    builder.AddPublishTask(buildTaskManager.CreateBuildTask(publish));
                }

                foreach (var postPublish in fileFinder.Project.PostPublishTasks)
                {
                    builder.AddPostPublishTask(buildTaskManager.CreateBuildTask(postPublish));
                }

                editySettings.Events.CustomizeSiteBuilder(new SiteBuilderEventArgs()
                {
                    SiteBuilder = builder,
                    Services    = s
                });

                return(builder);
            });

            services.AddExceptionErrorFilters(new ExceptionFilterOptions()
            {
                DetailedErrors = editySettings.DetailedErrors
            });

            // Add framework services.
            var mvcBuilder = services.AddMvc(o =>
            {
                o.UseExceptionErrorFilters();
                o.UseConventionalHalcyon(halOptions);
            })
                             .AddNewtonsoftJson(o =>
            {
                o.SerializerSettings.SetToHalcyonDefault();
                o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            })
                             .AddEdityControllers(editySettings.AdditionalMvcLibraries);

            editySettings.Events.CustomizeMvcBuilder?.Invoke(mvcBuilder);

            services.AddScoped <ICompileRequestDetector, CompileRequestDetector>();

            services.AddSingleton <IFileVerifier>(s =>
            {
                var verifier = new FileVerifier()
                               .AddHtml()
                               .AddBitmap()
                               .AddJpeg()
                               .AddPng()
                               .AddSvgXml()
                               .AddGif()
                               .AddPdf()
                               .AddDocx()
                               .AddDoc()
                               .AddPptx()
                               .AddPpt()
                               .AddXlsx()
                               .AddXls()
                               .AddJson();

                editySettings.Events.CustomizeFileVerifier?.Invoke(verifier);

                return(verifier);
            });

            services.AddScoped <IToolRunner>(s =>
            {
                var tools = new ToolRunner()
                            .UseClientGenTools();

                editySettings.Events.CustomizeTools?.Invoke(tools);

                return(tools);
            });

            services.AddThreaxProcessHelper(o =>
            {
                //o.IncludeLogOutput = false;
                //o.DecorateProcessRunner = r => new SpyProcessRunner(r)
                //{
                //    Events = new ProcessEvents()
                //    {
                //        ErrorDataReceived = (o, e) => { if (e.DataReceivedEventArgs.Data != null) Console.WriteLine(e.DataReceivedEventArgs.Data); },
                //        OutputDataReceived = (o, e) => { if (e.DataReceivedEventArgs.Data != null) Console.WriteLine(e.DataReceivedEventArgs.Data); },
                //    }
                //};
            });

            return(services);
        }