183 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#! /bin/sh
 | 
						|
 | 
						|
set -x
 | 
						|
 | 
						|
own_dir="$(cd "$(dirname "$0")"; sh -c pwd)"
 | 
						|
 | 
						|
source "$own_dir/snippets.sh"
 | 
						|
 | 
						|
[ -z "$1" ] && {
 | 
						|
  echo "Specify main expression filename."
 | 
						|
  exit 1;
 | 
						|
}
 | 
						|
 | 
						|
main_file="$1"
 | 
						|
main_dir="$(cd "$(dirname "$main_file")" ; sh -c pwd)"
 | 
						|
file_name="$(basename "$main_file")"
 | 
						|
defs_file="$main_dir"/src-info-for-"$file_name"
 | 
						|
src_file="$main_dir"/src-for-"$file_name"
 | 
						|
# OK, [vcs] revert is always possible
 | 
						|
new_src_file="$main_dir"/src-for-"$file_name"
 | 
						|
 | 
						|
forcedUrl="$2"
 | 
						|
 | 
						|
defs_dir="$("$own_dir"/attrset-to-dir.sh "$defs_file")"
 | 
						|
src_defs_dir="$("$own_dir"/attrset-to-dir.sh "$src_file")"
 | 
						|
 | 
						|
getAttr () {
 | 
						|
    file="$defs_dir"/"$1"
 | 
						|
    data="$( ( [ -f "$file" ] && cat "$file" ) || echo "$2" )"
 | 
						|
    echo "attribute $1 obtained as: [[$data]]" >&2
 | 
						|
    echo "$data"
 | 
						|
}
 | 
						|
 | 
						|
method="$(getAttr method fetchurl)"
 | 
						|
baseName="$(getAttr baseName 'unnamed-package')"
 | 
						|
commonPrefetchVars=" version name hash"
 | 
						|
 | 
						|
prefetchClause=""
 | 
						|
[ fetchSFdirs = "$method" ] && {
 | 
						|
    if [ -z "$forcedUrl" ]; then 
 | 
						|
	freshUrl="$("$own_dir"/urls-from-page.sh "$(getAttr downloadPage)" |
 | 
						|
          eval "egrep '$(getAttr sourceRegexp '[-][0-9.]+/$')'" | 
 | 
						|
	  eval "egrep -v '$(getAttr blacklistRegexp '^$')'" |
 | 
						|
	  eval "$(getAttr choiceCommand 'head -n 1')" |
 | 
						|
	  eval "$(getAttr versionToFileCommand "sed -re 's@/([^/]*-[0-9.]+)/@/\1/\1$(getAttr fileSuffix .tar.gz)@'")" 
 | 
						|
	)"
 | 
						|
 | 
						|
	if ! egrep ':' <<< "$freshUrl" ; then 
 | 
						|
		freshUrl="$(dirname "$(getAttr downloadPage).")/$freshUrl"
 | 
						|
	fi
 | 
						|
 | 
						|
	echo "Found download link: $freshUrl" >&2
 | 
						|
    else
 | 
						|
        freshUrl="$forcedUrl"
 | 
						|
    fi
 | 
						|
 | 
						|
    freshUrl="$(echo "$freshUrl" | sed -re "$skipRedirectSF")"
 | 
						|
    echo "Sourceforge-corrected URL: $freshUrl" >&2
 | 
						|
    
 | 
						|
    version="$(echo "$freshUrl" | 
 | 
						|
      sed -re "$(getAttr versionExtractorSedScript "$extractVersionSF")")"
 | 
						|
    baseName="$(getAttr baseName "$(echo "$freshUrl" | sed -re 's@.*/project/([^/]+)/.*@\1@')")"
 | 
						|
    url="$freshUrl"
 | 
						|
    name="$baseName-$version"
 | 
						|
    advertisedUrl="$freshUrl"
 | 
						|
 | 
						|
    if [ x"$freshUrl" = x"$(cat "$src_defs_dir"/advertisedUrl)" ]; then
 | 
						|
        echo "Source link not changed" >&2
 | 
						|
        exit
 | 
						|
    fi
 | 
						|
    hash=$(nix-prefetch-url "$freshUrl")
 | 
						|
 | 
						|
    prefetchVars="url advertisedUrl";
 | 
						|
}
 | 
						|
[ fetchSF = "$method" ] && {
 | 
						|
    if [ -z "$forcedUrl" ]; then 
 | 
						|
	freshUrl="$("$own_dir"/urls-from-page.sh "$(getAttr downloadPage)" |
 | 
						|
          eval "egrep \"$(getAttr sourceRegexp '.*[.]tar[.].*|.*[.]tgz$|.*[.]tbz2$')\"" | 
 | 
						|
	  eval "egrep -v \"$(getAttr blacklistRegexp '^$')\"" |
 | 
						|
          eval "$(getAttr choiceCommand 'head -1')")"
 | 
						|
 | 
						|
	if ! egrep ':' <<< "$freshUrl" ; then 
 | 
						|
		freshUrl="$(dirname "$(getAttr downloadPage).")/$freshUrl"
 | 
						|
	fi
 | 
						|
 | 
						|
	echo "Found download link: $freshUrl" >&2
 | 
						|
    else
 | 
						|
        freshUrl="$forcedUrl"
 | 
						|
    fi
 | 
						|
 | 
						|
    freshUrl="$(echo "$freshUrl" | sed -re "$skipRedirectSF")"
 | 
						|
    echo "Sourceforge-corrected URL: $freshUrl" >&2
 | 
						|
    
 | 
						|
    version="$(echo "$freshUrl" | 
 | 
						|
      sed -re "$(getAttr versionExtractorSedScript "$extractVersionSF")")"
 | 
						|
    baseName="$(getAttr baseName "$(echo "$freshUrl" | sed -re 's@.*/project/([^/]+)/.*@\1@')")"
 | 
						|
    url="$freshUrl"
 | 
						|
    name="$baseName-$version"
 | 
						|
    advertisedUrl="$freshUrl"
 | 
						|
 | 
						|
    if [ x"$freshUrl" = x"$(cat "$src_defs_dir"/advertisedUrl)" ]; then
 | 
						|
        echo "Source link not changed" >&2
 | 
						|
        exit
 | 
						|
    fi
 | 
						|
    hash=$(nix-prefetch-url "$freshUrl")
 | 
						|
 | 
						|
    prefetchVars="url advertisedUrl";
 | 
						|
}
 | 
						|
[ fetchurl = "$method" ] && {
 | 
						|
    if [ -z "$forcedUrl" ] ; then
 | 
						|
        freshUrl="$("$own_dir"/urls-from-page.sh "$(getAttr downloadPage)" |
 | 
						|
          eval "egrep \"$(getAttr sourceRegexp  '.*[.]tar[.].*|.*[.]tgz$|.*[.]tbz2$')\"" | 
 | 
						|
	  eval "egrep -v \"$(getAttr blacklistRegexp '^$')\"" |
 | 
						|
          eval "$(getAttr choiceCommand 'head -1')")"
 | 
						|
    
 | 
						|
        if ! egrep ':' <<< "$freshUrl" ; then 
 | 
						|
    	    freshUrl="$(dirname "$(getAttr downloadPage).")/$freshUrl"
 | 
						|
        fi
 | 
						|
    
 | 
						|
        echo "Found download link: $freshUrl" >&2
 | 
						|
    else
 | 
						|
        freshUrl="$forcedUrl"
 | 
						|
    fi
 | 
						|
    
 | 
						|
    version="$(echo "$freshUrl" | 
 | 
						|
      eval "sed -re \"$(getAttr versionExtractorSedScript \
 | 
						|
        's/.*-([0-9.]+)[.].*/\1/')\"")"
 | 
						|
    
 | 
						|
    mirrorUrl="$(echo "$freshUrl" | 
 | 
						|
      eval "sed -r -e \"$(getAttr versionReferenceCreator \
 | 
						|
        's/-'"${version}"'[.]/-\${version}./')\"" |
 | 
						|
      eval "sed -r -e \"$(getAttr mirrorSedScript)\"")"
 | 
						|
    url="$mirrorUrl"
 | 
						|
    
 | 
						|
    name="$baseName-$version"
 | 
						|
    
 | 
						|
    advertisedUrl="$freshUrl"
 | 
						|
    url="$mirrorUrl"
 | 
						|
    
 | 
						|
    if [ x"$freshUrl" = x"$(cat "$src_defs_dir"/advertisedUrl)" ]; then
 | 
						|
        echo "Source link not changed" >&2
 | 
						|
        exit
 | 
						|
    fi
 | 
						|
    hash=$(nix-prefetch-url "$freshUrl")
 | 
						|
 | 
						|
    prefetchVars="url advertisedUrl";
 | 
						|
}
 | 
						|
[ "fetchgit" = "$method" ] && {
 | 
						|
    repoUrl="$(getAttr repoUrl)"
 | 
						|
    export NIX_PREFETCH_GIT_CHECKOUT_HOOK="
 | 
						|
        cat .git/HEAD
 | 
						|
    "
 | 
						|
    export NIX_HASH_ALGO=sha256
 | 
						|
    rev="$(getAttr rev '')";
 | 
						|
    rev_and_hash="$("$own_dir"/../fetchgit/nix-prefetch-git "$repoUrl" "$rev" | tee /dev/stderr | tail -2)"
 | 
						|
 | 
						|
    rev="$(echo "$rev_and_hash" | head -1)"
 | 
						|
    url="$repoUrl";
 | 
						|
    hash="$(echo "$rev_and_hash" | tail -1)"
 | 
						|
    version="$rev"
 | 
						|
    name="$baseName-$version"
 | 
						|
 | 
						|
    prefetchVars="rev url";
 | 
						|
}
 | 
						|
 | 
						|
prefetchAssignments="";
 | 
						|
for i in $commonPrefetchVars $prefetchVars; do
 | 
						|
  prefetchAssignments="$prefetchAssignments $i=\"$(eval echo \"\$$i\")\";$(echo -e '\n  ')"
 | 
						|
done;
 | 
						|
 | 
						|
extraAssignments=""
 | 
						|
for i in $(getAttr extraVars ''); do
 | 
						|
  eval "$(getAttr "eval_$i" 'i=""')"
 | 
						|
  extraAssignments="$extraAssignments $i=\"$(eval echo \"\$$i\")\";$(echo -e '\n  ')"
 | 
						|
done
 | 
						|
 | 
						|
cat << EOF > "$new_src_file"
 | 
						|
rec {
 | 
						|
  $prefetchAssignments
 | 
						|
  $extraAssignments
 | 
						|
}
 | 
						|
EOF
 |