Nella mia libreria API (C ++) sto avvolgendo un processo shell (generato con popen ) con diverse classi manipolare un file system.
La classe base ProcessFileWrap
avvolge le attività generali del filesystem ed esegue altre attività personalizzate dalle sue classi derivate. Sembra di seguito in pseudocodice:
// ProcessFileWrap base class methods
ExecCustomProcess(string process) // does popen(process, "r")
ChangeDir(string path) // changes the current directory
AddFolder(string path) // wrapper for mkdir
AddFile(string path) // wrapper for touch
MakeLink(string pathToFile, string pathToLink) // wrapper for ln -s
// ... And so on
Esistono diverse classi derivate. Uno di questi è GitFileWrap
, che esegue il wrapping dei processi git in questo modo (di nuovo in psuedocode). È necessario eseguire alcune attività specifiche del file system dopo o durante il processo:
// GitFileWrap derived class methods
// Calls ChangeDir(pathToRepo) and ExecCustomProcess("git pull")
// Afterwards it creates links for each pulled file in a custom
// directory via MakeLink(file, customLoc).
Pull()
// Calls ExecCustomProcess(git commit -m obj.GetCommitMessage())
// A GitObject represents a git versioned object in the filesystem.
Commit(GitObject obj)
// ... And so on
Quindi gli utenti dell'API chiamerebbero i metodi dalle classi derivate, se necessario.
Sono consapevole del fatto che i processi di wrapping non sono in generale di best practice, quindi se puoi, per favore commenta il design con l'ipotesi che non ci sia davvero un'altra alternativa (o immagino che potresti, ma apprezzerei i commenti su il disegno sopra). Grazie!
Nota: non è possibile per me utilizzare libgit2