Как создать график истории

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

Я хочу воспроизвести нечто подобное тому, что создается с помощью следующей команды git:

git log --oneline --graph --decorate --all

Это код, который я использую:

git_commit* old_head = NULL;
error = git_revparse_single( (git_object**) &old_head, open_repo, "refs/heads/master" );
if( error != 0 )
{
  return SG_PLUGIN_OK;
}


const git_oid *head_oid = git_object_id( (git_object*)old_head );

git_revwalk *walk;

git_revwalk_new( &walk, open_repo );
git_revwalk_sorting( walk, GIT_SORT_TOPOLOGICAL | GIT_SORT_TIME );
git_revwalk_push( walk, head_oid );

const git_signature *cauth;
const char *cmsg;
git_time_t ctime;

git_oid newoid;
while( ( git_revwalk_next( &newoid, walk ) ) == 0 )
{
  git_commit *wcommit;
  error = git_commit_lookup( &wcommit, open_repo, &newoid );
  if( error != 0 )
  {
    return SG_PLUGIN_OK;
  }

  ctime = git_commit_time( wcommit );
  cmsg  = git_commit_message( wcommit );
  cauth = git_commit_author( wcommit );

  TRACE("\t%s (%s at %d)\n", cmsg, cauth->email, ctime );

  git_commit_free( wcommit );
}

git_revwalk_free( walk );

Я могу пройти коммиты, но у меня есть несколько проблем с кодом выше:

  • я просто получаю коммиты основной главной ветки, если я повторяю код, изменяя revparse_single для каждого имени ветки, тогда я получаю все коммиты, но некоторые из них явно дублируются, когда коммит находится в более чем одной ветке
  • Я просто получаю сообщение о коммите, автора и время, так как мне узнать, каковы имена веток?
  • Я делаю это правильно?

person Dan    schedule 15.04.2013    source источник


Ответы (1)


Используйте одну прогулку и нажмите любые подсказки, которые вы хотите использовать, вы можете использовать push_glob, чтобы нажать все ветки, если хотите.

Если вы хотите построить график, вам нужно посмотреть, какие родители есть у коммита, и построить свой график, используя эту информацию.

Что касается имен веток, если вы имеете в виду, что делает опция --decorate в git-log, вам просто нужно помнить, на что указывает каждый коммит, а затем рисовать его рядом с ним всякий раз, когда вы распечатываете эту информацию.

person Carlos Martín Nieto    schedule 16.04.2013