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
155 changes: 155 additions & 0 deletions gitTools.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
###############################################################################
# Git Helpers for the build environment
###############################################################################

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

# Show the revision
# echoes cf28a6f
function git_show_revision {
path=$1
if [ -z "${path}" ] ; then
path=$(pwd)
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=$1
if [ -z "${path}" ] ; then
path=$(pwd)
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=$1
if [ -z "${path}" ] ; then
path=$(pwd)
fi
echo $(git -C "${path}" branch 2> /dev/null | sed -n '/^\*/s/^\* //p')

Choose a reason for hiding this comment

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

git -C $path rev-parse --abbrev-ref HEAD is probably easier.

}

# Show all the branch information and where the head is pointing
# echoes (HEAD -> buildenv, origin/buildenv)
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
}

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=$1
if [ -z "${path}" ] ; then
path=$(pwd)
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
}

# Check if path is a git repository
# returns a unix 0, 1 return code depending on the status
function git_is_repository {
path=$1
if [ -z "${path}" ] ; then
path=$(pwd)
fi
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=$1
if [ -z "${path}" ] ; then
path=$(pwd)
fi

if git_is_repository "${path}" ; then
echo "true"
else
echo "false"
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=$1
if [ -z "${path}" ] ; then
path=$(pwd)
fi
if ! git_is_repository "${path}" ; then
echo "No git repository"
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_repository_status ${path}))"
fi
echo "Rev ${revision}${dirty} on ${branch} from ${origin}"
}

# Function to test the implementation
function test_functions {
path=$1
if [ -z "${path}" ] ; then
path=$(pwd)
fi

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 "Repository? :" $(git_is_repository "${path}")

Choose a reason for hiding this comment

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

Maybe clearer In repository instead of Repository?

echo "Info :" $(git_info "${path}")
echo "Info on / :" $(git_info "/")

Choose a reason for hiding this comment

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

Out of curiosity: why printing into on /? What is / in this context? Are you running this from inside a sandbox?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I just wanted a folder where I can test the function that doesn't contain a git folder ;)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

and the root folder as in / usually is not managed by git ;)

Choose a reason for hiding this comment

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

... however beautiful this idea might seem ...

}

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