Merge pull request #96 from entireio/feat/remote-helper-transport · Entire

Merge pull request #96 from entireio/feat/remote-helper-transport

08dcc31→main·

Soph·3w ago·6 files·+755 added/-0 removed

Support git remote-helper schemes (entire://) as a transport

Changes

6

136 unmodified lines

```ssh://`, SCP-style `git@host:path.git`, and `git+ssh://` URLs. See
[docs/usage.md](docs/usage.md) for details and current caveats.

### What about other URL schemes (e.g. `entire://`)?

For any scheme it has no native transport for, `git-sync` falls back to a git
remote helper named `git-remote-<scheme>` on `PATH`, exactly as `git` does. With
`git-remote-entire` installed, `entire://` URLs work for both fetch and push and
authenticate through the helper. See
[Remote-helper schemes](docs/usage.md#remote-helper-schemes).

### Does it run as a daemon or watch for changes?

No. `git-sync` is a one-shot CLI/library operation. To sync on a schedule or in
response to events, run it from cron, CI, a worker, or another service.

Sync Behavior

sync picks the bootstrap relay path automatically when the target is empty. For non-empty targets, safe fast-forward updates also use a relay path that streams the source pack directly into target receive-pack without local materialization. Anything not relay-eligible (force, prune, deletes, tag retargets) falls back to a materialized path bounded by --materialized-max-objects.

package gitproto

import (
    "bufio"
    "bytes"
    "context"
    "errors"
    "fmt"
    "io"
    "net/url"
    "os"
    "os/exec"
    "slices"
    "strings"
    "sync"
)

// RemoteHelperLookPath resolves the git remote-helper binary for a URL scheme,
// following git's `git-remote-<scheme>` naming convention. Replaceable in
// tests; production wiring just calls exec.LookPath.
var RemoteHelperLookPath = func(scheme string) (string, bool) {
    path, err := exec.LookPath("git-remote-" + scheme)
    if err != nil {
        return "", false
    }
    return path, true
}

// LookupRemoteHelper reports whether a git remote helper is installed for the
// given URL scheme (e.g. "entire" → git-remote-entire). Schemes git-sync
// speaks natively (http/https/ssh) should never be routed here — git ships
// git-remote-http(s), and diverting to it would bypass the optimized native
// transport.
func LookupRemoteHelper(scheme string) (string, bool) {
    if scheme == "" {
        return "", false
    }
    return RemoteHelperLookPath(scheme)
}

// ... additional code and definitions follow ...