88
echo Nothing new to pack.
89
fi
90
fi
91
-for name in $names ; do
92
- fullbases="$fullbases pack-$name"
93
- chmod a-w "$PACKTMP-$name.pack"
94
- chmod a-w "$PACKTMP-$name.idx"
95
- mkdir -p "$PACKDIR" || exit
91
92
+# Ok we have prepared all new packfiles.
93
+mkdir -p "$PACKDIR" || exit
94
+
95
+# First see if there are packs of the same name and if so
96
+# if we can move them out of the way (this can happen if we
97
+# repacked immediately after packing fully.
98
+rollback=
99
+failed=
100
+for name in $names
101
+do
102
for sfx in pack idx
103
do
99
- if test -f "$PACKDIR/pack-$name.$sfx"
100
- then
101
- mv -f "$PACKDIR/pack-$name.$sfx" \
102
- "$PACKDIR/old-pack-$name.$sfx"
103
- fi
104
- done &&
104
+ file=pack-$name.$sfx
105
+ test -f "$PACKDIR/$file" || continue
106
+ rm -f "$PACKDIR/old-$file" &&
107
+ mv "$PACKDIR/$file" "$PACKDIR/old-$file" || {
108
+ failed=t
109
+ break
110
+ }
111
+ rollback="$rollback $file"
112
+ done
113
+ test -z "$failed" || break
114
+done
115
+
116
+# If renaming failed for any of them, roll the ones we have
117
+# already renamed back to their original names.
118
+if test -n "$failed"
119
+then
120
+ rollback_failure=
121
+ for file in $rollback
122
+ do
123
+ mv "$PACKDIR/old-$file" "$PACKDIR/$file" ||
124
+ rollback_failure="$rollback_failure $file"
125
+ done
126
+ if test -n "$rollback_failure"
127
+ then
128
+ echo >&2 "WARNING: Some packs in use have been renamed by"
129
+ echo >&2 "WARNING: prefixing old- to their name, in order to"
130
+ echo >&2 "WARNING: replace them with the new version of the"
131
+ echo >&2 "WARNING: file. But the operation failed, and"
132
+ echo >&2 "WARNING: attempt to rename them back to their"
133
+ echo >&2 "WARNING: original names also failed."
134
+ echo >&2 "WARNING: Please rename them in $PACKDIR manually:"
135
+ for file in $rollback_failure
136
+ do
137
+ echo >&2 "WARNING: old-$file -> $file"
138
+ done
139
+ fi
140
+ exit 1
141
+fi
142
+
143
+# Now the ones with the same name are out of the way...
144
+fullbases=
145
+for name in $names
146
+do
147
+ fullbases="$fullbases pack-$name"
148
+ chmod a-w "$PACKTMP-$name.pack"
149
+ chmod a-w "$PACKTMP-$name.idx"
150
mv -f "$PACKTMP-$name.pack" "$PACKDIR/pack-$name.pack" &&
106
- mv -f "$PACKTMP-$name.idx" "$PACKDIR/pack-$name.idx" &&
107
- test -f "$PACKDIR/pack-$name.pack" &&
108
- test -f "$PACKDIR/pack-$name.idx" || {
109
- echo >&2 "Couldn't replace the existing pack with updated one."
110
- echo >&2 "The original set of packs have been saved as"
111
- echo >&2 "old-pack-$name.{pack,idx} in $PACKDIR."
112
- exit 1
113
- }
114
- rm -f "$PACKDIR/old-pack-$name.pack" "$PACKDIR/old-pack-$name.idx"
151
+ mv -f "$PACKTMP-$name.idx" "$PACKDIR/pack-$name.idx" ||
152
+ exit
153
+done
154
+
155
+# Remove the "old-" files
156
+for name in $names
157
+do
158
+ rm -f "$PACKDIR/old-pack-$name.idx"
159
+ rm -f "$PACKDIR/old-pack-$name.pack"
160
done
161
162
+# End of pack replacement.
163
+
164
if test "$remove_redundant" = t
165
then
166
# We know $existing are all redundant.