text: #include "clar_libgit2.h"
  #include "posix.h"
  
  void clar_on_init(void)
  {
  	git_threads_init();
  }
  
  void clar_on_shutdown(void)
  {
  	git_threads_shutdown();
  }
  
  void cl_git_mkfile(const char *filename, const char *content)
  {
  	int fd;
  
  	fd = p_creat(filename, 0666);
  	cl_assert(fd != 0);
  
  	if (content) {
  		cl_must_pass(p_write(fd, content, strlen(content)));
  	} else {
  		cl_must_pass(p_write(fd, filename, strlen(filename)));
  		cl_must_pass(p_write(fd, "\n", 1));
  	}
  
  	cl_must_pass(p_close(fd));
  }
  
  void cl_git_write2file(const char *filename, const char *new_content, int flags)
  {
  	int fd = p_open(filename, flags, 0644);
  	cl_assert(fd >= 0);
  	if (!new_content)
  		new_content = "\n";
  	cl_must_pass(p_write(fd, new_content, strlen(new_content)));
  	cl_must_pass(p_close(fd));
  }
  
  void cl_git_append2file(const char *filename, const char *new_content)
  {
  	cl_git_write2file(filename, new_content, O_WRONLY | O_CREAT | O_APPEND);
  }
  
  void cl_git_rewritefile(const char *filename, const char *new_content)
  {
  	cl_git_write2file(filename, new_content, O_WRONLY | O_CREAT | O_TRUNC);
  }
  
  static const char *_cl_sandbox = NULL;
  static git_repository *_cl_repo = NULL;
  
  git_repository *cl_git_sandbox_init(const char *sandbox)
  {
  	/* Copy the whole sandbox folder from our fixtures to our test sandbox
  	 * area.  After this it can be accessed with `./sandbox`
  	 */
  	cl_fixture_sandbox(sandbox);
  	_cl_sandbox = sandbox;
  
  	cl_git_pass(p_chdir(sandbox));
  
  	/* If this is not a bare repo, then rename `sandbox/.gitted` to
  	 * `sandbox/.git` which must be done since we cannot store a folder
  	 * named `.git` inside the fixtures folder of our libgit2 repo.
  	 */
  	if (p_access(".gitted", F_OK) == 0)
  		cl_git_pass(p_rename(".gitted", ".git"));
  
  	/* If we have `gitattributes`, rename to `.gitattributes`.  This may
  	 * be necessary if we don't want the attributes to be applied in the
  	 * libgit2 repo, but just during testing.
  	 */
  	if (p_access("gitattributes", F_OK) == 0)
  		cl_git_pass(p_rename("gitattributes", ".gitattributes"));
  
  	/* As with `gitattributes`, we may need `gitignore` just for testing. */
  	if (p_access("gitignore", F_OK) == 0)
  		cl_git_pass(p_rename("gitignore", ".gitignore"));
  
  	cl_git_pass(p_chdir(".."));
  
  	/* Now open the sandbox repository and make it available for tests */
  	cl_git_pass(git_repository_open(&_cl_repo, sandbox));
  
  	return _cl_repo;
  }
  
  void cl_git_sandbox_cleanup(void)
  {
  	if (_cl_repo) {
  		git_repository_free(_cl_repo);
  		_cl_repo = NULL;
  	}
  	if (_cl_sandbox) {
  		cl_fixture_cleanup(_cl_sandbox);
  		_cl_sandbox = NULL;
  	}
  }
  