JSPM

git-fetch-pack

0.1.1
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 49463
  • Score
    100M100P100Q153839F
  • License MIT

git's smart fetch-pack protocol

Package Exports

  • git-fetch-pack

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (git-fetch-pack) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

git-fetch-pack

git's smart fetch pack protocol (the one that calls upload-pack on the server).

can be used to download packfiles (fetch or clone!) or to list remote branches.

var net = require('net')
  , fs = require('fs')

var gitclient = require('git-fetch-pack')()
  , transport = require('git-transport-protocol')
  , load = require('git-fs-repo')
  , walk = require('git-walk-refs')

load('/path/to/repo/.git', function(err, git) {
  var refs = git.refs()
    , hashes = refs.map(function(x) { return x.hash })
    , tcp = net.connect({host: 'github.com', port: 9418})
    , client

  // given a want(ref, ready) function and a stream
  // of all of the commits the repo has in reverse
  // chronological order, we can negotiate a sweet
  // packfile from the remote!
  function want(ref, ready) {
    if(ref.name === 'refs/heads/master') {
      return ready(true)
    }
    return ready(false)
  }
  client = gitclient(
      'git://github.com/chrisdickinson/plate.git'
    , want
    , walk(git.find, hashes)
  )
 
  // output ref data from the remote server! `refs`
  // is a readable stream. 
  client.refs.on('data', console.log)

  // pipe client to the transport and back to client.
  client
    .pipe(transport(tcp))
    .pipe(client)

  // when we get packfile data, it'll come out of this
  // readable stream.
  client.pack.pipe(fs.createWriteStream('client-output'))
})

API

client(hostinfo[, want_function][, have_stream][, capabilities]) -> client duplex stream

create a client for communicating with hostinfo that uses want_function to determine which branches to ask for, and can provide a list of already-present commits using have_stream.

by providing the want_function argument (which takes a ref object and a ready callback) but no others, you may emulate a git clone.

by additionally providing a have_stream (usually using git-walk-refs), you can emulate a git fetch.

by providing capabilities, you enable the ability to blow your foot off, mostly; since by default this module does not support either side-band protocol.

Ref objects

{ "hash": "git hash"
, "name": "refs/heads/master" // for example
, "commit": null | "hash" }   // for annotated tags

want_function

function want(ref, ready) {
  // do you want this ref object?
  ready(true) // sure do
  ready() || ready(false) || ready('') // sure don't.
}

stream.pack

A readable stream of packfile data.

stream.refs

A readable stream of remote references.

License

MIT