github.com/AlekSi/nut@v0.3.1-0.20130607203728-cce108d4135e/nut/publish.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "io/ioutil" 8 "log" 9 "net/http" 10 "net/url" 11 ) 12 13 var ( 14 cmdPublish = &Command{ 15 Run: runPublish, 16 UsageLine: "publish [-token token] [-v] [filename]", 17 Short: "publish nut on gonuts.io", 18 } 19 20 publishToken string 21 publishV bool 22 ) 23 24 func init() { 25 cmdPublish.Long = ` 26 Publishes nut on http://gonuts.io/ (requires registration with Google account). 27 28 Examples: 29 nut publish test_nut1-0.0.1.nut 30 ` 31 32 tokenHelp := fmt.Sprintf("access token from http://gonuts.io/-/me (may be read from ~/%s)", ConfigFileName) 33 cmdPublish.Flag.StringVar(&publishToken, "token", "", tokenHelp) 34 cmdPublish.Flag.BoolVar(&publishV, "v", false, vHelp) 35 } 36 37 func runPublish(cmd *Command) { 38 if publishToken == "" { 39 publishToken = Config.Token 40 } 41 if !publishV { 42 publishV = Config.V 43 } 44 45 url, err := url.Parse("http://" + NutImportPrefixes["gonuts.io"]) 46 FatalIfErr(err) 47 48 for _, arg := range cmd.Flag.Args() { 49 b, nf := ReadNut(arg) 50 url.Path = fmt.Sprintf("/%s/%s/%s", nf.Vendor, nf.Name, nf.Version) 51 52 if publishV { 53 log.Printf("Putting %s to %s ...", arg, url) 54 } 55 url.RawQuery = "token=" + publishToken 56 req, err := http.NewRequest("PUT", url.String(), bytes.NewReader(b)) 57 FatalIfErr(err) 58 req.Header.Set("User-Agent", "nut publisher") 59 req.Header.Set("Content-Type", "application/zip") 60 req.ContentLength = int64(len(b)) 61 62 res, err := http.DefaultClient.Do(req) 63 FatalIfErr(err) 64 b, err = ioutil.ReadAll(res.Body) 65 FatalIfErr(err) 66 err = res.Body.Close() 67 FatalIfErr(err) 68 69 var body map[string]interface{} 70 err = json.Unmarshal(b, &body) 71 if err != nil { 72 log.Print(err) 73 } 74 75 m, ok := body["Message"] 76 if ok { 77 ok = res.StatusCode/100 == 2 78 } else { 79 m = string(b) 80 } 81 if !ok { 82 log.Fatal(m) 83 } 84 if publishV { 85 log.Print(m) 86 } 87 } 88 }