github-logo

Github Integration - Godot Engine

Github Integration è un plugin che permette di integrare un client nativo per GitHub all'interno dell'Editor di Godot Engine.

Godot v3.2.1-stable mono win64 u9NRw8AtSu

Ho deciso di sviluppare questo plugin con l'intento di fornire un tool intuitivo e facile da usare, sia per esperti che per programmatori alle prime armi, direttamente all'interno dell'engine con cui stiamo sviluppando il progetto, creando una scatola chiusa e funzionale.

  1. Il Problema

  2. Features principali

  3. Design e Funzionamento

  4. Installazione e Utilizzo

Il Problema

Questo plugin non vuole essere una completa sostituzione del client browser, nè delle sue versioni desktop o della linea di comando git. Se da un lato ho avuto un'attenzione maniacale verso alcune feature aggiuntive, d'altro canto il plugin manca sicuramente di servizi aggiuntivi offerti da client preesistenti o da linea di comando, come il controllo file-per-file, gestione delle richieste, messaggistica e social, gestione di progetti e altro.

Il plugin nasce da una necessità personale, ovvero quella di poter caricare nella maniera più rapida possibile qualsiasi mia modifica alle repository che possiedo su GitHub, ma sempre mantenendo un discreto controllo su tutto il flusso di dati e file. Così, in parallelo ai primi progetti che sviluppavo con Godot, decisi di elaborare un piccolo sistema personalizzato per effettuare le operazioni principali di cui avevo bisogno: navigare tra tutte le mie repository, effettuare un push o un pull, eliminare singoli elementi o intere cartelle direttamente da remoto, e scrivere delle gist per annotarmi gli aggiornamenti dei miei progetti.

Man mano che il tool cresceva richiedeva sempre meno attenzioni dal punto di vista di codice, dal momento che ogni mia commit consisteva in un vero e proprio stress test per qualsiasi eventuale errore (file corrotti, file troppo grandi, file illeggibili). Dopo meno di un mese di utilizzo e di perfetto funzionamento senza nessun intoppo, sicuro che il feeling fornito dal plugin fosse esattamente lo stesso, se non più rapido, di un qualsiasi client esterno per GitHub, decido di pubblicarlo attraverso l'AssetLibrary di Godot Engine e rilasciarlo con licenza MIT su GitHub, seguendo la filosofia open source dell'intera architettura su cui si poggia (Godot Engine stesso).

Nasce così Github Integration, uno strumento nato per necessità personali, ma esattamente in grado di soddisfare le principali necessità di un utente medio o di un piccolo team di sviluppatori.

Features principali

L'insieme di necessità specifiche e cura per la gestione dell'interfaccia e degli elementi, mi ha condotto all'elaborazione di alcune feature che ritengo molto utili, non solo personalmente ma soprattutto dai feedback ricevuti. Tra queste feature che considero personalizzate, sono sicuramente degni di nota:

  • Editor integrato per Gist

    Godot v3.2.1-stable mono win64 05v1nLOf1j
  • Resource Manager per Repository

    Godot v3.2.1-stable mono win64 gGJ9LoduBj
  • Real Time Editor per .gitignore durante Commit&Push

  • Resource Manager per Commit&Push

    Godot v3.2.1-stable mono win64 KZpwdkrSMI

Design e Funzionamento

Github Integration sfrutta le REST API v3 messe a disposizione da GitHub.

Le REST API sono specifiche entità di API la cui architettura su basa sul protocollo HTTP. In particolare, le REST API mettono a disposizione delle risorse specifiche identificate da un URL univoco, su cui possono essere effettuate delle chiamate attraverso client specifici (Postman) o linguaggi di programmazione dotati di API o librerie HTTP Request.

Nel mio caso, Godot Engine mette a disposizione un'intera classe dedicata alle richieste HTTP, che ho appositamente sfruttato per effettuare tutte le chiamate necessarie per effettuare le operazioni base con GitHub.

flowchart github

Il processo di Commit and Push è sicuramente quello che porta via più tempo, dal momento che il suo completamento dipende dalla quantità di file che si vogliono aggiungere alla repository, e dalla loro dimensione.

Inoltre, poichè GitHub possiede un limite massimo di dimensioni di file caricabili in una repository (non deve essere superiore a circa 100MB), i file di tali dimensioni non potranno essere aggiunti con un caricamento diretto.

Nonostante il plugin implementi già la possibilità di supportare git lfs senza configurarlo sul proprio computer, ho bloccato tale funzionalità di default, in quanto le API di git LFS non sono attualmente molto responsive.

Per essere caricato, ogni file deve essere sostituito con un blob, ovvero una versione convertita con un encoding specificato dalle API di GitHub. Di seguito, un piccolo esempio dell'algoritmo che prende il file, lo converte e lo aggiunge al tree di commit.

Godot v3.2.1-stable mono win64 LDcV0TJnl8

La richiesta HTTP conterrà bod in formato JSON:

Godot v3.2.1-stable mono win64 y4EIO7xY3o

Installazione e Utilizzo

Ho realizzato una Wiki sfruttando direttamente gli strumenti che mette a disposizione GitHub, contenente tutte le informazioni necessarie sull'installazione del plugin ed il suo utilizzo.

E' possibile raggiungere la wiki qui.