Здравейте,
С малко закъснение, пета задача е публикувана. Крайният срок е понеделник, 23 ноември, 17:30 ч.
Ако имате въпроси по условието, може да ги дискутираме тук. :)
Успех!
Здравейте,
С малко закъснение, пета задача е публикувана. Крайният срок е понеделник, 23 ноември, 17:30 ч.
Ако имате въпроси по условието, може да ги дискутираме тук. :)
Успех!
За протокола, изчистихме някои неточности в условието на пета задача. Можете да видите промените тук, или просто да си рефрешнете условието, за да сте сигурни, че четете последната версия. :)
Ако се наложат други промени, ще пишем тук. Извиняваме се още веднъж за забавянето.
Здравейте,
repo = ObjectStore.init do
add("value", 21)
commit("message")
end
Това чудо малко ме обърква. Очаква се тия методи add и commit да могат да се викат от Object или просто е трябвало да е:
repo = ObjectStore.init do |r|
r.add("value", 21)
r.commit("message")
end
Гугъл ми каза, че иначе не можело.
Първото е нещото, което търсим. Дали е от Object
е друг въпрос. Помисли си какво ти дава контекста, в който дадени методи са дефинирани и как можеш да го смениш.
Разбирам. Мерси :)
Здравейте, искам да разясните кога точно отчитаме промяна при commit, до колкото разбирам от условието чрез add добавяме още информация към текущата следователно след всеки add има промяна(поне аз така го разбирам).
Въпроса ми е грешката при commit
message: "Nothing to commit, working directory clean."
Трябва да се появи само и единствено когато се извика commit , без да има нищо добавено с add ?
Първият: Промени върху текущото състояние може да правиш с add
и remove
операциите. Запазваш промененото състояние в историята с commit
. Съответно, съобщението може да се появи, когато не си изпълнил нито една add
или remove
операция.
Вторият: Commit hash-а се генерира от теб на база на останалите данни като hash-ираш "$date$$message$"
с Sha1 алгоритъм.
Относно # add(name, object), name за какво служи, тоест ако имам
repo.add("important", "This is my first version.")
repo.add("not_so_important", "This is just a note.")
repo.commit("A commit message goes here...")
след което
repo.add("blah", "This is my first blah")
repo.add("not_so_blah", "This is just a blah.")
repo.commit("A commit blah goes here...")
ако checkoutna първия commit променливите name от add трябват ли ни да ги съхраняваме или са само за message който ще се върне, защото не виждам смисъл да ги запазвам някъде ?
@Денис - в идните две лекции - понеделник и сряда - ще стане дума за един възможен начин, в който да се постигне исканото поведение в задачата, с блока, подаден на init
. Оставете си тази функционалност за най-накрая.
@Николай, може да мислиш за "name" като за "име на файл", докато вторият аргумент на add
е "съдържанието на файла" (без значение какъв тип обект е).
name
използваш като ключ, който ти дава достъп до конкретен обект. Т.е това, което правиш е нещо подобно на речник, но със специални възможности. След като си добавил обект, можеш да използваш get
и да вземеш обратно този обект, подавайки неговото име.
Да но на този речник ключовете трябва да са commit_hash
не name
?
Методите remove
и get
, например, работят по този name
. Хешът на commit е отделно нещо, и него трябва да пазиш.
Иначе не разбирам за какъв речник говориш. Където се говори за "хеш" в условието, става дума за криптографски SHA1 хеш.
Ето това трябва да работи:
repo = ObjectStore.init
repo.add('answer', 42);
repo.commit('Add the answer')
repo.add('the_question', :unknown);
repo.commit('Add the question');
repo.get('answer').result == 42 # => true
Здравейте! Искам да попитам следните неща:
add("answer", 4)
add("answer", 42)
или
add("answer", 4)
commit("Added answer")
add("answer", 42)
commit("Fixed typo in answer")
add("answer", 4)
remove("answer")
add("answer", 42)
commit("Added answer")
В условието пише, че премахнатият обект може да бъде добавен отново в следващ commit.
checkout
-нем, докато имаме не-commit
-нати промени? Губят се? Пренасят се на другия branch? Операцията е неуспешна?
Хубави въпроси.
Първи: При вариант 1 приемаме, че линията add("answer, 4)
не съществува. Т.е add("answer", 42)
я презаписва. При вариант 2 резултатът е два различни commit-а. Ако се опиташ да провериш съдържанието на "answer"
след втория commit то ще бъде 42
. Хранилището ти позволява да се върнеш към преден commit и ако направиш това, съдържанието на "answer"
ще бъде 4
. Т.е. пазиш и двете версии, ако си ги commit-нал.
Втори: Няма да има добавяне и премахване на обекти с един и същи ключ в рамките на един commit.
Трети: Няма да checkout-ваме докато има не-commit-нати промени.
За въпрос 2:
Под "няма да има" се разбира, че няма да има такива тестове, или че не трябва да е възможно?
Няма да има тестове, които добавят и премахват обекти с едно и също име в рамките на един commit.
Не виждам линк към сампъл спека в условието на задачата:
https://raw.githubusercontent.com/fmi/ruby-homework/master/tasks/05/sample_spec.rb
ЕДИТ: Съобщенията завършват ли с \n или не?
@Влад, да, няма линк, то е на обичайното място. Благодаря, че си го споделил за улеснение тук.
За въпроса ти, ако имаш предвид message
атрибута на върнатия резултат – не, няма нов ред в края.
Искам да попитам, ако репото ни е нещо от сорта
[commit1, commit2, commit3, commit4(head)]
ако checkout(commit2)
това трябва да върне [commit1, commit2]
нали ?
Здравейте хора,
някакви предложения как да си намаля символите на ред, за да си спазя ограничението от <= 80, като повечето методи трябва да връщат резултати със съобщение, а то ми излиза около 60 символа. Лесно мога да почна да си кръщавам променливите a, b, x, ама нали не това е идеята.. И затова питам - за някакви съвети. :)
@Николай, предполагам че изпползваш списъци само с илюстративна цел. В такъв случай - да, след store.checkout(commit2.hash)
се очаква store
да се върне на състояние, в което има commit-нати commit1
и commit2
.
Резултатът от метода commit при променени обекти е успех:
message: "$message$\n\t$count$ objects changed" # $message$ е commit съобщението. $count$ е броят на променените обекти.
На края на съобщението няма точка. Всички други имат. Изключение или тайпо?
Здравейте, отново!
Ако имам следната ситуация:
+ [branch2] commit-3 | + [* master] commit-2 (Current HEAD) | + initial-commit
checkout
-на от commit-2
към commit-3
, ако се намирам на master
? Ако да - на кой branch
ще се намирам?
След checkout, всички по-нови commit-и стават недостъпни.Значи, ако
checkout
-на от commit-2
към initial-commit
, commit-2
ще се премахне от master
branch
-a? Не може да се checkout
-ва "нагоре" по дървото?
@Владо - изключение.
@Теодор - Можеш да checkout-ваш commit-и само от текущия branch. Той се променя, но това по никакъв начин не трябва да афектира останалите branch-ове. Ще добавя това в условието на задачата.
@Деси, относно твоя въпрос – можеш да сглабяш низовете от няколко парчета текст, обединени с +
, например.
А и това работи:
"foo" "bar" # => "foobar"
"foo" \
"bar"
# => "foobar"
add
и remove
веднага ли променят store-а или чак след успешен commit
?
@Теодор, промените стават "видими" след commit.
Гледам, че не е добавено, но предполагам add, commit, remove
не могат да се изпълняват когато сме checkout
по-стар commit
?
Checkout на по-стар commit просто "пренаписва" историята и променя текущото състояние на обектите в хранилището. Нищо не те спира да продължиш да commit-ваш след това.
Тогава ако имаме [commi1, commit2, commit3, commit4(head)]
преместваме се на checkout(commit2)
след което ако commit(commit5)
Какво ще се случи:
[commi1, commit2, commit3, commit4, commit5(head)]
,където commit5 ще е състоянието на commit2 ?
Трябва да сте влезли в системата, за да може да отговаряте на теми.