aboutsummaryrefslogtreecommitdiffhomepage
path: root/third_party/ijar
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-06-13 17:39:50 +0200
committerGravatar Yun Peng <pcloudy@google.com>2017-06-14 13:16:12 +0200
commit6186fa5fe9869c6102597b18244fc9546f931632 (patch)
treedcc5d9d6a171d02fe90125e2d83740599dfd8513 /third_party/ijar
parent5d660595111ec2a14c87856e76b78422e267c628 (diff)
Add support for zipped LLVM profile files.
This change is a follow-up to a recent change which allowed LLVM raw profile files to be directly used with blaze. This change allows zipped LLVM raw profile files. This uses //tools/zip:zipper to extract the zipped file contents. This also adds a new option to //tools/zip:zipper, 'j', to junk directories while unzipping. Tested: blaze test //devtools/blaze/integration:fdo_test blaze test //third_party/ijar/test:zip_test RELNOTES[NEW]: Zipped LLVM profiles are now supported. PiperOrigin-RevId: 158849516
Diffstat (limited to 'third_party/ijar')
-rwxr-xr-xthird_party/ijar/test/zip_test.sh28
-rw-r--r--third_party/ijar/zip_main.cc42
2 files changed, 52 insertions, 18 deletions
diff --git a/third_party/ijar/test/zip_test.sh b/third_party/ijar/test/zip_test.sh
index d206a74ee6..d70fa8fcb0 100755
--- a/third_party/ijar/test/zip_test.sh
+++ b/third_party/ijar/test/zip_test.sh
@@ -80,8 +80,8 @@ function test_zipper() {
# Test flatten option
(cd ${TEST_TMPDIR}/test && $ZIPPER cf ${TEST_TMPDIR}/output.zip ${filelist})
$ZIPPER v ${TEST_TMPDIR}/output.zip >$TEST_log
- expect_log "file"
- expect_log "other_file"
+ expect_log "^f .* file$"
+ expect_log "^f .* other_file$"
expect_not_log "path"
expect_not_log "/"
@@ -90,11 +90,31 @@ function test_zipper() {
echo "abcdefghi" >${TEST_TMPDIR}/test.zip
cat ${TEST_TMPDIR}/output.zip >>${TEST_TMPDIR}/test.zip
$ZIPPER v ${TEST_TMPDIR}/test.zip >$TEST_log
- expect_log "file"
- expect_log "other_file"
+ expect_log "^f .* file$"
+ expect_log "^f .* other_file$"
expect_not_log "path"
}
+function test_zipper_junk_paths() {
+ mkdir -p ${TEST_TMPDIR}/test/path/to/some
+ mkdir -p ${TEST_TMPDIR}/test/some/other/path
+ touch ${TEST_TMPDIR}/test/path/to/some/empty_file
+ echo "toto" > ${TEST_TMPDIR}/test/path/to/some/file
+ echo "titi" > ${TEST_TMPDIR}/test/path/to/some/other_file
+ chmod +x ${TEST_TMPDIR}/test/path/to/some/other_file
+ echo "tata" > ${TEST_TMPDIR}/test/file
+ filelist="$(cd ${TEST_TMPDIR}/test && find . | sed 's|^./||' | grep -v '^.$')"
+
+ # Test extract + flatten option
+ (cd ${TEST_TMPDIR}/test && $ZIPPER c ${TEST_TMPDIR}/output.zip ${filelist})
+ $ZIPPER vf ${TEST_TMPDIR}/output.zip >$TEST_log
+ echo $TEST_log
+ expect_log "^f .* file$"
+ expect_log "^f .* other_file$"
+ expect_not_log "path"
+ expect_not_log "/"
+}
+
function test_zipper_unzip_selective_files() {
mkdir -p ${TEST_TMPDIR}/test/path/to/some
mkdir -p ${TEST_TMPDIR}/test/some/other/path
diff --git a/third_party/ijar/zip_main.cc b/third_party/ijar/zip_main.cc
index 51aea54157..5639bc02a8 100644
--- a/third_party/ijar/zip_main.cc
+++ b/third_party/ijar/zip_main.cc
@@ -45,9 +45,11 @@ class UnzipProcessor : public ZipExtractorProcessor {
// into output_root if "extract" is set to true and will print the list of
// files and their unix modes if "verbose" is set to true.
UnzipProcessor(const char *output_root, char **files, bool verbose,
- bool extract) : output_root_(output_root),
- verbose_(verbose),
- extract_(extract) {
+ bool extract, bool flatten)
+ : output_root_(output_root),
+ verbose_(verbose),
+ extract_(extract),
+ flatten_(flatten) {
if (files != NULL) {
for (int i = 0; files[i] != NULL; i++) {
file_names.insert(std::string(files[i]));
@@ -73,6 +75,7 @@ class UnzipProcessor : public ZipExtractorProcessor {
const char *output_root_;
const bool verbose_;
const bool extract_;
+ const bool flatten_;
std::set<std::string> file_names;
};
@@ -98,17 +101,29 @@ void UnzipProcessor::Process(const char* filename, const u4 attr,
const u1* data, const size_t size) {
mode_t perm = zipattr_to_perm(attr);
bool isdir = zipattr_is_dir(attr);
+ const char *output_file_name = filename;
if (attr == 0) {
// Fallback when the external attribute is not set.
isdir = filename[strlen(filename)-1] == '/';
perm = 0777;
}
+
+ if (flatten_) {
+ if (isdir) {
+ return;
+ }
+ const char *p = strrchr(filename, '/');
+ if (p != NULL) {
+ output_file_name = p + 1;
+ }
+ }
+
if (verbose_) {
- printf("%c %o %s\n", isdir ? 'd' : 'f', perm, filename);
+ printf("%c %o %s\n", isdir ? 'd' : 'f', perm, output_file_name);
}
if (extract_) {
char path[PATH_MAX];
- concat_path(path, PATH_MAX, output_root_, filename);
+ concat_path(path, PATH_MAX, output_root_, output_file_name);
if (!make_dirs(path, perm) ||
(!isdir && !write_file(path, perm, data, size))) {
abort();
@@ -130,8 +145,8 @@ void basename(const char *path, char *output, size_t output_size) {
}
// Execute the extraction (or just listing if just v is provided)
-int extract(char *zipfile, char* exdir, char **files, bool verbose,
- bool extract) {
+int extract(char *zipfile, char *exdir, char **files, bool verbose,
+ bool extract, bool flatten) {
std::string cwd = get_cwd();
if (cwd.empty()) {
return -1;
@@ -144,7 +159,7 @@ int extract(char *zipfile, char* exdir, char **files, bool verbose,
strncpy(output_root, cwd.c_str(), PATH_MAX);
}
- UnzipProcessor processor(output_root, files, verbose, extract);
+ UnzipProcessor processor(output_root, files, verbose, extract, flatten);
std::unique_ptr<ZipExtractor> extractor(ZipExtractor::Create(zipfile,
&processor));
if (extractor.get() == NULL) {
@@ -346,7 +361,9 @@ static void usage(char *progname) {
" an optional directory relative to the current directory "
" specified through -d option\n");
fprintf(stderr, " c create - add files to x.zip\n");
- fprintf(stderr, " f flatten - flatten files to use with create operation\n");
+ fprintf(stderr,
+ " f flatten - flatten files to use with create or "
+ "extract operation\n");
fprintf(stderr,
" C compress - compress files when using the create operation\n");
fprintf(stderr, "x and c cannot be used in the same command-line.\n");
@@ -438,16 +455,13 @@ int main(int argc, char **argv) {
// Create a zip
return devtools_ijar::create(argv[2], filelist, flatten, verbose, compress);
} else {
- if (flatten) {
- usage(argv[0]);
- }
-
char* exdir = NULL;
if (argc > 3 && strcmp(argv[3], "-d") == 0) {
exdir = argv[4];
}
// Extraction / list mode
- return devtools_ijar::extract(argv[2], exdir, filelist, verbose, extract);
+ return devtools_ijar::extract(argv[2], exdir, filelist, verbose, extract,
+ flatten);
}
}