Commit 029d56d
Eric Bower
·
2023-08-09 00:13:46 -0400 EDT
parent c69f86f
progress
1 files changed,
+80,
-56
M
main.go
M
main.go
+80,
-56
| ... | ... | @@ -32,8 +32,10 @@ type Config struct { | |
| 32 | 32 | RepoPath string | |
| 33 | 33 | ||
| 34 | 34 | // optional params | |
| 35 | - | // generate logs and trees based on the refs provided | |
| 35 | + | // generate logs and trees based on the git references provided | |
| 36 | 36 | Refs []string | |
| 37 | + | // generate logs anad tree based on the git revisions provided | |
| 38 | + | Revs []string | |
| 37 | 39 | // description of repo used in the header of site | |
| 38 | 40 | Desc string | |
| 39 | 41 | // maximum number of commits that we will process in descending order |
| ... | ... | @@ -57,11 +59,12 @@ type Config struct { | |
| 57 | 59 | RepoName string | |
| 58 | 60 | } | |
| 59 | 61 | ||
| 62 | + | // revision data | |
| 60 | 63 | type RevData struct { | |
| 64 | + | ID string | |
| 61 | 65 | RevName string | |
| 62 | 66 | TreeURL template.URL | |
| 63 | 67 | LogURL template.URL | |
| 64 | - | Ref *git.Reference | |
| 65 | 68 | } | |
| 66 | 69 | ||
| 67 | 70 | type CommitData struct { |
| ... | ... | @@ -77,12 +80,12 @@ type TreeItem struct { | |
| 77 | 80 | IsTextFile bool | |
| 78 | 81 | Size string | |
| 79 | 82 | NumLines int | |
| 80 | - | URL string | |
| 81 | 83 | Path string | |
| 82 | - | Entry *git.TreeEntry | |
| 84 | + | URL template.URL | |
| 83 | 85 | CommitURL template.URL | |
| 84 | 86 | Summary string | |
| 85 | 87 | When string | |
| 88 | + | Entry *git.TreeEntry | |
| 86 | 89 | } | |
| 87 | 90 | ||
| 88 | 91 | type DiffRender struct { |
| ... | ... | @@ -271,7 +274,7 @@ func walkTree(tree *git.Tree, branch string, curpath string, aggregate []*TreeIt | |
| 271 | 274 | Size: toPretty(entry.Size()), | |
| 272 | 275 | Path: fname, | |
| 273 | 276 | Entry: entry, | |
| 274 | - | URL: filepath.Join("/", "tree", branch, "item", fname), | |
| 277 | + | URL: template.URL(filepath.Join("/", "tree", branch, "item", fname)), | |
| 275 | 278 | }) | |
| 276 | 279 | } | |
| 277 | 280 | } |
| ... | ... | @@ -514,6 +517,10 @@ func (c *Config) getURLs() *SiteURLs { | |
| 514 | 517 | } | |
| 515 | 518 | } | |
| 516 | 519 | ||
| 520 | + | func getShortID(id string) string { | |
| 521 | + | return id[:7] | |
| 522 | + | } | |
| 523 | + | ||
| 517 | 524 | func (c *Config) writeRepo() *BranchOutput { | |
| 518 | 525 | repo, err := git.Open(c.RepoPath) | |
| 519 | 526 | bail(err) |
| ... | ... | @@ -521,57 +528,72 @@ func (c *Config) writeRepo() *BranchOutput { | |
| 521 | 528 | refs, err := repo.ShowRef(git.ShowRefOptions{Heads: true, Tags: true}) | |
| 522 | 529 | bail(err) | |
| 523 | 530 | ||
| 524 | - | var first *git.Reference | |
| 525 | - | fitRefs := []*git.Reference{} | |
| 531 | + | var first *RevData | |
| 532 | + | revs := []*RevData{} | |
| 526 | 533 | for _, refStr := range c.Refs { | |
| 527 | 534 | for _, ref := range refs { | |
| 528 | - | rH := strings.Replace(ref.Refspec, "refs/heads/", "", 1) | |
| 529 | - | rT := strings.Replace(rH, "refs/tags/", "", 1) | |
| 530 | - | if rT == refStr { | |
| 531 | - | if first == nil { | |
| 532 | - | first = ref | |
| 533 | - | } | |
| 534 | - | fitRefs = append(fitRefs, ref) | |
| 535 | + | refName := git.RefShortName(ref.Refspec) | |
| 536 | + | if refName != refStr { | |
| 537 | + | continue | |
| 538 | + | } | |
| 539 | + | ||
| 540 | + | data := &RevData{ | |
| 541 | + | ID: ref.ID, | |
| 542 | + | RevName: refName, | |
| 543 | + | TreeURL: c.getTreeUrl(refName), | |
| 544 | + | LogURL: c.getLogsUrl(refName), | |
| 545 | + | } | |
| 546 | + | if first == nil { | |
| 547 | + | first = data | |
| 535 | 548 | } | |
| 549 | + | revs = append(revs, data) | |
| 550 | + | } | |
| 551 | + | } | |
| 552 | + | ||
| 553 | + | for _, revStr := range c.Revs { | |
| 554 | + | fullRevID, err := repo.RevParse(revStr) | |
| 555 | + | bail(err) | |
| 556 | + | ||
| 557 | + | revName := getShortID(fullRevID) | |
| 558 | + | data := &RevData{ | |
| 559 | + | ID: fullRevID, | |
| 560 | + | RevName: revName, | |
| 561 | + | TreeURL: c.getTreeUrl(revName), | |
| 562 | + | LogURL: c.getLogsUrl(revName), | |
| 536 | 563 | } | |
| 564 | + | if first == nil { | |
| 565 | + | first = data | |
| 566 | + | } | |
| 567 | + | revs = append(revs, data) | |
| 537 | 568 | } | |
| 538 | 569 | ||
| 539 | 570 | if first == nil { | |
| 540 | 571 | bail(fmt.Errorf("could find find a git reference that matches criteria")) | |
| 541 | 572 | } | |
| 542 | 573 | ||
| 543 | - | _, revName := filepath.Split(first.Refspec) | |
| 544 | - | ||
| 545 | 574 | refInfoMap := map[string]*RefInfo{} | |
| 546 | 575 | mainOutput := &BranchOutput{} | |
| 547 | 576 | claimed := false | |
| 548 | - | for _, ref := range fitRefs { | |
| 549 | - | _, revn := filepath.Split(ref.Refspec) | |
| 550 | - | refInfoMap[ref.ID] = &RefInfo{ | |
| 551 | - | Refspec: strings.TrimPrefix(ref.Refspec, "refs/"), | |
| 552 | - | URL: c.getTreeUrl(revn), | |
| 553 | - | } | |
| 554 | - | ||
| 555 | - | branchRepo := &RevData{ | |
| 556 | - | TreeURL: c.getTreeUrl(revn), | |
| 557 | - | LogURL: c.getLogsUrl(revn), | |
| 558 | - | RevName: revn, | |
| 559 | - | Ref: ref, | |
| 560 | - | } | |
| 577 | + | for _, revData := range revs { | |
| 578 | + | refInfoMap[revData.ID] = &RefInfo{ | |
| 579 | + | Refspec: revData.RevName, | |
| 580 | + | URL: revData.TreeURL, | |
| 581 | + | } | |
| 561 | 582 | ||
| 562 | - | data := &PageData{ | |
| 563 | - | Repo: c, | |
| 564 | - | RevData: branchRepo, | |
| 565 | - | SiteURLs: c.getURLs(), | |
| 566 | - | } | |
| 583 | + | data := &PageData{ | |
| 584 | + | Repo: c, | |
| 585 | + | RevData: revData, | |
| 586 | + | SiteURLs: c.getURLs(), | |
| 587 | + | } | |
| 567 | 588 | ||
| 568 | - | branchOutput := c.writeBranch(repo, data) | |
| 569 | - | if !claimed { | |
| 570 | - | mainOutput = branchOutput | |
| 571 | - | claimed = true | |
| 572 | - | } | |
| 589 | + | branchOutput := c.writeBranch(repo, data) | |
| 590 | + | if !claimed { | |
| 591 | + | mainOutput = branchOutput | |
| 592 | + | claimed = true | |
| 573 | 593 | } | |
| 594 | + | } | |
| 574 | 595 | ||
| 596 | + | // loop through ALL refs that don't have URLs | |
| 575 | 597 | for _, ref := range refs { | |
| 576 | 598 | if refInfoMap[ref.ID] != nil { | |
| 577 | 599 | continue |
| ... | ... | @@ -598,9 +620,9 @@ func (c *Config) writeRepo() *BranchOutput { | |
| 598 | 620 | }) | |
| 599 | 621 | ||
| 600 | 622 | revData := &RevData{ | |
| 601 | - | TreeURL: c.getTreeUrl(revName), | |
| 602 | - | LogURL: c.getLogsUrl(revName), | |
| 603 | - | RevName: revName, | |
| 623 | + | TreeURL: c.getTreeUrl(first.RevName), | |
| 624 | + | LogURL: c.getLogsUrl(first.RevName), | |
| 625 | + | RevName: first.RevName, | |
| 604 | 626 | } | |
| 605 | 627 | ||
| 606 | 628 | data := &PageData{ |
| ... | ... | @@ -622,7 +644,7 @@ func (c *Config) writeBranch(repo *git.Repository, pageData *PageData) *BranchOu | |
| 622 | 644 | pageSize = 5000 | |
| 623 | 645 | } | |
| 624 | 646 | ||
| 625 | - | commits, err := repo.CommitsByPage(pageData.RevData.Ref.ID, 0, pageSize) | |
| 647 | + | commits, err := repo.CommitsByPage(pageData.RevData.ID, 0, pageSize) | |
| 626 | 648 | bail(err) | |
| 627 | 649 | ||
| 628 | 650 | logs := []*CommitData{} |
| ... | ... | @@ -641,7 +663,7 @@ func (c *Config) writeBranch(repo *git.Repository, pageData *PageData) *BranchOu | |
| 641 | 663 | }) | |
| 642 | 664 | } | |
| 643 | 665 | ||
| 644 | - | tree, err := repo.LsTree(pageData.RevData.Ref.ID) | |
| 666 | + | tree, err := repo.LsTree(pageData.RevData.ID) | |
| 645 | 667 | bail(err) | |
| 646 | 668 | ||
| 647 | 669 | entries := []*TreeItem{} |
| ... | ... | @@ -654,7 +676,7 @@ func (c *Config) writeBranch(repo *git.Repository, pageData *PageData) *BranchOu | |
| 654 | 676 | if pageData.Repo.HideTreeLastCommit { | |
| 655 | 677 | fmt.Println("skipping finding last commit for each file") | |
| 656 | 678 | } else { | |
| 657 | - | lastCommits, err = repo.RevList([]string{pageData.RevData.Ref.Refspec}, git.RevListOptions{ | |
| 679 | + | lastCommits, err = repo.RevList([]string{pageData.RevData.ID}, git.RevListOptions{ | |
| 658 | 680 | Path: entry.Path, | |
| 659 | 681 | CommandOptions: git.CommandOptions{Args: []string{"-1"}}, | |
| 660 | 682 | }) |
| ... | ... | @@ -668,14 +690,14 @@ func (c *Config) writeBranch(repo *git.Repository, pageData *PageData) *BranchOu | |
| 668 | 690 | entry.Summary = lc.Summary() | |
| 669 | 691 | entry.When = timediff.TimeDiff(lc.Author.When) | |
| 670 | 692 | } | |
| 671 | - | entry.URL = filepath.Join( | |
| 693 | + | entry.URL = template.URL(filepath.Join( | |
| 672 | 694 | "/", | |
| 673 | 695 | c.RepoName, | |
| 674 | 696 | "tree", | |
| 675 | 697 | pageData.RevData.RevName, | |
| 676 | 698 | "item", | |
| 677 | 699 | fmt.Sprintf("%s.html", entry.Path), | |
| 678 | - | ) | |
| 700 | + | )) | |
| 679 | 701 | } | |
| 680 | 702 | ||
| 681 | 703 | fmt.Printf("compilation complete (%s) branch (%s)\n", c.RepoName, pageData.RevData.RevName) |
| ... | ... | @@ -690,9 +712,10 @@ func (c *Config) writeBranch(repo *git.Repository, pageData *PageData) *BranchOu | |
| 690 | 712 | } | |
| 691 | 713 | ||
| 692 | 714 | func main() { | |
| 693 | - | var outdir = flag.String("out", "./public", "output directory (default: ./public)") | |
| 715 | + | var outdir = flag.String("out", "./public", "output directory") | |
| 694 | 716 | var rpath = flag.String("repo", ".", "path to git repo") | |
| 695 | - | var refsFlag = flag.String("refs", "", "path to git repo") | |
| 717 | + | var refsFlag = flag.String("refs", "", "list of refs to generate logs and tree (e.g. main,v1)") | |
| 718 | + | var revsFlag = flag.String("revs", "HEAD", "list of revs to generate logs and tree (e.g. c69f86f,7415be1") | |
| 696 | 719 | ||
| 697 | 720 | flag.Parse() | |
| 698 | 721 |
| ... | ... | @@ -703,7 +726,12 @@ func main() { | |
| 703 | 726 | ||
| 704 | 727 | refs := strings.Split(*refsFlag, ",") | |
| 705 | 728 | if len(refs) == 1 && refs[0] == "" { | |
| 706 | - | refs = []string{"main", "master"} | |
| 729 | + | refs = []string{} | |
| 730 | + | } | |
| 731 | + | ||
| 732 | + | revs := strings.Split(*revsFlag, ",") | |
| 733 | + | if len(revs) == 1 && revs[0] == "" { | |
| 734 | + | revs = []string{} | |
| 707 | 735 | } | |
| 708 | 736 | ||
| 709 | 737 | config := &Config{ |
| ... | ... | @@ -712,14 +740,10 @@ func main() { | |
| 712 | 740 | RepoName: repoName(repoPath), | |
| 713 | 741 | Cache: make(map[string]bool), | |
| 714 | 742 | Refs: refs, | |
| 743 | + | Revs: revs, | |
| 715 | 744 | } | |
| 716 | 745 | ||
| 717 | - | fmt.Println(config.Outdir) | |
| 718 | - | fmt.Println(config.RepoPath) | |
| 719 | - | fmt.Println(config.RepoName) | |
| 720 | - | fmt.Println(config.Refs) | |
| 721 | - | ||
| 722 | 746 | config.writeRepo() | |
| 723 | - | url := filepath.Join(config.Outdir, config.RepoName, "index.html") | |
| 747 | + | url := filepath.Join("/", config.RepoName, "index.html") | |
| 724 | 748 | fmt.Println(url) | |
| 725 | 749 | } |