Пета задача

  1. За протокола, изчистихме някои неточности в условието на пета задача. Можете да видите промените тук, или просто да си рефрешнете условието, за да сте сигурни, че четете последната версия. :)

    Ако се наложат други промени, ще пишем тук. Извиняваме се още веднъж за забавянето.

  2. Здравейте,

    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

    Гугъл ми каза, че иначе не можело.

  3. Здравейте, искам да разясните кога точно отчитаме промяна при commit, до колкото разбирам от условието чрез add добавяме още информация към текущата следователно след всеки add има промяна(поне аз така го разбирам).

    Въпроса ми е грешката при commit

    message: "Nothing to commit, working directory clean."
    

    Трябва да се появи само и единствено когато се извика commit , без да има нищо добавено с add ?

  4. Първият: Промени върху текущото състояние може да правиш с add и remove операциите. Запазваш промененото състояние в историята с commit. Съответно, съобщението може да се появи, когато не си изпълнил нито една add или remove операция.

    Вторият: Commit hash-а се генерира от теб на база на останалите данни като hash-ираш "$date$$message$" с Sha1 алгоритъм.

  5. Относно # 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 който ще се върне, защото не виждам смисъл да ги запазвам някъде ?

  6. @Денис - в идните две лекции - понеделник и сряда - ще стане дума за един възможен начин, в който да се постигне исканото поведение в задачата, с блока, подаден на init. Оставете си тази функционалност за най-накрая.

  7. name използваш като ключ, който ти дава достъп до конкретен обект. Т.е това, което правиш е нещо подобно на речник, но със специални възможности. След като си добавил обект, можеш да използваш get и да вземеш обратно този обект, подавайки неговото име.

  8. Методите 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
    
  9. Здравейте! Искам да попитам следните неща:

    1. Какво се случва, когато добавим един и същ "обект" 2 пъти?
      add("answer", 4)
      add("answer", 42)
      
      или
      add("answer", 4)
      commit("Added answer")
      add("answer", 42)
      commit("Fixed typo in answer")
    2. Мога ли да направя следното:
      add("answer", 4)
      remove("answer")
      add("answer", 42)
      commit("Added answer")
      
      В условието пише, че
      премахнатият обект може да бъде добавен отново в следващ commit.
    3. Какво се случва, когато checkout-нем, докато имаме не-commit-нати промени? Губят се? Пренасят се на другия branch? Операцията е неуспешна?
  10. Хубави въпроси.

    Първи: При вариант 1 приемаме, че линията add("answer, 4) не съществува. Т.е add("answer", 42) я презаписва. При вариант 2 резултатът е два различни commit-а. Ако се опиташ да провериш съдържанието на "answer" след втория commit то ще бъде 42. Хранилището ти позволява да се върнеш към преден commit и ако направиш това, съдържанието на "answer" ще бъде 4. Т.е. пазиш и двете версии, ако си ги commit-нал.

    Втори: Няма да има добавяне и премахване на обекти с един и същи ключ в рамките на един commit.

    Трети: Няма да checkout-ваме докато има не-commit-нати промени.

  11. Здравейте хора,

    някакви предложения как да си намаля символите на ред, за да си спазя ограничението от <= 80, като повечето методи трябва да връщат резултати със съобщение, а то ми излиза около 60 символа. Лесно мога да почна да си кръщавам променливите a, b, x, ама нали не това е идеята.. И затова питам - за някакви съвети. :)

  12. Резултатът от метода commit при променени обекти е успех:
    
    message: "$message$\n\t$count$ objects changed" # $message$ е commit съобщението. $count$ е броят на променените обекти.
    

    На края на съобщението няма точка. Всички други имат. Изключение или тайпо?

  13. Здравейте, отново! :smile:

    Ако имам следната ситуация:

        + [branch2] commit-3
        |
        + [* master] commit-2 (Current HEAD) 
        |
        + initial-commit

    1. Мога ли да checkout-на от commit-2 към commit-3, ако се намирам на master? Ако да - на кой branch ще се намирам?
    2. Според условието
      След checkout, всички по-нови commit-и стават недостъпни.
      Значи, ако checkout-на от commit-2 към initial-commit, commit-2 ще се премахне от master branch-a? Не може да се checkout-ва "нагоре" по дървото?
  14. @Владо - изключение.

    @Теодор - Можеш да checkout-ваш commit-и само от текущия branch. Той се променя, но това по никакъв начин не трябва да афектира останалите branch-ове. Ще добавя това в условието на задачата.

Трябва да сте влезли в системата, за да може да отговаряте на теми.