Skip to content

Instantly share code, notes, and snippets.

@tuaris
Last active December 28, 2020 02:12
Show Gist options
  • Save tuaris/428591f9a112116477b7bee601f36b50 to your computer and use it in GitHub Desktop.
Save tuaris/428591f9a112116477b7bee601f36b50 to your computer and use it in GitHub Desktop.
Extract Github Tupples from a composer.json using AWK
BEGIN {
current_dimension = 0
gh_tuple_len = 0
gl_tuple_len = 0
packages_len = 0
gitlab_sites["https://gitlab.com"] = 1
gitlab_sites["https://gitlab.freedesktop.org"] = 1
gitlab_sites["https://gitlab.gnome.org"] = 1
gitlab_sites["https://gitlab.redox-os.org"] = 1
}
# Logic to help navigate the JSON array
match($1, /\".+\":/) {
current_field = substr($1,RSTART + 1,RLENGTH - 3)
fields[current_dimension] = current_field
}
/\{/ {
current_dimension++
}
/\}/ {
current_dimension--
}
# Look for the fields we want
current_field == "name" && fields[current_dimension - 1] == "packages" {
package_name = $2
gsub(/"/, "", package_name)
gsub(",", "", package_name)
}
current_field == "version" && fields[current_dimension - 1] == "packages" {
package_version = $2
gsub(/"/, "", package_version)
gsub(",", "", package_version)
}
current_field == "reference" && fields[current_dimension - 1] == "source" && fields[current_dimension - 2] == "packages" {
package_reference = $2
gsub(/"/, "", package_reference)
gsub(",", "", package_reference)
}
current_field == "url" && fields[current_dimension - 1] == "source" && fields[current_dimension - 2] == "packages" {
package_source = $2
gsub(/"/, "", package_source)
gsub(",", "", package_source)
}
function split_url(s) {
# scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
split(s, url_scheme, "://")
url["scheme"] = url_scheme[1]
split(url_scheme[2], url_fragment, "#")
url["fragment"] = url_fragment[2]
split(url_fragment[1], url_query, "?")
url["query"] = url_query[2]
split(url_query[1], url_authority, "/")
url["path"] = substr(url_query[1], length(url_authority[1]) + 1)
split(url_authority[1], url_auth, "@")
if (length(url_auth) == 2) {
split(url_auth[1], url_user, ":")
url["user"] = url_user[1]
url["password"] = url_user[2]
split(url_auth[2], url_host, ":")
} else {
url["user"] = ""
url["password"] = ""
split(url_auth[1], url_host, ":")
}
url["host"] = url_host[1]
url["port"] = url_host[2]
}
function print_array(start, arr, arrlen) {
end = " \\\n"
for (i = 0; i < arrlen; i++) {
if (i == arrlen - 1) {
end = "\n"
}
printf "%s\t%s%s", start, arr[i], end
start = "\t"
}
}
function record_added_package() {
package_added[package_name] = 1
package_name = ""
package_version = ""
package_source = ""
package_reference = ""
}
!package_added[package_name] && package_source && package_reference && package_name {
split_url(package_source)
split(url["path"], path, "/")
account = path[2]
project = path[3]
gsub("\.git$", "", project)
tag = package_reference;
added = 0
if (url["host"] == "github.com") {
added = 1
gh_tuple[gh_tuple_len++] = sprintf(\
"%s:%s:%s:%s", account, project, tag, package_name)
} else {
repo_site = sprintf("%s://%s", url["scheme"], url["host"])
for (site in gitlab_sites) {
if (repo_site != site) {
continue
}
if (ENVIRON["GL_SITE"] == site) {
gl_tuple[gl_tuple_len++] = sprintf(\
"%s:%s:%s:%s", account, project, tag, package_name)
} else {
gl_tuple[gl_tuple_len++] = sprintf(\
"%s:%s:%s:%s:%s", site, account, project, tag, package_name)
}
added = 1
break
}
}
if (!added) {
printf "Warning: Ignoring git source on line %d: %s\n", NR, package_source > "/dev/stderr"
}
record_added_package()
}
END {
if (gh_tuple_len > 0 && ENVIRON["USE_GITHUB"] == "") {
printf "USE_GITHUB=\tnodefault\n"
}
print_array("GH_TUPLE=", gh_tuple, gh_tuple_len)
if (gl_tuple_len > 0 && ENVIRON["USE_GITLAB"] == "") {
printf "USE_GITLAB=\tnodefault\n"
}
print_array("GL_TUPLE=", gl_tuple, gl_tuple_len)
if (gh_tuple_len > 0) {
printf "COMPOSER_USE_GITHUB=\tyes\n"
}
if (gl_tuple_len > 0) {
printf "COMPOSER_USE_GITLAB=\tyes\n"
}
}
@tuaris
Copy link
Author

tuaris commented Dec 28, 2020

New revision is much more polished and easier to follow.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment