package main import ( "encoding/json" "log" "io/ioutil" "path/filepath" ) type RepoCommits struct { Config configCollect CommitDesc map[string]string CommitContent map[string]Commit Head *CommitNode } type CommitNode struct { Parents []*CommitNode Children []*CommitNode Content Commit } type Commit struct { CommitId string `json:"commit_id"` RootId string `json:"root_id"` RepoId string `json:"repo_id"` CreatorName string `json:"creator_name"` Creator string `json:"creator"` Description string `json:"description"` Ctime uint64 `json:"ctime"` ParentId string `json:"parent_id"` SecondParentId string `json:"second_parent_id"` RepoName string `json:"repo_name"` RepoDesc string `json:"repo_desc"` RepoCategory string `json:"repo_category"` NoLocalHistory int `json:"no_local_history"` Version int `json:"version"` } func cmdCommit(config configCollect) { rc := NewRepoCommits(config) rc.CollectDescs() rc.PrintDescs() rc.CollectContent() //rc.BuildGraph() } func NewRepoCommits (config configCollect) *RepoCommits { rc := new(RepoCommits) rc.Config = config rc.CommitDesc = make(map[string]string) rc.CommitContent = make(map[string]Commit) return rc } func (rc* RepoCommits) CollectDescs() { baseFolder := filepath.Join(rc.Config.Storage, "commits", rc.Config.RepoId) log.Println(baseFolder) layer1, err := ioutil.ReadDir(baseFolder) if err != nil { log.Fatal(err) } for _, l1 := range layer1 { intFolder := filepath.Join(baseFolder, l1.Name()) layer2, err := ioutil.ReadDir(intFolder) if err != nil { log.Fatal(err) } for _, l2 := range layer2 { commitId := l1.Name() + l2.Name() commitPath := filepath.Join(intFolder, l2.Name()) rc.CommitDesc[commitId] = commitPath } } } func (rc* RepoCommits) PrintDescs() { limit := 10 for id, path := range rc.CommitDesc { log.Println(id, path) limit = limit - 1 if limit < 0 { log.Println("Too many commits, output has been truncated") break } } log.Println("Repo", rc.Config.RepoId, "contains", len(rc.CommitDesc), "commits") } func (rc* RepoCommits) CollectContent() { for id, path := range rc.CommitDesc { data, err := ioutil.ReadFile(path) if err != nil { log.Fatal(err) } var c Commit json.Unmarshal(data, &c) rc.CommitContent[id] = c log.Println(rc.CommitContent[id]) } }