func main() { log.Info("Gogs Web %s", APP_VER) log.Info("Run Mode: %s", strings.Title(macaron.Env)) models.InitModels() m1 := newGogsInstance() m2 := newMacaronInstance() hs := switcher.NewHostSwitcher() hs.Set("gogs.io", m1) hs.Set("macaron.gogs.io", m2) var err error // In dev mode, listen two ports just for convenience. if macaron.Env == macaron.DEV { // Gogs. listenAddr := fmt.Sprintf("0.0.0.0:%d", setting.HttpPort) log.Info("Listen: http://%s", listenAddr) go http.ListenAndServe(listenAddr, m1) // Macaron. listenAddr = fmt.Sprintf("0.0.0.0:%d", setting.HttpPort+1) log.Info("Listen: http://%s", listenAddr) err = http.ListenAndServe(listenAddr, m2) } else { schema := "http" if setting.Https { schema = "https" } listenAddr := fmt.Sprintf("0.0.0.0:%d", setting.HttpPort) log.Info("Listen: %v://%s", schema, listenAddr) if setting.Https { err = http.ListenAndServeTLS(listenAddr, setting.HttpsCert, setting.HttpsKey, hs) } else { err = http.ListenAndServe(listenAddr, hs) } } if err != nil { log.Fatal("Fail to start server: %v", err) } }
func checkFileUpdates() { log.Debug("Checking file updates") type tree struct { AppName, ApiUrl, RawUrl, TreeName, Prefix string } trees := make([]*tree, len(setting.Apps)) for i, app := range setting.Apps { trees[i] = &tree{ AppName: app.Name, ApiUrl: "https://api.github.com/repos/" + app.RepoName + "/git/trees/master?recursive=1&" + setting.GithubCred, RawUrl: "https://raw.github.com/" + app.RepoName + "/master/", TreeName: "conf/docTree_" + app.Name + ".json", Prefix: "docs/" + app.Name + "/", } } for _, tree := range trees { var tmpTree struct { Tree []*oldDocNode } if err := com.HttpGetJSON(httpClient, tree.ApiUrl, &tmpTree); err != nil { log.Error("Fail to get trees: %v", err) return } var saveTree struct { Tree []*oldDocNode } saveTree.Tree = make([]*oldDocNode, 0, len(tmpTree.Tree)) // Compare SHA. files := make([]com.RawFile, 0, len(tmpTree.Tree)) for _, node := range tmpTree.Tree { // Skip non-md files and "README.md". if node.Type != "blob" || (!strings.HasSuffix(node.Path, ".md") && !strings.Contains(node.Path, "images") && !strings.HasSuffix(node.Path, ".json")) || strings.HasPrefix(strings.ToLower(node.Path), "readme") { continue } name := strings.TrimSuffix(node.Path, ".md") if checkSHA(tree.AppName, name, node.Sha, tree.Prefix) { log.Info("Need to update: %s", name) files = append(files, &rawFile{ name: name, rawURL: tree.RawUrl + node.Path, }) } saveTree.Tree = append(saveTree.Tree, &oldDocNode{ Path: name, Sha: node.Sha, }) // For save purpose, reset name. node.Path = name } // Fetch files. if err := com.FetchFiles(httpClient, files, nil); err != nil { log.Error("Fail to fetch files: %v", err) return } // Update data. for _, f := range files { os.MkdirAll(path.Join(tree.Prefix, path.Dir(f.Name())), os.ModePerm) suf := ".md" if strings.Contains(f.Name(), "images") || strings.HasSuffix(f.Name(), ".json") { suf = "" } fw, err := os.Create(tree.Prefix + f.Name() + suf) if err != nil { log.Error("Fail to open file: %v", err) continue } _, err = fw.Write(f.Data()) fw.Close() if err != nil { log.Error("Fail to write data: %v", err) continue } } // Save documentation information. f, err := os.Create(tree.TreeName) if err != nil { log.Error("Fail to save data: %v", err) return } e := json.NewEncoder(f) err = e.Encode(&saveTree) if err != nil { log.Error("Fail to encode data: %v", err) return } f.Close() } log.Debug("Finish check file updates") for _, app := range setting.Apps { parseDocs(app.Name) initDocMap(app.Name) } }