* looking for address@hidden/tla--devo--1.1--patch-287 to compare with * comparing to address@hidden/tla--devo--1.1--patch-287 A out M libarch/inode-sig.c M libarch/changeset-utils.h M libarch/pristines.h M libarch/changeset-utils.c M libarch/apply-changeset.c M libarch/cmd-add-pristine.c M libarch/make-changeset-files.c M libarch/invent.c M libarch/cmd-inventory.c M libarch/invent.h M libarch/proj-tree-lint.c M libarch/make-changeset.c M libarch/pristines.c * modified files --- orig/libarch/apply-changeset.c +++ mod/libarch/apply-changeset.c @@ -143,6 +143,16 @@ return name; } +static void rel_append_field(rel_table *dest, rel_table src, int field) +{ + rel_table tmp = 0; + if (rel_n_records(src) == 0) + return; + tmp = rel_cut (rel_cut_list (field, -1), src); + rel_append_x(dest, tmp); + rel_free_table(tmp); +} + void arch_apply_changeset (struct arch_apply_changeset_report * r, t_uchar * changeset_spec, t_uchar * target_spec, @@ -165,6 +175,7 @@ struct arch_changeset_inventory inventory; struct arch_changeset_inventory inventory_by_name; + rel_table changeset_files_index = 0; rel_table removed_files_index = 0; t_uchar * tmp_removed_files_root = 0; @@ -223,9 +234,35 @@ /**************************************************************** * Inventory the target tree. */ - mem_set0 ((t_uchar *)&inventory, sizeof (inventory)); - arch_changeset_inventory (&inventory, tree_root, target, method, untagged_source_category); + rel_append_field(&changeset_files_index, changeset.removed_files, 0); + rel_append_field(&changeset_files_index, changeset.removed_dirs, 0); + rel_append_field(&changeset_files_index, changeset.removed_symlinks, 0); + rel_append_field(&changeset_files_index, changeset.orig_files_index, 0); + rel_append_field(&changeset_files_index, changeset.orig_dirs_index, 0); + rel_append_field(&changeset_files_index, changeset.mod_files_index, 0); + rel_append_field(&changeset_files_index, changeset.added_dirs, 0); + rel_append_field(&changeset_files_index, changeset.added_files, 0); + rel_append_field(&changeset_files_index, changeset.added_symlinks, 0); + rel_append_field(&changeset_files_index, changeset.patched_regular_files, 0); + rel_append_field(&changeset_files_index, changeset.patched_symlinks, 0); + rel_append_field(&changeset_files_index, changeset.patched_binaries, 0); + rel_append_field(&changeset_files_index, changeset.symlink_to_file, 0); + rel_append_field(&changeset_files_index, changeset.file_to_symlink, 0); + rel_append_field(&changeset_files_index, changeset.file_metadata_changed, 0); + rel_append_field(&changeset_files_index, changeset.dir_metadata_changed, 0); + rel_append_field(&changeset_files_index, changeset.renamed_files, 0); + rel_append_field(&changeset_files_index, changeset.renamed_files, 1); + rel_append_field(&changeset_files_index, changeset.renamed_dirs, 0); + rel_append_field(&changeset_files_index, changeset.renamed_dirs, 1); + rel_sort_table_by_field (0, changeset_files_index, 0); + rel_uniq_by_field (&changeset_files_index, 0); + mem_set0 ((t_uchar *)&inventory, sizeof (inventory)); + if (changeset_files_index) + { + arch_changeset_inventory (&inventory, tree_root, changeset_files_index, + target, method, untagged_source_category); + } mem_set0 ((t_uchar *)&inventory_by_name, sizeof (inventory_by_name)); inventory_by_name.dirs = rel_copy_table (inventory.dirs); @@ -1709,6 +1746,7 @@ rel_free_table (deferred_conflicts); rel_free_table (added_files_and_symlinks); rel_free_table (patched_changelogs); + rel_free_table (changeset_files_index); } --- orig/libarch/changeset-utils.c +++ mod/libarch/changeset-utils.c @@ -34,7 +34,8 @@ void arch_changeset_inventory (struct arch_changeset_inventory * inv_out, - t_uchar * tree_root, t_uchar * path, + t_uchar * tree_root, rel_table file_index, + t_uchar * path, enum arch_id_tagging_method method, enum arch_inventory_category untagged_source_category) { @@ -62,7 +63,7 @@ inv_out->method = options.method; safe_chdir (path); - arch_inventory_traversal (&options, ".", changeset_inv_callback, (void *)inv_out); + arch_inventory_traversal (&options, ".", file_index, changeset_inv_callback, (void *)inv_out); arch_free_inventory_naming_conventions (&options); rel_sort_table_by_field (0, inv_out->dirs, 1); --- orig/libarch/changeset-utils.h +++ mod/libarch/changeset-utils.h @@ -30,7 +30,8 @@ /* automatically generated __STDC__ prototypes */ extern void arch_changeset_inventory (struct arch_changeset_inventory * inv_out, - t_uchar * tree_root, t_uchar * path, + t_uchar * tree_root, rel_table file_index, + t_uchar * path, enum arch_id_tagging_method method, enum arch_inventory_category untagged_source_category); extern void arch_free_changeset_inventory_data (struct arch_changeset_inventory * i); --- orig/libarch/cmd-add-pristine.c +++ mod/libarch/cmd-add-pristine.c @@ -42,6 +42,8 @@ OP2 (opt_version, 0, 0, 0, "and exit.") \ OP (opt_archive, "A", "archive", 1, \ "Override `my-default-archive'") \ + OP (opt_hardlinks, 0, "link", 0, \ + "hardlink files to revision library instead of copying") \ OP (opt_dir, "d", "dir DIR", 1, \ "cd to DIR first") @@ -69,6 +71,7 @@ struct opt_parsed * option; char * dir = 0; t_uchar * default_archive = 0; + int link; dir = str_save (0, "."); @@ -103,6 +106,11 @@ break; } + case opt_hardlinks: + { + link = 1; + break; + } case opt_dir: { lim_free (0, dir); @@ -154,9 +162,12 @@ pristine_path = arch_find_pristine (0, tree_root, archive, revision, arch_unlocked_pristine, arch_tree_pristine_search); if (!pristine_path) - { - arch_add_pristine (1, tree_root, 0, archive, revision); - } + { + struct arch_archive * arch = arch_archive_connect (archive, 0); + arch_add_pristine (1, tree_root, arch, archive, revision, link); + arch_archive_close(arch); + } + } lim_free (0, dir); --- orig/libarch/cmd-inventory.c +++ mod/libarch/cmd-inventory.c @@ -287,7 +287,7 @@ arch_get_inventory_naming_conventions (&inv_options, tree_root); bad_file = 0; - arch_inventory_traversal (&inv_options, argv[x], inventory_printer, 0); + arch_inventory_traversal (&inv_options, argv[x], NULL, inventory_printer, 0); arch_free_inventory_naming_conventions (&inv_options); lim_free (0, tree_root); } --- orig/libarch/inode-sig.c +++ mod/libarch/inode-sig.c @@ -73,7 +73,7 @@ arch_get_inventory_naming_conventions (&options, "."); - arch_inventory_traversal (&options, ".", inode_sig_callback, (void *)&answer); + arch_inventory_traversal (&options, ".", NULL, inode_sig_callback, (void *)&answer); arch_free_inventory_naming_conventions (&options); --- orig/libarch/invent.c +++ mod/libarch/invent.c @@ -48,6 +48,7 @@ void * closure); static void arch_inventory_traversal_internal (struct arch_inventory_options * options, t_uchar * root, + t_uchar * single_obj, inv_callback callback, void * closure, assoc_table id_tagging_shortcut, @@ -91,7 +92,7 @@ options.include_excluded = !!include_ctl; arch_get_inventory_naming_conventions (&options, "."); - arch_inventory_traversal (&options, ".", source_inventory_callback, (void *)&answer); + arch_inventory_traversal (&options, ".", NULL, source_inventory_callback, (void *)&answer); arch_free_inventory_naming_conventions (&options); @@ -119,7 +120,7 @@ options.include_excluded = !!include_ctl; arch_get_inventory_naming_conventions (&options, "."); - arch_inventory_traversal (&options, ".", source_inventory_files_callback, (void *)&answer); + arch_inventory_traversal (&options, ".", NULL, source_inventory_files_callback, (void *)&answer); arch_free_inventory_naming_conventions (&options); @@ -445,6 +446,7 @@ void arch_inventory_traversal (struct arch_inventory_options * options, t_uchar * root, + rel_table file_list, inv_callback callback, void * closure) { @@ -454,7 +456,19 @@ if ((options->method == arch_implicit_id_tagging) || (options->method == arch_tagline_id_tagging)) arch_read_id_shortcut (&id_tagging_shortcut, root); - arch_inventory_traversal_internal (options, root, callback, closure, id_tagging_shortcut, &explicit_skips); + if (file_list) + { + int x; + for (x = 0 ; x < rel_n_records(file_list) ; x++) + { + arch_inventory_traversal_internal (options, root, file_list[x][0], + callback, closure, id_tagging_shortcut, &explicit_skips); + } + } + else + { + arch_inventory_traversal_internal (options, root, NULL, callback, closure, id_tagging_shortcut, &explicit_skips); + } free_assoc_table (id_tagging_shortcut); free_assoc_table (explicit_skips); @@ -464,6 +478,7 @@ static void arch_inventory_traversal_internal (struct arch_inventory_options * options, t_uchar * root, + t_uchar * single_obj, inv_callback callback, void * closure, assoc_table id_tagging_shortcut, @@ -478,34 +493,55 @@ int * is_deferred_nested = 0; char * rel_file = 0; struct directory_regexps * dir_regexps = 0; + struct stat obj_stat; + char *rel_obj; int x; - safe_opendir (&dir, root); - files = 0; n_files = 0; - - while (1) + if (single_obj) { - char * file; - - safe_readdir (&file, dir); - if (!file) - break; - *(char **)ar_push ((void **)&files, 0, sizeof (char *)) = file; + int errn; + /* strip out any leading ./ the caller sent in (nasty) */ + while(single_obj[0] == '.' && single_obj[1] == '/') + { + single_obj += 2; + while(single_obj[0] == '/') + single_obj++; + } + rel_obj = file_name_in_vicinity (0, root, single_obj); + /* if the obj doesn't exist, we're done */ + if (0 > vu_lstat(&errn, rel_obj, &obj_stat)) + return; + lim_free(0, rel_obj); + *(char **)ar_push ((void **)&files, 0, sizeof (char *)) = str_save(0, single_obj); ++n_files; - - /* look for per-directory inventory regexps - */ - if (dir_regexps == 0 && (file[0] == '.') && !str_cmp(".arch-inventory", file)) - { - dir_regexps = lim_malloc (0, sizeof *dir_regexps); - read_directory_regexps (dir_regexps, root); - } } + else + { + safe_opendir (&dir, root); - safe_closedir (dir); + while (1) + { + char * file; + + safe_readdir (&file, dir); + if (!file) + break; + *(char **)ar_push ((void **)&files, 0, sizeof (char *)) = file; + ++n_files; + + /* look for per-directory inventory regexps + */ + if (dir_regexps == 0 && (file[0] == '.') && !str_cmp(".arch-inventory", file)) + { + dir_regexps = lim_malloc (0, sizeof *dir_regexps); + read_directory_regexps (dir_regexps, root); + } + } + safe_closedir (dir); + } qsort ((void *)files, n_files, sizeof (char *), cmp_files); /* We want to invoke `callback' on a lexically sorted list of paths. @@ -740,7 +776,7 @@ mem_set0 ((t_uchar *)&nest_opts, sizeof nest_opts); copy_options_but_regexps (&nest_opts, options); arch_get_inventory_naming_conventions (&nest_opts, rel_file); - arch_inventory_traversal_internal (&nest_opts, rel_file, callback, closure, id_tagging_shortcut, explicit_skips); + arch_inventory_traversal_internal (&nest_opts, rel_file, NULL, callback, closure, id_tagging_shortcut, explicit_skips); arch_free_inventory_naming_conventions (&nest_opts); } } @@ -832,7 +868,7 @@ } handle_deferred: - arch_inventory_traversal_internal (options, rel_file, callback, closure, id_tagging_shortcut, explicit_skips); + arch_inventory_traversal_internal (options, rel_file, NULL, callback, closure, id_tagging_shortcut, explicit_skips); } goto next_file; } --- orig/libarch/invent.h +++ mod/libarch/invent.h @@ -63,6 +63,7 @@ extern void arch_free_inventory_naming_conventions (struct arch_inventory_options * options); extern void arch_inventory_traversal (struct arch_inventory_options * options, t_uchar * root, + rel_table file_index, inv_callback callback, void * closure); #endif /* INCLUDE__FILE_UTILS__INV_H */ --- orig/libarch/make-changeset-files.c +++ mod/libarch/make-changeset-files.c @@ -61,7 +61,7 @@ mem_set0 ((t_uchar *)&report->orig_index, sizeof (report->orig_index)); mem_set0 ((t_uchar *)&report->mod_index, sizeof (report->mod_index)); - arch_changeset_inventory (&report->orig_index, orig, orig, method, untagged_source_category); + arch_changeset_inventory (&report->orig_index, orig, file_list, orig, method, untagged_source_category); report->mod_index.dirs = rel_copy_table (report->orig_index.dirs); report->mod_index.files = rel_copy_table (report->orig_index.files); --- orig/libarch/make-changeset.c +++ mod/libarch/make-changeset.c @@ -296,8 +296,8 @@ mem_set0 ((t_uchar *)&report->orig_index, sizeof (report->orig_index)); mem_set0 ((t_uchar *)&report->mod_index, sizeof (report->mod_index)); - arch_changeset_inventory (&report->orig_index, orig_root, orig, method, untagged_source_category); - arch_changeset_inventory (&report->mod_index, mod_root, mod, method, untagged_source_category); + arch_changeset_inventory (&report->orig_index, orig_root, NULL, orig, method, untagged_source_category); + arch_changeset_inventory (&report->mod_index, mod_root, NULL, mod, method, untagged_source_category); orig_full_index = rel_copy_table (report->orig_index.dirs); rel_append_x (&orig_full_index, report->orig_index.files); --- orig/libarch/pristines.c +++ mod/libarch/pristines.c @@ -23,6 +23,7 @@ #include "tla/libarch/inode-sig.h" #include "tla/libarch/namespace.h" #include "tla/libarch/pristines.h" +#include "tla/libarch/libraries.h" @@ -46,20 +47,36 @@ void -arch_add_pristine (int chatter_fd, t_uchar * tree_root, struct arch_archive * arch, t_uchar * archive, t_uchar * revision) +arch_add_pristine (int chatter_fd, t_uchar * tree_root, struct arch_archive * arch, t_uchar * archive, t_uchar * revision, int link) { t_uchar * tmp_path = 0; t_uchar * cache_dir = 0; tmp_path = tmp_file_name (tree_root, ",,new-pristine"); - safe_mkdir (tmp_path, 0777); + if (link) + { + arch_chatter(chatter_fd, "* adding hard linked pristine tree\n"); + rel_table index = 0 ; - cache_dir = file_name_directory_file (0, tree_root); - arch_build_revision (chatter_fd, tmp_path, arch, archive, revision, cache_dir); - arch_install_pristine (tree_root, archive, revision, tmp_path); + arch_library_add (1, 1, arch, revision, 0, tree_root, 1); + index = arch_library_index (archive, revision); + rel_sort_table_by_field (0, index, 0); + build_partial_link_tree (arch_library_find (0, archive, revision), + tmp_path, index); + rel_free_table(index); + } + else + { + arch_chatter(chatter_fd, "* adding pristine tree\n"); + safe_mkdir (tmp_path, 0777); + cache_dir = file_name_directory_file (0, tree_root); + arch_build_revision (chatter_fd, tmp_path, arch, archive, + revision, cache_dir); + lim_free (0, cache_dir); + } + arch_install_pristine (tree_root, archive, revision, tmp_path); lim_free (0, tmp_path); - lim_free (0, cache_dir); } --- orig/libarch/pristines.h +++ mod/libarch/pristines.h @@ -35,7 +35,7 @@ /* automatically generated __STDC__ prototypes */ extern void arch_make_pristine (t_uchar * tree_root, t_uchar * archive, t_uchar * revision); -extern void arch_add_pristine (int chatter_fd, t_uchar * tree_root, struct arch_archive * arch, t_uchar * archive, t_uchar * revision); +extern void arch_add_pristine (int chatter_fd, t_uchar * tree_root, struct arch_archive * arch, t_uchar * archive, t_uchar * revision, int link); extern t_uchar * arch_pristine_loc (t_uchar * archive, t_uchar * revision, int locked_p); extern t_uchar * arch_pristine_path (t_uchar * tree_root, t_uchar * archive, t_uchar * revision, int locked_p); extern void arch_install_pristine (t_uchar * tree_root, t_uchar * archive, t_uchar * revision, t_uchar * source); --- orig/libarch/proj-tree-lint.c +++ mod/libarch/proj-tree-lint.c @@ -231,7 +231,7 @@ thunk.duplicated_ids_index = hashtree_alloc (&tree_lint_hashtree_rules); thunk.options = &options; - arch_inventory_traversal (&options, ".", tree_lint_callback, &thunk); + arch_inventory_traversal (&options, ".", NULL, tree_lint_callback, &thunk); safe_fchdir (here_fd);