diff options
| author | alisdair sullivan <alisdairsullivan@yahoo.ca> | 2017-10-13 08:01:40 -0700 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-10-13 08:01:40 -0700 | 
| commit | 5aba7df926d0bd60ed2beddddec51622b5740e37 (patch) | |
| tree | d06c762669c0d7232523f26e3b0827b576d8e851 /src | |
| parent | 6d9037a5a4d9d6480ca061f47da62c66a5fbc16c (diff) | |
| parent | 09284a8af93e742798ca61d64fb8699e18e53207 (diff) | |
Merge pull request #1646 from ferd/fix-unicode-app-files
Avoid guessing on utf8 decoding of app files
Diffstat (limited to 'src')
| -rw-r--r-- | src/rebar_file_utils.erl | 21 | ||||
| -rw-r--r-- | src/rebar_otp_app.erl | 2 | 
2 files changed, 14 insertions, 9 deletions
| diff --git a/src/rebar_file_utils.erl b/src/rebar_file_utils.erl index 4a783f2..b0755ed 100644 --- a/src/rebar_file_utils.erl +++ b/src/rebar_file_utils.erl @@ -35,6 +35,7 @@           mv/2,           delete_each/1,           write_file_if_contents_differ/2, +         write_file_if_contents_differ/3,           system_tmpdir/0,           system_tmpdir/1,           reset_dir/1, @@ -334,15 +335,19 @@ delete_each([File | Rest]) ->              ?FAIL      end. +%% @doc backwards compat layer to pre-utf8 support  write_file_if_contents_differ(Filename, Bytes) -> -    %% first try to convert directly to binaries, -    %% but if it fails, we likely contain unicode and -    %% need special treatment -    ToWrite = try -                  iolist_to_binary(Bytes) -              catch -                  error:badarg -> unicode:characters_to_binary(Bytes) -              end, +    write_file_if_contents_differ(Filename, Bytes, raw). + +%% @doc let the user pick the encoding required; there are no good +%% heuristics for data encoding +write_file_if_contents_differ(Filename, Bytes, raw) -> +    write_file_if_contents_differ_(Filename, iolist_to_binary(Bytes)); +write_file_if_contents_differ(Filename, Bytes, utf8) -> +    write_file_if_contents_differ_(Filename, unicode:characters_to_binary(Bytes, utf8)). + +%% @private compare raw strings and check contents +write_file_if_contents_differ_(Filename, ToWrite) ->      case file:read_file(Filename) of          {ok, ToWrite} ->              ok; diff --git a/src/rebar_otp_app.erl b/src/rebar_otp_app.erl index 1bc33b9..f5bb9cf 100644 --- a/src/rebar_otp_app.erl +++ b/src/rebar_otp_app.erl @@ -127,7 +127,7 @@ preprocess(State, AppInfo, AppSrcFile) ->              EbinDir = rebar_app_info:ebin_dir(AppInfo),              filelib:ensure_dir(filename:join(EbinDir, "dummy.beam")),              AppFile = rebar_app_utils:app_src_to_app(OutDir, AppSrcFile), -            ok = rebar_file_utils:write_file_if_contents_differ(AppFile, Spec), +            ok = rebar_file_utils:write_file_if_contents_differ(AppFile, Spec, utf8),              AppFile;          {error, Reason} -> | 
