I am trying to query the GitHub API using gh
and use the returned JSON to give me a list of repos that have matches for my search, and against each repo, I want a list of the filenames that need editing.
I can get a list of the repos back from the API like so:
gh api --method=GET "search/code?q=some-specific-string" | jq -r '[.items[] | { ( .repository.full_name ) : .path}]'
This gives me results like:
[
{
"org-name/helm-charts": [
"README.md"
]
},
{
"org-name/repo-name": [
"file-name-1.py"
]
},
{
"org-name/repo-name": [
"file-name-2.py"
]
}
]
I am trying to find the right way to take the results and merge them so that there are no duplicate repo names, and their lists are concatenated. So I get a result like:
[
{
"org-name/helm-charts": [
"README.md"
]
},
{
"org-name/repo-name": [
"file-name-1.py",
"file-name-2.py"
]
}
]
How would I do that with jq
? I am trying to search for the solution but the way to word what I am trying to do eludes me
You can even collect all into one object using reduce
instead of a mapping:
gh … | jq 'reduce .items[] as $i ({}; .[$i.repository.full_name] += [$i.path])'
{
"org-name/helm-charts": [
"README.md"
],
"org-name/repo-name": [
"file-name-1.py",
"file-name-2.py"
]
}
If you want to have an array of separate, single-field objects, append to_entries | map([.] | from_entries)
to sort them out.