Se dorește implementarea unui sistem de versionare. Aplicația trebuie să suporte un set minim de comenzi unix pentru a putea crea, modifica si șterge fișiere, cât și un set de comenzi vcs care va permite salvarea stării curente a sistemului de fișiere. Scopul final al acestui program este de a ne putea întoarce la versiuni anterioare ale sistemului de fișiere. Întrucât tema se axează pe implementarea unui sistem de versionare, partea de comenzi unix este inclusă în schelet.
VCS (Version Control System) permit gestionarea versiunilor multiple ale fișierelor. Fiecare modificare a unui fișier este înregistrată în sistem. O astfel de înregistrare poartă numele de commit. In cadrul temei cand vom spune că am dat un commit, înseamnă că am salvat versiunea curenta a tuturor fișierelor din sistemul de fișiere. La finalul implementării aplicația trebuie sa ne permită sa dăm commituri și să putem să revenim la o versiune anterioară a sistemului de fișiere, adică să ne întoarcem câteva commit-uri în trecut.
La capătul acestui flow de commit-uri se află un cursor denumit HEAD. În momentul adăugării unui nou commit sau întoarcerii la un commit anterior, cursorul HEAD se mută pe commit-ul respectiv.
Sistemele de versionare permit si lucrul mai multor persoane pe un set de fișiere. Astfel, a apărut noțiunea de branch. Branch-ul este o ramură a sistemului de fișiere. Practic, putem sa avem același sistem de fișiere duplicat pe mai multe branch-uri ceea ce ne permite ca fiecare dezvoltator să lucreze pe branch-ul său.
Branch-ul principal se numește master. În momentul în care ne mutăm de pe un branch pe altul efectuăm o operație de checkout. Astfel, pointerul HEAD este mutat pe branch-ul pe care dorim să ajungem.
Cand întâlnim notiunea de “Staged changes”, ne referim la operațiile care încă nu au fost “commit-uite” si care au alterat starea sistemului de fișiere. De exemplu, daca de la ultima comandă de commit am mai creat un fișier, această operație de touch va fi adăugată în staging. În momentul în care se execută operația vcs commit, atunci staging-ul va fi golit, iar HEAD-ul se va muta pe noul commit. În momentul în care se execută operația vcs rollback, atunci staging-ul va fi golit, HEAD-ul va rămâne pe commit-ul curent, iar activeFileSystemSnapshot va reveni la valoarea din commit-ului curent.
Referință FOARTE UTILĂ: https://imgflip.com/i/2lveks
Tema este împărțită în 2 părți: operațiile de filesystem și cele de vcs. Fiecare comandă va fi citită dintr-un fișier de intrare și va genera un output sau un mesaj de eroare ce va fi scris în fisierul de iesire. Entry point-ul temei va fi clasa Main din schelet. Metoda main va primi ca parametru de la checker fișierele de intrare si ieșire.
În cadrul temei sunt 5 tipuri de mesaje de eroare:
Comanda primește ca parametru o cale (relativă sau absolută). În funcție de calea primită, se va va modifica directorul curent.
Exemplu:
cd /root/tema1/.././poo -> calea absolută începe obligatoriu de la /root cd andrei/./../abcd -> calea este relativă la directorul curent
Mesaje de eroare:
Cu ajutorul acestei comenzi vom crea noi directoare. Ea va primi ca parametru calea noului director.
Exemplu:
mkdir A mkdir ../B/C
Mesaje de eroare:
Comanda listează conținutul unui directorului specificat în calea dată ca parametru.
Exemplu:
ls /root ls
Mesaje de eroare:
Cu ajutorul acestei comenzi vom crea noi fișiere. Ea va primi ca parametru calea noului fișier.
Exemplu:
touch path/a
Mesaje de eroare:
Această comandă poate exista în 3 forme:
Mesaje de eroare:
Fiecare fișier va avea un conținut (text). Această comandă e menită să lipeasca un anumit conținut la finalul fișierului care este specificat prin calea dată ca parametru.
Exemplu:
writetofile path/file1 acesta este continutul fisierului
Mesaje de eroare:
Afișează în fișierul de ieșire conținutul fișierului care este specificat prin calea dată ca parametru.
Exemplu:
cat file1 cat /root/poo/Main.java
Mesaje de eroare:
Comandă auxiliară pentru afișarea întregii ierarhii de fișiere.
Exemplu:
Comanda listează numele branch-ului pe care ne aflăm și modificările care sunt in staging. “Staged changes” reprezintă toate modificările și operațiile aplicate pe filesystem de la ultimul commit pană in prezent. Staging-ul se golește în momentul în care se dau comanzile commit sau rollback. Operatiile track-uite de vcs status: mkdir, touch, writetofile, rm, rmdir, cd.
Exemplu:
vcs status
Exemplu output:
On branch: master Staged changes: Created directory A Created file ana Added "anaaremere" to file ana Removed A Removed ana Changed directory to dir1
Crează un nou branch cu aceeași structură a sistemului de fișiere ca cea descrisă de commit-ul branch-ului curent.
Exemplu:
vcs branch tema2V1
Mesaje de eroare:
Genereaza un nou commit, prin aplicarea modificarilor puse in staging commit-ului curent. Noul commit va avea commit-ul curent ca parinte.
Exemplu:
vcs commit -m Add list items functionality
Mesaje de eroare:
Are 2 functionalități:
Dupa ce ne mutam pe un commit anterior (sa il denumim commitul x), toate commiturile care au fost date dupa commitul x se vor sterge. Id-urile deja generate nu vor mai fi folosite.
Forma comenzii:
vcs checkout branchName vcs checkout -c commitId
Exemplu:
vcs checkout tema2V1 vcs checkout -c 3
Mesaje de eroare:
Afișează toate commit-urile date pe branch-ul curent.
Exemplu:
vcs log
Exemplu output
Commit id: 3 Message: First commit Commit id: 5 Message: "Add list items functionality" Commit id: 7 Message: "Optimize searching"
Golește staging-ul și aduce snapshot-ul de filesystem la versiunea dată de ultimul commit.
Exemplu:
1. vcs commit -m "Add changes" 2. touch a 3. ls 4. vcs status 5. vcs rollback 6. vcs status 7. ls
Exemplu output
3. a b 4. On branch: master Staged changes: Created file a 6. On branch: master Staged changes: 7. b
Arhiva pe care o veţi urca pe VMChecker va trebui să conţină în directorul rădăcină:
VCSMakefile
, care sa includa regulile build și cleanMain.java
(entry-point-ul aplicatiei voastre care nu se află în vreun pachet)README
Exemple punctare: