object-file: get rid of `the_repository` in `force_object_loose()`
The function `force_object_loose()` forces an object to become a loose object in case it only exists in its packed form. To do so it implicitly relies on `the_repository`. Refactor the function by passing a `struct odb_source` as parameter. While the check whether any such loose object exists already acts on the whole object database, writing the loose object happens in one specific source. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									0df005353a
								
							
						
					
					
						commit
						c2b5d1490a
					
				|  | @ -4411,7 +4411,8 @@ static void loosen_unused_packed_objects(void) | ||||||
| 			if (!packlist_find(&to_pack, &oid) && | 			if (!packlist_find(&to_pack, &oid) && | ||||||
| 			    !has_sha1_pack_kept_or_nonlocal(&oid) && | 			    !has_sha1_pack_kept_or_nonlocal(&oid) && | ||||||
| 			    !loosened_object_can_be_discarded(&oid, p->mtime)) { | 			    !loosened_object_can_be_discarded(&oid, p->mtime)) { | ||||||
| 				if (force_object_loose(&oid, p->mtime)) | 				if (force_object_loose(the_repository->objects->sources, | ||||||
|  | 						       &oid, p->mtime)) | ||||||
| 					die(_("unable to force loose object")); | 					die(_("unable to force loose object")); | ||||||
| 				loosened_objects_nr++; | 				loosened_objects_nr++; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | @ -1077,10 +1077,10 @@ int write_object_file(struct odb_source *source, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| int force_object_loose(const struct object_id *oid, time_t mtime) | int force_object_loose(struct odb_source *source, | ||||||
|  | 		       const struct object_id *oid, time_t mtime) | ||||||
| { | { | ||||||
| 	struct repository *repo = the_repository; | 	const struct git_hash_algo *compat = source->odb->repo->compat_hash_algo; | ||||||
| 	const struct git_hash_algo *compat = repo->compat_hash_algo; |  | ||||||
| 	void *buf; | 	void *buf; | ||||||
| 	unsigned long len; | 	unsigned long len; | ||||||
| 	struct object_info oi = OBJECT_INFO_INIT; | 	struct object_info oi = OBJECT_INFO_INIT; | ||||||
|  | @ -1090,24 +1090,24 @@ int force_object_loose(const struct object_id *oid, time_t mtime) | ||||||
| 	int hdrlen; | 	int hdrlen; | ||||||
| 	int ret; | 	int ret; | ||||||
|  |  | ||||||
| 	for (struct odb_source *source = repo->objects->sources; source; source = source->next) | 	for (struct odb_source *s = source->odb->sources; s; s = s->next) | ||||||
| 		if (has_loose_object(source, oid)) | 		if (has_loose_object(s, oid)) | ||||||
| 			return 0; | 			return 0; | ||||||
|  |  | ||||||
| 	oi.typep = &type; | 	oi.typep = &type; | ||||||
| 	oi.sizep = &len; | 	oi.sizep = &len; | ||||||
| 	oi.contentp = &buf; | 	oi.contentp = &buf; | ||||||
| 	if (odb_read_object_info_extended(the_repository->objects, oid, &oi, 0)) | 	if (odb_read_object_info_extended(source->odb, oid, &oi, 0)) | ||||||
| 		return error(_("cannot read object for %s"), oid_to_hex(oid)); | 		return error(_("cannot read object for %s"), oid_to_hex(oid)); | ||||||
| 	if (compat) { | 	if (compat) { | ||||||
| 		if (repo_oid_to_algop(repo, oid, compat, &compat_oid)) | 		if (repo_oid_to_algop(source->odb->repo, oid, compat, &compat_oid)) | ||||||
| 			return error(_("cannot map object %s to %s"), | 			return error(_("cannot map object %s to %s"), | ||||||
| 				     oid_to_hex(oid), compat->name); | 				     oid_to_hex(oid), compat->name); | ||||||
| 	} | 	} | ||||||
| 	hdrlen = format_object_header(hdr, sizeof(hdr), type, len); | 	hdrlen = format_object_header(hdr, sizeof(hdr), type, len); | ||||||
| 	ret = write_loose_object(repo->objects->sources, oid, hdr, hdrlen, buf, len, mtime, 0); | 	ret = write_loose_object(source, oid, hdr, hdrlen, buf, len, mtime, 0); | ||||||
| 	if (!ret && compat) | 	if (!ret && compat) | ||||||
| 		ret = repo_add_loose_object_map(the_repository->objects->sources, oid, &compat_oid); | 		ret = repo_add_loose_object_map(source, oid, &compat_oid); | ||||||
| 	free(buf); | 	free(buf); | ||||||
|  |  | ||||||
| 	return ret; | 	return ret; | ||||||
|  |  | ||||||
|  | @ -161,7 +161,8 @@ int stream_loose_object(struct odb_source *source, | ||||||
| 			struct input_stream *in_stream, size_t len, | 			struct input_stream *in_stream, size_t len, | ||||||
| 			struct object_id *oid); | 			struct object_id *oid); | ||||||
|  |  | ||||||
| int force_object_loose(const struct object_id *oid, time_t mtime); | int force_object_loose(struct odb_source *source, | ||||||
|  | 		       const struct object_id *oid, time_t mtime); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * With in-core object data in "buf", rehash it to make sure the |  * With in-core object data in "buf", rehash it to make sure the | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Patrick Steinhardt
						Patrick Steinhardt