ПОС/Предрок 2020

Извор: SI Wiki
< ПОС
Датум измене: 18. јун 2021. у 12:21; аутор: Fedja (разговор | доприноси) (ispravljen git config za prikaz stabla)
Пређи на навигацију Пређи на претрагу

Предрок траје 120 минута.

Задатак 1

Поставка

(15п)

Изглед стабла
  • Направити локални git репозиторијум чије стабло историје изгледа као на слици десно.
  • Коментари сваког запамћеног комита детаљно описују измену у репозиторијуму.
  • Редослед и коментари комита, као и називи грана и позиције референци треба да буду као на слици.
  • Уместо Student name потребно је унети своје име и презиме.

Напомена: За приказ стабла у горњем облику прекопирати следећи код у ~/.gitconfig фајл

[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(boldgreen)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)-%an%C(reset)%C(boldyellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(boldcyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(boldyellow)%d%C(reset)%n''%C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"

Задатак 2

Поставка

(15п) Написати bash скрипту која покреће неки програм. Да би се програм исправно извршавао потребно је подесити неке глобалне променљиве и потребно је прекопирати неке фајлове у директоријум из кога се програм позива. Директоријум из кога се програм позива се креира по потреби. Потребно је омогућити да се систем врати у стање пре покретања скрипте и под тим се подразумева брисање направљеног директоријума и враћање глобалних променљивих на вредности које су имале пре покретања скрипте. Аргументи скрипте су:

  • Опциони параметар са аргументом -p. Путања до програма који се покреће.
  • Опциони параметар са аргументом -d. Путања до директоријума у коме треба покренути програм.
  • Опциони параметар са аргументом -v. Путања до фајла који садржи парове речи, где је сваки пар у једном реду. Прва реч у пару је име променљиве, друга реч је вредност коју та променљива треба да има приликом покретања програма.
  • Опциони параметар са аргументом -f. Путања до фајла који садржи путање до фајлова који морају да се нађу у директоријуму из кога је програм позван. Свака путања је у посебном реду у фајлу.
  • Опциони параметар -c. Ако постоји, скрипта треба да врати систем у почетно стање.
  • Позициони аргументи се прослеђују програму приликом покретања. Број позиционих аргумената може бити нула или већи.

Опциони параметри -p, -d, -v и -f су обавезни. Пријавити грешку у случају некоректних аргумената. За смештање привремене фајлове[sic] се може користити директоијум[sic] /tmp. Привремени фајлови морају бити уклоњени на крају извршавања скрипте.

Решење

#!/bin/bash

path=
dir=
vars=
files=
clean=
while getopts ":p:d:v:f:c" opt; do
    case $opt in
        p) path=$OPTARG
            ;;
        d) dir=$OPTARG
            ;;
        v) vars=$OPTARG
            ;;
        f) files=$OPTARG
            ;;
        c) clean=1
            ;;
        *) printf -- 'usage: ./skripta.sh -p path -d dir -v vars -f files [-c]\n'
           exit 1
            ;;
    esac
done
shift $(($OPTIND - 1))

# ako neki od flag-ova nije obezbeđen
if [ ! "$path" ] || [ ! "$dir" ] || [ ! "$vars" ] || [ ! "$files" ]; then
    printf -- 'nisu uneti obavezni parametri (-p, -d, -v, -f)\n'
    exit 2
fi

if [ ! -f "$path" ]; then
    printf -- 'program ne postoji\n'
    exit 3
fi

if [ ! -f "$vars" ]; then
    printf -- 'fajl sa parovima reči ne postoji\n'
    exit 4
fi

if [ ! -f "$files" ]; then
    printf -- 'fajl sa putanjama do fajlova ne postoji\n'
    exit 5
fi

# pravljenje direktorijuma
mkdir -p "$dir" # mkdir -p ne menja ništa ako direktorijum već postoji, alternativno [ ! -d "$dir" ] && mkdir "$dir"
# kopiranje programa u direktorijum
prog_name=${path##*/} # može i regexom: prog_name=$(echo $path | sed -n 's|.*/||p')
cp "$path" "$dir/$prog_name"

OLDIFS="$IFS" # čuvanje starog IFS-a

# pravljenje promenljivih
while IFS= read -r line; do # čitanje $vars liniju po liniju
    varname=$(echo $line | cut -d' ' -f1) # uzimanje prve reči u liniji
    varvalue=$(echo $line | cut -d' ' -f2) # uzimanje druge reči u liniji
    export "$varname"="$varvalue" # pravljenje promenljive
done < "$vars"
# promenljive će "nestati" iz sesije shell-a čim se završi skripta sem ako je ona pokrenuta sa `source ./skripta.sh`. što svakako nećete raditi.

# obezbeđivanje fajlova
temp_file=$(mktemp)
while IFS= read -r line; do
    file_name=${line##*/} # može i regexom: file_name=$(echo $line | sed -n 's|.*/||p')
    echo "$file_name" >> "$temp_file" # pamćenje svih fajlova koji su kopirani
    cp "$line" "$dir/$file_name" # kopiranje u željeni direktorijum
done < "$files"

# čišćenje ako smo izabrali -c
if [ "$clean" ]; then
    while IFS= read -r line; do # prolaženje kroz temp file i brisanje svih
        rm "$dir/$line"
    done < "$temp_file"
    rm "$temp_file"
    rm "$dir/$prog_name"
    rmdir --ignore-fail-on-non-empty # uklanjanje foldera samo ako je napravljen tek u programu
fi

# pokretanje programa
$dir/$prog_name

IFS="$OLDIFS" # restauracija IFS