git: 16bde072b16d - main - bsd.sites.mk: Support tag names with USE_GITLAB

From: Felix Palmen <zirias_at_FreeBSD.org>
Date: Wed, 12 Jul 2023 18:58:04 UTC
The branch main has been updated by zirias:

URL: https://cgit.FreeBSD.org/ports/commit/?id=16bde072b16daca1c886116e602c94b5fa99c20f

commit 16bde072b16daca1c886116e602c94b5fa99c20f
Author:     Felix Palmen <zirias@FreeBSD.org>
AuthorDate: 2022-10-21 07:10:41 +0000
Commit:     Felix Palmen <zirias@FreeBSD.org>
CommitDate: 2023-07-12 18:55:08 +0000

    bsd.sites.mk: Support tag names with USE_GITLAB
    
    Since quite some time, it's possible to download generated tarballs from
    gitlab for a tag name without knowing the corresponding git hash. This
    is preferable because you have a single source of truth about the
    software version.
    
    Support this by replacing GL_COMMIT with GL_TAGNAME which also accepts a
    commit hash, similar to USE_GITHUB. Unfortunately, there's a catch, the
    DISTFILE must be named exactly: ${GL_PROJECT}-${GL_TAGNAME}.tar.bz2,
    otherwise it extracts in a directory that contains the commit hash. So,
    we can't add the gitlab account or the revision suffix to make it work.
    
    Therefore, detect whether GL_TAGNAME contains a commit hash, and if it
    does, use the old behavior of deriving DISTNAME and DISTFILES.
    
    Document in CHANGES, also add a DEV_WARNING similar to USE_GITHUB when
    there's an URL in MASTER_SITES that looks like a gitlab URL. With
    support for tags, there shouldn't be any reason left to hardcode such an
    URL in MASTER_SITES.
    
    PR:                     248967
    Approved by:            portmgr (tcberner, mentor)
    Differential Revision:  https://reviews.freebsd.org/D37077
---
 CHANGES             | 16 ++++++++++++++
 Mk/Uses/kde.mk      |  2 +-
 Mk/Uses/xorg-cat.mk |  2 +-
 Mk/bsd.options.mk   |  2 +-
 Mk/bsd.port.mk      |  8 +------
 Mk/bsd.sites.mk     | 61 +++++++++++++++++++++++++++++++++++++----------------
 6 files changed, 63 insertions(+), 28 deletions(-)

diff --git a/CHANGES b/CHANGES
index 5e98b3ee86a4..25c7d5fa12a9 100644
--- a/CHANGES
+++ b/CHANGES
@@ -10,6 +10,22 @@ in the release notes and/or placed into UPDATING.
 
 All ports committers are allowed to commit to this file.
 
+20230712:
+AUTHOR: zirias@FreeBSD.org
+
+  USE_GITLAB has been changed to allow fetching by tag name. This was done by
+  removing the GL_COMMIT variable and introducing GL_TAGNAME instead.
+
+  Similar to USE_GITHUB/GH_TAGNAME, you can still use a commit hash with
+  GL_TAGNAME (the full 40-character hash is required for that). If not
+  specified, GL_TAGNAME defaults to DISTVERSIONFULL.
+
+  Note fetching by tag name might not work on gitlab installations running
+  very old versions; in that case, you must still specify a commit hash.
+
+  For now, GL_COMMIT is still recognized but deprecated, using it will issue
+  a warning in developer mode.
+
 20230712:
 AUTHOR: 0mp@FreeBSD.org
 
diff --git a/Mk/Uses/kde.mk b/Mk/Uses/kde.mk
index aa9e2f39fbc4..863fe85d0c17 100644
--- a/Mk/Uses/kde.mk
+++ b/Mk/Uses/kde.mk
@@ -134,7 +134,7 @@ USE_GITLAB=		yes
 GL_SITE=		https://invent.kde.org
 GL_ACCOUNT=		${_invent_category}
 GL_PROJECT=		${_invent_name}
-GL_COMMIT=		${_invent_hash}
+GL_TAGNAME=		${_invent_hash}
 .      endif
 .    endif
 
diff --git a/Mk/Uses/xorg-cat.mk b/Mk/Uses/xorg-cat.mk
index 3b64eecad9ae..0853fd6b3e3c 100644
--- a/Mk/Uses/xorg-cat.mk
+++ b/Mk/Uses/xorg-cat.mk
@@ -26,7 +26,7 @@
 # 		* meson (experimental)
 #
 #
-# By defining USE_GITLAB and GL_COMMIT, it is possible to pull code straight
+# By defining USE_GITLAB and GL_TAGNAME, it is possible to pull code straight
 # from the freedesktop.org gitlab, instead of official release tarballs.
 #
 #.MAINTAINER:	x11@FreeBSD.org
diff --git a/Mk/bsd.options.mk b/Mk/bsd.options.mk
index 90af39e1bed5..09656bb0e1e9 100644
--- a/Mk/bsd.options.mk
+++ b/Mk/bsd.options.mk
@@ -184,7 +184,7 @@ _OPTIONS_FLAGS=	ALL_TARGET BROKEN CABAL_EXECUTABLES CATEGORIES CFLAGS CONFIGURE_
 		CONFLICTS CONFLICTS_BUILD CONFLICTS_INSTALL CPPFLAGS CXXFLAGS \
 		DESKTOP_ENTRIES DISTFILES EXTRA_PATCHES EXTRACT_ONLY \
 		GH_ACCOUNT GH_PROJECT GH_SUBDIR GH_TAGNAME GH_TUPLE \
-		GL_ACCOUNT GL_COMMIT GL_PROJECT GL_SITE GL_SUBDIR GL_TUPLE \
+		GL_ACCOUNT GL_PROJECT GL_SITE GL_SUBDIR GL_TAGNAME GL_TUPLE \
 		IGNORE INFO INSTALL_TARGET LDFLAGS LIBS MAKE_ARGS MAKE_ENV \
 		MASTER_SITES PATCHFILES PATCH_SITES PLIST_DIRS PLIST_FILES \
 		PLIST_SUB PORTDOCS PORTEXAMPLES SUB_FILES SUB_LIST \
diff --git a/Mk/bsd.port.mk b/Mk/bsd.port.mk
index 5e3c2e7fad2f..9f6dfb0452c1 100644
--- a/Mk/bsd.port.mk
+++ b/Mk/bsd.port.mk
@@ -1725,7 +1725,7 @@ WRKSRC?=		${WRKDIR}/${GH_PROJECT_DEFAULT}-${GH_TAGNAME_EXTRACT}
 .      if defined(WRKSRC)
 DEV_WARNING+=	"You are using USE_GITLAB and WRKSRC is set which is wrong.  Set GL_PROJECT, GL_ACCOUNT correctly, and/or set WRKSRC_SUBDIR and remove WRKSRC entirely."
 .      endif
-WRKSRC?=		${WRKDIR}/${GL_PROJECT}-${GL_COMMIT}
+WRKSRC?=		${WRKDIR}/${GL_PROJECT}-${GL_TAGNAME}
 .    endif
 
 # If the distname is not extracting into a specific subdirectory, have the
@@ -2963,12 +2963,6 @@ DEPENDS_ARGS+=	NOCLEANDEPENDS=yes
 .      endif
 .    endif
 
-.    if defined(USE_GITLAB) && !${USE_GITLAB:Mnodefault} && empty(GL_COMMIT_DEFAULT)
-check-makevars::
-	@${ECHO_MSG} "GL_COMMIT is a required 40 character hash for use USE_GITLAB"
-	@${FALSE}
-.    endif
-
 ################################################################
 #
 # Do preliminary work to detect if we need to run the config
diff --git a/Mk/bsd.sites.mk b/Mk/bsd.sites.mk
index 78cb71593c4f..c6bee3798d56 100644
--- a/Mk/bsd.sites.mk
+++ b/Mk/bsd.sites.mk
@@ -268,10 +268,10 @@ IGNORE?=	Using master as GH_TAGNAME is invalid. \
 .    if defined(GH_TUPLE)
 .      for _tuple in ${GH_TUPLE}
 _t_tmp=${_tuple}
-.        if ${_t_tmp:C@^([^:]*):([^:]*):([^:]*)((:[^:/]*)?)((/.*)?)@\4@:S/://:C/[a-zA-Z0-9_]//g}
+.        if ${_t_tmp:C@^([^:]*):([^:]*):([^:]*)((:[^:/]*)?)((/.*)?)@\4@:S/://:C/[a-zA-Z0-9_.+-]//g}
 check-makevars::
 	@${ECHO_MSG} "The ${_tuple} GH_TUPLE line has"
-	@${ECHO_MSG} "a tag containing something else than [a-zA-Z0-9_]"
+	@${ECHO_MSG} "a tag containing something else than [a-zA-Z0-9_.+-]"
 	@${FALSE}
 .        endif
 .      endfor
@@ -405,6 +405,11 @@ WWW?=	https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/
 .  endif # defined(USE_GITHUB)
 .endif # !defined(IGNORE_MASTER_SITE_GITHUB)
 
+# Keep this before USE_GITLAB
+.if !empty(MASTER_SITES:M*//*/*/*/-/archive/${DISTVERSIONFULL}/)
+DEV_WARNING+=	"MASTER_SITES contains ${MASTER_SITES:M*//*/*/*/-/archive/${DISTVERSIONFULL}/}, please use USE_GITLAB instead."
+.endif
+
 .if !defined(IGNORE_MASTER_SITE_GITLAB)
 #
 # In order to use GitLab your port must define USE_GITLAB and the following
@@ -419,34 +424,40 @@ WWW?=	https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/
 # GL_PROJECT    - name of the project on GitLab
 #                 default: ${PORTNAME}
 #
-# GL_COMMIT     - the commit hash of the repository, must be the full hash and
-#                 is a required variable for GitLab.
+# GL_TAGNAME    - name of the tag to download (2.0.1, hash, ...)
+#                 Using the name of a branch here is incorrect. It is
+#                 possible to do GL_TAGNAME= GIT_HASH to do a snapshot.
+#                 default: ${DISTVERSIONFULL}
 #
 # GL_SUBDIR     - directory relative to WRKSRC where to move this distfile's
 #                 content after extracting.
 #
-# GL_TUPLE      - above shortened to [site[:port][/webroot]:]account:project:commit:group[/subdir]
+# GL_TUPLE      - above shortened to [site[:port][/webroot]:]account:project:tagname:group[/subdir]
 #
 .  if defined(USE_GITLAB)
+.    if !defined(GL_TAGNAME) && defined(GL_COMMIT)
+GL_TAGNAME=	${GL_COMMIT}
+DEV_WARNING+=	"GL_COMMIT is deprecated, please use GL_TAGNAME instead"
+.    endif
 .    if defined(GL_TUPLE)
 .      for _tuple in ${GL_TUPLE}
-.        if ${_tuple:C@^(([^:]*://[^:/]*(:[0-9]{1,5})?(/[^:]*[^/])?:)?)([^:]*):([^:]*):([^:]*)(:[^:/]*)((/.*)?)@\7@:S/^://:C/[a-f0-9]{40}//g}
+.        if ${_tuple:C@^(([^:]*://[^:/]*(:[0-9]{1,5})?(/[^:]*[^/])?:)?)([^:]*):([^:]*):([^:]*)(:[^:/]*)((/.*)?)@\7@:S/^://:C/[a-zA-Z0-9_.+-]//g}
 check-makevars::
 	@${ECHO_MSG} "The ${_tuple}"
-	@${ECHO_MSG} "GL_TUPLE is improperly formatted or, the commit"
-	@${ECHO_MSG} "section contains something other than [a-f0-9]"
+	@${ECHO_MSG} "GL_TUPLE is improperly formatted or, the tagname"
+	@${ECHO_MSG} "section contains something other than [a-zA-Z0-9_.+-]"
 	@${FALSE}
 .        endif
 .      endfor
 GL_SITE+=	${GL_TUPLE:C@^(([^:]*://[^:/]*(:[0-9]{1,5})?(/[^:]*[^/])?:)?)([^:]*):([^:]*):([^:]*)(:[^:/]*)((/.*)?)@\1\8@:S@::@:@}
 GL_ACCOUNT+=	${GL_TUPLE:C@^(([^:]*://[^:/]*(:[0-9]{1,5})?(/[^:]*[^/])?:)?)([^:]*):([^:]*):([^:]*)(:[^:/]*)((/.*)?)@\5\8@}
 GL_PROJECT+=	${GL_TUPLE:C@^(([^:]*://[^:/]*(:[0-9]{1,5})?(/[^:]*[^/])?:)?)([^:]*):([^:]*):([^:]*)(:[^:/]*)((/.*)?)@\6\8@}
-GL_COMMIT+=	${GL_TUPLE:C@^(([^:]*://[^:/]*(:[0-9]{1,5})?(/[^:]*[^/])?:)?)([^:]*):([^:]*):([^:]*)(:[^:/]*)((/.*)?)@\7\8@}
+GL_TAGNAME+=	${GL_TUPLE:C@^(([^:]*://[^:/]*(:[0-9]{1,5})?(/[^:]*[^/])?:)?)([^:]*):([^:]*):([^:]*)(:[^:/]*)((/.*)?)@\7\8@}
 GL_SUBDIR+=	${GL_TUPLE:C@^(([^:]*://[^:/]*(:[0-9]{1,5})?(/[^:]*[^/])?:)?)([^:]*):([^:]*):([^:]*)(:[^:/]*)((/.*)?)@\9\8@:M/*:S/^\///}
 .    endif
 
 .    if empty(USE_GITLAB:Mnodefault)
-MASTER_SITES+=	${GL_SITE}/${GL_ACCOUNT}/${GL_PROJECT}/-/archive/${GL_COMMIT}.tar.gz?dummy=/
+MASTER_SITES+=	${GL_SITE}/${GL_ACCOUNT}/${GL_PROJECT}/-/archive/${GL_TAGNAME:C@^[a-f0-9]{40}$@\0.tar.gz?dummy=@}/
 .    endif
 GL_SITE_DEFAULT=	https://gitlab.com
 GL_SITE?=	${GL_SITE_DEFAULT}
@@ -454,8 +465,10 @@ GL_ACCOUNT_DEFAULT=	${PORTNAME}
 GL_ACCOUNT?=	${GL_ACCOUNT_DEFAULT}
 GL_PROJECT_DEFAULT=	${PORTNAME}
 GL_PROJECT?=	${GL_PROJECT_DEFAULT}
+GL_TAGNAME_DEFAULT=	${DISTVERSIONFULL}
+GL_TAGNAME?=	${GL_TAGNAME_DEFAULT}
 _GITLAB_GROUPS=	DEFAULT
-.    for _gl_v in GL_SITE GL_ACCOUNT GL_PROJECT GL_COMMIT GL_SUBDIR
+.    for _gl_v in GL_SITE GL_ACCOUNT GL_PROJECT GL_TAGNAME GL_SUBDIR
 .      for _v_ex in ${${_gl_v}}
 _GL_GROUPS=	${_v_ex:S/^${_v_ex:C@:[^/:]+$@@}//:S/^://}
 .        if !empty(_GL_GROUPS)
@@ -479,18 +492,24 @@ ${_gl_v}_DEFAULT=	${_v_ex:C@^(.*):[^/:]+$@\1@}
 GL_SITE:=	${GL_SITE_DEFAULT}
 GL_ACCOUNT:=	${GL_ACCOUNT_DEFAULT}
 GL_PROJECT:=	${GL_PROJECT_DEFAULT}
-GL_COMMIT:=	${GL_COMMIT_DEFAULT}
+GL_TAGNAME:=	${GL_TAGNAME_DEFAULT}
 GL_SUBDIR:=	${GL_SUBDIR_DEFAULT}
 
 _GITLAB_REV=	0
 
-_GITLAB_EXTRACT_SUFX=	.tar.gz
+_GITLAB_EXTRACT_SUFX=		.tar.gz
+_GITLAB_TAG_EXTRACT_SUFX=	.tar.bz2
 
 _GITLAB_CLONE_DIR?=	${WRKDIR}/git-clone
 _PORTS_DIRECTORIES+=	${_GITLAB_CLONE_DIR}
 .    if !${USE_GITLAB:Mnodefault}
-DISTNAME:=	${GL_ACCOUNT}-${GL_PROJECT}-${GL_COMMIT}_GL${_GITLAB_REV}
+.      if ${GL_TAGNAME:C/^[a-f0-9]{40}$//}
+DISTNAME:=	${GL_PROJECT}-${GL_TAGNAME}
+DISTFILES+=	${DISTNAME}${_GITLAB_TAG_EXTRACT_SUFX}
+.      else
+DISTNAME:=	${GL_ACCOUNT}-${GL_PROJECT}-${GL_TAGNAME}_GL${_GITLAB_REV}
 DISTFILES+=	${DISTNAME}${_GITLAB_EXTRACT_SUFX}
+.      endif
 git-clone: git-clone-DEFAULT
 git-clone-DEFAULT: ${_GITLAB_CLONE_DIR}
 	@git clone ${GL_SITE_DEFAULT}/${GL_ACCOUNT_DEFAULT}/${GL_PROJECT_DEFAULT}.git ${_GITLAB_CLONE_DIR}/${GL_PROJECT_DEFAULT}
@@ -512,12 +531,18 @@ GL_SITE_${_group}=	${GL_SITE_DEFAULT}
 GL_ACCOUNT_${_group}?=	${GL_ACCOUNT_DEFAULT}
 GL_PROJECT_${_group}?=	${GL_PROJECT_DEFAULT}
 
-_GL_TUPLE_OUT:=	${_GL_TUPLE_OUT} ${GL_SITE_${_group}}:${GL_ACCOUNT_${_group}}:${GL_PROJECT_${_group}}:${GL_COMMIT_${_group}}:${_group}/${GL_SUBDIR_${_group}}
-DISTNAME_${_group}:=	${GL_ACCOUNT_${_group}}-${GL_PROJECT_${_group}}-${GL_COMMIT_${_group}}_GL${_GITLAB_REV}
+_GL_TUPLE_OUT:=	${_GL_TUPLE_OUT} ${GL_SITE_${_group}}:${GL_ACCOUNT_${_group}}:${GL_PROJECT_${_group}}:${GL_TAGNAME_${_group}}:${_group}/${GL_SUBDIR_${_group}}
+.        if ${GL_TAGNAME_${_group}:C/^[a-f0-9]{40}$//}
+DISTNAME_${_group}:=	${GL_PROJECT_${_group}}-${GL_TAGNAME_${_group}}
+DISTFILE_${_group}:=	${DISTNAME_${_group}}${_GITLAB_TAG_EXTRACT_SUFX}
+MASTER_SITES:=	${MASTER_SITES} ${GL_SITE_${_group}}/${GL_ACCOUNT_${_group}}/${GL_PROJECT_${_group}}/-/archive/${GL_TAGNAME_${_group}}/:${_group}
+.        else
+DISTNAME_${_group}:=	${GL_ACCOUNT_${_group}}-${GL_PROJECT_${_group}}-${GL_TAGNAME_${_group}}_GL${_GITLAB_REV}
 DISTFILE_${_group}:=	${DISTNAME_${_group}}${_GITLAB_EXTRACT_SUFX}
+MASTER_SITES:=	${MASTER_SITES} ${GL_SITE_${_group}}/${GL_ACCOUNT_${_group}}/${GL_PROJECT_${_group}}/-/archive/${GL_TAGNAME_${_group}}.tar.gz?dummy=/:${_group}
+.        endif
 DISTFILES:=	${DISTFILES} ${DISTFILE_${_group}}:${_group}
-MASTER_SITES:=	${MASTER_SITES} ${GL_SITE_${_group}}/${GL_ACCOUNT_${_group}}/${GL_PROJECT_${_group}}/-/archive/${GL_COMMIT_${_group}}.tar.gz?dummy=/:${_group}
-WRKSRC_${_group}:=	${WRKDIR}/${GL_PROJECT_${_group}}-${GL_COMMIT_${_group}}
+WRKSRC_${_group}:=	${WRKDIR}/${GL_PROJECT_${_group}}-${GL_TAGNAME_${_group}}
 .        if !empty(GL_SUBDIR_${_group})
 _SITES_extract:=	${_SITES_extract} 690:post-extract-gl-${_group}
 post-extract-gl-${_group}: