ruby convert array to hash preserve duplicate key

arrays, hash, ruby, type-conversion

Solution

I hope you would like this :

ary = [
       "19d97e408ee3f993745b053e281ac9dc69519e06","refs/heads/auto",
       "8f6f47c6e8023540b022586e368c68e1e814ce6d","refs/heads/callout_hooks",  
       "3cbdb4b2fcb85bc7f0ed08b62e2bf2445a7659e8","refs/heads/elab",
       "d38a9a26ef887c08b306bdab210b39882f58e587","refs/heads/elab_6.1",
       "19d97e408ee3f993745b053e281ac9dc69519e06","refs/heads/master",
       "906dfe6eebff832baf0f92683d751432fcc98ab7","refs/heads/regression"
     ]

array_hash = ary.each_slice(2).with_object(Hash.new { |h,k| h[k] = []}) do |(k,v),hash|
  hash[k] << v 
end

# the main advantage is here you wouldn't loose any data, all are with you. You can
# use it as per your need. I think it is a better approach to deal with your situation.
array_hash
# => {"19d97e408ee3f993745b053e281ac9dc69519e06"=>
#      ["refs/heads/auto", "refs/heads/master"],
#     "8f6f47c6e8023540b022586e368c68e1e814ce6d"=>["refs/heads/callout_hooks"],
#     "3cbdb4b2fcb85bc7f0ed08b62e2bf2445a7659e8"=>["refs/heads/elab"],
#     "d38a9a26ef887c08b306bdab210b39882f58e587"=>["refs/heads/elab_6.1"],
#     "906dfe6eebff832baf0f92683d751432fcc98ab7"=>["refs/heads/regression"]}

Problem

I need to pull down the result of git ls-remote into an array, then convert that array to a hash like this: {commit_hash => reference}. Occasionally, two commit hashes are identical (but have different references, perhaps). So I get this kind of thing: ``` ["19d97e408ee3f993745b053e281ac9dc69519e06","refs/heads/auto", "8f6f47c6e8023540b022586e368c68e1e814ce6d","refs/heads/callout_hooks", "3cbdb4b2fcb85bc7f0ed08b62e2bf2445a7659e8","refs/heads/elab", "d38a9a26ef887c08b306bdab210b39882f58e587","refs/heads/elab_6.1", "19d97e408ee3f993745b053e281ac9dc69519e06","refs/heads/master", "906dfe6eebff832baf0f92683d751432fcc98ab7","refs/heads/regression"] ``` which I want to convert to: ``` {"19d97e408ee3f993745b053e281ac9dc69519e06" => "refs/heads/auto"...} ``` but master and auto have the same hash, so one of them gets dropped in the conversion. How do I either 1.) get a list of the values which were dropped in the conversion, or 2.) make the keys unique by adding a special character to the key, like a *?

Original source