darcs-to-git: New package from upstream Git.

This consists of just one single ruby script, which runs shell commands assuming
that the current PATH has all dependencies set up correctly. Unfortunately, this
somewhat breaks functional purity as the command won't work correctly in
environments that do not contain git, darcs or diffutils.

During the patchPhase we replace all those dependencies directly in the ruby
source code, rather than creating a wrapper. Afterwards we run a checkPhase
which not only checks whether we caught all the dependencies (PATH=) but also
checks if the conversion has been done correctly.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
This commit is contained in:
aszlig 2012-09-17 05:52:56 +02:00
parent 04f93115a3
commit 98b7228c06
No known key found for this signature in database
GPG Key ID: D0EBD0EC8C2DC961
2 changed files with 83 additions and 0 deletions

View File

@ -0,0 +1,81 @@
{ stdenv, fetchgit, ruby, gnugrep, diffutils, git, darcs }:
stdenv.mkDerivation rec {
name = "darcs-to-git-${version}";
version = "0.2git";
src = fetchgit {
url = "git://github.com/purcell/darcs-to-git.git";
rev = "58a55936899c7e391df5ae1326c307fbd4617a25";
sha256 = "366aa691920991e21cfeebd4cbd53a6c42d80e2bc46ff398af482d1d15bac4c3";
};
patchPhase = let
matchExecution = ''(\<(output_of|system|run)\([^"%]*("|%w\()|^[^"`]*`)'';
in ''
sed -r -i \
-e '1s|^#!.*|#!${ruby}/bin/ruby|' \
-e 's!${matchExecution}git\>!\1${git}/bin/git!' \
-e 's!${matchExecution}darcs\>!\1${darcs}/bin/darcs!' \
-e 's!${matchExecution}diff\>!\1${diffutils}/bin/diff!' \
-e 's!\<egrep\>!${gnugrep}/bin/egrep!g' \
-e 's!%w\(darcs init\)!%w(${darcs}/bin/darcs init)!' \
darcs-to-git
'';
propagatedBuildInputs = [ ruby ];
installPhase = ''
install -vD darcs-to-git "$out/bin/darcs-to-git"
'';
doCheck = true;
checkPhase = ''
orig_dir="$(pwd)"
darcs_repos="$(pwd)/darcs_test_repos"
git_repos="$(pwd)/git_test_repos"
test_home="$(pwd)/test_home"
mkdir "$darcs_repos" "$git_repos" "$test_home"
cd "$darcs_repos"
${darcs}/bin/darcs init
echo "this is a test file" > new_file1
${darcs}/bin/darcs add new_file1
HOME="$test_home" ${darcs}/bin/darcs record -a -m c1 -A none
echo "testfile1" > new_file1
echo "testfile2" > new_file2
${darcs}/bin/darcs add new_file2
HOME="$test_home" ${darcs}/bin/darcs record -a -m c2 -A none
${darcs}/bin/darcs mv new_file2 only_one_file
rm -f new_file1
HOME="$test_home" ${darcs}/bin/darcs record -a -m c3 -A none
cd "$git_repos"
HOME="$test_home" PATH= "$orig_dir/darcs-to-git" "$darcs_repos"
assertFileContents() {
echo -n "File $1 contains '$2'..." >&2
if [ "x$(cat "$1")" = "x$2" ]; then
echo " passed." >&2
return 0
else
echo " failed: '$(cat "$1")' != '$2'" >&2
return 1
fi
}
echo "Checking if converted repository matches original repository:" >&2
assertFileContents only_one_file testfile2
${git}/bin/git reset --hard HEAD^
assertFileContents new_file1 testfile1
assertFileContents new_file2 testfile2
${git}/bin/git reset --hard HEAD^
assertFileContents new_file1 "this is a test file"
echo "All checks passed." >&2
cd "$orig_dir"
rm -rf "$darcs_repos" "$git_repos" "$test_home"
'';
meta = {
description = "Converts a Darcs repository into a Git repository";
homepage = "http://www.sanityinc.com/articles/converting-darcs-repositories-to-git";
license = stdenv.lib.licenses.mit;
};
}

View File

@ -91,4 +91,6 @@ rec {
gitSubtree = import ./git-subtree {
inherit stdenv fetchurl git asciidoc xmlto docbook_xsl docbook_xml_dtd_45 libxslt;
};
darcsToGit = callPackage ./darcs-to-git { };
}