Skip to content

Commit 5a7f1a4

Browse files
committed
initial commit
0 parents  commit 5a7f1a4

15 files changed

+704
-0
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
config.json
2+
local-store
3+
debug

.vscode/launch.json

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"version": "0.2.0",
3+
"configurations": [
4+
{
5+
"name": "Launch",
6+
"type": "go",
7+
"request": "launch",
8+
"mode": "debug",
9+
"remotePath": "",
10+
"port": 2345,
11+
"host": "127.0.0.1",
12+
"program": "${workspaceRoot}",
13+
"env": {},
14+
"args": [],
15+
"showLog": true
16+
}
17+
]
18+
}

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# dollop
2+
3+
Coming soon...

config.example.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Repositories": {
3+
"test": {
4+
"Metadata": {
5+
"Path": "local-store/metadata-test.json"
6+
},
7+
"Storage": {
8+
"Path": "local-store/storage-test"
9+
}
10+
}
11+
}
12+
}

documentation/DESIGN.md

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Design
2+
3+
## Exposures
4+
5+
For most average users, the only thing that is relevant is the "exposures" that
6+
Sage provides. It looks up metadata and returns packages from storage. Currently,
7+
Sage only supports a Maven exposure.
8+
9+
## Package storage
10+
11+
Backing all exposures is a generic storage backend that allows package information
12+
to be retrieved on demand.
13+
14+
Sage decouples metadata from package content to allow flexibility in how you can
15+
serve your packages. For instance, you might look up metadata in MySQL but serve
16+
packages over Amazon S3.

main.go

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"net/http"
6+
7+
"github.com/minecrafter/sage/repository/maven"
8+
"github.com/minecrafter/sage/repository/store"
9+
"github.com/minecrafter/sage/server"
10+
)
11+
12+
func main() {
13+
conf, err := server.LoadConfig("config.json")
14+
if err != nil {
15+
log.Fatalln(err)
16+
}
17+
18+
configuredRepositories := make(map[string]maven.MavenRetrieveHandler)
19+
for key, value := range conf.Repositories {
20+
configuredRepositories[key] = maven.NewMavenRetrieveHandler("/"+key,
21+
store.NewLocalMetadataStore(value.Metadata.Path),
22+
store.NewLocalPackageStore(value.Storage.Path))
23+
}
24+
25+
if err := http.ListenAndServe(":8196", server.RepoHTTPHandler{
26+
Repositories: configuredRepositories,
27+
}); err != nil {
28+
log.Fatalln(err)
29+
}
30+
}

repository/maven/definitions.go

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package maven
2+
3+
import (
4+
"encoding/xml"
5+
)
6+
7+
// Represents a maven-metadata.xml file.
8+
type MavenMetadata struct {
9+
XMLName xml.Name `xml:"metadata"`
10+
GroupID string `xml:"groupId"`
11+
ArtifactID string `xml:"artifactId"`
12+
Versioning MavenMetadataVersioning `xml:"versioning"`
13+
}
14+
15+
type MavenMetadataVersioning struct {
16+
Latest string `xml:"latest"`
17+
Release string `xml:"release"`
18+
Versions MavenMetadataVersions `xml:"versions"`
19+
LastUpdated string `xml:"lastUpdated"`
20+
}
21+
22+
type MavenMetadataVersions struct {
23+
Version []string `xml:"version"`
24+
}

repository/maven/metadata.go

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package maven
2+
3+
import (
4+
"sort"
5+
6+
"github.com/minecrafter/sage/repository"
7+
)
8+
9+
const (
10+
mavenDateFormat = "20060102150405"
11+
)
12+
13+
// CreateMavenMetadata converts a Sage PackageMetadata into a maven-metadata.xml file.
14+
func CreateMavenMetadata(metadata repository.PackageMetadata) MavenMetadata {
15+
m := MavenMetadata{
16+
GroupID: metadata.MavenData.GroupID,
17+
ArtifactID: metadata.MavenData.ArtifactID,
18+
}
19+
20+
// Copy and sort versions. While we could have sorted versions beforehand, we would only gain mimimal beenfits.
21+
versions := make([]repository.PackageVersionMetadata, len(metadata.Versions))
22+
copy(versions, metadata.Versions)
23+
sort.Sort(repository.PackageVersionCollection(versions))
24+
25+
sortedVersions := make([]string, len(metadata.Versions))
26+
for i, version := range versions {
27+
sortedVersions[i] = version.Version
28+
}
29+
m.Versioning = MavenMetadataVersioning{
30+
Latest: sortedVersions[len(sortedVersions)-1],
31+
Versions: MavenMetadataVersions{sortedVersions},
32+
LastUpdated: versions[len(versions)-1].Created.Format(mavenDateFormat),
33+
}
34+
return m
35+
}

0 commit comments

Comments
 (0)