Following on from last weekend’s work, today I’m learning more about git, and the difference between Plumbing and Porcelain commands.
The original intent was to use git tag -l freshports/$refname to detect if a tag exists. The problem there, it always returns 0.
[dan@mydev:/var/db/ingress/repos/ports] $ git tag -l | head 10-eol 4-eol 5-eol 6-eol 7-eol 8-eol 9-eol pkg-install-eol pre-xorg-7 release/10.0.0 [dan@mydev:/var/db/ingress/repos/ports] $ [dan@mydev:/var/db/ingress/repos/ports] $ git tag -l 10-eol 10-eol [dan@mydev:/var/db/ingress/repos/ports] $ echo $? 0 [dan@mydev:/var/db/ingress/repos/ports] $ git tag -l 10-eollkjadslkjdf [dan@mydev:/var/db/ingress/repos/ports] $ echo $? 0 [dan@mydev:/var/db/ingress/repos/ports] $ git tag -l | grep 10-eollkjadslkjdf [dan@mydev:/var/db/ingress/repos/ports] $
From the above, whether the tag exists or not, the code can’t tell, well, without looking at the output.
Let’s use this instead:
[dan@mydev:/var/db/ingress/repos/ports] $ git rev-parse --verify refs/tags/10-eol 1aa5d44ff272774be87b1afa6a71fa6cbd62c8af [dan@mydev:/var/db/ingress/repos/ports] $ echo $? 0 [dan@mydev:/var/db/ingress/repos/ports] $ git rev-parse --verify refs/tags/10-eollkjadslkjdf fatal: Needed a single revision [dan@mydev:/var/db/ingress/repos/ports] $ echo $ [dan@mydev:/var/db/ingress/repos/ports] $
We can also use the -q to suppress output.
Next goal
Let’s try this on the devgit.freshports.org server next.
This is the current code:
#!/bin/sh # process the new commits # based upon https://github.com/FreshPorts/git_proc_commit/issues/3 # An idea from https://github.com/sarcasticadmin if [ ! -f /usr/local/etc/freshports/config.sh ] then echo "/usr/local/etc/freshports/config.sh.sh not found by $0" exit 1 fi # this can be a space separated list of repositories to check # e.g. "doc ports src" repos=$1 . /usr/local/etc/freshports/config.sh LOGGERTAG='git-delta.sh' logfile "has started. Will check these repos: '${repos}'" # what remote are we using on this repo? REMOTE='origin' # where we do dump the XML files which we create? XML="${INGRESS_MSGDIR}/incoming" logfile "XML dir is $XML" for repo in ${repos} do logfile "Now processing repo: ${repo}" # convert the repo label to a physical directory on disk dir=$(convert_repo_label_to_directory ${repo}) # empty means error if [ "${dir}" == "" ]; then logfile "FATAL error, repo='${repo}' is unknown: cannot translate it to a directory name" continue fi # where is the repo directory? # This is the directory which contains the repos. REPODIR="${INGRESS_PORTS_DIR_BASE}/${dir}" LATEST_FILE="${INGRESS_PORTS_DIR_BASE}/latest.${dir}" if [ -d ${REPODIR} ]; then logfile "REPODIR='${REPODIR}' exists" else logfile "FATAL error, REPODIR='${REPODIR}' is not a directory" continue fi logfile "Repodir is $REPODIR" # on with the work cd ${REPODIR} # Bring local branch up-to-date with the local remote logfile "Running: ${GIT} fetch:" ${GIT} fetch logfile "Done." NAME_OF_HEAD="main" NAME_OF_REMOTE="origin" MAIN_BRANCH="$NAME_OF_REMOTE/$NAME_OF_HEAD" git for-each-ref --format '%(objecttype) %(refname)' \ | sed -n 's/^commit refs\/remotes\///p' \ | while read -r refname do echo looking at $refname # for now, when testing, only this branch please if [ "$refname" != "origin/2021Q2" ] && [ "$refname" != "$MAIN_BRANCH" ] then continue fi echo "working on '$refname'" if ! git rev-parse -q --verify freshports/$refname then if [ "$refname" == "$MAIN_BRANCH" ] then echo "FATAL - '$MAIN_BRANCH' must have tag 'freshports/$refname' set manually - special case the main branch because the best merge base is the most recent commit" exit fi echo "'git tag -l freshports/$refname'" found nothing echo "Let's find the first commit in this branch" first_ref=$(git merge-base $NAME_OF_REMOTE/$NAME_OF_HEAD $refname) echo "First ref is '$first_ref'" # get the first commit of that branch and create a tag. echo taging that now: git tag -m "first known commit of $refname" -f freshports/$refname $first_ref fi # get list of commits, if only to document them here logfile "Running: ${GIT} rev-list freshports/$refname..$refname" commits=$(${GIT} rev-list freshports/$refname..$refname) logfile "Done." if [ -z "$commits" ] then logfile "No commits were found" else logfile "The commits found are:" for commit in $commits do logfile "$commit" done fi logfile "${SCRIPTDIR}/git-to-freshports-xml.py --repo ${repo} --path ${REPODIR} ---commit-range ${xfreshports}/${refname}..$refname --spooling ${INGRESS_SPOOLINGDIR} --output ${XML}" ${SCRIPTDIR}/git-to-freshports-xml.py --repo ${repo} --path ${REPODIR} ---commit-range ${freshports/$refname}..$refname --spooling ${INGRESS_SPOOLINGDIR} --output ${XML} new_latest=$(${GIT} rev-parse HEAD) echo new_latest = $new_latest # echo $new_latest > ${LATEST_FILE} # Store the last known commit that we just processed. git tag -m "last known commit of $refname" -f freshports/$refname $refname done done logfile "Ending"