|
|
|
// Copyright 2013 gopm authors.
|
|
|
|
//
|
|
|
|
// 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 cmd
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"github.com/Unknwon/com"
|
|
|
|
)
|
|
|
|
|
|
|
|
var CmdSearch = &Command{
|
|
|
|
UsageLine: "search [keyword]",
|
|
|
|
Short: "search for package",
|
|
|
|
Long: `
|
|
|
|
search packages
|
|
|
|
|
|
|
|
The search flags are:
|
|
|
|
|
|
|
|
-e
|
|
|
|
search extactly, you should input an exactly package name as keyword
|
|
|
|
`,
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
CmdSearch.Run = runSearch
|
|
|
|
CmdSearch.Flags = map[string]bool{
|
|
|
|
"-e": false,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func printSearchPrompt(flag string) {
|
|
|
|
switch flag {
|
|
|
|
case "-e":
|
|
|
|
com.ColorLog("[INFO] You enabled exactly search.\n")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// search packages
|
|
|
|
func runSearch(cmd *Command, args []string) {
|
|
|
|
|
|
|
|
// Check length of arguments.
|
|
|
|
if len(args) < 1 {
|
|
|
|
com.ColorLog("[ERROR] Please input package's keyword.\n")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var host, port string
|
|
|
|
host = "localhost"
|
|
|
|
port = "8991"
|
|
|
|
|
|
|
|
if cmd.Flags["-e"] {
|
|
|
|
search(host, port, args[0], true)
|
|
|
|
} else {
|
|
|
|
search(host, port, args[0], false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type searchRes struct {
|
|
|
|
Pkg string
|
|
|
|
Desc string
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
request local or remote search service to find packages according to keyword inputed
|
|
|
|
*/
|
|
|
|
func search(host, port, keyword string, isExactly bool) {
|
|
|
|
url := fmt.Sprintf("http://%v:%v/search?%v", host, port, keyword)
|
|
|
|
if isExactly {
|
|
|
|
url = fmt.Sprintf("http://%v:%v/searche?%v", host, port, keyword)
|
|
|
|
}
|
|
|
|
resp, err := http.Get(url)
|
|
|
|
if err != nil {
|
|
|
|
com.ColorLog(err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
|
|
|
if resp.StatusCode == 200 {
|
|
|
|
contents, err := ioutil.ReadAll(resp.Body)
|
|
|
|
if err != nil {
|
|
|
|
com.ColorLog(err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
pkgs := make([]searchRes, 0)
|
|
|
|
err = json.Unmarshal(contents, &pkgs)
|
|
|
|
if err != nil {
|
|
|
|
com.ColorLog(err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
for i, pkg := range pkgs {
|
|
|
|
fmt.Println(i+1, pkg.Pkg, "\t", pkg.Desc)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
com.ColorLog(resp.Status)
|
|
|
|
}
|
|
|
|
}
|