/*================================================== project: message to the user if file is installed from GitHub Author: R.Andres Castaneda E-email: acastanedaa@worldbank.org url: Dependencies: The World Bank ---------------------------------------------------- Creation Date: 6 Oct 2022 - 16:35:59 Modification Date: Do-file version: 01 References: Output: ==================================================*/ /*================================================== 0: Program set up ==================================================*/ program define pip_gh, rclass version 16.0 syntax [anything(name=subcommand)] /// [, /// username(string) /// cmd(string) /// version(string) /// pause /// ] if ("`pause'" == "pause") pause on else pause off if ("`cmd'" == "") { local cmd pip } if ("`username'" == "") { local username "worldbank" } /*================================================== 1: Update ==================================================*/ if ("`subcommand'" == "update") { * Check repository of files * local cmd pip cap findfile github.dta, path("`c(sysdir_plus)'g/") if (_rc) { github install `username'/`cmd', replace cap window stopbox note "pip command has been reinstalled to " /// "keep record of new updates. Please type {stata discard} and retry." global pip_cmds_ssc = "" exit } local ghfile "`r(fn)'" * use "`ghfile'", clear tempname ghdta frame create `ghdta' frame `ghdta' { use "`ghfile'", clear qui keep if name == "`cmd'" if _N == 0 { di in red "`cmd' package was not found" github install `username'/`cmd', replace cap window stopbox note "pip command has been reinstalled to " /// "keep record of new updates. Please type discard and retry." global pip_cmds_ssc = "" exit } if _N > 1 { di as err "{p}multiple {cmd:pip} packages found!" /// "this can be caused if you had installed multiple " /// "packages from different repositories, but with an " /// "identical name..." _n noi list } if _N == 1 { local repo : di address[1] local crrtversion : di version[1] } } * github query `repo' _tmp_githubquery `repo' local latestversion = "`r(latestversion)'" * disp "`latestversion'" if regexm("`latestversion'", "([0-9]+)\.([0-9]+)\.([0-9]+)\.?([0-9]*)") { local lastMajor = regexs(1) local lastMinor = regexs(2) local lastPatch = regexs(3) local lastDevel = regexs(4) } if ("`lastDevel'" == "") local lastDevel 0 local last = `lastMajor'`lastMinor'`lastPatch'.`lastDevel' * github version `cmd' * local crrtversion = "`r(version)'" if regexm("`crrtversion'", "([0-9]+)\.([0-9]+)\.([0-9]+)\.?([0-9]*)"){ local crrMajor = regexs(1) local crrMinor = regexs(2) local crrPatch = regexs(3) local crrDevel = regexs(4) } if ("`crrDevel'" == "") local crrDevel 0 local current = `crrMajor'`crrMinor'`crrPatch'.`crrDevel' * disp "`current'" * force installation if ("`crrtversion'" == "") { local username "worldbank" // to modify github install `username'/`cmd', replace version(`latestversion') cap window stopbox note "pip command has been reinstalled to " /// "keep record of new updates. Please type discard and retry." global pip_cmds_ssc = "" exit } if (`last' > `current' ) { cap window stopbox rusure "There is a new version of `cmd' in Github (`latestversion')." /// "Would you like to install it now?" if (_rc == 0) { cap github install `repo', replace version(`latestversion') if (_rc == 0) { cap window stopbox note "Installation complete. please type" /// "discard in your command window to finish" local bye "exit" } else { noi disp as err "there was an error in the installation. " _n /// "please run the following to retry, " _n(2) /// "{stata github install `repo', replace}" local bye "error" } } else local bye "" } // end of checking github update else { noi disp as result "Github version of {cmd:`cmd'} is up to date." local bye "" } return local bye = "`bye'" } // end if installed from github /*================================================== 2: Message ==================================================*/ if (inlist("`subcommand'", "msg", "message")) { noi disp "You're using Github as the host of the {cmd:pip} Stata package." noi disp "If you want to install the SSC version type {stata pip_install ssc}" } //======================================================== // Install //======================================================== if (inlist("`subcommand'", "install")) { pip_install gh, replace version(`version') } end //======================================================== // Aux programs //======================================================== // Temporal github query program define _tmp_githubquery, rclass syntax anything qui { preserve drop _all local page "https://api.github.com/repos/`anything'/releases" scalar page = fileread(`"`page'"') mata { lines = st_strscalar("page") lines = ustrsplit(lines, ",")' lines = strtrim(lines) lines = stritrim(lines) lines = subinstr(lines, `"":""', "->") lines = subinstr(lines, `"""', "") } getmata lines, replace split lines, parse ("->") rename lines? (code url) keep if regexm(url, "releases/tag") gen tag = regexs(2) if regexm(url, "(releases/tag/)(.*)") local latestversion = tag[1] } return local latestversion `latestversion' end exit /* End of do-file */ ><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>< Notes: 1. 2. 3. Version Control: