RepoPilotOpen in app →

Masterminds/glide

Package Management for Golang

Mixed

Stale — last commit 2y ago

weakest axis
Use as dependencyConcerns

non-standard license (Other); last commit was 2y ago

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • 26+ active contributors
  • Other licensed
  • CI configured
Show all 7 evidence items →
  • Tests present
  • Stale — last commit 2y ago
  • Concentrated ownership — top contributor handles 67% of recent commits
  • Non-standard license (Other) — review terms
What would change the summary?
  • Use as dependency ConcernsMixed if: clarify license terms

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/masterminds/glide?axis=fork)](https://repopilot.app/r/masterminds/glide)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/masterminds/glide on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: Masterminds/glide

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/Masterminds/glide shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

WAIT — Stale — last commit 2y ago

  • 26+ active contributors
  • Other licensed
  • CI configured
  • Tests present
  • ⚠ Stale — last commit 2y ago
  • ⚠ Concentrated ownership — top contributor handles 67% of recent commits
  • ⚠ Non-standard license (Other) — review terms

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live Masterminds/glide repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/Masterminds/glide.

What it runs against: a local clone of Masterminds/glide — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in Masterminds/glide | Confirms the artifact applies here, not a fork | | 2 | License is still Other | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 684 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>Masterminds/glide</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Masterminds/glide. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/Masterminds/glide.git
#   cd glide
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of Masterminds/glide and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Masterminds/glide(\\.git)?\\b" \\
  && ok "origin remote is Masterminds/glide" \\
  || miss "origin remote is not Masterminds/glide (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(Other)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"Other\"" package.json 2>/dev/null) \\
  && ok "license is Other" \\
  || miss "license drift — was Other at generation time"

# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 4. Critical files exist
test -f "glide.go" \\
  && ok "glide.go" \\
  || miss "missing critical file: glide.go"
test -f "cfg/config.go" \\
  && ok "cfg/config.go" \\
  || miss "missing critical file: cfg/config.go"
test -f "repo/installer.go" \\
  && ok "repo/installer.go" \\
  || miss "missing critical file: repo/installer.go"
test -f "dependency/resolver.go" \\
  && ok "dependency/resolver.go" \\
  || miss "missing critical file: dependency/resolver.go"
test -f "action/install.go" \\
  && ok "action/install.go" \\
  || miss "missing critical file: action/install.go"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 684 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~654d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/Masterminds/glide"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

Glide is a vendor package manager for Go that manages the vendor directory introduced in Go 1.5, allowing projects to declare and lock dependency versions in a glide.yaml file. It scans source code to identify dependencies, resolves transitive dependencies, and vendors packages with semantic version constraint support—functioning as Go's equivalent to npm, Cargo, or Bundler. action/ package contains all CLI commands (install, ensure, get, update, import_*, etc.) with corresponding tests; cfg/ handles glide.yaml parsing and lockfile management (lock.go); dependency/resolver.go handles transitive dependency resolution; cache/ provides repository and memory caching; entry point likely in main.go at root.

👥Who it's for

Go developers building applications or libraries who need reproducible dependency management with version pinning, before Go Modules became the standard. Teams migrating from tools like godep, gpm, or gb to a modern vendor-based approach.

🌱Maturity & risk

Mature but deprecated: the README explicitly states 'The Go community is now using Go Modules to handle dependencies. Glide is now mostly unmaintained.' Has CI/CD (Travis, AppVeyor), comprehensive test coverage across action/*_test.go files, and 280K+ lines of Go code, but development activity appears stalled in favor of Go's native module system.

High risk for new projects: Go Modules have replaced Glide as the ecosystem standard, so this is legacy tooling. Single-maintainer appearance (mattfarina) visible in AppVeyor config. No recent commits visible in provided metadata. Dependency resolver complexity in dependency/resolver.go and cache mechanisms could mask subtle version conflict bugs.

Active areas of work

No active development—README states the project is 'mostly unmaintained' and users are directed to Go Modules. Historical issue: repository contains importers for godep, gpm, gom, and gb (action/import_*.go), suggesting past focus on migration tooling.

🚀Get running

git clone https://github.com/Masterminds/glide.git
cd glide
make build
./glide --version

Build uses Makefile (1878 lines); Makefile targets visible but exact build target inferred from Go project conventions.

Daily commands:

make build
./glide install          # Install dependencies from glide.yaml
./glide update           # Update dependencies
./glide get github.com/user/package@v1.0.0  # Add a dependency

Expect output in vendor/ directory and glide.lock lock file creation.

🗺️Map of the codebase

  • glide.go — Main entry point and orchestrator for the Glide package manager, coordinates all high-level operations.
  • cfg/config.go — Core configuration parser for glide.yaml and glide.lock files; all dependency resolution depends on this.
  • repo/installer.go — Handles VCS repository cloning and vendoring logic; critical for actually fetching and installing dependencies.
  • dependency/resolver.go — Resolves transitive dependencies and manages version constraints; heart of dependency graph logic.
  • action/install.go — Primary user-facing install command that orchestrates configuration loading, dependency resolution, and installation.
  • repo/vcs.go — VCS abstraction layer supporting Git, Mercurial, Bazaar, and Subversion; enables multi-backend repository management.
  • cache/cache.go — Caching layer for installed repositories to avoid redundant downloads and improve performance.

🛠️How to make changes

Add a new CLI command

  1. Create action file in action/ directory (e.g., action/mycommand.go) implementing command logic (action/mycommand.go)
  2. Register command in main glide.go by adding it to the CLI router (glide.go)
  3. Add corresponding test file following naming convention (action/mycommand_test.go)
  4. Document command usage in docs/commands.md (docs/commands.md)

Add support for a new VCS backend

  1. Extend the VCS interface in repo/vcs.go to support the new version control system (repo/vcs.go)
  2. Implement new VCS type struct with required methods (Clone, Fetch, UpdateVersion, etc.) (repo/vcs.go)
  3. Add detection logic in VCS factory to recognize repository URLs for the new system (repo/vcs.go)
  4. Write comprehensive tests for clone and version setting operations (repo/repo_test.go)

Add a package manager importer

  1. Create importer file in matching package directory (e.g., npm/npm.go) with manifest parser (npm/npm.go)
  2. Implement importer.Importer interface with ConvertFile() and Convert() methods (importer/importer.go)
  3. Add importer call in action/config_wizard.go to enable interactive import (action/config_wizard.go)
  4. Create test fixtures and validation tests for format parsing (npm/npm_test.go)

Add a new configuration constraint type

  1. Define new constraint struct and marshaling logic in cfg/config.go (cfg/config.go)
  2. Implement constraint matching logic in repo/semver.go for version resolution (repo/semver.go)
  3. Update dependency resolver to handle the new constraint during resolution (dependency/resolver.go)
  4. Add test cases for constraint parsing and version matching (cfg/config_test.go)

🔧Why these technologies

  • Go 1.5+ vendor directory — Native Go vendoring mechanism; eliminates GOPATH conflicts and enables reproducible builds by storing dependencies alongside source code
  • YAML configuration (glide.yaml/glide.lock) — Human-readable format that parallels other package managers (Bundler, Composer); supports semantic versioning and flexible constraint syntax
  • Multiple VCS backends (Git, Hg, Bzr, Svn) — Go ecosystem spans multiple version control systems; unified abstraction avoids lock-in to single VCS
  • Lock file pinning (glide.lock) — Ensures reproducible builds across environments by capturing exact resolved versions and transitive dependencies
  • Import scanning of source code — Automatically detects Go package imports for graph building; reduces manual configuration and catches missing dependencies

⚖️Trade-offs already made

  • Cache repository clones locally instead of always fetching from remote

    • Why: Improves performance for repeated installs and enables offline operation
    • Consequence: Requires cache invalidation strategy; stale cached repos may not reflect upstream changes; adds disk I/O and storage overhead
  • Separate glide.yaml (manifest) and glide.lock (lockfile) instead of single file

    • Why: Manifest specifies constraints; lockfile pins exact versions—enables both flexibility and reproducibility
    • Consequence: More files to maintain; potential sync issues if not both committed; glide.lock must be regenerated when manifest changes
  • Scan Go source code for imports as fallback to explicit manifests

    • Why: Reduces boilerplate and catches undeclared dependencies automatically
    • Consequence: Scan is slower than static manifest; may incorrectly flag conditional imports; requires careful filtering of non-dependencies
  • Support importing from 5+ other package managers (Godep, gb, gom, gpm)

    • Why: Eases migration from fragmented ecosystem; captures user investment in existing tools
    • Consequence: Maintenance burden for multiple parsers; each importer must handle format quirks and evolve with upstream tools

🚫Non-goals (don't propose these)

  • Does not manage non-Go dependencies (C libraries, system packages, etc.)
  • Does not provide binary distribution or compiled artifacts—only manages source code dependencies
  • Does not replace GOPATH or avoid standard Go toolchain; operates within Go's native vendoring model
  • Does not enforce semantic versioning on upstream repositories—only resolves against versions authors declare
  • Does not support transitive constraint negotiation (no lockfile versioning per consumer like npm peer dependencies)
  • Does not handle Go module (go.mod) files—predates Go

🪤Traps & gotchas

Glide expects a glide.yaml file in project root; absent file requires glide init first. Version constraint parsing delegates to github.com/Masterminds/semver, so constraint syntax must follow that library's rules exactly. Cache directory location (cache/global_lock.go) may require write permissions to GOPATH or configured cache dir. VCS tools (git, hg, bzr, svn) must be installed and on PATH; missing tools will cause silent fetch failures. Transitive dependency conflict resolution via flattening is non-deterministic if semver constraints conflict—user must manually edit glide.yaml.

🏗️Architecture

💡Concepts to learn

  • Transitive dependency resolution — Glide's core job is discovering not just direct imports but all recursive dependencies; understanding how dependency/resolver.go flattens dependency trees prevents version conflicts
  • Semantic versioning constraints — Glide uses SemVer 2.0.0 constraint syntax (e.g., ^1.2.3, ~1.2) to specify version ranges; reading glide.yaml examples requires understanding these patterns
  • Vendor directory and Go 1.5 vendoring — Glide's entire purpose is managing the vendor/ directory that Go 1.5 introduced; this is the mechanism that makes Glide relevant
  • Repository caching and global locks — Files like cache/global_lock.go and cache/cache.go implement lock-free concurrent access to a shared cache; crucial for performance with many parallel dependency fetches
  • VCS abstraction layer — Glide abstracts git, hg, bzr, and svn behind a common interface; understanding this pattern explains how one tool supports multiple version control systems
  • Import path scanning — Glide uses dependency/scan.go to parse Go source files and extract import statements to detect dependencies; this static analysis determines what must be fetched
  • Lockfile pinning — The glide.lock file created by cfg/lock.go pins exact resolved versions, enabling reproducible builds across machines; critical for CI/CD reliability
  • golang/go — Go Modules (integrated in Go 1.11+) is the official successor to Glide; understanding go.mod and go.sum is necessary context
  • Masterminds/semver — Glide depends on this for semantic version constraint parsing and satisfaction checking
  • tools/godep — Predecessor vendor tool that Glide can import from; Glide was a modernization of the godep workflow
  • Masterminds/vcs — Companion library (likely) providing VCS abstraction for git, hg, bzr, svn operations that Glide uses for fetching
  • golang/dep — Contemporary Go dependency manager (2016-2019) that competed with Glide before Go Modules standardization

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add comprehensive unit tests for dependency/resolver.go

The dependency resolver is a critical component for package management, but resolver_test.go appears minimal based on the file structure. This is core logic that handles dependency resolution - a critical feature for a package manager. Adding thorough test coverage for edge cases (circular dependencies, version conflicts, missing transitive dependencies) would improve reliability and prevent regressions.

  • [ ] Review existing dependency/resolver_test.go to identify gaps in test coverage
  • [ ] Add test cases for circular dependency detection and handling
  • [ ] Add test cases for version constraint resolution and conflicts
  • [ ] Add test cases for transitive dependency resolution
  • [ ] Add test cases for missing or unavailable packages
  • [ ] Run coverage tool and aim for >90% code coverage on resolver.go

Add unit tests for cfg/lock.go lock file parsing and generation

The glide.lock file is critical for reproducible builds (mentioned in docs/glide.lock.md). While lock_test.go exists, the lock file format handling deserves thorough testing given its importance. Missing tests could lead to lock file corruption or parsing errors that break builds for end users.

  • [ ] Review cfg/lock_test.go for existing coverage
  • [ ] Add test cases for parsing malformed lock files
  • [ ] Add test cases for round-trip consistency (parse → generate → parse)
  • [ ] Add test cases for version string edge cases and different version formats
  • [ ] Add test cases for lock file migration/upgrade scenarios
  • [ ] Add test cases for concurrent lock file access (race conditions)

Migrate from Travis CI to GitHub Actions and modernize CI/CD configuration

The repo uses .travis.yml and appveyor.yml, which are older CI systems. GitHub Actions is now the modern standard for GitHub repos and provides better integration, free runners, and improved maintainability. This would modernize the project's infrastructure and make it easier for new contributors to understand the build process.

  • [ ] Create .github/workflows/test.yml with matrix testing for multiple Go versions
  • [ ] Create .github/workflows/lint.yml using golangci-lint for code quality checks
  • [ ] Ensure workflow tests both Linux and Windows environments (replace appveyor.yml functionality)
  • [ ] Add workflow step to build the glide binary and verify it runs
  • [ ] Document the migration in CONTRIBUTING.md (create if needed)
  • [ ] Verify all existing Travis/AppVeyor checks pass in new Actions workflow before deprecating old configs

🌿Good first issues

  • Add integration tests for action/import_gpm.go and action/import_gom.go (only import_godep and import_gb have test coverage visible); create test YAML fixtures and test cases in *_test.go files
  • Expand dependency/resolver_test.go to cover edge cases in transitive dependency flattening (e.g., diamond dependencies with conflicting version constraints); add specific test case for the scenario described in CHANGELOG.md
  • Document the plugin system referenced in action/plugin.go and docs/plugins.md with a runnable example in glide-plugin-example/ directory including Go source and corresponding test

Top contributors

Click to expand
  • @mattfarina — 67 commits
  • @sdboyer — 5 commits
  • @cristiangreco — 4 commits
  • [@Anthony Heidenreich](https://github.com/Anthony Heidenreich) — 2 commits
  • [@Kunc, Martin](https://github.com/Kunc, Martin) — 1 commits

📝Recent commits

Click to expand
  • b94b39d — Updating to new dev version (mattfarina)
  • 8ed5b92 — Updating the changelog for 0.13.3 (mattfarina)
  • c64b145 — Updating the readme to note go modules (mattfarina)
  • 2e2f7cc — Adding testing via travis for Go 1.12 (mattfarina)
  • f55c156 — Merge pull request #1060 from Masterminds/update-deps2 (mattfarina)
  • 71ee98d — Merge pull request #1033 from databus23/fix-segfault (mattfarina)
  • 5601f48 — Merge pull request #1056 from martinkunc/added-std-lib-package-crypto-ed25519 (mattfarina)
  • 641fa7a — Updating dependencies to pull in bug fixes (mattfarina)
  • 4aad4fd — crypto ed25519 added to stdlib in go1.13 (Kunc, Martin)
  • ec376ea — Fix segfault when stripping Godep workspace (databus23)

🔒Security observations

Glide is a Go package manager with a generally sound architecture. The main security concerns are: (1) insufficient validation of external repository sources with no apparent cryptographic verification, (2) potential command injection risks in plugin execution, (3) path traversal vulnerabilities in vendor directory management, and (4) lack of signed releases. The codebase lacks evidence of input sanitization for user-controlled data that could be passed to external commands or used in file path construction. Recommendations include implementing package verification, hardening command execution, validating all path operations, and establishing signed release practices.

  • Medium · Potential Command Injection in Plugin Execution — action/plugin.go. The action/plugin.go file likely executes external plugins without sufficient input validation. Package managers that execute external code are high-risk vectors for command injection attacks if user-controlled input is not properly sanitized. Fix: Implement strict input validation and sanitization for all user-provided arguments before passing them to shell commands. Use safe execution methods (e.g., exec.Command with argument arrays rather than string concatenation). Consider using a whitelist of allowed plugin names.
  • Medium · Insufficient Validation of External Repository Sources — dependency/resolver.go, action/get.go, dependency/scan.go. The dependency resolver and import mechanisms (action/get.go, dependency/resolver.go, dependency/scan.go) fetch and process dependencies from external repositories without evidence of cryptographic verification. This could allow man-in-the-middle attacks or malicious package substitution. Fix: Implement checksum verification for downloaded packages. Use HTTPS for all remote repository connections. Consider implementing a package registry verification mechanism or support for signed packages.
  • Medium · Potential Path Traversal in Vendor Management — path/path.go, path/strip.go. The vendor directory manipulation and path handling code (path/path.go, path/strip.go) could be vulnerable to path traversal attacks if symbolic links or relative path components are not properly validated when constructing file paths. Fix: Validate all path components to prevent traversal attacks. Use filepath.Clean() and filepath.EvalSymlinks() to canonicalize paths. Implement a whitelist of allowed directories and reject any paths that escape the vendor directory.
  • Low · No Evidence of Signed Releases or Integrity Verification — Repository root, .travis.yml, appveyor.yml. The repository structure does not show evidence of GPG signing, release signatures, or integrity verification mechanisms for distributed binaries. Users cannot verify the authenticity of downloaded glide binaries. Fix: Implement signed releases using GPG. Publish checksums and signatures for all released binaries. Document the verification process for users. Consider using checksums in CI/CD pipelines.
  • Low · Potential Information Disclosure in Debug Output — action/debug.go. The action/debug.go file may output sensitive information about the system environment, paths, or configuration that could be useful to attackers performing reconnaissance. Fix: Review all debug output to ensure no sensitive information is exposed. Implement a configurable verbosity level that restricts debug output by default. Document what information is included in debug mode.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · Masterminds/glide — RepoPilot