Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Git Tools integration #1

Merged
merged 14 commits into from
Dec 23, 2015
167 changes: 167 additions & 0 deletions gitTools.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
###############################################################################
# Git Helpers for the build environment
###############################################################################

# Get the path
# Internal function that returns the current path if no argument is given.
function _get_path {
path=$1
if [ -z "${path}" ] ; then
path=$(pwd)
fi
echo "$path"
}

# Check if path is a git repository
# returns a unix 0, 1 return code depending on the status
function git_is_repository {
path=$(_get_path $1)
git -C "${path}" rev-parse --is-inside-work-tree &> /dev/null
}

# Show if path is a repository
# echoes true or false
function git_repository {
path=$(_get_path $1)
if git_is_repository "${path}" ; then
echo "true"
else
echo "false"
fi
}

# Check the repository
function _check_path {
path=$(_get_path $1)
if ! git_is_repository "${path}" ; then
echo "Not a git repository"
exit 1
fi
}

# Show the origin
# echoes [email protected]:pspoerri/cosmo-pompa.git
function git_show_origin {
path=$(_get_path $1)
if ! _check_path $1 ; then exit 1; fi
echo $(git -C "${path}" config --get remote.origin.url)
}

# Show the revision
# echoes cf28a6f
function git_show_revision {
path=$(_get_path $1)
if ! _check_path $1 ; then exit 1; fi
echo $(git -C "${path}" rev-parse --short HEAD)
}

# Show the check in date of the head
# echoes 2015-12-21 10:42:20 +0100
function git_show_checkindate {
path=$(_get_path $1)
if ! _check_path $1 ; then exit 1; fi
revision=$(git_show_revision "${path}")
echo $(git -C "${path}" show -s --format=%ci ${revision})
}

# Show the current branch
# echoes buildenv
function git_show_branch {
path=$(_get_path $1)
if ! _check_path $1 ; then exit 1; fi
echo $(git -C "${path}" rev-parse --abbrev-ref HEAD)
}

# Show all the branch information and where the head is pointing
# echoes (HEAD -> buildenv, origin/buildenv)
function git_show_branch_all {
path=$(_get_path $1)
if ! _check_path $1 ; then exit 1; fi
echo $(git -C "${path}" log -n 1 --pretty=%d HEAD)
}

# Determines if the branch is dirty or not.
function git_repository_is_clean {
path=$(_get_path $1)
if ! _check_path $1 ; then exit 1; fi
# --quiet will invoke --exit-code which makes git exit with code 1 if there are
# changes in the repository.
git -C "${path}" diff --quiet &> /dev/null
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More of a curiosity than a problem: does this really work? If I get it correctly, this function returns 0 or 1 depending on whether the return status of git diff is 0 or 1 (probably 1 meaning dirty directory). Am I right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, exactly. We get a 0 if there are no changes and 1 if we have a change.

https://git-scm.com/docs/git-diff on this:

--exit-code
    Make the program exit with codes similar to diff(1). That is, it exits with 1 if there were differences and 0 means no differences.
--quiet
   Disable all output of the program. Implies --exit-code.

Then I can use the function within an if statement.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if you run this function on a directory which is not a git repo? Undefined behavior?
Anyway it's fine, thanks for clarifying.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well I could add an additional switch to the functions that check if $path is a repo.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no need.
Good job.

On Wed, Dec 23, 2015 at 10:38 AM, Pascal Spörri [email protected]
wrote:

In gitTools.sh
#1 (comment):

+function git_show_branch_all {

  • path=$1
  • if [ -z "${path}" ] ; then
  •    path=$(pwd)
    
  • fi
  • echo $(git -C "${path}" log -n 1 --pretty=%d HEAD)
    +}

+# Determines if the branch is dirty or not.
+function git_repository_is_clean {

  • path=$1
  • if [ -z "${path}" ] ; then
  •    path=$(pwd)
    
  • fi
  • git -C "${path}" diff --quiet &> /dev/null
    +}

Well I could add an additional switch to the functions that check if $path
is a repo.


Reply to this email directly or view it on GitHub
https://github.com/C2SM-RCM/buildenv/pull/1/files#r48332126.


# Determines the status of a repository
# echoes clean or dirty
function git_show_repository_status {
path=$(_get_path $1)
if ! _check_path $1 ; then exit 1; fi
if git_repository_is_clean "${path}" ; then

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can probably call directly git_repository_is_clean $1. The check is done by that function, which will choose the right path.
By the way, wouldn't it be a good idea to implement a function git_get_path which echoes the current path if the passed value is empty and returns $1 otherwise? You could simplify all these checks to path=$(git_get_path $1).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great idea!

echo "clean"
else
echo "dirty"
fi
}

# Pretty print git info
# echoes "No git repository" if we are not dealing with a git repository
# echoes "Rev cf28a6f (dirty) on buildenv from [email protected]:pspoerri/cosmo-pompa.git"
# otherwise
function git_info {
path=$(_get_path $1)
if ! _check_path $1 ; then exit 1; fi
revision=$(git_show_revision "${path}")
branch=$(git_show_branch "${path}")
origin=$(git_show_origin "${path}")
dirty=""
if ! git_repository_is_clean "${path}" ; then
dirty=" ($(git_show_repository_status ${path}))"
fi
echo "Rev ${revision}${dirty} on ${branch} from ${origin}"
}

# Function to test the implementation
function test_functions {
path=$(_get_path $1)
echo "Checking the function with \"${path}\" as argument."
echo "---------------------------------------------------------------------"
echo "Origin :" $(git_show_origin "${path}")
echo "Revision :" $(git_show_revision "${path}")
echo "Check in date:" $(git_show_checkindate "${path}")
echo "Branch :" $(git_show_branch "${path}")
echo "Branch all :" $(git_show_branch_all "${path}")
echo "Status :" $(git_show_repository_status "${path}")
echo "In repository:" $(git_repository "${path}")
echo "Info :" $(git_info "${path}")
echo ""
echo "Testing a unversioned folder"
echo "---------------------------------------------------------------------"
echo "Origin :" $(git_show_origin /)
echo "Revision :" $(git_show_revision /)
echo "Check in date:" $(git_show_checkindate /)
echo "Branch :" $(git_show_branch /)
echo "Branch all :" $(git_show_branch_all /)
echo "Status :" $(git_show_repository_status /)
echo "In repository:" $(git_repository /)
echo "Info :" $(git_info /)
echo ""
echo "Checking without arguments"
echo "---------------------------------------------------------------------"
echo "Origin :" $(git_show_origin)
echo "Revision :" $(git_show_revision)
echo "Check in date:" $(git_show_checkindate)
echo "Branch :" $(git_show_branch)
echo "Branch all :" $(git_show_branch_all)
echo "Status :" $(git_show_repository_status)
echo "In repository:" $(git_repository)
echo "Info :" $(git_info)
}

export -f git_show_origin
export -f git_show_revision
export -f git_show_checkindate
export -f git_show_branch
export -f git_show_branch_all
export -f git_repository_is_clean
export -f git_show_repository_status
export -f git_is_repository
export -f git_repository
export -f git_info