Lookup the existence of matching functions for each protocol, and
fallback on the generic file handler. New source protocols can then be
added via thirdparty libmakepkg drop-ins without requiring modifications
to source.sh

Fixes FS#49076

Signed-off-by: Eli Schwartz <[email protected]>
---
 scripts/libmakepkg/source.sh.in | 46 +++++++++------------------------
 1 file changed, 12 insertions(+), 34 deletions(-)

diff --git a/scripts/libmakepkg/source.sh.in b/scripts/libmakepkg/source.sh.in
index 198efd5e..c07ce76d 100644
--- a/scripts/libmakepkg/source.sh.in
+++ b/scripts/libmakepkg/source.sh.in
@@ -60,25 +60,15 @@ download_sources() {
 
                local proto=$(get_protocol "$netfile")
                case "$proto" in
-                       local)
-                               download_local "$netfile"
-                               ;;
-                       bzr)
-                               (( get_vcs )) && download_bzr "$netfile"
-                               ;;
-                       git)
-                               (( get_vcs )) && download_git "$netfile"
-                               ;;
-                       hg)
-                               (( get_vcs )) && download_hg "$netfile"
-                               ;;
-                       svn)
-                               (( get_vcs )) && download_svn "$netfile"
-                               ;;
-                       *)
-                               download_file "$netfile"
+                       bzr|git|hg|svn)
+                               (( get_vcs )) || continue
                                ;;
                esac
+               if declare -f download_$proto > /dev/null; then
+                       download_$proto "$netfile"
+               else
+                       download_file "$netfile"
+               fi
 
                popd &>/dev/null
        done
@@ -92,22 +82,10 @@ extract_sources() {
        for netfile in "${all_sources[@]}"; do
                local file=$(get_filename "$netfile")
                local proto=$(get_protocol "$netfile")
-               case "$proto" in
-                       bzr)
-                               extract_bzr "$netfile"
-                               ;;
-                       git)
-                               extract_git "$netfile"
-                               ;;
-                       hg)
-                               extract_hg "$netfile"
-                               ;;
-                       svn)
-                               extract_svn "$netfile"
-                               ;;
-                       *)
-                               extract_file "$file"
-                               ;;
-               esac
+               if declare -f extract_$proto > /dev/null; then
+                       extract_$proto "$netfile"
+               else
+                       extract_file "$file"
+               fi
        done
 }
-- 
2.17.0

Reply via email to