* Add another flag SRCIPK_SHALLOW_CLONE that will do a shallow
  clone of depth 1 to reduce the size of the git history.
    * The full history can be fetched again using either of the
      following commands based on the version of git being used
        - git pull --unshallow (New git versions)
        - git pull (older git versions)
* Clean up some of the variable names to make it more clear what
  they are storing.
* Create a generic function to determine the fetch reporitory

Signed-off-by: Chase Maupin <[email protected]>
---
 meta-arago-distro/classes/sourceipk.bbclass |  100 ++++++++++++++++++++++++---
 1 file changed, 89 insertions(+), 11 deletions(-)

diff --git a/meta-arago-distro/classes/sourceipk.bbclass 
b/meta-arago-distro/classes/sourceipk.bbclass
index 20dda76..33878ac 100644
--- a/meta-arago-distro/classes/sourceipk.bbclass
+++ b/meta-arago-distro/classes/sourceipk.bbclass
@@ -61,32 +61,111 @@ SRCIPK_INCLUDE_EXTRAFILES ?= "1"
 
 SRCIPK_PRESERVE_GIT ?= "false"
 
-adjust_git() {
+# Create a shallow clone of the git repository to reduce the size of
+# the sourceipk
+SRCIPK_SHALLOW_CLONE ?= "false"
+
+# This function will return the fetch URL for a git repository passed as
+# the first parameter.
+get_remote() {
+    git_repo="$1"
+
+    if [ "$git_repo" == "" ]
+    then
+        echo "git_repo not passed to get_remote"
+        exit 1
+    fi
+
+    cd $git_repo
+
+    # Get the remote repository fetch URL
+    remote=`git remote -v | grep "(fetch)" | cut -d ' ' -f 1   | cut -c 7- | 
tr -d ' '`
+
+    # Since the echo'ed value of this statment is the returned value redirect
+    # the output of this command to /dev/null
+    cd - > /dev/null
+
+    # echo back the remote repository URL as the output of this function
+    echo $remote
+
+    return 0
+}
+
+# Some git repositories are very large and we do not want to ship the
+# full history.  Instead we want to limit history to reduce the size while
+# still keeping the git repository in place.  The full history can be
+# fetched using git pull --unshallow or just git pull
+# NOTE: This function depends on a git version >= 1.7.10.  It will work
+#       with older versions but the size will be larger because rather
+#       than just a single branch the limited history will be a depth of
+#       1 for all branches and tags.
+limit_git_history() {
+    # By default limit the history to 1 commit since the user can always
+    # use git pull --unshallow to fetch the rest of history.  The depth
+    # level of 1 is set to keep from tracking through all merges and
+    # pulling excess history
+    commits="1"
+
+    # Temporary directory to make shallow clones in
+    gitshallowclone="${WORKDIR}/temp-git-shallow-clone"
+
+    # Change directory to the git repository to be safe
+    cd $tmp_dir/${SRCIPK_INSTALL_DIR}
+
+    # Create a temporary directory to hold the shallow git clone
+    mkdir -p $gitshallowclone
 
+    remote=`get_remote $PWD`
+
+    git clone --depth $commits --branch ${BRANCH} file://$remote 
$gitshallowclone
+
+    # remove original kernel clone since we will replace it with the shallow
+    # clone
+    rm -rf $tmp_dir/${SRCIPK_INSTALL_DIR}/.git
+
+    # replace the original kernel git data with the shallow clone git data
+    mv $gitshallowclone/.git $tmp_dir/${SRCIPK_INSTALL_DIR}/
+    rm -rf $gitshallowclone
+
+    cd -
+}
+
+adjust_git() {
     orig_dir="$PWD"
 
     cd $tmp_dir/${SRCIPK_INSTALL_DIR}
 
     if [ -d ".git" ]
     then
+        # Get the location of the local repository
+        local_repo=`get_remote $PWD`
 
-        # Grab path to cloned local repository
-        old=`git remote -v | grep "(fetch)" | cut -d ' ' -f 1   | cut -c 7- | 
tr -d ' '`
-
-        if [ -d $old -a "${SRCIPK_PRESERVE_GIT}" = "true" ]
+        if [ -d $local_repo -a "${SRCIPK_PRESERVE_GIT}" = "true" ]
         then
-            cd $old
+            cd $local_repo
+
+            # If SRCIPK_SHALLOW_CLONE is true then make a shallow copy of the
+            # git repository and then fix up the git URLs
+            if [ "${SRCIPK_SHALLOW_CLONE}" == "true" ]
+            then
+                limit_git_history
+            fi
 
             # Grab actual url used to create the repository
-            orig=`git remote -v | grep "(fetch)" | cut -d ' ' -f 1   | cut -c 
7- | tr -d ' '`
+            remote_repo=`get_remote $PWD`
 
             cd -
 
-            git remote set-url origin $orig $old
+            git remote set-url origin $remote_repo $local_repo
 
-            # Repackage the repository so its a proper clone of the original 
(remote) git repository
+            # Repackage the repository so its a proper clone of the original
+            # (remote) git repository
             git repack -a -d
-            rm .git/objects/info/alternates
+
+            if [ -e .git/objects/info/alternates ]
+            then
+                rm .git/objects/info/alternates
+            fi
 
         else
             rm -rf .git
@@ -95,7 +174,6 @@ adjust_git() {
     fi
 
     cd $orig_dir
-
 }
 
 # Create a README file that describes the contents of the source ipk
-- 
1.7.9.5

_______________________________________________
meta-arago mailing list
[email protected]
http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago

Reply via email to