Skip to content

Commit

Permalink
Make pull() support fetching multiple targets at once
Browse files Browse the repository at this point in the history
pull() now takes an array of arguments instead of just one of each kind.
Currently, no users use the new capability, but that'll change.

Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Petr Baudis authored and Junio C Hamano committed Jul 28, 2006
1 parent c6b69bd commit 4211e4d
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 37 deletions.
78 changes: 45 additions & 33 deletions fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,55 +210,67 @@ static int mark_complete(const char *path, const unsigned char *sha1)
return 0;
}

int pull(char *target, const char *write_ref,
int pull(int targets, char **target, const char **write_ref,
const char *write_ref_log_details)
{
struct ref_lock *lock = NULL;
unsigned char sha1[20];
struct ref_lock **lock = xcalloc(targets, sizeof(struct ref_lock *));
unsigned char *sha1 = xmalloc(targets * 20);
char *msg;
int ret;
int i;

save_commit_buffer = 0;
track_object_refs = 0;
if (write_ref) {
lock = lock_ref_sha1(write_ref, NULL, 0);
if (!lock) {
error("Can't lock ref %s", write_ref);
return -1;

for (i = 0; i < targets; i++) {
if (!write_ref[i])
continue;

lock[i] = lock_ref_sha1(write_ref[i], NULL, 0);
if (!lock[i]) {
error("Can't lock ref %s", write_ref[i]);
goto unlock_and_fail;
}
}

if (!get_recover)
for_each_ref(mark_complete);

if (interpret_target(target, sha1)) {
error("Could not interpret %s as something to pull", target);
if (lock)
unlock_ref(lock);
return -1;
for (i = 0; i < targets; i++) {
if (interpret_target(target[i], &sha1[20 * i])) {
error("Could not interpret %s as something to pull", target[i]);
goto unlock_and_fail;
}
if (process(lookup_unknown_object(&sha1[20 * i])))
goto unlock_and_fail;
}
if (process(lookup_unknown_object(sha1))) {
if (lock)
unlock_ref(lock);
return -1;

if (loop())
goto unlock_and_fail;

if (write_ref_log_details) {
msg = xmalloc(strlen(write_ref_log_details) + 12);
sprintf(msg, "fetch from %s", write_ref_log_details);
} else {
msg = NULL;
}
if (loop()) {
if (lock)
unlock_ref(lock);
return -1;
for (i = 0; i < targets; i++) {
if (!write_ref[i])
continue;
ret = write_ref_sha1(lock[i], &sha1[20 * i], msg ? msg : "fetch (unknown)");
lock[i] = NULL;
if (ret)
goto unlock_and_fail;
}
if (msg)
free(msg);

if (write_ref) {
if (write_ref_log_details) {
msg = xmalloc(strlen(write_ref_log_details) + 12);
sprintf(msg, "fetch from %s", write_ref_log_details);
}
else
msg = NULL;
ret = write_ref_sha1(lock, sha1, msg ? msg : "fetch (unknown)");
if (msg)
free(msg);
return ret;
}
return 0;


unlock_and_fail:
for (i = 0; i < targets; i++)
if (lock[i])
unlock_ref(lock[i]);
return -1;
}
2 changes: 1 addition & 1 deletion fetch.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ extern void pull_say(const char *, const char *);

/* If write_ref is set, the ref filename to write the target value to. */
/* If write_ref_log_details is set, additional text will appear in the ref log. */
extern int pull(char *target, const char *write_ref,
extern int pull(int targets, char **target, const char **write_ref,
const char *write_ref_log_details);

#endif /* PULL_H */
2 changes: 1 addition & 1 deletion http-fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -1268,7 +1268,7 @@ int main(int argc, char **argv)
alt->path_len = strlen(path);
}

if (pull(commit_id, write_ref, url))
if (pull(1, &commit_id, &write_ref, url))
rc = 1;

http_cleanup();
Expand Down
2 changes: 1 addition & 1 deletion local-fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ int main(int argc, char **argv)
commit_id = argv[arg];
path = argv[arg + 1];

if (pull(commit_id, write_ref, path))
if (pull(1, &commit_id, &write_ref, path))
return 1;

return 0;
Expand Down
2 changes: 1 addition & 1 deletion ssh-fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ int main(int argc, char **argv)
if (get_version())
return 1;

if (pull(commit_id, write_ref, url))
if (pull(1, &commit_id, &write_ref, url))
return 1;

return 0;
Expand Down

0 comments on commit 4211e4d

Please sign in to comment.