func build(watches ...bool) error { // Hugo writes the output to memory instead of the disk // This is only used for benchmark testing. Cause the content is only visible // in memory if renderToMemory { hugofs.SetDestination(new(afero.MemMapFs)) // Rendering to memoryFS, publish to Root regardless of publishDir. viper.Set("PublishDir", "/") } if err := copyStatic(); err != nil { return fmt.Errorf("Error copying static files to %s: %s", helpers.AbsPathify(viper.GetString("PublishDir")), err) } watch := false if len(watches) > 0 && watches[0] { watch = true } if err := buildSite(buildWatch || watch); err != nil { return fmt.Errorf("Error building site: %s", err) } if buildWatch { jww.FEEDBACK.Println("Watching for changes in", helpers.AbsPathify(viper.GetString("ContentDir"))) jww.FEEDBACK.Println("Press Ctrl+C to stop") utils.CheckErr(NewWatcher(0)) } return nil }
func server(cmd *cobra.Command, args []string) error { if err := InitializeConfig(serverCmd); err != nil { return err } if flagChanged(cmd.Flags(), "disableLiveReload") { viper.Set("disableLiveReload", disableLiveReload) } if serverWatch { viper.Set("watch", true) } if viper.GetBool("watch") { serverWatch = true watchConfig() } l, err := net.Listen("tcp", net.JoinHostPort(serverInterface, strconv.Itoa(serverPort))) if err == nil { l.Close() } else { if flagChanged(serverCmd.Flags(), "port") { // port set explicitly by user -- he/she probably meant it! return newSystemErrorF("Server startup failed: %s", err) } jww.ERROR.Println("port", serverPort, "already in use, attempting to use an available port") sp, err := helpers.FindAvailablePort() if err != nil { return newSystemError("Unable to find alternative port to use:", err) } serverPort = sp.Port } viper.Set("port", serverPort) baseURL, err = fixURL(baseURL) if err != nil { return err } viper.Set("baseURL", baseURL) if err := memStats(); err != nil { jww.ERROR.Println("memstats error:", err) } // If a Destination is provided via flag write to disk if destination != "" { renderToDisk = true } // Hugo writes the output to memory instead of the disk if !renderToDisk { hugofs.SetDestination(new(afero.MemMapFs)) // Rendering to memoryFS, publish to Root regardless of publishDir. viper.Set("publishDir", "/") } if err := build(serverWatch); err != nil { return err } // Watch runs its own server as part of the routine if serverWatch { watchDirs := getDirList() baseWatchDir := viper.GetString("workingDir") for i, dir := range watchDirs { watchDirs[i], _ = helpers.GetRelativePath(dir, baseWatchDir) } rootWatchDirs := strings.Join(helpers.UniqueStrings(helpers.ExtractRootPaths(watchDirs)), ",") jww.FEEDBACK.Printf("Watching for changes in %s%s{%s}\n", baseWatchDir, helpers.FilePathSeparator, rootWatchDirs) err := NewWatcher(serverPort) if err != nil { return err } } serve(serverPort) return nil }