clean up handling of the root filesystem mount - remove broadcom specific junk from...
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 15 Jun 2006 17:21:17 +0000 (17:21 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 15 Jun 2006 17:21:17 +0000 (17:21 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/branches/buildroot-ng/openwrt@3951 3c298f89-4303-0410-b956-a3cf2f4a3e73

16 files changed:
package/base-files/ar7-2.4/bin/firstboot [new file with mode: 0755]
package/base-files/ar7-2.4/etc/preinit [new file with mode: 0755]
package/base-files/ar7-2.4/sbin/mount_root [new file with mode: 0755]
package/base-files/brcm-2.4/bin/firstboot [new file with mode: 0755]
package/base-files/brcm-2.4/etc/preinit [new file with mode: 0755]
package/base-files/brcm-2.4/sbin/mount_root [new file with mode: 0755]
package/base-files/brcm-2.6/bin/firstboot [new file with mode: 0755]
package/base-files/brcm-2.6/etc/preinit [new file with mode: 0755]
package/base-files/brcm-2.6/sbin/mount_root [new file with mode: 0755]
package/base-files/default/bin/firstboot [deleted file]
package/base-files/default/etc/init.d/S10boot
package/base-files/default/etc/preinit [deleted file]
package/base-files/default/sbin/mount_root
package/base-files/sibyte-2.6/init [deleted file]
package/base-files/xscale-2.6/etc/init.d/S00xscale [deleted file]
package/base-files/xscale-2.6/init [deleted file]

diff --git a/package/base-files/ar7-2.4/bin/firstboot b/package/base-files/ar7-2.4/bin/firstboot
new file mode 100755 (executable)
index 0000000..955423b
--- /dev/null
@@ -0,0 +1,89 @@
+#!/bin/sh
+# $Id$
+
+rom=$(awk '/squashfs/ {print $2}' /proc/mounts)
+jffs=$(awk '/jffs2/ {print $2}' /proc/mounts)
+
+dupe() { # <new_root> <old_root>
+       cd $1
+       echo -n "creating directories... "
+       {
+               cd $2 
+               find . -xdev -type d
+               echo "./dev ./jffs ./mnt ./proc ./tmp ./sys"
+               # xdev skips mounted directories
+               cd $1 
+       } | xargs mkdir -p
+       echo "done"
+
+       echo -n "setting up symlinks... "
+       for file in $(cd $2; find . -xdev -type f;); do
+               case "$file" in
+               ./rom/note) ;; #nothing
+               ./etc/config*|\
+               ./etc/resolv.conf|\
+               ./usr/lib/ipkg/info) cp -af $2/$file $file;;
+               *) ln -sf /rom/${file#./*} $file;;
+               esac
+       done
+       for file in $(cd $2; find . -xdev -type l;); do
+               cp -af $2/${file#./*} $file
+       done
+       echo "done"
+}
+
+pivot() { # <new_root> <old_root>
+       mount -o move /proc $1/proc && \
+       pivot_root $1 $1$2 && {
+               mount -o move $2/dev /dev
+               mount -o move $2/tmp /tmp
+               mount -o move $2/sys /sys
+               return 0
+       }
+}
+
+mountdp() { # <device> <mount_point> <ignored> <fs>
+        dev=$1; mnt=$2; shift 2; opt=$*
+       mount $dev $mnt $opt
+       dupe $mnt $rom
+       pivot $mnt /rom
+}
+
+ramoverlay() {
+       mkdir -p /tmp/root
+       mountdp /tmp/root /mnt -o bind
+}
+
+[ "${0##*/}" = "firstboot" ] && {
+       [ -z "$rom" ] && {
+               echo "You do not have a squashfs partition; aborting"
+               echo "(firstboot cannot be run on jffs2 based firmwares)"
+               exit 1
+       }
+
+       [ "$1" = "switch2jffs" ] && {
+               mtd erase OpenWrt
+               mount -o remount,ro none / # try to avoid fs changing while copying
+               mount -o bind / /mnt
+               mount /dev/mtdblock/4 /rom/jffs -t jffs2
+               echo -n "copying files ... "
+               cp -a /mnt/* /rom/jffs
+               umount /mnt
+               echo "done"
+               pivot /rom /mnt
+               mount -o move /mnt /tmp/root
+               pivot /jffs /rom
+               exit 0
+       }
+
+       # script run manually
+       [ \! -z "$jffs" ] && {
+               echo "firstboot has already been run"
+               echo "jffs2 partition is mounted, only resetting files"
+               dupe $jffs $rom
+               exit 0
+       }
+
+       mtd erase OpenWrt
+       mountdp /dev/mtdblock/4 /jffs -t jffs2
+}
diff --git a/package/base-files/ar7-2.4/etc/preinit b/package/base-files/ar7-2.4/etc/preinit
new file mode 100755 (executable)
index 0000000..5b676ca
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+export PATH=/bin:/sbin:/usr/bin:/usr/sbin
+mount none /proc -t proc
+
+[ -f /etc/preinit.arch ] && . /etc/preinit.arch
+[ -z "$FAILSAFE" ] || {
+       echo /bin/true > /proc/sys/kernel/hotplug
+       telnetd -l /bin/login <> /dev/null 2>&1
+}
+mount_root ${FAILSAFE:+failsafe}
+exec /sbin/init
diff --git a/package/base-files/ar7-2.4/sbin/mount_root b/package/base-files/ar7-2.4/sbin/mount_root
new file mode 100755 (executable)
index 0000000..6b90bdc
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/sh
+size=$(awk '/Mem:/ {l=5242880;print((s=$2/2)<l)?$2-l:s}' /proc/meminfo)
+mount none /tmp -t tmpfs -o size=$size
+
+if [ "$1" != "failsafe" ]; then 
+       mtd unlock linux
+       mount | grep jffs2 >&-
+       if [ $? = 0 ] ; then
+               if [ $(cat /proc/mtd | wc -l) = 6 ]; then
+                       mtd erase OpenWrt
+               else
+                       mount -o remount,rw /dev/root /
+               fi
+       else
+               . /bin/firstboot
+               echo "switching to jffs2"
+               mount /dev/mtdblock/4 /jffs -t jffs2
+               pivot /jffs /rom || {
+                       echo "jffs2 unusable; using ramdisk"
+                       ramoverlay
+               }
+       fi
+fi
+
+mount none /tmp -t tmpfs -o remount,nosuid,nodev,mode=1777
+mkdir -p /dev/pts
+mount none /dev/pts -t devpts
+mount -t sysfs none /sys 2>&-
diff --git a/package/base-files/brcm-2.4/bin/firstboot b/package/base-files/brcm-2.4/bin/firstboot
new file mode 100755 (executable)
index 0000000..2818978
--- /dev/null
@@ -0,0 +1,90 @@
+#!/bin/sh
+# $Id$
+
+rom=$(awk '/squashfs/ {print $2}' /proc/mounts)
+jffs=$(awk '/jffs2/ {print $2}' /proc/mounts)
+
+dupe() { # <new_root> <old_root>
+       cd $1
+       echo -n "creating directories... "
+       {
+               cd $2 
+               find . -xdev -type d
+               echo "./dev ./jffs ./mnt ./proc ./tmp ./sys"
+               # xdev skips mounted directories
+               cd $1 
+       } | xargs mkdir -p
+       echo "done"
+
+       echo -n "setting up symlinks... "
+       for file in $(cd $2; find . -xdev -type f;); do
+               case "$file" in
+               ./rom/note) ;; #nothing
+               ./etc/config*|\
+               ./etc/resolv.conf|\
+               ./usr/lib/ipkg/info) cp -af $2/$file $file;;
+               *) ln -sf /rom/${file#./*} $file;;
+               esac
+       done
+       for file in $(cd $2; find . -xdev -type l;); do
+               cp -af $2/${file#./*} $file
+       done
+       echo "done"
+}
+
+pivot() { # <new_root> <old_root>
+       mount -o move /proc $1/proc && \
+       pivot_root $1 $1$2 && {
+               mount -o move $2/dev /dev
+               mount -o move $2/tmp /tmp
+               mount -o move $2/sys /sys
+               return 0
+       }
+}
+
+mountdp() { # <device> <mount_point> <ignored> <fs>
+        dev=$1; mnt=$2; shift 2; opt=$*
+       mount $dev $mnt $opt
+       dupe $mnt $rom
+       pivot $mnt /rom
+}
+
+ramoverlay() {
+       mkdir -p /tmp/root
+       mountdp /tmp/root /mnt -o bind
+}
+
+[ "${0##*/}" = "firstboot" ] && {
+       [ -z "$rom" ] && {
+               echo "You do not have a squashfs partition; aborting"
+               echo "(firstboot cannot be run on jffs2 based firmwares)"
+               exit 1
+       }
+
+       [ "$1" = "switch2jffs" ] && {
+               mtd erase OpenWrt
+               mount -o remount,ro none / # try to avoid fs changing while copying
+               mount -o bind / /mnt
+               mount /dev/mtdblock/4 /rom/jffs -t jffs2
+               echo -n "copying files ... "
+               cp -a /mnt/* /rom/jffs
+               umount /mnt
+               echo "done"
+               pivot /rom /mnt
+               mount -o move /mnt /tmp/root
+               pivot /jffs /rom
+               jffs2root --clean
+               exit 0
+       }
+
+       # script run manually
+       [ \! -z "$jffs" ] && {
+               echo "firstboot has already been run"
+               echo "jffs2 partition is mounted, only resetting files"
+               dupe $jffs $rom
+               exit 0
+       }
+
+       mtd erase OpenWrt
+       mountdp /dev/mtdblock/4 /jffs -t jffs2
+}
diff --git a/package/base-files/brcm-2.4/etc/preinit b/package/base-files/brcm-2.4/etc/preinit
new file mode 100755 (executable)
index 0000000..5b676ca
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+export PATH=/bin:/sbin:/usr/bin:/usr/sbin
+mount none /proc -t proc
+
+[ -f /etc/preinit.arch ] && . /etc/preinit.arch
+[ -z "$FAILSAFE" ] || {
+       echo /bin/true > /proc/sys/kernel/hotplug
+       telnetd -l /bin/login <> /dev/null 2>&1
+}
+mount_root ${FAILSAFE:+failsafe}
+exec /sbin/init
diff --git a/package/base-files/brcm-2.4/sbin/mount_root b/package/base-files/brcm-2.4/sbin/mount_root
new file mode 100755 (executable)
index 0000000..88a836c
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/sh
+is_dirty() {
+       grep Broadcom /proc/cpuinfo >&- || return 1
+       OFFSET="$(($(hexdump -v /dev/mtdblock/1 -s 20 -n 2 -e '"%d"')-1))"
+       return $(hexdump -v /dev/mtdblock/1 -s $OFFSET -n 1 -e '"%d"')
+}
+
+size=$(awk '/Mem:/ {l=5242880;print((s=$2/2)<l)?$2-l:s}' /proc/meminfo)
+mount none /tmp -t tmpfs -o size=$size
+
+if [ "$1" != "failsafe" ]; then 
+       mtd unlock linux
+       mount | grep jffs2 >&-
+       if [ $? = 0 ] ; then
+               if [ $(cat /proc/mtd | wc -l) = 6 ]; then
+                       mtd erase OpenWrt
+                       jffs2root --move
+               else
+                       mount -o remount,rw /dev/root /
+               fi
+       else
+               . /bin/firstboot
+               is_dirty 
+               [ $? != 0 ] && {
+                       echo "switching to jffs2"
+                       mount /dev/mtdblock/4 /jffs -t jffs2
+                       pivot /jffs /rom
+               } || {
+                       echo "jffs2 unusable; using ramdisk"
+                       ramoverlay
+               }
+       fi
+fi
+
+mount none /tmp -t tmpfs -o remount,nosuid,nodev,mode=1777
+mkdir -p /dev/pts
+mount none /dev/pts -t devpts
+mount -t sysfs none /sys 2>&-
diff --git a/package/base-files/brcm-2.6/bin/firstboot b/package/base-files/brcm-2.6/bin/firstboot
new file mode 100755 (executable)
index 0000000..2818978
--- /dev/null
@@ -0,0 +1,90 @@
+#!/bin/sh
+# $Id$
+
+rom=$(awk '/squashfs/ {print $2}' /proc/mounts)
+jffs=$(awk '/jffs2/ {print $2}' /proc/mounts)
+
+dupe() { # <new_root> <old_root>
+       cd $1
+       echo -n "creating directories... "
+       {
+               cd $2 
+               find . -xdev -type d
+               echo "./dev ./jffs ./mnt ./proc ./tmp ./sys"
+               # xdev skips mounted directories
+               cd $1 
+       } | xargs mkdir -p
+       echo "done"
+
+       echo -n "setting up symlinks... "
+       for file in $(cd $2; find . -xdev -type f;); do
+               case "$file" in
+               ./rom/note) ;; #nothing
+               ./etc/config*|\
+               ./etc/resolv.conf|\
+               ./usr/lib/ipkg/info) cp -af $2/$file $file;;
+               *) ln -sf /rom/${file#./*} $file;;
+               esac
+       done
+       for file in $(cd $2; find . -xdev -type l;); do
+               cp -af $2/${file#./*} $file
+       done
+       echo "done"
+}
+
+pivot() { # <new_root> <old_root>
+       mount -o move /proc $1/proc && \
+       pivot_root $1 $1$2 && {
+               mount -o move $2/dev /dev
+               mount -o move $2/tmp /tmp
+               mount -o move $2/sys /sys
+               return 0
+       }
+}
+
+mountdp() { # <device> <mount_point> <ignored> <fs>
+        dev=$1; mnt=$2; shift 2; opt=$*
+       mount $dev $mnt $opt
+       dupe $mnt $rom
+       pivot $mnt /rom
+}
+
+ramoverlay() {
+       mkdir -p /tmp/root
+       mountdp /tmp/root /mnt -o bind
+}
+
+[ "${0##*/}" = "firstboot" ] && {
+       [ -z "$rom" ] && {
+               echo "You do not have a squashfs partition; aborting"
+               echo "(firstboot cannot be run on jffs2 based firmwares)"
+               exit 1
+       }
+
+       [ "$1" = "switch2jffs" ] && {
+               mtd erase OpenWrt
+               mount -o remount,ro none / # try to avoid fs changing while copying
+               mount -o bind / /mnt
+               mount /dev/mtdblock/4 /rom/jffs -t jffs2
+               echo -n "copying files ... "
+               cp -a /mnt/* /rom/jffs
+               umount /mnt
+               echo "done"
+               pivot /rom /mnt
+               mount -o move /mnt /tmp/root
+               pivot /jffs /rom
+               jffs2root --clean
+               exit 0
+       }
+
+       # script run manually
+       [ \! -z "$jffs" ] && {
+               echo "firstboot has already been run"
+               echo "jffs2 partition is mounted, only resetting files"
+               dupe $jffs $rom
+               exit 0
+       }
+
+       mtd erase OpenWrt
+       mountdp /dev/mtdblock/4 /jffs -t jffs2
+}
diff --git a/package/base-files/brcm-2.6/etc/preinit b/package/base-files/brcm-2.6/etc/preinit
new file mode 100755 (executable)
index 0000000..5b676ca
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+export PATH=/bin:/sbin:/usr/bin:/usr/sbin
+mount none /proc -t proc
+
+[ -f /etc/preinit.arch ] && . /etc/preinit.arch
+[ -z "$FAILSAFE" ] || {
+       echo /bin/true > /proc/sys/kernel/hotplug
+       telnetd -l /bin/login <> /dev/null 2>&1
+}
+mount_root ${FAILSAFE:+failsafe}
+exec /sbin/init
diff --git a/package/base-files/brcm-2.6/sbin/mount_root b/package/base-files/brcm-2.6/sbin/mount_root
new file mode 100755 (executable)
index 0000000..88a836c
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/sh
+is_dirty() {
+       grep Broadcom /proc/cpuinfo >&- || return 1
+       OFFSET="$(($(hexdump -v /dev/mtdblock/1 -s 20 -n 2 -e '"%d"')-1))"
+       return $(hexdump -v /dev/mtdblock/1 -s $OFFSET -n 1 -e '"%d"')
+}
+
+size=$(awk '/Mem:/ {l=5242880;print((s=$2/2)<l)?$2-l:s}' /proc/meminfo)
+mount none /tmp -t tmpfs -o size=$size
+
+if [ "$1" != "failsafe" ]; then 
+       mtd unlock linux
+       mount | grep jffs2 >&-
+       if [ $? = 0 ] ; then
+               if [ $(cat /proc/mtd | wc -l) = 6 ]; then
+                       mtd erase OpenWrt
+                       jffs2root --move
+               else
+                       mount -o remount,rw /dev/root /
+               fi
+       else
+               . /bin/firstboot
+               is_dirty 
+               [ $? != 0 ] && {
+                       echo "switching to jffs2"
+                       mount /dev/mtdblock/4 /jffs -t jffs2
+                       pivot /jffs /rom
+               } || {
+                       echo "jffs2 unusable; using ramdisk"
+                       ramoverlay
+               }
+       fi
+fi
+
+mount none /tmp -t tmpfs -o remount,nosuid,nodev,mode=1777
+mkdir -p /dev/pts
+mount none /dev/pts -t devpts
+mount -t sysfs none /sys 2>&-
diff --git a/package/base-files/default/bin/firstboot b/package/base-files/default/bin/firstboot
deleted file mode 100755 (executable)
index 2818978..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/bin/sh
-# $Id$
-
-rom=$(awk '/squashfs/ {print $2}' /proc/mounts)
-jffs=$(awk '/jffs2/ {print $2}' /proc/mounts)
-
-dupe() { # <new_root> <old_root>
-       cd $1
-       echo -n "creating directories... "
-       {
-               cd $2 
-               find . -xdev -type d
-               echo "./dev ./jffs ./mnt ./proc ./tmp ./sys"
-               # xdev skips mounted directories
-               cd $1 
-       } | xargs mkdir -p
-       echo "done"
-
-       echo -n "setting up symlinks... "
-       for file in $(cd $2; find . -xdev -type f;); do
-               case "$file" in
-               ./rom/note) ;; #nothing
-               ./etc/config*|\
-               ./etc/resolv.conf|\
-               ./usr/lib/ipkg/info) cp -af $2/$file $file;;
-               *) ln -sf /rom/${file#./*} $file;;
-               esac
-       done
-       for file in $(cd $2; find . -xdev -type l;); do
-               cp -af $2/${file#./*} $file
-       done
-       echo "done"
-}
-
-pivot() { # <new_root> <old_root>
-       mount -o move /proc $1/proc && \
-       pivot_root $1 $1$2 && {
-               mount -o move $2/dev /dev
-               mount -o move $2/tmp /tmp
-               mount -o move $2/sys /sys
-               return 0
-       }
-}
-
-mountdp() { # <device> <mount_point> <ignored> <fs>
-        dev=$1; mnt=$2; shift 2; opt=$*
-       mount $dev $mnt $opt
-       dupe $mnt $rom
-       pivot $mnt /rom
-}
-
-ramoverlay() {
-       mkdir -p /tmp/root
-       mountdp /tmp/root /mnt -o bind
-}
-
-[ "${0##*/}" = "firstboot" ] && {
-       [ -z "$rom" ] && {
-               echo "You do not have a squashfs partition; aborting"
-               echo "(firstboot cannot be run on jffs2 based firmwares)"
-               exit 1
-       }
-
-       [ "$1" = "switch2jffs" ] && {
-               mtd erase OpenWrt
-               mount -o remount,ro none / # try to avoid fs changing while copying
-               mount -o bind / /mnt
-               mount /dev/mtdblock/4 /rom/jffs -t jffs2
-               echo -n "copying files ... "
-               cp -a /mnt/* /rom/jffs
-               umount /mnt
-               echo "done"
-               pivot /rom /mnt
-               mount -o move /mnt /tmp/root
-               pivot /jffs /rom
-               jffs2root --clean
-               exit 0
-       }
-
-       # script run manually
-       [ \! -z "$jffs" ] && {
-               echo "firstboot has already been run"
-               echo "jffs2 partition is mounted, only resetting files"
-               dupe $jffs $rom
-               exit 0
-       }
-
-       mtd erase OpenWrt
-       mountdp /dev/mtdblock/4 /jffs -t jffs2
-}
index 42bb438..e0d15db 100755 (executable)
@@ -1,6 +1,7 @@
 #!/bin/sh
 . /etc/functions.sh
 
+[ -f /proc/mounts ] || /sbin/mount_root
 [ -f /proc/jffs2_bbc ] && echo "S" > /proc/jffs2_bbc
 vconfig set_name_type VLAN_PLUS_VID_NO_PAD
 
diff --git a/package/base-files/default/etc/preinit b/package/base-files/default/etc/preinit
deleted file mode 100755 (executable)
index 5b676ca..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-export PATH=/bin:/sbin:/usr/bin:/usr/sbin
-mount none /proc -t proc
-
-[ -f /etc/preinit.arch ] && . /etc/preinit.arch
-[ -z "$FAILSAFE" ] || {
-       echo /bin/true > /proc/sys/kernel/hotplug
-       telnetd -l /bin/login <> /dev/null 2>&1
-}
-mount_root ${FAILSAFE:+failsafe}
-exec /sbin/init
index 88a836c..6c8805c 100755 (executable)
@@ -1,38 +1,8 @@
 #!/bin/sh
-is_dirty() {
-       grep Broadcom /proc/cpuinfo >&- || return 1
-       OFFSET="$(($(hexdump -v /dev/mtdblock/1 -s 20 -n 2 -e '"%d"')-1))"
-       return $(hexdump -v /dev/mtdblock/1 -s $OFFSET -n 1 -e '"%d"')
-}
-
 size=$(awk '/Mem:/ {l=5242880;print((s=$2/2)<l)?$2-l:s}' /proc/meminfo)
-mount none /tmp -t tmpfs -o size=$size
-
-if [ "$1" != "failsafe" ]; then 
-       mtd unlock linux
-       mount | grep jffs2 >&-
-       if [ $? = 0 ] ; then
-               if [ $(cat /proc/mtd | wc -l) = 6 ]; then
-                       mtd erase OpenWrt
-                       jffs2root --move
-               else
-                       mount -o remount,rw /dev/root /
-               fi
-       else
-               . /bin/firstboot
-               is_dirty 
-               [ $? != 0 ] && {
-                       echo "switching to jffs2"
-                       mount /dev/mtdblock/4 /jffs -t jffs2
-                       pivot /jffs /rom
-               } || {
-                       echo "jffs2 unusable; using ramdisk"
-                       ramoverlay
-               }
-       fi
-fi
-
-mount none /tmp -t tmpfs -o remount,nosuid,nodev,mode=1777
+mount none /proc -t proc
+mount none /tmp -t tmpfs -o size=$size,nosuid,nodev,mode=1777
 mkdir -p /dev/pts
 mount none /dev/pts -t devpts
 mount -t sysfs none /sys 2>&-
+mount -o remount,rw /dev/root /
diff --git a/package/base-files/sibyte-2.6/init b/package/base-files/sibyte-2.6/init
deleted file mode 100755 (executable)
index 1f98589..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/ash
-mount none /dev -t devfs
-mount none /proc -t proc
-mount_root failsafe
-mount -o remount,rw /dev/root /
-exec /bin/busybox init
diff --git a/package/base-files/xscale-2.6/etc/init.d/S00xscale b/package/base-files/xscale-2.6/etc/init.d/S00xscale
deleted file mode 100755 (executable)
index 9836de4..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-mount none /proc -t proc
-mount_root failsafe
-mount -o remount,rw /dev/root /
diff --git a/package/base-files/xscale-2.6/init b/package/base-files/xscale-2.6/init
deleted file mode 100755 (executable)
index 8ca48a0..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/ash
-mount none /dev -t devfs
-exec /bin/busybox init
This page took 0.053488 seconds and 4 git commands to generate.