Commit Diff


commit - 044e73932dd67a6333fb1991ab83653aeb0e2902
commit + a6b158cc8110b488f51e265bea16ed17a0079e0a
blob - b00eb496bfb5c5a72716d083134d53871f9051c1
blob + 695e3dc57b3f6950442c696698ebf4591a41da82
--- lib/pack.c
+++ lib/pack.c
@@ -835,14 +835,33 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE 
 			err = got_error_from_errno();
 			goto done;
 		}
+
+		if (n == 0) {
+			/* Plain object types are the delta base. */
+			if (delta->type != GOT_OBJ_TYPE_COMMIT &&
+			    delta->type != GOT_OBJ_TYPE_TREE &&
+			    delta->type != GOT_OBJ_TYPE_BLOB &&
+			    delta->type != GOT_OBJ_TYPE_TAG) {
+				err = got_error(GOT_ERR_BAD_DELTA_CHAIN);
+				goto done;
+			}
 
+			err = got_inflate_to_file(&delta_len, delta_file,
+			    base_file);
+			fclose(delta_file);
+			if (err)
+				goto done;
+			n++;
+			rewind(base_file);
+			continue;
+		}
+
 		/* Delta streams should always fit in memory. */
 		err = got_inflate_to_mem(&delta_buf, &delta_len, delta_file);
+		fclose(delta_file);
 		if (err)
-			return err;
+			goto done;
 
-		fclose(delta_file);
-
 		err = got_delta_apply(base_file, delta_buf, delta_len,
 		    /* Final delta application writes to the output file. */
 		    ++n < deltas->nentries ? accum_file : outfile);