Example #1
0
File: push.go Project: get3w/get3w
// Push local to cloud.
func (parser *Parser) Push(authConfig *home.AuthConfig, out io.Writer) (shouldLogin bool, err error) {
	if authConfig.Username == "" || authConfig.AccessToken == "" {
		return true, fmt.Errorf("ERROR: Authentication failed\n")
	}

	client := get3w.NewClient(authConfig.AccessToken)
	output, _, err := client.Apps.FilesChecksum(parser.Owner, parser.Name)
	if err != nil {
		return false, err
	}
	files := output.Files

	localFiles, err := parser.Storage.GetAllFiles(parser.Storage.GetSourcePrefix(""))
	if err != nil {
		return false, err
	}

	// 1 specified add, 0 specified edit, -1 specified delete
	pathMap := make(map[string]int)

	for _, localFile := range localFiles {
		if localFile.IsDir || parser.IsLocalFile(localFile) {
			continue
		}
		checksum := files[localFile.Path]
		if checksum == "" {
			pathMap[localFile.Path] = 1
		} else {
			localChecksum, _ := parser.Storage.Checksum(parser.Storage.GetSourceKey(localFile.Path))
			if checksum != localChecksum {
				pathMap[localFile.Path] = 0
			}
		}
	}
	for path := range files {
		if !parser.Storage.IsExist(parser.Storage.GetSourceKey(path)) {
			pathMap[path] = -1
		}
	}

	fmt.Fprintf(out, "Local repository: %s\n", parser.Path)
	fmt.Fprintf(out, "Remote repository: %s/%s\n", parser.Owner, parser.Name)

	if len(pathMap) == 0 {
		fmt.Fprintln(out, "Everything up-to-date")
		return false, nil
	}

	gzPath := home.Path(stringutils.UUID() + ".tar.gz")

	err = ioutils.Pack(gzPath, parser.Path, pathMap)
	if err != nil {
		return false, err
	}

	data, err := ioutil.ReadFile(gzPath)
	if err != nil {
		return false, err
	}
	os.Remove(gzPath)

	blob := base64.StdEncoding.EncodeToString(data)

	input := &get3w.FilesPushInput{
		Blob: blob,
	}

	for path, val := range pathMap {
		if val > 0 {
			fmt.Fprintf(out, "\t+added:%s\n", path)
			input.Added = append(input.Added, path)
		}
	}
	for path, val := range pathMap {
		if val < 0 {
			fmt.Fprintf(out, "\t-removed:%s\n", path)
			input.Removed = append(input.Removed, path)
		}
	}
	for path, val := range pathMap {
		if val == 0 {
			fmt.Fprintf(out, "\tmodified:%s\n", path)
			input.Modified = append(input.Modified, path)
		}
	}

	_, _, err = client.Apps.FilesPush(parser.Owner, parser.Name, input)
	if err != nil {
		return false, err
	}

	fmt.Fprintln(out, "done.")
	return false, nil
}
Example #2
0
File: login.go Project: get3w/get3w
func (cli *Get3WCli) login(username, password string) (*home.AuthConfig, error) {
	// On Windows, force the use of the regular OS stdin stream. Fixes #14336/#14210
	if runtime.GOOS == "windows" {
		cli.in = os.Stdin
	}

	promptDefault := func(prompt string, configDefault string) {
		if configDefault == "" {
			fmt.Fprintf(cli.out, "%s: ", prompt)
		} else {
			fmt.Fprintf(cli.out, "%s (%s): ", prompt, configDefault)
		}
	}

	readInput := func(in io.Reader, out io.Writer) string {
		reader := bufio.NewReader(in)
		line, _, err := reader.ReadLine()
		if err != nil {
			fmt.Fprintln(out, err.Error())
			os.Exit(1)
		}
		return string(line)
	}

	authConfig := cli.config.AuthConfig

	if username == "" {
		promptDefault("Username", authConfig.Username)
		username = readInput(cli.in, cli.out)
		username = strings.TrimSpace(username)
		if username == "" {
			username = authConfig.Username
		}
	}

	// Assume that a different username means they may not want to use
	// the password or email from the config file, so prompt them
	if username != authConfig.Username {
		if password == "" {
			promptDefault("Password", authConfig.Password)
			password = readInput(cli.in, cli.out)
			if password == "" {
				password = authConfig.Password
			}
		}
	} else {
		// However, if they don't override the username use the
		// password or email from the cmd line if specified. IOW, allow
		// then to change/override them.  And if not specified, just
		// use what's in the config file
		if password == "" {
			password = authConfig.Password
		}
	}
	authConfig.Username = username
	authConfig.Password = password

	client := get3w.NewClient("")
	input := &get3w.UserLoginInput{
		Account:  username,
		Password: password,
	}
	output, resp, err := client.Users.Login(input)

	if resp.StatusCode == 401 {
		cli.config.AuthConfig = home.AuthConfig{}
		if err2 := cli.config.Save(); err2 != nil {
			fmt.Fprintf(cli.out, "WARNING: could not save config file: %v\n", err2)
		}
		return nil, err
	}
	if err != nil {
		return nil, err
	}

	authConfig.AccessToken = output.AccessToken
	cli.config.AuthConfig = authConfig
	if err := cli.config.Save(); err != nil {
		return nil, fmt.Errorf("ERROR: failed to save config file: %v", err)
	}
	fmt.Fprintf(cli.out, "INFO: login credentials saved in %s\n", home.Path(home.RootConfigName))

	if resp.Status != "" {
		fmt.Fprintf(cli.out, "%s\n", resp.Status)
	}
	return &authConfig, nil
}