From 87a234b45b2a118f67f6d4147fce9a1fadd27f47 Mon Sep 17 00:00:00 2001 From: Roland Heyder Date: Tue, 22 Nov 2022 18:20:48 +0100 Subject: [PATCH 1/3] Wiki download changes Using built-in TCP/IP and HTTP protocol via manual request headers. --- source/global/IDEsettings.bas | 5 +- source/ide/wiki/wiki_methods.bas | 99 ++++++++++++++++++++++++-------- 2 files changed, 79 insertions(+), 25 deletions(-) diff --git a/source/global/IDEsettings.bas b/source/global/IDEsettings.bas index faca26d15..b4e8bd908 100644 --- a/source/global/IDEsettings.bas +++ b/source/global/IDEsettings.bas @@ -226,10 +226,11 @@ IF result = 0 OR idedebuginfo <> -1 THEN END IF Include_GDB_Debugging_Info = idedebuginfo -wikiBaseAddress$ = "https://qb64phoenix.com/qb64wiki" +wikiBaseAddress$ = "http://qb64phoenix.com/qb64wiki" IF ReadConfigSetting(generalSettingsSection$, "WikiBaseAddress", value$) THEN wikiBaseAddress$ = value$ -ELSE WriteConfigSetting generalSettingsSection$, "WikiBaseAddress", wikiBaseAddress$ +ELSE + WriteConfigSetting generalSettingsSection$, "WikiBaseAddress", wikiBaseAddress$ END IF UseGuiDialogs = ReadWriteBooleanSettingValue%(generalSettingsSection$, "UseGuiDialogs", -1) diff --git a/source/ide/wiki/wiki_methods.bas b/source/ide/wiki/wiki_methods.bas index e9eb1f0bc..a9b247089 100644 --- a/source/ide/wiki/wiki_methods.bas +++ b/source/ide/wiki/wiki_methods.bas @@ -38,22 +38,22 @@ FUNCTION Wiki$ (PageName$) 'Read cached wiki page (download, if not yet cached) END IF 'Check for curl - IF _SHELLHIDE("curl --version >NUL") <> 0 THEN - a$ = CHR$(10) + "{{PageInternalError}}" + CHR$(10) - IF PageName$ = "Initialize" THEN - a$ = a$ + "To be able to initialize the help system, " - ELSEIF PageName$ = "Update All" THEN - a$ = a$ + "To be able to update the help pages from the online Wiki, " - ELSE - a$ = a$ + "The requested help page is not yet cached locally. To download the help page from the online Wiki, " - END IF - a$ = a$ + "a tool called ''curl'' is required, but it wasn't found on your system." + CHR$(10) + CHR$(10) - a$ = a$ + "* To get ''curl'', visit the official [https://curl.se/download.html download page]." + CHR$(10) - a$ = a$ + "** Grab the latest ''binary'' archive available for your system." + CHR$(10) - a$ = a$ + "** Unpack and drop the ''curl'' executable into the '''qb64pe''' folder." + CHR$(10) - a$ = a$ + "** If there's a file named ''curl-ca-bundle.crt'' or similar, drop it into the '''qb64pe''' folder too." + CHR$(10) - Wiki$ = a$: EXIT FUNCTION - END IF + 'IF _SHELLHIDE("curl --version >NUL") <> 0 THEN + ' a$ = CHR$(10) + "{{PageInternalError}}" + CHR$(10) + ' IF PageName$ = "Initialize" THEN + ' a$ = a$ + "To be able to initialize the help system, " + ' ELSEIF PageName$ = "Update All" THEN + ' a$ = a$ + "To be able to update the help pages from the online Wiki, " + ' ELSE + ' a$ = a$ + "The requested help page is not yet cached locally. To download the help page from the online Wiki, " + ' END IF + ' a$ = a$ + "a tool called ''curl'' is required, but it wasn't found on your system." + CHR$(10) + CHR$(10) + ' a$ = a$ + "* To get ''curl'', visit the official [https://curl.se/download.html download page]." + CHR$(10) + ' a$ = a$ + "** Grab the latest ''binary'' archive available for your system." + CHR$(10) + ' a$ = a$ + "** Unpack and drop the ''curl'' executable into the '''qb64pe''' folder." + CHR$(10) + ' a$ = a$ + "** If there's a file named ''curl-ca-bundle.crt'' or similar, drop it into the '''qb64pe''' folder too." + CHR$(10) + ' Wiki$ = a$: EXIT FUNCTION + 'END IF 'Download message (Status Bar) IF Help_Recaching = 0 THEN @@ -68,19 +68,23 @@ FUNCTION Wiki$ (PageName$) 'Read cached wiki page (download, if not yet cached) END IF 'Url query and output arguments for curl - url$ = CHR$(34) + wikiBaseAddress$ + "/index.php?title=" + PageName2$ + "&action=edit" + CHR$(34) + 'url$ = CHR$(34) + wikiBaseAddress$ + "/index.php?title=" + PageName2$ + "&action=edit" + CHR$(34) + url$ = wikiBaseAddress$ + "/index.php?title=" + PageName2$ + "&action=edit" + IF LCASE$(LEFT$(url$, 8)) = "https://" THEN url$ = MID$(url$, 9) + IF LCASE$(LEFT$(url$, 7)) = "http://" THEN url$ = MID$(url$, 8) outputFile$ = Cache_Folder$ + "/" + PageName3$ + ".txt" 'Wikitext delimiters s1$ = "name=" + CHR$(34) + "wpTextbox1" + CHR$(34) + ">" s2$ = "" 'Download page using curl - SHELL _HIDE "curl --silent -o " + CHR$(34) + outputFile$ + CHR$(34) + " " + url$ + 'SHELL _HIDE "curl --silent -o " + CHR$(34) + outputFile$ + CHR$(34) + " " + url$ fh = FREEFILE - OPEN outputFile$ FOR BINARY AS #fh 'get new content - a$ = SPACE$(LOF(fh)) - GET #fh, 1, a$ - CLOSE #fh + 'OPEN outputFile$ FOR BINARY AS #fh 'get new content + 'a$ = SPACE$(LOF(fh)) + 'GET #fh, 1, a$ + 'CLOSE #fh + a$ = wikiDLPage$(url$, 15) 'Find wikitext in the downloaded page s1 = INSTR(a$, s1$) @@ -121,7 +125,7 @@ FUNCTION Wiki$ (PageName$) 'Read cached wiki page (download, if not yet cached) CLOSE #fh ELSE 'Delete page, if empty or corrupted (force re-download on next access) - KILL outputFile$ + 'KILL outputFile$ a$ = CHR$(10) + "{{PageInternalError}}" + CHR$(10) +_ "* Either the requested page is not yet available in the Wiki," + CHR$(10) +_ "* or the download from Wiki failed and corrupted the page data." + CHR$(10) +_ @@ -1068,6 +1072,55 @@ FUNCTION wikiSafeName$ (page$) 'create a unique name for both case sensitive & i wikiSafeName$ = page$ + "_" + ext$ END FUNCTION +FUNCTION wikiDLPage$ (url$, timeout!) +'--- prepare args --- +spo% = INSTR(url$, "/") +hst$ = LEFT$(url$, spo% - 1) +obj$ = MID$(url$, spo%) +eol$ = CHR$(13) + CHR$(10) +wikiDLPage$ = "" +'--- open client --- +ch& = _OPENCLIENT("TCP/IP:80:" + hst$) +IF ch& = 0 THEN EXIT FUNCTION +'--- send request --- +req$ = "GET " + obj$ + " HTTP/1.1" + eol$ +req$ = req$ + "Host: " + hst$ + eol$ +req$ = req$ + "User-Agent: QB64-PE/" + Version$ + " (qb64phoenix.com)" + eol$ +req$ = req$ + "Cache-Control: no-cache" + eol$ +req$ = req$ + eol$ +PUT ch&, , req$ +res$ = "" +'--- wait for response --- +st! = TIMER +DO + _DELAY 0.05 + GET ch&, , rec$ + IF LEN(rec$) > 0 THEN st! = TIMER + res$ = res$ + rec$ + IF LEN(res$) < 15 OR LEFT$(res$, 15) = "HTTP/1.1 200 OK" THEN + cl% = INSTR(res$, "Content-Length:") + IF cl% > 0 THEN + cle% = INSTR(cl%, res$, eol$) + IF cle% > 0 THEN + le& = VAL(MID$(res$, cl% + 15, cle% - cl% - 14)) + das% = INSTR(cle%, res$, eol$ + eol$) + IF das% > 0 THEN + das% = das% + 4 + IF (LEN(res$) - das% + 1) = le& THEN + CLOSE ch& + wikiDLPage$ = MID$(res$, das%, le&) + EXIT FUNCTION + END IF + END IF + END IF + END IF + ELSE + timeout! = 0 + END IF +LOOP UNTIL TIMER > st! + timeout! +CLOSE ch& +END FUNCTION + FUNCTION wikiLookAhead$ (a$, i, token$) 'Prefetch further wiki text wikiLookAhead$ = "": IF i >= LEN(a$) THEN EXIT FUNCTION j = INSTR(i, a$, token$) From 81d4983219fb03f48095a54af4c4e8bdfbf6fcc0 Mon Sep 17 00:00:00 2001 From: Roland Heyder Date: Tue, 22 Nov 2022 18:22:10 +0100 Subject: [PATCH 2/3] Wiki update refactoring Some changes/fixes in the update flow. --- source/ide/ide_methods.bas | 69 +++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 2bc1c9c8a..1534de1d1 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -5464,7 +5464,7 @@ FUNCTION ide2 (ignore) IF menu$(m, s) = "Update All #Pages..." THEN PCOPY 2, 0 - q$ = ideyesnobox("Update Help", "This can take up to 20 minutes.\nRedownload all cached help content from the wiki?") + q$ = ideyesnobox("Update Help", "This can take up to 15 minutes.\nRedownload all cached help content from the wiki?") PCOPY 2, 0 IF q$ = "Y" THEN Help_Recaching = 1: Help_IgnoreCache = 1 @@ -18820,6 +18820,7 @@ FUNCTION ideupdatehelpbox 'update steps SELECT CASE UpdateStep CASE 1 + FullMessage$(1) = "Preparing help update..." FullMessage$(2) = "Generating list of cached content..." CASE 2 FullMessage$(2) = "Adding core help pages to list..." @@ -18844,7 +18845,6 @@ FUNCTION ideupdatehelpbox maxprogresswidth = 52 'arbitrary percentage = INT(n / c * 100) percentagechars = INT(maxprogresswidth * n / c) - 'percentageMsg$ = "[" + STRING$(percentagechars, 254) + SPACE$(maxprogresswidth - percentagechars) + "]" + STR$(percentage) + "%" percentageMsg$ = STRING$(percentagechars, 219) + STRING$(maxprogresswidth - percentagechars, 176) + STR$(percentage) + "%" _PRINTSTRING (p.x + (p.w \ 2 - LEN(percentageMsg$) \ 2) + 1, p.y + 4), percentageMsg$ ELSEIF UpdateStep = 6 THEN @@ -18908,29 +18908,44 @@ FUNCTION ideupdatehelpbox SELECT CASE UpdateStep CASE 1 'Create a list of all files to be recached + st# = TIMER(0.001) IF Help_Recaching < 2 THEN f$ = CHR$(0) + idezfilelist$("internal/help", 2, "*.txt") + CHR$(0) IF LEN(f$) = 2 THEN f$ = CHR$(0) ELSE f$ = CHR$(0) 'no dir scan for 'qb64pe -u' (build time update) END IF - - 'Prepend core pages to list - f$ = CHR$(0) + "Keyword_Reference_-_By_usage.txt" + f$ - f$ = CHR$(0) + "QB64_Help_Menu.txt" + f$ - f$ = CHR$(0) + "QB64_FAQ.txt" + f$ + et# = TIMER(0.001) - st#: IF et# < 0 THEN et# = et# + 86400 + IF 1.25 - et# > 0 THEN _DELAY 1.25 - et# UpdateStep = UpdateStep + 1 CASE 2 + 'Prepend core pages to list (if not already in list) + st# = TIMER(0.001) + PageName2$ = "QB64_FAQ.txt" + IF INSTR(f$, CHR$(0) + PageName2$ + CHR$(0)) = 0 THEN f$ = CHR$(0) + PageName2$ + f$ + PageName2$ = "QB64_Help_Menu.txt" + IF INSTR(f$, CHR$(0) + PageName2$ + CHR$(0)) = 0 THEN f$ = CHR$(0) + PageName2$ + f$ + PageName2$ = "ERROR_Codes.txt" + IF INSTR(f$, CHR$(0) + PageName2$ + CHR$(0)) = 0 THEN f$ = CHR$(0) + PageName2$ + f$ + PageName2$ = "Keywords_currently_not_supported_by_QB64.txt" + IF INSTR(f$, CHR$(0) + PageName2$ + CHR$(0)) = 0 THEN f$ = CHR$(0) + PageName2$ + f$ + PageName2$ = "Keyword_Reference_-_By_usage.txt" + IF INSTR(f$, CHR$(0) + PageName2$ + CHR$(0)) = 0 THEN f$ = CHR$(0) + PageName2$ + f$ + et# = TIMER(0.001) - st#: IF et# < 0 THEN et# = et# + 86400 + IF 1.25 - et# > 0 THEN _DELAY 1.25 - et# UpdateStep = UpdateStep + 1 CASE 3 'Download and PARSE alphabetical index to build required F1 help links - FullMessage$(1) = "Regenerating keyword list..." + st# = TIMER(0.001) a$ = Wiki$("Keyword Reference - Alphabetical") IF INSTR(a$, "{{PageInternalError}}") > 0 THEN ideupdatehelpbox = 1: EXIT DO WikiParse a$ 'update links.bin and check for plugin templates + et# = TIMER(0.001) - st#: IF et# < 0 THEN et# = et# + 86400 + IF 1.25 - et# > 0 THEN _DELAY 1.25 - et# UpdateStep = UpdateStep + 1 CASE 4 'Add all linked pages to download list (if not already in list) + st# = TIMER(0.001) fh = FREEFILE OPEN "internal\help\links.bin" FOR INPUT AS #fh DO UNTIL EOF(fh) @@ -18952,39 +18967,32 @@ FUNCTION ideupdatehelpbox END SELECT NEXT PageName2$ = PageName2$ + ".txt" - IF INSTR(f$, CHR$(0) + PageName2$ + CHR$(0)) = 0 THEN - f$ = f$ + PageName2$ + CHR$(0) - END IF + IF INSTR(f$, CHR$(0) + PageName2$ + CHR$(0)) = 0 THEN f$ = f$ + PageName2$ + CHR$(0) END IF END IF LOOP CLOSE #fh - - 'Redownload all listed files - IF f$ <> CHR$(0) THEN - c = 0 'count files to download - FOR x = 2 TO LEN(f$) - IF ASC(f$, x) = 0 THEN c = c + 1 - NEXT - c = c - 1 - - f$ = RIGHT$(f$, LEN(f$) - 1) - z$ = CHR$(0) - n = 0 - ELSE - GOTO stoprecache - END IF + 'count all listed files to download + c = 0 + FOR x = 2 TO LEN(f$) + IF ASC(f$, x) = 0 THEN c = c + 1 + NEXT + 'set start conditions + f$ = RIGHT$(f$, LEN(f$) - 1) + n = 0 FullMessage$(2) = "" + et# = TIMER(0.001) - st#: IF et# < 0 THEN et# = et# + 86400 + IF 1.25 - et# > 0 THEN _DELAY 1.25 - et# UpdateStep = UpdateStep + 1 CASE 5 + 'Redownload all listed files IF LEN(f$) > 0 THEN - x2 = INSTR(f$, z$) - f2$ = LEFT$(f$, x2 - 1): f$ = RIGHT$(f$, LEN(f$) - x2) - + x2 = INSTR(f$, CHR$(0)) + f2$ = LEFT$(f$, x2 - 1): f$ = MID$(f$, x2 + 1) IF RIGHT$(f2$, 4) = ".txt" THEN f2$ = LEFT$(f2$, LEN(f2$) - 4) n = n + 1 - FullMessage$(2) = "Page title: " + f2$ + FullMessage$(2) = "Page: " + f2$ ignore$ = Wiki$(f2$) WikiParse ignore$ 'just check for plugin templates END IF @@ -18992,7 +19000,6 @@ FUNCTION ideupdatehelpbox UpdateStep = UpdateStep + 1 END IF CASE 6 - stoprecache: IF Help_Recaching = 2 THEN EXIT DO FullMessage$(1) = "All pages updated." FullMessage$(2) = "" From 65371dad0ff7dc180aab9548ec75652855a293b2 Mon Sep 17 00:00:00 2001 From: Roland Heyder Date: Wed, 23 Nov 2022 22:54:04 +0100 Subject: [PATCH 3/3] Wiki download finalized - restore default back to https: - ask user for fallback, if required - final adjustments for new behavior --- source/global/IDEsettings.bas | 2 +- source/ide/ide_methods.bas | 3 +- source/ide/wiki/wiki_methods.bas | 69 ++++++++++++++++---------------- source/qb64pe.bas | 2 +- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/source/global/IDEsettings.bas b/source/global/IDEsettings.bas index b4e8bd908..a3f8d2207 100644 --- a/source/global/IDEsettings.bas +++ b/source/global/IDEsettings.bas @@ -226,7 +226,7 @@ IF result = 0 OR idedebuginfo <> -1 THEN END IF Include_GDB_Debugging_Info = idedebuginfo -wikiBaseAddress$ = "http://qb64phoenix.com/qb64wiki" +wikiBaseAddress$ = "https://qb64phoenix.com/qb64wiki" IF ReadConfigSetting(generalSettingsSection$, "WikiBaseAddress", value$) THEN wikiBaseAddress$ = value$ ELSE diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 1534de1d1..e12c19e6e 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -5464,7 +5464,7 @@ FUNCTION ide2 (ignore) IF menu$(m, s) = "Update All #Pages..." THEN PCOPY 2, 0 - q$ = ideyesnobox("Update Help", "This can take up to 15 minutes.\nRedownload all cached help content from the wiki?") + q$ = ideyesnobox("Update Help", "This can take up to 10 minutes.\nRedownload all cached help content from the wiki?") PCOPY 2, 0 IF q$ = "Y" THEN Help_Recaching = 1: Help_IgnoreCache = 1 @@ -18994,6 +18994,7 @@ FUNCTION ideupdatehelpbox n = n + 1 FullMessage$(2) = "Page: " + f2$ ignore$ = Wiki$(f2$) + IF INSTR(ignore$, "{{PageInternalError}}") > 0 THEN ideupdatehelpbox = 1: EXIT DO WikiParse ignore$ 'just check for plugin templates END IF ELSE diff --git a/source/ide/wiki/wiki_methods.bas b/source/ide/wiki/wiki_methods.bas index a9b247089..fb0cafd7c 100644 --- a/source/ide/wiki/wiki_methods.bas +++ b/source/ide/wiki/wiki_methods.bas @@ -1,6 +1,7 @@ FUNCTION Back2BackName$ (a$) IF a$ = "Keyword Reference - Alphabetical" THEN Back2BackName$ = "Alphabetical": EXIT FUNCTION IF a$ = "Keyword Reference - By usage" THEN Back2BackName$ = "By Usage": EXIT FUNCTION + IF a$ = "Keywords currently not supported by QB64" THEN Back2BackName$ = "Unsupported": EXIT FUNCTION IF a$ = "QB64 Help Menu" THEN Back2BackName$ = "Help": EXIT FUNCTION IF a$ = "QB64 FAQ" THEN Back2BackName$ = "FAQ": EXIT FUNCTION Back2BackName$ = a$ @@ -70,8 +71,6 @@ FUNCTION Wiki$ (PageName$) 'Read cached wiki page (download, if not yet cached) 'Url query and output arguments for curl 'url$ = CHR$(34) + wikiBaseAddress$ + "/index.php?title=" + PageName2$ + "&action=edit" + CHR$(34) url$ = wikiBaseAddress$ + "/index.php?title=" + PageName2$ + "&action=edit" - IF LCASE$(LEFT$(url$, 8)) = "https://" THEN url$ = MID$(url$, 9) - IF LCASE$(LEFT$(url$, 7)) = "http://" THEN url$ = MID$(url$, 8) outputFile$ = Cache_Folder$ + "/" + PageName3$ + ".txt" 'Wikitext delimiters s1$ = "name=" + CHR$(34) + "wpTextbox1" + CHR$(34) + ">" @@ -84,7 +83,11 @@ FUNCTION Wiki$ (PageName$) 'Read cached wiki page (download, if not yet cached) 'a$ = SPACE$(LOF(fh)) 'GET #fh, 1, a$ 'CLOSE #fh - a$ = wikiDLPage$(url$, 15) + IF PageName$ = "Initialize" OR PageName$ = "Update All" THEN + a$ = "" 'dummy pages (for error display) + ELSE + a$ = wikiDLPage$(url$, 15) + END IF 'Find wikitext in the downloaded page s1 = INSTR(a$, s1$) @@ -1072,52 +1075,48 @@ FUNCTION wikiSafeName$ (page$) 'create a unique name for both case sensitive & i wikiSafeName$ = page$ + "_" + ext$ END FUNCTION +$UNSTABLE:HTTP FUNCTION wikiDLPage$ (url$, timeout!) -'--- prepare args --- -spo% = INSTR(url$, "/") -hst$ = LEFT$(url$, spo% - 1) -obj$ = MID$(url$, spo%) -eol$ = CHR$(13) + CHR$(10) +'--- set default result & avoid side effects --- wikiDLPage$ = "" +wik$ = url$: tio! = timeout! '--- open client --- -ch& = _OPENCLIENT("TCP/IP:80:" + hst$) +retry: +ch& = _OPENCLIENT(wik$) +IF Help_Recaching < 2 THEN 'avoid messages for 'qb64pe -u' (build time update) + IF ch& = 0 AND LCASE$(LEFT$(wik$, 8)) = "https://" THEN + IF _MESSAGEBOX("QB64-PE Help", "Can't make secure connection (https:) to Wiki, shall the IDE use unsecure (http:) instead?", "yesno", "warning" ) = 1 THEN + IF _MESSAGEBOX("QB64-PE Help", "Do you wanna save your choice permanently for the future?", "yesno", "question" ) = 1 THEN + wikiBaseAddress$ = "http://" + MID$(wikiBaseAddress$, 9) + WriteConfigSetting generalSettingsSection$, "WikiBaseAddress", wikiBaseAddress$ + END IF + wik$ = "http://" + MID$(wik$, 9): GOTO retry + END IF + END IF +END IF IF ch& = 0 THEN EXIT FUNCTION -'--- send request --- -req$ = "GET " + obj$ + " HTTP/1.1" + eol$ -req$ = req$ + "Host: " + hst$ + eol$ -req$ = req$ + "User-Agent: QB64-PE/" + Version$ + " (qb64phoenix.com)" + eol$ -req$ = req$ + "Cache-Control: no-cache" + eol$ -req$ = req$ + eol$ -PUT ch&, , req$ -res$ = "" '--- wait for response --- -st! = TIMER +res$ = "": st! = TIMER DO _DELAY 0.05 GET ch&, , rec$ IF LEN(rec$) > 0 THEN st! = TIMER res$ = res$ + rec$ - IF LEN(res$) < 15 OR LEFT$(res$, 15) = "HTTP/1.1 200 OK" THEN - cl% = INSTR(res$, "Content-Length:") - IF cl% > 0 THEN - cle% = INSTR(cl%, res$, eol$) - IF cle% > 0 THEN - le& = VAL(MID$(res$, cl% + 15, cle% - cl% - 14)) - das% = INSTR(cle%, res$, eol$ + eol$) - IF das% > 0 THEN - das% = das% + 4 - IF (LEN(res$) - das% + 1) = le& THEN - CLOSE ch& - wikiDLPage$ = MID$(res$, das%, le&) - EXIT FUNCTION - END IF - END IF + IF _STATUSCODE(ch&) = 200 THEN + le& = LOF(ch&) + IF le& > -1 THEN + IF LEN(res$) = le& THEN + wikiDLPage$ = res$: EXIT DO + END IF + ELSE + IF EOF(ch&) THEN + wikiDLPage$ = res$: EXIT DO END IF END IF ELSE - timeout! = 0 + tio! = 0 END IF -LOOP UNTIL TIMER > st! + timeout! +LOOP UNTIL TIMER > st! + tio! CLOSE ch& END FUNCTION diff --git a/source/qb64pe.bas b/source/qb64pe.bas index 4b009bf67..c97b42b3a 100644 --- a/source/qb64pe.bas +++ b/source/qb64pe.bas @@ -13177,7 +13177,7 @@ FUNCTION ParseCMDLineArgs$ () Help_Recaching = 2: Help_IgnoreCache = 1 IF ideupdatehelpbox THEN _DEST _CONSOLE - PRINT "Update failed: curl not found" + PRINT "Update failed: Can't make connection to Wiki." SYSTEM 1 END IF SYSTEM