Exemple #1
0
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)
	}
}
Exemple #2
0
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)
	}
}