diff --git a/models/repo.go b/models/repo.go index 8070d7442..7606029b0 100755 --- a/models/repo.go +++ b/models/repo.go @@ -6,6 +6,7 @@ package models import ( + "code.gitea.io/gitea/modules/git" "context" "crypto/md5" "errors" @@ -2519,3 +2520,53 @@ func UpdateRepositoryCommitNum(repo *Repository) error { return nil } + +type RepoFile struct { + CommitId string + Content []byte +} + +// ReadLatestFileRepo read latest version of file in repository +// return commitId and file content +func ReadLatestFileRepo(userName, repoName, refName, treePath string) (*RepoFile, error) { + var err error + repoPath := RepoPath(userName, repoName) + gitRepo, err := git.OpenRepository(repoPath) + if err != nil { + log.Error("ReadLatestFileRepo error when OpenRepository,error=%v", err) + return nil, err + } + commitID, err := gitRepo.GetBranchCommitID(refName) + if err != nil { + log.Error("ReadLatestFileRepo error when GetBranchCommitID,error=%v", err) + return nil, err + } + commit, err := gitRepo.GetBranchCommit(refName) + if err != nil { + log.Error("ReadLatestFileRepo error when GetBranchCommit,error=%v", err) + return nil, err + } + + blob, err := commit.GetBlobByPath(treePath) + if err != nil { + log.Error("ReadLatestFileRepo error when GetBlobByPath,error=%v", err) + return nil, err + } + + reader, err := blob.DataAsync() + if err != nil { + return nil, err + } + defer func() { + if err = reader.Close(); err != nil { + log.Error("ReadLatestFileRepo: Close: %v", err) + } + }() + + buf := make([]byte, 1024) + n, _ := reader.Read(buf) + if n >= 0 { + buf = buf[:n] + } + return &RepoFile{CommitId: commitID, Content: buf}, nil +} diff --git a/modules/context/context.go b/modules/context/context.go index 5f09e190d..6f184f7d1 100755 --- a/modules/context/context.go +++ b/modules/context/context.go @@ -6,6 +6,7 @@ package context import ( + "code.gitea.io/gitea/routers/notice" "html" "html/template" "io" @@ -345,6 +346,10 @@ func Contexter() macaron.Handler { ctx.Data["EnableSwagger"] = setting.API.EnableSwagger ctx.Data["EnableOpenIDSignIn"] = setting.Service.EnableOpenIDSignIn + notice, _ := notice.GetNewestNotice() + if notice != nil { + ctx.Data["notice"] = notice + } c.Map(ctx) } } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 2d70e47b1..a805e1f21 100755 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -436,6 +436,12 @@ var ( //home page RecommentRepoAddr string + //notice config + UserNameOfNoticeRepo string + RepoNameOfNoticeRepo string + RefNameOfNoticeRepo string + TreePathOfNoticeRepo string + //labelsystem config LabelTaskName string LabelDatasetDeleteQueue string @@ -1235,6 +1241,12 @@ func NewContext() { sec = Cfg.Section("homepage") RecommentRepoAddr = sec.Key("Address").MustString("https://git.openi.org.cn/OpenIOSSG/promote/raw/branch/master/") + sec = Cfg.Section("notice") + UserNameOfNoticeRepo = sec.Key("USER_NAME").MustString("OpenIOSSG") + RepoNameOfNoticeRepo = sec.Key("REPO_NAME").MustString("promote") + RefNameOfNoticeRepo = sec.Key("REF_NAME").MustString("master") + TreePathOfNoticeRepo = sec.Key("TREE_PATH").MustString("notice.json") + sec = Cfg.Section("cloudbrain") CBAuthUser = sec.Key("USER").MustString("") CBAuthPassword = sec.Key("PWD").MustString("") diff --git a/routers/notice/notice.go b/routers/notice/notice.go new file mode 100644 index 000000000..8fbbfe894 --- /dev/null +++ b/routers/notice/notice.go @@ -0,0 +1,38 @@ +package notice + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "encoding/json" +) + +const ( + NoticeInvisible int = iota + NoticeVisible +) + +type Notice struct { + Title string + Link string + Visible int + CommitId string +} + +func GetNewestNotice() (*Notice, error) { + //todo add local cache + defer func() { + if err := recover(); err != nil { + log.Error("recover error", err) + } + }() + repoFile, err := models.ReadLatestFileRepo(setting.UserNameOfNoticeRepo, setting.RepoNameOfNoticeRepo, setting.RefNameOfNoticeRepo, setting.TreePathOfNoticeRepo) + if err != nil { + log.Error("GetNewestNotice failed, error=%v", err) + return nil, err + } + notice := &Notice{} + json.Unmarshal(repoFile.Content, notice) + notice.CommitId = repoFile.CommitId + return notice, nil +} diff --git a/services/repository/repository.go b/services/repository/repository.go index f50b98b64..eafad988e 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -5,13 +5,12 @@ package repository import ( - "fmt" - "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/notification" repo_module "code.gitea.io/gitea/modules/repository" pull_service "code.gitea.io/gitea/services/pull" + "fmt" ) // CreateRepository creates a repository for the user/organization.