Downgrade repository format.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hg.rst Mon Sep 19 23:31:41 2011 +0300
@@ -0,0 +1,451 @@
+-*- coding: utf-8 -*-
+
+============
+ Mercurial.
+============
+.. contents::
+
+About.
+======
+
+ http://mercurial.selenic.com/wiki/ProjectsUsingMercurial
+ Some Projects that Use Mercurial
+
+User config.
+============
+
+Put to your ~/.hgrc::
+
+ [ui]
+ ; Editor for editing commit message.
+ editor = gvim
+ ; Who commit.
+ username = Oleksandr Gavenko <gavenkoa@gmail.com>
+ ; Use internal merge algorithm, which mark conflict like <<<<<< ====== >>>>>>.
+ ; Save previous file version in '*.orig' file, after merge must be marked as
+ ; resolved by running 'hg resolve -m <file>'.
+ merge = internal:merge
+ [web]
+ ; Default encoding for file hosted by 'hg serv'.
+ encoding = utf-8
+
+Multiline log message for log command.
+--------------------------------------
+
+By default 'hg log' show only first line of log message. To see all message
+run::
+
+ $ hg log -v
+
+or put into ~/.hgrc::
+
+ [defaults]
+ log = -v
+
+Follow history ever when file copied.
+-------------------------------------
+
+By default 'hg log' show only history after last file copy. To see log message
+before copying run::
+
+ $ hg log -f
+
+or put into ~/.hgrc::
+
+ [defaults]
+ log = -f
+
+Useful extension.
+=================
+
+Put to your ~/.hgrc:
+
+ [extensions]
+ ; To allow 'fetch' command.
+ hgext.fetch =
+ ; To allow Mercurial Queues.
+ hgext.mq =
+ ; To import revisions from foreign VCS repositories into Mercurial.
+ hgext.convert =
+ ; Usage: hg glog <dir>
+ hgext.graphlog =
+ ; Enable '.hgeol' tracking (fix for CR/LF).
+ hgext.eol =
+
+Downgrade repository format.
+============================
+
+To get list of supported repo formats type::
+
+ $ hg help config
+
+and look for "format" section. To be Mercurial 0.9.4 compatible use::
+
+ $ hg clone -U --pull \
+ --config format.usefncache=0 --config format.dotencode=0 $oldr $newr
+
+Clone specific branches.
+========================
+::
+
+ $ hg clone http://your/repo -r $branch
+
+Closing branches.
+=================
+::
+
+ $ hg branches
+ $branch (inactive)
+ ...
+ $ hg branches -a
+ ... # no $branch
+ $ hg up -r $branch
+ $ hg ci --close-branch -m "Bla-bla-bla"
+ $ hg up -r default
+ $ hg branches
+ ... # no $branch
+ $ hg branches -c
+ $branch (inactive)
+ ...
+
+To reopen closed branch just update to it and commit anything!
+
+Remove/rename files history from repo.
+======================================
+::
+
+ $ cat >filemap.txt <<EOF
+ exclude path/to/file-or-dir
+ rename path/to/source path/to/destination
+ ...
+ EOF
+ $ hg convert --filemap filemap.txt $repo_orig $repo_new
+ $ hg -R $repo_new up
+
+See:
+
+ http://mercurial.selenic.com/wiki/ConvertExtension
+
+Fix branch names.
+-----------------
+::
+
+ $ hg conver --branchmap $branchmapfile oldrepo newrepo
+
+To convert non-ASCII names use UTF-8 coding for 'branchmap' file.
+
+When converted names with spaces only last space in 'branchmap' file treat as
+separator between old branch name and new, so new branch name can not contain
+spaces.
+
+Join history of two repos.
+==========================
+::
+
+ $ cat >filemap1.txt <<EOF
+ rename . dir1
+ EOF
+ $ cat >filemap2.txt <<EOF
+ rename . dir2
+ EOF
+ $ hg convert --filemap filemap1.txt $repo1 $repo_new
+ $ hg convert --filemap filemap2.txt $repo2 $repo_new
+ $ hg -R $repo_new merge
+ $ hg -R $repo_new ci -m "Join $repo1 and $repo2."
+
+Publishing repo.
+================
+
+With static HTTP hosting you can copy via rsync, ftp, scp, etc., so long as all
+the files beneath .hg are copied. Also since 1.1 pull protocol can detect static
+HTTP hosting::
+
+ $ hg clone http://example.com/project
+
+See:
+
+ http://mercurial.selenic.com/wiki/hgserve
+ http://mercurial.selenic.com/wiki/HgWebDirStepByStep
+ http://mercurial.selenic.com/wiki/StaticHTTP
+
+hgweb.config.
+-------------
+
+Set allowed project by specifying paths to they (keys are URL, values are fs
+paths)::
+
+ [paths]
+ myproject = /home/user/hg/myproject
+ otherproject = /home/user/hg/otherproject
+
+You can use single wildcard '*' to search current subdirs or double wildcard
+'**' to search subdirs recursively::
+
+ [paths]
+ myproject = /home/user/hg/my/*
+ otherproject = /home/user/hg/other/**
+
+Alternatively you can set a collection of repos (keys and values are both
+filesystem paths, keys should be prefixes of the values and are "subtracted"
+from the values in order to generate the URL paths to each repository)::
+
+ [collections]
+ /home/user/hg = /home/user/hg
+ /home/another/hg = /home/another/hg
+
+Allow archive downloads::
+
+ [web]
+ allow_archive = gz, zip, bz2
+
+Make web page look nice::
+
+ [web]
+ # Use 'cd /lib/python2.x/site-packages/mercurial/templates; find . -type d' to see available
+ # styles. Some interesting: gitweb, coal, monoblue.
+ style = gitweb
+
+Set another settings::
+
+ [web]
+ encoding = UTF-8
+
+ maxchanges = 100
+ maxfiles = 100
+
+In each $proj/.hg/hgrc put::
+
+ [web]
+ contact = ADMIN <admin@example.com>
+ description = <p style="color: red;">$proj</b> allow make a <a href="http://example.com">BIG Thing.</a>
+ # Do not use name, in this case you see dir name where project lcated.
+ # name = $proj
+
+To allow push in 'hg serv'::
+
+ [web]
+ allow_push = *
+ push_ssl = false
+
+See:
+
+ http://mercurial.selenic.com/wiki/PublishingRepositories
+ Publishing Mercurial Repositories
+
+init.d script.
+--------------
+::
+
+ #!/bin/sh
+ CMD=/usr/bin/hg
+
+ PORT=7878
+ SRC=/srv/hg
+ CONGIG=/srv/hg/hgweb.config
+ PIDFILE=/var/run/hg.pid
+
+ case "$1" in
+ start)
+ echo "Mecurial Server service starting."
+ (cd "$SRC"; $CMD serve -d -p $PORT --pid-file "$PIDFILE")
+ ;;
+ stop)
+ if [ -f "$PIDFILE" ]; then
+ PID=`cat "$PIDFILE"`
+ if [ "$PID" -gt 1 ]; then
+ kill -TERM $PID
+ echo "Stopping the Mercurial service PID=$PID."
+ else
+ echo Bad PID for Mercurial -- \"$PID\".
+ echo You may remove \"$PIDFILE\" manually.
+ fi
+ else
+ echo No PID file recorded for mercurial.
+ fi
+ ;;
+ *)
+ echo "$0 {start|stop}"
+ exit 1
+ ;;
+ esac
+
+See:
+
+ http://mercurial.selenic.com/wiki/hgserve
+
+Manage patches with MQ.
+=======================
+
+First enable MQ, add following to your ~/.hgrc::
+
+ [extensions]
+ hgext.mq =
+
+Second get unpatched sources and put it to hg repository::
+
+ $ tar zxf proj-x.y.z.tar.gz
+ $ mv proj-x.y.z proj
+ $ cd proj
+ $ hg init
+ $ hg ci -m "Added x.y.z version of proj."
+
+Init MQ and take name for first patch::
+
+ $ hg qinit
+ $ hg qnew first.patch
+
+Next make changes by editing source and save it to patch::
+
+ $ $EDITOR file.c
+ ...
+ $ hg diff
+ ...
+ $ hg qrefresh
+ $ hg diff # <-- have zero diff
+
+You can make second patch by applying existing one::
+
+ $ hg qnew second.patch
+ $ patch -p1 <bugfix.patch
+ $ hg qrefresh
+
+You can take list of patches (from old to new) and revert or apply patches by
+qpop/qpush command::
+
+ $ hg qseries # <-- what patches have
+ first.patch
+ second.patch
+ $ hg qapplied # <-- what patches applied
+ first.patch
+ second.patch
+ $ hg qpop
+ $ hg qseries
+ first.patch
+ second.patch
+ $ hg qapplied
+ first.patch
+
+You can revert or apply all patches by single command::
+
+ $ hg qpop -a
+ $ hg qpush -a
+
+You can delete patch from patch list (before that you need de-apply patch)::
+
+ $ hg qpop -a
+ $ hg qdelete first.patch
+
+To add new version of source and fix patches for it first de apply patches,
+then pull new changes and try apply patches on top of new sources::
+
+ $ hg qpop -a
+ $ rm * # .hg dir not deleted because its name start with dot
+ $ cd ..
+ $ tar zxf proj-a.b.c.tar.gz
+ $ cp -R proj-a.b.c/* proj
+ $ cd proj
+ $ hg addremove -s 70
+ $ hg ci -m "Added a.b.c version of proj."
+ $ hg qpush -a
+
+To apply series of already done patches use::
+
+ $ ls /path/to/bugfixes/*.patch | xargs hg qimport
+
+You can fix patch description message from command line::
+
+ $ hg qser -s
+ makefile-doc.patch:
+ $ hg qpush
+ applying makefile-doc.patch
+ now at: makefile-doc.patch
+ $ hg qref -m 'Add description about Makefile usage.'
+ $ hg qser -s
+ makefile-doc.patch: Add description about Makefile usage.
+
+or from editor by::
+
+ $ hg qref -e
+
+Remove all patches from MQ.
+===========================
+::
+
+ $ hg qpop -a
+ $ for patch in `hg qser`; do hg qrm $patch; done
+
+Show supported/loaded plugin.
+=============================
+::
+
+ $ hg help extensions
+ $ hg showconfig extensions
+
+Proxy.
+======
+::
+
+ $ hg clone --config http_proxy.host=$host:$port \
+ --config http_proxy.user=$user --config http_proxy.passwd=$password $addr
+
+Free Mercurial hosting.
+=======================
+
+ http://mercurial.selenic.com/wiki/MercurialHosting
+ Free Hosting of Mercurial Repositories
+
+Merge or rebase uncommitted changes.
+====================================
+::
+
+ $ hg diff > .diff # save local changes
+ $ hg revert -a
+ $ hg fetch
+ $ patch -p1 <.diff
+
+See:
+
+ http://mercurial.selenic.com/wiki/TipsAndTricks#Merge_or_rebase_with_uncommitted_changes
+ http://mercurial.selenic.com/wiki/ShelveExtension
+
+Hooks.
+======
+
+Check for bad branch names.
+---------------------------
+
+.hg/hgcheck.py::
+
+ import re
+ goodbranch_re = r'((bug|feature)#\d|release-1\.\d\.\d|default)$'
+ def precommit_badbranchname(ui, repo, hooktype, **kwargs):
+ ui.warn('"%s" hook failed\n' % hooktype)
+ for rev in repo:
+ branch = repo[rev].branch()
+ re_ = re.compile(goodbranch_re)
+ if not re_.match(branch):
+ ui.warn('Invalid branch name "%s".\nUse one of default, bug#ID, feature#ID or release-1.XX.XX.\n' % branch)
+ return True
+ return False
+
+.hg/hgrc::
+
+ [hooks]
+ precommit.badbranchname = python:.hg/hgcheck.py:precommit_badbranchname
+ # precommit.gg = python:my.hgcheck.py.precommit_badbranch
+ prechangegroup.badbranchname = python:.hg/hgcheck.py:precommit_badbranchname
+
+Read more:
+
+ http://mercurial.selenic.com/wiki/HookExamples
+
+Ignore patterns.
+----------------
+::
+
+ $ cat $proj/.hgignore
+ syntax: glob
+ *.o
+ .obj
+ *.exe
+