From 949ebdc92a3acb51e8cf891e813106fd01d44881 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 14 Feb 2013 00:00:00 +0000 Subject: [PATCH] Use 'pack' lines in manifest for packs (REPO FORMAT CHANGE) --- git-remote-gcrypt | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/git-remote-gcrypt b/git-remote-gcrypt index 96fda22..323bf56 100755 --- a/git-remote-gcrypt +++ b/git-remote-gcrypt @@ -125,6 +125,8 @@ make_new_repo() ensure_connected() { + local MANIFESTDATA + if [ ! -z "$DID_CONNECT" ] then return @@ -132,6 +134,8 @@ ensure_connected() DID_CONNECT=1 MASTERKEY="$(get_masterkey)" MANIFESTDATA="$(GET_OR_EMPTY "$URL" manifest | DECRYPT)" + BRANCHLIST=$(printf "%s\n" "$MANIFESTDATA" | (grep -v '^pack ' || :)) + PACKLIST=$(printf "%s\n" "$MANIFESTDATA" | (grep '^pack ' || :)) } get_masterkey() @@ -153,7 +157,7 @@ do_list() local REFNAME ensure_connected - printf "%s\n" "$MANIFESTDATA" | while read LINE + printf "%s\n" "$BRANCHLIST" | while read LINE do OBJID=${LINE%% *} REFNAME=${LINE##* } @@ -172,17 +176,14 @@ do_fetch() { # Security protocol: # The PACK id is the SHA-1 of the encrypted git packfile. - # We only download packs mentioned in the encrypted 'packfest', + # We only download packs mentioned in the encrypted manifest, # and check their digest when received. local PNEED - local PREMOTE local PBOTH local PHAVE ensure_connected - touch "$LOCALDIR/packfest" - PREMOTE="$(GET_OR_EMPTY "$URL" packfest | DECRYPT)" - if [ -z "$PREMOTE" ] + if [ -z "$PACKLIST" ] then echo # end with blank line exit 0 @@ -192,12 +193,13 @@ do_fetch() trap 'rm -f "$TMPPACK_ENCRYPTED"' EXIT # Needed packs is REMOTE - (HAVE & REMOTE) - PHAVE="$(cat "$LOCALDIR/packfest")" - PBOTH="$(printf "%s\n%s" "$PREMOTE" "$PHAVE" | sort | uniq -d)" - PNEED="$(printf "%s\n%s" "$PREMOTE" "$PBOTH" | sort | uniq -u)" + PHAVE="$(cat "$LOCALDIR/have_packs" || :)" + PBOTH="$(printf "%s\n%s" "$PACKLIST" "$PHAVE" | sort | uniq -d)" + PNEED="$(printf "%s\n%s" "$PACKLIST" "$PBOTH" | sort | uniq -u)" - printf "%s\n" "$PNEED" | while read PACK + printf "%s\n" "$PNEED" | while read PACKLINE do + PACK=${PACKLINE#pack } RCVID="$(GET "$URL" "$PACK" | tee "$TMPPACK_ENCRYPTED" | sha1)" if [ "$RCVID" != "$PACK" ] then @@ -207,7 +209,7 @@ do_fetch() DECRYPT < "$TMPPACK_ENCRYPTED" | git unpack-objects # add to local pack list - printf "%s\n" "$PACK" >> "$LOCALDIR/packfest" + printf "pack %s\n" "$PACK" >> "$LOCALDIR/have_packs" done rm -f "$TMPPACK_ENCRYPTED" @@ -220,11 +222,11 @@ do_push() { # Security protocol: # Each git packfile is encrypted and then named for the encrypted - # file's SHA-1. `packfest` is updated with the pack id. - # The packfest and manifest are encrypted. + # file's SHA-1. The manifest is updated with the pack id. + # The manifest is encrypted. local REMOTEHAS local REMOTEWANT - local PACKFEST + local MANIFESTDATA local prefix_ local suffix_ ensure_connected @@ -237,10 +239,10 @@ do_push() trap 'rm -f "$TMPMANIFEST" "$TMPPACK_ENCRYPTED" "$TMPOBJLIST"' EXIT TMPMANIFEST="$LOCALDIR/tmp_new_manifest_.$$" touch "$TMPMANIFEST" - if [ ! -z "$MANIFESTDATA" ] + if [ ! -z "$BRANCHLIST" ] then - printf "%s\n" "$MANIFESTDATA" > "$TMPMANIFEST" - REMOTEHAS="$(printf "%s" "$MANIFESTDATA" | \ + printf "%s\n" "$BRANCHLIST" >"$TMPMANIFEST" + REMOTEHAS="$(printf "%s" "$BRANCHLIST" | \ cut -f1 -d' ' | sed -e s/^/^/ | tr '\n' ' ')" fi @@ -257,7 +259,7 @@ do_push() done)" # POSIX compat issue: sort -s (stable), but supported in bsd and gnu - MANIFESTDATA="$(sort -k2 -s "$TMPMANIFEST" | tac | uniq -s40)" + BRANCHLIST="$(sort -k2 -s "$TMPMANIFEST" | tac | uniq -s40)" TMPPACK_ENCRYPTED="$LOCALDIR/tmp_pack_ENCRYPTED_.$$" TMPOBJLIST="$LOCALDIR/tmp_packrevlist.$$" @@ -268,18 +270,17 @@ do_push() if [ -s "$TMPOBJLIST" ] then PACKID=$(sha1 < "$TMPPACK_ENCRYPTED") - PACKFEST="$(GET_OR_EMPTY "$URL" packfest | DECRYPT)" - if [ -z "$PACKFEST" ] + if [ -z "$PACKLIST" ] then - PACKFEST="$(printf "%s\n" "$PACKID")" + PACKLIST="$(printf "pack %s\n" "$PACKID")" else - PACKFEST="$(printf "%s\n%s\n" "$PACKFEST" "$PACKID")" + PACKLIST="$(printf "%s\npack %s\n" "$PACKLIST" "$PACKID")" fi PUT "$URL" "$PACKID" < "$TMPPACK_ENCRYPTED" - printf "%s\n" "$PACKFEST" | ENCRYPT | PUT "$URL" "packfest" fi + MANIFESTDATA=$(printf "%s\n%s\n" "$BRANCHLIST" "$PACKLIST") printf "%s\n" "$MANIFESTDATA" | ENCRYPT | PUT "$URL" "manifest" # ok all updates (not deletes)