diff --git a/panda/src/downloadertools/build_patch.cxx b/panda/src/downloadertools/build_patch.cxx index af3d2f330a..a5a8458354 100644 --- a/panda/src/downloadertools/build_patch.cxx +++ b/panda/src/downloadertools/build_patch.cxx @@ -27,7 +27,7 @@ void usage() { - cerr << "Usage: build_patch [-f] " << endl; + cerr << "Usage: build_patch [opts] " << endl; } void @@ -42,23 +42,45 @@ help() { "The patching algorithm can get very slow for very large files. As an\n" "optimization, if the input files are both Panda Multifiles, the patcher\n" "will by default patch them on a per-subfile basis, which has the potential\n" - "to be much faster. The -f option will forbid this and force the patcher\n" - "to work on the full file.\n\n"; + "to be much faster. The -c option will forbid this and force the patcher\n" + "to work on the full file.\n\n" + + "Options:\n\n" + + " -o output_name\n" + " Specify the filename of the patch file to generate.\n\n" + + " -c\n" + " Always generate patches against the complete file, even if the\n" + " input files appear to be multifiles.\n\n" + + " -f footprint_length\n" + " Specify the footprint length for the patching algorithm.\n\n"; } int main(int argc, char *argv[]) { - bool full_file = false; + Filename patch_file; + bool complete_file = false; + int footprint_length = 0; // extern char *optarg; extern int optind; - static const char *optflags = "fh"; + static const char *optflags = "o:cf:h"; int flag = getopt(argc, argv, optflags); Filename rel_path; while (flag != EOF) { switch (flag) { + case 'o': + patch_file = optarg; + break; + + case 'c': + complete_file = true; + break; + case 'f': - full_file = true; + footprint_length = atoi(optarg); break; case 'h': @@ -87,10 +109,16 @@ main(int argc, char *argv[]) { Filename dest_file = Filename::from_os_specific(argv[2]); dest_file.set_binary(); - Filename patch_file = dest_file.get_fullpath() + ".pch"; + if (patch_file.empty()) { + patch_file = dest_file.get_fullpath() + ".pch"; + } Patchfile pfile; - pfile.set_allow_multifile(!full_file); + pfile.set_allow_multifile(!complete_file); + if (footprint_length != 0) { + cerr << "Footprint length is " << footprint_length << "\n"; + pfile.set_footprint_length(footprint_length); + } cerr << "Building patch file to convert " << src_file << " to " << dest_file << endl; diff --git a/panda/src/downloadertools/multify.cxx b/panda/src/downloadertools/multify.cxx index 9f15f030fb..196de036f7 100644 --- a/panda/src/downloadertools/multify.cxx +++ b/panda/src/downloadertools/multify.cxx @@ -469,12 +469,21 @@ kill_files(int argc, char *argv[]) { } } - if (!multifile->repack()) { - cerr << "Failed to write " << multifile_name << ".\n"; - return false; + bool okflag = true; + + if (multifile->needs_repack()) { + if (!multifile->repack()) { + cerr << "Failed to write " << multifile_name << ".\n"; + okflag = false; + } + } else { + if (!multifile->flush()) { + cerr << "Failed to write " << multifile_name << ".\n"; + okflag = false; + } } - return true; + return okflag; } const char *