Переглянути джерело

Move all DOI discovery logic to contexter

With all the DOI related logic in the contexter, we can always display
the correct badges in the header, regardless of which page of the
repository we are on (file view, subdirectory listing, wiki, issues,
etc).
Achilleas Koutsou 5 роки тому
батько
коміт
dbf97a518d

+ 44 - 1
internal/context/context_gin.go

@@ -101,8 +101,51 @@ func getRepoDOI(c *Context) string {
 func hasDataCite(c *Context) bool {
 func hasDataCite(c *Context) bool {
 	commit, err := c.Repo.GitRepo.GetBranchCommit(c.Repo.Repository.DefaultBranch)
 	commit, err := c.Repo.GitRepo.GetBranchCommit(c.Repo.Repository.DefaultBranch)
 	if err != nil {
 	if err != nil {
+		log.Trace("Couldn't get commit: %v", err)
 		return false
 		return false
 	}
 	}
-	_, err = commit.GetBlobByPath("./datacite.yml")
+	_, err = commit.GetBlobByPath("/datacite.yml")
+
+	log.Trace("Found datacite? %t", err == nil)
 	return err == nil
 	return err == nil
 }
 }
+
+// True if repository is not Private, is not registered, or is registered and
+// has changes (HEAD is not registered)
+func isDOIReady(c *Context) bool {
+	if hasDC, ok := c.Data["HasDataCite"]; !ok || !hasDC.(bool) {
+		return false
+	}
+	dbrepo := c.Repo.Repository
+	gitrepo := c.Repo.GitRepo
+
+	headIsRegistered := func() bool {
+		currentDOI, ok := c.Data["DOI"]
+		if !ok {
+			return false
+		}
+
+		headBranch, err := gitrepo.GetHEADBranch()
+		if err != nil {
+			log.Error(2, "Failed to get HEAD branch for repo at %q: %v", gitrepo.Path, err)
+			return false
+		}
+
+		headCommit, err := gitrepo.GetBranchCommitID(headBranch.Name)
+		if err != nil {
+			log.Error(2, "Failed to get commit ID of branch %q for repo at %q: %v", headBranch.Name, gitrepo.Path, err)
+		}
+
+		// if current valid and registered DOI matches the HEAD commit, can't
+		// register again
+		doiCommit, err := gitrepo.GetTagCommitID(currentDOI.(string))
+		if err != nil {
+			log.Error(2, "Failed to get commit ID of tag %q for repo at %q: %v", currentDOI, gitrepo.Path, err)
+		}
+
+		log.Trace("%s ?= %s", headCommit, doiCommit)
+		return headCommit == doiCommit
+	}()
+
+	return !dbrepo.IsPrivate && !headIsRegistered
+}

+ 5 - 1
internal/context/repo.go

@@ -270,7 +270,11 @@ func RepoAssignment(pages ...bool) macaron.Handler {
 
 
 		c.Data["IsGuest"] = !c.Repo.HasAccess()
 		c.Data["IsGuest"] = !c.Repo.HasAccess()
 
 
-		c.Data["HasDataCite"] = hasDataCite(c)
+		hasDC := hasDataCite(c)
+		c.Data["HasDataCite"] = hasDC
+		if hasDC {
+			c.Data["IsDOIReady"] = isDOIReady(c)
+		}
 
 
 		if doi := getRepoDOI(c); doi != "" && libgin.IsRegisteredDOI(doi) {
 		if doi := getRepoDOI(c); doi != "" && libgin.IsRegisteredDOI(doi) {
 			c.Data["DOI"] = doi
 			c.Data["DOI"] = doi

+ 11 - 44
internal/route/repo/repo_gin.go

@@ -73,67 +73,34 @@ func serveAnnexedKey(ctx *context.Context, name string, contentPath string) erro
 	return err
 	return err
 }
 }
 
 
-func readDataciteFile(entry *git.Blob, c *context.Context) {
-	log.Trace("Found datacite.yml file")
-	c.Data["HasDataCite"] = true
+func readDataciteFile(c *context.Context) {
+	log.Trace("Reading datacite.yml file")
+	entry, err := c.Repo.Commit.GetBlobByPath("/datacite.yml")
+	if err != nil || entry == nil {
+		log.Error(2, "datacite.yml blob could not be retrieved: %v", err)
+		c.Data["HasDataCite"] = false
+		return
+	}
 	doiData, err := entry.Data()
 	doiData, err := entry.Data()
 	if err != nil {
 	if err != nil {
 		log.Error(2, "datacite.yml blob could not be read: %v", err)
 		log.Error(2, "datacite.yml blob could not be read: %v", err)
+		c.Data["HasDataCite"] = false
 		return
 		return
 	}
 	}
 	buf, err := ioutil.ReadAll(doiData)
 	buf, err := ioutil.ReadAll(doiData)
 	if err != nil {
 	if err != nil {
 		log.Error(2, "datacite.yml data could not be read: %v", err)
 		log.Error(2, "datacite.yml data could not be read: %v", err)
+		c.Data["HasDataCite"] = false
 		return
 		return
 	}
 	}
 	doiInfo := libgin.DOIRegInfo{}
 	doiInfo := libgin.DOIRegInfo{}
 	err = yaml.Unmarshal(buf, &doiInfo)
 	err = yaml.Unmarshal(buf, &doiInfo)
 	if err != nil {
 	if err != nil {
 		log.Error(2, "datacite.yml data could not be unmarshalled: %v", err)
 		log.Error(2, "datacite.yml data could not be unmarshalled: %v", err)
+		c.Data["HasDataCite"] = false
 		return
 		return
 	}
 	}
 	c.Data["DOIInfo"] = &doiInfo
 	c.Data["DOIInfo"] = &doiInfo
-	c.Data["IsDOIReady"] = isDOIReady(c)
-}
-
-// True if repository is not Private, is not registered, or is registered and
-// has changes.
-func isDOIReady(c *context.Context) bool {
-	if hasDC, ok := c.Data["HasDataCite"]; !ok || !hasDC.(bool) {
-		return false
-	}
-	dbrepo := c.Repo.Repository
-	gitrepo := c.Repo.GitRepo
-
-	headIsRegistered := func() bool {
-		currentDOI, ok := c.Data["DOI"]
-		if !ok {
-			return false
-		}
-
-		headBranch, err := gitrepo.GetHEADBranch()
-		if err != nil {
-			log.Error(2, "Failed to get HEAD branch for repo at %q: %v", gitrepo.Path, err)
-			return false
-		}
-
-		headCommit, err := gitrepo.GetBranchCommitID(headBranch.Name)
-		if err != nil {
-			log.Error(2, "Failed to get commit ID of branch %q for repo at %q: %v", headBranch.Name, gitrepo.Path, err)
-		}
-
-		// if current valid and registered DOI matches the HEAD commit, can't
-		// register again
-		doiCommit, err := gitrepo.GetTagCommitID(currentDOI.(string))
-		if err != nil {
-			log.Error(2, "Failed to get commit ID of tag %q for repo at %q: %v", currentDOI, gitrepo.Path, err)
-		}
-
-		log.Trace("%s ?= %s", headCommit, doiCommit)
-		return headCommit == doiCommit
-	}()
-
-	return !dbrepo.IsPrivate && !headIsRegistered
 }
 }
 
 
 // resolveAnnexedContent takes a buffer with the contents of a git-annex
 // resolveAnnexedContent takes a buffer with the contents of a git-annex

+ 1 - 3
internal/route/repo/view.go

@@ -55,9 +55,7 @@ func renderDirectory(c *context.Context, treeLink string) {
 		return
 		return
 	}
 	}
 	if c.Data["HasDataCite"].(bool) {
 	if c.Data["HasDataCite"].(bool) {
-		if entry, err := tree.GetBlobByPath("datacite.yml"); err != nil {
-			readDataciteFile(entry, c)
-		}
+		readDataciteFile(c)
 	}
 	}
 	var readmeFile *git.Blob
 	var readmeFile *git.Blob
 	for _, entry := range entries {
 	for _, entry := range entries {