summaryrefslogtreecommitdiff
path: root/archive
blob: c2e810eba10b236208c8251a2c5aee0ec6c864c5 (plain)
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
#!/bin/sh

# to be periodically run on the master mirror

# this requires the master mirror to be on the same drive as the archive

master_mirror_root='/srv/arch-mirror/arch/arch/archlinux32'
archive_root='/srv/arch-mirror/archive.archlinux32'
lock_file='/tmp/archive.lock'

# get lock
if [ -f "${lock_file}" ] && kill -0 "$(cat "${lock_file}")"; then
  >&2 echo 'cannot get lock'
  exit
fi
echo "$$" >"${lock_file}"

# copy the isos
find "${master_mirror_root}/archisos" \
  -mindepth 1 \
  -maxdepth 1 \
  -type f \
| while read -r file; do
  if [ -z "${file##*sums}" ]; then
    diff -u "${file}" "${archive_root}/iso/${file##*/}" \
    | sed '
      s/^-\([^-][^-]\)/\1/
      t
      d
    ' \
    | sponge -a "${archive_root}/iso/${file##*/}"
  fi
  [ -f "${archive_root}/iso/${file##*/}" ] && continue
  ln "${file}" "${archive_root}/iso/${file##*/}"
done

# copy the packages
find "${master_mirror_root}/pool" \
  -mindepth 1 \
  -maxdepth 1 \
  -type f \
| sed '
  s,.*/\([^/]\)\([^/]*\)$,\0 \1 \1\2,
' \
| while read -r path initial file; do
  target="${archive_root}/packages/${initial}/${file%-*-*-*}/${file}"
  [ -f "${target}" ] && continue
  mkdir -p "${target%/*}"
  ln "${path}" "${target}"
done

# copy the repositories
todays_path=$(date '+%Y/%m/%d')
todays_path="${archive_root}/repos/${todays_path}"
if [ ! -d "${todays_path}" ]; then
  for arch in i486 i686 pentium4; do
    find "${master_mirror_root}/${arch}" \
      -mindepth 1 \
      -maxdepth 1 \
      -type d \
      -printf '%f\n' \
    | while read -r repo; do
      mkdir -p "${todays_path}/${arch}/${repo}"
      cp -a \
        "${master_mirror_root}/${arch}/${repo}/${repo}.db" \
        "${master_mirror_root}/${arch}/${repo}/${repo}.db.tar.gz" \
        "${master_mirror_root}/${arch}/${repo}/${repo}.files" \
        "${master_mirror_root}/${arch}/${repo}/${repo}.files.tar.gz" \
        "${todays_path}/${arch}/${repo}/"
      find "${master_mirror_root}/${arch}/${repo}" \
        -mindepth 1 \
        -maxdepth 1 \
        -type l \
        \( \
          -name '*.pkg.tar.xz' \
          -o -name '*.pkg.tar.xz.sig' \
        \) \
        -printf '%f\n' \
      | sed '
        s/^./\0 \0/
      ' \
      | while read -r initial file; do
        ln -s \
          "../../../../../../packages/${initial}/${file%-*-*-*}/${file}" \
          "${todays_path}/${arch}/${repo}/${file}"
      done
    done
  done
  rm -f \
    "${archive_root}/repos/last" \
    "${archive_root}/repos/week" \
    "${archive_root}/repos/month"
  ln -s \
    "${todays_path}" \
    "${archive_root}/repos/last"
  first_of_month=$(
    find "${archive_root}/repos" -mindepth 3 -maxdepth 3 \
    | sed '
      s,^.*/\([^/]\+\)/\([^/]\+\)/\([^/]\+\)$,\1/\2 \3,
      t
      d
    ' \
    | sort -k1r,1 -k2,2 \
    | head -n1 \
    | tr ' ' '/'
  )
  ln -s \
    "${archive_root}/repos/${first_of_month}" \
    "${archive_root}/repos/month"
  first_of_week=$(
    find "${archive_root}/repos" -mindepth 3 -maxdepth 3 \
    | sed '
      s,^.*/\([^/]\+\)/\([^/]\+\)/\([^/]\+\)$,\1-\2-\3,
      t
      d
    ' \
    | sort \
    | tail -n7 \
    | while read -r date; do
      date '+%Y/%m/%d %G %V' -d "${date}"
    done \
    | sort -k2r,3 -k1,1 \
    | head -n1 \
    | cut -d' ' -f1
  )
  ln -s \
    "${archive_root}/repos/${first_of_week}" \
    "${archive_root}/repos/week"
fi

# release lock
rm -f "${lock_file}"