-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Start handling references internally as a sorted in-memory list
This also adds some very rudimentary support for the notion of packed refs. HOWEVER! At this point it isn't used to actually look up a ref yet, only for listing them (ie "for_each_ref()" and friends see the packed refs, but none of the other single-ref lookup routines). Note how we keep two separate lists: one for the loose refs, and one for the packed refs we read. That's so that we can easily keep the two apart, and read only one set or the other (and still always make sure that the loose refs take precedence). [ From this, it's not actually obvious why we'd keep the two separate lists, but it's important to have the packed refs on their own list later on, when I add support for looking up a single loose one. For that case, we will want to read _just_ the packed refs in case the single-ref lookup fails, yet we may end up needing the other list at some point in the future, so keeping them separated is important ] Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
- Loading branch information
Linus Torvalds
authored and
Junio C Hamano
committed
Sep 18, 2006
1 parent
808239a
commit e1e22e3
Showing
5 changed files
with
218 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
#include "cache.h" | ||
#include "refs.h" | ||
|
||
static FILE *refs_file; | ||
static const char *result_path, *lock_path; | ||
|
||
static void remove_lock_file(void) | ||
{ | ||
if (lock_path) | ||
unlink(lock_path); | ||
} | ||
|
||
static int handle_one_ref(const char *path, const unsigned char *sha1) | ||
{ | ||
fprintf(refs_file, "%s %s\n", sha1_to_hex(sha1), path); | ||
return 0; | ||
} | ||
|
||
int cmd_pack_refs(int argc, const char **argv, const char *prefix) | ||
{ | ||
int fd; | ||
|
||
result_path = xstrdup(git_path("packed-refs")); | ||
lock_path = xstrdup(mkpath("%s.lock", result_path)); | ||
|
||
fd = open(lock_path, O_CREAT | O_EXCL | O_WRONLY, 0666); | ||
if (fd < 0) | ||
die("unable to create new ref-pack file (%s)", strerror(errno)); | ||
atexit(remove_lock_file); | ||
|
||
refs_file = fdopen(fd, "w"); | ||
if (!refs_file) | ||
die("unable to create ref-pack file structure (%s)", strerror(errno)); | ||
for_each_ref(handle_one_ref); | ||
fsync(fd); | ||
fclose(refs_file); | ||
if (rename(lock_path, result_path) < 0) | ||
die("unable to overwrite old ref-pack file (%s)", strerror(errno)); | ||
lock_path = NULL; | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters