diff --git a/example.toml b/example.toml new file mode 100644 index 0000000..828b1e7 --- /dev/null +++ b/example.toml @@ -0,0 +1,11 @@ +name="Doesnm Repo" +description="Repository for testing fdroidgo" +address="http://localhost:8000" +icon="icon.png" +keystore_path="keystore.p12" +keystore_password="" +keystore_alias="" +binarySources = [ +"github.com/owner/repo" # Currently only github are supported +] +github_token="" # Recommended because github ratelimits diff --git a/main.go b/main.go index 4830cab..875ca94 100644 --- a/main.go +++ b/main.go @@ -22,6 +22,7 @@ import ( "path/filepath" "net/url" "path" + "flag" ) type Repo struct { @@ -78,6 +79,7 @@ type Config struct { KeyStorePassword string `toml:"keystore_password"` KeyStoreAlias string `toml:"keystore_alias"` BinarySources []string `toml:"binarySources"` + GithubToken string `toml:"github_token"` } type User struct { @@ -253,6 +255,12 @@ func processAPK(filePath string,indexCache Index) Package { for _, pkg := range pkgs { if pkg.ApkName == filePath { log.Printf("Warning: using %s metadata from cache",filePath) + for _, app := range indexCache.Apps { + if app.PackageName == pkg.PackageName { + pkg.ApplicationName = app.Name + break + } + } return pkg } } @@ -426,12 +434,20 @@ packages = append(packages,packageInfo) return packages } -func getReleases(repo string) ([]Release, error) { +func getReleases(repo string,config Config) ([]Release, error) { url := fmt.Sprintf("https://api.github.com/repos/%s/releases", repo) - resp, err := http.Get(url) + req, err := http.NewRequest("GET",url,nil) if err != nil { return nil, err } + if config.GithubToken != "" { +req.Header.Set("Authorization", "token "+config.GithubToken) + } + client := http.Client{} + resp,err := client.Do(req) + if err != nil { + return nil,err + } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { @@ -450,10 +466,18 @@ func getReleases(repo string) ([]Release, error) { } -func getRepositoryInfo(repo string) (Repository, error) { +func getRepositoryInfo(repo string,config Config) (Repository, error) { fmt.Println("Fetching repository info") url := fmt.Sprintf("https://api.github.com/repos/%s", repo) - resp, err := http.Get(url) + req, err := http.NewRequest("GET",url,nil) +if err != nil { + return Repository{}, err + } + if config.GithubToken != "" { +req.Header.Set("Authorization", "token "+config.GithubToken) + } + client := &http.Client{} + resp,err := client.Do(req) if err != nil { return Repository{}, err } @@ -521,9 +545,9 @@ func signJarWithJarsigner(jarFile string, keystore string, password string, alia return err, string(output) // Возвращаем ошибку и вывод как строку } -func createAppFromReleases(releases []Release, repo string, index int,indexCache Index) (App, []Package,error) { +func createAppFromReleases(releases []Release, repo string, index int,indexCache Index,config Config) (App, []Package,error) { // Получаем информацию о репозитории - repository, err := getRepositoryInfo(repo) + repository, err := getRepositoryInfo(repo,config) if err != nil { return App{}, []Package{}, err } @@ -535,8 +559,14 @@ func createAppFromReleases(releases []Release, repo string, index int,indexCache release := releases[index] packages := handleRelease(release,indexCache) if len(packages) == 0 { - return createAppFromReleases(releases,repo,index+1,indexCache) + return createAppFromReleases(releases,repo,index+1,indexCache,config) //return App{}, []Package{}, nil + } + //fmt.Printf("Debug: ",repository.License) + if repository.License == nil { + repository.License = &License { + SPDXID: "", + } } app := App{ AuthorName: release.Author.Login, @@ -567,7 +597,12 @@ func main() { var packages map[string][]Package packages = make(map[string][]Package) var config Config - file, err := os.Open("config.toml") + +configPath := flag.String("config", "config.toml", "Path to the configuration file") + + // Parse the command-line flags + flag.Parse() + file, err := os.Open(*configPath) fileJson,errJson := os.Open("index-v1.json") if err != nil { log.Fatal(err) @@ -597,7 +632,7 @@ for _, source := range config.BinarySources { // Получаем релизы для репозитория fmt.Println("Fetching releases") - releases, err := getReleases(repo) + releases, err := getReleases(repo,config) if err != nil { fmt.Printf("Error fetching releases for %s: %v\n", repo, err) os.Exit(1) @@ -608,7 +643,7 @@ for _, source := range config.BinarySources { var app App fmt.Println("Creating app object from repository info and apk") - app,app_packages, err := createAppFromReleases(releases,repo,0,indexCache) + app,app_packages, err := createAppFromReleases(releases,repo,0,indexCache,config) if err != nil { log.Fatal("Failed to create app from releases: ",err) }