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; }
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)); }
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)); }
/// <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); }