repo2.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package models
  5. import (
  6. "path"
  7. "time"
  8. "github.com/gogits/git"
  9. )
  10. type RepoFile struct {
  11. *git.TreeEntry
  12. Path string
  13. Message string
  14. Created time.Time
  15. Size int64
  16. }
  17. func GetBranches(userName, reposName string) ([]string, error) {
  18. repo, err := git.OpenRepository(RepoPath(userName, reposName))
  19. if err != nil {
  20. return nil, err
  21. }
  22. refs, err := repo.AllReferences()
  23. if err != nil {
  24. return nil, err
  25. }
  26. brs := make([]string, len(refs))
  27. for i, ref := range refs {
  28. brs[i] = ref.Name
  29. }
  30. return brs, nil
  31. }
  32. func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, error) {
  33. repo, err := git.OpenRepository(RepoPath(userName, reposName))
  34. if err != nil {
  35. return nil, err
  36. }
  37. ref, err := repo.LookupReference("refs/heads/" + branchName)
  38. if err != nil {
  39. return nil, err
  40. }
  41. lastCommit, err := repo.LookupCommit(ref.Oid)
  42. if err != nil {
  43. return nil, err
  44. }
  45. var repodirs []*RepoFile
  46. var repofiles []*RepoFile
  47. lastCommit.Tree.Walk(func(dirname string, entry *git.TreeEntry) int {
  48. if dirname == rpath {
  49. size, err := repo.ObjectSize(entry.Id)
  50. if err != nil {
  51. return 0
  52. }
  53. switch entry.Filemode {
  54. case git.FileModeBlob, git.FileModeBlobExec:
  55. repofiles = append(repofiles, &RepoFile{
  56. entry,
  57. path.Join(dirname, entry.Name),
  58. lastCommit.Message(),
  59. lastCommit.Committer.When,
  60. size,
  61. })
  62. case git.FileModeTree:
  63. repodirs = append(repodirs, &RepoFile{
  64. entry,
  65. path.Join(dirname, entry.Name),
  66. lastCommit.Message(),
  67. lastCommit.Committer.When,
  68. size,
  69. })
  70. }
  71. }
  72. return 0
  73. })
  74. return append(repodirs, repofiles...), nil
  75. }