Web API: Serving and Managing Repositories

The GeoGig web API allows you to serve up multiple repositories from a single endpoint via the geogig serve command. The web API documentation goes over using this command to serve a single repository, but this section will discuss using the command to serve and manage multiple repositories.

Serving Multiple Repositories

When geogig serve is run from within a GeoGig repository directory, it will serve only that repository. However, if it is run from a directory containing zero or more GeoGig repositories while using the --multirepo parameter, all repositories within that directory will be served through the endpoint.

Given the following directory structure:

/repos/
  repo1/
    .geogig/
  repo2/
    .geogig/
  repo3/
    .geogig/

To serve repo1, repo2, and repo3 under a single endpoint, perform the following commands:

$ cd /repos
$ geogig serve --multirepo

This will enable all three repositories to be accessed through the http://localhost:8182/repos endpoint.

The rest of this document will use this repository configuration for demonstration purposes.

You can also serve Postgres repositories by providing the repository URI to the command:

$ geogig serve "postgresql://localhost/<database>/<repoName>?user=<postgres_username>&password=<postgres_password>"

Or multiple by specifying the root URI:

$ geogig serve --multirepo "postgresql://localhost/<database>?user=<postgres_username>&password=<postgres_password>"

Repository Management

Listing Repositories

In order to see which repositories are currently being served, you can issue a GET request against the repos/ endpoint. The response will also provide a link to each individual repository’s endpoint.

$ curl -v "http://localhost:8182/repos/" | xmllint --format - --format -
< HTTP/1.1 200 OK
< Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<repos>
  <repo>
    <name>repo2</name>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost:8182/repos/repo2.xml" type="application/xml"/>
  </repo>
  <repo>
    <name>repo3</name>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost:8182/repos/repo3.xml" type="application/xml"/>
  </repo>
  <repo>
    <name>repo1</name>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost:8182/repos/repo1.xml" type="application/xml"/>
  </repo>
</repos>

Creating New Repositories

Basic Init Request

You can create a new repository by issuing a PUT request to the init endpoint of the desired repository. The name preceding init will be used as the repository name.

$ curl -X PUT -v "http://localhost:8182/repos/repo4/init" | xmllint --format -
< HTTP/1.1 201 Created
< Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
  <success>true</success>
  <repo>
    <name>repo4</name>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost:8182/repos/repo4.xml" type="application/xml"/>
  </repo>
</response>

Behind the scenes, a new repository will be created and configured with repo4 as the name. The actual directory that is created for the repository will be randomized to avoid naming conflicts with other repositories. This is important because repository management allows you to rename repositories.

Notice that the HTTP response code is 201 Created for a success. If the repository that you are trying to create already exists, the response code will be a 409 Conflict .

Init Request With Optional Author Config

You can also create a new repository and initialize the user.name and user.email config values in a single request. This allows you to initialize a repository that can be committed to without having to make 2 separate config requests to set these required config values. To do so, you can provide either a JSON object or a URL encoded form in the request body with authorName and authorEmail fields set to the desired values. An example JSON request body might look like this:

{
    "authorName":"GeoGig User",
    "authorEmail":"geogig@geogig.org"
}

Sending the request:

$ curl -X PUT -H "Content-Type: application/json" -d '{"authorName":"GeoGig User","authorEmail":"geogig@geogig.org"}' -v "http://localhost:8182/repos/repo5/init" | xmllint --format -
< HTTP/1.1 201 Created
< Content-Type: application/xml
<?xml version="1.0"?>
<response>
  <success>true</success>
  <repo>
    <name>repo5</name>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost:8182/repos/repo5.xml" type="application/xml"/>
  </repo>
</response>

Init Request With Optional Location Config

You can also create a new repository and specify options that can dictate the repository’s location. This allows you to initialize a repository, for example, that is stored in a PostgreSQL database, or a different directory location than the working directory of the GeoGig multi-repo server. To specify a different parent directory location, set the parentDirectory value in the JSON request body:

{
    "parentDirectory":"/data/geogig/repos",
    "authorName":"GeoGig User",
    "authorEmail":"geogig@geogig.org"
}

Send the request:

$ curl -X PUT -H "Content-Type: application/json" -d '{"parentDirectory":"/data/geogig/repos","authorName":"GeoGig User","authorEmail":"geogig@geogig.org"}' -v "http://localhost:8182/repos/repo6/init" | xmllint --format -
< HTTP/1.1 201 Created
< Content-Type: application/xml
<?xml version="1.0"?>
<response>
  <success>true</success>
  <repo>
    <name>repo6</name>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost:8182/repos/repo6.xml" type="application/xml"/>
  </repo>
</response>

If you want to specify PostgreSQL database config options, you must specify dbName and dbPassword at a minimum. You may also specify the dbHost, dbPort, dbSchema and dbUser (though these have defaults).

PostgreSQL connection parameters (* indicates a required field)

Parameter Default Description
dbName (*)   Name of the PostgreSQL database to connect to
dbPassword (*)   Password of the database user with which to connect
dbHost “localhost” Hostname of the PostgreSQL database server to connect to
dbPort “5432” Port the database is listening on
dbSchema “public” Database schema to connect to
dbUser “postgres” Username to connect with
authorName   Committer name for the repository
authorEmail   Committer email for the repository

Example JSON request body:

{
    "dbName":"repos",
    "dbPassword":"geogig",
    "dbHost":"database.example.com",
    "dbPort":"5432",
    "dbSchema":"public",
    "dbUser":"geogig",
    "authorName":"GeoGig User",
    "authorEmail":"geogig@geogig.org"
}

Example request:

$ curl -X PUT -H "Content-Type: application/json" -d '{"dbName":"repos","dbPassword":"geogig","dbHost":"database.example.com","dbPort":"5432","dbSchema":"public","dbUser":"geogig","authorName":"GeoGig User","authorEmail":"geogig@geogig.org"}' -v "http://localhost:8182/repos/repo7/init" | xmllint --format -
< HTTP/1.1 201 Created
< Content-Type: application/xml
<?xml version="1.0"?>
<response>
  <success>true</success>
  <repo>
    <name>repo7</name>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost:8182/repos/repo7.xml" type="application/xml"/>
  </repo>
</response>

Renaming Repositories

If you wish to change the name of a repository after it has been created, you can do so by issuing a POST request to the rename endpoint of the repository with the new name. Because the repository’s name is used in web API calls, renaming a repository will cause the endpoint for that repository to change to the new name.

$ curl -X POST -v "http://localhost:8182/repos/repo4/rename?name=betterName" | xmllint --format -
< HTTP/1.1 301 Moved Permanently
< Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
  <success>true</success>
  <repo>
    <name>betterName</name>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost:8182/repos/betterName.xml" type="application/xml"/>
  </repo>
</response>

The repository can now be accessed via the http://localhost:8182/repos/betterName/ endpoint.

Deleting Repositories

If a repository is no longer needed, you may wish to delete it. You may do this by performing a two-step delete operation on the repository. It is set up this way in order to prevent any accidental deletions. The first step to delete a repository is to issue a GET request to the delete endpoint of the repository. This will return a token that can be used to delete the repository in step two.

  $ curl -v "http://localhost:8182/repos/betterName/delete" | xmllint --format -
  < HTTP/1.1 200 OK
  < Content-Type: application/xml
  <?xml version="1.0" encoding="UTF-8"?>
  <response>
    <success>true</success>
<token>db431217519a4c72</token>
  </response>

Now that we have the delete token, we can issue a DELETE request to the repository endpoint.

$ curl -X DELETE -v "http://localhost:8182/repos/betterName?token=db431217519a4c72" | xmllint --format -
< HTTP/1.1 200 OK
< Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<deleted>betterName</deleted>

The repository has now been deleted.

Asynchronous Requests

Just like when serving a single repository, asynchronous web API tasks can be polled via the tasks endpoint. All repositories share the same tasks endpoint.

$ curl -v "http://localhost:8182/tasks" | xmllint --format -
< HTTP/1.1 200 OK
< Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<tasks/>

In this example, no asynchronous tasks have been run, but if they had been, they would be listed here with their corresponding task ID.

back to top