[pacman-dev] [PATCH 06/11] makepkg: allow using GIT source URLs

Dave Reisner d at falconindy.com
Tue Jun 26 20:14:51 EDT 2012


On Wed, Jun 27, 2012 at 08:58:12AM +1000, Allan McRae wrote:
> Allow specifing GIT sources using the following syntax
> 
> source=('<folder>::<repo>#<fragment>')
> 
> This will download the git repo <repo> into <folder> (into $SRCDIR
> if set, otherwise $startdir). <repo> must start with "git", but
> non-git protocols are handled using (e.g.) "git+http://...".
> 
> The <fragment> can be used to specify a branch, tag, or commit to
> build from. e.g. branch=maint.
> 
> Checksum entries for git sources should be "SKIP".
> 
> Signed-off-by: Allan McRae <allan at archlinux.org>
> ---
>  scripts/makepkg.sh.in | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 85 insertions(+)
> 
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index 985bbbd..2b29759 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -341,6 +341,88 @@ download_file() {
>  	ln -s "$SRCDEST/$filename" "$srcdir/"
>  }
>  
> +download_git() {
> +	local netfile=$1
> +
> +	local fragment=${netfile##*#}
> +	if [[ $fragment = "$netfile" ]]; then
> +		unset fragment
> +	fi
> +
> +	local folder=${netfile%%::*}

This makes my OCD twitch -- dir instead of folder?

> +	local repo=${netfile##*/}
> +	repo=${repo%%#*}
> +	repo=${repo%%.git*}
> +
> +	if [[ $folder = "$netfile" ]]; then
> +		folder="${repo}"
> +	fi
> +
> +	if [[ ! -d "$startdir"/$folder && -d "$SRCDEST"/$folder ]]; then
> +		folder="$SRCDEST"/$folder
> +	else
> +		folder="$startdir"/$folder
> +	fi

None of the quoting in this block is strictly necessary.

> +
> +	local url=$(get_url "$netfile")
> +	url=${url##*git+}
> +	url=${url%%#*}
> +
> +	if [[ ! -d $folder ]]; then
> +		msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
> +		if ! git clone --mirror "$url" "$folder"; then
> +			error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"
> +			plain "$(gettext "Aborting...")"
> +			exit 1
> +		fi
> +	else
> +		msg2 "$(gettext "Updating %s %s repo...")" "${repo}" "git"
> +		cd_safe "$folder"
> +		if ! git fetch --all -p; then
> +			# only warn on failure to allow offline builds
> +			warning "$(gettext "Failure while updating %s %s repo")" "${repo}" "git"
> +		fi
> +	fi
> +
> +	msg2 "$(gettext "Creating working copy of %s %s repo...")" "${repo}" "git"
> +	pushd "$srcdir" &>/dev/null
> +	rm -rf ${folder##*/}
> +
> +	if ! git clone $folder; then

Your spare quotes from above can go here.

> +		error "$(gettext "Failure while creating working copy of %s %s repo")" "${repo}" "git"
> +		plain "$(gettext "Aborting...")"
> +		exit 1
> +	fi
> +
> +	cd_safe ${folder##*/}

Quotes here too, please.

> +
> +	local ref
> +	if [[ -n $fragment ]]; then
> +		case $fragment in
> +			commit=*|tag*)

tag=* rather than tag* ? You might want to trim $fragment right in the
switch to avoid all the glob matching, i.e.

  case ${fragmen%%=*} in
    commit|tag)
      ....
    branch)
      ....

> +				ref=${fragment##*=}
> +				;;
> +			branch=*)
> +				ref=origin/${fragment##*=}
> +				;;
> +			*)
> +				error "$(gettext "Unrecognized reference: %s")" "${fragment}"
> +				plain "$(gettext "Aborting...")"
> +				exit 1
> +		esac
> +	fi
> +
> +	if [[ -n $ref ]]; then
> +		if ! git checkout -b makepkg $ref; then

Is that branch name really intentional here? Why not name it the same as
$ref?

> +			error "$(gettext "Failure while creating working copy of %s %s repo")" "${repo}" "git"
> +			plain "$(gettext "Aborting...")"
> +			exit 1
> +		fi
> +	fi
> +
> +	popd &>/dev/null
> +}
> +
>  download_sources() {
>  	msg "$(gettext "Retrieving Sources...")"
>  
> @@ -357,6 +439,9 @@ download_sources() {
>  			ftp|http|https|rsync|scp)
>  				download_file "$nethe tfile"
>  				;;
> +			git*)
> +				download_git "$netfile"
> +				;;
>  			*)
>  				error "$(gettext "Unknown download protocol: %s")" "$proto"
>  				plain "$(gettext "Aborting...")"
> -- 
> 1.7.11.1
> 
> 


More information about the pacman-dev mailing list