#+Title: Git Project Manager / Commission Open Source #+Author: Yann Esposito #+Email: yann@esposito.host #+Date: <2018-10-25 Thu> #+HTML_HEAD: * Code from this talk → [[https://gitlab.esy.fun/yogsototh/gpm][Git Project Manager]] ** =git= is a *Distributed* Concurrent Versions System ** GitHub is a *Centralized* =git= host * Can we do without Github™? *** Betteridge's law Betteridge's law of headlines is an adage that states: #+BEGIN_QUOTE Any headline that ends in a question mark can be answered by the word no. #+END_QUOTE . . . Here the answer is *YES*! - Linux (only mail) - GHC used a self hosted instance of phabricator + trac - many others I don't know *** All right, we can, but /should we/? #+BEGIN_SRC __ _______ ____ _ \ \ / / ____/ ___|| | \ V /| _| \___ \| | | | | |___ ___) |_| |_| |_____|____/(_) #+END_SRC *** Short History - Internet (decentralized, email, bbs, usenet, etc...) - P2P -> no business - Centralized -> business, steal data!!!! - Decentralized again! - cryptobulshit: crash business =$$$$ -> #!@*!= - bio blockchains: sustainable business =$$= - old fashionned style: ??? ** GitHub™ *** GitHub™: Social Network - user management & trust - discoverability *** GitHub™: its free! #+BEGIN_QUOTE If you're not paying for it, you're the product being sold. #+END_QUOTE $$: Pay for private repositories *** GitHub™: Features!!! From their website (in that order): - /Code Review/: comment diffs, approve, refuse, etc... - /Project Management/: issues, milestones, dashboard, etc... - /Integrations/: travis, slack, etc... - /Team Management/: access rights, community guidelines, etc... - /Social Coding/: follow, explore, share, etc... - /Documentation/: github pages, wiki, ...à - /Code Hosting/: all your code in one place, tree view, blame view, etc... *** GitHub™: Metas Most GitHub™ features put data in their own internal closed representation: - Issues - Comments - Pages - Pull Request & review - Wiki Note there are tools to export them. Ex: migrate to Gitlab *** GitHub™ is great today but can suck tomorrow - /bloatware/ remember digg, readitlater? - /downgradeware/ Swagger-UI v3 (v2 is neat), reddit new redesign (looks better, but slow) - /payware/ You rely on our feature, but now, we want you to move or to pay. Fair ;) - /crapware/ Nothing works as expected unless you pay: Twitter streaming API? - /dieware/ Remember Friendfeed? Google Reader™? - etc... *** GitHub™ force all your team member to use GitHub™ Were you already forced to: - use PowerPoint? Excel? Word? - code in PHP? in Java? - work on windows? Harder need to ssh to UNIX machines? - use Eclipse instead of vim/emacs? - use a super complex GUI instead of a few command line tools? - etc... *REAL STORY @WORK*: github dashboard is slow & terrible for the manager. *** Why you shouldn't rely too much on GitHub™? - Github™ is great to get you started: - nothing to install - only high level interface - everything explained with nice docs - github is really a great product - *The hidden price to pay*: - use closed source services - give freely many private infos - you must TRUST github for privacy, private account *** Why not self hosted Gitlab then? Gitlab is a better alternative but: - You still keep the metas of your project in the Gitlab server in some DB. - You still force all the member of your team to use your Gitlab version, with your Gitlab plugins, with your Gitlab settings, etc... - Gitlab push a big warn so you are pushed to upgrade (new features & anti-features) *** =git clone= - [X] code - [X] web pages - [ ] *issues* - [ ] *reviews* - [ ] *comments* - [ ] *wiki/doc* - [ ] *hooks* * Git Project Manager *** Problems - can't clone everything - big dependence on private tooling (that could change or being interrupted) - force same tooling choices accross your team members *** Solution - put metas in git branches *CLONE ALL THE THINGS!!!!* . . . - use text files for everything *DO NOT FORCE ANY TOOL* . . . - only rely on conventions, better on standardized conventions *HELP TO WRITE SPECIFIC OPEN SOURCE TOOLS* *** Git Project Manager =gpm= - command line tool - integrate your project management metas in your git repo - automate a few common tasks - follow a few conventions /Tool freedom/ - people on the team don't need to install or use =gpm= - they just need to follow a minimal set of conventions - want to use other conventions? Write yourself a =gpm= in a few hours. - but really there are /very few/ conventions =gpm= follows *** =gpm= conventions - =git= as DCSV - text files - Project Management metas goes in the branch =gpm= *** Encouraged but not enforced =gpm= conventions - encourage to use =org-mode= format but you can change - issues goes in =issues.org= file - reviews goes in =reviews/= with name =-.org= - docs goes in =wiki.org= - serve goes in your XDG data dir (standard) *** git is awesome! battery included: - =git= hooks - =git instaweb= - =git daemon= *** org-mode is awesome - TODO list oriented document convention - Extremely versatile: - issues, bug tracking, comments - handling with minimal friction code reviews =org-annotate-file= - workflows: - basic trello (TODO, IN-PROGRESS, DONE) - scrum (EPIC / USER-STORY / etc...) - kanban: - EPIC with different statuses (prep, specified,etc..), comments - user stories with evaluation, different status, comments - QA status - Ops status * DEMO *** Create a git project #+BEGIN_SRC bash mkdir -p /tmp/gpm-playground/testprj cd /tmp/gpm-playground/testprj echo "Hello GPM" > README git init . git add README git commit -m "Initial commit" #+END_SRC *** =gpm init= (1) #+BEGIN_SRC bash gpm init #+END_SRC #+BEGIN_SRC GPM -- Git Project Manager ========================== Create a new branch gpm (be sure the branch gpm doesn't already exists) git checkout --orphan gpm Switched to a new branch 'gpm' cleanup the branch git rm --cached -r . git clean -fd #+END_SRC *** =gpm init= (2) #+BEGIN_SRC * issue.org git add issues.org git add templat * wiki.org git add wiki.or * reviews.org create some example review for inspiration reviews/write-contributing-yogsototh.org git add reviews create some review templates templates/new-review.org git add templates #+END_SRC *** =gpm init= (3) #+begin_src * hooks/ Copyings default hooks into the hooks directory git add hoo * server init create dir: /Users/yaesposi/.local/share/gpm/public git init . git rev-parse --show-toplevel git rev-parse --show-toplevel git clone --mirror /tmp/gpm-playground/testprj ~/.local/share/gpm/public/testprj.git Cloning into bare repository '.../testprj.git'... done. git update-server-info git commit -m 'gpm initialized' git checkout master Switched to branch 'master' #+END_SRC *** The =gpm= branch #+BEGIN_SRC > git checktout gpm > tree . ├── hooks │   ├── applypatch-msg.sample │   ├── commit-msg.sample │ └── ... ├── issues.org ├── reviews │   └── write-contributing-yogsototh.org ├── templates │   ├── new-issue.org │   └── new-review.org └── wiki.org 3 directories, 16 files #+END_SRC *** Hooks #+BEGIN_SRC bash > gpm hooks Usage: gpm hooks sync Handle hooks for this git repository Available options: -h,--help Show this help text Available commands: sync Synchronize hooks from gpm branch #+END_SRC *** =issues.org= Basic #+BEGIN_SRC org #+TODO: TODO(t) STARTED(s) WAITING(w) | DONE(d) CANCELLED(c) * Basic Usages ** TODO Do thing 3 ** STARTED Do thing 2 ** DONE Do thing 1 #+END_SRC *** =issues.org= Complex workflow, review #+BEGIN_SRC org #+PROPERTY: ASSIGNEE #+PROPERTY: REVIEWER #+TODO: REVIEW(i) | MERGED(m) #+TODO: ACCEPTED(a) CHANGE_REQUESTED(c) QUESTION(q) FEEDBACK(f) | REFUSED(r) ** REVIEW Basic review process :PROPERTIES: :BRANCH: explain-review-process :ASSIGNEE: yogsototh :END: *** ACCEPTED Review finished :PROPERTIES: :REVIEWER: shubby :END: #+END_SRC *** =issues.org= Full Professional Usage #+BEGIN_SRC org #+TAGS: epic(e) user_story(u) task(t) qa(q) ops(o) * Some Title :epic: ** Some User Story :story: *** Dev Task :task:dev: *** Document Task :task:doc: *** QA Task :task:qa: *** Ops Task :task:ops: #+END_SRC *** =gpm new-issue= #+BEGIN_SRC bash > gpm new-issue -i #+END_SRC *** =gpm serve= - web interface: =git instaweb= (port 1234) - git server: =git daemon= (port 9418) #+BEGIN_SRC Usage: gpm serve (start | stop | update | path) Serve the git to the web Available options: -h,--help Show this help text Available commands: start Start to serve all gpm tracked repositories stop Stop to serve all gpm tracked repositories update Update the served git repository path Show the path of the bare repository #+END_SRC *** =gpm review=: classical workflow 1. dev create a new feature branch 2. reviewer review the branch 3. dev pull the =gpm= branch and =gpm retrieve= the reviews 4. dev take feedbacks into account 5. goto 2 until reviewer accept the branch 6. integration manager/dictator/lieutenant merge the branch *** =gpm review=: reviewer (step 2 of previous slide) 1. reviewer pull the remote feature branch 2. gpm review start: create a local file 3. write the review: =org-annotate-file= FTW! 4. stop the review: copy the local file in gpm branch and commit it 5. =gpm update= to serve the updated =gpm= branch * Conclusion *** Proof of concept - =gpm= is a proof of concept but so simple its already usable - git clone should provide most of your projects data - don't enforce tooling on your team, use text files - I advise you to use org-mode it is awesome! *REALLY!* - vimer? ⇒ spacemacs or doom-emacs - IDE? ⇒ switch to spacemacs eat the bullet! - you still can edit org-mode with notepad *** Lot of things already done - git-scm.org has plenty of resources - git instaweb - git daemon - how to serve git with apaches, if you want to use another non decentralized workflow, or share hosting with a few peers *** Going further: Decentralized Web - the Internet was thought to be decentralized - centralization of services made lot of things easy, it was fair at first - but made us dependant and the balance is no more fair - it is time to re-decentralize the Internet and take back control - we shouldn't be dependant of private services - we should pay private service, but they should adapt to us, not the other way around *** Decentralized Authentication: IndieAuth - one of your online identities = one domaine name - serve a page with all your online identity providers and username - google - twitter - etc... - but also your GPG keys (see keybase) Mainly you OWN & CONTROL your identity and the informations about it. *** Decentralized Comments: webmention - you host your comment - a 3rd party website can decide to show it in its comment section *** Decentralized Web - Your content is yours (prevent site death, change it, delete it...) - Better connection: - messages can go to all your services - use open standards - You are in control - post anything, any format, no monitoring, share links. Follow: - https://indiewebify.me - https://indieweb.org