gitfs

56
gitfs @vtemian

Upload: temian-vlad

Post on 16-Jul-2015

129 views

Category:

Engineering


5 download

TRANSCRIPT

Page 1: gitfs

gitfs@vtemian

Page 2: gitfs

gitfs - Pytim #7

$whoami

Page 3: gitfs

gitfs - Pytim #7

Page 4: gitfs

gitfs - Pytim #7

the problem

Page 5: gitfs

CHAOS!

gitfs - Pytim #7

Page 6: gitfs

gitfs - Pytim #7

Page 7: gitfs

gitfs - Pytim #7

introducing gitfs

Page 8: gitfs

gitfs - Pytim #7

gitfswhat is it?

Page 9: gitfs

gitfs - Pytim #7

demo

Page 10: gitfs

gitfs - Pytim #7

easy!as 1,2,3

Page 11: gitfs

gitfs - Pytim #7

Page 12: gitfs

gitfs - Pytim #7

open-source

Page 13: gitfs

gitfs - Pytim #7

how was it made?

Page 14: gitfs

gitfs - Pytim #7

research

Page 15: gitfs

gitfs - Pytim #7

for git

Page 16: gitfs

gitfs - Pytim #7

git=pygit2

Page 17: gitfs

gitfs - Pytim #7

from pygit2 import clone_repository, Keypair

Page 18: gitfs

gitfs - Pytim #7

from pygit2 import clone_repository, Keypair

credentials = Keypair("git", "/home/wok/.ssh/ unsafe_key.pub","/home/wok/.ssh/unsafe_key", "")

Page 19: gitfs

gitfs - Pytim #7

from pygit2 import clone_repository, Keypair

credentials = Keypair("git", "/home/wok/.ssh/ unsafe_key.pub","/home/wok/.ssh/unsafe_key", "")

repository = clone_repository("[email protected]:vtemian/gitfs-demo","/home/wok/gitfs-demo", credentials=credentials)

Page 20: gitfs

gitfs - Pytim #7

from pygit2 import clone_repository, Keypair

credentials = Keypair("git", "/home/wok/.ssh/ unsafe_key.pub","/home/wok/.ssh/unsafe_key", "")

repository = clone_repository("[email protected]:vtemian/gitfs-demo","/home/wok/gitfs-demo", credentials=credentials)

remote = [remote for remote in repo.remotes if remote.name == "origin"] remote[0].credentials = credentials

Page 21: gitfs

gitfs - Pytim #7

from pygit2 import clone_repository, Keypair

credentials = Keypair("git", "/home/wok/.ssh/ unsafe_key.pub","/home/wok/.ssh/unsafe_key", "")

repository = clone_repository("[email protected]:vtemian/gitfs-demo","/home/wok/gitfs-demo", credentials=credentials)

remote = [remote for remote in repo.remotes if remote.name == "origin"] remote[0].credentials = credentials remote[0].push("refs/heads/master")

Page 22: gitfs

gitfs - Pytim #7

for the file system

Page 23: gitfs

gitfs - Pytim #7

file system=fusepy

Page 24: gitfs

gitfs - Pytim #7

class Memory(Operations):

Page 25: gitfs

gitfs - Pytim #7

class Memory(Operations): def open(self, path, flags): self.fd += 1 return self.fd

Page 26: gitfs

gitfs - Pytim #7

class Memory(Operations): def open(self, path, flags): self.fd += 1 return self.fd

def read(self, path, size, offset, fh): return self.data[path][offset:offset + size]

Page 27: gitfs

gitfs - Pytim #7

class Memory(Operations): def open(self, path, flags): self.fd += 1 return self.fd

def read(self, path, size, offset, fh): return self.data[path][offset:offset + size]

def rename(self, old, new): self.files[new] = self.files.pop(old)

Page 28: gitfs

gitfs - Pytim #7

class Memory(Operations): def open(self, path, flags): self.fd += 1 return self.fd

def read(self, path, size, offset, fh): return self.data[path][offset:offset + size]

def rename(self, old, new): self.files[new] = self.files.pop(old)

def rmdir(self, path): self.files.pop(path) self.files['/']['st_nlink'] -= 1

Page 29: gitfs

gitfs - Pytim #7

class Memory(Operations): def open(self, path, flags): self.fd += 1 return self.fd

def read(self, path, size, offset, fh): return self.data[path][offset:offset + size]

def rename(self, old, new): self.files[new] = self.files.pop(old)

def rmdir(self, path): self.files.pop(path) self.files['/']['st_nlink'] -= 1

def write(self, path, data, offset, fh): self.data[path] = self.data[path][:offset] +data self.files[path]['st_size'] = len(self.data[path]) return len(data)

Page 30: gitfs

gitfs - Pytim #7

first iteration

Page 31: gitfs

gitfs - Pytim #7

very dirty

def rename(self, old, new): if "history" in old or new: # raise EROFS elif old == "/" or new == "/": # raise EROFS else: # do the actual rename

Page 32: gitfs

gitfs - Pytim #7

second iteration

Page 33: gitfs

gitfs - Pytim #7

read()

Router

CurrentView HistoryView CommitView IndexView

Page 34: gitfs

gitfs - Pytim #7

read('/history/2014-10-18/14-01-04-fg34asc4/Readme.md')

CommitView

Page 35: gitfs

gitfs - Pytim #7

upstream synchronization

Page 36: gitfs

gitfs - Pytim #7

solve conflicts

Page 37: gitfs

gitfs - Pytim #7

solve conflicts

1 2 3

7 8

4 5 6

remote

local

Page 38: gitfs

gitfs - Pytim #7

solve conflicts1 2 3 4 5 6

merging_remote

1 2 3 7 8merging_local

Page 39: gitfs

gitfs - Pytim #7

1 2 3 4 5 7'6 8'local

solve conflicts

Page 40: gitfs

gitfs - Pytim #7

third iteration

Page 41: gitfs

gitfs - Pytim #7

cache

Page 42: gitfs

gitfs - Pytim #7

upstream synchronization

Page 43: gitfs

gitfs - Pytim #7

Fuse threads

Page 44: gitfs

gitfs - Pytim #7

commits

Fuse threads

Page 45: gitfs

gitfs - Pytim #7

Commit queue

commits

Fuse threads

Page 46: gitfs

gitfs - Pytim #7

Sync workerCommit queue

commits

Fuse threads

Page 47: gitfs

gitfs - Pytim #7

want to syncdon't open for write

Commit queueSync worker

commits

Fuse threads

Page 48: gitfs

gitfs - Pytim #7

commit

want to syncdon't open for write

Commit queueSync worker

commits

Fuse threads

Page 49: gitfs

gitfs - Pytim #7

commit

sync done

want to syncdon't open for write

Commit queue Fetch workerSync worker

fetch

fetch

fetch

commits

Fuse threads

Page 50: gitfs

gitfs - Pytim #7

pytest

Page 51: gitfs

gitfs - Pytim #7

$ sudo add-apt-repository ppa:presslabs/gitfs $ sudo apt-get update $ sudo apt-get install gitfs

Page 52: gitfs

gitfs - Pytim #7

commits forks

stars releases

868 27

606 11

Page 53: gitfs

gitfs - Pytim #7

github.com/PressLabs/gitfs

Page 54: gitfs

gitfs - Pytim #7

Q/A?

Page 55: gitfs

gitfs - Pytim #7

thank you

Page 56: gitfs

gitfs - Pytim #7