am ca7bf531: Merge "Rotate logs only when there are actual operations"

* commit 'ca7bf53189c70ef0f687d54d772e5eaadc0b1c7c':
  Rotate logs only when there are actual operations
diff --git a/adb_install.cpp b/adb_install.cpp
index 6d6dbb1..ed15938 100644
--- a/adb_install.cpp
+++ b/adb_install.cpp
@@ -74,6 +74,8 @@
 
 int
 apply_from_adb(RecoveryUI* ui_, bool* wipe_cache, const char* install_file) {
+    modified_flash = true;
+
     ui = ui_;
 
     stop_adbd();
diff --git a/common.h b/common.h
index 4f1c099..b818ceb 100644
--- a/common.h
+++ b/common.h
@@ -40,6 +40,7 @@
 #define STRINGIFY(x) #x
 #define EXPAND(x) STRINGIFY(x)
 
+extern bool modified_flash;
 typedef struct fstab_rec Volume;
 
 // fopen a file, mounting volumes and making parent dirs as necessary.
diff --git a/install.cpp b/install.cpp
index 63b1d38..662f81c 100644
--- a/install.cpp
+++ b/install.cpp
@@ -256,6 +256,8 @@
 install_package(const char* path, bool* wipe_cache, const char* install_file,
                 bool needs_mount)
 {
+    modified_flash = true;
+
     FILE* install_log = fopen_path(install_file, "w");
     if (install_log) {
         fputs(path, install_log);
diff --git a/recovery.cpp b/recovery.cpp
index 0ba4d1e..2f8654a 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -92,6 +92,7 @@
 char recovery_version[PROPERTY_VALUE_MAX+1];
 char* stage = NULL;
 char* reason = NULL;
+bool modified_flash = false;
 
 /*
  * The recovery tool communicates with the main system through /cache files.
@@ -337,13 +338,18 @@
 
 // Rename last_log -> last_log.1 -> last_log.2 -> ... -> last_log.$max
 // Overwrites any existing last_log.$max.
-static void
-rotate_last_logs(int max) {
+static void rotate_last_logs(int max) {
+    // Logs should only be rotated once.
+    static bool rotated = false;
+    if (rotated) {
+        return;
+    }
+    rotated = true;
+    ensure_path_mounted(LAST_LOG_FILE);
+
     char oldfn[256];
     char newfn[256];
-
-    int i;
-    for (i = max-1; i >= 0; --i) {
+    for (int i = max-1; i >= 0; --i) {
         snprintf(oldfn, sizeof(oldfn), (i==0) ? LAST_LOG_FILE : (LAST_LOG_FILE ".%d"), i);
         snprintf(newfn, sizeof(newfn), LAST_LOG_FILE ".%d", i+1);
         // ignore errors
@@ -351,8 +357,17 @@
     }
 }
 
-static void
-copy_logs() {
+static void copy_logs() {
+    // We only rotate and record the log of the current session if there are
+    // actual attempts to modify the flash, such as wipes, installs from BCB
+    // or menu selections. This is to avoid unnecessary rotation (and
+    // possible deletion) of log files, if it does not do anything loggable.
+    if (!modified_flash) {
+        return;
+    }
+
+    rotate_last_logs(KEEP_LOG_COUNT);
+
     // Copy logs to cache so the system can find out what happened.
     copy_log_file(TEMPORARY_LOG_FILE, LOG_FILE, true);
     copy_log_file(TEMPORARY_LOG_FILE, LAST_LOG_FILE, false);
@@ -692,6 +707,8 @@
         return false;
     }
 
+    modified_flash = true;
+
     ui->Print("\n-- Wiping data...\n");
     if (device->WipeData() == 0 && erase_volume("/data") == 0 && erase_volume("/cache") == 0) {
         ui->Print("Data wipe complete.\n");
@@ -708,6 +725,8 @@
         return false;
     }
 
+    modified_flash = true;
+
     ui->Print("\n-- Wiping cache...\n");
     if (erase_volume("/cache") == 0) {
         ui->Print("Cache wipe complete.\n");
@@ -816,6 +835,8 @@
 }
 
 static int apply_from_sdcard(Device* device, bool* wipe_cache) {
+    modified_flash = true;
+
     if (ensure_path_mounted(SDCARD_ROOT) != 0) {
         ui->Print("\n-- Couldn't mount %s.\n", SDCARD_ROOT);
         return INSTALL_ERROR;
@@ -990,8 +1011,6 @@
     printf("Starting recovery (pid %d) on %s", getpid(), ctime(&start));
 
     load_volume_table();
-    ensure_path_mounted(LAST_LOG_FILE);
-    rotate_last_logs(KEEP_LOG_COUNT);
     get_args(&argc, &argv);
 
     const char *send_intent = NULL;