diff options
author | Arthur Zamarin <arthurzam@gentoo.org> | 2024-04-16 21:23:11 +0300 |
---|---|---|
committer | Arthur Zamarin <arthurzam@gentoo.org> | 2024-04-16 21:23:11 +0300 |
commit | ec86324dc50717473c2fdf299fe2b6db2e975c3c (patch) | |
tree | aea4489962866ad4b3713390472374ab12c66eab | |
parent | app/maintainer/stabilization: fix columns (diff) | |
download | soko-ec86324dc50717473c2fdf299fe2b6db2e975c3c.tar.gz soko-ec86324dc50717473c2fdf299fe2b6db2e975c3c.tar.bz2 soko-ec86324dc50717473c2fdf299fe2b6db2e975c3c.zip |
user perf: drop arches preferences
Signed-off-by: Arthur Zamarin <arthurzam@gentoo.org>
-rw-r--r-- | pkg/app/handler/arches/changedVersions.templ | 11 | ||||
-rw-r--r-- | pkg/app/handler/arches/index.go | 12 | ||||
-rw-r--r-- | pkg/app/handler/arches/show.go | 5 | ||||
-rw-r--r-- | pkg/app/handler/index/index.templ | 2 | ||||
-rw-r--r-- | pkg/app/handler/packages/changed_versions.templ | 12 | ||||
-rw-r--r-- | pkg/app/handler/packages/overview.templ | 4 | ||||
-rw-r--r-- | pkg/app/handler/user/arches.templ | 147 | ||||
-rw-r--r-- | pkg/app/handler/user/packages.templ | 8 | ||||
-rw-r--r-- | pkg/app/handler/user/preferences.templ | 7 | ||||
-rw-r--r-- | pkg/app/serve.go | 5 | ||||
-rw-r--r-- | pkg/app/utils/changedVersion.templ | 4 | ||||
-rw-r--r-- | pkg/app/utils/userdata.go | 8 | ||||
-rw-r--r-- | pkg/models/userpreferences.go | 48 |
13 files changed, 23 insertions, 250 deletions
diff --git a/pkg/app/handler/arches/changedVersions.templ b/pkg/app/handler/arches/changedVersions.templ index 1c7dc16..0ed5dfe 100644 --- a/pkg/app/handler/arches/changedVersions.templ +++ b/pkg/app/handler/arches/changedVersions.templ @@ -10,7 +10,7 @@ func activeClass(flag bool) string { return "nav-link" } -templ archesHeader(currentArch string, userPreferences models.ArchesPreferences) { +templ archesHeader(currentArch string) { <div class="kk-header-container"> <div class="container"> <div class="row"> @@ -29,10 +29,10 @@ templ archesHeader(currentArch string, userPreferences models.ArchesPreferences) <div class="col-md-7"></div> <div class="col-md-12 pt-4 mt-1"> <nav class="nav kk-package-nav"> - for _, arch := range userPreferences.Visible { + for _, arch := range models.ArchesToShow { <a class={ activeClass(arch == currentArch) } - href={ templ.URL("/arches/" + arch + "/" + userPreferences.DefaultPage) } + href={ templ.URL("/arches/" + arch + "/keyworded") } > { arch } </a> @@ -51,9 +51,8 @@ templ changedVersions( name string, feedName string, versions []*models.Version, - userPreferences models.ArchesPreferences, ) { - @archesHeader(currentArch, userPreferences) + @archesHeader(currentArch) <div class="tab-content" id="myTabContent"> <div class="container mb-5"> <div class="row"> @@ -77,7 +76,7 @@ templ changedVersions( </div> <div class="col-12"> <li class="list-group"> - @utils.ChangedVersionsTable(versions, userPreferences) + @utils.ChangedVersionsTable(versions) </li> </div> </div> diff --git a/pkg/app/handler/arches/index.go b/pkg/app/handler/arches/index.go deleted file mode 100644 index 052a9f5..0000000 --- a/pkg/app/handler/arches/index.go +++ /dev/null @@ -1,12 +0,0 @@ -package arches - -import ( - "net/http" - "soko/pkg/app/utils" -) - -// Index renders a template to show a the landing page containing links to all arches feeds -func Index(w http.ResponseWriter, r *http.Request) { - userPreferences := utils.GetUserPreferences(r) - http.Redirect(w, r, "/arches/"+userPreferences.Arches.DefaultArch+"/"+userPreferences.Arches.DefaultPage, http.StatusSeeOther) -} diff --git a/pkg/app/handler/arches/show.go b/pkg/app/handler/arches/show.go index 654034a..d202a9e 100644 --- a/pkg/app/handler/arches/show.go +++ b/pkg/app/handler/arches/show.go @@ -4,7 +4,6 @@ import ( "net/http" "soko/pkg/app/handler/feeds" "soko/pkg/app/layout" - "soko/pkg/app/utils" "strings" ) @@ -16,7 +15,7 @@ func ShowStable(w http.ResponseWriter, r *http.Request) { return } layout.Layout("Architectures", "arches", changedVersions( - arch, "Newly Stable", "stable", stabilizedVersions, utils.GetUserPreferences(r).Arches, + arch, "Newly Stable", "stable", stabilizedVersions, )).Render(r.Context(), w) } @@ -40,7 +39,7 @@ func ShowKeyworded(w http.ResponseWriter, r *http.Request) { return } layout.Layout("Architectures", "arches", changedVersions( - arch, "Keyworded", "keyworded", keywordedVersions, utils.GetUserPreferences(r).Arches, + arch, "Keyworded", "keyworded", keywordedVersions, )).Render(r.Context(), w) } diff --git a/pkg/app/handler/index/index.templ b/pkg/app/handler/index/index.templ index a80463e..c3ddab1 100644 --- a/pkg/app/handler/index/index.templ +++ b/pkg/app/handler/index/index.templ @@ -86,7 +86,7 @@ templ page(packageCount int, addedPackages []packageInfo, updatedVersions []*mod <a class="text-dark" href="/packages/updated">Updated Packages</a> </h3> <ul class="list-group"> - @utils.ChangedVersionsTable(updatedVersions, userPreferences.Arches) + @utils.ChangedVersionsTable(updatedVersions) </ul> </div> </div> diff --git a/pkg/app/handler/packages/changed_versions.templ b/pkg/app/handler/packages/changed_versions.templ index 70b5e68..3b268ad 100644 --- a/pkg/app/handler/packages/changed_versions.templ +++ b/pkg/app/handler/packages/changed_versions.templ @@ -6,7 +6,7 @@ import "net/http" import "soko/pkg/app/handler/categories" import "soko/pkg/app/handler/feeds" -templ changedVersionsPage(pageType string, versions []*models.Version, userPreferences models.ArchesPreferences) { +templ changedVersionsPage(pageType string, versions []*models.Version) { <div class="container mb-5"> <div class="row"> <div class="col-12"> @@ -21,7 +21,7 @@ templ changedVersionsPage(pageType string, versions []*models.Version, userPrefe </a> </h3> <li class="list-group rounded"> - @utils.ChangedVersionsTable(versions, userPreferences) + @utils.ChangedVersionsTable(versions) </li> </div> </div> @@ -31,7 +31,7 @@ templ changedVersionsPage(pageType string, versions []*models.Version, userPrefe // Added renders a template containing a list of 50 recently added versions. func Added(w http.ResponseWriter, r *http.Request) { addedVersions := GetAddedVersions(50) - categories.RenderPage(w, r, "Added Packages", "Added", changedVersionsPage("added", addedVersions, utils.GetUserPreferences(r).Arches)) + categories.RenderPage(w, r, "Added Packages", "Added", changedVersionsPage("added", addedVersions)) } func AddedFeed(w http.ResponseWriter, r *http.Request) { @@ -43,7 +43,7 @@ func AddedFeed(w http.ResponseWriter, r *http.Request) { // a list of 50 recently updated versions func Updated(w http.ResponseWriter, r *http.Request) { updatedVersions := GetUpdatedVersions(50) - categories.RenderPage(w, r, "Updated Packages", "Updated", changedVersionsPage("updated", updatedVersions, utils.GetUserPreferences(r).Arches)) + categories.RenderPage(w, r, "Updated Packages", "Updated", changedVersionsPage("updated", updatedVersions)) } func UpdatedFeed(w http.ResponseWriter, r *http.Request) { @@ -55,7 +55,7 @@ func UpdatedFeed(w http.ResponseWriter, r *http.Request) { // a list of 50 recently stabilized versions func Stabilized(w http.ResponseWriter, r *http.Request) { stabilizedVersions := GetStabilizedVersions(50) - categories.RenderPage(w, r, "Stabilized Packages", "Newly Stable", changedVersionsPage("stabilized", stabilizedVersions, utils.GetUserPreferences(r).Arches)) + categories.RenderPage(w, r, "Stabilized Packages", "Newly Stable", changedVersionsPage("stabilized", stabilizedVersions)) } func StabilizedFeed(w http.ResponseWriter, r *http.Request) { @@ -67,7 +67,7 @@ func StabilizedFeed(w http.ResponseWriter, r *http.Request) { // a list of 50 recently keyworded versions func Keyworded(w http.ResponseWriter, r *http.Request) { keywordedVersions := GetKeywordedVersions(50) - categories.RenderPage(w, r, "Keyworded Packages", "Keyworded", changedVersionsPage("keyworded", keywordedVersions, utils.GetUserPreferences(r).Arches)) + categories.RenderPage(w, r, "Keyworded Packages", "Keyworded", changedVersionsPage("keyworded", keywordedVersions)) } func KeywordedFeed(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/app/handler/packages/overview.templ b/pkg/app/handler/packages/overview.templ index 3027fbc..7bf34d2 100644 --- a/pkg/app/handler/packages/overview.templ +++ b/pkg/app/handler/packages/overview.templ @@ -43,7 +43,7 @@ templ overviewVersionRow(version *models.Version, userPreferences *models.UserPr { version.EAPI } </td> } - for _, arch := range userPreferences.Packages.Overview.Keywords { + for _, arch := range models.ArchesToShow { if keywords := strings.Fields(version.Keywords); slices.Contains(keywords, "~"+arch) { if len(version.Masks) > 0 { <td class="kk-keyword kk-keyword-masked" title={ version.Version + " is masked (testing) on " + arch }> @@ -114,7 +114,7 @@ templ overviewVersions(pkg *models.Package, userPreferences *models.UserPreferen if userPreferences.Packages.Overview.EAPI == "column" { <th class="kk-keyword-header kk-keyword border-left-0 border-top-0">EAPI</th> } - for _, arch := range userPreferences.Packages.Overview.Keywords { + for _, arch := range models.ArchesToShow { <th class="kk-keyword-header kk-keyword border-left-0 border-top-0">{ arch }</th> } </tr> diff --git a/pkg/app/handler/user/arches.templ b/pkg/app/handler/user/arches.templ deleted file mode 100644 index 5c11b32..0000000 --- a/pkg/app/handler/user/arches.templ +++ /dev/null @@ -1,147 +0,0 @@ -package user - -import "encoding/base64" -import "encoding/json" -import "net/http" -import "slices" -import "time" -import "soko/pkg/app/utils" -import "soko/pkg/models" - -func splitArches(selected []string) (firstColumn, secondColumn []string) { - allArches := models.GetAllKeywords() - remainingFirstColumn := len(allArches) - (len(allArches) / 2) - len(selected) - for _, arch := range allArches { - if !slices.Contains(selected, arch) { - if len(firstColumn) < remainingFirstColumn { - firstColumn = append(firstColumn, arch) - } else { - secondColumn = append(secondColumn, arch) - } - } - } - return -} - -templ archesTwoColumns(selected []string) { - if firstColumn, secondColumn := splitArches(selected); true { - <ul id="example1" class="list-group col-6"> - for _, arch := range selected { - <li class="list-group-item"> - <div class="form-check form-check-inline w-100"> - <input type="checkbox" id={ "visible-arches-" + arch } name="visible-arches" value={ arch } checked/> - <label class="form-check-label ml-1" for={ "visible-arches-" + arch }>{ arch }</label> <i class="fa fa-arrows ml-auto" aria-hidden="true"></i> - </div> - </li> - } - for _, arch := range firstColumn { - <li class="list-group-item"> - <div class="form-check form-check-inline w-100"> - <input type="checkbox" id={ "visible-arches-" + arch } name="visible-arches" value={ arch }/> - <label class="form-check-label ml-1" for={ "visible-arches-" + arch }>{ arch }</label> <i class="fa fa-arrows ml-auto" aria-hidden="true"></i> - </div> - </li> - } - </ul> - <ul id="example2" class="list-group col-6"> - for _, arch := range secondColumn { - <li class="list-group-item"> - <div class="form-check form-check-inline w-100"> - <input type="checkbox" id={ "visible-arches-" + arch } name="visible-arches" value={ arch }/> - <label class="form-check-label ml-1" for={ "visible-arches-" + arch }>{ arch }</label> <i class="fa fa-arrows ml-auto" aria-hidden="true"></i> - </div> - </li> - } - </ul> - } -} - -templ arches(preferences models.ArchesPreferences) { - <div class="row"> - <div class="col-2 mt-1"> - <div class="nav flex-column" role="tablist" aria-orientation="vertical" style="position: fixed;"> - <a class="nav-link user-pref-nav-link active" id="keywords-tab" href="#keywords" aria-controls="overview-settings">Keywords</a> - <a class="nav-link user-pref-nav-link" id="defaults-tab" href="#defaults">Defaults</a> - </div> - </div> - <div class="col-10 mt-1"> - <form method="post" action="/user/preferences/arches/visible"> - <h3 class="" id="keywords">Keywords</h3> - <hr class="mt-1"/> - <div class="row pl-3"> - @archesTwoColumns(preferences.Visible) - </div> - <h3 class="mt-5" id="defaults">Defaults</h3> - <hr class="mt-1"/> - <div class="card"> - <div class="card-body"> - <div class="row"> - <div class="col-6"> - Default arch - <select class="form-control" style="max-width: 200px;display: inline;" name="arches-default-arch" id="arches-default-arch"> - for _, arch := range models.GetAllKeywords() { - <option - value={ arch } - selected?={ preferences.DefaultArch == arch } - >{ arch }</option> - } - </select> - </div> - <div class="col-6"> - Default page - <select class="form-control" style="max-width: 150px;display: inline;" name="arches-default-page" id="arches-default-page"> - <option - value="keyworded" - selected?={ preferences.DefaultPage == "keyworded" } - >keyworded</option> - <option - value="stable" - selected?={ preferences.DefaultPage == "stable" } - >newly stable</option> - </select> - </div> - </div> - </div> - </div> - <div class="row"> - <div class="col-12 mt-4"> - <button type="submit" class="float-right btn btn-sm btn-primary">Save</button> - <a class="float-right btn btn-sm btn-outline-danger mr-2" href="/user/preferences/arches/reset">Reset to Defaults</a> - </div> - </div> - </form> - </div> - </div> - @sortableScript() -} - -func Arches(w http.ResponseWriter, r *http.Request) { - userPreferences := utils.GetUserPreferences(r) - r.ParseForm() - // visible arches - visibleArches := r.Form["visible-arches"] - userPreferences.Arches.Visible = visibleArches - // default arch - defaultArch := r.Form.Get("arches-default-arch") - userPreferences.Arches.DefaultArch = defaultArch - // default arches page - defaultPage := r.Form.Get("arches-default-page") - userPreferences.Arches.DefaultPage = defaultPage - // store cookie - encodedUserPreferences, err := json.Marshal(&userPreferences.Arches) - if err == nil { - sEnc := base64.StdEncoding.EncodeToString(encodedUserPreferences) - addCookie(w, "userpref_arches", "/", sEnc, 365*24*time.Hour) - } - http.Redirect(w, r, "/user/preferences/arches", http.StatusSeeOther) -} - -func ResetArches(w http.ResponseWriter, r *http.Request) { - userPreferences := utils.GetDefaultUserPreferences() - encodedUserPreferences, err := json.Marshal(&userPreferences.Arches) - if err == nil { - sEnc := base64.StdEncoding.EncodeToString(encodedUserPreferences) - addCookie(w, "userpref_arches", "/", sEnc, 365*24*time.Hour) - } - http.Redirect(w, r, "/user/preferences/arches", http.StatusSeeOther) -} diff --git a/pkg/app/handler/user/packages.templ b/pkg/app/handler/user/packages.templ index 30a5e43..0bf4cbd 100644 --- a/pkg/app/handler/user/packages.templ +++ b/pkg/app/handler/user/packages.templ @@ -51,10 +51,6 @@ templ packages(preferences models.PackagesPreferences) { </div> </div> </div> - <h4 class="mt-4 mb-1">Keywords</h4> - <div class="row pl-3"> - @archesTwoColumns(preferences.Overview.Keywords) - </div> <h4 class="mt-4 mb-1">EAPI version</h4> <div class="card"> <div class="card-body"> @@ -102,10 +98,6 @@ func EditPackagesPreferences(w http.ResponseWriter, r *http.Request) { userPreferences.Packages.Overview.Layout = overviewLayout } - // Overview: Keywords - overviewKeywords := r.Form["overview-keywords"] - userPreferences.Packages.Overview.Keywords = overviewKeywords - // EAPI showEAPI := r.Form.Get("overview-eapi") if showEAPI == "none" || showEAPI == "column" || showEAPI == "inline" { diff --git a/pkg/app/handler/user/preferences.templ b/pkg/app/handler/user/preferences.templ index b64dc19..b0277ce 100644 --- a/pkg/app/handler/user/preferences.templ +++ b/pkg/app/handler/user/preferences.templ @@ -28,11 +28,6 @@ var viewTabs = []layout.SubTab{ Link: "/user/preferences/useflags", Icon: "fa fa-sliders mr-1", }, - { - Name: "Architectures", - Link: "/user/preferences/arches", - Icon: "fa fa-server mr-1", - }, } templ show(currentSubTab string, preferences models.UserPreferences) { @@ -46,8 +41,6 @@ templ show(currentSubTab string, preferences models.UserPreferences) { @maintainers(preferences.Maintainers) case "USE flags": @useflags(preferences.Useflags) - case "Architectures": - @arches(preferences.Arches) } </div> <script src="/assets/userpref.js"></script> diff --git a/pkg/app/serve.go b/pkg/app/serve.go index 61eccb1..1f09b17 100644 --- a/pkg/app/serve.go +++ b/pkg/app/serve.go @@ -54,7 +54,7 @@ func Serve() { setRoute("GET /useflags", useflags.Default) setRoute("GET /useflags/{useflag}", useflags.Show) - setRoute("GET /arches", arches.Index) + redirect("GET /arches", "/arches/amd64/keyworded") setRoute("GET /arches/{arch}/stable", arches.ShowStable) setRoute("GET /arches/{arch}/stable.atom", arches.ShowStableFeed) setRoute("GET /arches/{arch}/keyworded", arches.ShowKeyworded) @@ -116,9 +116,6 @@ func Serve() { setRoute("/user/preferences/general/layout", user.General) setRoute("/user/preferences/general/reset", user.ResetGeneral) - setRoute("/user/preferences/arches/visible", user.Arches) - setRoute("/user/preferences/arches/reset", user.ResetArches) - setRoute("/user/preferences/packages/edit", user.EditPackagesPreferences) setRoute("/user/preferences/packages/reset", user.ResetPackages) diff --git a/pkg/app/utils/changedVersion.templ b/pkg/app/utils/changedVersion.templ index 8ae4adb..b23269d 100644 --- a/pkg/app/utils/changedVersion.templ +++ b/pkg/app/utils/changedVersion.templ @@ -5,7 +5,7 @@ import "soko/pkg/models" import "strings" import "time" -templ ChangedVersionsTable(versions []*models.Version, userPreferences models.ArchesPreferences) { +templ ChangedVersionsTable(versions []*models.Version) { for _, version := range versions { <li class="list-group-item kk-package-detailed"> <div class="row"> @@ -106,7 +106,7 @@ templ ChangedVersionsTable(versions []*models.Version, userPreferences models.Ar } </p> <p> - for _, arch := range userPreferences.Visible { + for _, arch := range models.ArchesToShow { if slices.Contains(strings.Fields(version.Keywords), arch) { <span style="margin-right: 4px;" class="label kk-keyword-stable" title={ version.Version + " is stable on " + arch }> { arch } diff --git a/pkg/app/utils/userdata.go b/pkg/app/utils/userdata.go index baaba7f..acff520 100644 --- a/pkg/app/utils/userdata.go +++ b/pkg/app/utils/userdata.go @@ -46,13 +46,7 @@ func GetUserPreferences(r *http.Request) models.UserPreferences { } } - cookie, err = r.Cookie("userpref_arches") - if err == nil { - cookieValue, err := b64.StdEncoding.DecodeString(cookie.Value) - if err == nil { - json.Unmarshal(cookieValue, &userPreferences.Arches) - } - } + // old cookie: userpref_arches userPreferences.Sanitize() diff --git a/pkg/models/userpreferences.go b/pkg/models/userpreferences.go index 3535abb..93311d3 100644 --- a/pkg/models/userpreferences.go +++ b/pkg/models/userpreferences.go @@ -2,14 +2,11 @@ package models -import "strings" - type UserPreferences struct { General GeneralPreferences Packages PackagesPreferences Maintainers MaintainersPreferences Useflags UseflagsPreferences - Arches ArchesPreferences } type GeneralPreferences struct { @@ -21,9 +18,8 @@ type PackagesPreferences struct { } type PackagesOverviewPreferences struct { - Layout string - Keywords []string - EAPI string + Layout string + EAPI string } type MaintainersPreferences struct { @@ -35,11 +31,7 @@ type UseflagsPreferences struct { Layout string } -type ArchesPreferences struct { - Visible []string - DefaultArch string - DefaultPage string -} +var ArchesToShow = [...]string{"amd64", "x86", "alpha", "arm", "arm64", "hppa", "ia64", "ppc", "ppc64", "riscv", "sparc"} func GetDefaultUserPreferences() UserPreferences { userPreferences := UserPreferences{} @@ -48,18 +40,12 @@ func GetDefaultUserPreferences() UserPreferences { userPreferences.Packages.Overview = PackagesOverviewPreferences{} userPreferences.Maintainers = MaintainersPreferences{} userPreferences.Useflags = UseflagsPreferences{} - userPreferences.Arches = ArchesPreferences{} userPreferences.General.LandingPageLayout = "classic" userPreferences.Packages.Overview.Layout = "minimal" - userPreferences.Packages.Overview.Keywords = []string{"amd64", "x86", "alpha", "arm", "arm64", "hppa", "ia64", "ppc", "ppc64", "riscv", "sparc"} userPreferences.Packages.Overview.EAPI = "none" - userPreferences.Arches.Visible = []string{"amd64", "x86", "alpha", "arm", "arm64", "hppa", "ia64", "ppc", "ppc64", "riscv", "sparc"} - userPreferences.Arches.DefaultArch = "amd64" - userPreferences.Arches.DefaultPage = "keyworded" - userPreferences.Useflags.Layout = "bubble" userPreferences.Maintainers.IncludeProjectPackages = false @@ -79,39 +65,11 @@ func (u *UserPreferences) Sanitize() { u.Packages.Overview.Layout = defaultUserPreferences.Packages.Overview.Layout } - sanitizedKeywords := []string{} - for _, keyword := range u.Packages.Overview.Keywords { - if strings.Contains(strings.Join(GetAllKeywords(), ","), keyword) { - sanitizedKeywords = append(sanitizedKeywords, keyword) - } - } - u.Packages.Overview.Keywords = sanitizedKeywords - if !(u.Packages.Overview.EAPI == "none" || u.Packages.Overview.EAPI == "column" || u.Packages.Overview.EAPI == "inline") { u.Packages.Overview.EAPI = defaultUserPreferences.Packages.Overview.EAPI } - sanitizedVisibleArches := []string{} - for _, keyword := range u.Arches.Visible { - if strings.Contains(strings.Join(GetAllKeywords(), ","), keyword) { - sanitizedVisibleArches = append(sanitizedVisibleArches, keyword) - } - } - u.Arches.Visible = sanitizedVisibleArches - - if !strings.Contains(strings.Join(GetAllKeywords(), ","), u.Arches.DefaultArch) { - u.Arches.DefaultArch = defaultUserPreferences.Arches.DefaultArch - } - - if !(u.Arches.DefaultPage == "keyworded" || u.Arches.DefaultPage == "stable") { - u.Arches.DefaultPage = defaultUserPreferences.Arches.DefaultPage - } - if !(u.Useflags.Layout == "bubble" || u.Useflags.Layout == "search") { u.Useflags.Layout = defaultUserPreferences.Useflags.Layout } } - -func GetAllKeywords() []string { - return []string{"alpha", "amd64", "arm", "arm64", "hppa", "ia64", "loong", "m68k", "mips", "ppc", "ppc64", "riscv", "s390", "sparc", "x86", "amd64-linux", "arm-linux", "arm64-linux", "ppc64-linux", "x86-linux", "ppc-macos", "x64-macos", "sparc-solaris", "sparc64-solaris", "x64-solaris", "x86-solaris", "x64-winnt", "x86-winnt", "x64-cygwin"} -} |