From 99e8034f0286abdae4d3f864e5531f86bc818546 Mon Sep 17 00:00:00 2001 From: ViViDboarder Date: Sat, 6 Jan 2018 09:04:44 -0800 Subject: [PATCH] New Archival targets to make it easier to deploy --- .gitignore | 1 + Makefile | 42 ++++++----- README.md | 1 + SFDashC/Info-Combined.plist | 19 ----- SFDashC/main.go | 2 +- SFDashC/structs.go | 7 +- archive-docset.sh | 58 ++++++++++++++++ package-docset.sh | 65 +++++++++++++----- resources/Archive_Readme.md | 13 ++++ {SFDashC => resources}/Info-Apex.plist | 0 {SFDashC => resources}/Info-Lightning.plist | 0 .../Info-Visualforce.plist | 0 resources/bolt-icon.png | Bin 0 -> 1482 bytes resources/bolt-icon@2x.png | Bin 0 -> 3111 bytes resources/cloud-icon.png | Bin 0 -> 4315 bytes resources/cloud-icon@2x.png | Bin 0 -> 2349 bytes {SFDashC => resources}/docset-apexcode.json | 0 {SFDashC => resources}/docset-lightning.json | 0 {SFDashC => resources}/docset-pages.json | 2 +- 19 files changed, 155 insertions(+), 55 deletions(-) delete mode 100644 SFDashC/Info-Combined.plist create mode 100755 archive-docset.sh create mode 100644 resources/Archive_Readme.md rename {SFDashC => resources}/Info-Apex.plist (100%) rename {SFDashC => resources}/Info-Lightning.plist (100%) rename SFDashC/Info-Pages.plist => resources/Info-Visualforce.plist (100%) create mode 100644 resources/bolt-icon.png create mode 100644 resources/bolt-icon@2x.png create mode 100644 resources/cloud-icon.png create mode 100644 resources/cloud-icon@2x.png rename {SFDashC => resources}/docset-apexcode.json (100%) rename {SFDashC => resources}/docset-lightning.json (100%) rename {SFDashC => resources}/docset-pages.json (86%) diff --git a/.gitignore b/.gitignore index 23dc435..0d075d0 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,6 @@ syntax-highlighter.min.css # External Go dependencies vendor/ build/ +archive/ .DS_Store docset-gen diff --git a/Makefile b/Makefile index b97099a..ee6a4a6 100644 --- a/Makefile +++ b/Makefile @@ -7,36 +7,44 @@ all: package-apex package-vf package-lightning vendor: dep ensure -docset-gen: vendor - go build -i -x -o docset-gen ./SFDashC/ - .PHONY: run-apex -run-apex: clean-index docset-gen - ./docset-gen apexcode +run-apex: clean-index vendor + go run ./SFDashC/*.go apexcode .PHONY: run-vf -run-vf: clean-index docset-gen - ./docset-gen pages +run-vf: clean-index vendor + go run ./SFDashC/*.go pages .PHONY: run-lightning -run-lightning: clean-index docset-gen - ./docset-gen lightning +run-lightning: clean-index vendor + go run ./SFDashC/*.go lightning +.PHONY: package-apex package-apex: run-apex - ./package-docset.sh Apex + ./package-docset.sh apexcode .PHONY: package-vf package-vf: run-vf - ./package-docset.sh Pages + ./package-docset.sh pages .PHONY: package-lightning package-lightning: run-lightning - ./package-docset.sh Lightning + ./package-docset.sh lightning -.PHONY: archive -archive: - find *.docset -depth 0 | xargs -I '{}' sh -c 'tar --exclude=".DS_Store" -czf "$$(echo {} | sed -e "s/\.[^.]*$$//" -e "s/ /_/").tgz" "{}"' - @echo "Archives created!" +.PHONY: archive-apex +archive-apex: package-apex + ./archive-docset.sh apexcode + +.PHONY: archive-vf +archive-vf: package-vf + ./archive-docset.sh pages + +.PHONY: archive-lightning +archive-lightning: package-lightning + ./archive-docset.sh lightning + +.PHONY: archive-all +archive-all: archive-apex archive-vf archive-lightning .PHONY: clean-index clean-index: @@ -49,10 +57,10 @@ clean-package: .PHONY: clean-archive clean-archive: rm -f *.tgz + rm -fr ./archive .PHONY: clean clean: clean-index clean-package clean-archive - rm -f docset-gen .PHONY: clean-build clean-build: diff --git a/README.md b/README.md index 3bd8998..e2b8d4d 100644 --- a/README.md +++ b/README.md @@ -20,3 +20,4 @@ To Do ----- - [ ] Now that new `ForceCascadeType` is available, some of the entries in `./SFDashC/supportedtypes.go` can be simplified + - [ ] Allow archiving of multiple versions and fetching pre-releases diff --git a/SFDashC/Info-Combined.plist b/SFDashC/Info-Combined.plist deleted file mode 100644 index 0b18d17..0000000 --- a/SFDashC/Info-Combined.plist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - CFBundleIdentifier - Salesforce - - CFBundleName - Salesforce - DocSetPlatformFamily - sfdc - isDashDocset - - dashIndexFilePath - index.htm - DashDocSetFallbackURL - https://developer.salesforce.com/docs/ - - diff --git a/SFDashC/main.go b/SFDashC/main.go index 43498b2..e02b1d8 100644 --- a/SFDashC/main.go +++ b/SFDashC/main.go @@ -167,7 +167,7 @@ func getEntryType(entry TOCEntry, parentType SupportedType) (SupportedType, erro } childType, err := lookupEntryType(entry) - if err != nil && parentType.CascadeType { + if err != nil && parentType.ShouldCascade() { childType = parentType.CreateChildType() err = nil } diff --git a/SFDashC/structs.go b/SFDashC/structs.go index a2e74ac..dbd8eb2 100644 --- a/SFDashC/structs.go +++ b/SFDashC/structs.go @@ -87,7 +87,7 @@ type SupportedType struct { // Should a namspace be prefixed to the database entry ShowNamespace bool // Indicates that this just contains other nodes and we don't want to index this node - // This is not hereditary + // This type will cascade down one level, but IsContainer itself is not hereditary IsContainer bool // Indicates that this and all nodes underneith should be hidden IsHidden bool @@ -127,6 +127,11 @@ func (suppType SupportedType) matchesID(id string) bool { return false } +// ShouldCascade returns if this type should be cascaded down to the child +func (suppType SupportedType) ShouldCascade() bool { + return suppType.ForceCascadeType || suppType.CascadeType || suppType.IsContainer +} + // CreateChildType returns a child type inheriting the current type func (suppType SupportedType) CreateChildType() SupportedType { // Reset values that do not cascade diff --git a/archive-docset.sh b/archive-docset.sh new file mode 100755 index 0000000..13f2a50 --- /dev/null +++ b/archive-docset.sh @@ -0,0 +1,58 @@ +#! /bin/bash +set -e + +files_dir=./resources +build_dir=./build +out_dir=. +archive_dir=./archive + +deliverable=$1 + +function get_friendly_name { + local deliverable=$1 + local name="$(tr '[:lower:]' '[:upper:]' <<< ${deliverable:0:1})${deliverable:1}" + case "$deliverable" in + "apexcode") + name="Apex" + ;; + "pages") + name="Visualforce" + ;; + esac + + echo $name +} + +function get_icon_name { + local icon="cloud-icon" + case "$1" in + "lightning") + icon="bolt-icon" + ;; + esac + echo $icon +} + +function main { + local name=$(get_friendly_name $deliverable) + local package="$out_dir/Salesforce $name.docset" + local archive_dir="$archive_dir/Salesforce_$name" + local archive="$archive_dir/Salesforce_$name.tgz" + local icon=$(get_icon_name $deliverable) + mkdir -p $archive_dir + + # Generate docset.json + version=$(cat $build_dir/$deliverable-version.txt) + cat $files_dir/docset-$deliverable.json | sed s/VERSION/$version/ > $archive_dir/docset.json + # Generated tgz archive + tar --exclude=".DS_Store" -czf "$archive" "$package" + # Copy icons + cp "$files_dir/$icon.png" "$archive_dir/icon.png" + cp "$files_dir/$icon@2x.png" "$archive_dir/icon@2x.png" + # Copy readme + cp "$files_dir/Archive_Readme.md" "$archive_dir/README.md" + + echo "Finished archive $archive" +} + +main diff --git a/package-docset.sh b/package-docset.sh index ffd381c..4160da4 100755 --- a/package-docset.sh +++ b/package-docset.sh @@ -1,24 +1,57 @@ #! /bin/bash set -e -files_dir=./SFDashC +files_dir=./resources build_dir=./build +out_dir=. -name=$1 -deliverable=$(echo $name | tr '[:upper:]' '[:lower:]') -if [ "$deliverable" == "apex" ]; then - deliverable="apexcode" -fi +deliverable=$1 -package="Salesforce $name.docset" -version=$(cat $build_dir/$deliverable-version.txt) +function get-friendly-name { + local deliverable=$1 + local name="$(tr '[:lower:]' '[:upper:]' <<< ${deliverable:0:1})${deliverable:1}" + case "$deliverable" in + "apexcode") + name="Apex" + ;; + "pages") + name="Visualforce" + ;; + esac -cat $files_dir/docset-$deliverable.json | sed s/VERSION/$version/ > $build_dir/docset-$deliverable.json -mkdir -p "$package/Contents/Resources/Documents" -cp -r $build_dir/atlas.en-us.$deliverable.meta "$package/Contents/Resources/Documents/" -cp $build_dir/*.html "$package/Contents/Resources/Documents/" -cp $build_dir/*.css "$package/Contents/Resources/Documents/" -cp $files_dir/Info-$name.plist "$package/Contents/Info.plist" -cp $build_dir/docSet.dsidx "$package/Contents/Resources/" + echo $name +} -echo "Finished building $package" +function get_icon_name { + local icon="cloud-icon" + case "$1" in + "lightning") + icon="bolt-icon" + ;; + esac + echo $icon +} + +function main { + local name=$(get-friendly-name $deliverable) + local package="$out_dir/Salesforce $name.docset" + local icon=$(get_icon_name $deliverable) + mkdir -p "$package/Contents/Resources/Documents" + + # Copy all meta HTML + cp -r $build_dir/atlas.en-us.$deliverable.meta "$package/Contents/Resources/Documents/" + # Copy HTML and CSS + cp $build_dir/$deliverable.html "$package/Contents/Resources/Documents/" + cp $build_dir/*.css "$package/Contents/Resources/Documents/" + # Copy plsit + cp $files_dir/Info-$name.plist "$package/Contents/Info.plist" + # Copy index + cp $build_dir/docSet.dsidx "$package/Contents/Resources/" + # Copy icons + cp "$files_dir/$icon.png" "$package/icon.png" + cp "$files_dir/$icon@2x.png" "$package/icon@2x.png" + + echo "Finished building $package" +} + +main diff --git a/resources/Archive_Readme.md b/resources/Archive_Readme.md new file mode 100644 index 0000000..e485aea --- /dev/null +++ b/resources/Archive_Readme.md @@ -0,0 +1,13 @@ +Salesforce Apex +=============== + +Created by [ViViDboarder](https://github.com/ViViDboarder) + +## Generation + +* Clone the repo for [docset-sfdc](https://github.com/ViViDboarder/docset-sfdc) +* Run `make` as described in the readme + +## Dependencies + +To avoid redundancy, those are listed on the readme for the other repo diff --git a/SFDashC/Info-Apex.plist b/resources/Info-Apex.plist similarity index 100% rename from SFDashC/Info-Apex.plist rename to resources/Info-Apex.plist diff --git a/SFDashC/Info-Lightning.plist b/resources/Info-Lightning.plist similarity index 100% rename from SFDashC/Info-Lightning.plist rename to resources/Info-Lightning.plist diff --git a/SFDashC/Info-Pages.plist b/resources/Info-Visualforce.plist similarity index 100% rename from SFDashC/Info-Pages.plist rename to resources/Info-Visualforce.plist diff --git a/resources/bolt-icon.png b/resources/bolt-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2041d905940a7e02bd84768e2bb6396436eda538 GIT binary patch literal 1482 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z%2~Ij105p zNH8!kp3V%3D2ed(u}aR*)k{ptPfFFR$SnY>W?-j zfNYSkzLEl1NlCV?QiN}Sf^&XRs)DJWiJpOy9hZWFf=y9MnpKdC8&o@xXRDM^Qc_^0 zuU}qXu2*iXmtT~wZ)j<0sc&GUZ)BtkRH0j3nOBlnp_^B%3^4>|j!SBBa#3bMNoIbY z0?6FNr2NtnTO}osMQ{LdXGvxn!lt}psJDO~)CbAv8|oS8W77uoEZlu4x+)S2Aez9w zf>>q)GRn%oC^Hr4T#%#e3~j*1qlh6KX9G0d%DE^tu_V7JBtJjL&Jh&W3ZA)%>8U}f zi7Ayf`sga4nr-w!-bM00By7Q=z`(WR0_ucClpWV5<+_gy49uCHE{-7@apB1 zO^M&<>t?R~ZeA<2mG#Fjeh$WWak(77e*EI=J$rA?>)jLQPh+;aBK<(K z`h)1MwBsFKA?+GBzgkr$>$GvdmpObUyYSP+iyMMgL_b;nx6Zme>rYBz!u`np)OpVr zUEK3w@xFtPU6Q}QHnW__qbO(g;n^1nw>F_q=8d22#V6?9exe}wrD}n<$_&$=cOHF^ z`O5U!=J(UB|1(NYcz;xwv{CL#R<2Kv?W@iQx9;ZF6fN&^W^?Z3W;$3|_k&^0#1EOT zmhN?wx?q`Fy>#Ki6p8s~^&TH_VQO1=c$4gx?@~K{gh=r2Tt1;Em;bp=`l<}o=HM$$ zqWK3Lk3M`daRdLyK|&Y)`myz}R2z*w?F4_hNODHI^LGXEn>^oA2b}aOlb~d>P-RSJx7H{1w(nrYy+1ytw;&$MQD^iPgg&ebxsLQ0JcSO5dZ)H literal 0 HcmV?d00001 diff --git a/resources/bolt-icon@2x.png b/resources/bolt-icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..df1e42180910be5b691003cb4ae9e8ef79afbd89 GIT binary patch literal 3111 zcmZuzc{~&T8+YW+HCK*mMnY`N*eppSs7U(BJlYTxhLqNcv5ZpB_kiEGT@EqD71ylvY zz)B!(P9P8n_eWmUv_TmBcBkL8K%O`pMiT-F3=9MZs({h{9uQ>>4GoAA6as}R(h-W- zAU~WNUeOOL^^4>$9s~;O?(c=cd7=G)2fS`q&;d9t5a=M#-{W_lzL>uQ`C)&nqU(d; z-7pYkuoC3|IpMsn{*&H+cpbd_a{H<3S1>reG@9r9QEoW2zbzW=qpf>TJD{PvW})b!=v08CpU5=ocHD>?{_x` z-rSl8KlI|2<*oe^{IumX>_c*-go2=||EY0y*szqXQ@jy~n~<8+A4|D#M+6(!;tQcQ zg;?=@>L%aclw)$*Sr>KMfrykns~`D_w+)Po=2k%xMX5)WhrXt{;$&ckRgVD4Hsfos zZwn*!u5*#DrZNkv=BTxi%{p&5lyQz$hZ;?fUkbh1<30#O6KM`S`v#YLii?;BBi>cc@#Wsl22bSj(M_)beDl_$VdyK5?O=WP12?^UUoYCHMrvNhRe* zDo+Qq;!;6^9VL)fc+V+&qHzl+n%{ewbT)l*bW|(A?az@*ROZ}I`7PE957JdZgY3>3 z^29ZWIbnY6$WWW~Qx0}k#!k5&mR8203tz|aLrtDjPv^}nWWJf_au4jUWapz4(rKoO zJBBb`b?+A$h-m_Ia^hM%CAL0p>8pK5)iTeEZGiV7r#=XV%78 z{$nzmI#B&m7Yt+ek9RV#5jz!OmnmprgDG1jp3cynTD-7qwccR&+zmX$vxo; zNeiv(GWXvRfO&Z0A)2BryV-6eJVhxK*l>BlDM@Wsd*Twi zuD`l#EXHip%!O-PXP)!q>5EUV1fYWW2QCm?%Jdr_kJxs#GJkX45+dpwd~>!j&%61x z6{vdL{h~9s98*j>p0X z<>HPNc_9_?U;IIecPm7>GWSRYeOe867%O93l1eu?p-aywx~RW;?h;#dNuXoQyt3a+3q!c@S`*l~c<_8Ce-bHZDl$6RKmfAGIcUp#3^6pE%r2kp_Nw=jwhXS=v4?lwyWY z1H=~Qq88e$G-@ZNGi%5f!-m&o??i@8_bSDK;v{YL+ctaZi})UMfl>koM}%9XCN_ZP zDkp>XM~^!3aj;PgOcJ6-McJmb)QNEcG8fe%ms<;1a%CxC;X$KjnL|raAEGr9e{;QmHqy> zY&ic>wpH-A;XT0l8Hp)sPm}+NLzWH-HZY@EpTVroy-{9s{>#ZC6!n1;GmFym1G0t$ z;*;|IM4cRJg5=EcMe!ADVQga9Jx4}s)81_j!bAh<@Zb)NCp9_BP(@!BDQ|~J6N5z` z7Thw6LUyouVCxp2A0a7vt>$!<_%ci3S9}-KEbf#E`Ps3K#IXupB-oN_L1ejn!&)J~m>tP=>L~w>XX} zHT!wdk0p`CmPN=$!(^$X^~?R#Z4mEE56q;vaXWjqH2#@-isO^3GKVb%5XhB3Warp` zA5S~gh-jn|#4j2q=T|cl`n@qs!9;#zdk&rtveF$2W2Z5kuT%I#eccZq4<+l8FRXOh zLEL>k5%kdAh)t4K#R1CMFjbmnd@ zr`?+KN3K=mS2D(wT#ZH&VpG?TwFsqxTNYDm7}%=nZnbglZwZ9V;;(gd+X#>twwCBwuw7> zyaQC|ml2NOe#7l?_~@dFXi>J@C?E`N;R{|bvSDI{f%DtW2hq? zLmBtppx8H!2HW*%T%%3UBh?;-@3vm=q08I~lH{GBj3P4Rg*V;xFXcW7lvJ9x+&F2k z-uX0Hge3#k5r-OJ%O9)IA@=_viJZaLeK`0?V_{c-2Da z?ZorSoZw7*c4%ogKfNVCeXlD&{rxMmw=_+8>}%EKFJdlL2^$&riIz^E2t1q6i5>NA7o2VW jv_j5&Ailj6KevDA%twZ*M3p`A!SCHz-vUvtcRBoDFL0c1 literal 0 HcmV?d00001 diff --git a/resources/cloud-icon.png b/resources/cloud-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..06765aa8d1b1acfef8d76de12ea014eb05015ba6 GIT binary patch literal 4315 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 E0huJxPXGV_ literal 0 HcmV?d00001 diff --git a/resources/cloud-icon@2x.png b/resources/cloud-icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee10e98c89130cfcf25bcad6002c983001da4c0 GIT binary patch literal 2349 zcmY*bc{~(c7ap(iVhY)}k!g6d&oC&)jAe{g0o zT@(0|yHjFgSGfld#mNc-XdDF3as$CIYc~o2ut$8?cmM@OGF*ULz;QekZ*Pb64h?}3 zd_ui^VbLLBTr>cHibitX5ML?*5*-puq9CKu&>sjS*WXRUp^zUCY7iQVw|9h?hmw6E z`Y=71Hq;mdfk04XA3vlM*78?5H$p>+RB9L!4v&h8f<@`VLdpJc9YaGyxHbZgKxlCh zT9gzs-@@p*a zfbiWLxDHGk{+pXyirUR09moN`T;*MUV;$5F7d}d;{Vgk&q;q|xuY6`Q1IW+ zW(=}psJH!*4Yz4BH_6gKMY>P2$Pgk45x{!Yz|KKEvvBpgF={tWhX!m}- zJQlRr7?=M66Q(n!CtE|GC@6p!iSVN%6J<#jX8VOHU{pndX?Z>@Rv0(BgQ{dO3^pUX>Ss6m z+Ka7H+9UU3w=K55p2uhy!@F^>qy|W<-P%C1&U4O36Q#H96q?nQ>NU?{u_*jLKUx2~ zQ^Hl-3C?5ib-jt49J|#n?Xf)F`q)dF2F~BJ2CL^xbeO;+AW2by(iTs;?EBjg2H{{0 zOy)Jfdd%qLiO18KJ*-QVS1sn9q3l)yz^(J6W&_YHC38G|b2*v3Z53*%dzvj3DcG9; zwzrm};F+Tuic3TfBM$9ZFQ3arc;p>Vvqa5w6yN~C!H z{zO%S^1k!=c2d{O%@6Y84S6z@YBe;cggt!&J2(E8+gQM<;YyyA9wCed=QH5(ZM5kL zKPDM4nlrrzvI1bJI42#RF^&noGrI=Nw3i8}O)oUmO!t@depPAa2nNO1V_HaSfnEo_ zR~7_$o0w!NaC!_F*(BLPOe{yxki`YQj8M6JU(gONxAE*w6~8Md##rE`ACyy|P`KQ> z)~r^Q^h~z8qc57z>~3Hl=l$hlaY1bI4P+^0Hnnm_URK=dbUDj^a4^-)r~Z`l9?WGH z)#=eZ zuBZC;!`l_7 zX7{S4#N-#bE6i~JTpUwM2d9eFQt|L<@4ruB)riUT+r_879xq|dx9J}n*^^N*-c9c? ze0N(}7Aw-ANhVARVqdXvbLJ#eXHS+S$?3Dx5?v!8cpl97u6xWUSqZj0Ce^spCsmgy zhP+}qA#rlQ2_+(z!!ms%RID|#Mr_bFTXuMcG}L|ad#dgl*{ zD)C)18v)47NP=2k@wLvo(=jSvUdCT~ayAklp0iv_LsUQZASx+Kh?egd-?N+&jJtdN zVtQj6cBlGW^85|dNcW-Cl(~VWZ#WxH#2|y5LGWspzNII@-{jI#vEkAYOSf*ar+5ra z*j8bhu-$tHx(-APTMMd%+#SezAX0A{B$TV(ynHAj_QMJ|60G>>!gFQYw2aHJ?aH@$ z4k>ZRRcUG$F)wiMW;hSMqu}z{WchQ0*zV6Z{ar_~n86V?S&vsycI22M*4@$k5N@dm zJW1OqYh&GoX*B<&SDgT&NgYG)-PvKU||?c1Gak zkzTpB+8i0zV1*)cwQ!9xsu$}9O{DD&odYE<&XPupqT&V~n9S1U(k7(C`GOwXsSn87 z%{fLgv;VMEP~;J-o}KD=FTqL&cMb2n5$1CvH~8zR33rJSzNHL7OLeb!HAU0Jk89&L z`@}`+`}I*9AF2a4q&)Y$iK5}B=mSRP= zIeuehpv%M)B%7-u5L0YhX|%4<8|OT;Ii8~yuId2~>csmMfoE6))xBusv&jyPVYra( zQ!{$www+1kh2$?ut*$8!_Ak2*)%gy0a6vYI9jk&lhT^F_&$_3+x2C}Qfq2Hka`CF1FhTG8R@ODllNN&vkH))Y zxn(Rmq%JTm=geL|wLlb!clOGsV|EppTZe|z^_Jvq{WH%2I!q!{Oe(C9|_eOL#d@n~4?amq!n zZCVA2#2GxC{_`9 zuyb=Iz5}-}k|-4<&GD1*kW1{11T8L(m0XQKKZ9Pj_kQOQXka*7