Git tags and branches need to be UTF-8 encoded
When shelling out and getting the list of git branches and tags to display in the repository navigation, the names are read in ASCII-8BIT encoding, i.e. binary strings without any encoding. This is basically correct as git itself doesn't enforce any kind of encoding for these things.
However, when rendering the navigation with branches or tags containing non-ASCII characters, ERB throws the following error in source:trunk/app/views/repositories/show.html.erb#L21
Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
The reason for this exception is that in source:trunk/app/views/repositories/_navigation.html.erb#L18, the select box for branches is rendered. If a branch name (in ASCII-8BIT encoding) can't be converted to UTF-8 implicitly, the whole output_buffer containing the rendered HTML will be set to ASCII-8BIT encoding. When the buffer is then appended to the outer UTF-8 buffer, the error is thrown.
The solution is to force UTF-8 encoding to branch names, assuming they are stored in some UTF-8 like encoding. As we can't know the actual encoding of the branches, this is probably a good enough bet. In any case, it avoids HTTP 500 errors and renders something, even if the encoding doesn't fully match...
The attached patch provides the forced encoding. Unfortunately, we can't use
scm_iconv with the branches as it returns a new string which would not be a
Branch instance anymore.
The patch was extracted from and developed by Planio. The patch is created against the current trunk at r14793. The patched issue is present since about forever but only manifests itself only on Ruby >=1.9 and probably some kind-of-recent Rails, at least since Redmine 2.6.