diff options
Diffstat (limited to 'src/rebar_upgrade.erl')
-rw-r--r-- | src/rebar_upgrade.erl | 266 |
1 files changed, 0 insertions, 266 deletions
diff --git a/src/rebar_upgrade.erl b/src/rebar_upgrade.erl deleted file mode 100644 index 3a38a08..0000000 --- a/src/rebar_upgrade.erl +++ /dev/null @@ -1,266 +0,0 @@ -%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- -%% ex: ts=4 sw=4 et -%% ------------------------------------------------------------------- -%% -%% rebar: Erlang Build Tools -%% -%% Copyright (c) 2011 Joe Williams (joe@joetify.com) -%% -%% Permission is hereby granted, free of charge, to any person obtaining a copy -%% of this software and associated documentation files (the "Software"), to deal -%% in the Software without restriction, including without limitation the rights -%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -%% copies of the Software, and to permit persons to whom the Software is -%% furnished to do so, subject to the following conditions: -%% -%% The above copyright notice and this permission notice shall be included in -%% all copies or substantial portions of the Software. -%% -%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -%% THE SOFTWARE. -%% ------------------------------------------------------------------- - --module(rebar_upgrade). - --include("rebar.hrl"). --include_lib("kernel/include/file.hrl"). - --export(['generate-upgrade'/2]). - -%% for internal use only --export([info/2]). - --define(TMP, "_tmp"). - -%% ==================================================================== -%% Public API -%% ==================================================================== - -'generate-upgrade'(Config0, ReltoolFile) -> - %% Get the old release path - {Config, ReltoolConfig} = rebar_rel_utils:load_config(Config0, ReltoolFile), - TargetParentDir = rebar_rel_utils:get_target_parent_dir(Config, - ReltoolConfig), - TargetDir = rebar_rel_utils:get_target_dir(Config, ReltoolConfig), - - PrevRelPath = rebar_rel_utils:get_previous_release_path(Config), - OldVerPath = filename:join([TargetParentDir, PrevRelPath]), - - %% Run checks to make sure that building a package is possible - {NewVerPath, NewName, NewVer} = run_checks(Config, OldVerPath, - ReltoolConfig), - NameVer = NewName ++ "_" ++ NewVer, - - %% Save the code path prior to doing anything - OrigPath = code:get_path(), - - %% Prepare the environment for building the package - ok = setup(OldVerPath, NewVerPath, NewName, NewVer, NameVer), - - %% Build the package - run_systools(NameVer, NewName), - - %% Boot file changes - {ok, _} = boot_files(TargetDir, NewVer, NewName), - - %% Extract upgrade and tar it back up with changes - make_tar(NameVer, NewVer, NewName), - - %% Clean up files that systools created - ok = cleanup(NameVer), - - %% Restore original path - true = code:set_path(OrigPath), - - {ok, Config}. - -%% =================================================================== -%% Internal functions -%% ================================================================== - -info(help, 'generate-upgrade') -> - ?CONSOLE("Build an upgrade package.~n" - "~n" - "Valid command line options:~n" - " previous_release=path~n" - " target_dir=target_dir (optional)~n", - []). - -run_checks(Config, OldVerPath, ReltoolConfig) -> - true = rebar_utils:prop_check(filelib:is_dir(OldVerPath), - "Release directory doesn't exist (~p)~n", - [OldVerPath]), - - {Name, Ver} = rebar_rel_utils:get_reltool_release_info(ReltoolConfig), - - NewVerPath = rebar_rel_utils:get_target_dir(Config, ReltoolConfig), - true = rebar_utils:prop_check(filelib:is_dir(NewVerPath), - "Release directory doesn't exist (~p)~n", - [NewVerPath]), - - {NewName, NewVer} = rebar_rel_utils:get_rel_release_info(Name, NewVerPath), - {OldName, OldVer} = rebar_rel_utils:get_rel_release_info(Name, OldVerPath), - - true = - rebar_utils:prop_check(NewName == OldName, - "New and old .rel release names do not match~n", - []), - true = - rebar_utils:prop_check(Name == NewName, - "Reltool and .rel release names do not match~n", - []), - true = - rebar_utils:prop_check(NewVer =/= OldVer, - "New and old .rel contain the same version~n", - []), - true = - rebar_utils:prop_check(Ver == NewVer, - "Reltool and .rel versions do not match~n", []), - - {NewVerPath, NewName, NewVer}. - -setup(OldVerPath, NewVerPath, NewName, NewVer, NameVer) -> - Src = filename:join([NewVerPath, "releases", - NewVer, NewName ++ ".rel"]), - Dst = filename:join([".", NameVer ++ ".rel"]), - {ok, _} = file:copy(Src, Dst), - ok = code:add_pathsa( - lists:append([ - filelib:wildcard(filename:join([NewVerPath, - "lib", "*", "ebin"])), - filelib:wildcard(filename:join([OldVerPath, - "releases", "*"])), - filelib:wildcard(filename:join([OldVerPath, - "lib", "*", "ebin"])) - ])). - -run_systools(NewVer, Name) -> - Opts = [silent], - NameList = [Name], - case systools:make_relup(NewVer, NameList, NameList, Opts) of - {error, _, Msg} -> - ?ABORT("Systools [systools:make_relup/4] aborted with: ~p~n", - [Msg]); - _ -> - ?DEBUG("Relup created~n", []), - case systools:make_script(NewVer, Opts) of - {error, _, Msg1} -> - ?ABORT("Systools [systools:make_script/2] " - "aborted with: ~p~n", [Msg1]); - _ -> - ?DEBUG("Script created~n", []), - case systools:make_tar(NewVer, Opts) of - {error, _, Msg2} -> - ?ABORT("Systools [systools:make_tar/2] " - "aborted with: ~p~n", [Msg2]); - _ -> - ?DEBUG("Tarball created~n", []), - ok - end - end - end. - -boot_files(TargetDir, Ver, Name) -> - ok = file:make_dir(filename:join([".", ?TMP])), - ok = file:make_dir(filename:join([".", ?TMP, "releases"])), - ok = file:make_dir(filename:join([".", ?TMP, "releases", Ver])), - case os:type() of - {win32,_} -> - ok; - _ -> - ok = file:make_symlink( - filename:join(["start.boot"]), - filename:join([".", ?TMP, "releases", Ver, Name ++ ".boot"])) - end, - {ok, _} = - file:copy( - filename:join([TargetDir, "releases", Ver, "start_clean.boot"]), - filename:join([".", ?TMP, "releases", Ver, "start_clean.boot"])), - - SysConfig = filename:join([TargetDir, "releases", Ver, "sys.config"]), - _ = case filelib:is_regular(SysConfig) of - true -> - {ok, _} = file:copy( - SysConfig, - filename:join([".", ?TMP, "releases", Ver, - "sys.config"])); - false -> ok - end, - - VmArgs = filename:join([TargetDir, "releases", Ver, "vm.args"]), - case filelib:is_regular(VmArgs) of - true -> - {ok, _} = file:copy( - VmArgs, - filename:join([".", ?TMP, "releases", Ver, "vm.args"])); - false -> {ok, 0} - end. - -make_tar(NameVer, NewVer, NewName) -> - Filename = NameVer ++ ".tar.gz", - {ok, Cwd} = file:get_cwd(), - Absname = filename:join([Cwd, Filename]), - ok = file:set_cwd(?TMP), - ok = erl_tar:extract(Absname, [compressed]), - ok = file:delete(Absname), - case os:type() of - {win32,_} -> - {ok, _} = - file:copy( - filename:join([".", "releases", NewVer, "start.boot"]), - filename:join([".", "releases", NewVer, NewName ++ ".boot"])), - ok; - _ -> - ok - end, - {ok, Tar} = erl_tar:open(Absname, [write, compressed]), - ok = erl_tar:add(Tar, "lib", []), - ok = erl_tar:add(Tar, "releases", []), - ok = erl_tar:close(Tar), - ok = file:set_cwd(Cwd), - ?CONSOLE("~s upgrade package created~n", [NameVer]). - -cleanup(NameVer) -> - ?DEBUG("Removing files needed for building the upgrade~n", []), - Files = [ - filename:join([".", NameVer ++ ".rel"]), - filename:join([".", NameVer ++ ".boot"]), - filename:join([".", NameVer ++ ".script"]), - filename:join([".", "relup"]) - ], - lists:foreach(fun(F) -> ok = file:delete(F) end, Files), - - ok = remove_dir_tree(?TMP). - -%% adapted from http://www.erlang.org/doc/system_principles/create_target.html -remove_dir_tree(Dir) -> - remove_all_files(".", [Dir]). -remove_all_files(Dir, Files) -> - lists:foreach(fun(File) -> - FilePath = filename:join([Dir, File]), - {ok, FileInfo, Link} = file_info(FilePath), - case {Link, FileInfo#file_info.type} of - {false, directory} -> - {ok, DirFiles} = file:list_dir(FilePath), - remove_all_files(FilePath, DirFiles), - file:del_dir(FilePath); - _ -> - file:delete(FilePath) - end - end, Files). - -file_info(Path) -> - case file:read_file_info(Path) of - {ok, Info} -> - {ok, Info, false}; - {error, enoent} -> - {ok, Info} = file:read_link_info(Path), - {ok, Info, true}; - Error -> - Error - end. |