@ -11,8 +11,6 @@
- include ( " rebar.hrl " ) .
- include ( " rebar.hrl " ) .
- define ( DEFAULT_CDN , " https://s3.amazonaws.com/s3.hex.pm/tarballs " ) .
lock ( _ AppDir , Source ) - >
lock ( _ AppDir , Source ) - >
Source .
Source .
@ -27,7 +25,7 @@ needs_update(Dir, {pkg, _Name, Vsn}) ->
download ( TmpDir , Pkg = { pkg , Name , Vsn } , State ) - >
download ( TmpDir , Pkg = { pkg , Name , Vsn } , State ) - >
CDN = rebar_state : get ( State , rebar_packages_cdn , ? DEFAULT_CDN ) ,
CDN = rebar_state : get ( State , rebar_packages_cdn , ? DEFAULT_CDN ) ,
PackageDir = hex_package_dir ( CDN , State ) ,
PackageDir = rebar_packages : package_dir ( State ) ,
Package = binary_to_list ( < < Name / binary , " - " , Vsn / binary , " .tar " > > ) ,
Package = binary_to_list ( < < Name / binary , " - " , Vsn / binary , " .tar " > > ) ,
CachePath = filename : join ( PackageDir , Package ) ,
CachePath = filename : join ( PackageDir , Package ) ,
Url = string : join ( [ CDN , Package ] , " / " ) ,
Url = string : join ( [ CDN , Package ] , " / " ) ,
@ -53,10 +51,13 @@ serve_from_cache(TmpDir, CachePath, Pkg, State) ->
ok = erl_tar : extract ( { binary , Contents } , [ { cwd , TmpDir } , compressed ] ) ,
ok = erl_tar : extract ( { binary , Contents } , [ { cwd , TmpDir } , compressed ] ) ,
{ ok , true } ;
{ ok , true } ;
{ _ Bin , Chk , Chk } - >
{ _ Bin , Chk , Chk } - >
? DEBUG ( " Checksums: registry: ~p , pkg: ~p " , [ Chk , _ Bin ] ) ,
{ failed_extract , CachePath } ;
{ failed_extract , CachePath } ;
{ Chk , _ Reg , Chk } - >
{ Chk , _ Reg , Chk } - >
? DEBUG ( " Checksums: registry: ~p , pkg: ~p " , [ _ Reg , Chk ] ) ,
{ bad_registry_checksum , CachePath } ;
{ bad_registry_checksum , CachePath } ;
{ _ Bin , _ Reg , _ Tar } - >
{ _ Bin , _ Reg , _ Tar } - >
? DEBUG ( " Checksums: registry: ~p , pkg: ~p , meta: ~p " , [ _ Reg , _ Bin , _ Tar ] ) ,
{ bad_checksum , CachePath }
{ bad_checksum , CachePath }
end .
end .
@ -67,7 +68,7 @@ serve_from_download(TmpDir, CachePath, Package, ETag, Binary, State) ->
ETag - >
ETag - >
serve_from_cache ( TmpDir , CachePath , Package , State ) ;
serve_from_cache ( TmpDir , CachePath , Package , State ) ;
FileETag - >
FileETag - >
? DEBUG ( " Download ETag ~s doesn't match returned ETag ~s " , [ ETag , FileETag ] ) ,
? DEBUG ( " Downloaded file ~s ETag ~s doesn't match returned ETag ~s " , [ CachePath , ETag , FileETag ] ) ,
{ bad_download , CachePath }
{ bad_download , CachePath }
end .
end .
@ -84,28 +85,17 @@ checksums(Pkg, Files, Contents, Version, Meta, State) ->
Blob = < < Version / binary , Meta / binary , Contents / binary > > ,
Blob = < < Version / binary , Meta / binary , Contents / binary > > ,
< < X : 256 / big - unsigned > > = crypto : hash ( sha256 , Blob ) ,
< < X : 256 / big - unsigned > > = crypto : hash ( sha256 , Blob ) ,
BinChecksum = list_to_binary ( string : to_upper ( lists : flatten ( io_lib : format ( " ~64.16.0b " , [ X ] ) ) ) ) ,
BinChecksum = list_to_binary ( string : to_upper ( lists : flatten ( io_lib : format ( " ~64.16.0b " , [ X ] ) ) ) ) ,
RegistryChecksum = rebar_packages : registry_sum ( Pkg , State ) ,
RegistryChecksum = rebar_packages : registry_check sum ( Pkg , State ) ,
{ " CHECKSUM " , TarChecksum } = lists : keyfind ( " CHECKSUM " , 1 , Files ) ,
{ " CHECKSUM " , TarChecksum } = lists : keyfind ( " CHECKSUM " , 1 , Files ) ,
{ BinChecksum , RegistryChecksum , TarChecksum } .
{ BinChecksum , RegistryChecksum , TarChecksum } .
make_vsn ( _ ) - >
make_vsn ( _ ) - >
{ error , " Replacing version of type pkg not supported. " } .
{ error , " Replacing version of type pkg not supported. " } .
% % Use the shared hex package directory unless a non - default package repo is used
hex_package_dir ( ? DEFAULT_CDN , _ ) - >
filename : join ( [ rebar_dir : home_dir ( ) , " .hex " , " packages " ] ) ;
hex_package_dir ( CDN , State ) - >
CacheDir = rebar_dir : global_cache_dir ( State ) ,
{ ok , { _ , _ , Host , _ , _ , _ } } = http_uri : parse ( CDN ) ,
CDNPath = filename : join ( lists : reverse ( string : tokens ( Host , " . " ) ) ) ,
PackageDir = filename : join ( [ CacheDir , " hex " , CDNPath , " packages " ] ) ,
ok = filelib : ensure_dir ( filename : join ( PackageDir , " placeholder " ) ) ,
PackageDir .
request ( Url , ETag ) - >
request ( Url , ETag ) - >
case httpc : request ( get , { Url , [ { " if-none-match " , ETag } | | ETag =/= false ] } ,
case httpc : request ( get , { Url , [ { " if-none-match " , ETag } | | ETag =/= false ] } ,
[ { relaxed , true } ] ,
[ { body_format , binary } ] ) of
[ { relaxed , true } ] ,
[ { body_format , binary } ] ) of
{ ok , { { _ Version , 200 , _ Reason } , Headers , Body } } - >
{ ok , { { _ Version , 200 , _ Reason } , Headers , Body } } - >
? DEBUG ( " Successfully downloaded ~s " , [ Url ] ) ,
? DEBUG ( " Successfully downloaded ~s " , [ Url ] ) ,
{ " etag " , ETag1 } = lists : keyfind ( " etag " , 1 , Headers ) ,
{ " etag " , ETag1 } = lists : keyfind ( " etag " , 1 , Headers ) ,