Mercurial > hg
annotate contrib/dockerlib.sh @ 33800:f257943e47ab
repository: formalize peer interface with abstract base class
There are various interfaces for interacting with repositories
and peers. They form a contract for how one should interact with
a repo or peer object.
The contracts today aren't very well-defined or enforced. There
have been several bugs over the years where peers or repo types
have forgotten to implement certain methods. In addition, the
inheritance of some classes is wonky. For example, localrepository
doesn't inherit from an interface and the god-object nature of
that class means the repository interface isn't well-defined. Other
repository types inherit from localrepository then stub out
methods that don't make sense (e.g. statichttprepository
re-defining locking methods to fail fast).
Not having well-defined interfaces makes implementing alternate
storage backends, wire protocol transports, and repository types
difficult because it isn't clear what exactly needs to be
implemented.
This patch starts the process of attempting to establish more
order to the type system around repositories and peers.
Our first patch starts with a problem space that already has a
partial solution: peers. The peer.peerrepository class already
somewhat defines a peer interface. But it is missing a few things
and the total interface isn't well-defined because it is combined
with wireproto.wirepeer.
Our newly-established basepeer class uses the abc module to
declare an abstract base class with the properties and methods that
a generic peer must implement.
We create a new class that inherits from it. This class will hold
our other future abstract base classes / interfaces so we can expose
a unified base class/interface.
We don't yet use the new interface because subsequent additions
will break existing code without some refactoring first.
A new module (repository.py) was created to hold the interfaces.
I could have put things in peer.py. However, I have plans to
eventually add interfaces to define repository and storage types.
These almost certainly require a new module. And I figured having
all the interfaces live in one module makes sense. So I created
repository.py to be that future home.
Differential Revision: https://phab.mercurial-scm.org/D332
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sun, 13 Aug 2017 10:58:48 -0700 |
parents | a3ac1ea611ce |
children | 1335bbfb066f |
rev | line source |
---|---|
24968
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
1 #!/bin/sh -eu |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
2 |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
3 # This function exists to set up the DOCKER variable and verify that |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
4 # it's the binary we expect. It also verifies that the docker service |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 # is running on the system and we can talk to it. |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
6 function checkdocker() { |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 if which docker.io >> /dev/null 2>&1 ; then |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
8 DOCKER=docker.io |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
9 elif which docker >> /dev/null 2>&1 ; then |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
10 DOCKER=docker |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 else |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
12 echo "Error: docker must be installed" |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 exit 1 |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 fi |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
15 |
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 $DOCKER -h 2> /dev/null | grep -q Jansens && { echo "Error: $DOCKER is the Docking System Tray - install docker.io instead"; exit 1; } |
27103
2d437a0f3355
docker: match more version of 'hg docker version' (issue4967)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26888
diff
changeset
|
17 $DOCKER version | grep -Eq "^Client( version)?:" || { echo "Error: unexpected output from \"$DOCKER version\""; exit 1; } |
2d437a0f3355
docker: match more version of 'hg docker version' (issue4967)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26888
diff
changeset
|
18 $DOCKER version | grep -Eq "^Server( version)?:" || { echo "Error: could not get docker server version - check it is running and your permissions"; exit 1; } |
24968
80c9e99d68e0
dockerlib: start extracting common functions for setting up docker
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
19 } |
24969
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
20 |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
21 # Construct a container and leave its name in $CONTAINER for future use. |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
22 function initcontainer() { |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
23 [ "$1" ] || { echo "Error: platform name must be specified"; exit 1; } |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
24 |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
25 DFILE="$ROOTDIR/contrib/docker/$1" |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
26 [ -f "$DFILE" ] || { echo "Error: docker file $DFILE not found"; exit 1; } |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
27 |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
28 CONTAINER="hg-dockerrpm-$1" |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
29 DBUILDUSER=build |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
30 ( |
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
31 cat $DFILE |
24970
33055069e465
dockerlib: fix initcontainer for boot2docker users
Augie Fackler <augie@google.com>
parents:
24969
diff
changeset
|
32 if [ $(uname) = "Darwin" ] ; then |
33055069e465
dockerlib: fix initcontainer for boot2docker users
Augie Fackler <augie@google.com>
parents:
24969
diff
changeset
|
33 # The builder is using boot2docker on OS X, so we're going to |
33055069e465
dockerlib: fix initcontainer for boot2docker users
Augie Fackler <augie@google.com>
parents:
24969
diff
changeset
|
34 # *guess* the uid of the user inside the VM that is actually |
33055069e465
dockerlib: fix initcontainer for boot2docker users
Augie Fackler <augie@google.com>
parents:
24969
diff
changeset
|
35 # running docker. This is *very likely* to fail at some point. |
33055069e465
dockerlib: fix initcontainer for boot2docker users
Augie Fackler <augie@google.com>
parents:
24969
diff
changeset
|
36 echo RUN useradd $DBUILDUSER -u 1000 |
33055069e465
dockerlib: fix initcontainer for boot2docker users
Augie Fackler <augie@google.com>
parents:
24969
diff
changeset
|
37 else |
27245
cea1473ba468
dockerlib: short form for non-unique uid/gid for CentOS 5 compat (issue4977)
Mathias De Maré <mathias.demare@gmail.com>
parents:
27103
diff
changeset
|
38 echo RUN groupadd $DBUILDUSER -g `id -g` -o |
cea1473ba468
dockerlib: short form for non-unique uid/gid for CentOS 5 compat (issue4977)
Mathias De Maré <mathias.demare@gmail.com>
parents:
27103
diff
changeset
|
39 echo RUN useradd $DBUILDUSER -u `id -u` -g $DBUILDUSER -o |
24970
33055069e465
dockerlib: fix initcontainer for boot2docker users
Augie Fackler <augie@google.com>
parents:
24969
diff
changeset
|
40 fi |
33597
a3ac1ea611ce
docker: pass proxy arguments to docker process
Mathias De Maré <mathias.de_mare@nokia.com>
parents:
27245
diff
changeset
|
41 ) | $DOCKER build --build-arg http_proxy --build-arg https_proxy --tag $CONTAINER - |
24969
227b9b2a57a3
dockerlib: extract initcontainer() method
Augie Fackler <augie@google.com>
parents:
24968
diff
changeset
|
42 } |