)]}'
{
  "log": [
    {
      "commit": "daca30367af71c50ed7c39443540c4c8630f4625",
      "tree": "105361a942e9356c0692a994beab1d125a38e7d0",
      "parents": [
        "7d511d94cdc33df9ede75108b7aa112640635d49"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Wed Jan 15 09:54:29 2020 -0800"
      },
      "committer": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Fri Jan 17 22:22:38 2020 +0000"
      },
      "message": "Make parallel_run.py print status on single line.\n\nParallel_run.py would write a ton of status updates as it runs. To\nmake it a bit cleaner have it overwrite the run-count line each time\ninstead.\n\nTest: manual\nChange-Id: I9073810fc7ece9a7d25b4a97a4bd01414ad5efa8\n"
    },
    {
      "commit": "4d804b8eb891aeef0cd9a3e29c65cc31355b2a69",
      "tree": "b0c56a9e8d11a2980d0505e2b387dd74bca5f7c8",
      "parents": [
        "b86e9b0b63f4fbcc80859ff2637f86ee3ddc374c"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Dec 17 16:39:34 2019 -0800"
      },
      "committer": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Fri Jan 10 04:08:49 2020 +0000"
      },
      "message": "Improve parallel_run.py somewhat\n\nMake parallel_run just wait for any remaining jobs to finish before\nexiting. Attempting to exit early generally didn\u0027t work very well.\n\nAlso improve documentation a bit.\n\nTest: ./art/tools/parallel_run.py -j80 runit.sh\nChange-Id: Ie8b3f1b4ad9bbc03a04e6bdc8e8cea6140b85f7f\n"
    },
    {
      "commit": "4d8d83f9686b3cf84fc7055516adb22645ab9f6a",
      "tree": "2302c1ca3372f3e94328ab084919901d535506f5",
      "parents": [
        "ef04ac6c05fa344428008ffa1eac7316c64a3467"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Apr 16 11:18:45 2019 -0700"
      },
      "committer": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Apr 16 23:46:19 2019 +0000"
      },
      "message": "Add a parallel_run.py tool\n\nSometimes when investigating a flake it is useful to add logging and\nrepeatedly run a command until the issue appears with the logging.\nThis can be tedious if the flake is rare. To make it easier I added a\nsimple parallel_run.py tool that can run a command in parallel\nrepeatedly until it fails and save the stdout from the failed run.\n\nUsage:\n\n% # Write a script that exits with 0 on failure and writes all output\n% # to stdout.\n% cat tst.sh\n\\#!/bin/bash\n! (head -c32 /dev/urandom | hd | grep -E \u0027\\|.*a\u0027)\n\n% # Run the script in parallel\n% ./art/tools/parallel_run.py -j80 --out out.txt ./tst.sh\nTemporary files in /tmp/tmp5013_ey7\n1 runs\n\u003csnip\u003e\n31 runs\n\n% # Examine output\n% cat out.txt\n00000000  6d e3 ac bf 1a 21 93 17  61 00 2a e0 8b f5 41 3b  |m....!..a.*...A;|\n\nTest: ./art/tools/parallel_run.py -j70 --out out.txt ./tst.sh\nBug: 72608560\nChange-Id: I83877ae1ccde5e843da20c5bd5a4f24e2e07fb19\n"
    }
  ]
}
