2016-12-27 08:10:47 -08:00

1107 lines
25 KiB
J

cocurrent 'jpacman'
coinsert 'j'
BASELIB=: 'base library'
DATAMASK=: 0
HWNDP=: ''
ISGUI=: 0
ONLINE=: 0
PKGDATA=: 0 7$a:
SECTION=: ,<'All'
SYSNAME=: 'Package Manager'
TIMEOUT=: 60
WWWREV=: REV=: _1
IgnoreIOS=: 0 : 0
api/jni
data/dbman
data/ddmysql
data/odbc
demos/isigraph
demos/wd
demos/wdplot
games/minesweeper
games/nurikabe
games/pousse
games/solitaire
general/pcall
general/sfl
graphics/d3
graphics/fvj3
graphics/gl2
graphics/gnuplot
graphics/graph
graphics/graphviz
graphics/jturtle
graphics/print
graphics/tgsj
graphics/treemap
graphics/viewmat
gui/monthview
gui/util
ide/qt
math/tabula
media/animate
media/gdiplus
media/image3
media/ming
media/paint
media/wav
)
Ignore=: 3 : 0''
if. IFIOS do.
<;._2 IgnoreIOS
else.
<'ide/ios'
end.
)
3 : 0''
nc=. '--no-cache'
if. IFUNIX do.
if. UNAME-:'Darwin' do.
HTTPCMD=: 'curl -o %O --stderr %L -f -s -S %U'
elseif. do.
if. 'Android'-:UNAME do. nc=. ''
else. try. nc=. nc #~ 1 e. nc E. shell 'wget --help' catch. nc=. '' end. end.
HTTPCMD=: 'wget ',nc,' -O %O -o %L -t %t %U'
end.
else.
if. fexist exe=. jpath '~tools/ftp/wget.exe' do. exe=. '"',exe,'"' else. exe=. 'wget.exe' end.
try. nc=. nc #~ 1 e. nc E. shell exe,' --help' catch. nc=. '' end.
HTTPCMD=: exe,' ',nc,' -O %O -o %L -t %t -T %T %U'
if. fexist UNZIP=: jpath '~tools/zip/unzip.exe' do. UNZIP=: '"',UNZIP,'" -o -C ' else. UNZIP=: 'unzip.exe -o -C ' end.
end.
)
setfiles=: 3 : 0
ADDCFG=: jpath '~addons/config/'
makedir ADDCFG
ADDCFGIJS=: ADDCFG,'config.ijs'
JRELEASE=: ({.~i.&'/') 9!:14''
JRELEASE=: 'j802'
LIBTREE=: readtree''
if. IFIOS do.
WWW=: '/jal/',JRELEASE,'/'
else.
WWW=: 'http://www.jsoftware.com/jal/',JRELEASE,'/'
end.
LIBVER=: jpath '~system/config/version.txt'
)
destroy=: codestroy
CFGFILES=: <;._2 (0 : 0)
addons.txt
library.txt
release.txt
revision.txt
zips.txt
)
LIBDESC=: 0 : 0
This is the base library of scripts and labs included in the J system.
Reinstalling or upgrading this library will overwrite files in the system subdirectory. Restart J afterwards.
Files outside the system subdirectory, such as profile.ijs, are not changed.
)
cutjal=: ([: (* 4 > +/\) ' ' = ]) <;._1 ]
cutjsp=: ([: (* 5 > +/\) ' ' = ]) <;._1 ]
dquote=: '"'&, @ (,&'"')
fname=: #~ ([: *./\. ~:&'/')
hostcmd=: [: 2!:0 '(' , ] , ' || true)'"_
ischar=: 2 = 3!:0
rnd=: [ * [: <. 0.5 + %~
sep2under=: '/' & (I.@('_' = ])})
termLF=: , (0 < #) # LF -. {:
todel=: ; @: (DEL&, @ (,&(DEL,' ')) each)
tolist=: }. @ ; @: (LF&,@,@":each)
isjpkgout=: ((4 = {:) *. 2 = #)@$ *. 1 = L.
getintro=: ('...' ,~ -&3@[ {. ])^:(<#)
info=: smoutput
getnames=: 3 : 0
select. L.y
case. 0 do.
if. +/ BASELIB E. y do.
y=. (<BASELIB), cutnames y rplc BASELIB;''
else.
y=. cutnames y
end.
case. 1 do.
if. 2 = #$y do.
y=. {."1 y
else.
y=. ,y
end.
case. do.
'' return.
end.
y
)
curtailcaption=: 3 : 0
idx=. <_1;~I. 45<#&>{:"1 y
y=. (45&getintro &.> idx{y) idx}y
)
deltree=: 3 : 0
try.
res=. 0< ferase {."1 dirtree y
*./ res,0<ferase |.dirpath y
catch. 0 end.
)
fixjal=: 3 : 0
if. 2 > #y do. i.0 5 return. end.
m=. _2 |. (LF,')',LF) E. y
r=. _2 }. each m <;._2 y
x=. r i.&> LF
d=. (x+1) }.each r
r=. x {.each r
r=. 3 {."1 cutjal &> ' ' ,each r
x=. d i.&> LF
c=. x {.each d
d=. (x+1) }.each d
r,.c,.d
)
fixjal2=: 3 : 0
if. 2 > #y do. i.0 2 return. end.
cutjal &> ' ' ,each <;._2 y
)
fixjsp=: 3 : 0
if. 2 > #y do. i.0 5 return. end.
m=. _2 |. (LF,')',LF) E. y
r=. _2 }. each m <;._2 y
x=. r i.&> LF
d=. (x+1) }.each r
r=. x {.each r
r=. ' ' ,each r
(cutjsp &> r),.d
)
fixlib=: 3 : 0
msk=. (<LIBTREE) = 1 {"1 y
if. -. 1 e. msk do. ($0);'';0 return. end.
'ver fln siz'=. 2 4 5 { (msk i.1) { y
ver=. fixver ver
ver;fln;siz
)
fixlibs=: 3 : 0
if. 2 > #y do.
i.0 6 return.
end.
fls=. <;._2 y
ndx=. fls i.&> ' '
siz=. <&> 0 ". (ndx+1) }.&> fls
fls=. ndx {.each fls
zps=. <;._2 &> fls ,each '_'
pfm=. 3 {"1 zps
uname=. tolower UNAME
msk=. (uname -: ({.~ i.&'.')) &> pfm
if. 1 ~: +/msk do. msk=. 1,~ }:0*.msk end.
msk # zps,.fls,.siz
)
fixrev=: 3 : 0
{. _1 ". :: _1: y -. CRLF
)
fixupd=: 3 : 0
_1 ". :: _1: y -. CRLF
)
fixver=: 3 : 0
if. ischar y do.
y=. y -. CRLF
y=. 0 ". ' ' (I. y='.') } y
end.
3 {. y
)
fixvers=: 3 : 0
s=. $y
y=. ,y
3 {."1 [ 0 ". s $ ' ' (I. y e. './') } y
)
fmtjal=: 3 : 0
if. 0 = #y do. '' return. end.
r=. (4 {."1 y) ,each "1 ' ',LF2
r=. <@; "1 r
; r ,each ({:"1 y) ,each <')',LF
)
fmtjal2=: 3 : 0
if. 0 = #y do. '' return. end.
; (2 {."1 y) ,each "1 ' ',LF
)
fmtdep=: 3 : 0
}. ; ',' ,each a: -.~ <;._2 y
)
fmtjsp=: 3 : 0
if. 0 = #y do. '' return. end.
r=. (4 {."1 y) ,each "1 ' ',LF
r=. <@; "1 r
; r ,each ({:"1 y) ,each <')',LF
)
fmtlib=: 3 : 0
, 'q<.>,q<.>r<0>3.0,r<0>3.0' 8!:2 y
)
fmtver=: 3 : 0
if. 0=#y do. '' return. end.
if. ischar y do. y return. end.
}. ; '.' ,each ": each y
)
fmtverlib=: 3 : 0
fmtver y
)
fixzips=: 3 : 0
if. 2 > #y do. i.0 5 return. end.
fls=. <;._2 y
ndx=. fls i.&> ' '
siz=. 0 ". (ndx+1) }.&> fls
fls=. ndx {.each fls
zps=. <;._2 &> fls ,each '_'
zps=. zps,.fls,.<&>siz
pfm=. 3 {"1 zps
and=. (1 e. 'android'&E.) &> pfm
lnx=. (1 e. 'linux'&E.) &> pfm
mac=. (1 e. 'darwin'&E.) &> pfm
win=. mac < (1 e. 'win'&E.) &> pfm
select. UNAME
case. 'Win' do.
zps=. win # zps
case. 'Linux' do.
zps=. lnx # zps
case. 'Android' do.
zps=. and # zps
case. 'Darwin' do.
zps=. mac # zps
zps=. zps /: 3 {"1 zps
zps=. (~: 3 {."1 zps) # zps
end.
bit=. IF64 pick '64';'32'
pfm=. 3 {"1 zps
exc=. (1 e. bit&E.) &> pfm
zps=. zps \: exc
zps=. (~: 3 {."1 zps) # zps
fnm=. 0 {"1 zps
lnm=. 1 {"1 zps
ver=. 2 {"1 zps
pfm=. 3 {"1 zps
fls=. 4 {"1 zps
siz=. 5 {"1 zps
nms=. fnm ,each '/' ,each lnm
pfm=. (pfm i.&> '.') {.each pfm
ndx=. \: # &> pfm
sort ndx { nms,.pfm,.ver,.fls,.siz
)
fwritenew=: 4 : 0
if. x -: fread y do.
0
else.
x fwrite y
end.
)
platformparent=: 3 : 0
((< _2 {. y) e. '32';'64') # _2 }. y
)
makedir=: 1!:5 :: 0: @ <
plural=: 4 : 0
y,(1=x)#'s'
)
sizefmt=: 3 : 0
select. +/ y >: 1e3 1e4 1e6 1e7 1e9
case. 0 do.
(": y), ' byte',(y~:1)#'s'
case. 1 do.
(": 0.1 rnd y%1e3),' KB'
case. 2 do.
(": 1 rnd y%1e3),' KB'
case. 3 do.
(": 0.1 rnd y%1e6),' MB'
case. 4 do.
(": 1 rnd y%1e6),' MB'
case. do.
(": 0.1 rnd y%1e9),' GB'
end.
)
shellcmd=: 3 : 0
if. IFUNIX do.
hostcmd y
else.
spawn_jtask_ y
end.
)
subdir=: 3 : 0
if. 0=#y do. '' return. end.
a=. 1!:0 y,'*'
if. 0=#a do. '' return. end.
a=. a #~ '-d' -:"1 [ 1 4 {"1 > 4 {"1 a
(<y) ,each ({."1 a) ,each '/'
)
testaccess=: 3 : 0
f=. <jpath'~install/testaccess.txt'
try.
'' 1!:2 f
1!:55 f
1
catch.
0
end.
)
toupper1=: 3 : 0
if. 0=#y do. '' return. end.
(toupper {. y),tolower }. y
)
unzip=: 3 : 0
'file dir'=. dquote each y
e=. 'Unexpected unzip error'
if. IFUNIX do.
notarcmd=. 0
if. IFIOS +. UNAME-:'Android' do.
notarcmd=. _1-: 2!:0 ::_1: 'which tar'
if. (UNAME-:'Android') > '/mnt/sdcard'-:2!:5'EXTERNAL_STORAGE' do. notarcmd=. 1 end.
end.
if. notarcmd do.
require 'tar'
'file dir'=. y
if. (i.0 0) -: tar 'x';file;dir do. e=. '' end.
else.
e=. shellcmd 'tar ',((IFIOS+:UNAME-:'Android')#(('Darwin'-:UNAME){::'--no-same-owner --no-same-permissions';'-o -p')),' -xzf ',file,' -C ',dir
end.
if. (0~:FHS) *. ('root'-:2!:5'USER') +. (<2!:5'HOME') e. 0;'/var/root';'/root';'';,'/' do.
shellcmd ::0: 'find ',dir,' -type d -exec chmod a+rx {} \+'
shellcmd ::0: 'find ',dir,' -type f -exec chmod a+r {} \+'
end.
else.
dir=. (_2&}. , '/' -.~ _2&{.) dir
e=. shellcmd UNZIP,' ',file,' -d ',dir
end.
e
)
zipext=: 3 : 0
y, IFUNIX pick '.zip';'.tar.gz'
)
CHECKADDONSDIR=: 0 : 0
The addons directory does not exist and cannot be created.
It is set to: XX.
You can either create the directory manually, or set a new addons directory in your profile script.
)
CHECKASK=: 0 : 0
Read catalog from the server using Internet connection now?
Otherwise the local catalog is used offline.
)
CHECKONLINE=: 0 : 0
An active Internet connection is needed to install packages.
Continue only if you have an active Internet connection.
OK to continue?
)
CHECKREADSVR=: 0 : 0
An active Internet connection is needed to read the server repository catalog.
Continue only if you have an active Internet connection.
OK to continue?
)
CHECKSTARTUP=: 0 : 0
Setup repository using Internet connection now?
Select No if not connected, to complete setup later. After Setup is done, repository can be used offline with more options in Tools menu and Preferences dialog.
)
checkaccess=: 3 : 0
if. testaccess'' do. 1 return. end.
msg=. 'Unable to run Package Manager, as you do not have access to the installation folder.'
if. IFWIN do.
msg=. msg,LF2,'To run as Administrator, right-click the J icon, select Run as... and '
msg=. msg,'then select Adminstrator.'
end.
info msg
0
)
checkaddonsdir=: 3 : 0
d=. jpath '~addons'
if. # 1!:0 d do. 1 return. end.
if. 1!:5 :: 0: <d do.
log 'Created addons directory: ',d
1 return.
end.
info CHECKADDONSDIR rplc 'XX';d
0
)
getonline=: 3 : 0
ONLINE=: 2=3 2 wdquery y
)
getserver=: 3 : 0
'rc p'=. httpgetr (WWW,'revision.txt');2
if. rc do. 0 return. end.
write_lastupdate''
WWWREV=: fixrev p
if. WWWREV = REV do. 1 return. end.
refreshweb''
)
checkonline=: 3 : 0
select. ReadCatalog_j_
case. 0 do.
if. REV >: 0 do.
ONLINE=: 0
log 'Using local copy of catalog. See Preferences to change the setting.'
1 return.
end.
if. 0 = getonline 'Read Catalog from Server';CHECKREADSVR do. 0 return. end.
case. 1 do.
ONLINE=: 1
case. 2 do.
if. REV >: 0 do.
if. 0 = getonline 'Read Catalog from Server';CHECKASK do.
log 'Using local copy of catalog. See Preferences to change the setting.'
1 return.
end.
else.
if. 0 = getonline 'Setup Repository';CHECKSTARTUP do. 0 return. end.
end.
end.
log 'Updating server catalog...'
if. 0 = getserver'' do.
ONLINE=: 0
log 'Working offline using local copy of catalog.'
else.
log 'Done.'
end.
1
)
checkstatus=: 3 : 0
if. 0 e. #LIBS do. '' return. end.
msk=. masklib PKGDATA
ups=. pkgups''
libupm=. 1 e. msk *. ups
msk=. -. msk
addnim=. +/msk *. pkgnew''
addupm=. +/msk *. pkgups''
tot=. +/addnim,addupm,libupm
if. 0 = tot do.
'All available packages are installed and up to date.' return.
end.
select. 0 < addnim,addupm
case. 0 0 do.
msg=. 'Addons are up to date.'
case. 0 1 do.
msg=. 'All addons are installed, ',(":addupm), ' can be upgraded.'
case. 1 0 do.
if. addnim = <:#PKGDATA do.
msg=. 'No addons are installed.'
else.
j=. ' addon',('s'#~1<addnim),' are not yet installed.'
msg=. 'Installed addons are up to date, ',(":addnim),j
end.
case. 1 1 do.
j=. (":addupm),' addon',('s'#~1<addupm),' can be upgraded, '
msg=. j,(":addnim), ' addon',('s'#~1<addnim),' are not yet installed.'
end.
if. 0 = libupm do.
msg,LF,'The base library is up to date.'
else.
msg,LF,'There is a newer version of the base library.'
end.
)
write_lastupdate=: 3 : 0
txt=. ": 6!:0 ''
txt fwrites ADDCFG,'lastupdate.txt'
)
checklastupdate=: 3 : 0
if. _1 -: LASTUPD do.
res=. 'has never been updated.'
else.
res=. 'was last updated: ',timestamp LASTUPD
end.
'Local JAL information ',res
)
getdepend=: 3 : 0
if. 0 = #y do. y return. end.
dep=. getdepend_console 1{"1 y
PKGDATA #~ (1{"1 PKGDATA) e. dep
)
getdepend_console=: 3 : 0
if. 0 = #y do. y return. end.
old=. ''
ids=. 1{"1 PKGDATA
dep=. 6{"1 PKGDATA
res=. ~. <;._1 ; ',' ,each (ids e. y) # dep
whilst. -. res-:old do.
old=. res
res=. ~. res, <;._1 ; ',' ,each (ids e. res) # dep
end.
~. y, res -. a:, {."1 ADDINS
)
httpget=: 3 : 0
'f t'=. 2 {. (boxxopen y),a:
n=. f #~ -. +./\. f e. '=/'
p=. jpath '~temp/',n
q=. jpath '~temp/httpget.log'
t=. ":{.t,3
ferase p;q
fail=. 0
cmd=. HTTPCMD rplc '%O';(dquote p);'%L';(dquote q);'%t';t;'%T';(":TIMEOUT);'%U';f
if. IFIOS +. UNAME-:'Android' do.
require 'socket'
1!:55 ::0: <p
rc=. 0 [ e=. pp=. ''
whilst. 0 do.
'rc sk'=. sdsocket_jsocket_''
if. 0~:rc do. break. end.
rc=. sdconnect_jsocket_ sk;PF_INET_jsocket_;'23.21.67.48';80
if. 0~:rc do. break. end.
'rc sent'=. ('GET ',f,' HTTP/1.0',LF2) sdsend_jsocket_ sk;0
if. 0~:rc do. break. end.
while. ((0=rc)*.(*#m)) [[ 'rc m'=. sdrecv_jsocket_ sk,4096 do.
pp=. pp,m
end.
end.
sdclose_jsocket_ sk
if. 0~:rc do. fail=. 1
elseif. 1 -.@e. '200 OK' E. (20{.pp) do. fail=. 1 [ e=. ({.~ i.&LF) pp
elseif. #p1=. I. (CRLF,CRLF) E. 500{.pp do. p2=. 4
elseif. #p1=. I. LF2 E. 500{.pp do. p2=. 2
elseif. do. fail=. 1
end.
if. 0=fail do.
((p2+{.p1)}.pp) 1!:2 <p
else.
if. 0~:rc do. e=. sderror_jsocket_ rc end.
end.
elseif. do.
try.
e=. shellcmd cmd
catch. fail=. 1 end.
end.
if. fail +. 0 >: fsize p do.
if. _1-:msg=. freads q do.
if. 0=#msg=. e do. msg=. 'Unexpected error' end. end.
log 'Connection failed: ',msg
info 'Connection failed:',LF2,msg
r=. 1;msg
ferase p;q
else.
r=. 0;p
ferase q
end.
r
)
httpgetr=: 3 : 0
res=. httpget y
if. 0 = 0 pick res do.
f=. 1 pick res
txt=. freads f
ferase f
0;txt
end.
)
install=: 3 : 0
dat=. getdepend y
'num siz'=. pmview_applycounts dat
many=. 1 < num
msg=. 'Installing ',(":num),' package',many#'s'
msg=. msg,' of ',(many#'total '),'size ',sizefmt siz
log msg
installdo 1 {"1 dat
log 'Done.'
readlocal''
pacman_init 0
)
install_console=: 3 : 0
if. -. init_console 'server' do. '' return. end.
pkgs=. getnames y
if. pkgs -: ,<'all' do. pkgs=. 1 {"1 PKGDATA end.
pkgs=. pkgs (e. # [) ~. (<'base library'), ((pkgnew +. pkgups) # 1&{"1@]) PKGDATA
pkgs=. pkgs -. Ignore
pkgs=. getdepend_console pkgs
if. 0 = num=. #pkgs do. '' return. end.
many=. 1 < num
msg=. 'Installing ',(":num),' package',many#'s'
log msg
installdo pkgs
log 'Done.'
readlocal''
pacman_init ''
checkstatus''
)
upgrade_console=: 3 : 0
if. -. init_console 'read' do. '' return. end.
pkgs=. getnames y
if. (0=#pkgs) +. pkgs -: ,<'all' do. pkgs=. 1{"1 PKGDATA end.
pkgs=. pkgs (e. # [) (pkgups # 1&{"1@])PKGDATA
install_console pkgs
)
installdo=: 3 : 0
msk=. -. y e. <BASELIB
if. 0 e. msk do.
install_library''
end.
install_addon each msk # y
)
install_addon=: 3 : 0
ndx=. ({."1 ZIPS) i. <y
if. ndx = #ZIPS do. EMPTY return. end.
log 'Downloading ',y,'...'
f=. 3 pick ndx { ZIPS
'rc p'=. httpget WWW,'addons/',f
if. rc do. return. end.
log 'Installing ',y,'...'
msg=. unzip p;jpath'~addons'
ferase p
if. 0>:fsize jpath'~addons/',y,'/manifest.ijs' do.
log 'Extraction failed: ',msg
info 'Extraction failed:',LF2,msg
return.
end.
install_addins y
install_config y
)
install_addins=: 3 :0
fl=. ADDCFG,'addins.txt'
ins=. fixjal2 freads fl
ins=. ins #~ (<y) ~: {."1 ins
ndx=. ({."1 ADDONS) i. <y
ins=. sort ins, 2 {. ndx { ADDONS
(fmtjal2 ins) fwrites fl
)
install_config=: 3 : 0
ADDLABS=: ''
0!:0 :: ] < ADDCFGIJS
install_labs y
write_config''
)
install_labs=: 3 : 0
labs=. dirtree jpath '~addons/',y,'/*.ijt'
if. 0=#labs do. return. end.
pfx=. jpath '~addons/'
labs=. (#pfx) }.each {."1 labs
LABCATEGORY=: ''
0!:0 ::] <jpath '~addons/',y,'/manifest.ijs'
cat=. LABCATEGORY
if. 0 = #cat do.
cat=. toupper1 (y i. '/') {. y
end.
new=. labs ,each <' ',cat
txt=. sort ~. new,<;._2 ADDLABS
ndx=. 4 + (1 i.~ '.ijt'&E.) &> txt
msk=. fexist &> (<pfx) ,each ndx {.each txt
txt=. msk # txt
ADDLABS=: ; txt ,each LF
)
install_library=: 3 : 0
log 'Downloading base library...'
f=. 1 pick LIB
'rc p'=. httpget WWW,'library/',f
if. rc do. return. end.
log 'Installing base library...'
unzip p;jpath'~system'
ferase p
readlin''
)
write_config=: 3 : 0
txt=. 'NB. Addon configuration',LF2
txt=. txt,'ADDLABS=: 0 : 0',LF,ADDLABS,')',LF
txt fwrites ADDCFGIJS
)
show_console=: 4 : 0
if. -. init_console 'read' do. '' return. end.
select. x
case. 'search' do.
pkgs=. getnames y
res=. (pkgsearch pkgs) # 1 2 3 4 {"1 PKGDATA
res=. curtailcaption res
case. 'show' do.
pkgs=. getnames y
if. pkgs -: ,<'all' do. pkgs=. 1 {"1 PKGDATA end.
res=. (msk=. pkgshow pkgs) # 5 {"1 PKGDATA
if. #res do.
res=. ,((<'== '), &.> msk # 1 {"1 PKGDATA) ,. res
res=. (2#LF) joinstring (70&foldtext)&.> res
end.
case. 'showinstalled' do.
dat=. (isjpkgout y) {:: (1 2 3 4 {"1 PKGDATA);<y
res=. (-.@pkgnew # ])dat
res=. curtailcaption res
case. 'shownotinstalled' do.
dat=. (isjpkgout y) {:: (1 2 3 4 {"1 PKGDATA);<y
res=. (pkgnew # 0 2 3&{"1@])dat
res=. curtailcaption res
case. 'showupgrade' do.
dat=. (isjpkgout y) {:: (1 2 3 4 {"1 PKGDATA);<y
res=. (pkgups # ])dat
res=. curtailcaption res
case. 'status' do.
res=. checklastupdate''
res=. res,LF,checkstatus''
end.
res
)
showfiles_console=: 4 : 0
if. -. init_console 'read' do. '' return. end.
pkgs=. getnames y
pkgs=. pkgs (e. # [) (-.@pkgnew # 1&{"1@]) PKGDATA
pkgs=. pkgs -. <BASELIB
if. 0=#pkgs do. '' return. end.
fn=. (<'~addons/') ,&.> (pkgs) ,&.> <'/',x,(x-:'history'){::'.ijs';'.txt'
res=. res #~ msk=. (<_1) ~: res=. fread@jpath &.> fn
if. #res do.
res=. ,((<'== '), &.> msk#pkgs) ,. res
res=. (2#LF) joinstring res
end.
)
remove_console=: 3 : 0
if. -. init_console 'edit' do. '' return. end.
pkgs=. getnames y
if. pkgs -: ,<'all' do. pkgs=. 1 {"1 PKGDATA end.
pkgs=. pkgs (e. # [) (-.@pkgnew # 1&{"1@]) PKGDATA
pkgs=. pkgs -. <BASELIB
if. 0 = num=. #pkgs do. '' return. end.
many=. 1 < num
msg=. 'Removing ',(":num),' package',many#'s'
log msg
remove_addon each pkgs
log 'Done.'
readlocal''
pacman_init ''
checkstatus''
)
remove_addon=: 3 : 0
log 'Removing ',y,'...'
treepath=. jpath '~addons/',y
if. ((0 < #@dirtree) *. -.@deltree) treepath do.
nf=. #dirtree treepath
nd=. <: # dirpath treepath
nd=. nd + (tolower treepath) e. dirpath jpath '~addons/', '/' taketo y
msg=. (":nd),' directories and ',(":nf),' files not removed.'
log 'Remove failed: ',msg
info 'Remove failed:',LF2,msg
return.
end.
remove_addins y
remove_config y
)
remove_addins=: 3 :0
fl=. ADDCFG,'addins.txt'
ins=. fixjal2 freads fl
ins=. ins #~ (<y) ~: {."1 ins
(fmtjal2 ins) fwrites fl
)
remove_config=: 3 : 0
ADDLABS=: ''
0!:0 :: ] < ADDCFGIJS
remove_labs y
write_config''
)
remove_labs=: 3 : 0
txt=. <;._2 ADDLABS
txt=. txt #~ (<jpathsep y) ~: (#y)&{. each txt
ADDLABS=: ; txt ,each LF
)
LOG=: 1
log=: 3 : 0
if. LOG do. smoutput y end.
)
logstatus=: 3 : 0
if. ONLINE do.
log checkstatus''
end.
)
readlin=: 3 : 0
LIN=: 6 1 1 >. fixver freads LIBVER
)
readlocal=: 3 : 0
readlin''
ADDONS=: fixjal freads ADDCFG,'addons.txt'
ADDINS=: fixjal2 freads ADDCFG,'addins.txt'
REV=: fixrev freads ADDCFG,'revision.txt'
LASTUPD=: fixupd freads ADDCFG,'lastupdate.txt'
LIBS=: fixlibs freads ADDCFG,'library.txt'
LIB=: fixlib LIBS
ZIPS=: fixzips freads ADDCFG,'zips.txt'
EMPTY
)
readtree=: 3 : 0
f=. ADDCFG,'tree.txt'
tree=. LF -.~ freads f
if. -. (<tree) e. 'current';'stable' do.
tree=. 'current'
writetree tree
end.
tree
)
writetree=: 3 : 0
y fwritenew ADDCFG,'tree.txt'
)
refreshweb=: 3 : 0
if. 0 = refreshjal'' do. 0 return. end.
readlocal''
1
)
refreshaddins=: 3 : 0
ADDLABS=: ''
f=. ADDCFG,'addins.txt'
p=. jpath '~addons/'
sd=. ;subdir each subdir p
if. 0=#sd do.
'' fwrite f
write_config'' return.
end.
r=. s=. ''
for_d. sd do.
mft=. freads (>d),'manifest.ijs'
if. mft -: _1 do. continue. end.
VERSION=: ''
0!:100 mft
ver=. fmtver fixver VERSION
n=. }: (#p) }. >d
n=. '/' (I.n='\') } n
r=. r,n,' ',ver,LF
s=. s,d
end.
r fwritenew f
s=. (#p) }.each }: each s
install_labs each s
write_config''
)
refreshjal=: 3 : 0
'rc p'=. httpget WWW,zipext 'jal'
if. rc do. 0 return. end.
unzip p;ADDCFG
ferase p
if. *./ CFGFILES e. {."1 [ 1!:0 ADDCFG,'*' do. 1 return. end.
msg=. 'Could not install the local repository catalog.'
log msg
info msg
0
)
updatejal=: 3 : 0
log 'Updating server catalog...'
if. -. init_console 'server' do. '' return. end.
refreshaddins''
readlocal''
pacman_init''
res=. checklastupdate''
res,LF,checkstatus''
)
RELIBMSG=: 0 : 0
You are now using the XX base library, and can switch to the YY base library.
This will download the YY version of the base library and overwrite existing files. Addons are not affected.
OK to switch to the YY library?
)
prelib=: 3 : 0
old=. LIBTREE
new=. (('stable';'current') i. <old) pick 'current';'beta'
msg=. RELIBMSG rplc ('XX';'YY'),.old;new
if. 0 = query SYSNAME;msg do.
info 'Not done.' return.
end.
switchlibrary 1 pick new
)
switchlibrary=: 3 : 0
'' fwrite LIBVER
writetree LIBTREE=: y
refreshjal''
readlocal''
pmview_setpn''
)
masklib=: 3 : 0
(1 {"1 y) = <BASELIB
)
pkglater=: 3 : 0
dat=. (s=.isjpkgout y){:: PKGDATA;<y
if. 0=#dat do. $0 return. end.
loc=. fixvers > (2-s) {"1 dat
srv=. fixvers > (3-s) {"1 dat
{."1 /:"2 srv ,:"1 loc
)
pkgnew=: 3 : 0
dat=. (s=.isjpkgout y){:: PKGDATA;<y
if. 0=#dat do. $0 return. end.
0 = # &> (2-s) {"1 dat
)
pkgups=: pkgnew < pkglater
pkgsearch=: 3 : 0
+./"1 +./ y E."1&>"(0 _) 1{"1 PKGDATA
)
pkgshow=: 3 : 0
y e.~ 1{"1 PKGDATA
)
setshowall=: 3 : 0
PKGDATA=: (<y) (<(I.DATAMASK);0) } PKGDATA
)
setshownew=: 3 : 0
ndx=. I. DATAMASK *. pkgnew''
PKGDATA=: (<y) (<ndx;0) } PKGDATA
)
setshowups=: 3 : 0
ndx=. I. DATAMASK *. pkgups''
PKGDATA=: (<y) (<ndx;0) } PKGDATA
)
splitlib=: 3 : 0
if. 0=#y do.
2 $ <y return.
end.
msk=. masklib y
(msk#y) ; <(-.msk)#y
)
pacman_init=: 3 : 0
dat=. ADDONS #~ ({."1 ADDONS) e. {."1 ZIPS
if. 0=#dat do.
dat=. i.0 6
else.
ndx=. ({."1 ADDINS) i. {."1 dat
ins=. ndx { (1 {"1 ADDINS),<''
dat=. dat,.<''
dat=. 0 5 1 3 4 2 {"1 dat
dat=. ins 1 }"0 1 dat
end.
lib=. 'base library';(fmtver LIN);(fmtver 0 pick LIB);'base library scripts';LIBDESC;''
dat=. dat,lib
dat=. (<0),.dat
PKGDATA=: sort dat
nms=. 1 {"1 PKGDATA
nms=. ~. (nms i.&> '/') {.each nms
SECTION=: 'All';nms
DATAMASK=: (#PKGDATA) $ 1
EMPTY
)
init_console=: 3 : 0
if. 0=#y do. y=. 'read' end.
select. y
fcase. 'edit';'server' do.
if. -. checkaccess'' do. 0 return. end.
case. 'read' do.
if. -. checkaddonsdir'' do. 0 return. end.
setfiles''
readlocal''
pacman_init ''
res=. 1
case. do. res=. 0
end.
if. y -: 'server' do. res=. getserver'' end.
res
)
jpkg=: 4 : 0
select. x
case. 'history';'manifest' do.
x showfiles_console y
case. 'install' do.
install_console y
case. 'reinstall' do.
remove_console y
install_console y
case. 'remove' do.
remove_console y
case. ;:'show search showinstalled shownotinstalled showupgrade status' do.
x show_console y
case. 'update' do.
updatejal ''
case. 'upgrade' do.
upgrade_console y
case. do.
msg=. 'Valid options are:',LF
msg=. msg,' history, install, manifest, remove, reinstall, show, search,',LF
msg=. msg,' showinstalled, shownotinstalled, showupgrade, status,',LF
msg,' update, upgrade'
end.
)
do_install=: 3 : 0
if. -. checkaccess_jpacman_ '' do. return. end.
'update' jpkg ''
select. y
case. 'qtide';'angle' do.
'install' jpkg 'base library ide/qt'
getqtbin (y-:'angle'){::0;'angle'
msg=. (+/ 2 1 * IFWIN,'Darwin'-:UNAME) pick 'jqt.sh';'the jqt icon';'jqt.cmd'
smoutput 'exit and restart J using ',msg
case. 'all' do.
'install' jpkg 'all'
getqtbin 0
end.
)
do_getqtbin=: 3 : 0
smoutput 'Installing JQt binaries...'
if. 'Linux'-:UNAME do.
if. IFRASPI do.
z=. 'jqt-raspi-32.tar.gz'
else.
z=. 'jqt-',((y-:'slim') pick 'linux';'slim'),'-',(IF64 pick 'x86';'x64'),'.tar.gz'
end.
z1=. 'libjqt.so'
elseif. IFWIN do.
z=. 'jqt-win',((y-:'slim')#'slim'),'-',(IF64 pick 'x86';'x64'),'.zip'
z1=. 'jqt.dll'
elseif. do.
z=. 'jqt-mac',((y-:'slim')#'slim'),'-',(IF64 pick 'x86';'x64'),'.zip'
z1=. 'libjqt.dylib'
end.
'rc p'=. httpget_jpacman_ 'http://www.jsoftware.com/download/j802/qtide/',z
if. rc do.
smoutput 'unable to download: ',z return.
end.
d=. jpath '~bin'
if. IFWIN do.
unzip_jpacman_ p;d
else.
if. 'Linux'-:UNAME do.
if. (0~:FHS) do.
if. IFRASPI do.
d1=. '/usr/lib/arm-linux-gnueabihf/.'
elseif. IF64 do.
d1=. '/usr/lib/x86_64-linux-gnu/.'
elseif. do.
d1=. '/usr/lib/i386-linux-gnu/.'
end.
hostcmd_jpacman_ 'cd /usr/bin && tar --no-same-owner --no-same-permissions -xzf ',(dquote p), ' && chmod 755 jqt && chmod 644 libjqt.so && mv libjqt.so ',d1
else.
hostcmd_jpacman_ 'cd ',(dquote d),' && tar xzf ',(dquote p)
end.
else.
hostcmd_jpacman_ 'unzip -o ',(dquote p),' -d ',dquote d
end.
end.
ferase p
if. #1!:0 ((0~:FHS)*.'Linux'-:UNAME){::(jpath '~bin/',z1);'/usr/bin/jqt' do.
m=. 'Finished install of JQt binaries.'
else.
m=. 'Unable to install JQt binaries.',LF
m=. m,'check that you have write permission for: ',LF,((0~:FHS)*.'Linux'-:UNAME){::(jpath '~bin');'/usr/bin'
end.
smoutput m
if. 'Linux'-:UNAME do. return. end.
tgt=. jpath IFWIN{::'~install/Qt';'~bin/Qt5Core.dll'
y=. (*#y){::0;y
smoutput 'Installing Qt library...'
if. IFWIN do.
z=. 'qt53-',((y-:'angle') pick 'win';'angle'),'-',((y-:'slim')#'slim-'),(IF64 pick 'x86';'x64'),'.zip'
else.
z=. 'qt53-mac-',((y-:'slim')#'slim-'),(IF64 pick 'x86';'x64'),'.zip'
end.
'rc p'=. httpget_jpacman_ 'http://www.jsoftware.com/download/j802/qtlib/',z
if. rc do.
smoutput 'unable to download: ',z return.
end.
d=. jpath IFWIN{::'~install';'~bin'
if. IFWIN do.
unzip_jpacman_ p;d
else.
hostcmd_jpacman_ 'unzip -o ',(dquote p),' -d ',dquote d
end.
ferase p
if. #1!:0 tgt do.
m=. 'Finished install of Qt binaries.'
else.
m=. 'Unable to install Qt binaries.',LF
m=. m,'check that you have write permission for: ',LF,IFWIN{::tgt;jpath'~bin'
end.
smoutput m
)
jpkg_z_=: 3 : 0
'help' jpkg y
:
a=. conew 'jpacman'
res=. x jpkg__a y
destroy__a''
res
)
jpkgv_z_=: (<@:>"1@|:^:(0 ~: #))@jpkg