ПОС/Предрок 2020 — разлика између измена
м (Ovo je INI format) |
м (vase ime) |
||
(Нису приказане 4 међуизмене 2 корисника) | |||
Ред 1: | Ред 1: | ||
{{tocright}} | {{tocright}} | ||
Предрок траје 120 минута. | Предрок траје 120 минута. | ||
== Задатак 1 == | == Задатак 1 == | ||
Ред 16: | Ред 14: | ||
<syntaxhighlight lang="ini"> | <syntaxhighlight lang="ini"> | ||
[alias] | [alias] | ||
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold | lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all | ||
green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold | lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all | ||
yellow)%d%C(reset)' --all | lg = !"git lg1" | ||
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold | </syntaxhighlight> | ||
cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' | |||
%C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all | === Решење === | ||
lg = !"git lg1" | <syntaxhighlight lang="bash"> | ||
# napomena 'v' je alias za editor, koristite koji god želite da napravite promene | |||
git init | |||
git config user.name 'ime' | |||
v .gitignore # dodati "*~" | |||
git add .gitignore | |||
git commit -m '.gitignore created with line "*~"' | |||
touch a.c | |||
git add a.c | |||
git commit -m 'a.c created(empty)' | |||
touch b.c c.c | |||
git add b.c c.c | |||
git commit -m 'b.c and c.c created (both are empty)' | |||
git checkout -b b1 | |||
v a.c # dodati line 1 | |||
v b.c # dodati line 2 | |||
v c.c # dodati line 1 i line 2 | |||
git add a.c b.c c.c # može i *.c | |||
git commit -m "a.c - added 'line 1'; b.c - added 'line 2'; c.c - added two lines, 'line 1' and 'line 2'" | |||
git checkout master | |||
v a.c # dodati line 1 | |||
v b.c # dodati line 1 | |||
git add a.c b.c | |||
git commit -m "a.c - added 'line 1'; b.c - added 'line 1'" | |||
git merge b1 | |||
v b.c # izmeniti fajl u line 1 pa line 2 | |||
git add b.c c.c | |||
git commit -m "merge branch 'b1'" | |||
v a.c # dodati line 2 | |||
v c.c # dodati line 3 | |||
git add a.c c.c | |||
git commit -m "a.c - added 'line 2'; c.c - added 'line 3'" | |||
git checkout HEAD~3 # povratak tri grane unazad | |||
git checkout -b b3 | |||
v c.c # dodati liniju 4 | |||
git commit c.c -m "c.c - added 'line 4'" | |||
v a.c # dodati liniju 1 | |||
git commit a.c -m "a.c - added 'line 1';" | |||
git checkout master | |||
git merge b3 | |||
v a.c | |||
v c.c | |||
git add a.c c.c | |||
git commit -m "merge branch 'b3' - a.c and c.c - changes kept from both branches;" | |||
git checkout HEAD~4 | |||
git checkout -b b2 | |||
v b.c | |||
git commit b.c -m "b.c - added 'line 2'" | |||
git checkout master | |||
git merge b2 | |||
v b.c | |||
git add b.c | |||
git commit -m "merge branch 'b2' - b.c - changes kept from both branches;" | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Ред 37: | Ред 88: | ||
=== Решење === | === Решење === | ||
<syntaxhighlight lang=bash | <syntaxhighlight lang="bash"> | ||
#!/bin/bash | #!/bin/bash | ||
Тренутна верзија на датум 26. јул 2021. у 15:23
Предрок траје 120 минута.
Задатак 1
Поставка
(15п)
- Направити локални git репозиторијум чије стабло историје изгледа као на слици десно.
- Коментари сваког запамћеног комита детаљно описују измену у репозиторијуму.
- Редослед и коментари комита, као и називи грана и позиције референци треба да буду као на слици.
- Уместо Student name потребно је унети своје име и презиме.
Напомена: За приказ стабла у горњем облику прекопирати следећи код у ~/.gitconfig фајл
[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"
Решење
# napomena 'v' je alias za editor, koristite koji god želite da napravite promene
git init
git config user.name 'ime'
v .gitignore # dodati "*~"
git add .gitignore
git commit -m '.gitignore created with line "*~"'
touch a.c
git add a.c
git commit -m 'a.c created(empty)'
touch b.c c.c
git add b.c c.c
git commit -m 'b.c and c.c created (both are empty)'
git checkout -b b1
v a.c # dodati line 1
v b.c # dodati line 2
v c.c # dodati line 1 i line 2
git add a.c b.c c.c # može i *.c
git commit -m "a.c - added 'line 1'; b.c - added 'line 2'; c.c - added two lines, 'line 1' and 'line 2'"
git checkout master
v a.c # dodati line 1
v b.c # dodati line 1
git add a.c b.c
git commit -m "a.c - added 'line 1'; b.c - added 'line 1'"
git merge b1
v b.c # izmeniti fajl u line 1 pa line 2
git add b.c c.c
git commit -m "merge branch 'b1'"
v a.c # dodati line 2
v c.c # dodati line 3
git add a.c c.c
git commit -m "a.c - added 'line 2'; c.c - added 'line 3'"
git checkout HEAD~3 # povratak tri grane unazad
git checkout -b b3
v c.c # dodati liniju 4
git commit c.c -m "c.c - added 'line 4'"
v a.c # dodati liniju 1
git commit a.c -m "a.c - added 'line 1';"
git checkout master
git merge b3
v a.c
v c.c
git add a.c c.c
git commit -m "merge branch 'b3' - a.c and c.c - changes kept from both branches;"
git checkout HEAD~4
git checkout -b b2
v b.c
git commit b.c -m "b.c - added 'line 2'"
git checkout master
git merge b2
v b.c
git add b.c
git commit -m "merge branch 'b2' - b.c - changes kept from both branches;"
Задатак 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