Browse Source

Merge branch 'rs/use-child-process-init-more'

* rs/use-child-process-init-more:
  bundle: split out ref writing from bundle_create
  bundle: split out a helper function to compute and write prerequisites
  bundle: split out a helper function to create pack data
  use child_process_init() to initialize struct child_process variables
maint
Junio C Hamano 10 years ago
parent
commit
6b55f8b546
  1. 166
      bundle.c
  2. 2
      column.c
  3. 2
      trailer.c
  4. 2
      transport-helper.c

166
bundle.c

@ -235,33 +235,50 @@ out:
return result; return result;
} }


int create_bundle(struct bundle_header *header, const char *path, static int write_pack_data(int bundle_fd, struct lock_file *lock, struct rev_info *revs)
int argc, const char **argv)
{ {
static struct lock_file lock; struct child_process pack_objects = CHILD_PROCESS_INIT;
int bundle_fd = -1; int i;
int bundle_to_stdout;
int i, ref_count = 0;
struct strbuf buf = STRBUF_INIT;
struct rev_info revs;
struct child_process rls = CHILD_PROCESS_INIT;
FILE *rls_fout;


bundle_to_stdout = !strcmp(path, "-"); argv_array_pushl(&pack_objects.args,
if (bundle_to_stdout) "pack-objects", "--all-progress-implied",
bundle_fd = 1; "--stdout", "--thin", "--delta-base-offset",
else NULL);
bundle_fd = hold_lock_file_for_update(&lock, path, pack_objects.in = -1;
LOCK_DIE_ON_ERROR); pack_objects.out = bundle_fd;
pack_objects.git_cmd = 1;
if (start_command(&pack_objects))
return error(_("Could not spawn pack-objects"));


/* write signature */ /*
write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature)); * start_command closed bundle_fd if it was > 1
* so set the lock fd to -1 so commit_lock_file()
* won't fail trying to close it.
*/
lock->fd = -1;


/* init revs to list objects for pack-objects later */ for (i = 0; i < revs->pending.nr; i++) {
save_commit_buffer = 0; struct object *object = revs->pending.objects[i].item;
init_revisions(&revs, NULL); if (object->flags & UNINTERESTING)
write_or_die(pack_objects.in, "^", 1);
write_or_die(pack_objects.in, sha1_to_hex(object->sha1), 40);
write_or_die(pack_objects.in, "\n", 1);
}
close(pack_objects.in);
if (finish_command(&pack_objects))
return error(_("pack-objects died"));
return 0;
}

static int compute_and_write_prerequisites(int bundle_fd,
struct rev_info *revs,
int argc, const char **argv)
{
struct child_process rls = CHILD_PROCESS_INIT;
struct strbuf buf = STRBUF_INIT;
FILE *rls_fout;
int i;


/* write prerequisites */
argv_array_pushl(&rls.args, argv_array_pushl(&rls.args,
"rev-list", "--boundary", "--pretty=oneline", "rev-list", "--boundary", "--pretty=oneline",
NULL); NULL);
@ -279,7 +296,7 @@ int create_bundle(struct bundle_header *header, const char *path,
if (!get_sha1_hex(buf.buf + 1, sha1)) { if (!get_sha1_hex(buf.buf + 1, sha1)) {
struct object *object = parse_object_or_die(sha1, buf.buf); struct object *object = parse_object_or_die(sha1, buf.buf);
object->flags |= UNINTERESTING; object->flags |= UNINTERESTING;
add_pending_object(&revs, object, buf.buf); add_pending_object(revs, object, buf.buf);
} }
} else if (!get_sha1_hex(buf.buf, sha1)) { } else if (!get_sha1_hex(buf.buf, sha1)) {
struct object *object = parse_object_or_die(sha1, buf.buf); struct object *object = parse_object_or_die(sha1, buf.buf);
@ -290,17 +307,25 @@ int create_bundle(struct bundle_header *header, const char *path,
fclose(rls_fout); fclose(rls_fout);
if (finish_command(&rls)) if (finish_command(&rls))
return error(_("rev-list died")); return error(_("rev-list died"));
return 0;
}


/* write references */ /*
argc = setup_revisions(argc, argv, &revs, NULL); * Write out bundle refs based on the tips already

* parsed into revs.pending. As a side effect, may
if (argc > 1) * manipulate revs.pending to include additional
return error(_("unrecognized argument: %s"), argv[1]); * necessary objects (like tags).

*
object_array_remove_duplicates(&revs.pending); * Returns the number of refs written, or negative
* on error.
*/
static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
{
int i;
int ref_count = 0;


for (i = 0; i < revs.pending.nr; i++) { for (i = 0; i < revs->pending.nr; i++) {
struct object_array_entry *e = revs.pending.objects + i; struct object_array_entry *e = revs->pending.objects + i;
unsigned char sha1[20]; unsigned char sha1[20];
char *ref; char *ref;
const char *display_ref; const char *display_ref;
@ -315,7 +340,7 @@ int create_bundle(struct bundle_header *header, const char *path,
display_ref = (flag & REF_ISSYMREF) ? e->name : ref; display_ref = (flag & REF_ISSYMREF) ? e->name : ref;


if (e->item->type == OBJ_TAG && if (e->item->type == OBJ_TAG &&
!is_tag_in_date_range(e->item, &revs)) { !is_tag_in_date_range(e->item, revs)) {
e->item->flags |= UNINTERESTING; e->item->flags |= UNINTERESTING;
continue; continue;
} }
@ -361,7 +386,7 @@ int create_bundle(struct bundle_header *header, const char *path,
*/ */
obj = parse_object_or_die(sha1, e->name); obj = parse_object_or_die(sha1, e->name);
obj->flags |= SHOWN; obj->flags |= SHOWN;
add_pending_object(&revs, obj, e->name); add_pending_object(revs, obj, e->name);
} }
free(ref); free(ref);
continue; continue;
@ -374,41 +399,56 @@ int create_bundle(struct bundle_header *header, const char *path,
write_or_die(bundle_fd, "\n", 1); write_or_die(bundle_fd, "\n", 1);
free(ref); free(ref);
} }
if (!ref_count)
die(_("Refusing to create empty bundle."));


/* end header */ /* end header */
write_or_die(bundle_fd, "\n", 1); write_or_die(bundle_fd, "\n", 1);
return ref_count;
}


/* write pack */ int create_bundle(struct bundle_header *header, const char *path,
memset(&rls, 0, sizeof(rls)); int argc, const char **argv)
argv_array_pushl(&rls.args, {
"pack-objects", "--all-progress-implied", static struct lock_file lock;
"--stdout", "--thin", "--delta-base-offset", int bundle_fd = -1;
NULL); int bundle_to_stdout;
rls.in = -1; int ref_count = 0;
rls.out = bundle_fd; struct rev_info revs;
rls.git_cmd = 1;
if (start_command(&rls))
return error(_("Could not spawn pack-objects"));


/* bundle_to_stdout = !strcmp(path, "-");
* start_command closed bundle_fd if it was > 1 if (bundle_to_stdout)
* so set the lock fd to -1 so commit_lock_file() bundle_fd = 1;
* won't fail trying to close it. else
*/ bundle_fd = hold_lock_file_for_update(&lock, path,
lock.fd = -1; LOCK_DIE_ON_ERROR);

/* write signature */
write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature));

/* init revs to list objects for pack-objects later */
save_commit_buffer = 0;
init_revisions(&revs, NULL);

/* write prerequisites */
if (compute_and_write_prerequisites(bundle_fd, &revs, argc, argv))
return -1;

argc = setup_revisions(argc, argv, &revs, NULL);

if (argc > 1)
return error(_("unrecognized argument: %s"), argv[1]);

object_array_remove_duplicates(&revs.pending);

ref_count = write_bundle_refs(bundle_fd, &revs);
if (!ref_count)
die(_("Refusing to create empty bundle."));
else if (ref_count < 0)
return -1;

/* write pack */
if (write_pack_data(bundle_fd, &lock, &revs))
return -1;


for (i = 0; i < revs.pending.nr; i++) {
struct object *object = revs.pending.objects[i].item;
if (object->flags & UNINTERESTING)
write_or_die(rls.in, "^", 1);
write_or_die(rls.in, sha1_to_hex(object->sha1), 40);
write_or_die(rls.in, "\n", 1);
}
close(rls.in);
if (finish_command(&rls))
return error(_("pack-objects died"));
if (!bundle_to_stdout) { if (!bundle_to_stdout) {
if (commit_lock_file(&lock)) if (commit_lock_file(&lock))
die_errno(_("cannot create '%s'"), path); die_errno(_("cannot create '%s'"), path);

2
column.c

@ -374,7 +374,7 @@ int run_column_filter(int colopts, const struct column_options *opts)
if (fd_out != -1) if (fd_out != -1)
return -1; return -1;


memset(&column_process, 0, sizeof(column_process)); child_process_init(&column_process);
argv = &column_process.args; argv = &column_process.args;


argv_array_push(argv, "column"); argv_array_push(argv, "column");

2
trailer.c

@ -237,7 +237,7 @@ static const char *apply_command(const char *command, const char *arg)
strbuf_replace(&cmd, TRAILER_ARG_STRING, arg); strbuf_replace(&cmd, TRAILER_ARG_STRING, arg);


argv[0] = cmd.buf; argv[0] = cmd.buf;
memset(&cp, 0, sizeof(cp)); child_process_init(&cp);
cp.argv = argv; cp.argv = argv;
cp.env = local_repo_env; cp.env = local_repo_env;
cp.no_stdin = 1; cp.no_stdin = 1;

2
transport-helper.c

@ -414,7 +414,7 @@ static int get_exporter(struct transport *transport,
struct child_process *helper = get_helper(transport); struct child_process *helper = get_helper(transport);
int i; int i;


memset(fastexport, 0, sizeof(*fastexport)); child_process_init(fastexport);


/* we need to duplicate helper->in because we want to use it after /* we need to duplicate helper->in because we want to use it after
* fastexport is done with it. */ * fastexport is done with it. */

Loading…
Cancel
Save