File: release.sh

package info (click to toggle)
acl2 8.6%2Bdfsg-2
  • links: PTS
  • area: main
  • in suites: trixie
  • size: 1,111,420 kB
  • sloc: lisp: 17,818,294; java: 125,359; python: 28,122; javascript: 23,458; cpp: 18,851; ansic: 11,569; perl: 7,678; xml: 5,591; sh: 3,976; makefile: 3,833; ruby: 2,633; yacc: 1,126; ml: 763; awk: 295; csh: 233; lex: 197; php: 178; tcl: 49; asm: 23; haskell: 17
file content (153 lines) | stat: -rw-r--r-- 3,787 bytes parent folder | download | duplicates (8)
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
#!/bin/bash

### Configuration

PROJECT_NAME='osicat'
ASDF_FILE="$PROJECT_NAME.asd"
HOST="common-lisp.net"
RELEASE_DIR="/project/$PROJECT_NAME/public_html/files"
VERSION_FILE="VERSION"
VERSION_FILE_DIR="/project/$PROJECT_NAME/public_html"

set -e

### Process options

FORCE=0
VERSION=""

while [ $# -gt 0 ]; do
    case "$1" in
        -h|--help)
            echo "No help, sorry. Read the source."
            exit 0
            ;;
        -f|--force)
            FORCE=1
            shift
            ;;
        -v|--version)
            VERSION="$2"
            shift 2
            ;;
        *)
            echo "Unrecognized argument '$1'"
            exit 1
            ;;
    esac
done

### Check for unrecorded changes

if ! git diff --exit-code; then
    echo -n "Unrecorded changes. "
    if [ "$FORCE" -ne 1  ]; then
        echo "Aborting."
        echo "Use -f or --force if you want to make a release anyway."
        exit 1
    else
        echo "Continuing anyway."
    fi
fi

### Determine new version number

if [ -z "$VERSION" ]; then
    CURRENT_VERSION=$(git tag -l v* | head -n1 | cut -d- -f2)

    dots=$(echo "$CURRENT_VERSION" | tr -cd '.')
    count=$(expr length "$dots" + 1)
    declare -a versions

    for i in $(seq $count); do
        new=""
        for j in $(seq $(expr $i - 1)); do
            p=$(echo "$CURRENT_VERSION" | cut -d. -f$j)
            new="$new$p."
        done
        part=$(expr 1 + $(echo "$CURRENT_VERSION" | cut -d. -f$i))
        new="$new$part"
        for j in $(seq $(expr $i + 1) $count); do new="$new.0"; done
        versions[$i]=$new
    done

    while true; do
        echo "Current version is $CURRENT_VERSION. Which will be next one?"
        for i in $(seq $count); do echo "    $i) ${versions[$i]}"; done
        echo -n "? "
        read choice

        if ((choice > 0)) && ((choice <= ${#versions[@]})); then
            VERSION=${versions[$choice]}
            break
        fi
    done
fi

### Do it

DIST_NAME="${PROJECT_NAME}_${VERSION}"
TARBALL="$DIST_NAME.tar.gz"
SIGNATURE="$TARBALL.asc"

#echo "Updating $ASDF_FILE with new version: $VERSION"
#sed -e "s/:version \"$CURRENT_VERSION\"/:version \"$VERSION\"/" \
#    "$ASDF_FILE" > "$ASDF_FILE.tmp"
#mv "$ASDF_FILE.tmp" "$ASDF_FILE"
#
#darcs record -m "update $ASDF_FILE for version $VERSION"

echo "Tagging the tree..."
git tag "v$VERSION"

echo "Creating distribution..."
mkdir "$DIST_NAME"
git archive master | tar xC "$DIST_NAME"

echo "Updating $ASDF_FILE with new version: $VERSION"
sed -e "s/^(defsystem \(.*\)/(defsystem \1\n  :version \"$VERSION\"/" \
    "$DIST_NAME/$ASDF_FILE" > "$DIST_NAME/$ASDF_FILE.tmp"
mv "$DIST_NAME/$ASDF_FILE.tmp" "$DIST_NAME/$ASDF_FILE"

echo "Creating and signing tarball..."
tar czf "$TARBALL" "$DIST_NAME"
gpg -b -a "$TARBALL"

echo "Copying tarball to web server..."
scp "$TARBALL" "$SIGNATURE" "$HOST:$RELEASE_DIR"
echo "Uploaded $TARBALL and $SIGNATURE."

echo "Updating ${PROJECT_NAME}_latest links..."
ssh $HOST ln -sf "$TARBALL" "$RELEASE_DIR/${PROJECT_NAME}_latest.tar.gz"
ssh $HOST ln -sf "$SIGNATURE" "$RELEASE_DIR/${PROJECT_NAME}_latest.tar.gz.asc"

if [ "$VERSION_FILE" ]; then
    echo "Uploading $VERSION_FILE..."
    echo -n "$VERSION" > "$VERSION_FILE"
    scp "$VERSION_FILE" "$HOST":"$VERSION_FILE_DIR"
    rm "$VERSION_FILE"
fi

while true; do
    echo -n "Clean local tarball and signature? [y] "
    read -n 1 response
    case "$response" in
        y|'')
            echo
            rm "$TARBALL" "$SIGNATURE"
            break
            ;;
        n)
            break
            ;;
        *)
            echo "Invalid response '$response'. Try again."
            ;;
    esac
done

echo "Building and uploading documentation..."
make -C doc all upload

echo "Pushing changes..."
git push