Bladeren bron

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 jaren geleden
bovenliggende
commit
dbf97a518d
4 gewijzigde bestanden met toevoegingen van 61 en 49 verwijderingen
  1. 44 1
      internal/context/context_gin.go
  2. 5 1
      internal/context/repo.go
  3. 11 44
      internal/route/repo/repo_gin.go
  4. 1 3
      internal/route/repo/view.go

+ 44 - 1
internal/context/context_gin.go

@@ -101,8 +101,51 @@ func getRepoDOI(c *Context) string {
 func hasDataCite(c *Context) bool {
 	commit, err := c.Repo.GitRepo.GetBranchCommit(c.Repo.Repository.DefaultBranch)
 	if err != nil {
+		log.Trace("Couldn't get commit: %v", err)
 		return false
 	}
-	_, err = commit.GetBlobByPath("./datacite.yml")
+	_, err = commit.GetBlobByPath("/datacite.yml")
+
+	log.Trace("Found datacite? %t", 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["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) {
 			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
 }
 
-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()
 	if err != nil {
 		log.Error(2, "datacite.yml blob could not be read: %v", err)
+		c.Data["HasDataCite"] = false
 		return
 	}
 	buf, err := ioutil.ReadAll(doiData)
 	if err != nil {
 		log.Error(2, "datacite.yml data could not be read: %v", err)
+		c.Data["HasDataCite"] = false
 		return
 	}
 	doiInfo := libgin.DOIRegInfo{}
 	err = yaml.Unmarshal(buf, &doiInfo)
 	if err != nil {
 		log.Error(2, "datacite.yml data could not be unmarshalled: %v", err)
+		c.Data["HasDataCite"] = false
 		return
 	}
 	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

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

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