~launchpad-pqm/launchpad/devel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
#! /bin/bash
#
# Copyright 2009 Canonical Ltd.  This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
#
# This script will set up a brand new Ubuntu machine as a LP developer
# workstation, from scratch. The script lives in the LP codebase itself,
# as utilities/rocketfuel-setup

# We require Bazaar 1.16.1 or higher.
# So first, grab the output of 'bzr --version' and transform the
# version line, like "Bazaar (bzr) 1.16.1", into "1 16 1":
VER_RAW=`bzr --version | head -1 | sed -e 's/Bazaar (bzr) //g'`
VER_NUMS=`echo -n ${VER_RAW} | sed -e 's/[^.0-9]//g' | sed -e 's/[.]/ /g'`
# Now stuff each component into its own variable, so we can check sanely.
MAJOR=0
MINOR=0
MICRO=0
ITER=0
for VER_COMPONENT in ${VER_NUMS}; do
  if [ ${ITER} -eq 0 ]; then
    MAJOR=${VER_COMPONENT}
  elif [ ${ITER} -eq 1 ]; then
    MINOR=${VER_COMPONENT}
  elif [ ${ITER} -eq 2 ]; then
    MICRO=${VER_COMPONENT}
  # Ignore anything beyond micro -- nanoversions are irrelevant here.
  fi
  ITER=`expr ${ITER} + 1`
done
# Check that the version is high enough.
BAZAAR_BAIL=0
if [ ${MAJOR} -lt 2 ]; then
  if [ ${MAJOR} -lt 1 ]; then
    BAZAAR_BAIL=1
  elif [ ${MINOR} -lt 16 ]; then
    BAZAAR_BAIL=1
  elif [ ${MINOR} -eq 16 -a ${MICRO} -lt 1 ]; then
    BAZAAR_BAIL=1
  fi
fi
if [ ${BAZAAR_BAIL} -ne 0 ]; then
  echo "ERROR: You don't have a high enough version of Bazaar:"
  echo "  rocketfuel-setup requires bzr 1.16.1 or higher, but you have bzr ${VER_RAW}."
  echo "  Please see http://bazaar-vcs.org/Download to get a newer version."
  exit 1
fi

if [ ! -e "$HOME/.rocketfuel-env.sh" ]; then
  echo "# Common environment variables for the rocketfuel-* scripts.
#
# The ones you can set are:
#
# LP_PROJECT_ROOT - The root directory of all your Launchpad stuff.  Your
#                   Launchpad shared repository will live in a child directory
#                   of this directory.
# LP_SHARED_REPO  - Your Launchpad shared repository directory.  All of your
#                   Launchpad development branches will live under here.
# LP_TRUNK_NAME   - The directory name (not path!) to your rocketfuel trunk
#                   mirror directory.  This is relative to your shared repo.
# LP_SOURCEDEPS_DIR - The name of the directory (not path!) where your
#                   trunk sourcecode will be placed.  This is relative to your
#                   LP_PROJECT_ROOT and should /not/ have the 'sourcecode'
#                   path appended to it, since this is automatically added by
#                   the scripts.

LP_PROJECT_ROOT=\${LP_PROJECT_ROOT:=~/launchpad}
LP_SHARED_REPO=\${LP_SHARED_REPO:=lp-branches}
LP_PROJECT_PATH=\$LP_PROJECT_ROOT/\$LP_SHARED_REPO
LP_TRUNK_NAME=\${LP_TRUNK_NAME:=devel}
LP_TRUNK_PATH=\$LP_PROJECT_PATH/\$LP_TRUNK_NAME

LP_SOURCEDEPS_DIR=\${LP_SOURCEDEPS_DIR:=lp-sourcedeps}
LP_SOURCEDEPS_PATH=\$LP_PROJECT_ROOT/\$LP_SOURCEDEPS_DIR/sourcecode

# Force tilde expansion
LP_SOURCEDEPS_PATH=\$(eval echo \${LP_SOURCEDEPS_PATH})
" > "$HOME/.rocketfuel-env.sh"
fi

source "$HOME/.rocketfuel-env.sh"
if [ "$?" != 0 ]; then
    echo "Something went wrong with rocketfuel-setup!"
    exit 1
fi

# load up Ubuntu release details so we know which repos to enable
source /etc/lsb-release

# Establish LP username
whoami=`whoami`
printf "What is your Launchpad username? [$whoami] "
read lpusername
if [ -z ${lpusername} ]; then
  lpusername=${whoami}
fi

# Make sure you have all the needed virtual hosts

dev_host() {
  grep -q "^127.0.0.88.* ${hostname}" /etc/hosts
  if [ $? -ne 0 ]; then
    sudo sed -i "s/^127.0.0.88.*$/&\ ${hostname}/" /etc/hosts
    echo "${hostname} added to /etc/hosts"
  fi
  }

grep -q "^127.0.0.88" /etc/hosts
if [ $? -ne 0 ]; then
  echo "Adding development hosts on local machine"
  echo "
# Launchpad virtual domains. This should be on one line.
127.0.0.88      launchpad.dev
" | sudo tee -a /etc/hosts > /dev/null
  echo "launchpad.dev added to /etc/hosts"
fi

declare -a hostnames
hostnames=$(cat <<EOF
    answers.launchpad.dev
    archive.launchpad.dev
    api.launchpad.dev
    bazaar-internal.launchpad.dev
    beta.launchpad.dev
    blueprints.launchpad.dev
    bugs.launchpad.dev
    code.launchpad.dev
    feeds.launchpad.dev
    id.launchpad.dev
    keyserver.launchpad.dev
    lists.launchpad.dev
    openid.launchpad.dev
    ubuntu-openid.launchpad.dev
    ppa.launchpad.dev
    private-ppa.launchpad.dev
    shipit.edubuntu.dev
    shipit.kubuntu.dev
    shipit.ubuntu.dev
    testopenid.dev
    translations.launchpad.dev
    xmlrpc-private.launchpad.dev
    xmlrpc.launchpad.dev
EOF
    )

for hostname in $hostnames; do
  dev_host;
done

grep -q "^127.0.0.99" /etc/hosts
if [ $? -ne 0 ]; then
  echo "
127.0.0.99      bazaar.launchpad.dev
" | sudo tee -a /etc/hosts > /dev/null
  echo "bazaar.launchpad.dev added to /etc/hosts"
fi

# Enable relevant Ubuntu package repositories
grep -q "^deb http:.* ${DISTRIB_CODENAME} .*universe" /etc/apt/sources.list
if [ $? -ne 0 ]; then
    echo "Please enable the 'universe' component in /etc/apt/source.list'"
    exit 1
fi
grep -q "^deb http:.* ${DISTRIB_CODENAME} .*multiverse" /etc/apt/sources.list
if [ $? -ne 0 ]; then
    echo "Please enable the 'multiverse' component in /etc/apt/source.list'"
    exit 1
fi

LPDEV_SOURCES="/etc/apt/sources.list.d/launchpad-dev.list"
if [ ! -e $LPDEV_SOURCES ]; then
  sudo touch $LPDEV_SOURCES
fi

LP_PPA="deb http://ppa.launchpad.net/launchpad/ppa/ubuntu ${DISTRIB_CODENAME} main"
grep -q "^${LP_PPA}" $LPDEV_SOURCES
if [ $? -ne 0 ]; then
  echo "Adding ~launchpad PPA repository to package source list."
  echo "$LP_PPA"  | sudo tee -a $LPDEV_SOURCES
fi

BZR_PPA="deb http://ppa.launchpad.net/bzr/ppa/ubuntu ${DISTRIB_CODENAME} main"
grep -q "^${BZR_PPA}" $LPDEV_SOURCES
if [ $? -ne 0 ]; then
  echo "Adding ~bzr PPA repository to package source list."
  echo "$BZR_PPA" | sudo tee -a $LPDEV_SOURCES
fi

# Get the key used to sign the launchpad-developer-dependencies in the PPA.
REQUIRED_PPA_KEYS="0A5174AF 8C6C1EFD"
for key in $REQUIRED_PPA_KEYS; do
   sudo apt-key list | grep -q $key
   if [ $? -ne 0 ]; then
     echo "Retrieving key $key."
     gpg --keyserver keyserver.ubuntu.com --recv-keys $key
     if [ $? -ne 0 ]; then
       echo "Could not retrieve key $key."
       exit 1
     fi
     gpg --export -a $key | sudo apt-key add -
     if [ $? -ne 0 ]; then
       echo "Could not install key $key."
       exit 1
     fi
   fi
done

do_install() {
  dpkg -s $pkg | grep -q "^Status: install ok installed"
  if [ $? -ne 0 ]; then
    echo "Installing $pkg package..."
    sudo aptitude install $pkg
    if [ $? -ne 0 ]; then
      echo "Unable to install $pkg."
      exit 1
    fi
  fi
  }

sudo aptitude update
REQUIRED_PACKAGES="launchpad-developer-dependencies apache2 apache2-mpm-worker"
for pkg in $REQUIRED_PACKAGES; do
  do_install;
done

# Create the document root(s) to avoid Apache warnings
mkdir -p /var/tmp/bazaar.launchpad.dev/static
mkdir -p /var/tmp/bazaar.launchpad.dev/mirrors

sudo a2enmod proxy > /dev/null
if [ $? -ne 0 ]; then
  echo "ERROR: Unable to enable proxy module in Apache2"
  exit 1
fi

sudo a2enmod proxy_http > /dev/null
if [ $? -ne 0 ]; then
  echo "ERROR: Unable to enable proxy_http module in Apache2"
  exit 1
fi

sudo a2enmod rewrite > /dev/null
if [ $? -ne 0 ]; then
  echo "ERROR: Unable to enable rewrite module in Apache2"
  exit 1
fi

sudo a2enmod ssl > /dev/null
if [ $? -ne 0 ]; then
  echo "ERROR: Unable to enable ssl module in Apache2"
  exit 1
fi

sudo a2enmod deflate > /dev/null
if [ $? -ne 0 ]; then
  echo "ERROR: Unable to enable deflate module in Apache2"
  exit 1
fi

sudo a2enmod headers > /dev/null
if [ $? -ne 0 ]; then
  echo "ERROR: Unable to enable headers module in Apache2"
  exit 1
fi

# Create the local branch structure we will use for managing Launchpad code
mkdir -p $LP_PROJECT_ROOT
cd $LP_PROJECT_ROOT
if [ ! -d $LP_SHARED_REPO ]; then
  # 2a format (a.k.a. "brisbane-core") needed for stacking on Launchpad.
  bzr init-repo --2a $LP_SHARED_REPO
  if [ $? -ne 0 ]; then
    echo "ERROR: Unable to set up local LP repository"
    exit 1
  fi
fi
if [ ! -d $LP_SHARED_REPO/.bzr -a -d $LP_SHARED_REPO/.bzr/repository ]; then
  echo "ERROR: LP repository not found in $LP_PROJECT_PATH"
  exit 1
fi

echo "Logging bzr into Launchpad (it's okay if this errors)..."
bzr launchpad-login $lpusername
if [ $? -ne 0 ]; then
  echo ""
  echo "You can ignore any error above about not registering an SSH key"
  echo "with Launchpad.  Registering an SSH key is only important if you"
  echo "are writing data to Launchpad, or trying to access private data."
  echo ""
fi

cd $LP_SHARED_REPO
if [ ! -d $LP_TRUNK_NAME ]; then
  echo "Making local branch of Launchpad trunk, this may take a while..."
  bzr branch lp:~launchpad-pqm/launchpad/devel $LP_TRUNK_NAME
  if [ $? -ne 0 ]; then
    echo "ERROR: Unable to create local copy of Rocketfuel trunk"
    exit 1
  fi
fi

cd $LP_TRUNK_NAME
bzr st -q
if [ $? -ne 0 ]; then
  echo "ERROR: Your trunk branch in $LP_TRUNK_PATH is corrupted.
       Please delete $LP_TRUNK_PATH and run rocketfuel-setup again."
       exit 1
fi
if [ ! `bzr info | grep -i "parent branch" | cut -d: -f3` = \
  "//bazaar.launchpad.net/~launchpad-pqm/launchpad/devel/" ]; then
  echo "ERROR: Your trunk branch in $LP_TRUNK_PATH has an
       incorrect pull location, correcting now..."
  bzr pull --remember bzr+ssh://bazaar.launchpad.net/~launchpad-pqm/launchpad/devel/
  if [ $? -ne 0 ]; then
    echo "ERROR: Unable to set trunk pull location to lp:~launchpad-pqm/launchpad/devel/"
    exit 1
  fi
fi

# Call the newly minted Launchpad branch's 'make install' target to do some
# more apache setup.
sudo make install > /dev/null
if [ $? -ne 0 ]; then
  echo "ERROR: Unable to install apache config appropriately"
  exit 1
fi


# Set up Bazaar locations configuration
if [ ! -d ~/.bazaar ]; then
  mkdir ~/.bazaar
  if [ $? -ne 0 ]; then
    echo "Unable to create ~/.bazaar/ directory"
    exit 1
  fi
fi

if [ ! -e ~/.bazaar/locations.conf ]; then
  touch ~/.bazaar/locations.conf
fi

grep -q "\[${LP_PROJECT_PATH}\]" ~/.bazaar/locations.conf
if [ $? -ne 0 ]; then
  cat >> ~/.bazaar/locations.conf << EOF
[$LP_PROJECT_PATH]
submit_branch = ${LP_TRUNK_PATH}
public_branch = bzr+ssh://bazaar.launchpad.net/~${lpusername}/launchpad
public_branch:policy = appendpath
push_location = lp:~${lpusername}/launchpad
push_location:policy = appendpath
merge_target = ${LP_TRUNK_PATH}
submit_to = merge@code.launchpad.net
EOF

grep -q "\[$LP_TRUNK_PATH\]" ~/.bazaar/locations.conf
if [ $? -ne 0 ]; then
  echo "
[$LP_TRUNK_PATH]
public_branch = bzr+ssh://bazaar.launchpad.net/~launchpad-pqm/launchpad/devel\
" | tee -a ~/.bazaar/locations.conf > /dev/null
fi

echo "Bazaar branch configuration updated."

fi

# Set up scripts in /usr/local/bin
cd /usr/local/bin
if [ ! -e rocketfuel-get ]; then
  sudo ln -s $LP_TRUNK_PATH/utilities/rocketfuel-get
fi
ls -l rocketfuel-get | cut -d">" -f2 | grep -q "$LP_TRUNK_NAME\/utilities\/rocketfuel"
if [ $? -ne 0 ]; then
  echo "WARNING: /usr/local/bin/rocketfuel-get should be deleted so I can
         recreate it."
fi
if [ ! -e rocketfuel-flakes ]; then
  sudo ln -s $LP_TRUNK_PATH/utilities/rocketfuel-flakes
fi
ls -l rocketfuel-flakes | cut -d">" -f2 | grep -q "$LP_TRUNK_NAME\/utilities\/rocketfuel"
if [ $? -ne 0 ]; then
  echo "WARNING: /usr/local/bin/rocketfuel-flakes should be deleted so I can
         recreate it."
fi
if [ ! -e rocketfuel-branch ]; then
  sudo ln -s $LP_TRUNK_PATH/utilities/rocketfuel-branch
fi
ls -l rocketfuel-branch | cut -d">" -f2 | grep -q "$LP_TRUNK_NAME\/utilities\/rocketfuel"
if [ $? -ne 0 ]; then
  echo "WARNING: /usr/local/bin/rocketfuel-branch should be deleted so I can
         recreate it."
fi
if [ ! -e rocketfuel-setup ]; then
  sudo ln -s $LP_TRUNK_PATH/utilities/rocketfuel-setup
fi
ls -l rocketfuel-setup | cut -d">" -f2 | grep -q "$LP_TRUNK_NAME\/utilities\/rocketfuel"
if [ $? -ne 0 ]; then
  echo "WARNING: /usr/local/bin/rocketfuel-setup should be deleted so I can
         recreate it."
fi
if [ ! -e rocketfuel-status ]; then
  sudo ln -s $LP_TRUNK_PATH/utilities/rocketfuel-status
fi
ls -l rocketfuel-status | cut -d">" -f2 | grep -q "$LP_TRUNK_NAME\/utilities\/rocketfuel"
if [ $? -ne 0 ]; then
  echo "WARNING: /usr/local/bin/rocketfuel-status should be deleted so I can
         recreate it."
fi
if [ ! -e rocketfuel-push ]; then
  sudo ln -s $LP_TRUNK_PATH/utilities/rocketfuel-push
fi
ls -l rocketfuel-push | cut -d">" -f2 | grep -q "$LP_TRUNK_NAME\/utilities\/rocketfuel"
if [ $? -ne 0 ]; then
  echo "WARNING: /usr/local/bin/rocketfuel-push should be deleted so I can
         recreate it."
fi


# Make sure we have all the right code in place for source dependencies
/usr/local/bin/rocketfuel-get

echo "
Thank you for using this script.  You can improve it for everyone by
committing changes to Launchpad in utilities/rocketfuel-setup.

Please see http://dev.launchpad.net/ for more information on
developing and testing Launchpad, and on submitting changes.

You can use the following commands to manage your Launchpad
development environment:

 rocketfuel-get
    Update your copy of $LP_TRUNK_NAME and the necessary source
    dependencies, and make sure all source dependencies are properly
    linked in to all the branches you are working on.

 rocketfuel-branch foo
    Create a new branch of LP called \"foo\" in
    $LP_PROJECT_PATH/foo,
    with all the source dependencies properly linked in.

 rocketfuel-status
    Check each of the branches in $LP_PROJECT_PATH
    and show which of them have uncommitted changes; also check which ones
    have revisions that have not yet landed on trunk.

 rocketfuel-push
    Push all of your branches to Launchpad, so that you have a server-side
    backup of everything.

Happy hacking!
"