#! /usr/bin/env bash if [ -z "$1" ] then echo "Please provide a repo to clone" exit 1 fi tex2md() { if [ -z "$1" ] then echo "tex2md: No argument given" exit 2 fi DEST="$1" for i in `find -type f -name '*.tex'` do bi=`basename "$i"` echo -e "\e[1;34m>>>\e[1;37m Trying to convert $i to Markdown...\e[0m" # BEGIN HACK! Need stacking sed -Ei 's/\\(lstinline|class|expected|refer)[^{]*\{([^}]*)\}/\\verb+\2+/gi' "$i" sed -Ei 's/\\distribution\{\}/FreeBSD 9/gi' "$i" sed -Ei 's/\\\{/__OPEN_BRACKET_MINIROOT__/gi' "$i" sed -Ei 's/\\\}/__CLOSE_BRACKET_MINIROOT__/gi' "$i" sed -Ei 's/-\{\}-//gi' "$i" #sed -Ei 's/\\_/_/gi' "$i" # DIRTY HACK sed -Ei 's/\\includegraphics *\{([^}]+)}/\\verb+%%image(\1)+/gi' "$i" sed -Ei 's/\\include *\{([^}]+)}/\\verb+%%scoped-include(\1)+/gi' "$i" sed -Ei 's/\\input *\{([^}]+)}/\\verb+%%scoped-include(\1)+/gi' "$i" sed -Ei 's/\{\\include *([^}]+)}/\\verb+%%scoped-include(\1)+/gi' "$i" sed -Ei 's/\{\\input *([^}]+)}/\\verb+%%scoped-include(\1)+/gi' "$i" sed -Ei 's/\\lstinputlisting *\{([^}]+)\}/\\verb+%%scoped-include(\1)+/gi' "$i" sed -Ei 's/\\lstinline *\{([^}]+)}/\\verb+\1+/gi' "$i" sed -Ei 's/\\structure\{([^}]+)}/\1/gi' "$i" sed -Ei 's/\\struct\{([^}]+)}/\1/gi' "$i" sed -Ei 's/\\link\{([^}]+)}/\1/gi' "$i" sed -Ei 's/\\textasciitilde\{\}/~/gi' "$i" sed -Ei 's/\\begin *\{correction\}/\\begin\{verbatim\}/g' "$i" sed -Ei 's/\\end *\{correction\}/\\end\{verbatim\}/g' "$i" sed -Ei 's/\\begin *\{prompt\}/\\begin\{verbatim\}/g' "$i" sed -Ei 's/\\end *\{prompt\}/\\end\{verbatim\}/g' "$i" sed -Ei 's/\\begin *\{script\}/\\begin\{verbatim\}/g' "$i" sed -Ei 's/\\end *\{script\}/\\end\{verbatim\}/g' "$i" sed -Ei 's/\\begin *\{cartouche\}/\\begin\{verbatim\}/g' "$i" sed -Ei 's/\\end *\{cartouche\}/\\end\{verbatim\}/g' "$i" sed -Ei 's/\\begin *\{cartouche_nospaces\}/\\begin\{verbatim\}/g' "$i" sed -Ei 's/\\end *\{cartouche_nospaces\}/\\end\{verbatim\}/g' "$i" sed -Ei 's/\\verb ([^+]+) /\\verb+\1+/g' "$i" # Special macros sed -Ei 's/\\(file|email|command|bcode|code) *\{([^}]*)\}/\\verb+\2+/gi' "$i" sed -Ei 's/\\begin *\{assistant\}/\\verb+%%assistant-begin+/g' "$i" sed -Ei 's/\\end *\{assistant\}/\\verb+%%assistant-end+/g' "$i" # Convert Beamer sed -Ei 's/\\begin\[[^]]+\]\{frame\}\{([^}]+)\}/\\subsection\{\1\}/g' "$i" sed -Ei 's/\\begin\{frame\}\{([^}]+)\}\[[^]]+\]/\\subsection\{\1\}/g' "$i" sed -Ei 's/\\begin\{frame\}\{([^}]+)\}/\\subsection\{\1\}/g' "$i" sed -Ei 's/\\begin(\[[^]]+\])?\{frame\}(\[[^]]+\])?//g' "$i" sed -Ei 's/\\begin\{block\}\{([^}]+)\}/\\subsubsection\{\1\}/g' "$i" sed -Ei 's/\\begin\{block\}/\\subsubsection\{~\}/g' "$i" sed -Ei 's/\\end(\[[^]]+\])?\{frame\}(\[[^]]+\])?//g' "$i" sed -Ei 's/\\end(\[[^]]+\])?\{block\}(\[[^]]+\])?//g' "$i" sed -Ei 's/\\frametitle *\{/\\subsection\{/g' "$i" sed -Ei 's/\\framesubtitle *\{/\\subsubsection\{/g' "$i" sed -Ei 's/\\(sub)*section *\{\}//g' "$i" sed -Ei 's/\\frame *\{/\{/g' "$i" sed -Ei 's/\\frame//g' "$i" sed -Ei 's/\\item( *)<[^>]+>/\\item\1/g' "$i" # END HACK! sed -Ei 's/__OPEN_BRACKET_MINIROOT__/\{/gi' "$i" sed -Ei 's/__CLOSE_BRACKET_MINIROOT__/\}/gi' "$i" if pandoc -o "$DEST"/${bi%%.tex}.md $i then git add "$DEST"/${bi%%.tex}.md git checkout "$i" git rm -f "$i" > /dev/null fi sed -Ei 's/`%%([a-z-]+)\(([^)]+)\)`/%%\1(\2)/gi' "$DEST/${bi%%.tex}.md" sed -Ei 's/\\$/\n/' "$DEST/${bi%%.tex}.md" done } maintex2md() { if [ -f "mySubject.md" ] then git mv "mySubject.md" "main.md" elif [ -f "mySlide.md" ] then git mv "mySlide.md" "main.md" elif [ -f "mySlides.md" ] then git mv "mySlides.md" "main.md" elif [ -f "myTutorial.md" ] then git mv "myTutorial.md" "main.md" fi } clean_tex() { if [ -z "$1" ] || ! [ -d "$1" ] then echo "NON" exit 1; fi for f in data Makefile images/acu.pdf images/assistants.pdf images/assistants-subject.pdf images/assistants-slides.pdf images/assistants.png images/epita.pdf images/epita.png images/epita-invert.pdf images/assistants-invert.pdf images/epita-invert.png images/assistants-bg.png images/logo_epita.jpg images/acu-bottom.png images/acu-bottom.pdf images/acu-bg.pdf images/acu2011.png images/acu.png images/acu_2012_logo_hd.png *.cls *.sty *.toc do if [ -f "$f" ] then git rm -f "$f" > /dev/null elif [ -d "$f" ] then git rm -fr "$f" > /dev/null fi done for file in `find -name "*.ltx"` do git mv "$file" "${file%%.ltx}.tex" done if [ -d "include" ] then cd include tex2md .. if [ `find | wc -l` -gt 1 ] then git mv * .. fi cd "$1" tex2md . maintex2md rmdir include 2> /dev/null elif [ -d "subdocs" ] then cd subdocs tex2md .. if [ `find | wc -l` -gt 1 ] then git mv * .. fi cd "$1" tex2md . maintex2md rmdir include 2> /dev/null elif [ `find -mindepth 1 -maxdepth 1 -name '*.tex' | wc -l` -gt 0 ] then tex2md . else for i in * do if [ -d "$i" ] then echo -e "\e[1;32m>>>\e[1;37m Subsubject found: $i\e[0m" cd "$i" clean_tex "$1/$i" "$1" fi done fi cd "$2" } TMPDIR=`mktemp -d` cd $TMPDIR rmdir repo.git if ! ( mkdir repo.git && cd repo.git && git init --bare && cd .. ) then echo "Unable to create git final repository" exit 2 fi if ! hg clone "https://cpp.acu.epita.fr/projects/$1" then echo "Unable to clone $1 mercurial repository" exit 3 fi cd "$1" if ! hg push "$TMPDIR/repo.git" then echo "Unable to convert Mercurial to Git repository" exit 4 fi cd - > /dev/null mv "$1" "$1.hg" git clone "$TMPDIR/repo.git" "$1" cd "$TMPDIR/$1" # grades branch if ls | grep "grades" then echo -e "\e[1;34m>>>\e[1;37m Creating grades branch...\e[0m" git checkout -b grades find -mindepth 1 -maxdepth 1 ! -name grades ! -name .git -exec git rm -rf {} \; find -name '*.trace' -name '*.html' -name '*.yml' -exec git rm -rf {} \; git rm -f grades/DESC 2> /dev/null git commit -am "Converting HG to Git" > /dev/null fi git checkout master # moulette branch if ls | grep "moulette" then echo -e "\e[1;34m>>>\e[1;37m Creating moulette branch...\e[0m" git checkout -b moulette find -mindepth 1 -maxdepth 1 ! -name moulette ! -name tests ! -name .git -exec git rm -rf {} \; git rm -f moulette/DESC 2> /dev/null git commit -am "Converting HG to Git" > /dev/null fi git checkout master find -type f ! -name '*.sh' ! -name '*.rb' ! -name '*.pl' ! -name 'configure' -exec chmod -x {} \; echo echo -e "\e[1;31m##\e[1;37m Removing ELF outside files/ \e[1;31m##\e[0m" for d in `find -mindepth 1 -maxdepth 1 -type d ! -name .git ! -name files` do for f in `find "$d" -type f` do if [ `file "$f" | cut -d " " -f 2` = "ELF" ] then git rm -f "$f" fi done done echo -e "\e[1;31m## ## ## ## ##\e[0m" echo echo -e "\e[1;31m##\e[1;37m Removing old and temporary files \e[1;31m##\e[0m" git rm -f AUTHORS git rm -f README git rm -f UPDATE git rm -f Makefile git rm -f files/list git rm -f "files/*.pdf" find -name 'Changelog' -exec git rm -fr {} \; find -name 'ChangeLog' -exec git rm -fr {} \; find -name 'DESC' -exec git rm -fr {} \; find -name '*.old' -exec git rm -fr {} \; find -name '*.bak' -exec git rm -fr {} \; find -name '*.vrb' -exec git rm -fr {} \; find -name '*~' -exec git rm -fr {} \; find -name '#*#' -exec git rm -fr {} \; echo -e "\e[1;31m## ## ## ## ##\e[0m" echo for DIR in * do if [ "$DIR" = "defenses" ] then echo -e "\e[1;35m##\e[1;37m Find directory $DIR with some defense files \e[1;35m##\e[0m" cd defenses git rm -f Makefile > /dev/null for D in * do if [ -f "$D/template.xml" ] then perl `dirname $0`/defense_converter.pl -o "$D.xml" "$D/template.xml" git add "$D.xml" echo -e "\e[1;35m>>>\e[1;37m Defense converted:\e[0m $D" fi git rm -rf "$D" > /dev/null done cd - > /dev/null echo -e "\e[1;35m## ## ## ## ##\e[0m" echo elif [ "$DIR" = "grades" ] then echo -e "\e[1;36m##\e[1;37m Find directory $DIR for grading \e[1;36m##\e[0m" git rm -rf "$DIR" echo -e "\e[1;36m## ## ## ## ##\e[0m" echo elif [ "$DIR" = "tests" ] then echo -e "\e[1;33m##\e[1;37m Find directory $DIR for moulette \e[1;33m##\e[0m" git rm -rf "$DIR" echo -e "\e[1;33m## ## ## ## ##\e[0m" echo elif find "$DIR" -type f -name '*.yml' | grep yml > /dev/null then echo -e "\e[1;33m##\e[1;37m Find directory $DIR with some .yml files \e[1;33m##\e[0m" git rm -rf "$DIR" echo -e "\e[1;33m## ## ## ## ##\e[0m" echo elif find "$DIR" -type f -name '*.tex' | grep tex > /dev/null then echo -e "\e[1;32m##\e[1;37m Find directory $DIR with some .tex files \e[1;32m##\e[0m" cd "$DIR" clean_tex `pwd` `readlink -f "$(pwd)/.."` echo -e "\e[1;32m## ## ## ## ##\e[0m" echo elif [ -d "$DIR" ] then cd "$DIR" FILELIST="" if [ "$DIR" != "ref" ] then FILELIST="$FILELIST Makefile" fi if [ "$DIR" != "tests" ] then FILELIST="$FILELIST README" fi for f in $FILELIST do if [ -f "$f" ] then git rm -f "$f" > /dev/null elif [ -d "$f" ] then git rm -rf "$f" > /dev/null fi done # Append Fact lines if [ -f "Makefile" ] then cat <> Makefile fact: rm -rf ref.ff \${FACT} package create ../ref ref.ff \${FACT} make make ref.ff ref.ff EOF fi cd - > /dev/null fi done echo -e "\e[1;34m>>>\e[1;37m Adding .gitignore...\e[0m" cat < .gitignore *.toc *.aux *.bat *.glo *.log *# *.snm *.vrb *.nav *~ *.bbl *.blg .*.sw? *.o *.class *.ghc *.so *.a EOF for f in `find -name "README.txt"` `find -name "TODO.txt"` `find -name "AUTHORS.txt"` do git mv "$f" "${f%.txt}" done git add .gitignore git commit -am "Converting HG to Git" > /dev/null git remote remove origin if [ -z "$2" ] then git remote add origin "ssh://git@forge/subjects/$1" else git remote add origin "ssh://git@forge/subjects/$2" fi #rm -rf $TMPDIR echo echo -e "\e[1;37mYou can view $TMPDIR/$1/ directory\e[0m"