2013-06-03 3 views
5

Я пытаюсь программно создать фиксацию в существующем репозитории, используя Rugged (привязка Ruby от libgit2). Я попытался выполнить документацию, представленную в Rugged README, но я думаю, что она не совсем соответствует текущему состоянию базы кода. Я продолжаю получать ошибки, когда я попробуйте запустить следующий код:Как программно создать фиксацию с помощью Rugged?

require 'rugged' 
# Create an instance of the existing repository 
repo = Rugged::Repository.new('/full/path/to/repo') 
# grab the current Time object for now 
curr_time = Time.now 
# write a new blob to the repository, hang on to the object id 
oid = repo.write("Some content for the this blob - #{curr_time}.", 'blob') 
# get the index for this repository 
index = repo.index 
# add the blob to the index 
index.add(:path => 'newfile.txt', :oid => oid, :mode => 0100644) 
curr_tree = index.write_tree(repo) 
curr_ref = 'HEAD' 
author = {:email=>'[email protected]',:time=>curr_time,:name=>'username'} 
new_commit = Rugged::Commit.create(repo, 
    :author => author, 
    :message => "Some Commit Message at #{curr_time}.", 
    :committer => author, 
    :parents => [repo.head.target], 
    :tree => curr_tree, 
    :update_ref => curr_ref) 

Ошибка тока я получаю говорит, что есть что-то не так с index.add линии. Он говорит TypeError: wrong argument type nil (expected Fixnum).

Любая помощь по лучшему пониманию того, как создать новую фиксацию с прочной, будет высоко оценена.

Update

Я только что обновил Rugged 0.16.0 на Rugged 0.18.0.gh.de28323, запустив gem install --prerelease rugged. Код, который я подробно описал выше, теперь работает. Я не уверен, почему это не сработало с 0.16.0. У этого человека, похоже, была та же проблема, о которой они подробно рассказали в this answer.

+0

какой номер строки? – fotanus

+0

Он ломается на линии с 'index.add'. – jbranchaud

+0

Извините, по какой-то причине я читаю файл index.add – fotanus

ответ

3

Похоже, вы проходите в nil до index.add, где он не принимает его, и ошибка в этой строке является всего лишь симптомом неспособности проверить ошибки ранее. Второй параметр - repo.write должен быть символом, а не строкой, поэтому он, скорее всего, возвращает nil, чтобы сигнализировать об ошибке. Передача :blob вместо 'blob' должна быть исправлена.

Вы можете посмотреть https://github.com/libgit2/docurium/blob/master/lib/docurium.rb#L115-L116 и код, который мы используем для создания собственной документации libgit2.

+0

Я изначально предоставлял 'repo.write' символ (': blob') в качестве второго аргумента, но тогда он ошибся на этой строке, заявив, что не распознал символ. Однако, когда я сменил его на «blob», он сработал. «Ойд» не ноль. Я основываю это на коде в [этом вопросе] (http://stackoverflow.com/questions/14386044/comparing-2-commits-in-rugged?rq=1). – jbranchaud

+0

Прочный принял символ в течение очень долгого времени. Если это не так, то в настройке есть что-то совершенно неправильное. Удостоверьтесь, что у вас есть последняя прочность. –

+0

Смотрите мое обновление. Кроме того, я получил код выше для работы с «blob» и «blob». Не знаю, почему это так. Есть идеи? – jbranchaud