diff options
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/ghub-20180911.1858/ghub.info')
-rw-r--r-- | configs/shared/emacs/.emacs.d/elpa/ghub-20180911.1858/ghub.info | 1301 |
1 files changed, 0 insertions, 1301 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/ghub-20180911.1858/ghub.info b/configs/shared/emacs/.emacs.d/elpa/ghub-20180911.1858/ghub.info deleted file mode 100644 index 8b53985fe96c..000000000000 --- a/configs/shared/emacs/.emacs.d/elpa/ghub-20180911.1858/ghub.info +++ /dev/null @@ -1,1301 +0,0 @@ -This is ghub.info, produced by makeinfo version 6.5 from ghub.texi. - - Copyright (C) 2017-2018 Jonas Bernoulli <jonas@bernoul.li> - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. -INFO-DIR-SECTION Emacs -START-INFO-DIR-ENTRY -* Ghub: (ghub). Minuscule client library for the Github API. -END-INFO-DIR-ENTRY - - -File: ghub.info, Node: Top, Next: Introduction, Up: (dir) - -Ghub User and Developer Manual -****************************** - -Ghub provides basic support for using the APIs of various Git forges -from Emacs packages. Originally it only supported the Github REST API, -but now it also supports the Github GraphQL API as well as the REST APIs -of Gitlab, Gitea, Gogs and Bitbucket. - - Ghub abstracts access to API resources using only a handful of basic -functions such as ‘ghub-get‘. These are convenience wrappers around -‘ghub-request‘. Additional forge-specific wrappers like ‘glab-put‘, -‘gtea-put‘, ‘gogs-post‘ and ‘buck-delete‘ are also available. Ghub does -not provide any resource-specific functions, with the exception of -‘FORGE-repository-id‘. - - When accessing Github, then Ghub handles the creation and storage of -access tokens using a setup wizard to make it easier for users to get -started. The tokens for other forges have to be created manually. - - Ghub is intentionally limited to only provide these two essential -features — basic request functions and guided setup — to avoid being too -opinionated, which would hinder wide adoption. It is assumed that wide -adoption would make life easier for users and maintainers alike, because -then all packages that talk to forge APIs could be configured the same -way. - -This manual is for Ghub version 2.0.1 (v2.0.1-48-g87701ea+1). - - Copyright (C) 2017-2018 Jonas Bernoulli <jonas@bernoul.li> - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - -* Menu: - -* Introduction:: -* Getting Started:: -* Using Ghub in Personal Scripts:: -* Using Ghub in a Package:: -* API:: -* GraphQL Support:: -* Support for Other Forges:: - -— The Detailed Node Listing — - -Getting Started - -* Setting the Username:: -* Interactively Creating and Storing a Token:: -* Manually Creating and Storing a Token:: -* How Ghub uses Auth-Source:: - -API - -* Making Requests:: -* Authentication:: -* Configuration Variables:: - -Support for Other Forges - -* Forge Functions and Variables:: -* Forge Limitations and Notes:: - - - -File: ghub.info, Node: Introduction, Next: Getting Started, Prev: Top, Up: Top - -1 Introduction -************** - -Ghub provides basic support for using the APIs of various Git forges -from Emacs packages. Originally it only supported the Github REST API, -but now it also supports the Github GraphQL API as well as the REST APIs -of Gitlab, Gitea, Gogs and Bitbucket. - - Ghub abstracts access to API resources using only a handful of basic -functions such as ‘ghub-get‘. These are convenience wrappers around -‘ghub-request‘. Additional forge-specific wrappers like ‘glab-put‘, -‘gtea-put‘, ‘gogs-post‘ and ‘buck-delete‘ are also available. Ghub does -not provide any resource-specific functions, with the exception of -‘FORGE-repository-id‘. - - When accessing Github, then Ghub handles the creation and storage of -access tokens using a setup wizard to make it easier for users to get -started. The tokens for other forges have to be created manually. - - Ghub is intentionally limited to only provide these two essential -features — basic request functions and guided setup — to avoid being too -opinionated, which would hinder wide adoption. It is assumed that wide -adoption would make life easier for users and maintainers alike, because -then all packages that talk to forge APIs could be configured the same -way. - - Fancier interfaces can be implemented on top of Ghub, and one such -wrapper — named simply Ghub+ — has already been implemented. The -benefit of basing various opinionated interfaces on top of a single -library that provides only the core functionality is that choosing the -programming interface no longer dictates how access tokens are handled. -Users can then use multiple packages that access the Github API without -having to learn the various incompatible ways packages expect the -appropriate token to be made available to them. - - Ghub uses the built-in ‘auth-source’ library to store access tokens. -That library is very flexible and supports multiple backends, which -means that it is up to the user how secrets are stored. They can, among -other things, choose between storing secrets in plain text for ease of -use, or encrypted for better security. - - Previously (as in until this library is widely adopted) it was up to -package authors to decide if things should be easy or secure. (Note -that ‘auth-source’ defaults to "easy" — you have been warned.) - - Ghub expects package authors to use a dedicated access token instead -of sharing a single token between all packages that rely on it. That -means that users cannot configure Ghub once and later start using a new -package without any additional setup. But Ghub helps with that. - - When the user invokes some command that ultimately results in -‘ghub-request’ being called and the appropriate token is not available -yet, then the user is guided through the process of creating and storing -a new token, and at the end of that process the request is carried out -as if the token had been available to begin with. - - -File: ghub.info, Node: Getting Started, Next: Using Ghub in Personal Scripts, Prev: Introduction, Up: Top - -2 Getting Started -***************** - -Each package that uses Ghub uses its own token. Despite that, chances -are good that after successfully configuring one package you can just -start using another package pretty much instantly. - - If the necessary token to access a Github instance is not available -when a package makes an API request, then a setup wizard pops up, and -after answering a few questions you are good to go. Even the request -that caused the wizard to be summoned should succeed and for most users -this should be true even when configuring the very first token. - - However, in some situations some manual configuration is necessary -*before* using the wizard, or the wizard cannot be used at all: - - • If you don’t want to use the wizard then you don’t have to and can - create tokens manually as described in *note Manually Creating and - Storing a Token::. - - • Unfortunately only Github supports the creation of tokens by using - the API. If you want to access another forge, then you have to - create the token manually as describe in *note Manually Creating - and Storing a Token::. Also see *note Support for Other Forges::. - - • If you want to access a Github Enterprise instance, then you have - to tell Ghub about that before the wizard makes its appearance by - setting the Git variable ‘github.host’. You also have to tell Ghub - your username for that instance using the variable - ‘github.HOST.user’ even if it is the same as on Github.com. - - • If the variable ‘github.user’ (or ‘github.HOST.user’ for an - Enterprise instance) is unset when the wizard is first summoned, - then you are asked to provide your username. That value is then - stored *globally* to avoid having to ask you that question once per - repository. If you have multiple accounts on Github.com (or a - Github Enterprise instance), then you have to explicitly tell Ghub - about that. This can be done by setting the repository-local - values of the appropriate variable *before* the wizard is invoked. - - • You might forget to do the above, which is why it is important to - carefully read the output of the wizard. If it turns out that you - forgot to set a variable, then you must abort, set the variable, - and repeat the request to trigger the wizard again. - - • The setup wizard should work even if you have enabled two-factor - authentication. However if your Github Enterprise instance - enforces Single Sign-On as an additional security measure, then you - are out of luck and have to create the token manually as described - in *note Manually Creating and Storing a Token::. - - The variables mentioned above — and others — are documented in *note -Configuration Variables:: and the setup wizard is documented in *note -Interactively Creating and Storing a Token::. - -* Menu: - -* Setting the Username:: -* Interactively Creating and Storing a Token:: -* Manually Creating and Storing a Token:: -* How Ghub uses Auth-Source:: - - -File: ghub.info, Node: Setting the Username, Next: Interactively Creating and Storing a Token, Up: Getting Started - -2.1 Setting the Username -======================== - -If you haven’t set the Git variable ‘github.user’ yet when making a -request, then you will be asked: - - Git variable `github.user' is unset. Set to: - - You are expected to provide your Github username here. The provided -value will be saved globally (using ‘git config --global github.user -USERNAME’). - - If you need to identify as another user in a particular repository, -then you have to set that variable locally, *before* making a request: - - cd /path/to/repo - git config github.user USERNAME - - For Github Enterprise instances you have to specify where the API can -be accessed *before* you try to access it and a different variable has -to be used to set the username. For example if the API is available at -‘https://example.com/api/v3’, then you should do this: - - # Do this once - git config --global github.example.com/api/v3.user EMPLOYEE - - # Do this for every corporate repository - cd /path/to/repo - git config github.host example.com/api/v3 - - If you do not set ‘github.example.com/api/v3.user’, then you will be -asked to provide the value when trying to make a request, but you do -have to manually set ‘github.host’, or Ghub assumes that you are trying -to access ‘api.github.com’. - - -File: ghub.info, Node: Interactively Creating and Storing a Token, Next: Manually Creating and Storing a Token, Prev: Setting the Username, Up: Getting Started - -2.2 Interactively Creating and Storing a Token -============================================== - -Ghub uses a different token for every package as well as for every -machine from which you access the Github API (and obviously also for -every Github instance and user). This allows packages to only request -the scopes that they actually need and also gives users the opportunity -to refuse access to certain scopes if they expect to not use the -features that need them. - - Usually you don’t have to worry about creating and storing a token -yourself and can just make a request. Note however that you don’t have -to use the setup wizard described below. Alternatively you can perform -the setup manually as described in the next section. - - If you make a request and the required token is not available yet, -then the setup wizard will first ask you something like this: - - Such a Github API token is not available: - - Host: api.github.com - User: USERNAME - Package: PACKAGE - - Scopes requested in `PACKAGE-github-token-scopes': - repo - Store on Github as: - "Emacs package PACKAGE @ LOCAL-MACHINE" - Store locally according to option `auth-sources': - ("~/.authinfo" "~/.authinfo.gpg" "~/.netrc") - - If in doubt, then abort and first view the section of the Ghub - documentation called "Manually Creating and Storing a Token". - - Create and store such a token? (yes or no) - - If you don’t have any doubts, then answer "yes". Lets address some -of the doubts that you might have: - - • ‘Host’ usually is "api.github.com" and that is usually what you - want. If you are trying to access a Github Enterprise instance, - then it should be something else and you have to set the value - manually before the setup wizard is summoned, as described in the - parent section. - - • ‘User’ should be your Github.com (or Github Enterprise instance) - username. If it is something else and it doesn’t look like a - simple typo, then you should read the parent section again. In - either case you have to abort. - - • ‘Package’ should be the name of the package you are using to access - the Github API. - - If it is ‘ghub’, then the package author disregarded that - convention and you should probably report a bug in the issue - tracker of that package. - - Or you yourself are using ‘ghub-request’ or one of its wrappers - directly, in which case this is expected and perfectly fine. In - that case you might however want to abort and change the value of - the variable ‘ghub-github-token-scopes’ before triggering the - wizard again. - - • Each ‘PACKAGE’ has to specify the tokens that it needs using a - variable named ‘PACKAGE-github-token-scopes’. The doc-string of - that variable should document why the various scopes are needed. - - The meaning of the various scopes are documented at - <https://magit.vc/goto/f63aeb0a>. - - • The value of ‘auth-sources’ is shown. The default value causes - secrets to be stored in plain text. Because this might be - unexpected, Ghub additionally displays a warning when appropriate. - - WARNING: The token will be stored unencrypted in "~/.authinfo". - If you don't want that, you have to abort and customize - the `auth-sources' option. - - Whether that is something that needs fixing, is up to you. If your - answer is yes, then you should abort and see *note How Ghub uses - Auth-Source:: for instructions on how to save the token more - securely. - - • When creating a token it is necessary to provide a token - description. Ghub uses descriptions that have the form "Emacs - package PACKAGE @ LOCAL-MACHINE". - - Github uses the token description to identify the token, not merely - as something useful to humans. Token descriptions therefore have - to be unique and in rare cases you get an additional prompt, asking - you something like: - - A token named "Emacs package PACKAGE @ LOCAL-MACHINE" - already exists on Github. Replace it? - - You might see this message when you have lost the old token and - want to replace it with a new one, in which case you should - obviously just proceed. - - Or two of your computers have the same hostname, which is bad - practice because it gains you nothing but leads to issues such as - this. Or you are dual-booting on this machine and use the same - hostname in all operating systems, which is a somewhat reasonable - thing to do, but never-the-less leads to issues like this. - - In either case you will have to use something other than the value - returned by ‘system-name’ to identify the current machine or - operating system. Or you can continue to identify different things - using the same identifier, in which case you have to manually - distribute the token. - - The former is recommended and also easier to do, using the variable - ‘ghub-override-system-name’. See *note Configuration Variables:: - for details. - - After the above prompt you are also asked for you username and -password. If you have enabled two-factor authentication, then you also -have to provide the authentication code at least twice. If you make -sure the code is still good for a while when asked for it first, then -you can just press ‘RET’ at the later prompt(s). - - -File: ghub.info, Node: Manually Creating and Storing a Token, Next: How Ghub uses Auth-Source, Prev: Interactively Creating and Storing a Token, Up: Getting Started - -2.3 Manually Creating and Storing a Token -========================================= - -If you cannot or don’t want to use the wizard then you have to (1) -figure out what scopes a package wants, (2) create such a token using -the web interface and (3) store the token where Ghub expects to find it. - - A package named ‘PACKAGE’ has to specify the scopes that it wants in -the variable named ‘PACKAGE-ghub-token-scopes’. The doc-string of such -variables should document what the various scopes are needed for. - - To create or edit a token go to <https://github.com/settings/tokens>. -For Gitlab.com use <https://gitlab.com/profile/personal_access_tokens>. - - Finally store the token in a place where Ghub looks for it, as -described in *note How Ghub uses Auth-Source::. - - If you store the token in a file like ‘~/.authinfo’, then note that -‘auth-source’’s parsing of that file is brittle. Make sure the file -ends with a newline character, that there are no empty or invalid lines, -and that all comments are prefixed with ‘#’. - - -File: ghub.info, Node: How Ghub uses Auth-Source, Prev: Manually Creating and Storing a Token, Up: Getting Started - -2.4 How Ghub uses Auth-Source -============================= - -Please see *note (auth)Top:: for all the gory details about Auth-Source. -Some Ghub-specific information and important notes follow. - - The variable ‘auth-sources’ controls how and where Auth-Source stores -new secrets and where it looks for known secrets. The default value is -‘("~/.authinfo" "~/.authinfo.gpg" "~/.netrc")’, which means that it -looks in all of these files in order to find secrets and that it stores -new secrets in ‘~/.authinfo’ because that is the first element of the -list. It doesn’t matter which files already do or don’t exist when -storing a new secret, the first file is always used. - - Secrets are stored in ‘~/.authinfo’ in plain text. If you don’t want -that (good choice), then you have to customize ‘auth-sources’, e.g. by -flipping the positions of the first two elements. - - Auth-Source also supports storing secrets in various key-chains. -Refer to its documentation for more information. - - Some Auth-Source backends only support storing three values per -entry, the "machine", the "login" and the "password". Because Ghub uses -separate tokens for each package, it has to squeeze four values into -those three slots, and it does that by using "USERNAME^PACKAGE" as the -"login". - - Assuming your username is "ziggy",the package is named "stardust", -and you want to access *Github.com* an entry in one of the three -mentioned files would then look like this: - - machine api.github.com login ziggy^stardust password 012345abcdef... - - Assuming your username is "ziggy",the package is named "stardust", -and you want to access *Gitlab.com* an entry in one of the three -mentioned files would then look like this: - - machine gitlab.com/api/v4 login ziggy^stardust password 012345abcdef... - - -File: ghub.info, Node: Using Ghub in Personal Scripts, Next: Using Ghub in a Package, Prev: Getting Started, Up: Top - -3 Using Ghub in Personal Scripts -******************************** - -You can use ‘ghub-request’ and its wrapper functions in your personal -scripts, of course. Unlike when you use Ghub from a package that you -distribute for others to use, you don’t have to specify a package in -personal scripts. - - ;; This is perfectly acceptable in personal scripts ... - (ghub-get "/user") - - ;; ... and actually equal to - (ghub-get "/user" nil :auth 'ghub) - - ;; In packages you have to specify the package using AUTH. - (ghub-get "/user" nil :auth 'foobar) - - When you do not specify the ‘AUTH’ argument, then a request is made -on behalf of the ‘ghub’ package itself. Like for any package that uses -Ghub, ‘ghub’ has to declare what scopes it needs, using, in this case, -the variable ‘ghub-github-token-scopes’. - - The default value of that variable is ‘(repo)’ and you might want to -add additional scopes. You can later add additional scopes to an -existing token, using the web interface at -<https://github.com/settings/tokens>. - - If you do that, then you might want to also set the variable -accordingly, but note that Ghub only consults that when *creating* a new -token. If you want to know a token’s effective scopes use the command -‘ghub-token-scopes’, described in the next section. - - -File: ghub.info, Node: Using Ghub in a Package, Next: API, Prev: Using Ghub in Personal Scripts, Up: Top - -4 Using Ghub in a Package -************************* - -Every package should use its own token. This allows you as the author -of some package to only request access to API scopes that are actually -needed, which in turn might make it easier for users to trust your -package not to do unwanted things. - - The scopes used by ‘PACKAGE’ have to be defined using the variable -‘PACKAGE-github-token-scopes’, and you have to tell ‘ghub-request’ on -behalf of which package a request is being made by passing the symbol -‘PACKAGE’ as the value of its ‘AUTH’ argument. - - (ghub-request "GET" "/user" nil :auth 'PACKAGE) - - -- Variable: PACKAGE-github-token-scopes - - This variable defines the token scopes requested by the package - named ‘PACKAGE’. The doc-string should explain what the various - scopes are needed for to prevent users from giving ‘PACKAGE’ fewer - permissions than it absolutely needs and also to give them greater - confidence that ‘PACKAGE’ is only requesting the permissions that - it actually needs. - - The value of this variable does not necessarily correspond to the - scopes that the respective token actually gives access to. There - is nothing that prevents users from changing the value *after* - creating the token or from editing the token’s scopes later on. - - So it is pointless to check the value of this variable before - making a request. You also should not query the API to reliably - determine the supported tokens before making a query. Doing the - latter would mean that every request becomes two requests and that - the first request would have to be done using the user’s password - instead of a token. - - -- Command: ghub-token-scopes - - Because we cannot be certain that the user hasn’t messed up the - scopes, Ghub provides this command to make it easy to debug such - issues without having to rely on users being thoughtful enough to - correctly determine the used scopes manually. - - Just tell users to run ‘M-x ghub-token-scopes’ and to provide the - correct values for the ‘HOST’, ‘USERNAME’ and ‘PACKAGE’ when - prompted, and to then post the output. - - It is to be expected that users will occasionally mess that up so - this command outputs not only the scopes but also the user input so - that you can have greater confidence in the validity of the user’s - answer. - - Scopes for USERNAME^PACKAGE@HOST: (SCOPE...) - - -File: ghub.info, Node: API, Next: GraphQL Support, Prev: Using Ghub in a Package, Up: Top - -5 API -***** - -This section describes the Ghub API. In other words it describes the -public functions and variables provided by the Ghub package and not the -APIs of the supported forges, which can be accessed by using those -functions. The forge APIs are documented at: - - • Github: <https://developer.github.com/v3> - - • Gitlab: <https://docs.gitlab.com/ee/api/README.html> - - • Gitea: <https://docs.gitea.io/en-us/api-usage> and - <https://try.gitea.io/api/swagger> - - • Gogs: <https://github.com/gogs/go-gogs-client/wiki> - - • Bitbucket: - <https://developer.atlassian.com/bitbucket/api/2/reference> - -* Menu: - -* Making Requests:: -* Authentication:: -* Configuration Variables:: - - -File: ghub.info, Node: Making Requests, Next: Authentication, Up: API - -5.1 Making Requests -=================== - - -- Function: ghub-request method resource &optional params &key query - payload headers unpaginate noerror reader username auth host - callback errorback url value error extra method* - - This function makes a request for ‘RESOURCE’ using ‘METHOD’. - ‘PARAMS’, ‘QUERY’, ‘PAYLOAD’ and/or ‘HEADERS’ are alists holding - additional request data. The response body is returned and the - response header is stored in the variable ‘ghub-response-headers’. - - • ‘METHOD’ is the HTTP method, given as a string. - - • ‘RESOURCE’ is the resource to access, given as a string - beginning with a slash. - - • ‘PARAMS’, ‘QUERY’, ‘PAYLOAD’ and ‘HEADERS’ are alists and are - used to specify request data. All these arguments are alists - that resemble the JSON expected and returned by the Github - API. The keys are symbols and the values stored in the ‘cdr’ - (not the ‘cadr’) can be strings, integers, or lists of strings - and integers. - - The Github API documentation is vague on how data has to be - transmitted and for a particular resource usually just talks - about "parameters". Generally speaking when the ‘METHOD’ is - "HEAD" or "GET", then they have to be transmitted as a query, - otherwise as a payload. - - • Use ‘PARAMS’ to automatically transmit like ‘QUERY’ or - ‘PAYLOAD’ would depending on ‘METHOD’. - - • Use ‘QUERY’ to explicitly transmit data as a query. - - • Use ‘PAYLOAD’ to explicitly transmit data as a payload. - Instead of an alist, ‘PAYLOAD’ may also be a string, in - which case it gets encoded as UTF-8 but is otherwise - transmitted as-is. - - • Use ‘HEADERS’ for those rare resources that require that - the data is transmitted as headers instead of as a query - or payload. When that is the case, then the Github API - documentation usually mentions it explicitly. - - • If ‘SILENT’ is non-nil, then progress reports and the like are - not messaged. - - • If ‘UNPAGINATE’ is t, then this function make as many requests - as necessary to get all values. If ‘UNPAGINATE’ is a natural - number, then it gets at most that many pages. For any other - non-nil value it raises an error. - - • If ‘NOERROR’ is non-nil, then no error is raised if the - request fails and ‘nil’ is returned instead. If ‘NOERROR’ is - ‘return’, then the error payload is returned instead of ‘nil’. - - • If ‘READER’ is non-nil, then it is used to read and return - from the response buffer. The default is - ‘ghub--read-json-payload’. For the very few resources that do - not return JSON, you might want to use ‘ghub--decode-payload’. - - • If ‘USERNAME’ is non-nil, then the request is made on behalf - of that user. It is better to specify the user using the Git - variable ‘github.user’ for "api.github.com", or - ‘github.HOST.user’ if connecting to a Github Enterprise - instance. - - • Each package that uses Ghub should use its own token. If - ‘AUTH’ is ‘nil’ or unspecified, then the generic ‘ghub’ token - is used instead. This is only acceptable for personal - utilities. A packages that is distributed to other users - should always use this argument to identify itself, using a - symbol matching its name. - - Package authors who find this inconvenient should write a - wrapper around this function and possibly for the - method-specific functions as well. - - Beside ‘nil’, some other symbols have a special meaning too. - ‘none’ means to make an unauthorized request. ‘basic’ means - to make a password based request. If the value is a string, - then it is assumed to be a valid token. ‘basic’ and an - explicit token string are only intended for internal and - debugging uses. - - If ‘AUTH’ is a package symbol, then the scopes are specified - using the variable ‘AUTH-github-token-scopes’. It is an error - if that is not specified. See ‘ghub-github-token-scopes’ for - an example. - - • If ‘HOST’ is non-nil, then connect to that Github instance. - This defaults to "api.github.com". When a repository is - connected to a Github Enterprise instance, then it is better - to specify that using the Git variable ‘github.host’ instead - of using this argument. - - • If ‘FORGE’ is ‘gitlab’, then connect to Gitlab.com or, - depending on ‘HOST’, to another Gitlab instance. This is only - intended for internal use. Instead of using this argument you - should use function ‘glab-request’ and other ‘glab-*’ - functions. - - • If ‘CALLBACK’ and/or ‘ERRORBACK’ is non-nil, then this - function makes one or more asynchronous requests and calls - ‘CALLBACK’ or ‘ERRORBACK’ when finished. If an error - occurred, then it calls ‘ERRORBACK’, or if that is ‘nil’, then - ‘CALLBACK’. When no error occurred then it calls ‘CALLBACK’. - When making asynchronous requests, then no errors are - signaled, regardless of the value of ‘NOERROR’. - - Both callbacks are called with four arguments. - - • For ‘CALLBACK’, the combined value of the retrieved - pages. For ‘ERRORBACK’, the error that occured when - retrieving the last page. - - • The headers of the last page as an alist. - - • Status information provided by ‘url-retrieve’. Its - ‘:error’ property holds the same information as the first - argument to ‘ERRORBACK’. - - • A ‘ghub--req’ struct, which can be passed to - ‘ghub-continue’ (which see) to retrieve the next page, if - any. - - -- Function: ghub-continue args - - If there is a next page, then this function retrieves that. - - This function is only intended to be called from callbacks. If - there is a next page, then that is retrieve and the buffer that the - result will be loaded into is returned, or t if the process has - already completed. If there is no next page, then return nil. - - Callbacks are called with four arguments (see ‘ghub-request’). The - forth argument is a ‘ghub--req’ struct, intended to be passed to - this function. A callback may use the struct’s ‘extra’ slot to - pass additional information to the callback that will be called - after the next request. Use the function ‘ghub-req-extra’ to get - and set the value of that slot. - - As an example, using ‘ghub-continue’ in a callback like so: - - (ghub-get "/users/tarsius/repos" nil - :callback (lambda (value _headers _status req) - (unless (ghub-continue req) - (setq my-value value)))) - - is equivalent to: - - (ghub-get "/users/tarsius/repos" nil - :unpaginate t - :callback (lambda (value _headers _status _req) - (setq my-value value))) - - To demonstrate how to pass information from one callback to the - next, here we record when we start fetching each page: - - (ghub-get "/users/tarsius/repos" nil - :extra (list (current-time)) - :callback (lambda (value _headers _status req) - (push (current-time) (ghub-req-extra req)) - (unless (ghub-continue req) - (setq my-times (ghub-req-extra req)) - (setq my-value value)))) - - -- Variable: ghub-response-headers - - A select few Github API resources respond by transmitting data in - the response header instead of in the response body. Because there - are so few of these inconsistencies, ‘ghub-request’ always returns - the response body. - - To access the response headers use this variable after - ‘ghub-request’ has returned. - - -- Function: ghub-response-link-relations req headers payload - - This function returns an alist of the link relations in ‘HEADERS’, - or if optional ‘HEADERS’ is nil, then those in - ‘ghub-response-headers’. - - When accessing a Bitbucket instance then the link relations are in - ‘PAYLOAD’ instead of ‘HEADERS’, making their API merely RESTish and - forcing this function to append those relations to the value of - ‘ghub-response-headers’, for later use when this function is called - with ‘nil’ for ‘PAYLOAD’. - - -- Variable: ghub-override-system-name - - If non-nil, the value of this variable is used to override the - value returned by ‘system-name’ for the purpose of identifying the - local machine, which is necessary because Ghub uses separate tokens - for each machine. Also see *note Configuration Variables::. - - -- Variable: ghub-github-token-scopes - -- Variable: PACKAGE-github-token-scopes - - Such a variable defines the token scopes requested by the - respective package ‘PACKAGE’ given by the first word in the - variable name. ‘ghub’ itself is treated like any other package. - Also see *note Using Ghub in a Package::. - - -- Function: ghub-head resource &optional params &key query payload - headers unpaginate noerror reader username auth host callback - errorback - -- Function: ghub-get resource &optional params &key query payload - headers unpaginate noerror reader username auth host callback - errorback - - These functions are simple wrappers around ‘ghub-request’. Their - signature is identical to that of the latter, except that they do - not have an argument named ‘METHOD’. The HTTP method is instead - given by the second word in the function name. - - As described in the documentation for ‘ghub-request’, it depends on - the used method whether the value of the ‘PARAMS’ argument is used - as the query or the payload. For the "HEAD" and "GET" methods it - is used as the query. - - -- Function: ghub-put resource &optional params &key query payload - headers unpaginate noerror reader username auth host callback - errorback - -- Function: ghub-post resource &optional params &key query payload - headers unpaginate noerror reader username auth host callback - errorback - -- Function: ghub-patch resource &optional params &key query payload - headers unpaginate noerror reader username auth host callback - errorback - -- Function: ghub-delete resource &optional params &key query payload - headers unpaginate noerror reader username auth host callback - errorback - - These functions are simple wrappers around ‘ghub-request’. Their - signature is identical to that of the latter, except that they do - not have an argument named ‘METHOD’. The HTTP method is instead - given by the second word in the function name. - - As described in the documentation for ‘ghub-request’, it depends on - the used method whether the value of the ‘PARAMS’ argument is used - as the query or the payload. For the "PUT", "POST", "PATCH" and - "DELETE" methods it is used as the payload. - - -- Function: ghub-wait resource &optional duration &key username auth - host - - Some API requests result in an immediate successful response even - when the requested action has not actually been carried out yet. - An example is the request for the creation of a new repository, - which doesn’t cause the repository to immediately become available. - The Github API documentation usually mentions this when describing - an affected resource. - - If you want to do something with some resource right after making a - request for its creation, then you might have to wait for it to - actually be created. This function can be used to do so. It - repeatedly tries to access the resource until it becomes available - or until the timeout exceeds. In the latter case it signals - ‘ghub-error’. - - ‘RESOURCE’ specifies the resource that this function waits for. - - ‘DURATION’ specifies the maximum number of seconds to wait for, - defaulting to 64 seconds. Emacs will block during that time, but - the user can abort using ‘C-g’. - - The first attempt is made immediately and will often succeed. If - not, then another attempt is made after two seconds, and each - subsequent attempt is made after waiting as long as we already - waited between all preceding attempts combined. - - See ‘ghub-request’’s documentation above for information about the - other arguments. - - -- Function: ghub-graphql graphql &optional variables &key username - auth host callback - - This function makes a GraphQL request using ‘GRAPHQL’ and - ‘VARIABLES’ as inputs. ‘GRAPHQL’ is a GraphQL string. ‘VARIABLES’ - is a JSON-like alist. The other arguments behave as for - ‘ghub-request’ (which see). - - The response is returned as a JSON-like alist. Even if the - response contains ‘errors’, this function does not raise an error. - Cursor-handling is likewise left to the caller. - - -File: ghub.info, Node: Authentication, Next: Configuration Variables, Prev: Making Requests, Up: API - -5.2 Authentication -================== - - -- Command: ghub-create-token - - This command creates a new token using the values it reads from the - user and then stores it according to the variable ‘auth-sources’. - It can also be called non-interactively, but you shouldn’t do that - yourself. - - This is useful if you want to fully setup things before attempting - to make the initial request, if you want to provide fewer than the - requested scopes or customize ‘auth-sources’ first, or if something - has gone wrong when using the wizard that is used when making a - request without doing this first. (Note that instead of using this - command you can also just repeat the initial request after making - the desired adjustments — that is easier.) - - This command reads, in order, the ‘HOST’ (Github instance), the - ‘USERNAME’, the ‘PACKAGE’, and the ‘SCOPES’ in the minibuffer, - providing reasonable default choices. ‘SCOPES’ defaults to the - scopes that ‘PACKAGE’ requests using the variable - ‘PACKAGE-github-token-scopes’. - - -- Command: ghub-token-scopes - - Users are free to give a token access to fewer scopes than what the - respective package requested. That can, of course, lead to issues, - and package maintainers have to be able to quickly determine if - such a (mis-)configuration is the root cause when users report - issues. - - This command reads the required values in the minibuffer and then - shows a message containing these values along with the scopes of - the respective token. It also returns the scopes (only) when - called non-interactively. Also see *note Using Ghub in a - Package::. - - -File: ghub.info, Node: Configuration Variables, Prev: Authentication, Up: API - -5.3 Configuration Variables -=========================== - -The username and, unless you only use Github.com itself, the Github -Enterprise instance have to be configured using Git variables. In rare -cases it might also be necessary to specify the identity of the local -machine, which is done using a lisp variable. - - -- Variable: github.user - - The Github.com username. This should be set globally and if you - have multiple Github.com user accounts, then you should set this - locally only for those repositories that you want to access using - the secondary identity. - - -- Variable: github.HOST.user - - This variable serves the same purpose as ‘github.user’ but for the - Github Enterprise instance identified by ‘HOST’. - - The reason why separate variables are used is that this makes it - possible to set both values globally instead of having to set one - of the values locally in each and every repository that is - connected to the Github Enterprise instance, not Github.com. - - -- Variable: github.host - - This variable should only be set locally for a repository and - specifies the Github Enterprise edition that that repository is - connected to. You should not set this globally because then each - and every repository becomes connected to the specified Github - Enterprise instance, including those that should actually be - connected to Github.com. - - When this is undefined, then "api.github.com" is used (defined in - the constant ‘ghub-default-host’, which you should never attempt to - change.) - - -- Variable: ghub-override-system-name - - Ghub uses a different token for each quadruple ‘(USERNAME PACKAGE - HOST LOCAL-MACHINE)’. Theoretically it could reuse tokens to some - extent but that would be more difficult to implement, less - flexible, and less secure (though slightly more convenient). - - A token is identified on the respective Github instance (Github.com - or a Github Enterprise instance) using the pair ‘(PACKAGE . - LOCAL-MACHINE)’, or more precisely the string "Emacs package - PACKAGE @ LOCAL-MACHINE". ‘USERNAME’ and ‘HOST’ do not have to be - encoded because the token is stored for ‘USERNAME’ on ‘HOST’ and - cannot be used by another user and/or on another instance. - - There is one potential problem though; for any given ‘(PACKAGE . - LOCAL-MACHINE)’ there can only be one token identified by "Emacs - package PACKAGE @ LOCAL-MACHINE"; Github does not allow multiple - tokens with the same description because it uses the description as - the identifier (it could use some hash instead, but alas it does - not). - - If you have multiple machines and some of them have the same name, - then you should probably change that as this is not how things - ought to be. However if you dual-boot, then it might make sense to - give that machine the same name regardless of what operating system - you have booted into. - - You could use the same token on both operating systems, but setting - that up might be somewhat difficult because it is not possible to - download an existing token from Github. You could, of course, - locally copy the token, but that is inconvenient and would make it - harder to only revoke the token used on your infected Windows - installation without also revoking it for your totally safe *BSD - installation. - - Alternatively you can set this variable to a unique value, that - will then be used to identify the local machine instead of the - value returned by ‘system-name’. - - -File: ghub.info, Node: GraphQL Support, Next: Support for Other Forges, Prev: API, Up: Top - -6 GraphQL Support -***************** - - -- Function: ghub-graphql graphql &optional variables &key username - auth host callback silent callback errorback value extra - - This function makes a GraphQL request using ‘GRAPHQL’ and - ‘VARIABLES’ as inputs. ‘GRAPHQL’ is a GraphQL string. ‘VARIABLES’ - is a JSON-like alist. The other arguments behave as for - ‘ghub-request’ (which see). - - The response is returned as a JSON-like alist. Even if the - response contains ‘errors’, this function does not raise an error. - Cursor-handling is likewise left to the caller. - - ‘ghub-graphql’ is a thin convenience wrapper around ‘ghub-request’, -similar to ‘ghub-post’ and friends. While the latter only hard-code the -value of the ‘METHOD’ argument, the former also hard-codes ‘RESOURCE’ -and constructs ‘PAYLOAD’ from ‘GRAPHEQL’ and ‘VARIABLES’. It also drops -‘UNPAGINATE’, ‘NOERROR’, ‘READER’ (internal functions expect alist-ified -JSON) and ‘FORGE’ (only Github currently supports GraphQL). - - ‘ghub-graphql’ does not account for the fact that pagination works -differently in GraphQL than it does in REST, so users of this function -have to deal with that themselves. Likewise error handling works -differently and has to be done by the caller too. - - An early attempt at implementing automatic unpaginating for GraphQL -can be found in the ‘faithful-graphql’ branch, provided I haven’t -deleted that by now. On that branch I try to do things as intended by -the designers of GraphQL, using variables and fragments, and drowning in -a sea of boilerplate. - - The problem with that approach is that it only works for applications -that fetch specific information on demand and actually want things to be -paginated. I am convinced that GraphQL is very nice for web apps. - - However the Forge package for which I am implementing all of this has -very different needs. It wants to fetch "all the data" and "cache" it -locally, so that it is available even when there is no internet -connection. GraphQL was designed around the idea that you should be -able to "ask for what you need and get exactly that". But when that -boils down to "look, if I persist, then you are going to hand me over -all the data anyway, so just caught it up already", then things start to -fall apart. If Github’s GraphQL allowed pagination to be turned off -completely, then teaching ‘ghub-graphql’ about error handling would be -enough. - - But it doesn’t and when doing things as intended, then that leads to -huge amounts of repetitive boilerplate, which is so boring to write that -doing it without introducing bugs left and right is near impossible; so -I decided to give up on GraphQL variables, fragments and conditions, and -instead implement something more powerful, though also more opinionated. - - -- Function: ghub--graphql-vacuum query variables callback &optional - until &key narrow username auth host forge - - This function is an opinionated alternative to ‘ghub-graphql’. It - relies and dark magic to get the job done. - - It makes an initial request using ‘QUERY’. It then looks for - paginated edges in the returned data and makes more requests to - resolve them. In order to do so it automatically transforms the - initial ‘QUERY’ into another query suitable for that particular - edge. The data retrieved by subsequent requests is then injected - into the data of the original request before that is returned or - passed to the callback. If subsequently retrieved data features - new paginated edges, then those are followed recursively. - - The end result is essentially the same as using ‘ghub-graphql’, if - only it were possible to say "do not paginate anything". The - implementation is much more complicated because it is not possible - to do that. - - ‘QUERY’ is a GraphQL query expressed as an s-expression. The - ‘graphql’ package is used to turn that into a GraphQL query string, - but the format is somewhat different than as documented for that - package. Also only a subset of the GraphQL features are supported; - fragments for example are not, and magical stuff happens to - variables. This is not documented yet, I am afraid. Look at - existing callers. - - ‘VARIABLES’ is a JSON-like alist as for ‘ghub-graphql’. - - ‘UNTIL’ is an alist ‘((EDGE-until . VALUE)...)’. When unpaginating - ‘EDGE’ try not to fetch beyond the element whose first field has - the value ‘VALUE’ and remove that element as well as all "lesser" - elements from the retrieved data if necessary. Look at - ‘forge--pull-repository’ for an example. This is only useful if - you "cache" the response locally and want to avoid fetching data - again that you already have. - - Other arguments behave as for ‘ghub-graphql’ and ‘ghub-request’, - more or less. - - Using ‘ghub--graphql-vacuum’, the following resource specific -functions are implemented. These functions are not part of the public -API yet and are very much subject to change. - - -- Function: ghub-fetch-repository owner name callback &optional until - &key username auth host forge - - This function asynchronously fetches forge data about the specified - repository. Once all data has been collected, ‘CALLBACK’ is called - with the data as the only argument. - - -- Function: ghub-fetch-issue owner name callback &optional until &key - username auth host forge - - This function asynchronously fetches forge data about the specified - issue. Once all data has been collected, ‘CALLBACK’ is called with - the data as the only argument. - - -- Function: ghub-fetch-pullreq owner name callback &optional until - &key username auth host forge - - This function asynchronously fetches forge data about the specified - pull-request. Once all data has been collected, ‘CALLBACK’ is - called with the data as the only argument. - - Note that in order to avoid duplication all of these functions base -their initial query on the query stored in ‘ghub-fetch-repository’. The -latter two pass that query through ‘ghub--graphql-prepare-query’, which -then used ‘ghub--graphql-narrow-query’ to remove parts the caller is not -interested in. These two functions are also used internally, when -unpaginating, but as demonstrated here they can be useful even before -making an initial request. - - -File: ghub.info, Node: Support for Other Forges, Prev: GraphQL Support, Up: Top - -7 Support for Other Forges -************************** - -* Menu: - -* Forge Functions and Variables:: -* Forge Limitations and Notes:: - - -File: ghub.info, Node: Forge Functions and Variables, Next: Forge Limitations and Notes, Up: Support for Other Forges - -7.1 Forge Functions and Variables -================================= - -Originally Ghub supported only Github but now it also supports Gitlab, -Gitea, Gogs and Bitbucket. The function ‘ghub-request’ and all the -‘ghub-METHOD’ convenience wrappers default to acting on a Github forge -but can be told to act on another forge using their FORGE argument. - - The FORGE argument only specifies what kind of forge to act on, not -which instance. The HOST argument can be used to select the instance. -For some forges a default instance is defined: - - • Forge ‘github’ defaults to host ‘api.github.com’. - - • Forge ‘gitlab’ defaults to host ‘gitlab.com/api/v4’. - - • Forge ‘bitbucket’ defaults to host ‘api.bitbucket.org/2.0’. - - • No canonical host exists for the ‘gitea’ and ‘gogs’ forges and - ‘localhost:3000/api/v1’ is used as the default host in both cases. - - Together the FORGE and HOST arguments specify the forge type and -instance. In addition to that, it is also necessary to specify on whose -behalf the request is being made, which can be done using the USERNAME -and AUTH arguments. - - Having to specify these arguments for every request is inconvenient. -Additional variables and convenience functions can be used to make that -unnecessary in most cases. - - These variables can be set globally and/or for a specific repository -as explained in *note Configuration Variables:: with a focus on Github -instances. To summarize: - - • For <https://github.com> the Git variable ‘github.user’ specifies - the user. - - • For another ‘github’ instance the Git variable ‘github.HOST.user’ - specifies the user. The HOST in that variable name is the same as - the value of the HOST argument of the called function. - - • Instead of specifying the HOST in every function call, the Git - variable ‘github.host’ can be used. This should only be set - locally. - -For ‘gitlab’ and ‘bitbucket’ forges similar variables are available: - - • ‘gitlab.user’ specifies the <https://gitlab.com> user. - - • ‘gitlab.HOST.user’ specifies the user for the HOST ‘gitlab’ - instance. - - • ‘gitlab.host’ specifies the ‘gitlab’ host, unless the HOST argument - is non-nil - - • ‘bitbucket.user’ specifies the <https://bitbucket.org> user. - - • ‘bitbucket.HOST.user’ specifies the user for the HOST ‘bitbucket’ - instance. - - • ‘bitbucket.host’ specifies the ‘bitbucket’ host, unless the HOST - argument is non-nil. - - For ‘gitea’ and ‘gogs’ forges some similar variables are available, -however for some of the ‘ghub.*’ variables no equivalent variable exist -for these two forges: - - • ‘gitea.user’ is *not* used because no canonical ‘gitea’ instance - exists. - - • ‘gitea.HOST.user’ specifies the user for the HOST ‘gitea’ instance. - - • ‘gitea.host’ specifies the ‘gitea’ host, unless the HOST argument - is non-nil - - • ‘gogs.user’ is *not* used because no canonical ‘gitea’ instance - exists. - - • ‘gogs.HOST.user’ specifies the user for the HOST ‘gogs’ instance. - - • ‘gogs.host’ specifies the ‘gogs’ host, unless the HOST argument is - non-nil - - ‘ghub-request’ and ‘ghub-METHOD’ can be used to make a request for -any of the supported forge types, but except when making a request for a -‘github’ instance, then that requires the use of the FORGE argument. - - To avoid that, functions named ‘FORGE-request’ and ‘FORGE-METHOD’ are -also available. The following forms are equivalent, for example: - - (ghub-get ... :auth 'PACKAGE :forge 'gitlab) - (glab-get ... :auth 'PACKAGE) - - These forms would remain equivalent even if you did not specify a -value for the AUTH arguments — but you should not do that if you plan to -share your code with others (see *note Using Ghub in a Package::). If -you do omit AUTH, then the request is made on behalf of the ‘ghub’ -package, *regardless* of the symbol prefix of the function you use to do -so. - - All ‘FORGE-request’ and ‘FORGE-METHOD’ functions, including but not -limited to ‘ghub-METHOD’, are very simple wrappers around -‘ghub-request’. They take fewer arguments than ‘ghub-request’ and -instead pass constant values for the arguments METHOD and/or FORGE. - - -File: ghub.info, Node: Forge Limitations and Notes, Prev: Forge Functions and Variables, Up: Support for Other Forges - -7.2 Forge Limitations and Notes -=============================== - - • The token creation wizard is only available for ‘github’ forges, - because all other forges do not support using the API to create an - API token. As a consequence, if the user makes a request and the - necessary token cannot be found, then that results in an error. - Tokens can be created at: - - • Gitlab: <https://gitlab.com/profile/personal_access_tokens> - - • Bitbucket: - <https://bitbucket.org/account/user/tarsius/app-passwords> - - • Gitea: <https://localhost:3000/user/settings/applications> - - • Gogs: <https://localhost:3000/user/settings/applications> - - Also see *note Manually Creating and Storing a Token:: and *note - How Ghub uses Auth-Source::. - - • As mentioned in the previous node, the variables ‘gitea.host’ and - ‘gogs.host’ are not taken into account. - - • Gitea and Gogs do not support limiting a token to certain scopes. - - • The Bitbucket API is fairly broken. Some resources only work if a - slash is appended while others only work if no slash is appended. - I am unable to access any private repositories and some resources - don’t work for me at all. Also the API is only RESTish; pagination - information is part of the response body instead of the header. - Due to such issues it is possible that I will eventually have to - remove support for Bitbucket altogether. - - • The Gitlab API documentation is not always accurate, though I don’t - have an example at hand. It also isn’t structured well, making it - occationally difficult to find the information one is looking for. - - • Where one would use ‘user/repo’ when accessing another forge, one - has to use ‘user%2Frepo’ when accessing Gitlab, e.g.: - - (glab-get "/projects/python-mode-devs%2Fpython-mode") - - - -Tag Table: -Node: Top763 -Node: Introduction3279 -Node: Getting Started6321 -Node: Setting the Username9481 -Node: Interactively Creating and Storing a Token10906 -Node: Manually Creating and Storing a Token16546 -Node: How Ghub uses Auth-Source17769 -Node: Using Ghub in Personal Scripts19702 -Node: Using Ghub in a Package21158 -Node: API23776 -Node: Making Requests24573 -Node: Authentication38612 -Node: Configuration Variables40457 -Node: GraphQL Support44177 -Node: Support for Other Forges50842 -Node: Forge Functions and Variables51059 -Node: Forge Limitations and Notes55578 - -End Tag Table - - -Local Variables: -coding: utf-8 -End: |