commit 28a7803f3893a8859edf2b4fa853eca1f575d670 Author: jochan Date: Thu Jun 8 17:05:45 2017 -0700 Initial commit of generic migration files diff --git a/authors.py b/authors.py new file mode 100644 index 0000000..cf3e7d6 --- /dev/null +++ b/authors.py @@ -0,0 +1,74 @@ +import re + +failed_pattern = re.compile("^\*\*\*.*$") +null_author = re.compile("^<>$") +visier_prepended = re.compile("^VISIER\\.*$") +full_name_no_email = re.compile("^([A-Z]\w*\s?)+$") +full_name_null_email = re.compile("^([A-Z]\w*\s?)+<>$") +full_name_with_email = re.compile("^([A-Z]\w*\s?)+<.*>$") +username_no_email = re.compile("^\w*$") +username_null_email = re.compile("^\w*\s?<>$") +username_with_email = re.compile("^\w*\s?<.*>$") +username_sqr_email = re.compile("^\w*\s?\[.*\]$") +username_rnd_name = re.compile("^\w*\s?\(.*\)$") +username_address = re.compile("^\w*@.*$") +any_any = re.compile("^.+<.*>$") +null_any = re.compile("^<.*>$") +any_email = re.compile("^.+\s\S+@\S+$") +any_null = re.compile("^.+$") + + +def email_from_fullname(author): + return "email for " + author + +def email_from_username(author): + return "email for " + author + +def username_from_email(author): + return "dummy_username for " + author + +def replace_author(author): + if failed_pattern.match(author): + return "nulluser <>" + if null_author.match(author): + return "nulluser " + author + if visier_prepended.match(author): + return replace_author(author[7:]) + if full_name_no_email.match(author): + return author.strip() + " <{}>".format(email_from_fullname(author.strip())) + if full_name_null_email.match(author): + fullname = author.strip()[:-2].strip() + return fullname + " <{}>".format(email_from_fullname(fullname)) + if full_name_with_email.match(author): + return author + if username_no_email.match(author): + return author.strip() + " <{}>".format(email_from_username(author.strip())) + if username_null_email.match(author): + username = author.strip()[:-2].strip() + return username + " <{}>".format(email_from_username(username)) + if username_with_email.match(author): + return author + if username_sqr_email.match(author): + return author.replace("[", "<").replace("]", ">") + if username_rnd_name.match(author): + username = author.split("(")[0].strip() + return username + " " + email_from_username(username) + if username_address.match(author): + username = author.split("@")[0] + return username + " <{}>".format(email_from_username(username)) + if any_any.match(author): + return author + if null_any.match(author): + return username_from_email(author[1:-1]) + " " + author + if any_email.match(author): + email = author.split(" ")[-1].strip() + return author.replace(email, "<{}>".format(email)) + if any_null.match(author): + return "nulluser <>" + +in_authors = open("authors.txt", "r") +out_authors = open("reformatted-authors.txt", "w") +for author in in_authors: + out_authors.write("{0}={1}\n".format(author.strip(), replace_author(author).strip())) +in_authors.close() +out_authors.close() diff --git a/hg2git.cf b/hg2git.cf new file mode 100644 index 0000000..002bf4d --- /dev/null +++ b/hg2git.cf @@ -0,0 +1,50 @@ +# PREP WORK +git clone --depth=1 --branch=master https://github.com/frej/fast-export.git +curl "http://repo1.maven.org/maven2/com/madgag/bfg/1.12.15/bfg-1.12.15.jar" -o /bfg.jar +mkdir + +# TO CREATE A GIT REPO AT FROM +cd +hg log | grep user: | sort | uniq | sed "s/user: *//" > /authors.txt +cd +python /authors.py +cp /* . +git init +git config core.ignoreCase false +sh hg-fast-export.sh -r --force -A reformatted-authors.txt + +# TO CLEAN UP LARGE FILES +git gc +java -jar /bfg.jar --strip-blobs-bigger-than +git reflog expire --expire=now --all +git gc --prune=now --aggressive + +# TO DELETE CLOSED BRANCHES +cd +hg heads --closed --template "{branch}\n" | tr " " "_" | sort > /all.log +hg heads --template "{branch}\n" | tr " " "_" | sort > /open.log +cd +comm -2 -3 all.log open.log > closed.log +for branch in `cat closed.log`; do git tag "closed/$branch" $branch; git branch -df $branch; done + +# CLEAN-UP WORK +git checkout master +git clean -df +* create .gitignore (do before committing anything): + * `find -name ".hgignore"` to find all .hgignore files + * rename all .hgignore to .gitignore + * rewrite anything under "syntax: regexp" to glob form + * remove "syntax: {glob|regexp}" lines + +# OTHER TASKS +* cloning all branches: + git clone --mirror /.git + cd + git config --local --bool core.bare false + git checkout master +* cloning a specific : + git clone -b --single-branch + +# NOTES +* use `git pull --rebase` instead of merging local commits to avoid excessive merges +* merges should typically only happen when merging a distinct branch with master diff --git a/pattern-author.txt b/pattern-author.txt new file mode 100644 index 0000000..5b01a9e --- /dev/null +++ b/pattern-author.txt @@ -0,0 +1,18 @@ +format matches replace +------ ------- ------- +*** failed to import... ^\*\*\*.*$ "nulluser <>" +<> ^<>$ prepend with "nulluser " +Full Name ^([A-Z]\w*\s?)+$ append with +Full Name <> ^([A-Z]\w*\s?)+<>$ <> with +Full Name ^([A-Z]\w*\s?)+<.*>$ do nothing +VISIER\username ^VISIER\\.*$ drop 7 and recurse +username ^\w*$ append with +username <> ^\w*\s?<>$ <> with +username ^\w*\s?<.*>$ do nothing +username [name@email.com] ^\w*\s?\[.*\]$ [ with < and ] with > +username (Full Name) ^\w*\s?\(.*\)$ \s?\(.*\) with \s +username@address.com ^\w*@.*$ @.* with \s +anything ^.+<.*>$ do nothing + ^<.*>$ prepend with user +anything name@email.com ^.+\s\S+@\S+$ wrap email with <> +anything ^.+$ "nulluser <>"