Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Key duplication bug when setting values with -v flag on dot-escaped JSON paths #15

Open
darkvertex opened this issue Jul 30, 2018 · 0 comments

Comments

@darkvertex
Copy link

What version I'm using:

Hi, I'm testing this with jj-1.2.1 on Linux.

Bug description:

I have noticed some strange behaviour where using -v to set a value will result in double output for the same key when using backslashes to escape periods in a JSON "path".

Repro steps:

Consider a little sample.json file with the content below:

{
  "plain_example": "tomato", 
  "dotted.example1": "carrot", 
  "dotted.example2": "eggplant"
}

So far so good. I run jj on it to print it as-is and it prints as expected:

> jj -i sample.json -p
{
  "plain_example": "tomato", 
  "dotted.example1": "carrot", 
  "dotted.example2": "eggplant"
}

First let's validate that the -v flag for editing a document does in fact work. Let's try with the plain_example key...

> jj -i sample.json -v potato "plain_example" -p
{
  "plain_example": "potato", 
  "dotted.example1": "carrot", 
  "dotted.example2": "eggplant"
}

So far so good! plain_example which was "tomato" is now "potato". 👍


Now, let's say I want to edit the key dotted.example1 to the same value. At first, I forget to escape the periods -- which is my bad and not a bug -- and it gives me this output:

> jj -i ./_vscode_rez_config/settings.json -v potato "dotted.example1" -p
{
  "dotted": {
    "example1": "potato"
  }, 
  "plain_example": "tomato", 
  "dotted.example1": "carrot", 
  "dotted.example2": "eggplant"
}

Then I read the README a bit closer and learn that I need to escape them... Ok! No problem, I tell myself... let's try:

> jj -i ./_vscode_rez_config/settings.json -v potato "dotted\.example1" -p
{
  "dotted.example1": "potato", 
  "plain_example": "tomato", 
  "dotted.example1": "carrot", 
  "dotted.example2": "eggplant"
}

Woah, what the..?! Escaping worked as I don't get nesting in the result anymore, but now dotted.example1 exists twice! That's not legal JSON. 💩

Could it be the printing code?? Let's rule it out by writing a file out directly with the -o flag:

> jj -i ./_vscode_rez_config/settings.json -v potato "dotted\.example1" -o /tmp/output.json
> cat /tmp/output.json
{"dotted.example1":"potato",
    "plain_example": "tomato",
    "dotted.example1": "carrot",
    "dotted.example2": "eggplant"
}

Same issue, key appears twice and curiously the output is not identical as with -p, plus it's not formatted as prettily as one would expect! Something is definitely wrong here. 😮

Hope you can find the bug. I really love the tool otherwise! :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant