1*90c8c64dSAndroid Build Coastguard Worker#!/bin/bash 2*90c8c64dSAndroid Build Coastguard Worker# 3*90c8c64dSAndroid Build Coastguard Worker# Copyright (C) 2023 The Android Open Source Project 4*90c8c64dSAndroid Build Coastguard Worker# 5*90c8c64dSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*90c8c64dSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*90c8c64dSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*90c8c64dSAndroid Build Coastguard Worker# 9*90c8c64dSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*90c8c64dSAndroid Build Coastguard Worker# 11*90c8c64dSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*90c8c64dSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*90c8c64dSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*90c8c64dSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*90c8c64dSAndroid Build Coastguard Worker# limitations under the License. 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Worker# Helper script to run cargo_embargo generate on all external Rust crates and generate an HTML 18*90c8c64dSAndroid Build Coastguard Worker# report of the results, including any errors, warnings or changes to Android.bp files. 19*90c8c64dSAndroid Build Coastguard Worker# 20*90c8c64dSAndroid Build Coastguard Worker# Should be run from under external/rust/crates. 21*90c8c64dSAndroid Build Coastguard Worker 22*90c8c64dSAndroid Build Coastguard Workerset -e 23*90c8c64dSAndroid Build Coastguard Worker 24*90c8c64dSAndroid Build Coastguard Workerreport="cargo_embargo_report.html" 25*90c8c64dSAndroid Build Coastguard Worker 26*90c8c64dSAndroid Build Coastguard Workercat > $report <<END 27*90c8c64dSAndroid Build Coastguard Worker<html> 28*90c8c64dSAndroid Build Coastguard Worker<head> 29*90c8c64dSAndroid Build Coastguard Worker<title>cargo_embargo crate report</title> 30*90c8c64dSAndroid Build Coastguard Worker<style type="text/css"> 31*90c8c64dSAndroid Build Coastguard Workertd { vertical-align: top; } 32*90c8c64dSAndroid Build Coastguard Worker.success { color: green; } 33*90c8c64dSAndroid Build Coastguard Worker.skipped { color: yellow; } 34*90c8c64dSAndroid Build Coastguard Worker.warning { color: orange; } 35*90c8c64dSAndroid Build Coastguard Worker.error { color: red; } 36*90c8c64dSAndroid Build Coastguard Worker</style> 37*90c8c64dSAndroid Build Coastguard Worker</head> 38*90c8c64dSAndroid Build Coastguard Worker<body> 39*90c8c64dSAndroid Build Coastguard Worker<h1>cargo_embargo crate report</h1> 40*90c8c64dSAndroid Build Coastguard Worker<h2>Using existing cargo_embargo.json</h2> 41*90c8c64dSAndroid Build Coastguard Worker<table> 42*90c8c64dSAndroid Build Coastguard Worker<tr><th>Crate name</th><th>Generate</th><th>Details</th><th style="width: 25%;">Files</th></tr> 43*90c8c64dSAndroid Build Coastguard WorkerEND 44*90c8c64dSAndroid Build Coastguard Worker 45*90c8c64dSAndroid Build Coastguard Workersuccess_count=0 46*90c8c64dSAndroid Build Coastguard Workerdifferent_count=0 47*90c8c64dSAndroid Build Coastguard Workertotal_count=0 48*90c8c64dSAndroid Build Coastguard Workerfor config in */cargo_embargo.json; do 49*90c8c64dSAndroid Build Coastguard Worker ((total_count+=1)) 50*90c8c64dSAndroid Build Coastguard Worker crate=$(dirname $config) 51*90c8c64dSAndroid Build Coastguard Worker echo "Trying $crate..." 52*90c8c64dSAndroid Build Coastguard Worker echo "<tr><td><code>$crate</code></td>" >> $report 53*90c8c64dSAndroid Build Coastguard Worker if (cd $crate && cargo_embargo generate cargo_embargo.json) 2> cargo_embargo.err; then 54*90c8c64dSAndroid Build Coastguard Worker (cd $crate && git diff Android.bp > Android.bp.diff) 55*90c8c64dSAndroid Build Coastguard Worker if grep "WARNING" cargo_embargo.err; then 56*90c8c64dSAndroid Build Coastguard Worker echo '<td class="error">Warning</td>' >> $report 57*90c8c64dSAndroid Build Coastguard Worker echo '<td><details><summary>' >> $report 58*90c8c64dSAndroid Build Coastguard Worker grep -m 1 "WARNING" cargo_embargo.err >> $report 59*90c8c64dSAndroid Build Coastguard Worker echo '</summary>' >> $report 60*90c8c64dSAndroid Build Coastguard Worker sed 's/$/<br\/>/g' < cargo_embargo.err >> $report 61*90c8c64dSAndroid Build Coastguard Worker echo '</details></td>' >> $report 62*90c8c64dSAndroid Build Coastguard Worker else 63*90c8c64dSAndroid Build Coastguard Worker # Compare the checked-in Android.bp to the generated one. 64*90c8c64dSAndroid Build Coastguard Worker (cd $crate && git show HEAD:Android.bp > Android.bp.orig) 65*90c8c64dSAndroid Build Coastguard Worker if diff $crate/Android.bp.orig $crate/Android.bp > /dev/null; then 66*90c8c64dSAndroid Build Coastguard Worker echo '<td class="success">Success</td>' >> $report 67*90c8c64dSAndroid Build Coastguard Worker ((success_count+=1)) 68*90c8c64dSAndroid Build Coastguard Worker else 69*90c8c64dSAndroid Build Coastguard Worker echo '<td class="warning">Different</td>' >> $report 70*90c8c64dSAndroid Build Coastguard Worker ((different_count+=1)) 71*90c8c64dSAndroid Build Coastguard Worker fi 72*90c8c64dSAndroid Build Coastguard Worker 73*90c8c64dSAndroid Build Coastguard Worker echo '<td>' >> $report 74*90c8c64dSAndroid Build Coastguard Worker if [[ -s "cargo_embargo.err" ]]; then 75*90c8c64dSAndroid Build Coastguard Worker echo '<details>' >> $report 76*90c8c64dSAndroid Build Coastguard Worker sed 's/$/<br\/>/g' < cargo_embargo.err >> $report 77*90c8c64dSAndroid Build Coastguard Worker echo '</details>' >> $report 78*90c8c64dSAndroid Build Coastguard Worker fi 79*90c8c64dSAndroid Build Coastguard Worker echo '</td>' >> $report 80*90c8c64dSAndroid Build Coastguard Worker fi 81*90c8c64dSAndroid Build Coastguard Worker else 82*90c8c64dSAndroid Build Coastguard Worker echo '<td class="error">Error</td>' >> $report 83*90c8c64dSAndroid Build Coastguard Worker echo '<td><details open>' >> $report 84*90c8c64dSAndroid Build Coastguard Worker sed 's/$/<br\/>/g' < cargo_embargo.err >> $report 85*90c8c64dSAndroid Build Coastguard Worker echo '</details></td>' >> $report 86*90c8c64dSAndroid Build Coastguard Worker fi 87*90c8c64dSAndroid Build Coastguard Worker 88*90c8c64dSAndroid Build Coastguard Worker rm cargo_embargo.err 89*90c8c64dSAndroid Build Coastguard Worker rm -rf "$crate/cargo.metadata" "$crate/cargo.out" "$crate/target.tmp" "$crate/Cargo.lock" "$crate/Android.bp.orig" "$crate/Android.bp.embargo" "$crate/Android.bp.embargo_nobuild" 90*90c8c64dSAndroid Build Coastguard Worker (cd $crate && git checkout Android.bp) 91*90c8c64dSAndroid Build Coastguard Worker 92*90c8c64dSAndroid Build Coastguard Worker echo '<td>' >> $report 93*90c8c64dSAndroid Build Coastguard Worker if [[ -s "$crate/Android.bp.diff" ]]; then 94*90c8c64dSAndroid Build Coastguard Worker echo '<details><summary>Android.bp.diff</summary><pre>' >> $report 95*90c8c64dSAndroid Build Coastguard Worker cat "$crate/Android.bp.diff" >> $report 96*90c8c64dSAndroid Build Coastguard Worker echo '</pre></details>' >> $report 97*90c8c64dSAndroid Build Coastguard Worker rm "$crate/Android.bp.diff" 98*90c8c64dSAndroid Build Coastguard Worker fi 99*90c8c64dSAndroid Build Coastguard Worker echo '</td></tr>' >> $report 100*90c8c64dSAndroid Build Coastguard Workerdone 101*90c8c64dSAndroid Build Coastguard Worker 102*90c8c64dSAndroid Build Coastguard Workerecho '</table>' >> $report 103*90c8c64dSAndroid Build Coastguard Workerecho "<p>$success_count success, $different_count different, $total_count total.</p>" >> $report 104*90c8c64dSAndroid Build Coastguard Workerecho '</body>' >> $report 105*90c8c64dSAndroid Build Coastguard Workerecho '</html>' >> $report 106*90c8c64dSAndroid Build Coastguard Worker 107*90c8c64dSAndroid Build Coastguard Workerecho "Open file://$PWD/$report for details" 108