live-snapshot: fixed include-list handling.
authorMarco Amadori <marco.amadori@gmail.com>
Thu, 18 Sep 2008 22:31:57 +0000 (00:31 +0200)
committerDaniel Baumann <daniel@debian.org>
Wed, 9 Mar 2011 16:48:02 +0000 (17:48 +0100)
* When "/etc/live-snapshot.list" is present, all standard files and
  directories listed there are saved on shutdown.
  Now it saves them only if they are modified, and also handles
  dangling symbolic links. This beaviour will be gentle to live-systems
  upgrades on the same hardware since new unmodified to-be-snapshotted files
  will be no more overwritten by old unnecessary saved cruft.
  It still does not handle removal of deleted files.

bin/live-snapshot

index f77541f..5606436 100755 (executable)
@@ -320,23 +320,49 @@ Mount_device ()
        esac
 }
 
+Entry_is_modified ()
+{
+       # Returns true if file exists and it is also present in "cow" directory
+       # This means it is modified in respect to read-only media, so it deserve
+       # to be saved
+
+       entry="${1}"
+
+       if [ -e "${entry}" ] || [ -L "${entry}" ]
+       then
+               if [ -e "${DEF_SNAP_COW}/${entry}" ] || [ -L "${DEF_SNAP_COW}/${entry}" ]
+               then
+                       return 0
+               fi
+       fi
+       return 1
+}
+
 Do_filelist ()
 {
-       # BUGS: supports only cpio.gz types right now
+       # BUGS: supports only cpio.gz types, and do not handle deleted files yet
+
        TMP_FILELIST=$1
        if [ -f "${SNAP_LIST}" ]
        then
                # Generate include list
                for entry in $(cat "${SNAP_LIST}" | grep -v '^#.*$' | grep -v '^ *$')
                do
-                       if [ -f "${entry}" ]
-                       then
-                               printf "%s\000" "${entry}" >> "${TMP_FILELIST}"
-                       elif [ -d "${entry}" ]
+                       if [ -d "${entry}" ]
                        then
                                cd /
-                               find "${entry}" -print0 >> "${TMP_FILELIST}"
+                               find "${entry}" | while read line
+                               do
+                                       if Entry_is_modified "${line}"
+                                       then
+                                               printf "%s\000" "${line}" >> "${TMP_FILELIST}"
+                                       fi
+                               done
                                cd "${OLDPWD}"
+                       elif Entry_is_modified "${entry}"
+                       then
+                               # if file exists and it is modified
+                               printf "%s\000" "${entry}" >> "${TMP_FILELIST}"
                        fi
                done