From 6dd8aeb00af88cb6bb4cdde0272f2851b2d1b7f9 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 10 May 2015 08:09:59 -0400 Subject: [PATCH 1/4] config set: allow arbitrary json input This commit allows arbitrary json input to set. It also tests this with sharness. --- core/commands/config.go | 15 +++++++++++++-- test/sharness/t0021-config.sh | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/core/commands/config.go b/core/commands/config.go index 64c320742..8ef6dad19 100644 --- a/core/commands/config.go +++ b/core/commands/config.go @@ -59,6 +59,7 @@ Set the value of the 'datastore.path' key: }, Options: []cmds.Option{ cmds.BoolOption("bool", "Set a boolean value"), + cmds.BoolOption("json", "Parse stringified JSON"), }, Run: func(req cmds.Request, res cmds.Response) { args := req.Arguments() @@ -74,7 +75,17 @@ Set the value of the 'datastore.path' key: var output *ConfigField if len(args) == 2 { value := args[1] - if isbool, _, _ := req.Option("bool").Bool(); isbool { + + if parseJson, _, _ := req.Option("json").Bool(); parseJson { + var jsonVal interface{} + if err := json.Unmarshal([]byte(value), &jsonVal); err != nil { + err = fmt.Errorf("failed to unmarshal json. %s", err) + res.SetError(err, cmds.ErrNormal) + return + } + + output, err = setConfig(r, key, jsonVal) + } else if isbool, _, _ := req.Option("bool").Bool(); isbool { output, err = setConfig(r, key, value == "true") } else { output, err = setConfig(r, key, value) @@ -217,7 +228,7 @@ func getConfig(r repo.Repo, key string) (*ConfigField, error) { func setConfig(r repo.Repo, key string, value interface{}) (*ConfigField, error) { err := r.SetConfigKey(key, value) if err != nil { - return nil, fmt.Errorf("Failed to set config value: %s", err) + return nil, fmt.Errorf("Failed to set config value: %s (maybe use --json?)", err) } return getConfig(r, key) } diff --git a/test/sharness/t0021-config.sh b/test/sharness/t0021-config.sh index 10aed018d..4c4e8e881 100755 --- a/test/sharness/t0021-config.sh +++ b/test/sharness/t0021-config.sh @@ -36,6 +36,17 @@ test_config_cmd_set() { ' } +# this is a bit brittle. the problem is we need to test +# with something that will be forced to unmarshal as a struct. +# (i.e. just setting 'ipfs config --json foo "[1, 2, 3]"') may +# set it as astring instead of proper json. We leverage the +# unmarshalling that has to happen. +CONFIG_SET_JSON_TEST='{ + "MDNS": { + "Enabled": true, + "Interval": 10 + } +}' test_config_cmd() { test_config_cmd_set "beep" "boop" @@ -43,6 +54,9 @@ test_config_cmd() { test_config_cmd_set "beep1" "boop2" test_config_cmd_set "--bool" "beep2" "true" test_config_cmd_set "--bool" "beep2" "false" + test_config_cmd_set "--json" "beep3" "true" + test_config_cmd_set "--json" "beep3" "false" + test_config_cmd_set "--json" "Discovery" "$CONFIG_SET_JSON_TEST" } From c946dbede3f0be89244f3bd0b8938790479a3c89 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 10 May 2015 08:27:49 -0400 Subject: [PATCH 2/4] sharness: randomize swarm address too. This may take care of the daemon clashing on travis. --- test/sharness/lib/test-lib.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/sharness/lib/test-lib.sh b/test/sharness/lib/test-lib.sh index 542167c6d..afd4f6121 100644 --- a/test/sharness/lib/test-lib.sh +++ b/test/sharness/lib/test-lib.sh @@ -143,6 +143,12 @@ test_init_ipfs() { PORT_GWAY=$((RANDOM % 3000 + 8100)) ADDR_GWAY="/ip4/127.0.0.1/tcp/$PORT_GWAY" + PORT_SWARM=$((RANDOM % 3000 + 12000)) + ADDR_SWARM="[ + \"/ip4/0.0.0.0/tcp/$PORT_SWARM\" +]" + + # we set the Addresses.API config variable. # the cli client knows to use it, so only need to set. # todo: in the future, use env? @@ -158,6 +164,7 @@ test_init_ipfs() { test_config_set Mounts.IPNS "$(pwd)/ipns" && test_config_set Addresses.API "$ADDR_API" && test_config_set Addresses.Gateway "$ADDR_GWAY" && + test_config_set --json Addresses.Swarm "$ADDR_SWARM" && ipfs bootstrap rm --all || test_fsh cat "\"$IPFS_PATH/config\"" ' From 2879c54da3fda68ef9404939a296a493b59bf22c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 10 May 2015 07:57:24 -0400 Subject: [PATCH 3/4] travis: use the KVM setup travis is experimenting with a setup using KVM, instead of independently provisioned VMs. It promises to be much faster. We're testing it out. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 3e5abfab4..9ce46d4b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ +dist: trusty + os: - linux - osx From 482a492ab0ce797fb6ab987441b643924d475adf Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 10 May 2015 07:53:47 -0400 Subject: [PATCH 4/4] travis-ci: make test_all_commits After losing jenkins, it's been difficult to test all commits manually. This commit adds a Makefile target that makes travis do it. Unfortunately, this is way too slow. It takes longer than the allotted 10min. After asking the travis people what to do, someone suggested making sure that each commit is pushed to github independently. This makes travis run CI on every single commit in the PR, and gives us nice status indicators on each one (so we know which ones did not pass). This approach means that we need to push a branch to the repo for each commit in the PR-- otherwise travis may cancel its run if it detects that the branch is no longer there. We could automate this with a bot that essentially does: for each PR: git fetch the PR branch push a branch per commit: - for each closed PR: delete all branches with pattern - --- Makefile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Makefile b/Makefile index 68e4b31d0..98fac1d09 100644 --- a/Makefile +++ b/Makefile @@ -61,3 +61,11 @@ test_all_commits: @echo "WARNING: this will 'git rebase --exec'." @test/bin/continueyn GIT_EDITOR=true git rebase -i --exec "make test" origin/master + +test_all_commits_travis: + # these are needed because travis. + # we don't use this yet because it takes way too long. + git config --global user.email "nemo@ipfs.io" + git config --global user.name "IPFS BOT" + git fetch origin master:master + GIT_EDITOR=true git rebase -i --exec "make test" master