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  }