{"id":50237834,"url":"https://github.com/mdsumner/gdalcheck","last_synced_at":"2026-05-26T20:33:11.522Z","repository":{"id":334475471,"uuid":"1141521342","full_name":"mdsumner/gdalcheck","owner":"mdsumner","description":"Reverse dependency checking for R packages against GDAL","archived":false,"fork":false,"pushed_at":"2026-05-11T07:11:00.000Z","size":833,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-11T09:22:51.087Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mdsumner.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-25T00:51:09.000Z","updated_at":"2026-05-11T07:11:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mdsumner/gdalcheck","commit_stats":null,"previous_names":["mdsumner/gdalcheck"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mdsumner/gdalcheck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdsumner%2Fgdalcheck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdsumner%2Fgdalcheck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdsumner%2Fgdalcheck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdsumner%2Fgdalcheck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mdsumner","download_url":"https://codeload.github.com/mdsumner/gdalcheck/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdsumner%2Fgdalcheck/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33538659,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"ssl_error","status_checked_at":"2026-05-26T15:22:15.568Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-26T20:33:09.874Z","updated_at":"2026-05-26T20:33:11.510Z","avatar_url":"https://github.com/mdsumner.png","language":"R","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gdalcheck\n\nReverse dependency checking for R packages against bleeding-edge GDAL.\n\n## What it does\n\n1. **Binary cache image** - Pre-compiles ~2200 R packages against `ghcr.io/hypertidy/gdal-r-full:latest`\n2. **CLI tools** - Simple `docker run` commands to check any package\n3. **Parallel checking** - Test ~1000 reverse dependencies of GDAL-linked packages\n4. **Dashboard** - Results published to GitHub Pages\n\n## Quick start\n\n```bash\n# Check a package\ndocker run --rm ghcr.io/mdsumner/gdalcheck/gdalcheck:latest \\\n  /usr/local/bin/check_one.sh sf /tmp\n\n# Check multiple packages\ndocker run --rm -v $(pwd)/results:/results \\\n  ghcr.io/mdsumner/gdalcheck/gdalcheck:latest \\\n  gdalcheck-pkg sf,terra,stars\n\n# Image status\ndocker run --rm ghcr.io/mdsumner/gdalcheck/gdalcheck:latest gdalcheck-status\n```\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│ Local machine (initial build)                                   │\n│  └─ build_local.sh → builds ~2200 packages in ~90 mins          │\n│  └─ Pushes image to GHCR                                        │\n└─────────────────────────────────────────────────────────────────┘\n                            │\n                            ▼\n┌─────────────────────────────────────────────────────────────────┐\n│ GitHub                                                          │\n│  ├─ GHCR: ghcr.io/mdsumner/gdalcheck/gdalcheck (~13GB)          │\n│  ├─ Daily: check CRAN for updates (triggers incremental rebuild)│\n│  └─ Pages: hosts dashboard                                      │\n└─────────────────────────────────────────────────────────────────┘\n                            │\n                            ▼\n┌─────────────────────────────────────────────────────────────────┐\n│ Runner (OpenStack / HPC / Local)                                │\n│  └─ Pulls image, runs checks via CLI                            │\n│  └─ Pushes JSON results → triggers dashboard rebuild            │\n└─────────────────────────────────────────────────────────────────┘\n```\n\n## Seed packages\n\nReverse dependencies of these packages are tested:\n\n* `gdalcubes`\n* `gdalraster`\n* `mapview`\n* `raster`\n* `sf`\n* `stars`\n* `terra`\n* `tmap`\n* `vapour`\n* `wk`\n\nEdit `config/seed_packages.txt` to modify.\n\n## CLI Tools\n\nThe image includes these commands:\n\n| Command | Description |\n|---------|-------------|\n| `gdalcheck-status` | Show image build info, installed packages, versions |\n| `gdalcheck-pkg \u003cpkg\u003e[,pkg,...]` | Run R CMD check on one or more packages |\n| `check_one.sh \u003cpkg\u003e \u003cresults_dir\u003e` | Low-level single package check |\n\n### Examples\n\n```bash\n# Quick status\ndocker run --rm ghcr.io/mdsumner/gdalcheck/gdalcheck:latest gdalcheck-status\n\n# Check sf with results saved locally\ndocker run --rm -v $(pwd)/results:/results \\\n  ghcr.io/mdsumner/gdalcheck/gdalcheck:latest \\\n  gdalcheck-pkg sf\n\n# Check multiple packages with parallel make\ndocker run --rm -v $(pwd)/results:/results \\\n  -e MAKEFLAGS=-j4 \\\n  ghcr.io/mdsumner/gdalcheck/gdalcheck:latest \\\n  gdalcheck-pkg sf,terra,stars,gdalraster\n\n# Interactive debugging\ndocker run --rm -it ghcr.io/mdsumner/gdalcheck/gdalcheck:latest R\n```\n\n## Running full test suite\n\n### Option 1: Local (parallel with GNU parallel)\n\n```bash\ndocker pull ghcr.io/mdsumner/gdalcheck/gdalcheck:latest\n\n# Get test manifest\ndocker run --rm ghcr.io/mdsumner/gdalcheck/gdalcheck:latest \\\n  cat /opt/test_manifest.csv | tail -n +2 | cut -d, -f1 \u003e packages.txt\n\n# Run in parallel (8 at a time)\nmkdir -p results\ncat packages.txt | parallel -j8 \\\n  'docker run --rm -v $(pwd)/results:/results \\\n    ghcr.io/mdsumner/gdalcheck/gdalcheck:latest \\\n    gdalcheck-pkg {}'\n```\n\n### Option 2: HPC/SLURM\n\n```bash\n#!/bin/bash\n#SBATCH --array=1-1086%50\n#SBATCH --time=00:30:00\n#SBATCH --mem=4G\n\nPKG=$(sed -n \"${SLURM_ARRAY_TASK_ID}p\" packages.txt)\nsingularity exec docker://ghcr.io/mdsumner/gdalcheck/gdalcheck:latest \\\n  gdalcheck-pkg \"$PKG\"\n```\n\n### Option 3: OpenStack runner (polling)\n\n```bash\n# One-time setup\ncurl -sL https://raw.githubusercontent.com/mdsumner/gdalcheck/main/scripts/setup_runner.sh | bash\n\n# Configure git credentials, then add cron:\ncrontab -e\n# */15 * * * * /home/$USER/gdalcheck-runner/poll_and_run.sh\n```\n\n## Building the image locally\n\nFor initial builds or major updates (GHA runners don't have enough disk space):\n\n```bash\n# Clone repo\ngit clone https://github.com/mdsumner/gdalcheck.git\ncd gdalcheck\n\n# Build with local resources (adjust -j and Ncpus for your machine)\n# Usage: ./build_local.sh [MAKEFLAGS_J] [NCPUS]\n./build_local.sh 4 8   # -j4 per package, 8 packages in parallel\n\n# Watch progress\ntail -f build_*.log\n\n# When done, build final image\n./scripts/generate_dockerfile.sh cache-out docker/Dockerfile.cached\ndocker build -t gdalcheck \\\n  --build-arg BASE_IMAGE=ghcr.io/hypertidy/gdal-r-full:latest \\\n  -f docker/Dockerfile.cached .\n\n# Test\ndocker run --rm gdalcheck gdalcheck-status\n\n# Push to GHCR\necho $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin\ndocker tag gdalcheck ghcr.io/mdsumner/gdalcheck/gdalcheck:latest\ndocker push ghcr.io/mdsumner/gdalcheck/gdalcheck:latest\n```\n\n## Image contents\n\n| Item | Description |\n|------|-------------|\n| Base | `ghcr.io/hypertidy/gdal-r-full:latest` (GDAL/PROJ/GEOS from source, R, core geo packages) |\n| Packages | ~2200 R packages pre-compiled against bleeding-edge GDAL |\n| Test manifest | ~1086 packages (reverse deps of seeds) |\n| Size | ~13GB |\n\n## Dashboard\n\nView results at: https://mdsumner.github.io/gdalcheck/\n\n## Output format\n\nCheck results are JSON for easy parsing:\n\n```json\n{\n  \"package\": \"sf\",\n  \"version\": \"1.0-15\",\n  \"status\": \"OK\",\n  \"errors\": 0,\n  \"warnings\": 2,\n  \"notes\": 1,\n  \"check_time_secs\": 45,\n  \"gdal_version\": \"3.12.0\",\n  \"timestamp\": \"2026-04-04T12:00:00Z\"\n}\n```\n\nPipe to `jq` for quick summaries:\n\n```bash\n# All results\ncat results/*.json | jq -s '[.[] | {pkg: .package, status: .status}]'\n\n# Failures only\ncat results/*.json | jq -s '[.[] | select(.status != \"OK\")]'\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmdsumner%2Fgdalcheck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmdsumner%2Fgdalcheck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmdsumner%2Fgdalcheck/lists"}