|
@@ -5,24 +5,24 @@
|
|
|
package repo
|
|
|
|
|
|
import (
|
|
|
+ "bufio"
|
|
|
"bytes"
|
|
|
+ "crypto/md5"
|
|
|
+ "encoding/hex"
|
|
|
+ "encoding/json"
|
|
|
+ "encoding/xml"
|
|
|
"fmt"
|
|
|
gotemplate "html/template"
|
|
|
+ "io"
|
|
|
"io/ioutil"
|
|
|
+ "net/http"
|
|
|
+ "os"
|
|
|
"path"
|
|
|
"strings"
|
|
|
|
|
|
- "github.com/Unknwon/paginater"
|
|
|
- log "gopkg.in/clog.v1"
|
|
|
-
|
|
|
"github.com/G-Node/git-module"
|
|
|
-
|
|
|
- "bufio"
|
|
|
- "io"
|
|
|
- "os"
|
|
|
-
|
|
|
- "github.com/G-Node/gin-doi/src"
|
|
|
"github.com/G-Node/go-annex"
|
|
|
+ "github.com/G-Node/godML/odml"
|
|
|
"github.com/G-Node/gogs/models"
|
|
|
"github.com/G-Node/gogs/pkg/context"
|
|
|
"github.com/G-Node/gogs/pkg/markup"
|
|
@@ -30,12 +30,11 @@ import (
|
|
|
"github.com/G-Node/gogs/pkg/template"
|
|
|
"github.com/G-Node/gogs/pkg/template/highlight"
|
|
|
"github.com/G-Node/gogs/pkg/tool"
|
|
|
+ "github.com/Unknwon/paginater"
|
|
|
"github.com/go-macaron/captcha"
|
|
|
- "gopkg.in/yaml.v2"
|
|
|
- "github.com/G-Node/godML/odml"
|
|
|
- "encoding/json"
|
|
|
- "encoding/xml"
|
|
|
"golang.org/x/net/html/charset"
|
|
|
+ log "gopkg.in/clog.v1"
|
|
|
+ "gopkg.in/yaml.v2"
|
|
|
)
|
|
|
|
|
|
const (
|
|
@@ -82,7 +81,7 @@ func renderDirectory(c *context.Context, treeLink string) {
|
|
|
log.Trace("Doi Blob could not be read:%v", err)
|
|
|
}
|
|
|
buf, err := ioutil.ReadAll(doiData)
|
|
|
- doiInfo := ginDoi.CBerry{}
|
|
|
+ doiInfo := DOIRegInfo{}
|
|
|
err = yaml.Unmarshal(buf, &doiInfo)
|
|
|
if err != nil {
|
|
|
log.Trace("Doi Blob could not be unmarshalled:%v", err)
|
|
@@ -92,7 +91,7 @@ func renderDirectory(c *context.Context, treeLink string) {
|
|
|
doi := GDoiRepo(c, setting.Doi.DoiBase)
|
|
|
//ddata, err := ginDoi.GDoiMData(doi, "https://api.datacite.org/works/") //todo configure URL?
|
|
|
|
|
|
- c.Data["DoiReg"] = ginDoi.IsRegsitredDoi(doi)
|
|
|
+ c.Data["DoiReg"] = IsRegisteredDOI(doi)
|
|
|
c.Data["doi"] = doi
|
|
|
|
|
|
}
|
|
@@ -511,11 +510,80 @@ func Forks(c *context.Context) {
|
|
|
|
|
|
// Get the (theoretical ) doi for a repository. Make sure its tge doi for the Base repo
|
|
|
// in cas eits a repo from the doi user
|
|
|
-func GDoiRepo(c *context.Context, doiBAse string) string {
|
|
|
+func GDoiRepo(c *context.Context, doiBase string) string {
|
|
|
repoN := c.Repo.Repository.FullName()
|
|
|
// check whether this repo belongs to doi and is a fork
|
|
|
if c.Repo.Repository.IsFork && c.Repo.Owner.Name == "doi" {
|
|
|
repoN = c.Repo.Repository.BaseRepo.FullName()
|
|
|
}
|
|
|
- return ginDoi.MakeDoi(ginDoi.RepoP2UUID(repoN), doiBAse)
|
|
|
+ uuid := repoPathToUUID(repoN)
|
|
|
+ return doiBase + uuid[:6]
|
|
|
+}
|
|
|
+
|
|
|
+// NOTE: TEMPORARY COPIES FROM gin-doi
|
|
|
+
|
|
|
+// uuidMap is a map between registered repositories and their UUIDs for datasets registered before the new UUID generation method was implemented.
|
|
|
+// This map is required because the current method of computing UUIDs differs from the older method and this lookup is used to handle the old-method UUIDs.
|
|
|
+var uuidMap = map[string]string{
|
|
|
+ "INT/multielectrode_grasp": "f83565d148510fede8a277f660e1a419",
|
|
|
+ "ajkumaraswamy/HB-PAC_disinhibitory_network": "1090f803258557299d287c4d44a541b2",
|
|
|
+ "steffi/Kleineidam_et_al_2017": "f53069de4c4921a3cfa8f17d55ef98bb",
|
|
|
+ "Churan/Morris_et_al_Frontiers_2016": "97bc1456d3f4bca2d945357b3ec92029",
|
|
|
+ "fabee/efish_locking": "6953bbf0087ba444b2d549b759de4a06",
|
|
|
+}
|
|
|
+
|
|
|
+// repoPathToUUID computes a UUID from a repository path.
|
|
|
+func repoPathToUUID(URI string) string {
|
|
|
+ if doi, ok := uuidMap[URI]; ok {
|
|
|
+ return doi
|
|
|
+ }
|
|
|
+ currMd5 := md5.Sum([]byte(URI))
|
|
|
+ return hex.EncodeToString(currMd5[:])
|
|
|
+}
|
|
|
+
|
|
|
+// DOIRegInfo holds all the metadata and information necessary for a DOI registration request.
|
|
|
+type DOIRegInfo struct {
|
|
|
+ Missing []string
|
|
|
+ DOI string
|
|
|
+ UUID string
|
|
|
+ FileSize int64
|
|
|
+ Title string
|
|
|
+ Authors []Author
|
|
|
+ Description string
|
|
|
+ Keywords []string
|
|
|
+ References []Reference
|
|
|
+ Funding []string
|
|
|
+ License *License
|
|
|
+ DType string
|
|
|
+}
|
|
|
+
|
|
|
+type Author struct {
|
|
|
+ FirstName string
|
|
|
+ LastName string
|
|
|
+ Affiliation string
|
|
|
+ ID string
|
|
|
+}
|
|
|
+
|
|
|
+type Reference struct {
|
|
|
+ Reftype string
|
|
|
+ Name string
|
|
|
+ DOI string
|
|
|
+}
|
|
|
+
|
|
|
+type License struct {
|
|
|
+ Name string
|
|
|
+ URL string
|
|
|
+}
|
|
|
+
|
|
|
+func IsRegisteredDOI(doi string) bool {
|
|
|
+ url := fmt.Sprintf("https://doi.org/%s", doi)
|
|
|
+ resp, err := http.Get(url)
|
|
|
+ if err != nil {
|
|
|
+ log.Trace("Could not query for doi: %s at %s", doi, url)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ if resp.StatusCode != http.StatusNotFound {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ return false
|
|
|
}
|