Skip to content

Commit

Permalink
Add basic server side implementation of 'git-upload-archive'.
Browse files Browse the repository at this point in the history
  • Loading branch information
jelmer committed Nov 14, 2018
1 parent 1ee0325 commit d0f921e
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 4 deletions.
3 changes: 3 additions & 0 deletions NEWS
Expand Up @@ -6,6 +6,9 @@
* Preserve port and username in parsed HTTP URLs.
(Jelmer Vernooij)

* Add basic server side implementation of ``git-upload-archivw``.
(Jelmer Vernooij)

0.19.7 2018-11-05

CHANGES
Expand Down
39 changes: 35 additions & 4 deletions dulwich/server.py
Expand Up @@ -46,13 +46,15 @@
import os
import socket
import sys
import time
import zlib

try:
import SocketServer
except ImportError:
import socketserver as SocketServer

from dulwich.archive import tar_stream
from dulwich.errors import (
ApplyDeltaError,
ChecksumMismatch,
Expand Down Expand Up @@ -1003,19 +1005,48 @@ def handle(self):

class UploadArchiveHandler(Handler):

def __init__(self, backend, proto, http_req=None):
def __init__(self, backend, args, proto, http_req=None):
super(UploadArchiveHandler, self).__init__(backend, proto, http_req)
self.repo = backend.open_repository(args[0])

def handle(self):
# TODO(jelmer)
raise NotImplementedError(self.handle)
def write(x):
return self.proto.write_sideband(SIDE_BAND_CHANNEL_DATA, x)
arguments = []
for pkt in self.proto.read_pkt_seq():
(key, value) = pkt.split(b' ', 1)
if key != b'argument':
raise GitProtocolError('unknown command %s' % key)
arguments.append(value.rstrip(b'\n'))
prefix = b''
format = 'tar'
i = 0
store = self.repo.object_store
while i < len(arguments):
argument = arguments[i]
if argument == b'--prefix':
i += 1
prefix = arguments[i]
elif argument == b'--format':
i += 1
format = arguments[i].decode('ascii')
else:
commit_sha = self.repo.refs[argument]
tree = store[store[commit_sha].tree]
i += 1
self.proto.write_pkt_line(b'ACK\n')
self.proto.write_pkt_line(None)
for chunk in tar_stream(
store, tree, mtime=time.time(), prefix=prefix, format=format):
write(chunk)
self.proto.write_pkt_line(None)


# Default handler classes for git services.
DEFAULT_HANDLERS = {
b'git-upload-pack': UploadPackHandler,
b'git-receive-pack': ReceivePackHandler,
# b'git-upload-archive': UploadArchiveHandler,
b'git-upload-archive': UploadArchiveHandler,
}


Expand Down

0 comments on commit d0f921e

Please sign in to comment.