Linus Torvalds | b2d4619 | 2005-07-03 13:38:01 -0700 | [diff] [blame] | 1 | #!/bin/sh |
Junio C Hamano | ccf1ee3 | 2005-08-24 10:40:58 -0700 | [diff] [blame] | 2 | # |
| 3 | # Copyright (c) 2005 Linus Torvalds |
| 4 | # |
| 5 | |
Pierre Habouzit | 5715d0b | 2007-11-04 11:31:02 +0100 | [diff] [blame] | 6 | OPTIONS_KEEPDASHDASH= |
| 7 | OPTIONS_SPEC="\ |
| 8 | git-repack [options] |
| 9 | -- |
| 10 | a pack everything in a single pack |
| 11 | A same as -a, and keep unreachable objects too |
| 12 | d remove redundant packs, and run git-prune-packed |
| 13 | f pass --no-reuse-delta to git-pack-objects |
| 14 | q,quiet be quiet |
| 15 | l pass --local to git-pack-objects |
| 16 | Packing constraints |
| 17 | window= size of the window used for delta compression |
| 18 | window-memory= same as the above, but limit memory size instead of entries count |
| 19 | depth= limits the maximum delta depth |
| 20 | max-pack-size= maximum size of each packfile |
| 21 | " |
Jeff King | d0b353b | 2006-09-24 22:31:11 -0400 | [diff] [blame] | 22 | SUBDIRECTORY_OK='Yes' |
Junio C Hamano | ae2b0f1 | 2005-11-24 00:12:11 -0800 | [diff] [blame] | 23 | . git-sh-setup |
Linus Torvalds | ccb3650 | 2006-04-19 10:05:12 -0700 | [diff] [blame] | 24 | |
Junio C Hamano | 65aa530 | 2007-09-16 23:24:07 -0700 | [diff] [blame] | 25 | no_update_info= all_into_one= remove_redundant= keep_unreachable= |
Nicolas Pitre | 479b56b | 2007-05-09 12:59:40 -0400 | [diff] [blame] | 26 | local= quiet= no_reuse= extra= |
David Kastrup | 822f7c7 | 2007-09-23 22:42:08 +0200 | [diff] [blame] | 27 | while test $# != 0 |
Junio C Hamano | ccf1ee3 | 2005-08-24 10:40:58 -0700 | [diff] [blame] | 28 | do |
| 29 | case "$1" in |
| 30 | -n) no_update_info=t ;; |
Junio C Hamano | d5acdcf | 2005-08-29 10:29:53 -0700 | [diff] [blame] | 31 | -a) all_into_one=t ;; |
Junio C Hamano | 65aa530 | 2007-09-16 23:24:07 -0700 | [diff] [blame] | 32 | -A) all_into_one=t |
| 33 | keep_unreachable=--keep-unreachable ;; |
Ralf Baechle | 0adb335 | 2005-11-17 14:34:47 +0000 | [diff] [blame] | 34 | -d) remove_redundant=t ;; |
Junio C Hamano | cec2be7 | 2006-02-16 11:57:18 -0800 | [diff] [blame] | 35 | -q) quiet=-q ;; |
Nicolas Pitre | 479b56b | 2007-05-09 12:59:40 -0400 | [diff] [blame] | 36 | -f) no_reuse=--no-reuse-object ;; |
Junio C Hamano | cec2be7 | 2006-02-16 11:57:18 -0800 | [diff] [blame] | 37 | -l) local=--local ;; |
Pierre Habouzit | 5715d0b | 2007-11-04 11:31:02 +0100 | [diff] [blame] | 38 | --max-pack-size|--window|--window-memory|--depth) |
| 39 | extra="$extra $1=$2"; shift ;; |
| 40 | --) shift; break;; |
freku045@student.liu.se | 9678faa | 2005-12-13 23:30:32 +0100 | [diff] [blame] | 41 | *) usage ;; |
Junio C Hamano | ccf1ee3 | 2005-08-24 10:40:58 -0700 | [diff] [blame] | 42 | esac |
| 43 | shift |
| 44 | done |
| 45 | |
Junio C Hamano | b6945f5 | 2006-10-13 21:28:58 -0700 | [diff] [blame] | 46 | # Later we will default repack.UseDeltaBaseOffset to true |
| 47 | default_dbo=false |
| 48 | |
Tom Prince | e0d10e1 | 2007-01-28 16:16:53 -0800 | [diff] [blame] | 49 | case "`git config --bool repack.usedeltabaseoffset || |
Junio C Hamano | b6945f5 | 2006-10-13 21:28:58 -0700 | [diff] [blame] | 50 | echo $default_dbo`" in |
| 51 | true) |
| 52 | extra="$extra --delta-base-offset" ;; |
| 53 | esac |
| 54 | |
Junio C Hamano | d5acdcf | 2005-08-29 10:29:53 -0700 | [diff] [blame] | 55 | PACKDIR="$GIT_OBJECT_DIRECTORY/pack" |
Dana L. How | 6b94b1a | 2007-05-13 12:47:09 -0700 | [diff] [blame] | 56 | PACKTMP="$GIT_OBJECT_DIRECTORY/.tmp-$$-pack" |
Martin Langhoff | 0ea2582 | 2006-09-04 17:42:32 +1200 | [diff] [blame] | 57 | rm -f "$PACKTMP"-* |
| 58 | trap 'rm -f "$PACKTMP"-*' 0 1 2 3 15 |
Junio C Hamano | d5acdcf | 2005-08-29 10:29:53 -0700 | [diff] [blame] | 59 | |
| 60 | # There will be more repacking strategies to come... |
| 61 | case ",$all_into_one," in |
| 62 | ,,) |
Junio C Hamano | cd0d74d | 2006-09-18 02:29:01 -0700 | [diff] [blame] | 63 | args='--unpacked --incremental' |
Junio C Hamano | d5acdcf | 2005-08-29 10:29:53 -0700 | [diff] [blame] | 64 | ;; |
| 65 | ,t,) |
Shawn Pearce | ce85907 | 2006-10-29 04:37:54 -0500 | [diff] [blame] | 66 | if [ -d "$PACKDIR" ]; then |
| 67 | for e in `cd "$PACKDIR" && find . -type f -name '*.pack' \ |
| 68 | | sed -e 's/^\.\///' -e 's/\.pack$//'` |
| 69 | do |
| 70 | if [ -e "$PACKDIR/$e.keep" ]; then |
| 71 | : keep |
| 72 | else |
| 73 | args="$args --unpacked=$e.pack" |
| 74 | existing="$existing $e" |
| 75 | fi |
| 76 | done |
| 77 | fi |
Junio C Hamano | 65aa530 | 2007-09-16 23:24:07 -0700 | [diff] [blame] | 78 | if test -z "$args" |
| 79 | then |
| 80 | args='--unpacked --incremental' |
| 81 | elif test -n "$keep_unreachable" |
| 82 | then |
| 83 | args="$args $keep_unreachable" |
| 84 | fi |
Junio C Hamano | d5acdcf | 2005-08-29 10:29:53 -0700 | [diff] [blame] | 85 | ;; |
| 86 | esac |
Martin Langhoff | 0ea2582 | 2006-09-04 17:42:32 +1200 | [diff] [blame] | 87 | |
Nicolas Pitre | 479b56b | 2007-05-09 12:59:40 -0400 | [diff] [blame] | 88 | args="$args $local $quiet $no_reuse$extra" |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 89 | names=$(git pack-objects --non-empty --all --reflog $args </dev/null "$PACKTMP") || |
Linus Torvalds | b2d4619 | 2005-07-03 13:38:01 -0700 | [diff] [blame] | 90 | exit 1 |
Dana L. How | 6b94b1a | 2007-05-13 12:47:09 -0700 | [diff] [blame] | 91 | if [ -z "$names" ]; then |
Uwe Kleine-König | d9fb395 | 2007-07-03 10:47:58 +0200 | [diff] [blame] | 92 | if test -z "$quiet"; then |
| 93 | echo Nothing new to pack. |
| 94 | fi |
Dana L. How | 6b94b1a | 2007-05-13 12:47:09 -0700 | [diff] [blame] | 95 | fi |
| 96 | for name in $names ; do |
Dana How | dca3957 | 2007-05-24 19:06:42 -0700 | [diff] [blame] | 97 | fullbases="$fullbases pack-$name" |
Nicolas Pitre | ad2c82c | 2006-12-13 16:25:26 -0500 | [diff] [blame] | 98 | chmod a-w "$PACKTMP-$name.pack" |
| 99 | chmod a-w "$PACKTMP-$name.idx" |
Martin Waitz | 178613c | 2006-05-07 20:18:53 +0200 | [diff] [blame] | 100 | mkdir -p "$PACKDIR" || exit |
| 101 | |
Junio C Hamano | 2ad47d6 | 2006-06-25 05:28:58 -0700 | [diff] [blame] | 102 | for sfx in pack idx |
| 103 | do |
| 104 | if test -f "$PACKDIR/pack-$name.$sfx" |
| 105 | then |
| 106 | mv -f "$PACKDIR/pack-$name.$sfx" \ |
| 107 | "$PACKDIR/old-pack-$name.$sfx" |
| 108 | fi |
| 109 | done && |
Martin Langhoff | 0ea2582 | 2006-09-04 17:42:32 +1200 | [diff] [blame] | 110 | mv -f "$PACKTMP-$name.pack" "$PACKDIR/pack-$name.pack" && |
| 111 | mv -f "$PACKTMP-$name.idx" "$PACKDIR/pack-$name.idx" && |
Junio C Hamano | 2ad47d6 | 2006-06-25 05:28:58 -0700 | [diff] [blame] | 112 | test -f "$PACKDIR/pack-$name.pack" && |
| 113 | test -f "$PACKDIR/pack-$name.idx" || { |
| 114 | echo >&2 "Couldn't replace the existing pack with updated one." |
| 115 | echo >&2 "The original set of packs have been saved as" |
| 116 | echo >&2 "old-pack-$name.{pack,idx} in $PACKDIR." |
| 117 | exit 1 |
| 118 | } |
| 119 | rm -f "$PACKDIR/old-pack-$name.pack" "$PACKDIR/old-pack-$name.idx" |
Dana L. How | 6b94b1a | 2007-05-13 12:47:09 -0700 | [diff] [blame] | 120 | done |
Junio C Hamano | d5acdcf | 2005-08-29 10:29:53 -0700 | [diff] [blame] | 121 | |
Ralf Baechle | 0adb335 | 2005-11-17 14:34:47 +0000 | [diff] [blame] | 122 | if test "$remove_redundant" = t |
Junio C Hamano | d5acdcf | 2005-08-29 10:29:53 -0700 | [diff] [blame] | 123 | then |
Shawn Pearce | ce85907 | 2006-10-29 04:37:54 -0500 | [diff] [blame] | 124 | # We know $existing are all redundant. |
| 125 | if [ -n "$existing" ] |
Lukas Sandström | 62af0b5 | 2005-11-18 21:36:12 +0100 | [diff] [blame] | 126 | then |
Junio C Hamano | 6ed6405 | 2005-11-19 12:13:53 -0800 | [diff] [blame] | 127 | sync |
| 128 | ( cd "$PACKDIR" && |
| 129 | for e in $existing |
| 130 | do |
Dana How | dca3957 | 2007-05-24 19:06:42 -0700 | [diff] [blame] | 131 | case " $fullbases " in |
| 132 | *" $e "*) ;; |
Shawn Pearce | ce85907 | 2006-10-29 04:37:54 -0500 | [diff] [blame] | 133 | *) rm -f "$e.pack" "$e.idx" "$e.keep" ;; |
Lukas Sandström | 62af0b5 | 2005-11-18 21:36:12 +0100 | [diff] [blame] | 134 | esac |
Junio C Hamano | 6ed6405 | 2005-11-19 12:13:53 -0800 | [diff] [blame] | 135 | done |
| 136 | ) |
Junio C Hamano | d5acdcf | 2005-08-29 10:29:53 -0700 | [diff] [blame] | 137 | fi |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 138 | git prune-packed $quiet |
Junio C Hamano | d5acdcf | 2005-08-29 10:29:53 -0700 | [diff] [blame] | 139 | fi |
| 140 | |
Junio C Hamano | ccf1ee3 | 2005-08-24 10:40:58 -0700 | [diff] [blame] | 141 | case "$no_update_info" in |
| 142 | t) : ;; |
| 143 | *) git-update-server-info ;; |
| 144 | esac |