Merge pull request #418 from ywk253100/dev

fix #412
This commit is contained in:
Wenkai Yin 2016-06-27 14:56:10 +08:00 committed by GitHub
commit 6f7d383509
8 changed files with 46 additions and 65 deletions

View File

@ -68,7 +68,7 @@ func (s *SearchAPI) Get() {
} }
} }
projectSorter := &utils.ProjectSorter{Projects: projects} projectSorter := &models.ProjectSorter{Projects: projects}
sort.Sort(projectSorter) sort.Sort(projectSorter)
projectResult := []map[string]interface{}{} projectResult := []map[string]interface{}{}
for _, p := range projects { for _, p := range projects {

View File

@ -37,3 +37,23 @@ type Project struct {
Role int `json:"current_user_role_id"` Role int `json:"current_user_role_id"`
RepoCount int `json:"repo_count"` RepoCount int `json:"repo_count"`
} }
// ProjectSorter holds an array of projects
type ProjectSorter struct {
Projects []Project
}
// Len returns the length of array in ProjectSorter
func (ps *ProjectSorter) Len() int {
return len(ps.Projects)
}
// Less defines the comparison rules of project
func (ps *ProjectSorter) Less(i, j int) bool {
return ps.Projects[i].Name < ps.Projects[j].Name
}
// Swap swaps the position of i and j
func (ps *ProjectSorter) Swap(i, j int) {
ps.Projects[i], ps.Projects[j] = ps.Projects[j], ps.Projects[i]
}

View File

@ -19,6 +19,7 @@ import (
"time" "time"
"github.com/astaxie/beego/validation" "github.com/astaxie/beego/validation"
"github.com/vmware/harbor/utils"
) )
const ( const (
@ -129,6 +130,8 @@ func (r *RepTarget) Valid(v *validation.Validation) {
v.SetError("endpoint", "can not be empty") v.SetError("endpoint", "can not be empty")
} }
r.URL = utils.FormatEndpoint(r.URL)
if len(r.URL) > 64 { if len(r.URL) > 64 {
v.SetError("endpoint", "max length is 64") v.SetError("endpoint", "max length is 64")
} }

View File

@ -21,7 +21,7 @@ import (
"net/http" "net/http"
au "github.com/docker/distribution/registry/client/auth" au "github.com/docker/distribution/registry/client/auth"
"github.com/vmware/harbor/utils/registry/utils" "github.com/vmware/harbor/utils"
) )
// Authorizer authorizes requests according to the schema // Authorizer authorizes requests according to the schema

View File

@ -21,8 +21,8 @@ import (
"net/url" "net/url"
"strings" "strings"
"github.com/vmware/harbor/utils"
registry_error "github.com/vmware/harbor/utils/registry/error" registry_error "github.com/vmware/harbor/utils/registry/error"
"github.com/vmware/harbor/utils/registry/utils"
) )
// Registry holds information of a registry entity // Registry holds information of a registry entity

View File

@ -30,8 +30,8 @@ import (
"github.com/docker/distribution/manifest/schema1" "github.com/docker/distribution/manifest/schema1"
"github.com/docker/distribution/manifest/schema2" "github.com/docker/distribution/manifest/schema2"
"github.com/vmware/harbor/utils"
registry_error "github.com/vmware/harbor/utils/registry/error" registry_error "github.com/vmware/harbor/utils/registry/error"
"github.com/vmware/harbor/utils/registry/utils"
) )
// Repository holds information of a repository entity // Repository holds information of a repository entity

View File

@ -1,44 +0,0 @@
/*
Copyright (c) 2016 VMware, Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package utils
import (
"net/url"
"strings"
)
// FormatEndpoint formats endpoint
func FormatEndpoint(endpoint string) string {
endpoint = strings.TrimSpace(endpoint)
endpoint = strings.TrimRight(endpoint, "/")
if !strings.HasPrefix(endpoint, "http://") &&
!strings.HasPrefix(endpoint, "https://") {
endpoint = "http://" + endpoint
}
return endpoint
}
// ParseEndpoint parses endpoint to a URL
func ParseEndpoint(endpoint string) (*url.URL, error) {
endpoint = FormatEndpoint(endpoint)
u, err := url.Parse(endpoint)
if err != nil {
return nil, err
}
return u, nil
}

View File

@ -16,9 +16,8 @@
package utils package utils
import ( import (
"net/url"
"strings" "strings"
"github.com/vmware/harbor/models"
) )
// Repository holds information about repository // Repository holds information about repository
@ -34,22 +33,25 @@ func (r *Repository) GetProject() string {
return r.Name[0:strings.LastIndex(r.Name, "/")] return r.Name[0:strings.LastIndex(r.Name, "/")]
} }
// ProjectSorter holds an array of projects // FormatEndpoint formats endpoint
type ProjectSorter struct { func FormatEndpoint(endpoint string) string {
Projects []models.Project endpoint = strings.TrimSpace(endpoint)
endpoint = strings.TrimRight(endpoint, "/")
if !strings.HasPrefix(endpoint, "http://") &&
!strings.HasPrefix(endpoint, "https://") {
endpoint = "http://" + endpoint
}
return endpoint
} }
// Len returns the length of array in ProjectSorter // ParseEndpoint parses endpoint to a URL
func (ps *ProjectSorter) Len() int { func ParseEndpoint(endpoint string) (*url.URL, error) {
return len(ps.Projects) endpoint = FormatEndpoint(endpoint)
}
// Less defines the comparison rules of project u, err := url.Parse(endpoint)
func (ps *ProjectSorter) Less(i, j int) bool { if err != nil {
return ps.Projects[i].Name < ps.Projects[j].Name return nil, err
} }
return u, nil
// Swap swaps the position of i and j
func (ps *ProjectSorter) Swap(i, j int) {
ps.Projects[i], ps.Projects[j] = ps.Projects[j], ps.Projects[i]
} }